[Bf-blender-cvs] [2c83e550c48] functions: change the node mapping a bit

Jacques Lucke noreply at git.blender.org
Thu Nov 21 15:19:38 CET 2019


Commit: 2c83e550c488022ad26ff8f530c18f0d36f1e90a
Author: Jacques Lucke
Date:   Wed Nov 20 17:08:47 2019 +0100
Branches: functions
https://developer.blender.org/rB2c83e550c488022ad26ff8f530c18f0d36f1e90a

change the node mapping a bit

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

M	source/blender/blenkernel/BKE_virtual_node_tree.h
M	source/blender/functions/intern/multi_functions/mixed.cc
M	source/blender/functions/intern/multi_functions/mixed.h
M	source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc

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

diff --git a/source/blender/blenkernel/BKE_virtual_node_tree.h b/source/blender/blenkernel/BKE_virtual_node_tree.h
index c041cc48637..51b36011612 100644
--- a/source/blender/blenkernel/BKE_virtual_node_tree.h
+++ b/source/blender/blenkernel/BKE_virtual_node_tree.h
@@ -50,6 +50,7 @@ class VSocket : BLI::NonCopyable, BLI::NonMovable {
   ArrayRef<const VSocket *> directly_linked_sockets() const;
 
   const VNode &node() const;
+  const VirtualNodeTree &tree() const;
   uint id() const;
 
   bool is_input() const;
@@ -95,6 +96,8 @@ class VNode : BLI::NonCopyable, BLI::NonMovable {
   friend VirtualNodeTree;
 
  public:
+  const VirtualNodeTree &tree() const;
+
   ArrayRef<const VInputSocket *> inputs() const;
   ArrayRef<const VOutputSocket *> outputs() const;
 
@@ -154,6 +157,11 @@ inline ArrayRef<const VSocket *> VSocket::directly_linked_sockets() const
   return ArrayRef<VSocket *>(m_directly_linked_sockets).cast<const VSocket *>();
 }
 
+inline const VirtualNodeTree &VSocket::tree() const
+{
+  return m_node->tree();
+}
+
 inline const VNode &VSocket::node() const
 {
   return *m_node;
@@ -251,6 +259,11 @@ inline ArrayRef<const VOutputSocket *> VNode::outputs() const
   return ArrayRef<VOutputSocket *>(m_outputs).cast<const VOutputSocket *>();
 }
 
+inline const VirtualNodeTree &VNode::tree() const
+{
+  return *m_vtree;
+}
+
 inline PointerRNA *VNode::rna() const
 {
   return const_cast<PointerRNA *>(&m_rna);
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index 89863ed5ad6..7e58fabc966 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -518,85 +518,81 @@ void MF_ContextCurrentFrame::call(MFMask mask, MFParams params, MFContext contex
   }
 }
 
-MF_PerlinNoise_3D_to_1D::MF_PerlinNoise_3D_to_1D()
+MF_PerlinNoise::MF_PerlinNoise()
 {
-  MFSignatureBuilder signature("Perlin Noise 3D to 1D");
+  MFSignatureBuilder signature("Perlin Noise");
   signature.single_input<float3>("Position");
   signature.single_input<float>("Amplitude");
   signature.single_input<float>("Scale");
-  signature.single_output<float>("Noise");
+  signature.single_output<float>("Noise 1D");
+  signature.single_output<float3>("Noise 3D");
   this->set_signature(signature);
 }
 
-void MF_PerlinNoise_3D_to_1D::call(MFMask mask, MFParams params, MFContext UNUSED(context)) const
+void MF_PerlinNoise::call(MFMask mask, MFParams params, MFContext UNUSED(context)) const
 {
   VirtualListRef<float3> positions = params.readonly_single_input<float3>(0, "Position");
   VirtualListRef<float> amplitudes = params.readonly_single_input<float>(1, "Amplitude");
   VirtualListRef<float> scales = params.readonly_single_input<float>(2, "Scale");
-  MutableArrayRef<float> r_noise = params.uninitialized_single_output<float>(3, "Noise");
+
+  MutableArrayRef<float> r_noise1 = params.uninitialized_single_output<float>(3, "Noise 1D");
+  MutableArrayRef<float3> r_noise3 = params.uninitialized_single_output<float3>(4, "Noise 3D");
 
   for (uint i : mask.indices()) {
     float3 pos = positions[i];
     float noise = BLI_gNoise(scales[i], pos.x, pos.y, pos.z, false, 1);
-    r_noise[i] = noise * amplitudes[i];
+    r_noise1[i] = noise * amplitudes[i];
   }
-}
-
-MF_PerlinNoise_3D_to_3D::MF_PerlinNoise_3D_to_3D()
-{
-  MFSignatureBuilder signature("Perlin Noise 3D to 3D");
-  signature.single_input<float3>("Position");
-  signature.single_input<float>("Amplitude");
-  signature.single_input<float>("Scale");
-  signature.single_output<float3>("Noise");
-  this->set_signature(signature);
-}
-
-void MF_PerlinNoise_3D_to_3D::call(MFMask mask, MFParams params, MFContext UNUSED(context)) const
-{
-  VirtualListRef<float3> positions = params.readonly_single_input<float3>(0, "Position");
-  VirtualListRef<float> amplitudes = params.readonly_single_input<float>(1, "Amplitude");
-  VirtualListRef<float> scales = params.readonly_single_input<float>(2, "Scale");
-  MutableArrayRef<float3> r_noise = params.uninitialized_single_output<float3>(3, "Noise");
 
   for (uint i : mask.indices()) {
     float3 pos = positions[i];
     float x = BLI_gNoise(scales[i], pos.x, pos.y, pos.z + 1000.0f, false, 1);
     float y = BLI_gNoise(scales[i], pos.x, pos.y + 1000.0f, pos.z, false, 1);
     float z = BLI_gNoise(scales[i], pos.x + 1000.0f, pos.y, pos.z, false, 1);
-    r_noise[i] = float3(x, y, z) * amplitudes[i];
+    r_noise3[i] = float3(x, y, z) * amplitudes[i];
   }
 }
 
-MF_ParticleAttribute::MF_ParticleAttribute(StringRef attribute_name, const CPPType &attribute_type)
-    : m_attribute_name(attribute_name), m_attribute_type(attribute_type)
+MF_ParticleAttributes::MF_ParticleAttributes(Vector<std::string> attribute_names,
+                                             Vector<const CPPType *> attribute_types)
+    : m_attribute_names(attribute_names), m_attribute_types(attribute_types)
 {
-  MFSignatureBuilder signature("Particle Attribute");
-  signature.single_output(attribute_name, attribute_type);
+  BLI_assert(m_attribute_names.size() == m_attribute_types.size());
+
+  MFSignatureBuilder signature("Particle Attributes");
+  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_ParticleAttribute::call(MFMask mask, MFParams params, MFContext context) const
+void MF_ParticleAttributes::call(MFMask mask, MFParams params, MFContext context) const
 {
   auto context_data = context.element_contexts().find_first<ParticleAttributesContext>();
-  GenericMutableArrayRef r_output = params.uninitialized_single_output(0, m_attribute_name);
-
-  if (context_data.has_value()) {
-    AttributesRef attributes = context_data.value().data->attributes;
-    Optional<GenericMutableArrayRef> opt_array = attributes.try_get(m_attribute_name,
-                                                                    m_attribute_type);
-    if (opt_array.has_value()) {
-      GenericMutableArrayRef array = opt_array.value();
-      for (uint i : mask.indices()) {
-        m_attribute_type.copy_to_uninitialized(array[i], r_output[i]);
+
+  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;
       }
-      return;
     }
-  }
 
-  /* Fallback */
-  for (uint i : mask.indices()) {
-    m_attribute_type.construct_default(r_output[i]);
+    /* Fallback */
+    for (uint i : mask.indices()) {
+      attribute_type.construct_default(r_output[i]);
+    }
   }
 }
 
@@ -683,7 +679,7 @@ void MF_ClosestPointOnObject::call(MFMask mask, MFParams params, MFContext conte
   }
 }
 
-MF_MapRange::MF_MapRange()
+MF_MapRange::MF_MapRange(bool clamp) : m_clamp(clamp)
 {
   MFSignatureBuilder signature("Map Range");
   signature.single_input<float>("Value");
@@ -713,6 +709,20 @@ void MF_MapRange::call(MFMask mask, MFParams params, MFContext UNUSED(context))
       r_values[i] = to_min[i];
     }
   }
