[Bf-blender-cvs] [2ef5959f8ae] functions-experimental-refactor: GenericVectorArrayOrSingleRef
Jacques Lucke
noreply at git.blender.org
Tue Oct 15 15:56:53 CEST 2019
Commit: 2ef5959f8ae6ad97ce6df38c6da0aa89bdefee19
Author: Jacques Lucke
Date: Thu Oct 10 21:21:05 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB2ef5959f8ae6ad97ce6df38c6da0aa89bdefee19
GenericVectorArrayOrSingleRef
===================================================================
M source/blender/blenkernel/BKE_generic_array_ref.h
M source/blender/blenkernel/BKE_generic_vector_array.h
M source/blender/blenkernel/intern/node_functions.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_generic_array_ref.h b/source/blender/blenkernel/BKE_generic_array_ref.h
index 64cc7b3bd66..759b909adce 100644
--- a/source/blender/blenkernel/BKE_generic_array_ref.h
+++ b/source/blender/blenkernel/BKE_generic_array_ref.h
@@ -20,16 +20,16 @@ class GenericArrayRef {
uint m_size;
public:
- GenericArrayRef(const CPPType *type) : GenericArrayRef(type, nullptr, 0)
+ GenericArrayRef(const CPPType &type) : GenericArrayRef(type, nullptr, 0)
{
}
- GenericArrayRef(const CPPType *type, const void *buffer, uint size)
- : m_type(type), m_buffer(buffer), m_size(size)
+ GenericArrayRef(const CPPType &type, const void *buffer, uint size)
+ : m_type(&type), m_buffer(buffer), m_size(size)
{
- BLI_assert(type != nullptr);
+ BLI_assert(&type != nullptr);
BLI_assert(buffer != nullptr || size == 0);
- BLI_assert(type->pointer_has_valid_alignment(buffer));
+ BLI_assert(type.pointer_has_valid_alignment(buffer));
}
uint size() const
@@ -50,7 +50,7 @@ class GenericArrayRef {
template<typename T> ArrayRef<T> get_ref() const
{
- BLI_assert(GET_TYPE<T>().is_same_or_generalization(m_type));
+ BLI_assert(GET_TYPE<T>().is_same_or_generalization(*m_type));
return ArrayRef<T>((const T *)m_buffer, m_size);
}
};
@@ -130,9 +130,15 @@ class GenericMutableArrayRef {
return m_size;
}
+ void *operator[](uint index)
+ {
+ BLI_assert(index < m_size);
+ return POINTER_OFFSET(m_buffer, m_type->size() * index);
+ }
+
template<typename T> MutableArrayRef<T> get_ref()
{
- BLI_assert(GET_TYPE<T>().is_same_or_generalization(m_type));
+ BLI_assert(GET_TYPE<T>().is_same_or_generalization(*m_type));
return MutableArrayRef<T>((T *)m_buffer, m_size);
}
};
@@ -147,7 +153,7 @@ class ArrayRefCPPType final : public CPPType {
static void ConstructDefaultCB(const CPPType *self, void *ptr)
{
const ArrayRefCPPType *self_ = dynamic_cast<const ArrayRefCPPType *>(self);
- new (ptr) GenericArrayRef(&self_->m_base_type);
+ new (ptr) GenericArrayRef(self_->m_base_type);
}
};
diff --git a/source/blender/blenkernel/BKE_generic_vector_array.h b/source/blender/blenkernel/BKE_generic_vector_array.h
index 959b9acc154..297936dc5d4 100644
--- a/source/blender/blenkernel/BKE_generic_vector_array.h
+++ b/source/blender/blenkernel/BKE_generic_vector_array.h
@@ -171,6 +171,18 @@ class GenericVectorArray : BLI::NonCopyable, BLI::NonMovable {
}
};
+class GenericVectorArrayOrSingleRef {
+ private:
+ CPPType *m_type;
+
+ public:
+ GenericArrayRef operator[](uint index)
+ {
+ /* TODO */
+ return GenericArrayRef(*m_type);
+ }
+};
+
}; // namespace BKE
#endif /* __BKE_GENERIC_MULTI_VECTOR_H__ */
\ No newline at end of file
diff --git a/source/blender/blenkernel/intern/node_functions.cc b/source/blender/blenkernel/intern/node_functions.cc
index 265a96386a8..413ea6656b9 100644
--- a/source/blender/blenkernel/intern/node_functions.cc
+++ b/source/blender/blenkernel/intern/node_functions.cc
@@ -41,10 +41,11 @@ class MultiFunction {
GenericArrayOrSingleRef readonly_single_input(uint index, StringRef name);
template<typename T> MutableArrayRef<T> single_output(uint index, StringRef name);
+ GenericMutableArrayRef single_output(uint index, StringRef name);
template<typename T>
const GenericVectorArray::TypedRef<T> readonly_vector_input(uint index, StringRef name);
- const GenericVectorArray &readonly_vector_input(uint index, StringRef name);
+ GenericVectorArrayOrSingleRef readonly_vector_input(uint index, StringRef name);
template<typename T>
GenericVectorArray::MutableTypedRef<T> vector_output(uint index, StringRef name);
@@ -180,8 +181,23 @@ class MultiFunction_GetListElement : public MultiFunction {
void call(ArrayRef<uint> mask_indices, Params ¶ms) const override
{
- GenericVectorArray &lists = params.mutable_vector(0, "List");
- ArrayOrSingleRef<int> input_indices = params.readonly_single_input<int>(1, "Index");
+ GenericVectorArrayOrSingleRef lists = params.readonly_vector_input(0, "List");
+ ArrayOrSingleRef<int> indices = params.readonly_single_input<int>(1, "Index");
+ GenericArrayOrSingleRef fallbacks = params.readonly_single_input(2, "Fallback");
+
+ GenericMutableArrayRef output_values = params.single_output(3, "Value");
+
+ for (uint i : mask_indices) {
+ int index = indices[i];
+ if (index >= 0) {
+ GenericArrayRef list = lists[i];
+ if (index < list.size()) {
+ m_base_type.copy_to_uninitialized(list[index], output_values[i]);
+ continue;
+ }
+ }
+ m_base_type.copy_to_uninitialized(fallbacks[i], output_values[i]);
+ }
}
};
More information about the Bf-blender-cvs
mailing list