[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