[Bf-blender-cvs] [a4cc5f1cbb3] functions: make Is In Group a normal multi-function
Jacques Lucke
noreply at git.blender.org
Sat Nov 30 16:40:26 CET 2019
Commit: a4cc5f1cbb3ea81541d1af437ae2903aa2453004
Author: Jacques Lucke
Date: Sat Nov 30 15:14:10 2019 +0100
Branches: functions
https://developer.blender.org/rBa4cc5f1cbb3ea81541d1af437ae2903aa2453004
make Is In Group a normal multi-function
===================================================================
M source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
M source/blender/functions/intern/multi_functions/mixed.cc
M source/blender/functions/intern/multi_functions/mixed.h
M source/blender/simulations/bparticles/particle_function_builder.cpp
M source/blender/simulations/bparticles/particle_function_input_providers.cpp
M source/blender/simulations/bparticles/particle_function_input_providers.hpp
===================================================================
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 70eb3bc109b..e1cb56d7424 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
@@ -71,6 +71,11 @@ static void INSERT_get_weight_on_surface(VNodeMFNetworkBuilder &builder)
builder.set_constructed_matching_fn<MF_GetWeightOnSurface>(std::move(group_name));
}
+static void INSERT_particle_is_in_group(VNodeMFNetworkBuilder &builder)
+{
+ builder.set_constructed_matching_fn<MF_ParticleIsInGroup>();
+}
+
static void INSERT_switch(VNodeMFNetworkBuilder &builder)
{
MFDataType type = builder.data_type_from_property("data_type");
@@ -360,6 +365,7 @@ void add_inlined_tree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
mappings.xnode_inserters.add_new("fn_ObjectMeshNode", INSERT_object_mesh_info);
mappings.xnode_inserters.add_new("fn_GetPositionOnSurfaceNode", INSERT_get_position_on_surface);
mappings.xnode_inserters.add_new("fn_GetWeightOnSurfaceNode", INSERT_get_weight_on_surface);
+ mappings.xnode_inserters.add_new("fn_IsInGroupNode", INSERT_particle_is_in_group);
mappings.xnode_inserters.add_new("fn_TextLengthNode", INSERT_text_length);
mappings.xnode_inserters.add_new("fn_VertexInfoNode", INSERT_vertex_info);
mappings.xnode_inserters.add_new("fn_FloatRangeNode", INSERT_float_range);
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index 4094fc8234a..37f90595534 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -723,6 +723,42 @@ void MF_ParticleAttributes::call(MFMask mask, MFParams params, MFContext context
}
}
+MF_ParticleIsInGroup::MF_ParticleIsInGroup()
+{
+ MFSignatureBuilder signature("Particle is in Group");
+ signature.single_input<std::string>("Group Name");
+ signature.single_output<bool>("Is in Group");
+ this->set_signature(signature);
+}
+
+void MF_ParticleIsInGroup::call(MFMask mask, MFParams params, MFContext context) const
+{
+ VirtualListRef<std::string> group_names = params.readonly_single_input<std::string>(
+ 0, "Group Name");
+ MutableArrayRef<bool> r_is_in_group = params.uninitialized_single_output<bool>(1, "Is in Group");
+
+ auto context_data = context.element_contexts().find_first<ParticleAttributesContext>();
+ if (!context_data.has_value()) {
+ r_is_in_group.fill_indices(mask.indices(), false);
+ return;
+ }
+
+ AttributesRef attributes = context_data->data->attributes;
+
+ for (uint i : mask.indices()) {
+ const std::string group_name = group_names[i];
+ Optional<MutableArrayRef<bool>> is_in_group_attr = attributes.try_get<bool>(group_name);
+ if (!is_in_group_attr.has_value()) {
+ r_is_in_group[i] = false;
+ continue;
+ }
+
+ uint index = context_data->indices[i];
+ bool is_in_group = is_in_group_attr.value()[index];
+ r_is_in_group[i] = is_in_group;
+ }
+}
+
MF_ClosestLocationOnObject::MF_ClosestLocationOnObject()
{
MFSignatureBuilder signature("Closest Point on Object");
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index d010c4009ef..a8182c49e9d 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -210,6 +210,12 @@ class MF_ParticleAttributes final : public MultiFunction {
void call(MFMask mask, MFParams params, MFContext context) const override;
};
+class MF_ParticleIsInGroup final : public MultiFunction {
+ public:
+ MF_ParticleIsInGroup();
+ void call(MFMask mask, MFParams params, MFContext context) const override;
+};
+
class MF_ClosestLocationOnObject final : public MultiFunction {
public:
MF_ClosestLocationOnObject();
diff --git a/source/blender/simulations/bparticles/particle_function_builder.cpp b/source/blender/simulations/bparticles/particle_function_builder.cpp
index 8476eb49c91..f7d45df012d 100644
--- a/source/blender/simulations/bparticles/particle_function_builder.cpp
+++ b/source/blender/simulations/bparticles/particle_function_builder.cpp
@@ -75,28 +75,11 @@ static ParticleFunctionInputProvider *INPUT_surface_image(
return new SurfaceImageInputProvider(image, uv_map_name);
}
-static ParticleFunctionInputProvider *INPUT_is_in_group(VTreeMFNetwork &inlined_tree_data_graph,
- const XOutputSocket &xsocket)
-{
- FN::MF_EvaluateNetwork fn(
- {}, {&inlined_tree_data_graph.lookup_dummy_socket(xsocket.node().input(0))});
- FN::MFParamsBuilder params_builder(fn, 1);
- FN::MFContextBuilder context_builder;
-
- std::string group_name;
- BLI::destruct(&group_name);
- params_builder.add_single_output(ArrayRef<std::string>(&group_name, 1));
- fn.call({0}, params_builder, context_builder);
-
- return new IsInGroupInputProvider(group_name);
-}
-
BLI_LAZY_INIT_STATIC(StringMap<BuildInputProvider>, get_input_providers_map)
{
StringMap<BuildInputProvider> map;
map.add_new("fn_SurfaceInfoNode", INPUT_surface_info);
map.add_new("fn_SurfaceImageNode", INPUT_surface_image);
- map.add_new("fn_IsInGroupNode", INPUT_is_in_group);
return map;
}
diff --git a/source/blender/simulations/bparticles/particle_function_input_providers.cpp b/source/blender/simulations/bparticles/particle_function_input_providers.cpp
index d711ba04603..37b876a4d70 100644
--- a/source/blender/simulations/bparticles/particle_function_input_providers.cpp
+++ b/source/blender/simulations/bparticles/particle_function_input_providers.cpp
@@ -127,24 +127,4 @@ Optional<ParticleFunctionInputArray> SurfaceImageInputProvider::compute_colors(
return ParticleFunctionInputArray(colors.as_ref(), true);
}
-Optional<ParticleFunctionInputArray> IsInGroupInputProvider::get(InputProviderInterface &interface)
-{
- auto is_in_group_output = BLI::temporary_allocate_array<bool>(interface.attributes().size());
-
- auto is_in_group_optional = interface.attributes().try_get<bool>(m_group_name);
- if (is_in_group_optional.has_value()) {
- ArrayRef<bool> is_in_group = *is_in_group_optional;
- for (uint pindex : interface.pindices()) {
- is_in_group_output[pindex] = is_in_group[pindex];
- }
- }
- else {
- for (uint pindex : interface.pindices()) {
- is_in_group_output[pindex] = 0;
- }
- }
-
- return ParticleFunctionInputArray(is_in_group_output.as_ref(), true);
-}
-
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/particle_function_input_providers.hpp b/source/blender/simulations/bparticles/particle_function_input_providers.hpp
index 1591107473a..e84c8673fb5 100644
--- a/source/blender/simulations/bparticles/particle_function_input_providers.hpp
+++ b/source/blender/simulations/bparticles/particle_function_input_providers.hpp
@@ -39,16 +39,4 @@ class SurfaceImageInputProvider : public ParticleFunctionInputProvider {
ArrayRef<uint> surface_info_mapping);
};
-class IsInGroupInputProvider : public ParticleFunctionInputProvider {
- private:
- std::string m_group_name;
-
- public:
- IsInGroupInputProvider(std::string group_name) : m_group_name(std::move(group_name))
- {
- }
-
- Optional<ParticleFunctionInputArray> get(InputProviderInterface &interface) override;
-};
-
} // namespace BParticles
More information about the Bf-blender-cvs
mailing list