| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright Contributors to the OpenVDB Project | ||
| 2 | // SPDX-License-Identifier: MPL-2.0 | ||
| 3 | |||
| 4 | /// @author Dan Bailey | ||
| 5 | /// | ||
| 6 | /// @file points/PointAdvect.h | ||
| 7 | /// | ||
| 8 | /// @brief Ability to advect VDB Points through a velocity field. | ||
| 9 | |||
| 10 | #ifndef OPENVDB_POINTS_POINT_ADVECT_HAS_BEEN_INCLUDED | ||
| 11 | #define OPENVDB_POINTS_POINT_ADVECT_HAS_BEEN_INCLUDED | ||
| 12 | |||
| 13 | #include <openvdb/openvdb.h> | ||
| 14 | #include <openvdb/tools/Prune.h> | ||
| 15 | #include <openvdb/tools/VelocityFields.h> | ||
| 16 | |||
| 17 | #include <openvdb/points/AttributeGroup.h> | ||
| 18 | #include <openvdb/points/PointDataGrid.h> | ||
| 19 | #include <openvdb/points/PointGroup.h> | ||
| 20 | #include <openvdb/points/PointMove.h> | ||
| 21 | |||
| 22 | #include <memory> | ||
| 23 | |||
| 24 | |||
| 25 | namespace openvdb { | ||
| 26 | OPENVDB_USE_VERSION_NAMESPACE | ||
| 27 | namespace OPENVDB_VERSION_NAME { | ||
| 28 | namespace points { | ||
| 29 | |||
| 30 | |||
| 31 | /// @brief Advect points in a PointDataGrid through a velocity grid | ||
| 32 | /// @param points the PointDataGrid containing the points to be advected. | ||
| 33 | /// @param velocity a velocity grid to be sampled. | ||
| 34 | /// @param integrationOrder the integration scheme to use (1 is forward euler, 4 is runge-kutta 4th) | ||
| 35 | /// @param dt delta time. | ||
| 36 | /// @param timeSteps number of advection steps to perform. | ||
| 37 | /// @param advectFilter an optional advection index filter (moves a subset of the points) | ||
| 38 | /// @param filter an optional index filter (deletes a subset of the points) | ||
| 39 | /// @param cached caches velocity interpolation for faster performance, disable to use | ||
| 40 | /// less memory (default is on). | ||
| 41 | template <typename PointDataGridT, typename VelGridT, | ||
| 42 | typename AdvectFilterT = NullFilter, typename FilterT = NullFilter> | ||
| 43 | inline void advectPoints(PointDataGridT& points, const VelGridT& velocity, | ||
| 44 | const Index integrationOrder, const double dt, const Index timeSteps, | ||
| 45 | const AdvectFilterT& advectFilter = NullFilter(), | ||
| 46 | const FilterT& filter = NullFilter(), | ||
| 47 | const bool cached = true); | ||
| 48 | |||
| 49 | |||
| 50 | //////////////////////////////////////// | ||
| 51 | |||
| 52 | /// @cond OPENVDB_DOCS_INTERNAL | ||
| 53 | |||
| 54 | namespace point_advect_internal { | ||
| 55 | |||
| 56 | enum IntegrationOrder { | ||
| 57 | INTEGRATION_ORDER_FWD_EULER = 1, | ||
| 58 | INTEGRATION_ORDER_RK_2ND, | ||
| 59 | INTEGRATION_ORDER_RK_3RD, | ||
| 60 | INTEGRATION_ORDER_RK_4TH | ||
| 61 | }; | ||
| 62 | |||
| 63 | template <typename VelGridT, Index IntegrationOrder, bool Staggered, typename FilterT> | ||
| 64 |
7/96✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✓ Branch 98 taken 3 times.
✗ Branch 99 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✓ Branch 130 taken 9 times.
✗ Branch 131 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✓ Branch 162 taken 2303 times.
✗ Branch 163 not taken.
✓ Branch 166 taken 3 times.
✗ Branch 167 not taken.
✓ Branch 170 taken 3 times.
✗ Branch 171 not taken.
✓ Branch 174 taken 3 times.
✗ Branch 175 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
|
2327 | class AdvectionDeformer |
| 65 | { | ||
| 66 | public: | ||
| 67 | using IntegratorT = openvdb::tools::VelocityIntegrator<VelGridT, Staggered>; | ||
| 68 | |||
| 69 | 13 | AdvectionDeformer(const VelGridT& velocityGrid, const double timeStep, const int steps, | |
| 70 | const FilterT& filter) | ||
| 71 | : mIntegrator(velocityGrid) | ||
| 72 | , mTimeStep(timeStep) | ||
| 73 | , mSteps(steps) | ||
| 74 |
4/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
9 | , mFilter(filter) { } |
| 75 | |||
| 76 | template <typename LeafT> | ||
| 77 | void reset(const LeafT& leaf, size_t /*idx*/) | ||
| 78 | { | ||
| 79 |
2/64✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
|
6 | mFilter.reset(leaf); |
| 80 | 6 | } | |
| 81 | |||
| 82 | template <typename IndexIterT> | ||
| 83 | 12 | void apply(Vec3d& position, const IndexIterT& iter) const | |
| 84 | { | ||
| 85 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 2 taken 4 times.
|
12 | if (mFilter.valid(iter)) { |
| 86 |
16/96✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 4 times.
✓ Branch 49 taken 4 times.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✓ Branch 65 taken 3 times.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✓ Branch 80 taken 19135764 times.
✓ Branch 81 taken 3827080 times.
✓ Branch 82 taken 4 times.
✓ Branch 83 taken 4 times.
✓ Branch 84 taken 4 times.
✓ Branch 85 taken 4 times.
✓ Branch 86 taken 4 times.
✓ Branch 87 taken 4 times.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
|
22962898 | for (int n = 0; n < mSteps; ++n) { |
| 87 | 19135791 | mIntegrator.template rungeKutta<IntegrationOrder, openvdb::Vec3d>( | |
| 88 |
7/96✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✓ Branch 73 taken 4 times.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✓ Branch 97 taken 3 times.
✗ Branch 98 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✓ Branch 121 taken 19135764 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 4 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 4 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 4 times.
✗ Branch 131 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
|
19135791 | static_cast<typename IntegratorT::ElementType>(mTimeStep), position); |
| 89 | } | ||
| 90 | } | ||
| 91 | } | ||
| 92 | |||
| 93 | private: | ||
| 94 | IntegratorT mIntegrator; | ||
| 95 | double mTimeStep; | ||
| 96 | const int mSteps; | ||
| 97 | FilterT mFilter; | ||
| 98 | }; // class AdvectionDeformer | ||
| 99 | |||
| 100 | |||
| 101 | template <typename PointDataGridT, typename VelGridT, typename AdvectFilterT, typename FilterT> | ||
| 102 | struct AdvectionOp | ||
| 103 | { | ||
| 104 | using CachedDeformerT = CachedDeformer<double>; | ||
| 105 | |||
| 106 | 13 | AdvectionOp(PointDataGridT& points, const VelGridT& velocity, | |
| 107 | const Index integrationOrder, const double timeStep, const Index steps, | ||
| 108 | const AdvectFilterT& advectFilter, | ||
| 109 | const FilterT& filter) | ||
| 110 | : mPoints(points) | ||
| 111 | , mVelocity(velocity) | ||
| 112 | , mIntegrationOrder(integrationOrder) | ||
| 113 | , mTimeStep(timeStep) | ||
| 114 | , mSteps(steps) | ||
| 115 | , mAdvectFilter(advectFilter) | ||
| 116 |
3/4✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
13 | , mFilter(filter) { } |
| 117 | |||
| 118 | 22 | void cache() | |
| 119 | { | ||
| 120 | 22 | mCachedDeformer.reset(new CachedDeformerT(mCache)); | |
| 121 | 22 | (*this)(true); | |
| 122 | 22 | } | |
| 123 | |||
| 124 | void advect() | ||
| 125 | { | ||
| 126 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
13 | (*this)(false); |
| 127 | 13 | } | |
| 128 | |||
| 129 | private: | ||
| 130 | template <int IntegrationOrder, bool Staggered> | ||
| 131 | 44 | void resolveIntegrationOrder(bool buildCache) | |
| 132 | { | ||
| 133 | 44 | const auto leaf = mPoints.constTree().cbeginLeaf(); | |
| 134 |
1/2✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
|
64 | if (!leaf) return; |
| 135 | |||
| 136 | // move points according to the pre-computed cache | ||
| 137 |
4/4✓ Branch 0 taken 12 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 2 times.
|
44 | if (!buildCache && mCachedDeformer) { |
| 138 | 20 | movePoints(mPoints, *mCachedDeformer, mFilter); | |
| 139 | 20 | return; | |
| 140 | } | ||
| 141 | |||
| 142 | NullFilter nullFilter; | ||
| 143 | |||
| 144 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 times.
|
24 | if (buildCache) { |
| 145 | // disable group filtering from the advection deformer and perform group filtering | ||
| 146 | // in the cache deformer instead, this restricts the cache to just containing | ||
| 147 | // positions from points which are both deforming *and* are not being deleted | ||
| 148 | 20 | AdvectionDeformer<VelGridT, IntegrationOrder, Staggered, NullFilter> deformer( | |
| 149 | 20 | mVelocity, mTimeStep, mSteps, nullFilter); | |
| 150 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
|
8 | if (mFilter.state() == index::ALL && mAdvectFilter.state() == index::ALL) { |
| 151 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
14 | mCachedDeformer->evaluate(mPoints, deformer, nullFilter); |
| 152 | } else { | ||
| 153 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
6 | BinaryFilter<AdvectFilterT, FilterT, /*And=*/true> binaryFilter( |
| 154 | mAdvectFilter, mFilter); | ||
| 155 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
6 | mCachedDeformer->evaluate(mPoints, deformer, binaryFilter); |
| 156 | } | ||
| 157 | } | ||
| 158 | else { | ||
| 159 | // revert to NullFilter if all points are being evaluated | ||
| 160 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
4 | if (mAdvectFilter.state() == index::ALL) { |
| 161 | 2 | AdvectionDeformer<VelGridT, IntegrationOrder, Staggered, NullFilter> deformer( | |
| 162 | 2 | mVelocity, mTimeStep, mSteps, nullFilter); | |
| 163 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | movePoints(mPoints, deformer, mFilter); |
| 164 | } | ||
| 165 | else { | ||
| 166 | 2 | AdvectionDeformer<VelGridT, IntegrationOrder, Staggered, AdvectFilterT> deformer( | |
| 167 | 2 | mVelocity, mTimeStep, mSteps, mAdvectFilter); | |
| 168 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | movePoints(mPoints, deformer, mFilter); |
| 169 | } | ||
| 170 | } | ||
| 171 | } | ||
| 172 | |||
| 173 | template <bool Staggered> | ||
| 174 | 48 | void resolveStaggered(bool buildCache) | |
| 175 | { | ||
| 176 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 22 times.
|
48 | if (mIntegrationOrder == INTEGRATION_ORDER_FWD_EULER) { |
| 177 | 4 | resolveIntegrationOrder<1, Staggered>(buildCache); | |
| 178 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 20 times.
|
44 | } else if (mIntegrationOrder == INTEGRATION_ORDER_RK_2ND) { |
| 179 | 4 | resolveIntegrationOrder<2, Staggered>(buildCache); | |
| 180 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 18 times.
|
40 | } else if (mIntegrationOrder == INTEGRATION_ORDER_RK_3RD) { |
| 181 | 4 | resolveIntegrationOrder<3, Staggered>(buildCache); | |
| 182 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
|
36 | } else if (mIntegrationOrder == INTEGRATION_ORDER_RK_4TH) { |
| 183 | 32 | resolveIntegrationOrder<4, Staggered>(buildCache); | |
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 | 48 | void operator()(bool buildCache) | |
| 188 | { | ||
| 189 | // early-exit if no leafs | ||
| 190 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
48 | if (mPoints.constTree().leafCount() == 0) return; |
| 191 | |||
| 192 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 24 times.
|
48 | if (mVelocity.getGridClass() == openvdb::GRID_STAGGERED) { |
| 193 | ✗ | resolveStaggered<true>(buildCache); | |
| 194 | } else { | ||
| 195 | 48 | resolveStaggered<false>(buildCache); | |
| 196 | } | ||
| 197 | } | ||
| 198 | |||
| 199 | PointDataGridT& mPoints; | ||
| 200 | const VelGridT& mVelocity; | ||
| 201 | const Index mIntegrationOrder; | ||
| 202 | const double mTimeStep; | ||
| 203 | const Index mSteps; | ||
| 204 | const AdvectFilterT& mAdvectFilter; | ||
| 205 | const FilterT& mFilter; | ||
| 206 | CachedDeformerT::Cache mCache; | ||
| 207 | std::unique_ptr<CachedDeformerT> mCachedDeformer; | ||
| 208 | }; // struct AdvectionOp | ||
| 209 | |||
| 210 | } // namespace point_advect_internal | ||
| 211 | |||
| 212 | /// @endcond | ||
| 213 | |||
| 214 | //////////////////////////////////////// | ||
| 215 | |||
| 216 | |||
| 217 | template <typename PointDataGridT, typename VelGridT, typename AdvectFilterT, typename FilterT> | ||
| 218 | 14 | inline void advectPoints(PointDataGridT& points, const VelGridT& velocity, | |
| 219 | const Index integrationOrder, const double timeStep, const Index steps, | ||
| 220 | const AdvectFilterT& advectFilter, | ||
| 221 | const FilterT& filter, | ||
| 222 | const bool cached) | ||
| 223 | { | ||
| 224 | using namespace point_advect_internal; | ||
| 225 | |||
| 226 | 14 | if (steps == 0) return; | |
| 227 | |||
| 228 | 14 | if (integrationOrder > 4) { | |
| 229 | 2 | throw ValueError{"Unknown integration order for advecting points."}; | |
| 230 | } | ||
| 231 | |||
| 232 | 13 | AdvectionOp<PointDataGridT, VelGridT, AdvectFilterT, FilterT> op( | |
| 233 | points, velocity, integrationOrder, timeStep, steps, | ||
| 234 | advectFilter, filter); | ||
| 235 | |||
| 236 | // if caching is enabled, sample the velocity field using a CachedDeformer to store the | ||
| 237 | // intermediate positions before moving the points, this uses more memory but typically | ||
| 238 | // results in faster overall performance | ||
| 239 | 13 | if (cached) op.cache(); | |
| 240 | |||
| 241 | // advect the points | ||
| 242 | op.advect(); | ||
| 243 | } | ||
| 244 | |||
| 245 | } // namespace points | ||
| 246 | } // namespace OPENVDB_VERSION_NAME | ||
| 247 | } // namespace openvdb | ||
| 248 | |||
| 249 | #endif // OPENVDB_POINTS_POINT_ADVECT_HAS_BEEN_INCLUDED | ||
| 250 |