OpenVDB: openvdb/points/PointRasterizeFrustum.h Source File

OpenVDB 10.0.1

Loading...
Searching...
No Matches
PointRasterizeFrustum.h
Go to the documentation of this file.
1// Copyright Contributors to the OpenVDB Project
2// SPDX-License-Identifier: MPL-2.0
3
4/// @author Dan Bailey, Rick Hankins
5///
6/// @file PointRasterizeFrustum.h
7///
8/// @brief Volume rasterization of VDB Points using velocity and camera motion-blur
9
10#ifndef OPENVDB_POINTS_POINT_RASTERIZE_FRUSTUM_HAS_BEEN_INCLUDED
11#define OPENVDB_POINTS_POINT_RASTERIZE_FRUSTUM_HAS_BEEN_INCLUDED
12
13#include <openvdb/math/Ray.h>
14#include <openvdb/math/DDA.h>
15#include <openvdb/util/NullInterrupter.h>
16#include <openvdb/thread/Threading.h>
17#include <openvdb/tools/GridTransformer.h> // for tools::resampleToMatch()
18#include <openvdb/tools/Interpolation.h>
19#include "PointCount.h"
20#include "PointDataGrid.h"
21
22namespace openvdb {
23 OPENVDB_USE_VERSION_NAMESPACE
24namespace OPENVDB_VERSION_NAME {
25namespace points {
26
27
28/// @brief How to composite points into a volume.
29 enum class RasterMode
30{
31 ACCUMULATE = 0,
32 MAXIMUM,
33 AVERAGE
34};
35
36
37/// @brief A camera class that provides an interface for camera motion blur when rasterizing
38 class RasterCamera
39{
40public:
41 explicit RasterCamera(const math::Transform& transform);
42
43 bool isStatic() const;
44
45 void clear();
46 void appendTransform(const math::Transform&, float weight = 1.0f);
47
48 size_t size() const;
49
50 void simplify();
51
52 bool hasWeight(Index i) const;
53 float weight(Index i) const;
54
55 const math::Transform& transform(Index i) const;
56 const math::Transform& firstTransform() const;
57 const math::Transform& lastTransform() const;
58
59 void setShutter(float start, float end);
60 float shutterStart() const;
61 float shutterEnd() const;
62
63private:
64 std::deque<math::Transform> mTransforms;
65 std::deque<float> mWeights;
66 // default to 180 degree film shutter
67 float mShutterStart = -0.25f,
68 mShutterEnd = 0.25f;
69}; // class RasterCamera
70
71
72/// @brief A group of shared settings to be used in the Volume Rasterizer
73/// @param scaleByVoxelVolume scale particle contributions by the volume of the receiving voxel
74/// @param velocityAttribute the name of the velocity attribute
75/// @param velocityMotionBlur bake the point velocities into the volume
76/// @param clipToFrustum if enabled and the transform is a frustum transform, eliminate
77/// points whose position does not lie within the frustum
78/// @param clipBBox an optional world-space bounding box to clip the points
79/// during rasterization
80/// @param clipMask an optional mask, each point samples the mask using a
81/// nearest-neighbor sampling and is only rasterized if active
82/// @param invertMask if mask is provided, only rasterize if sample is inactive
83/// @param framesPerSecond the global value for frames / second for computing motion blur
84/// @param threaded if enabled, use threading to accelerate rasterization
85/// @note rasterization can clip can using any combination of bounding box, mask and frustum
86 struct FrustumRasterizerSettings
87{
88 FrustumRasterizerSettings() = delete;
89
90 explicit FrustumRasterizerSettings(const math::Transform& _transform)
91 : transform(new math::Transform(_transform))
92 , camera(_transform) { }
93
94 math::Transform::Ptr transform;
95 RasterCamera camera;
96 bool scaleByVoxelVolume = false,
97 useRadius = false,
98 accurateFrustumRadius = false,
99 accurateSphereMotionBlur = false,
100 velocityMotionBlur = false,
101 threaded = true;
102 float threshold = 1e-6f,
103 radiusScale = 1.0f,
104 framesPerSecond = 24.0f;
105 Name velocityAttribute = "v",
106 radiusAttribute = "pscale";
107 int motionSamples = 2;
108}; // struct FrustumRasterizerSettings
109
110
111 struct FrustumRasterizerMask
112{
113 using AccessorT = const tree::ValueAccessor<const MaskTree>;
114
115 FrustumRasterizerMask() = default;
116
117 explicit FrustumRasterizerMask(
118 const math::Transform& transform,
119 const MaskGrid* mask = nullptr,
120 const BBoxd& bbox = BBoxd(),
121 const bool clipToFrustum = true,
122 const bool invert = false);
123
124 operator bool() const;
125
126 MaskTree::ConstPtr getTreePtr() const;
127
128 bool valid(const Coord& ijk, AccessorT* acc) const;
129
130 const CoordBBox& clipBBox() const;
131
132private:
133 MaskGrid::Ptr mMask;
134 CoordBBox mClipBBox;
135 bool mInvert = false;
136}; // struct FrustumRasterizerMask
137
138
139 namespace point_rasterize_internal {
140
141template <typename PointDataGridT>
142 class GridToRasterize;
143
144} // namespace point_rasterize_internal
145
146
147/// @brief Efficient rasterization of one or more VDB Points grids into a linear
148/// or frustum volume with the option to bake in camera or geometry motion blur.
149///
150/// @details The camera transform can be provided using a RasterCamera object to
151/// offer linear camera motion blur and geometry motion blur is computed from reading
152/// a velocity attribute on the points. Sub-sampled camera motion blur is planned.
153///
154/// @note For maximum memory efficiency, the data can optionally be streamed from
155/// disk where the input VDB point grids are collapsed as they are read.
156///
157/// @note The total contribution for each point is spread across all the voxels being
158/// rasterized into and weighted by the total volume represented by each voxel. In an
159/// example use case where a point is moving away from a camera that is used to
160/// generate a frustum volume being rasterized into, each successive voxel is larger in
161/// size.
162template<typename PointDataGridT>
163 class FrustumRasterizer
164{
165public:
166 using GridPtr = typename PointDataGridT::Ptr;
167 using GridConstPtr = typename PointDataGridT::ConstPtr;
168 using GridToRasterize = point_rasterize_internal::GridToRasterize<PointDataGridT>;
169
170 /// @brief main constructor
171 /// @param settings the shared settings for rasterizing, see class for more details
172 /// @param mask a spatial mask to use to define the areas of rasterization
173 /// @param interrupt a pointer adhering to the util::NullInterrupter interface
174 explicit FrustumRasterizer(
175 const FrustumRasterizerSettings& settings,
176 const FrustumRasterizerMask& mask = FrustumRasterizerMask(),
177 util::NullInterrupter* interrupt = nullptr);
178
179 /// @brief Append a PointDataGrid to the rasterizer (but don't rasterize yet).
180 /// @param points the PointDataGrid
181 void addPoints(GridConstPtr& points);
182
183 /// @brief Append a PointDataGrid to the rasterizer (but don't rasterize yet).
184 /// @param points the non-const PointDataGrid
185 /// @param stream if true, will destructively collapse attributes while
186 /// accessing so as to minimize the memory footprint.
187 void addPoints(GridPtr& points, bool stream = false);
188
189 /// @brief Clear all PointDataGrids in the rasterizer.
190 void clear();
191
192 /// @brief Return number of PointDataGrids in the rasterizer.
193 size_t size() const;
194
195 /// @brief Return memory usage of the rasterizer.
196 size_t memUsage() const;
197
198 template <typename FilterT = points::NullFilter>
199 FloatGrid::Ptr
200 rasterizeUniformDensity(RasterMode mode=RasterMode::MAXIMUM,
201 bool reduceMemory = false, float scale = 1.0f, const FilterT& filter = FilterT());
202
203 template <typename FilterT = points::NullFilter>
204 FloatGrid::Ptr
205 rasterizeDensity(const openvdb::Name& attribute, RasterMode mode=RasterMode::MAXIMUM,
206 bool reduceMemory = false, float scale = 1.0f, const FilterT& filter = FilterT());
207
208 template <typename FilterT = points::NullFilter>
209 GridBase::Ptr
210 rasterizeAttribute(const Name& attribute, RasterMode mode=RasterMode::ACCUMULATE,
211 bool reduceMemory = false, float scale = 1.0f, const FilterT& filter = FilterT());
212
213 template <typename GridT, typename AttributeT, typename FilterT = points::NullFilter>
214 typename GridT::Ptr
215 rasterizeAttribute(const Name& attribute, RasterMode mode=RasterMode::ACCUMULATE,
216 bool reduceMemory = false, float scale = 1.0f, const FilterT& filter = FilterT());
217
218 template <typename GridT, typename FilterT = points::NullFilter>
219 typename GridT::Ptr
220 rasterizeMask(bool reduceMemory = false, const FilterT& filter = FilterT());
221
222private:
223 template <typename AttributeT, typename GridT, typename FilterT>
224 void
225 performRasterization(
226 GridT& grid, RasterMode mode, const openvdb::Name& attribute,
227 bool reduceMemory, float scale, const FilterT& filter);
228
229private:
230 FrustumRasterizerSettings mSettings;
231 FrustumRasterizerMask mMask;
232
233 util::NullInterrupter* mInterrupter;
234 std::vector<GridToRasterize> mPointGrids;
235}; // class FrustumRasterizer
236
237
238/// @brief A struct that stores all include/exclude attribute names as strings
239/// and is internally converted into the resolved MultiGroupFilter
240 struct RasterGroups
241{
242 std::vector<Name> includeNames;
243 std::vector<Name> excludeNames;
244}; // class RasterGroups
245
246
247} // namespace points
248} // namespace OPENVDB_VERSION_NAME
249} // namespace openvdb
250
251#include "impl/PointRasterizeFrustumImpl.h"
252
253#endif // OPENVDB_POINTS_POINT_RASTERIZE_FRUSTUM_HAS_BEEN_INCLUDED
DDA.h
Digital Differential Analyzers specialized for VDB.
GridTransformer.h
Interpolation.h
NullInterrupter.h
PointCount.h
Methods for counting points in VDB Point grids.
PointDataGrid.h
Attribute-owned data structure for points. Point attributes are stored in leaf nodes and ordered by v...
PointRasterizeFrustumImpl.h
openvdb::v10_0::GridBase::Ptr
SharedPtr< GridBase > Ptr
Definition Grid.h:80
openvdb::v10_0::Grid
Container class that associates a tree with a transform and metadata.
Definition Grid.h:571
openvdb::v10_0::Grid::Ptr
SharedPtr< Grid > Ptr
Definition Grid.h:573
openvdb::v10_0::math::BBox< Vec3d >
openvdb::v10_0::math::CoordBBox
Axis-aligned bounding box of signed integer coordinates.
Definition Coord.h:249
openvdb::v10_0::math::Coord
Signed (x, y, z) 32-bit integer coordinates.
Definition Coord.h:25
openvdb::v10_0::math::Transform
Definition Transform.h:40
openvdb::v10_0::math::Transform::Ptr
SharedPtr< Transform > Ptr
Definition Transform.h:42
openvdb::v10_0::points::FrustumRasterizer
Efficient rasterization of one or more VDB Points grids into a linear or frustum volume with the opti...
Definition PointRasterizeFrustum.h:164
openvdb::v10_0::points::FrustumRasterizer::GridConstPtr
typename PointDataGridT::ConstPtr GridConstPtr
Definition PointRasterizeFrustum.h:167
openvdb::v10_0::points::FrustumRasterizer::GridPtr
typename PointDataGridT::Ptr GridPtr
Definition PointRasterizeFrustum.h:166
openvdb::v10_0::points::RasterCamera
A camera class that provides an interface for camera motion blur when rasterizing.
Definition PointRasterizeFrustum.h:39
openvdb::v10_0::points::point_rasterize_internal::GridToRasterize
Definition PointRasterizeFrustum.h:142
openvdb::v10_0::tree::Tree::ConstPtr
SharedPtr< const Tree > ConstPtr
Definition Tree.h:181
openvdb::v10_0::tree::ValueAccessor
Definition ValueAccessor.h:191
openvdb::v10_0::points::RasterMode
RasterMode
How to composite points into a volume.
Definition PointRasterizeFrustum.h:30
openvdb::v10_0::points::RasterMode::MAXIMUM
@ MAXIMUM
openvdb::v10_0::points::RasterMode::AVERAGE
@ AVERAGE
openvdb::v10_0::points::RasterMode::ACCUMULATE
@ ACCUMULATE
openvdb::v10_0::Name
std::string Name
Definition Name.h:17
openvdb::v10_0::Index
Index32 Index
Definition Types.h:54
openvdb
Definition Exceptions.h:13
Ray.h
A Ray class.
openvdb::v10_0::points::FrustumRasterizerMask
Definition PointRasterizeFrustum.h:112
openvdb::v10_0::points::FrustumRasterizerMask::FrustumRasterizerMask
FrustumRasterizerMask()=default
openvdb::v10_0::points::FrustumRasterizerSettings
A group of shared settings to be used in the Volume Rasterizer.
Definition PointRasterizeFrustum.h:87
openvdb::v10_0::points::FrustumRasterizerSettings::FrustumRasterizerSettings
FrustumRasterizerSettings()=delete
openvdb::v10_0::points::FrustumRasterizerSettings::transform
math::Transform::Ptr transform
Definition PointRasterizeFrustum.h:94
openvdb::v10_0::points::FrustumRasterizerSettings::camera
RasterCamera camera
Definition PointRasterizeFrustum.h:95
openvdb::v10_0::points::FrustumRasterizerSettings::FrustumRasterizerSettings
FrustumRasterizerSettings(const math::Transform &_transform)
Definition PointRasterizeFrustum.h:90
openvdb::v10_0::points::RasterGroups
A struct that stores all include/exclude attribute names as strings and is internally converted into ...
Definition PointRasterizeFrustum.h:241
openvdb::v10_0::points::RasterGroups::excludeNames
std::vector< Name > excludeNames
Definition PointRasterizeFrustum.h:243
openvdb::v10_0::points::RasterGroups::includeNames
std::vector< Name > includeNames
Definition PointRasterizeFrustum.h:242
openvdb::v10_0::util::NullInterrupter
Base class for interrupters.
Definition NullInterrupter.h:26
OPENVDB_VERSION_NAME
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
OPENVDB_USE_VERSION_NAMESPACE
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:212