[Bf-blender-cvs] [55ecd940ac7] functions-experimental-refactor: initial more generic context handling

Jacques Lucke noreply at git.blender.org
Tue Nov 5 15:54:54 CET 2019


Commit: 55ecd940ac7c867428ef52f2dcf0cced8802e066
Author: Jacques Lucke
Date:   Tue Nov 5 11:19:57 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB55ecd940ac7c867428ef52f2dcf0cced8802e066

initial more generic context handling

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

M	source/blender/functions2/CMakeLists.txt
A	source/blender/functions2/FN_multi_function_common_context_ids.h
M	source/blender/functions2/FN_multi_function_context.h
A	source/blender/functions2/intern/multi_function_common_context_ids.cc
M	source/blender/functions2/intern/multi_functions/mixed.cc
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
M	source/blender/modifiers/intern/MOD_functionpoints_cxx.cc

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

diff --git a/source/blender/functions2/CMakeLists.txt b/source/blender/functions2/CMakeLists.txt
index 770b7e758c3..30f37526015 100644
--- a/source/blender/functions2/CMakeLists.txt
+++ b/source/blender/functions2/CMakeLists.txt
@@ -37,6 +37,7 @@ set(SRC
   intern/generic_array_ref.cc
   intern/generic_tuple.cc
   intern/initialize.cc
+  intern/multi_function_common_context_ids.cc
   intern/multi_function_network.cc
 
   FN_attributes_block_container.h
@@ -48,6 +49,7 @@ set(SRC
   FN_generic_virtual_list_list_ref.h
   FN_generic_virtual_list_ref.h
   FN_initialize.h
+  FN_multi_function_common_context_ids.h
   FN_multi_function_context.h
   FN_multi_function_data_type.h
   FN_multi_function_mask.h
diff --git a/source/blender/functions2/FN_multi_function_common_context_ids.h b/source/blender/functions2/FN_multi_function_common_context_ids.h
new file mode 100644
index 00000000000..c98659d0815
--- /dev/null
+++ b/source/blender/functions2/FN_multi_function_common_context_ids.h
@@ -0,0 +1,23 @@
+#ifndef __FN_MULTI_FUNCTION_COMMON_CONTEXT_IDS_H__
+#define __FN_MULTI_FUNCTION_COMMON_CONTEXT_IDS_H__
+
+#ifdef FN_COMMON_CONTEXT_IDS_CC
+#  define DEFINE_UNIQUE_CONTEXT_ID(name) \
+    namespace UniqueVars { \
+    char variable_with_unique_address_##name; \
+    } \
+    const void *name = (const void *)&UniqueVars::variable_with_unique_address_##name;
+
+#else
+#  define DEFINE_UNIQUE_CONTEXT_ID(name) extern const void *name;
+#endif
+
+namespace FN {
+namespace ContextIDs {
+
+DEFINE_UNIQUE_CONTEXT_ID(vertex_locations);
+
+}  // namespace ContextIDs
+}  // namespace FN
+
+#endif /* __FN_MULTI_FUNCTION_COMMON_CONTEXT_IDS_H__ */
diff --git a/source/blender/functions2/FN_multi_function_context.h b/source/blender/functions2/FN_multi_function_context.h
index 1036e35b364..700ec58bc9c 100644
--- a/source/blender/functions2/FN_multi_function_context.h
+++ b/source/blender/functions2/FN_multi_function_context.h
@@ -2,12 +2,77 @@
 #define __FN_MULTI_FUNCTION_CONTEXT_H__
 
 #include "BLI_math_cxx.h"
+#include "BLI_optional.h"
+#include "BLI_virtual_list_ref.h"
+#include "BLI_vector.h"
 
 namespace FN {
 
-class MFContext {
+using BLI::ArrayRef;
+using BLI::Optional;
+using BLI::Vector;
+using BLI::VirtualListRef;
+
+class MFContext : BLI::NonCopyable, BLI::NonMovable {
+ private:
+  ArrayRef<const void *> m_context_ids;
+  ArrayRef<const void *> m_context_data;
+  ArrayRef<VirtualListRef<uint>> m_context_indices;
+
+ public:
+  MFContext(ArrayRef<const void *> context_ids,
+            ArrayRef<const void *> context_data,
+            ArrayRef<VirtualListRef<uint>> context_indices)
+      : m_context_ids(context_ids),
+        m_context_data(context_data),
+        m_context_indices(context_indices)
+  {
+    BLI_assert(m_context_ids.size() == m_context_data.size());
+    BLI_assert(m_context_ids.size() == m_context_indices.size());
+  }
+
+  struct ElementContext {
+    const void *data;
+    VirtualListRef<uint> indices;
+  };
+
+  Optional<ElementContext> try_find_context(const void *context_type_id) const
+  {
+    int index = m_context_ids.first_index(context_type_id);
+    if (index >= 0) {
+      return ElementContext{m_context_data[index], m_context_indices[index]};
+    }
+    else {
+      return {};
+    }
+  }
+};
+
+class MFContextBuilder {
+ private:
+  Vector<const void *> m_context_ids;
+  Vector<const void *> m_context_data;
+  Vector<VirtualListRef<uint>> m_context_indices;
+  MFContext m_context;
+
  public:
-  ArrayRef<BLI::float3> vertex_positions;
+  MFContextBuilder() : m_context({}, {}, {})
+  {
+  }
+
+  void add(const void *id, const void *data, VirtualListRef<uint> indices)
+  {
+    m_context_ids.append(id);
+    m_context_data.append(data);
+    m_context_indices.append(indices);
+  }
+
+  MFContext &build()
+  {
+    m_context.~MFContext();
+    new (&m_context) MFContext(m_context_ids, m_context_data, m_context_indices);
+    return m_context;
+  }
 };
 
 }  // namespace FN
diff --git a/source/blender/functions2/intern/multi_function_common_context_ids.cc b/source/blender/functions2/intern/multi_function_common_context_ids.cc
new file mode 100644
index 00000000000..ab4a920ab8a
--- /dev/null
+++ b/source/blender/functions2/intern/multi_function_common_context_ids.cc
@@ -0,0 +1,3 @@
+#define FN_COMMON_CONTEXT_IDS_CC
+
+#include "FN_multi_function_common_context_ids.h"
diff --git a/source/blender/functions2/intern/multi_functions/mixed.cc b/source/blender/functions2/intern/multi_functions/mixed.cc
index 91579f4f527..f9032fdebf8 100644
--- a/source/blender/functions2/intern/multi_functions/mixed.cc
+++ b/source/blender/functions2/intern/multi_functions/mixed.cc
@@ -2,6 +2,7 @@
 
 #include "FN_generic_array_ref.h"
 #include "FN_generic_vector_array.h"
+#include "FN_multi_function_common_context_ids.h"
 
 #include "BLI_math_cxx.h"
 #include "BLI_lazy_init_cxx.h"
@@ -323,6 +324,7 @@ void MF_SimpleVectorize::call(const MFMask &mask, MFParams &params, MFContext &c
       }
     }
 
+    /* TODO: Call with updated context. */
     ArrayRef<uint> sub_mask_indices = IndexRange(length).as_array_ref();
     m_function.call(sub_mask_indices, params_builder.build(), context);
   }
@@ -338,11 +340,24 @@ MF_ContextVertexPosition::MF_ContextVertexPosition()
 void MF_ContextVertexPosition::call(const MFMask &mask, MFParams &params, MFContext &context) const
 {
   MutableArrayRef<float3> positions = params.single_output<float3>(0, "Position");
-  ArrayRef<float3> context_positions = context.vertex_positions;
+  auto positions_context = context.try_find_context(ContextIDs::vertex_locations);
 
-  for (uint i : mask.indices()) {
-    positions[i] = context_positions[i];
+  if (positions_context.has_value()) {
+    ArrayRef<float3> vertex_positions = *(ArrayRef<float3> *)positions_context.value().data;
+    for (uint i : mask.indices()) {
+      uint context_index = positions_context.value().indices[i];
+      positions[i] = vertex_positions[context_index];
+    }
   }
+  else {
+    positions.fill_indices(mask.indices(), {0, 0, 0});
+  }
+
+  // ArrayRef<float3> context_positions = context.vertex_positions;
+
+  // for (uint i : mask.indices()) {
+  //   positions[i] = context_positions[i];
+  // }
 }
 
 }  // namespace FN
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index f8845e2893e..e848e53d948 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -2,6 +2,7 @@
 
 #include "FN_vtree_multi_function_network_generation.h"
 #include "FN_multi_functions.h"
+#include "FN_multi_function_common_context_ids.h"
 
 #include "BLI_math_cxx.h"
 
@@ -15,6 +16,7 @@ using BLI::IndexRange;
 using BLI::TemporaryVector;
 using BLI::Vector;
 using FN::MFContext;
+using FN::MFContextBuilder;
 using FN::MFInputSocket;
 using FN::MFOutputSocket;
 using FN::MFParamsBuilder;
@@ -46,9 +48,15 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
   TemporaryVector<float3> output_vectors(numVerts);
   params.add_single_output<float3>(output_vectors);
 
-  MFContext context;
-  context.vertex_positions = ArrayRef<float3>((float3 *)vertexCos, numVerts);
-  function->call(IndexRange(numVerts).as_array_ref(), params.build(), context);
+  ArrayRef<float3> input_vertex_locations = ArrayRef<float3>((float3 *)vertexCos, numVerts);
+
+  MFContextBuilder context_builder;
+  context_builder.add(
+      FN::ContextIDs::vertex_locations,
+      (void *)&input_vertex_locations,
+      BLI::VirtualListRef<uint>::FromFullArray(IndexRange(numVerts).as_array_ref()));
+
+  function->call(IndexRange(numVerts).as_array_ref(), params.build(), context_builder.build());
 
   memcpy(vertexCos, output_vectors.begin(), output_vectors.size() * sizeof(float3));
 }
diff --git a/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc b/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
index 9ec468feea1..9e524067a2e 100644
--- a/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
@@ -49,8 +49,8 @@ Mesh *MOD_functionpoints_do(FunctionPointsModifierData *fpmd)
   FN::GenericVectorArray vector_array{FN::GET_TYPE<float3>(), 1};
   params.add_vector_output(vector_array);
 
-  MFContext context;
-  function->call(FN::MFMask({0}), params.build(), context);
+  FN::MFContextBuilder context_builder;
+  function->call(FN::MFMask({0}), params.build(), context_builder.build());
 
   ArrayRef<float3> output_points = vector_array[0].as_typed_ref<float3>();



More information about the Bf-blender-cvs mailing list