[Bf-blender-cvs] [5d686b19a5d] functions: extract particle input functions from others

Jacques Lucke noreply at git.blender.org
Wed Dec 11 15:28:01 CET 2019


Commit: 5d686b19a5dc6cd154a1a27b95e0b5b2bd5da824
Author: Jacques Lucke
Date:   Wed Dec 11 14:52:48 2019 +0100
Branches: functions
https://developer.blender.org/rB5d686b19a5dc6cd154a1a27b95e0b5b2bd5da824

extract particle input functions from others

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

M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/FN_multi_functions.h
M	source/blender/functions/intern/multi_functions/mixed.cc
M	source/blender/functions/intern/multi_functions/mixed.h
A	source/blender/functions/intern/multi_functions/particles.cc
A	source/blender/functions/intern/multi_functions/particles.h

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index 67ad5e6405e..13115583987 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -26,6 +26,7 @@ set(SRC
   intern/multi_functions/lists.cc
   intern/multi_functions/mixed.cc
   intern/multi_functions/network.cc
+  intern/multi_functions/particles.cc
   intern/multi_functions/surface_hook.cc
   intern/inlined_tree_multi_function_network/builder.cc
   intern/inlined_tree_multi_function_network/generate.cc
@@ -67,6 +68,7 @@ set(SRC
   intern/multi_functions/lists.h
   intern/multi_functions/mixed.h
   intern/multi_functions/network.h
+  intern/multi_functions/particles.h
   intern/multi_functions/surface_hook.h
   intern/multi_functions/util.h
   intern/inlined_tree_multi_function_network/builder.h
diff --git a/source/blender/functions/FN_multi_functions.h b/source/blender/functions/FN_multi_functions.h
index 3acc1379493..363aa860c4a 100644
--- a/source/blender/functions/FN_multi_functions.h
+++ b/source/blender/functions/FN_multi_functions.h
@@ -4,6 +4,7 @@
 #include "intern/multi_functions/lists.h"
 #include "intern/multi_functions/mixed.h"
 #include "intern/multi_functions/network.h"
+#include "intern/multi_functions/particles.h"
 #include "intern/multi_functions/surface_hook.h"
 
 #endif /* __FN_MULTI_FUNCTIONS_H__ */
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index 313d536284d..c658d9395af 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -525,87 +525,6 @@ void MF_PerlinNoise::call(MFMask mask, MFParams params, MFContext UNUSED(context
   }
 }
 
-MF_ParticleAttributes::MF_ParticleAttributes(Vector<std::string> attribute_names,
-                                             Vector<const CPPType *> attribute_types)
-    : m_attribute_names(attribute_names), m_attribute_types(attribute_types)
-{
-  BLI_assert(m_attribute_names.size() == m_attribute_types.size());
-
-  MFSignatureBuilder signature("Particle Attributes");
-  signature.depends_on_per_element_context(true);
-  for (uint i = 0; i < m_attribute_names.size(); i++) {
-    signature.single_output(m_attribute_names[i], *m_attribute_types[i]);
-  }
-  this->set_signature(signature);
-}
-
-void MF_ParticleAttributes::call(MFMask mask, MFParams params, MFContext context) const
-{
-  auto context_data = context.try_find_per_element<ParticleAttributesContext>();
-
-  for (uint i = 0; i < m_attribute_names.size(); i++) {
-    StringRef attribute_name = m_attribute_names[i];
-    const CPPType &attribute_type = *m_attribute_types[i];
-
-    GenericMutableArrayRef r_output = params.uninitialized_single_output(0, attribute_name);
-
-    if (context_data.has_value()) {
-      AttributesRef attributes = context_data.value().data->attributes;
-      Optional<GenericMutableArrayRef> opt_array = attributes.try_get(attribute_name,
-                                                                      attribute_type);
-      if (opt_array.has_value()) {
-        GenericMutableArrayRef array = opt_array.value();
-        for (uint i : mask.indices()) {
-          attribute_type.copy_to_uninitialized(array[i], r_output[i]);
-        }
-        return;
-      }
-    }
-
-    /* Fallback */
-    for (uint i : mask.indices()) {
-      attribute_type.construct_default(r_output[i]);
-    }
-  }
-}
-
-MF_ParticleIsInGroup::MF_ParticleIsInGroup()
-{
-  MFSignatureBuilder signature("Particle is in Group");
-  signature.depends_on_per_element_context(true);
-  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.try_find_per_element<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_MapRange::MF_MapRange(bool clamp) : m_clamp(clamp)
 {
   MFSignatureBuilder signature("Map Range");
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index 75ef069b091..61e90536382 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -156,28 +156,6 @@ class MF_PerlinNoise final : public MultiFunction {
   void call(MFMask mask, MFParams params, MFContext context) const override;
 };
 
-class MF_ParticleAttributes final : public MultiFunction {
- private:
-  Vector<std::string> m_attribute_names;
-  Vector<const CPPType *> m_attribute_types;
-
- public:
-  MF_ParticleAttributes(StringRef attribute_name, const CPPType &attribute_type)
-      : MF_ParticleAttributes({attribute_name}, {&attribute_type})
-  {
-  }
-
-  MF_ParticleAttributes(Vector<std::string> attribute_names,
-                        Vector<const CPPType *> attribute_types);
-  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_MapRange final : public MultiFunction {
  private:
   bool m_clamp;
diff --git a/source/blender/functions/intern/multi_functions/particles.cc b/source/blender/functions/intern/multi_functions/particles.cc
new file mode 100644
index 00000000000..e4a2490f39b
--- /dev/null
+++ b/source/blender/functions/intern/multi_functions/particles.cc
@@ -0,0 +1,88 @@
+#include "particles.h"
+
+#include "FN_multi_function_common_contexts.h"
+
+namespace FN {
+
+MF_ParticleAttributes::MF_ParticleAttributes(Vector<std::string> attribute_names,
+                                             Vector<const CPPType *> attribute_types)
+    : m_attribute_names(attribute_names), m_attribute_types(attribute_types)
+{
+  BLI_assert(m_attribute_names.size() == m_attribute_types.size());
+
+  MFSignatureBuilder signature("Particle Attributes");
+  signature.depends_on_per_element_context(true);
+  for (uint i = 0; i < m_attribute_names.size(); i++) {
+    signature.single_output(m_attribute_names[i], *m_attribute_types[i]);
+  }
+  this->set_signature(signature);
+}
+
+void MF_ParticleAttributes::call(MFMask mask, MFParams params, MFContext context) const
+{
+  auto context_data = context.try_find_per_element<ParticleAttributesContext>();
+
+  for (uint i = 0; i < m_attribute_names.size(); i++) {
+    StringRef attribute_name = m_attribute_names[i];
+    const CPPType &attribute_type = *m_attribute_types[i];
+
+    GenericMutableArrayRef r_output = params.uninitialized_single_output(0, attribute_name);
+
+    if (context_data.has_value()) {
+      AttributesRef attributes = context_data.value().data->attributes;
+      Optional<GenericMutableArrayRef> opt_array = attributes.try_get(attribute_name,
+                                                                      attribute_type);
+      if (opt_array.has_value()) {
+        GenericMutableArrayRef array = opt_array.value();
+        for (uint i : mask.indices()) {
+          attribute_type.copy_to_uninitialized(array[i], r_output[i]);
+        }
+        return;
+      }
+    }
+
+    /* Fallback */
+    for (uint i : mask.indices()) {
+      attribute_type.construct_default(r_output[i]);
+    }
+  }
+}
+
+MF_ParticleIsInGroup::MF_ParticleIsInGroup()
+{
+  MFSignatureBuilder signature("Particle is in Group");
+  signature.depends_on_per_element_context(true);
+  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.try_find_per_element<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;
+  }
+}
+
+}  // namespace FN
diff --git a/source/blender/functions/intern/multi_functions/particles.h b/source/blender/functions/intern/multi_functions/particles.h
new file mode 100644
index 00000000000..b105373766f
--- /dev/null
+++ b/source/blender/functions/intern/multi_functions/particles.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "FN_multi_function.h"
+
+namespace FN {
+
+class MF_ParticleAttributes final : public MultiFunction {
+ private:
+  Vector<std::string> m_attribute_names;
+  Vector<const CPPType *> m_attribute_types;
+
+ public:
+  MF_ParticleAttributes(StringRef attribute_name, const CPPType &attribute_type)
+      : MF_ParticleAttributes({attribute_name}, {&attribute_ty

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list