[Bf-blender-cvs] [b4b25eac9ad] functions: access event filter duration in node tree

Jacques Lucke noreply at git.blender.org
Sun Dec 22 14:25:40 CET 2019


Commit: b4b25eac9ad1a4c28ff996819b059a8c02e760f9
Author: Jacques Lucke
Date:   Fri Dec 20 17:43:13 2019 +0100
Branches: functions
https://developer.blender.org/rBb4b25eac9ad1a4c28ff996819b059a8c02e760f9

access event filter duration in node tree

===================================================================

M	release/scripts/startup/nodes/bparticle_nodes/events.py
M	source/blender/functions/FN_multi_function_common_contexts.h
M	source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
M	source/blender/functions/intern/multi_function_common_contexts.cc
M	source/blender/functions/intern/multi_functions/particles.cc
M	source/blender/functions/intern/multi_functions/particles.h
M	source/blender/simulations/bparticles/events.cpp
M	source/blender/simulations/bparticles/particle_function.cpp

===================================================================

diff --git a/release/scripts/startup/nodes/bparticle_nodes/events.py b/release/scripts/startup/nodes/bparticle_nodes/events.py
index 3ea986bf4f6..9fc4e9ef81f 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/events.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/events.py
@@ -50,3 +50,11 @@ class EventFilterEndTimeNode(bpy.types.Node, FunctionNode):
 
     def declaration(self, builder: NodeBuilder):
         builder.fixed_output("end_time", "End Time", "Float")
