[Bf-blender-cvs] [df783a4ee1a] functions: access emitter time info in node tree

Jacques Lucke noreply at git.blender.org
Wed Dec 11 16:32:53 CET 2019


Commit: df783a4ee1aad64356ad9e0560319126604b4e74
Author: Jacques Lucke
Date:   Wed Dec 11 16:32:48 2019 +0100
Branches: functions
https://developer.blender.org/rBdf783a4ee1aad64356ad9e0560319126604b4e74

access emitter time info in node tree

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

M	release/scripts/startup/nodes/bparticle_nodes/custom_emitter.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/emitter_interface.hpp
M	source/blender/simulations/bparticles/emitters.cpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/custom_emitter.py b/release/scripts/startup/nodes/bparticle_nodes/custom_emitter.py
index 5f475271107..c8194d5888d 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/custom_emitter.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/custom_emitter.py
@@ -1,7 +1,7 @@
 import bpy
 import uuid
 from bpy.props import *
-from .. base import SimulationNode, DataSocket
+from .. base import SimulationNode, DataSocket, FunctionNode
 from .. node_builder import NodeBuilder
 from .. types import type_infos
 from .. sync import skip_syncing
@@ -83,3 +83,13 @@ class CustomEmitter(bpy.types.Node, SimulationNode):
 
     def set_attribute_type(self, data_type, index):
         self.attributes[index].attribute_type = data_type
+
+class EmitterTimeInfoNode(bpy.types.Node, FunctionNode):
+    bl_idname = "fn_EmitterTimeInfoNode"
+    bl_label = "Emitter Time Info"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.fixed_output("duration", "Duration", "Float")
+        builder.fixed_output("begin", "Begin", "Float")
+        builder.fixed_output("end", "End", "Float")
+        builder.fixed_output("step", "Step", "Integer")
diff --git a/source/blender/functions/FN_multi_function_common_contexts.h b/source/blender/functions/FN_multi_function_common_contexts.h
index c61e2c05177..15a329f7d63 100644
--- a/source/blender/functions/FN_multi_function_common_contexts.h
+++ b/source/blender/functions/FN_multi_function_common_contexts.h
@@ -32,6 +32,14 @@ class ParticleAttributesContext {
   }
 };
 
+class EmitterTimeInfoContext {
+ public:
+  float duration;
+  float begin;
+  float end;
+  int step;
+};
+
 }  // 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 2b06b133ae8..b109a716d33 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
@@ -476,6 +476,11 @@ static void INSERT_value(VNodeMFNetworkBuilder &builder)
   network_builder.map_sockets(xsocket, built_socket);
 }
 
+static void INSERT_emitter_time_info(VNodeMFNetworkBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_EmitterTimeInfo>();
+}
+
 void add_inlined_tree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
 {
   mappings.xnode_inserters.add_new("fn_CombineColorNode", INSERT_combine_color);
@@ -508,6 +513,7 @@ void add_inlined_tree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
   mappings.xnode_inserters.add_new("fn_FloatClampNode", INSERT_clamp_float);
   mappings.xnode_inserters.add_new("fn_RandomFloatNode", INSERT_random_float);
   mappings.xnode_inserters.add_new("fn_ValueNode", INSERT_value);
+  mappings.xnode_inserters.add_new("fn_EmitterTimeInfoNode", INSERT_emitter_time_info);
 
   mappings.xnode_inserters.add_new("fn_AddFloatsNode", INSERT_add_floats);
   mappings.xnode_inserters.add_new("fn_MultiplyFloatsNode", INSERT_multiply_floats);
diff --git a/source/blender/functions/intern/multi_function_common_contexts.cc b/source/blender/functions/intern/multi_function_common_contexts.cc
index 5cc18e7301b..4e1ae6c5b8f 100644
--- a/source/blender/functions/intern/multi_function_common_contexts.cc
+++ b/source/blender/functions/intern/multi_function_common_contexts.cc
@@ -8,7 +8,4 @@ BLI_CREATE_CLASS_ID(FN::SceneTimeContext)
 BLI_CREATE_CLASS_ID(FN::ParticleAttributesContext)
 BLI_CREATE_CLASS_ID(BKE::IDHandleLookup)
 BLI_CREATE_CLASS_ID(BKE::IDDataCache)
-
-namespace FN {
-
-}  // namespace FN
+BLI_CREATE_CLASS_ID(FN::EmitterTimeInfoContext)
diff --git a/source/blender/functions/intern/multi_functions/particles.cc b/source/blender/functions/intern/multi_functions/particles.cc
index e4a2490f39b..d083f3dddc8 100644
--- a/source/blender/functions/intern/multi_functions/particles.cc
+++ b/source/blender/functions/intern/multi_functions/particles.cc
@@ -85,4 +85,38 @@ void MF_ParticleIsInGroup::call(MFMask mask, MFParams params, MFContext context)
   }
 }
 
