[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 ¶ms, 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 ¶ms, 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