Blender V4.5
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
35
37
38struct Object;
39struct Collection;
40namespace blender::bke {
43} // namespace blender::bke
44
45namespace blender::bke {
46
47struct GeometrySet;
49
55 public:
67
68 private:
69 Type type_ = Type::None;
71 void *data_ = nullptr;
72 std::unique_ptr<GeometrySet> geometry_set_;
73
74 public:
75 InstanceReference() = default;
79 InstanceReference(std::unique_ptr<GeometrySet> geometry_set);
80
83
86
87 Type type() const;
88 Object &object() const;
89 Collection &collection() const;
91 const GeometrySet &geometry_set() const;
92
99 void to_geometry_set(GeometrySet &r_geometry_set) const;
100
101 StringRefNull name() const;
102
103 bool owns_direct_data() const;
105
106 void count_memory(MemoryCounter &memory) const;
107
108 friend bool operator==(const InstanceReference &a, const InstanceReference &b);
109
110 uint64_t hash() const;
111};
112
114 private:
119 Vector<InstanceReference> references_;
120
121 int instances_num_ = 0;
122
123 CustomData attributes_;
124
128 mutable SharedCache<Array<int>> reference_user_counts_;
129
130 /* These almost unique ids are generated based on the `id` attribute, which might not contain
131 * unique ids at all. They are *almost* unique, because under certain very unlikely
132 * circumstances, they are not unique. Code using these ids should not crash when they are not
133 * unique but can generally expect them to be unique. */
134 mutable SharedCache<Array<int>> almost_unique_ids_cache_;
135
136 public:
137 Instances();
138 Instances(Instances &&other);
139 Instances(const Instances &other);
140 ~Instances();
141
142 Instances &operator=(const Instances &other);
143 Instances &operator=(Instances &&other);
144
151 void resize(int capacity);
152
158 int add_reference(const InstanceReference &reference);
162 int add_new_reference(const InstanceReference &reference);
163 std::optional<int> find_reference_handle(const InstanceReference &query);
169 void add_instance(int instance_handle, const float4x4 &transform);
170
173
185 GeometrySet &geometry_set_from_reference(int reference_index);
186
191
192 int instances_num() const;
193 int references_num() const;
194
199 void remove(const IndexMask &mask, const AttributeFilter &attribute_filter);
204
209
212
214 const CustomData &custom_data_attributes() const;
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 almost_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:51
InstanceReference & operator=(const InstanceReference &other)
void to_geometry_set(GeometrySet &r_geometry_set) const
Definition instances.cc:93
StringRefNull name() const
Definition instances.cc:119
friend bool operator==(const InstanceReference &a, const InstanceReference &b)
Definition instances.cc:134
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:271
void remove(const IndexMask &mask, const AttributeFilter &attribute_filter)
Definition instances.cc:290
int add_new_reference(const InstanceReference &reference)
Definition instances.cc:279
GeometrySet & geometry_set_from_reference(int reference_index)
Definition instances.cc:251
Span< float4x4 > transforms() const
Definition instances.cc:233
void add_instance(int instance_handle, const float4x4 &transform)
Definition instances.cc:203
Span< InstanceReference > references() const
Definition instances.cc:285
Span< int > reference_user_counts() const
Definition instances.cc:488
Instances & operator=(const Instances &other)
Definition instances.cc:177
void resize(int capacity)
Definition instances.cc:197
int references_num() const
Definition instances.cc:403
bke::MutableAttributeAccessor attributes_for_write()
Definition instances.cc:68
void foreach_referenced_geometry(FunctionRef< void(const GeometrySet &geometry_set)> callback) const
bke::AttributeAccessor attributes() const
Definition instances.cc:63
int instances_num() const
Definition instances.cc:398
void count_memory(MemoryCounter &memory) const
Definition instances.cc:428
Span< int > almost_unique_ids() const
Definition instances.cc:505
bool owns_direct_data() const
Definition instances.cc:408
CustomData & custom_data_attributes()
std::optional< int > find_reference_handle(const InstanceReference &query)
Definition instances.cc:260
MutableSpan< float4x4 > transforms_for_write()
Definition instances.cc:240
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:534
const AttributeAccessorFunctions & instance_attribute_accessor_functions()
MatBase< float, 4, 4 > float4x4