diff options
author | Jacques Lucke <jacques@blender.org> | 2021-01-21 12:32:42 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-01-21 12:32:42 +0300 |
commit | 793547e7d1401ad545e0450b80c7bafd521c60e1 (patch) | |
tree | 74ebdf40005711eb545fd1889bcf8226dd5bcafd /source/blender/blenkernel/BKE_geometry_set.hh | |
parent | 985bc08688b7fb58a910171c63a1417580cffece (diff) |
Geometry Nodes: initial support for volumes
For the most part, this just adds boilerplate code for volume support in geometry nodes:
* Add `VolumeComponent` next to `MeshComponent`, etc.
* Support `VolumeComponent` in depsgraph object iterator.
Furthermore, I added initial volume support in a few nodes:
* The Object Info node outputs an object instance when the input is a volume object
(that will be the same for mesh objects soonish, to avoid copies).
* Support transforming a `VolumeComponent` in the Transform node.
* Support the `VolumeComponent` in Join Geometry nodes, but only when just one of the
inputs has a volume component for now.
Right now, there is no way to create a `VolumeComponent`, because the Object Info node
outputs an object instance. The `VolumeComponent` will be necessary for upcoming nodes,
which will generate volumes on the fly.
Viewport selection does not work correctly with `VolumeComponent`s currently. I don't
know why that is. That can be figured out a bit later, once we can actually create
new volumes in geometry nodes.
Ref T84604.
Differential Revision: https://developer.blender.org/D10147
Diffstat (limited to 'source/blender/blenkernel/BKE_geometry_set.hh')
-rw-r--r-- | source/blender/blenkernel/BKE_geometry_set.hh | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index ad5a5d57045..adc08f699fd 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -36,6 +36,7 @@ struct Collection; struct Mesh; struct Object; struct PointCloud; +struct Volume; /* Each geometry component has a specific type. The type determines what kind of data the component * stores. Functions modifying a geometry will usually just modify a subset of the component types. @@ -44,6 +45,7 @@ enum class GeometryComponentType { Mesh = 0, PointCloud = 1, Instances = 2, + Volume = 3, }; enum class GeometryOwnershipType { @@ -319,10 +321,13 @@ struct GeometrySet { bool has_mesh() const; bool has_pointcloud() const; bool has_instances() const; + bool has_volume() const; const Mesh *get_mesh_for_read() const; const PointCloud *get_pointcloud_for_read() const; + const Volume *get_volume_for_read() const; Mesh *get_mesh_for_write(); PointCloud *get_pointcloud_for_write(); + Volume *get_volume_for_write(); /* Utility methods for replacement. */ void replace_mesh(Mesh *mesh, GeometryOwnershipType ownership = GeometryOwnershipType::Owned); @@ -464,3 +469,25 @@ class InstancesComponent : public GeometryComponent { static constexpr inline GeometryComponentType static_type = GeometryComponentType::Instances; }; + +/** A geometry component that stores volume grids. */ +class VolumeComponent : public GeometryComponent { + private: + Volume *volume_ = nullptr; + GeometryOwnershipType ownership_ = GeometryOwnershipType::Owned; + + public: + VolumeComponent(); + ~VolumeComponent(); + GeometryComponent *copy() const override; + + void clear(); + bool has_volume() const; + void replace(Volume *volume, GeometryOwnershipType ownership = GeometryOwnershipType::Owned); + Volume *release(); + + const Volume *get_for_read() const; + Volume *get_for_write(); + + static constexpr inline GeometryComponentType static_type = GeometryComponentType::Volume; +}; |