+
+
+class EventFilterDurationNode(bpy.types.Node, FunctionNode):
+    bl_idname = "fn_EventFilterDurationNode"
+    bl_label = "Event Filter Duration"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.fixed_output("duration", "Duration", "Float")
diff --git a/source/blender/functions/FN_multi_function_common_contexts.h b/source/blender/functions/FN_multi_function_common_contexts.h
index 5dbb94b6611..c107e953f3f 100644
--- a/source/blender/functions/FN_multi_function_common_contexts.h
+++ b/source/blender/functions/FN_multi_function_common_contexts.h
@@ -13,38 +13,33 @@ namespace FN {
 
 using BLI::Map;
 
-class VertexPositionArray {
- public:
+struct VertexPositionArray {
   ArrayRef<BLI::float3> positions;
 };
 
-class SceneTimeContext {
- public:
+struct SceneTimeContext {
   float time;
 };
 
-class ParticleAttributesContext {
- public:
+struct ParticleAttributesContext {
   AttributesRef attributes;
-
-  ParticleAttributesContext(AttributesRef attributes) : attributes(attributes)
-  {
-  }
 };
 
-class EmitterTimeInfoContext {
- public:
+struct EmitterTimeInfoContext {
   float duration;
   float begin;
   float end;
   int step;
 };
 
-class EventFilterEndTimeContext {
- public:
+struct EventFilterEndTimeContext {
   float end_time;
 };
 
+struct EventFilterDurationsContext {
+  ArrayRef<float> durations;
+};
+
 }  // namespace FN
 
 #endif /* __FN_MULTI_FUNCTION_COMMON_CONTEXTS_H__ */
diff --git a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
index bfcf9744940..98e9364ca90 100644
--- a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
@@ -543,6 +543,11 @@ static void INSERT_event_filter_end_time(VNodeMFNetworkBuilder &builder)
   builder.set_constructed_matching_fn<MF_EventFilterEndTime>();
 }
 
+static void INSERT_event_filter_duration(VNodeMFNetworkBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_EventFilterDuration>();
+}
+
 void add_inlined_tree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
 {
   mappings.xnode_inserters.add_new("fn_CombineColorNode", INSERT_combine_color);
@@ -619,6 +624,7 @@ void add_inlined_tree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
   mappings.xnode_inserters.add_new("fn_NodeInstanceIdentifierNode",
                                    INSERT_node_instance_identifier);
   mappings.xnode_inserters.add_new("fn_EventFilterEndTimeNode", INSERT_event_filter_end_time);
+  mappings.xnode_inserters.add_new("fn_EventFilterDurationNode", INSERT_event_filter_duration);
 }
 
 };  // namespace FN
diff --git a/source/blender/functions/intern/multi_function_common_contexts.cc b/source/blender/functions/intern/multi_function_common_contexts.cc
index 553cc8c331e..6e752ddfdf8 100644
--- a/source/blender/functions/intern/multi_function_common_contexts.cc
+++ b/source/blender/functions/intern/multi_function_common_contexts.cc
@@ -10,3 +10,4 @@ BLI_CREATE_CLASS_ID(BKE::IDHandleLookup)
 BLI_CREATE_CLASS_ID(BKE::IDDataCache)
 BLI_CREATE_CLASS_ID(FN::EmitterTimeInfoContext)
 BLI_CREATE_CLASS_ID(FN::EventFilterEndTimeContext)
+BLI_CREATE_CLASS_ID(FN::EventFilterDurationsContext)
diff --git a/source/blender/functions/intern/multi_functions/particles.cc b/source/blender/functions/intern/multi_functions/particles.cc
index 5fab7a50865..2b82e255404 100644
--- a/source/blender/functions/intern/multi_functions/particles.cc
+++ b/source/blender/functions/intern/multi_functions/particles.cc
@@ -85,14 +85,37 @@ MF_EventFilterEndTime::MF_EventFilterEndTime()
 
 void MF_EventFilterEndTime::call(IndexMask mask, MFParams params, MFContext context) const
 {
-  MutableArrayRef<float> end_times = params.uninitialized_single_output<float>(0, "End Time");
+  MutableArrayRef<float> r_end_times = params.uninitialized_single_output<float>(0, "End Time");
 
   auto *time_context = context.try_find_global<EventFilterEndTimeContext>();
   if (time_context == nullptr) {
-    end_times.fill_indices(mask.indices(), 0.0f);
+    r_end_times.fill_indices(mask, 0.0f);
   }
   else {
-    end_times.fill_indices(mask.indices(), time_context->end_time);
+    r_end_times.fill_indices(mask, time_context->end_time);
+  }
+}
+
+MF_EventFilterDuration::MF_EventFilterDuration()
+{
+  MFSignatureBuilder signature = this->get_builder("Event Filter Duration");
+  signature.use_element_context<EventFilterDurationsContext>();
+  signature.single_output<float>("Duration");
+}
+
+void MF_EventFilterDuration::call(IndexMask mask, MFParams params, MFContext context) const
+{
+  MutableArrayRef<float> r_durations = params.uninitialized_single_output<float>(0, "Duration");
+
+  auto duration_context = context.try_find_per_element<EventFilterDurationsContext>();
+  if (duration_context.has_value()) {
+    for (uint i : mask) {
+      uint index = duration_context->indices[i];
+      r_durations[i] = duration_context->data->durations[index];
+    }
+  }
+  else {
+    r_durations.fill_indices(mask, 0.0f);
   }
 }
 
diff --git a/source/blender/functions/intern/multi_functions/particles.h b/source/blender/functions/intern/multi_functions/particles.h
index ca942bc2e9b..2c2c6aae67a 100644
--- a/source/blender/functions/intern/multi_functions/particles.h
+++ b/source/blender/functions/intern/multi_functions/particles.h
@@ -25,4 +25,10 @@ class MF_EventFilterEndTime final : public MultiFunction {
   void call(IndexMask mask, MFParams params, MFContext context) const override;
 };
 
+class MF_EventFilterDuration final : public MultiFunction {
+ public:
+  MF_EventFilterDuration();
+  void call(IndexMask mask, MFParams params, MFContext context) const override;
+};
+
 }  // namespace FN
diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index 5ba97bf4c02..70d069e5a1a 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -62,9 +62,12 @@ void AgeReachedEvent::execute(EventExecuteInterface &interface)
 void CustomEvent::filter(EventFilterInterface &interface)
 {
   FN::EventFilterEndTimeContext end_time_context = {interface.step_end_time()};
+  FN::EventFilterDurationsContext durations_context = {interface.remaining_durations()};
 
   ParticleFunctionEvaluator inputs{m_inputs_fn, interface.index_mask(), interface.attributes()};
   inputs.context_builder().add_global_context(end_time_context);
+  inputs.context_builder().add_element_context(durations_context,
+                                               IndexRange(interface.array_size()));
   inputs.compute();
 
   for (uint pindex : interface.index_mask().indices()) {
diff --git a/source/blender/simulations/bparticles/particle_function.cpp b/source/blender/simulations/bparticles/particle_function.cpp
index a0b7772a46d..eb1c6b6476c 100644
--- a/source/blender/simulations/bparticles/particle_function.cpp
+++ b/source/blender/simulations/bparticles/particle_function.cpp
@@ -59,7 +59,7 @@ void ParticleFunctionEvaluator::compute()
 
   uint array_size = m_mask.min_array_size();
 
-  FN::ParticleAttributesContext attributes_context(m_particle_attributes);
+  FN::ParticleAttributesContext attributes_context = {m_particle_attributes};
   m_context_builder.add_element_context(attributes_context, IndexRange(array_size));
   m_context_builder.add_global_context(m_particle_fn.m_id_data_cache);
   m_context_builder.add_global_context(m_particle_fn.m_id_handle_lookup);



More information about the Bf-blender-cvs mailing list