+
+  if (m_clamp) {
+    for (uint i : mask.indices()) {
+      float min_v = to_min[i];
+      float max_v = to_max[i];
+      float value = r_values[i];
+      if (min_v < max_v) {
+        r_values[i] = std::min(std::max(value, min_v), max_v);
+      }
+      else {
+        r_values[i] = std::min(std::max(value, max_v), min_v);
+      }
+    }
+  }
 }
 
 MF_Clamp::MF_Clamp(bool sort_minmax) : m_sort_minmax(sort_minmax)
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index 734dca78e73..5ecd5bb9b9d 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -2,6 +2,8 @@
 
 #include "FN_multi_function.h"
 
+#include <functional>
+
 namespace FN {
 
 class MF_Dummy final : public MultiFunction {
@@ -171,25 +173,25 @@ class MF_SwitchVector final : public MultiFunction {
   void call(MFMask mask, MFParams params, MFContext context) const override;
 };
 
-class MF_PerlinNoise_3D_to_1D final : public MultiFunction {
- public:
-  MF_PerlinNoise_3D_to_1D();
-  void call(MFMask mask, MFParams params, MFContext context) const override;
-};
-
-class MF_PerlinNoise_3D_to_3D final : public MultiFunction {
+class MF_PerlinNoise final : public MultiFunction {
  public:
-  MF_PerlinNoise_3D_to_3D();
+  MF_PerlinNoise();
   void call(MFMask mask, MFParams params, MFContext context) const override;
 };
 
-class MF_ParticleAttribute final : public MultiFunction {
+class MF_ParticleAttributes final : public MultiFunction {
  private:
-  std::string m_attribute_name;
-  const CPPType &m_attribute_type;
+  Vector<std::string> m_attribute_names;
+  Vector<const CPPType *> m_attribute_types;
 
  public:
-  MF_ParticleAttribute(StringRef attribute_name, const CPPType &attribute_type);
+  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;
 };
 
@@ -200,8 +202,11 @@ class MF_ClosestPointOnObject final : public MultiFunction {
 };
 
 class MF_MapRange final : public MultiFunction {
+ private:
+  bool m_clamp;
+
  public:
-  MF_MapRange();
+  MF_MapRange(bool clamp);
   void call(MFMask mask, MFParams params, MFContext context) 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list