Blender V4.3
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
13#include "BKE_geometry_set.hh"
14
15#include "FN_field.hh"
16
17struct Mesh;
18struct PointCloud;
19
20namespace blender::bke {
21
22class CurvesGeometry;
23class GeometryFieldInput;
24namespace greasepencil {
25class Drawing;
26}
27
29 private:
30 const Mesh &mesh_;
31 AttrDomain domain_;
32
33 public:
34 MeshFieldContext(const Mesh &mesh, AttrDomain domain);
35 const Mesh &mesh() const
36 {
37 return mesh_;
38 }
39
41 {
42 return domain_;
43 }
44};
45
47 private:
48 const CurvesGeometry &curves_;
49 AttrDomain domain_;
50 const Curves *curves_id_ = nullptr;
51
52 public:
53 CurvesFieldContext(const CurvesGeometry &curves, AttrDomain domain);
55
56 const CurvesGeometry &curves() const
57 {
58 return curves_;
59 }
60
61 const Curves *curves_id() const
62 {
63 return curves_id_;
64 }
65
67 {
68 return domain_;
69 }
70};
71
73 private:
74 const PointCloud &pointcloud_;
75
76 public:
78
79 const PointCloud &pointcloud() const
80 {
81 return pointcloud_;
82 }
83};
84
86 private:
87 const GreasePencil &grease_pencil_;
88
89 public:
91
93 {
94 return grease_pencil_;
95 }
96};
97
99 private:
100 const GreasePencil &grease_pencil_;
101 AttrDomain domain_;
102 int layer_index_;
103
104 public:
106 AttrDomain domain,
107 int layer_index)
108 : grease_pencil_(grease_pencil), domain_(domain), layer_index_(layer_index)
109 {
110 }
111
113 {
114 return grease_pencil_;
115 }
116
118 {
119 return domain_;
120 }
121
122 int layer_index() const
123 {
124 return layer_index_;
125 }
126
128 const IndexMask &mask,
129 ResourceScope &scope) const;
130};
131
133 private:
134 const Instances &instances_;
135
136 public:
137 InstancesFieldContext(const Instances &instances) : instances_(instances) {}
138
139 const Instances &instances() const
140 {
141 return instances_;
142 }
143};
144
150 private:
156 const void *geometry_;
157 const GeometryComponent::Type type_;
158 AttrDomain domain_;
159 const Curves *curves_id_ = nullptr;
164 int grease_pencil_layer_index_;
165
166 friend GeometryFieldInput;
167
168 public:
170 GeometryFieldContext(const GeometryComponent &component, AttrDomain domain);
171 GeometryFieldContext(const void *geometry,
173 AttrDomain domain,
175 GeometryFieldContext(const Mesh &mesh, AttrDomain domain);
176 GeometryFieldContext(const CurvesGeometry &curves, AttrDomain domain);
179 GeometryFieldContext(const GreasePencil &grease_pencil, AttrDomain domain, int layer_index);
180 GeometryFieldContext(const PointCloud &points);
181 GeometryFieldContext(const Instances &instances);
182
183 const void *geometry() const
184 {
185 return geometry_;
186 }
187
189 {
190 return type_;
191 }
192
194 {
195 return domain_;
196 }
197
199 {
202 return grease_pencil_layer_index_;
203 }
204
205 std::optional<AttributeAccessor> attributes() const;
206 const Mesh *mesh() const;
207 const CurvesGeometry *curves() const;
208 const PointCloud *pointcloud() const;
209 const GreasePencil *grease_pencil() const;
211 const Instances *instances() const;
212 const CurvesGeometry *curves_or_strokes() const;
213 const Curves *curves_id() const;
214};
215
217 public:
220 const IndexMask &mask,
221 ResourceScope &scope) const override;
223 const IndexMask &mask) const = 0;
224 virtual std::optional<AttrDomain> preferred_domain(const GeometryComponent &component) const;
225};
226
228 public:
231 const IndexMask &mask,
232 ResourceScope &scope) const override;
234 AttrDomain domain,
235 const IndexMask &mask) const = 0;
236 virtual std::optional<AttrDomain> preferred_domain(const Mesh &mesh) const;
237};
238
240 public:
243 const IndexMask &mask,
244 ResourceScope &scope) const override;
246 AttrDomain domain,
247 const IndexMask &mask) const = 0;
248 virtual std::optional<AttrDomain> preferred_domain(const CurvesGeometry &curves) const;
249};
250
252 public:
255 const IndexMask &mask,
256 ResourceScope &scope) const override;
257 virtual GVArray get_varray_for_context(const PointCloud &pointcloud,
258 const IndexMask &mask) const = 0;
259};
260
262 public:
265 const IndexMask &mask,
266 ResourceScope &scope) const override;
267 virtual GVArray get_varray_for_context(const Instances &instances,
268 const IndexMask &mask) const = 0;
269};
270
272 private:
273 std::string name_;
274 std::optional<std::string> socket_inspection_name_;
275
276 public:
277 AttributeFieldInput(std::string name,
278 const CPPType &type,
279 std::optional<std::string> socket_inspection_name = std::nullopt)
280 : GeometryFieldInput(type, name),
281 name_(std::move(name)),
282 socket_inspection_name_(std::move(socket_inspection_name))
283 {
286 }
287
288 static fn::GField Create(std::string name,
289 const CPPType &type,
290 std::optional<std::string> socket_inspection_name = std::nullopt)
291 {
292 auto field_input = std::make_shared<AttributeFieldInput>(
293 std::move(name), type, std::move(socket_inspection_name));
294 return fn::GField(field_input);
295 }
296 template<typename T>
297 static fn::Field<T> Create(std::string name,
298 std::optional<std::string> socket_inspection_name = std::nullopt)
299 {
300 return fn::Field<T>(
301 Create(std::move(name), CPPType::get<T>(), std::move(socket_inspection_name)));
302 }
303
305 {
306 return name_;
307 }
308
310 const IndexMask &mask) const override;
311
312 std::string socket_inspection_name() const override;
313
314 uint64_t hash() const override;
315 bool is_equal_to(const fn::FieldNode &other) const override;
316 std::optional<AttrDomain> preferred_domain(const GeometryComponent &component) const override;
317};
318
320 private:
321 std::string name_;
322
323 public:
324 AttributeExistsFieldInput(std::string name, const CPPType &type)
325 : GeometryFieldInput(type, name), name_(std::move(name))
326 {
328 }
329
330 static fn::Field<bool> Create(std::string name)
331 {
332 const CPPType &type = CPPType::get<bool>();
333 auto field_input = std::make_shared<AttributeExistsFieldInput>(std::move(name), type);
334 return fn::Field<bool>(field_input);
335 }
336
338 const IndexMask &mask) const final;
339};
340
342 private:
343 std::string layer_name_;
344
345 public:
346 NamedLayerSelectionFieldInput(std::string layer_name)
347 : bke::GeometryFieldInput(CPPType::get<bool>(), "Named Layer node"),
348 layer_name_(std::move(layer_name))
349 {
351 }
352
354 const IndexMask &mask) const final;
355 uint64_t hash() const override;
356 bool is_equal_to(const fn::FieldNode &other) const override;
357 std::optional<AttrDomain> preferred_domain(const GeometryComponent &component) const override;
358};
359
361 public:
366
368 const IndexMask &mask) const override;
369
370 std::string socket_inspection_name() const override;
371
372 uint64_t hash() const override;
373 bool is_equal_to(const fn::FieldNode &other) const override;
374};
375
376VArray<float3> curve_normals_varray(const CurvesGeometry &curves, AttrDomain domain);
377
378VArray<float3> mesh_normals_varray(const Mesh &mesh, const IndexMask &mask, AttrDomain domain);
379
381 public:
386
388 const IndexMask &mask) const override;
389
390 std::string socket_inspection_name() const override;
391
392 uint64_t hash() const override;
393 bool is_equal_to(const fn::FieldNode &other) const override;
394};
395
397 public:
400 AttrDomain domain,
401 const IndexMask &mask) const final;
402 uint64_t hash() const override;
403 bool is_equal_to(const fn::FieldNode &other) const override;
404 std::optional<AttrDomain> preferred_domain(const bke::CurvesGeometry &curves) const final;
405};
406
408 private:
409 fn::Field<int> index_field_;
410 fn::GField value_field_;
411 AttrDomain value_field_domain_;
412
413 public:
415 fn::GField value_field,
416 AttrDomain value_field_domain);
417
419 const IndexMask &mask) const final;
420
421 std::optional<AttrDomain> preferred_domain(const GeometryComponent & /*component*/) const final
422 {
423 return value_field_domain_;
424 }
425};
426
427void copy_with_checked_indices(const GVArray &src,
428 const VArray<int> &indices,
429 const IndexMask &mask,
430 GMutableSpan dst);
431
433 private:
434 fn::GField src_field_;
435 AttrDomain src_domain_;
436
437 public:
439
441 const IndexMask & /*mask*/) const final;
442 void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const override;
443
444 std::optional<AttrDomain> preferred_domain(
445 const GeometryComponent & /*component*/) const override;
446};
447
449 const fn::FieldContext &field_context,
450 Span<StringRef> attribute_ids,
451 AttrDomain domain,
452 const fn::Field<bool> &selection,
453 Span<fn::GField> fields);
454
456 const fn::FieldContext &field_context,
457 const StringRef attribute_id,
458 AttrDomain domain,
459 const fn::Field<bool> &selection,
460 const fn::GField &field)
461{
463 attributes, field_context, {attribute_id}, domain, selection, {field});
464}
465
466bool try_capture_fields_on_geometry(GeometryComponent &component,
467 Span<StringRef> attribute_ids,
468 AttrDomain domain,
469 Span<fn::GField> fields);
470
472 const StringRef attribute_id,
473 AttrDomain domain,
474 const fn::GField &field)
475{
476 return try_capture_fields_on_geometry(component, {attribute_id}, domain, {field});
477}
478
479bool try_capture_fields_on_geometry(GeometryComponent &component,
480 Span<StringRef> attribute_ids,
481 AttrDomain domain,
482 const fn::Field<bool> &selection,
483 Span<fn::GField> fields);
484
486 const StringRef attribute_id,
487 AttrDomain domain,
488 const fn::Field<bool> &selection,
489 const fn::GField &field)
490{
491 return try_capture_fields_on_geometry(component, {attribute_id}, domain, selection, {field});
492}
493
498std::optional<AttrDomain> try_detect_field_domain(const GeometryComponent &component,
499 const fn::GField &field);
500
501} // namespace blender::bke
#define BLI_assert(a)
Definition BLI_assert.h:50
#define ELEM(...)
static const CPPType & get()
GVArray get_varray_for_context(const bke::GeometryFieldContext &context, const IndexMask &mask) const final
AttributeExistsFieldInput(std::string name, const CPPType &type)
static fn::Field< bool > Create(std::string name)
bool is_equal_to(const fn::FieldNode &other) const override
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
static fn::Field< T > Create(std::string name, std::optional< std::string > socket_inspection_name=std::nullopt)
static fn::GField Create(std::string name, const CPPType &type, std::optional< std::string > socket_inspection_name=std::nullopt)
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
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
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
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:682
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
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)
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)
VArray< float3 > mesh_normals_varray(const Mesh &mesh, const IndexMask &mask, AttrDomain domain)
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)
GPU_SHADER_INTERFACE_INFO(overlay_edit_curve_handle_iface, "vert").flat(Type pos vertex_in(1, Type::UINT, "data") .vertex_out(overlay_edit_curve_handle_iface) .geometry_layout(PrimitiveIn Frequency::GEOMETRY storage_buf(1, Qualifier::READ, "uint", "data[]", Frequency::GEOMETRY) .push_constant(Type Frequency::GEOMETRY selection[]
unsigned __int64 uint64_t
Definition stdint.h:90