Blender V5.0
BKE_geometry_fields.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
12
14#include "BKE_geometry_set.hh"
15
16#include "FN_field.hh"
17
18struct Mesh;
19struct PointCloud;
20
21namespace blender::bke {
22
23class CurvesGeometry;
25namespace greasepencil {
26class Drawing;
27}
28
30 private:
31 const Mesh &mesh_;
32 AttrDomain domain_;
33
34 public:
36 const Mesh &mesh() const
37 {
38 return mesh_;
39 }
40
42 {
43 return domain_;
44 }
45};
46
48 private:
49 const CurvesGeometry &curves_;
50 AttrDomain domain_;
51 const Curves *curves_id_ = nullptr;
52
53 public:
56
57 const CurvesGeometry &curves() const
58 {
59 return curves_;
60 }
61
62 const Curves *curves_id() const
63 {
64 return curves_id_;
65 }
66
68 {
69 return domain_;
70 }
71};
72
74 private:
75 const PointCloud &pointcloud_;
76
77 public:
79
80 const PointCloud &pointcloud() const
81 {
82 return pointcloud_;
83 }
84};
85
87 private:
88 const GreasePencil &grease_pencil_;
89
90 public:
92
94 {
95 return grease_pencil_;
96 }
97};
98
100 private:
101 const GreasePencil &grease_pencil_;
102 AttrDomain domain_;
103 int layer_index_;
104
105 public:
108 int layer_index)
109 : grease_pencil_(grease_pencil), domain_(domain), layer_index_(layer_index)
110 {
111 }
112
114 {
115 return grease_pencil_;
116 }
117
119 {
120 return domain_;
121 }
122
123 int layer_index() const
124 {
125 return layer_index_;
126 }
127
129 const IndexMask &mask,
130 ResourceScope &scope) const override;
131};
132
134 private:
135 const Instances &instances_;
136
137 public:
139
140 const Instances &instances() const
141 {
142 return instances_;
143 }
144};
145
151 private:
157 const void *geometry_;
158 const GeometryComponent::Type type_;
159 AttrDomain domain_;
160 const Curves *curves_id_ = nullptr;
165 int grease_pencil_layer_index_;
166
167 friend GeometryFieldInput;
168
169 public:
172 GeometryFieldContext(const void *geometry,
181 GeometryFieldContext(const PointCloud &points);
183
184 const void *geometry() const
185 {
186 return geometry_;
187 }
188
190 {
191 return type_;
192 }
193
195 {
196 return domain_;
197 }
198
200 {
203 return grease_pencil_layer_index_;
204 }
205
206 std::optional<AttributeAccessor> attributes() const;
207 const Mesh *mesh() const;
208 const CurvesGeometry *curves() const;
209 const PointCloud *pointcloud() const;
210 const GreasePencil *grease_pencil() const;
212 const Instances *instances() const;
213 const CurvesGeometry *curves_or_strokes() const;
214 const Curves *curves_id() const;
215};
216
218 public:
221 const IndexMask &mask,
222 ResourceScope &scope) const override;
224 const IndexMask &mask) const = 0;
225 virtual std::optional<AttrDomain> preferred_domain(const GeometryComponent &component) const;
226};
227
229 public:
232 const IndexMask &mask,
233 ResourceScope &scope) const override;
235 AttrDomain domain,
236 const IndexMask &mask) const = 0;
237 virtual std::optional<AttrDomain> preferred_domain(const Mesh &mesh) const;
238};
239
241 public:
244 const IndexMask &mask,
245 ResourceScope &scope) const override;
247 AttrDomain domain,
248 const IndexMask &mask) const = 0;
249 virtual std::optional<AttrDomain> preferred_domain(const CurvesGeometry &curves) const;
250};
251
253 public:
256 const IndexMask &mask,
257 ResourceScope &scope) const override;
258 virtual GVArray get_varray_for_context(const PointCloud &pointcloud,
259 const IndexMask &mask) const = 0;
260};
261
263 public:
266 const IndexMask &mask,
267 ResourceScope &scope) const override;
268 virtual GVArray get_varray_for_context(const Instances &instances,
269 const IndexMask &mask) const = 0;
270};
271
273 private:
274 std::string name_;
275 std::optional<std::string> socket_inspection_name_;
276
277 public:
279 const CPPType &type,
280 std::optional<std::string> socket_inspection_name = std::nullopt)
281 : GeometryFieldInput(type, name),
282 name_(std::move(name)),
283 socket_inspection_name_(std::move(socket_inspection_name))
284 {
287 }
288
289 static fn::GField from(std::string name,
290 const CPPType &type,
291 std::optional<std::string> socket_inspection_name = std::nullopt)
292 {
293 auto field_input = std::make_shared<AttributeFieldInput>(
294 std::move(name), type, std::move(socket_inspection_name));
295 return fn::GField(field_input);
296 }
297 template<typename T>
298 static fn::Field<T> from(std::string name,
299 std::optional<std::string> socket_inspection_name = std::nullopt)
300 {
301 return fn::Field<T>(
302 from(std::move(name), CPPType::get<T>(), std::move(socket_inspection_name)));
303 }
304
306 {
307 return name_;
308 }
309
311 const IndexMask &mask) const override;
312
313 std::string socket_inspection_name() const override;
314
315 uint64_t hash() const override;
316 bool is_equal_to(const fn::FieldNode &other) const override;
317 std::optional<AttrDomain> preferred_domain(const GeometryComponent &component) const override;
318};
319
321 private:
322 std::string name_;
323
324 public:
325 AttributeExistsFieldInput(std::string name, const CPPType &type)
326 : GeometryFieldInput(type, name), name_(std::move(name))
327 {
329 }
330
331 static fn::Field<bool> from(std::string name)
332 {
333 const CPPType &type = CPPType::get<bool>();
334 auto field_input = std::make_shared<AttributeExistsFieldInput>(std::move(name), type);
335 return fn::Field<bool>(field_input);
336 }
337
339 const IndexMask &mask) const final;
340};
341
343 private:
344 std::string layer_name_;
345
346 public:
347 NamedLayerSelectionFieldInput(std::string layer_name)
348 : bke::GeometryFieldInput(CPPType::get<bool>(), "Named Layer node"),
349 layer_name_(std::move(layer_name))
350 {
352 }
353
355 const IndexMask &mask) const final;
356 uint64_t hash() const override;
357 bool is_equal_to(const fn::FieldNode &other) const override;
358 std::optional<AttrDomain> preferred_domain(const GeometryComponent &component) const override;
359};
360
362 public:
367
369 const IndexMask &mask) const override;
370
371 std::string socket_inspection_name() const override;
372
373 uint64_t hash() const override;
374 bool is_equal_to(const fn::FieldNode &other) const override;
375};
376
378
380 const IndexMask &mask,
381 AttrDomain domain,
382 bool no_corner_normals = false,
383 bool true_normals = false);
384
386 bool legacy_corner_normals_ = false;
387 bool true_normals_ = false;
388
389 public:
390 NormalFieldInput(const bool legacy_corner_normals = false, const bool true_normals = false)
392 legacy_corner_normals_(legacy_corner_normals),
393 true_normals_(true_normals)
394 {
396 }
397
399 const IndexMask &mask) const override;
400
401 std::string socket_inspection_name() const override;
402
403 uint64_t hash() const override;
404 bool is_equal_to(const fn::FieldNode &other) const override;
405};
406
408 public:
411 AttrDomain domain,
412 const IndexMask &mask) const final;
413 uint64_t hash() const override;
414 bool is_equal_to(const fn::FieldNode &other) const override;
415 std::optional<AttrDomain> preferred_domain(const bke::CurvesGeometry &curves) const final;
416};
417
419 private:
420 fn::Field<int> index_field_;
421 fn::GField value_field_;
422 AttrDomain value_field_domain_;
423
424 public:
426 fn::GField value_field,
427 AttrDomain value_field_domain);
428
430 const IndexMask &mask) const final;
431
432 std::optional<AttrDomain> preferred_domain(const GeometryComponent & /*component*/) const final
433 {
434 return value_field_domain_;
435 }
436};
437
438void copy_with_checked_indices(const GVArray &src,
439 const VArray<int> &indices,
440 const IndexMask &mask,
441 GMutableSpan dst);
442
444 private:
445 fn::GField src_field_;
446 AttrDomain src_domain_;
447
448 public:
450
452 const IndexMask & /*mask*/) const final;
453 void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const override;
454
455 std::optional<AttrDomain> preferred_domain(
456 const GeometryComponent & /*component*/) const override;
457};
458
460 const fn::FieldContext &field_context,
461 Span<StringRef> attribute_ids,
462 AttrDomain domain,
463 const fn::Field<bool> &selection,
464 Span<fn::GField> fields);
465
467 const fn::FieldContext &field_context,
468 const StringRef attribute_id,
469 AttrDomain domain,
470 const fn::Field<bool> &selection,
471 const fn::GField &field)
472{
474 attributes, field_context, {attribute_id}, domain, selection, {field});
475}
476
477bool try_capture_fields_on_geometry(GeometryComponent &component,
478 Span<StringRef> attribute_ids,
479 AttrDomain domain,
480 Span<fn::GField> fields);
481
483 const StringRef attribute_id,
484 AttrDomain domain,
485 const fn::GField &field)
486{
487 return try_capture_fields_on_geometry(component, {attribute_id}, domain, {field});
488}
489
490bool try_capture_fields_on_geometry(GeometryComponent &component,
491 Span<StringRef> attribute_ids,
492 AttrDomain domain,
493 const fn::Field<bool> &selection,
494 Span<fn::GField> fields);
495
497 const StringRef attribute_id,
498 AttrDomain domain,
499 const fn::Field<bool> &selection,
500 const fn::GField &field)
501{
502 return try_capture_fields_on_geometry(component, {attribute_id}, domain, selection, {field});
503}
504
509std::optional<AttrDomain> try_detect_field_domain(const GeometryComponent &component,
510 const fn::GField &field);
511
512} // namespace blender::bke
#define BLI_assert(a)
Definition BLI_assert.h:46
#define final(a, b, c)
Definition BLI_hash.h:19
#define ELEM(...)
AttrDomain
unsigned long long int uint64_t
static const CPPType & get()
GVArray get_varray_for_context(const bke::GeometryFieldContext &context, const IndexMask &mask) const final
static fn::Field< bool > from(std::string name)
AttributeExistsFieldInput(std::string name, const CPPType &type)
bool is_equal_to(const fn::FieldNode &other) const override
static fn::Field< T > from(std::string name, std::optional< std::string > socket_inspection_name=std::nullopt)
static fn::GField from(std::string name, const CPPType &type, std::optional< std::string > socket_inspection_name=std::nullopt)
uint64_t hash() const override
AttributeFieldInput(std::string name, const CPPType &type, std::optional< std::string > socket_inspection_name=std::nullopt)
GVArray get_varray_for_context(const GeometryFieldContext &context, const IndexMask &mask) const override
std::string socket_inspection_name() const override
std::optional< AttrDomain > preferred_domain(const GeometryComponent &component) const override
GVArray get_varray_for_context(const CurvesGeometry &curves, AttrDomain domain, const IndexMask &mask) const final
bool is_equal_to(const fn::FieldNode &other) const override
std::optional< AttrDomain > preferred_domain(const bke::CurvesGeometry &curves) const final
const CurvesGeometry & curves() const
CurvesFieldContext(const CurvesGeometry &curves, AttrDomain domain)
GVArray get_varray_for_context(const fn::FieldContext &context, const IndexMask &mask, ResourceScope &scope) const override
virtual std::optional< AttrDomain > preferred_domain(const CurvesGeometry &curves) const
virtual GVArray get_varray_for_context(const CurvesGeometry &curves, AttrDomain domain, const IndexMask &mask) const =0
GVArray get_varray_for_context(const bke::GeometryFieldContext &context, const IndexMask &mask) const final
EvaluateAtIndexInput(fn::Field< int > index_field, fn::GField value_field, AttrDomain value_field_domain)
std::optional< AttrDomain > preferred_domain(const GeometryComponent &) const final
std::optional< AttrDomain > preferred_domain(const GeometryComponent &) const override
void for_each_field_input_recursive(FunctionRef< void(const FieldInput &)> fn) const override
EvaluateOnDomainInput(fn::GField field, AttrDomain domain)
GVArray get_varray_for_context(const bke::GeometryFieldContext &context, const IndexMask &) const final
const CurvesGeometry * curves() const
std::optional< AttributeAccessor > attributes() const
const Instances * instances() const
const PointCloud * pointcloud() const
GeometryFieldContext(const GeometryFieldContext &other, AttrDomain domain)
const greasepencil::Drawing * grease_pencil_layer_drawing() const
const GreasePencil * grease_pencil() const
const CurvesGeometry * curves_or_strokes() const
GeometryComponent::Type type() const
FieldInput(const CPPType &type, std::string debug_name="")
Definition field.cc:677
GVArray get_varray_for_context(const fn::FieldContext &context, const IndexMask &mask, ResourceScope &scope) const override
virtual std::optional< AttrDomain > preferred_domain(const GeometryComponent &component) const
virtual GVArray get_varray_for_context(const GeometryFieldContext &context, const IndexMask &mask) const =0
const GreasePencil & grease_pencil() const
GreasePencilFieldContext(const GreasePencil &grease_pencil)
GreasePencilLayerFieldContext(const GreasePencil &grease_pencil, AttrDomain domain, int layer_index)
GVArray get_varray_for_input(const fn::FieldInput &field_input, const IndexMask &mask, ResourceScope &scope) const override
GVArray get_varray_for_context(const GeometryFieldContext &context, const IndexMask &mask) const override
bool is_equal_to(const fn::FieldNode &other) const override
std::string socket_inspection_name() const override
InstancesFieldContext(const Instances &instances)
GVArray get_varray_for_context(const fn::FieldContext &context, const IndexMask &mask, ResourceScope &scope) const override
virtual GVArray get_varray_for_context(const Instances &instances, const IndexMask &mask) const =0
MeshFieldContext(const Mesh &mesh, AttrDomain domain)
virtual std::optional< AttrDomain > preferred_domain(const Mesh &mesh) const
virtual GVArray get_varray_for_context(const Mesh &mesh, AttrDomain domain, const IndexMask &mask) const =0
GVArray get_varray_for_context(const fn::FieldContext &context, const IndexMask &mask, ResourceScope &scope) const override
std::optional< AttrDomain > preferred_domain(const GeometryComponent &component) const override
GVArray get_varray_for_context(const bke::GeometryFieldContext &context, const IndexMask &mask) const final
bool is_equal_to(const fn::FieldNode &other) const override
bool is_equal_to(const fn::FieldNode &other) const override
GVArray get_varray_for_context(const GeometryFieldContext &context, const IndexMask &mask) const override
uint64_t hash() const override
NormalFieldInput(const bool legacy_corner_normals=false, const bool true_normals=false)
std::string socket_inspection_name() const override
PointCloudFieldContext(const PointCloud &pointcloud)
virtual GVArray get_varray_for_context(const PointCloud &pointcloud, const IndexMask &mask) const =0
GVArray get_varray_for_context(const fn::FieldContext &context, const IndexMask &mask, ResourceScope &scope) const override
FieldInput(const CPPType &type, std::string debug_name="")
Definition field.cc:677
static ushort indices[]
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bool attribute_name_is_anonymous(const StringRef name)
std::optional< AttrDomain > try_detect_field_domain(const GeometryComponent &component, const fn::GField &field)
void copy_with_checked_indices(const GVArray &src, const VArray< int > &indices, const IndexMask &mask, GMutableSpan dst)
VArray< float3 > curve_normals_varray(const CurvesGeometry &curves, AttrDomain domain)
VArray< float3 > mesh_normals_varray(const Mesh &mesh, const IndexMask &mask, AttrDomain domain, bool no_corner_normals=false, bool true_normals=false)
bool try_capture_field_on_geometry(MutableAttributeAccessor attributes, const fn::FieldContext &field_context, const StringRef attribute_id, AttrDomain domain, const fn::Field< bool > &selection, const fn::GField &field)
bool try_capture_fields_on_geometry(MutableAttributeAccessor attributes, const fn::FieldContext &field_context, Span< StringRef > attribute_ids, AttrDomain domain, const fn::Field< bool > &selection, Span< fn::GField > fields)
VecBase< float, 3 > float3
const char * name