Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2021-11-30 18:59:11 +0300
committerHans Goudey <h.goudey@me.com>2021-11-30 18:59:11 +0300
commitc822e03e2a58e23d9ef82b30b012f59ae7d1c425 (patch)
tree9799fccf0a2a46c55477f91ac692e985be0c85d4 /source
parent2fbb52dd86b3a346945babda9b3f1b5f2ceafa38 (diff)
Fix: Missing handling of dynamic instance attribute size
The attributes need to be reallocated when the size changes. Differential Revision: https://developer.blender.org/D13390
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_attribute_access.hh2
-rw-r--r--source/blender/blenkernel/intern/attribute_access.cc6
-rw-r--r--source/blender/blenkernel/intern/geometry_component_instances.cc4
3 files changed, 12 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_attribute_access.hh b/source/blender/blenkernel/BKE_attribute_access.hh
index 47f62b52a0f..4402f6fbf74 100644
--- a/source/blender/blenkernel/BKE_attribute_access.hh
+++ b/source/blender/blenkernel/BKE_attribute_access.hh
@@ -345,6 +345,8 @@ class CustomDataAttributes {
void reallocate(const int size);
+ void clear();
+
std::optional<blender::fn::GSpan> get_for_read(const AttributeIDRef &attribute_id) const;
blender::fn::GVArray get_for_read(const AttributeIDRef &attribute_id,
diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc
index 47ddb2494d0..902e08f1b28 100644
--- a/source/blender/blenkernel/intern/attribute_access.cc
+++ b/source/blender/blenkernel/intern/attribute_access.cc
@@ -821,6 +821,12 @@ void CustomDataAttributes::reallocate(const int size)
CustomData_realloc(&data, size);
}
+void CustomDataAttributes::clear()
+{
+ CustomData_free(&data, size_);
+ size_ = 0;
+}
+
bool CustomDataAttributes::foreach_attribute(const AttributeForeachCallback callback,
const AttributeDomain domain) const
{
diff --git a/source/blender/blenkernel/intern/geometry_component_instances.cc b/source/blender/blenkernel/intern/geometry_component_instances.cc
index 9a30c86c1e5..29c28a875c1 100644
--- a/source/blender/blenkernel/intern/geometry_component_instances.cc
+++ b/source/blender/blenkernel/intern/geometry_component_instances.cc
@@ -63,6 +63,7 @@ void InstancesComponent::reserve(int min_capacity)
if (!instance_ids_.is_empty()) {
this->instance_ids_ensure();
}
+ attributes_.reallocate(min_capacity);
}
/**
@@ -78,6 +79,7 @@ void InstancesComponent::resize(int capacity)
if (!instance_ids_.is_empty()) {
this->instance_ids_ensure();
}
+ attributes_.reallocate(capacity);
}
void InstancesComponent::clear()
@@ -85,6 +87,7 @@ void InstancesComponent::clear()
instance_reference_handles_.clear();
instance_transforms_.clear();
instance_ids_.clear();
+ attributes_.clear();
references_.clear();
}
@@ -98,6 +101,7 @@ void InstancesComponent::add_instance(const int instance_handle, const float4x4
if (!instance_ids_.is_empty()) {
this->instance_ids_ensure();
}
+ attributes_.reallocate(this->instances_amount());
}
blender::Span<int> InstancesComponent::instance_reference_handles() const