[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