Blender V4.3
geometry_component_instances.cc
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#include <mutex>
6
7#include "BLI_index_mask.hh"
8#include "BLI_map.hh"
10#include "BLI_set.hh"
11#include "BLI_span.hh"
12#include "BLI_task.hh"
13#include "BLI_vector.hh"
14
15#include "BKE_geometry_set.hh"
16#include "BKE_instances.hh"
17
19
20namespace blender::bke {
21
22/* -------------------------------------------------------------------- */
27
29 : GeometryComponent(Type::Instance), instances_(instances), ownership_(ownership)
30{
31}
32
37
39{
40 InstancesComponent *new_component = new InstancesComponent();
41 if (instances_ != nullptr) {
42 new_component->instances_ = new Instances(*instances_);
43 new_component->ownership_ = GeometryOwnershipType::Owned;
44 }
45 return GeometryComponentPtr(new_component);
46}
47
49{
50 BLI_assert(this->is_mutable() || this->is_expired());
51 if (ownership_ == GeometryOwnershipType::Owned) {
52 delete instances_;
53 }
54 instances_ = nullptr;
55}
56
58{
59 if (instances_ != nullptr) {
60 if (instances_->instances_num() > 0) {
61 return false;
62 }
63 }
64 return true;
65}
66
68{
69 if (instances_ != nullptr) {
70 return instances_->owns_direct_data();
71 }
72 return true;
73}
74
76{
77 if (instances_ != nullptr) {
78 instances_->ensure_owns_direct_data();
79 }
80}
81
83{
84 return instances_;
85}
86
88{
89 BLI_assert(this->is_mutable());
90 if (ownership_ == GeometryOwnershipType::ReadOnly) {
91 instances_ = new Instances(*instances_);
93 }
94 return instances_;
95}
96
98{
99 BLI_assert(this->is_mutable());
100 this->clear();
101 instances_ = instances;
102 ownership_ = ownership;
103}
104
106{
107 BLI_assert(this->is_mutable());
108 Instances *instance = instances_;
109 instances_ = nullptr;
110 return instance;
111}
112
114{
115 if (instances_) {
116 instances_->count_memory(memory);
117 }
118}
119
121{
122 Instances &instances = *static_cast<Instances *>(owner);
124}
125
127{
128 static CustomDataAccessInfo instance_custom_data_access = {
129 [](void *owner) -> CustomData * {
130 Instances *instances = static_cast<Instances *>(owner);
131 return &instances->custom_data_attributes();
132 },
133 [](const void *owner) -> const CustomData * {
134 const Instances *instances = static_cast<const Instances *>(owner);
135 return &instances->custom_data_attributes();
136 },
137 [](const void *owner) -> int {
138 const Instances *instances = static_cast<const Instances *>(owner);
139 return instances->instances_num();
140 }};
141
148 static BuiltinCustomDataLayerProvider id("id",
152 instance_custom_data_access,
153 nullptr);
154
155 static BuiltinCustomDataLayerProvider instance_transform("instance_transform",
159 instance_custom_data_access,
160 nullptr);
161
163 static BuiltinCustomDataLayerProvider reference_index(".reference_index",
167 instance_custom_data_access,
169
170 static CustomDataAttributeProvider instance_custom_data(AttrDomain::Instance,
171 instance_custom_data_access);
172
173 return ComponentAttributeProviders({&instance_transform, &id, &reference_index},
174 {&instance_custom_data});
175}
176
178{
182 fn.domain_size = [](const void *owner, const AttrDomain domain) {
183 if (owner == nullptr) {
184 return 0;
185 }
186 const Instances *instances = static_cast<const Instances *>(owner);
187 switch (domain) {
189 return instances->instances_num();
190 default:
191 return 0;
192 }
193 };
194 fn.domain_supported = [](const void * /*owner*/, const AttrDomain domain) {
195 return domain == AttrDomain::Instance;
196 };
197 fn.adapt_domain = [](const void * /*owner*/,
198 const GVArray &varray,
199 const AttrDomain from_domain,
200 const AttrDomain to_domain) {
201 if (from_domain == to_domain && from_domain == AttrDomain::Instance) {
202 return varray;
203 }
204 return GVArray{};
205 };
206 return fn;
207}
208
214
219
224
225std::optional<AttributeAccessor> InstancesComponent::attributes() const
226{
228}
229
230std::optional<MutableAttributeAccessor> InstancesComponent::attributes_for_write()
231{
233}
234
237} // namespace blender::bke
#define BLI_assert(a)
Definition BLI_assert.h:50
@ CD_PROP_INT32
@ CD_PROP_FLOAT4X4
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object instance
std::optional< MutableAttributeAccessor > attributes_for_write() final
void count_memory(MemoryCounter &memory) const override
GeometryComponentPtr copy() const override
std::optional< AttributeAccessor > attributes() const final
void replace(Instances *instances, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
bke::MutableAttributeAccessor attributes_for_write()
bke::AttributeAccessor attributes() const
int instances_num() const
Definition instances.cc:390
void count_memory(MemoryCounter &memory) const
Definition instances.cc:420
bool owns_direct_data() const
Definition instances.cc:400
CustomData & custom_data_attributes()
AttributeAccessorFunctions accessor_functions_for_providers()
ImplicitSharingPtr< GeometryComponent > GeometryComponentPtr
static ComponentAttributeProviders create_attribute_providers_for_instances()
static const AttributeAccessorFunctions & get_instances_accessor_functions_ref()
static AttributeAccessorFunctions get_instances_accessor_functions()
static void tag_component_reference_index_changed(void *owner)
GVArray(* adapt_domain)(const void *owner, const GVArray &varray, AttrDomain from_domain, AttrDomain to_domain)
bool(* domain_supported)(const void *owner, AttrDomain domain)
int(* domain_size)(const void *owner, AttrDomain domain)