[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