Blender V5.0
BKE_instances.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
21
22#include <optional>
23
24#include "BLI_array.hh"
25#include "BLI_function_ref.hh"
26#include "BLI_index_mask_fwd.hh"
29#include "BLI_shared_cache.hh"
30#include "BLI_string_ref.hh"
31#include "BLI_vector.hh"
33
36
37struct Object;
38struct Collection;
39namespace blender::bke {
42} // namespace blender::bke
43
44namespace blender::bke {
45
46struct GeometrySet;
48
54 public:
66
67 private:
68 Type type_ = Type::None;
70 void *data_ = nullptr;
71 std::unique_ptr<GeometrySet> geometry_set_;
72
73 public:
74 InstanceReference() = default;
78 InstanceReference(std::unique_ptr<GeometrySet> geometry_set);
79
82
85
86 Type type() const;
87 Object &object() const;
88 Collection &collection() const;
90 const GeometrySet &geometry_set() const;
91
98 void to_geometry_set(GeometrySet &r_geometry_set) const;
99
100 StringRefNull name() const;
101
102 bool owns_direct_data() const;
104
105 void count_memory(MemoryCounter &memory) const;
106
107 friend bool operator==(const InstanceReference &a, const InstanceReference &b);
108
109 uint64_t hash() const;
110};
111
113 private:
118 Vector<InstanceReference> references_;
119
120 int instances_num_ = 0;
121
122 bke::AttributeStorage attributes_;
123
127 mutable SharedCache<Array<int>> reference_user_counts_;
128
129 /* These unique ids are generated based on the `id` attribute, which might not contain
130 * unique ids at all. */
131 mutable SharedCache<Array<int>> unique_ids_cache_;
132
133 public:
135 Instances(Instances &&other);
136 Instances(const Instances &other);
138
139 Instances &operator=(const Instances &other);
140 Instances &operator=(Instances &&other);
141
148 void resize(int capacity);
149
155 int add_reference(const InstanceReference &reference);
159 int add_new_reference(const InstanceReference &reference);
160 std::optional<int> find_reference_handle(const InstanceReference &query);
166 void add_instance(int instance_handle, const float4x4 &transform);
167
170
172
184 GeometrySet &geometry_set_from_reference(int reference_index);
185
190
191 int instances_num() const;
192 int references_num() const;
193
198 void remove(const IndexMask &mask, const AttributeFilter &attribute_filter);
203 Span<int> unique_ids() const;
204
209
212
215
217 FunctionRef<void(const GeometrySet &geometry_set)> callback) const;
218
219 bool owns_direct_data() const;
221
222 void count_memory(MemoryCounter &memory) const;
223
225 {
226 reference_user_counts_.tag_dirty();
227 unique_ids_cache_.tag_dirty();
228 }
229};
230
233const AttributeAccessorFunctions &instance_attribute_accessor_functions();
234
235/* -------------------------------------------------------------------- */
238
239inline InstanceReference::InstanceReference(std::unique_ptr<GeometrySet> geometry_set)
240 : type_(Type::GeometrySet), geometry_set_(std::move(geometry_set))
241{
242}
243
245{
246}
247
252
254 : type_(other.type_), data_(other.data_), geometry_set_(std::move(other.geometry_set_))
255{
256 other.type_ = Type::None;
257 other.data_ = nullptr;
258}
259
261{
262 if (this == &other) {
263 return *this;
264 }
265 this->~InstanceReference();
266 new (this) InstanceReference(other);
267 return *this;
268}
269
271{
272 if (this == &other) {
273 return *this;
274 }
275 this->~InstanceReference();
276 new (this) InstanceReference(std::move(other));
277 return *this;
278}
279
281{
282 return type_;
283}
284
286{
287 BLI_assert(type_ == Type::Object);
288 return *(Object *)data_;
289}
290
292{
294 return *(Collection *)data_;
295}
296
298{
300 return *geometry_set_;
301}
302
304{
306 return *geometry_set_;
307}
308
310{
311 return attributes_;
312}
313
315{
316 return attributes_;
317}
318
320
321} // namespace blender::bke
#define BLI_assert(a)
Definition BLI_assert.h:46
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
unsigned long long int uint64_t
void count_memory(MemoryCounter &memory) const
Definition instances.cc:52
InstanceReference & operator=(const InstanceReference &other)
void to_geometry_set(GeometrySet &r_geometry_set) const
Definition instances.cc:94
StringRefNull name() const
Definition instances.cc:120
friend bool operator==(const InstanceReference &a, const InstanceReference &b)
Definition instances.cc:135
Collection & collection() const
Span< int > reference_handles() const
Definition instances.cc:215
MutableSpan< int > reference_handles_for_write()
Definition instances.cc:222
int add_reference(const InstanceReference &reference)
Definition instances.cc:261
void remove(const IndexMask &mask, const AttributeFilter &attribute_filter)
Definition instances.cc:285
int add_new_reference(const InstanceReference &reference)
Definition instances.cc:269
GeometrySet & geometry_set_from_reference(int reference_index)
Definition instances.cc:241
Span< float4x4 > transforms() const
Definition instances.cc:228
void add_instance(int instance_handle, const float4x4 &transform)
Definition instances.cc:204
Span< InstanceReference > references() const
Definition instances.cc:275
Span< int > reference_user_counts() const
Definition instances.cc:488
Instances & operator=(const Instances &other)
Definition instances.cc:171
void resize(int capacity)
Definition instances.cc:191
int references_num() const
Definition instances.cc:398
bke::MutableAttributeAccessor attributes_for_write()
Definition instances.cc:69
void foreach_referenced_geometry(FunctionRef< void(const GeometrySet &geometry_set)> callback) const
bke::AttributeAccessor attributes() const
Definition instances.cc:64
MutableSpan< InstanceReference > references_for_write()
Definition instances.cc:280
int instances_num() const
Definition instances.cc:393
void count_memory(MemoryCounter &memory) const
Definition instances.cc:423
bke::AttributeStorage & attribute_storage()
bool owns_direct_data() const
Definition instances.cc:403
std::optional< int > find_reference_handle(const InstanceReference &query)
Definition instances.cc:250
MutableSpan< float4x4 > transforms_for_write()
Definition instances.cc:235
Span< int > unique_ids() const
Definition instances.cc:505
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
VArray< float3 > instance_position_varray(const Instances &instances)
Definition instances.cc:529
VMutableArray< float3 > instance_position_varray_for_write(Instances &instances)
Definition instances.cc:535
const AttributeAccessorFunctions & instance_attribute_accessor_functions()
MatBase< float, 4, 4 > float4x4