+MF_EmitterTimeInfo::MF_EmitterTimeInfo()
+{
+  MFSignatureBuilder signature("Emitter Time Info");
+  signature.single_output<float>("Duration");
+  signature.single_output<float>("Begin");
+  signature.single_output<float>("End");
+  signature.single_output<int>("Step");
+  this->set_signature(signature);
+}
+
+void MF_EmitterTimeInfo::call(MFMask mask, MFParams params, MFContext context) const
+{
+  MutableArrayRef<float> r_durations = params.uninitialized_single_output<float>(0, "Duration");
+  MutableArrayRef<float> r_begins = params.uninitialized_single_output<float>(1, "Begin");
+  MutableArrayRef<float> r_ends = params.uninitialized_single_output<float>(2, "End");
+  MutableArrayRef<int> r_steps = params.uninitialized_single_output<int>(3, "Step");
+
+  auto *time_context = context.try_find_global<EmitterTimeInfoContext>();
+
+  ArrayRef<uint> indices = mask.indices();
+  if (time_context == nullptr) {
+    r_durations.fill_indices(indices, 0.0f);
+    r_begins.fill_indices(indices, 0.0f);
+    r_ends.fill_indices(indices, 0.0f);
+    r_steps.fill_indices(indices, 0);
+  }
+  else {
+    r_durations.fill_indices(indices, time_context->duration);
+    r_begins.fill_indices(indices, time_context->begin);
+    r_ends.fill_indices(indices, time_context->end);
+    r_steps.fill_indices(indices, time_context->step);
+  }
+}
+
 }  // namespace FN
diff --git a/source/blender/functions/intern/multi_functions/particles.h b/source/blender/functions/intern/multi_functions/particles.h
index b105373766f..283ff9de913 100644
--- a/source/blender/functions/intern/multi_functions/particles.h
+++ b/source/blender/functions/intern/multi_functions/particles.h
@@ -26,4 +26,10 @@ class MF_ParticleIsInGroup final : public MultiFunction {
   void call(MFMask mask, MFParams params, MFContext context) const override;
 };
 
+class MF_EmitterTimeInfo final : public MultiFunction {
+ public:
+  MF_EmitterTimeInfo();
+  void call(MFMask mask, MFParams params, MFContext context) const override;
+};
+
 }  // namespace FN
diff --git a/source/blender/simulations/bparticles/emitter_interface.hpp b/source/blender/simulations/bparticles/emitter_interface.hpp
index bd2ee86cf5c..c0cc52c4b27 100644
--- a/source/blender/simulations/bparticles/emitter_interface.hpp
+++ b/source/blender/simulations/bparticles/emitter_interface.hpp
@@ -37,6 +37,11 @@ class EmitterInterface {
     return m_time_span;
   }
 
+  uint time_step()
+  {
+    return m_simulation_state.time().current_update_index();
+  }
+
   /**
    * True when this is the first time step in a simulation, otherwise false.
    */
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index a586b660b73..313d096e0e2 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -390,9 +390,17 @@ void CustomEmitter::emit(EmitterInterface &interface)
     }
   }
 
+  TimeSpan time_span = interface.time_span();
+  FN::EmitterTimeInfoContext time_context;
+  time_context.begin = time_span.start();
+  time_context.end = time_span.end();
+  time_context.duration = time_span.duration();
+  time_context.step = interface.time_step();
+
   FN::MFContextBuilder context_builder;
   context_builder.add_global_context(m_id_data_cache);
   context_builder.add_global_context(m_id_handle_lookup);
+  context_builder.add_global_context(time_context);
 
   m_emitter_function.call({0}, params_builder, context_builder);
 
@@ -411,8 +419,6 @@ void CustomEmitter::emit(EmitterInterface &interface)
     particle_count = 1;
   }
 
-  TimeSpan time_span = interface.time_span();
-
   for (StringRef system_name : m_systems_to_emit) {
     auto new_particles = interface.particle_allocator().request(system_name, particle_count);



More information about the Bf-blender-cvs mailing list