diff options
Diffstat (limited to 'source/blender/blenkernel/BKE_geometry_fields.hh')
-rw-r--r-- | source/blender/blenkernel/BKE_geometry_fields.hh | 176 |
1 files changed, 154 insertions, 22 deletions
diff --git a/source/blender/blenkernel/BKE_geometry_fields.hh b/source/blender/blenkernel/BKE_geometry_fields.hh index 7c504826044..62aac5a4120 100644 --- a/source/blender/blenkernel/BKE_geometry_fields.hh +++ b/source/blender/blenkernel/BKE_geometry_fields.hh @@ -8,47 +8,186 @@ * Common field utilities and field definitions for geometry components. */ +#include "BKE_attribute.h" #include "BKE_geometry_set.hh" #include "FN_field.hh" +struct Mesh; +struct PointCloud; + namespace blender::bke { -class GeometryComponentFieldContext : public fn::FieldContext { +class CurvesGeometry; +class GeometryFieldInput; + +class MeshFieldContext : public fn::FieldContext { + private: + const Mesh &mesh_; + const eAttrDomain domain_; + + public: + MeshFieldContext(const Mesh &mesh, const eAttrDomain domain); + const Mesh &mesh() const + { + return mesh_; + } + + eAttrDomain domain() const + { + return domain_; + } +}; + +class CurvesFieldContext : public fn::FieldContext { + private: + const CurvesGeometry &curves_; + const eAttrDomain domain_; + + public: + CurvesFieldContext(const CurvesGeometry &curves, const eAttrDomain domain); + + const CurvesGeometry &curves() const + { + return curves_; + } + + eAttrDomain domain() const + { + return domain_; + } +}; + +class PointCloudFieldContext : public fn::FieldContext { + private: + const PointCloud &pointcloud_; + + public: + PointCloudFieldContext(const PointCloud &pointcloud) : pointcloud_(pointcloud) + { + } + + const PointCloud &pointcloud() const + { + return pointcloud_; + } +}; + +class InstancesFieldContext : public fn::FieldContext { + private: + const InstancesComponent &instances_; + + public: + InstancesFieldContext(const InstancesComponent &instances) : instances_(instances) + { + } + + const InstancesComponent &instances() const + { + return instances_; + } +}; + +/** + * A field context that can represent meshes, curves, point clouds, or instances, + * used for field inputs that can work for multiple geometry types. + */ +class GeometryFieldContext : public fn::FieldContext { private: - const GeometryComponent &component_; + /** + * Store the geometry as a void pointer instead of a #GeometryComponent to allow referencing data + * that doesn't correspond directly to a geometry component type, in this case #CurvesGeometry + * instead of #Curves. + */ + const void *geometry_; + const GeometryComponentType type_; const eAttrDomain domain_; + friend GeometryFieldInput; + public: - GeometryComponentFieldContext(const GeometryComponent &component, const eAttrDomain domain) - : component_(component), domain_(domain) + GeometryFieldContext(const GeometryComponent &component, eAttrDomain domain); + GeometryFieldContext(const void *geometry, GeometryComponentType type, eAttrDomain domain); + + const void *geometry() const { + return geometry_; } - const GeometryComponent &geometry_component() const + GeometryComponentType type() const { - return component_; + return type_; } eAttrDomain domain() const { return domain_; } + + std::optional<AttributeAccessor> attributes() const; + const Mesh *mesh() const; + const CurvesGeometry *curves() const; + const PointCloud *pointcloud() const; + const InstancesComponent *instances() const; + + private: + GeometryFieldContext(const Mesh &mesh, eAttrDomain domain); + GeometryFieldContext(const CurvesGeometry &curves, eAttrDomain domain); + GeometryFieldContext(const PointCloud &points); + GeometryFieldContext(const InstancesComponent &instances); }; class GeometryFieldInput : public fn::FieldInput { public: using fn::FieldInput::FieldInput; + GVArray get_varray_for_context(const fn::FieldContext &context, + IndexMask mask, + ResourceScope &scope) const override; + virtual GVArray get_varray_for_context(const GeometryFieldContext &context, + IndexMask mask) const = 0; +}; +class MeshFieldInput : public fn::FieldInput { + public: + using fn::FieldInput::FieldInput; GVArray get_varray_for_context(const fn::FieldContext &context, IndexMask mask, ResourceScope &scope) const override; + virtual GVArray get_varray_for_context(const Mesh &mesh, + eAttrDomain domain, + IndexMask mask) const = 0; +}; - virtual GVArray get_varray_for_context(const GeometryComponent &component, +class CurvesFieldInput : public fn::FieldInput { + public: + using fn::FieldInput::FieldInput; + GVArray get_varray_for_context(const fn::FieldContext &context, + IndexMask mask, + ResourceScope &scope) const override; + virtual GVArray get_varray_for_context(const CurvesGeometry &curves, eAttrDomain domain, IndexMask mask) const = 0; }; +class PointCloudFieldInput : public fn::FieldInput { + public: + using fn::FieldInput::FieldInput; + GVArray get_varray_for_context(const fn::FieldContext &context, + IndexMask mask, + ResourceScope &scope) const override; + virtual GVArray get_varray_for_context(const PointCloud &pointcloud, IndexMask mask) const = 0; +}; + +class InstancesFieldInput : public fn::FieldInput { + public: + using fn::FieldInput::FieldInput; + GVArray get_varray_for_context(const fn::FieldContext &context, + IndexMask mask, + ResourceScope &scope) const override; + virtual GVArray get_varray_for_context(const InstancesComponent &instances, + IndexMask mask) const = 0; +}; + class AttributeFieldInput : public GeometryFieldInput { private: std::string name_; @@ -72,8 +211,7 @@ class AttributeFieldInput : public GeometryFieldInput { return name_; } - GVArray get_varray_for_context(const GeometryComponent &component, - eAttrDomain domain, + GVArray get_varray_for_context(const GeometryFieldContext &context, IndexMask mask) const override; std::string socket_inspection_name() const override; @@ -89,8 +227,7 @@ class IDAttributeFieldInput : public GeometryFieldInput { category_ = Category::Generated; } - GVArray get_varray_for_context(const GeometryComponent &component, - eAttrDomain domain, + GVArray get_varray_for_context(const GeometryFieldContext &context, IndexMask mask) const override; std::string socket_inspection_name() const override; @@ -99,12 +236,9 @@ class IDAttributeFieldInput : public GeometryFieldInput { bool is_equal_to(const fn::FieldNode &other) const override; }; -VArray<float3> curve_normals_varray(const CurveComponent &component, const eAttrDomain domain); +VArray<float3> curve_normals_varray(const CurvesGeometry &curves, const eAttrDomain domain); -VArray<float3> mesh_normals_varray(const MeshComponent &mesh_component, - const Mesh &mesh, - const IndexMask mask, - eAttrDomain domain); +VArray<float3> mesh_normals_varray(const Mesh &mesh, const IndexMask mask, eAttrDomain domain); class NormalFieldInput : public GeometryFieldInput { public: @@ -113,8 +247,7 @@ class NormalFieldInput : public GeometryFieldInput { category_ = Category::Generated; } - GVArray get_varray_for_context(const GeometryComponent &component, - const eAttrDomain domain, + GVArray get_varray_for_context(const GeometryFieldContext &context, IndexMask mask) const override; std::string socket_inspection_name() const override; @@ -152,8 +285,7 @@ class AnonymousAttributeFieldInput : public GeometryFieldInput { return fn::Field<T>{field_input}; } - GVArray get_varray_for_context(const GeometryComponent &component, - eAttrDomain domain, + GVArray get_varray_for_context(const GeometryFieldContext &context, IndexMask mask) const override; std::string socket_inspection_name() const override; @@ -162,10 +294,10 @@ class AnonymousAttributeFieldInput : public GeometryFieldInput { bool is_equal_to(const fn::FieldNode &other) const override; }; -class CurveLengthFieldInput final : public GeometryFieldInput { +class CurveLengthFieldInput final : public CurvesFieldInput { public: CurveLengthFieldInput(); - GVArray get_varray_for_context(const GeometryComponent &component, + GVArray get_varray_for_context(const CurvesGeometry &curves, eAttrDomain domain, IndexMask mask) const final; uint64_t hash() const override; |