45 new_component->transforms_ = transforms_;
46 new_component->instanced_data_ = instanced_data_;
47 new_component->ids_ = ids_;
53 instanced_data_.
clear();
62 data.data.object = object;
70 data.data.collection = collection;
83 return instanced_data_;
103 const int size = instanced_data_.
size();
110 return transforms_.
size() == 0;
133 for (
const int instance_index : original_ids.
index_range()) {
134 const int original_id = original_ids[instance_index];
135 if (used_unique_ids.
add(original_id)) {
137 unique_ids[instance_index] = original_id;
143 instances_with_id_collision.
append(instance_index);
148 for (
const int instance_index : instances_with_id_collision) {
149 const int original_id = original_ids[instance_index];
156 const int max_iteration = 100;
157 for (
int iteration = 0;; iteration++) {
160 if (used_unique_ids.
add(random_id)) {
162 unique_ids[instance_index] = random_id;
165 if (iteration == max_iteration) {
169 unique_ids[instance_index] = original_id;
180 std::lock_guard lock(almost_unique_ids_mutex_);
181 if (almost_unique_ids_.
size() != ids_.
size()) {
184 return almost_unique_ids_;
@ GEO_COMPONENT_TYPE_INSTANCES
@ INSTANCE_DATA_TYPE_OBJECT
@ INSTANCE_DATA_TYPE_COLLECTION
Object groups, one object can be in many groups at once.
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void add_instance(Object *object, blender::float4x4 transform, const int id=-1)
int instances_amount() const
blender::Span< int > almost_unique_ids() const
blender::Span< blender::float4x4 > transforms() const
blender::Span< InstancedData > instanced_data() const
blender::Span< int > ids() const
GeometryComponent * copy() const override
bool owns_direct_data() const override
bool is_empty() const final
void ensure_owns_direct_data() override
Value & lookup_or_add_cb(const Key &key, const CreateValueF &create_value)
void seed_random(uint32_t seed)
void reserve(const int64_t n)
constexpr int64_t size() const
constexpr IndexRange index_range() const
void append(const T &value)
static blender::Array< int > generate_unique_instance_ids(Span< int > original_ids)