[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