Functions: Expose set_all method for generic virtual arrays
This is very similar to rB5613c61275fe6 and rB0061150e4c90d, basically just exposing a `VMutableArray` method to its generic counterpart. This is quite important for curve point attributes to avoid a lookup for every point when there are multiple splines.
This commit is contained in:
parent
88aee2986f
commit
c5d38a2be8
Notes:
blender-bot
2023-02-14 00:09:06 +01:00
Referenced by commit 01a614c699
, Fix build after last commit
|
@ -220,11 +220,19 @@ class GVMutableArray : public GVArray {
|
|||
|
||||
void fill(const void *value);
|
||||
|
||||
/* Copy the values from the source buffer to all elements in the virtual array. */
|
||||
void set_all(const void *src)
|
||||
{
|
||||
this->set_all_impl(src);
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void set_by_copy_impl(const int64_t index, const void *value);
|
||||
virtual void set_by_relocate_impl(const int64_t index, void *value);
|
||||
virtual void set_by_move_impl(const int64_t index, void *value) = 0;
|
||||
|
||||
virtual void set_all_impl(const void *src);
|
||||
|
||||
virtual void *try_get_internal_mutable_varray_impl();
|
||||
};
|
||||
|
||||
|
@ -554,6 +562,11 @@ template<typename T> class GVMutableArray_For_VMutableArray : public GVMutableAr
|
|||
varray_->set(index, std::move(value_));
|
||||
}
|
||||
|
||||
void set_all_impl(const void *src)
|
||||
{
|
||||
varray_->set_all(Span((T *)data, size_));
|
||||
}
|
||||
|
||||
void materialize_impl(const IndexMask mask, void *dst) const override
|
||||
{
|
||||
varray_->materialize(mask, MutableSpan((T *)dst, mask.min_array_size()));
|
||||
|
|
|
@ -160,6 +160,19 @@ void GVMutableArray::set_by_relocate_impl(const int64_t index, void *value)
|
|||
type_->destruct(value);
|
||||
}
|
||||
|
||||
void GVMutableArray::set_all_impl(const void *src)
|
||||
{
|
||||
if (this->is_span()) {
|
||||
const GMutableSpan span = this->get_internal_span();
|
||||
type_->copy_to_initialized_n(src, span.data(), size_);
|
||||
}
|
||||
else {
|
||||
for (int64_t i : IndexRange(size_)) {
|
||||
this->set_by_copy(i, POINTER_OFFSET(src, type_->size() * i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void *GVMutableArray::try_get_internal_mutable_varray_impl()
|
||||
{
|
||||
return nullptr;
|
||||
|
|
Loading…
Reference in New Issue