Blender V4.3
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
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 {
41class AttributeAccessor;
42class MutableAttributeAccessor;
43} // namespace blender::bke
44
45namespace blender::bke {
46
47struct GeometrySet;
48
54 public:
55 enum class Type {
61 None,
62 Object,
65 };
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;
76 InstanceReference(Collection &collection);
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 CustomData attributes_;
123
127 mutable SharedCache<Array<int>> reference_user_counts_;
128
129 /* These almost unique ids are generated based on the `id` attribute, which might not contain
130 * unique ids at all. They are *almost* unique, because under certain very unlikely
131 * circumstances, they are not unique. Code using these ids should not crash when they are not
132 * unique but can generally expect them to be unique. */
133 mutable SharedCache<Array<int>> almost_unique_ids_cache_;
134
135 public:
136 Instances();
137 Instances(Instances &&other);
138 Instances(const Instances &other);
139 ~Instances();
140
141 Instances &operator=(const Instances &other);
142 Instances &operator=(Instances &&other);
143
150 void resize(int capacity);
151
157 int add_reference(const InstanceReference &reference);
161 int add_new_reference(const InstanceReference &reference);
162 std::optional<int> find_reference_handle(const InstanceReference &query);
168 void add_instance(int instance_handle, const float4x4 &transform);
169
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
208
211
213 const CustomData &custom_data_attributes() const;
214
216 FunctionRef<void(const GeometrySet &geometry_set)> callback) const;
217
218 bool owns_direct_data() const;
220
221 void count_memory(MemoryCounter &memory) const;
222
224 {
225 reference_user_counts_.tag_dirty();
226 almost_unique_ids_cache_.tag_dirty();
227 }
228};
229
230VArray<float3> instance_position_varray(const Instances &instances);
232
233/* -------------------------------------------------------------------- */
237inline InstanceReference::InstanceReference(std::unique_ptr<GeometrySet> geometry_set)
238 : type_(Type::GeometrySet), data_(nullptr), geometry_set_(std::move(geometry_set))
239{
240}
241
242inline InstanceReference::InstanceReference(Object &object) : type_(Type::Object), data_(&object)
243{
244}
245
247 : type_(Type::Collection), data_(&collection)
248{
249}
250
252 : type_(other.type_), data_(other.data_), geometry_set_(std::move(other.geometry_set_))
253{
254 other.type_ = Type::None;
255 other.data_ = nullptr;
256}
257
259{
260 if (this == &other) {
261 return *this;
262 }
263 this->~InstanceReference();
264 new (this) InstanceReference(other);
265 return *this;
266}
267
269{
270 if (this == &other) {
271 return *this;
272 }
273 this->~InstanceReference();
274 new (this) InstanceReference(std::move(other));
275 return *this;
276}
277
279{
280 return type_;
281}
282
284{
285 BLI_assert(type_ == Type::Object);
286 return *(Object *)data_;
287}
288
290{
292 return *(Collection *)data_;
293}
294
296{
298 return *geometry_set_;
299}
300
302{
304 return *geometry_set_;
305}
306
308{
309 return attributes_;
310}
311
313{
314 return attributes_;
315}
316
319} // namespace blender::bke
#define BLI_assert(a)
Definition BLI_assert.h:50
void count_memory(MemoryCounter &memory) const
Definition instances.cc:53
InstanceReference & operator=(const InstanceReference &other)
void to_geometry_set(GeometrySet &r_geometry_set) const
Definition instances.cc:85
StringRefNull name() const
Definition instances.cc:111
friend bool operator==(const InstanceReference &a, const InstanceReference &b)
Definition instances.cc:126
Collection & collection() const
Span< int > reference_handles() const
Definition instances.cc:207
MutableSpan< int > reference_handles_for_write()
Definition instances.cc:214
int add_reference(const InstanceReference &reference)
Definition instances.cc:263
void remove(const IndexMask &mask, const AttributeFilter &attribute_filter)
Definition instances.cc:282
int add_new_reference(const InstanceReference &reference)
Definition instances.cc:271
GeometrySet & geometry_set_from_reference(int reference_index)
Definition instances.cc:243
Span< float4x4 > transforms() const
Definition instances.cc:225
void add_instance(int instance_handle, const float4x4 &transform)
Definition instances.cc:195
Span< InstanceReference > references() const
Definition instances.cc:277
Span< int > reference_user_counts() const
Definition instances.cc:480
Instances & operator=(const Instances &other)
Definition instances.cc:169
void resize(int capacity)
Definition instances.cc:189
int references_num() const
Definition instances.cc:395
bke::MutableAttributeAccessor attributes_for_write()
void foreach_referenced_geometry(FunctionRef< void(const GeometrySet &geometry_set)> callback) const
bke::AttributeAccessor attributes() const
int instances_num() const
Definition instances.cc:390
void count_memory(MemoryCounter &memory) const
Definition instances.cc:420
Span< int > almost_unique_ids() const
Definition instances.cc:497
bool owns_direct_data() const
Definition instances.cc:400
CustomData & custom_data_attributes()
std::optional< int > find_reference_handle(const InstanceReference &query)
Definition instances.cc:252
MutableSpan< float4x4 > transforms_for_write()
Definition instances.cc:232
local_group_size(16, 16) .push_constant(Type b
DEGForeachIDComponentCallback callback
VArray< float3 > instance_position_varray(const Instances &instances)
Definition instances.cc:525
VMutableArray< float3 > instance_position_varray_for_write(Instances &instances)
Definition instances.cc:530
unsigned __int64 uint64_t
Definition stdint.h:90