39 #ifndef OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED
40 #define OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED
42 #include <openvdb/Grid.h>
43 #include <openvdb/Types.h>
44 #include <openvdb/math/Math.h>
45 #include <openvdb/util/NullInterrupter.h>
47 #include <type_traits>
68 template<
typename Gr
idType,
typename InterruptT>
69 typename GridType::Ptr
85 template<
typename Gr
idType>
86 typename GridType::Ptr
90 return createLevelSetSphere<GridType, util::NullInterrupter>(radius,center,voxelSize,halfWidth);
103 template<
typename Gr
idT,
typename InterruptT = util::NullInterrupter>
107 using ValueT =
typename GridT::ValueType;
109 static_assert(std::is_floating_point<ValueT>::value,
110 "level set grids must have scalar, floating-point value types");
123 : mRadius(radius), mCenter(center), mInterrupt(interrupt)
134 mGrid = createLevelSet<GridT>(voxelSize, halfWidth);
135 this->rasterSphere(voxelSize, halfWidth);
141 void rasterSphere(ValueT dx, ValueT w)
147 const ValueT r0 = mRadius/dx, rmax = r0 + w;
150 if (r0 < 1.5f)
return;
153 const Vec3T c(mCenter[0]/dx, mCenter[1]/dx, mCenter[2]/dx);
157 int &i = ijk[0], &j = ijk[1], &k = ijk[2], m=1;
163 typename GridT::Accessor accessor = mGrid->getAccessor();
165 if (mInterrupt) mInterrupt->start(
"Generating level set of sphere");
167 for (i = imin; i <= imax; ++i) {
170 for (j = jmin; j <= jmax; ++j) {
172 for (k = kmin; k <= kmax; k += m) {
178 accessor.setValue(ijk, dx*v);
189 if (mInterrupt) mInterrupt->end();
192 const ValueT mRadius;
194 InterruptT* mInterrupt;
195 typename GridT::Ptr mGrid;
202 template<
typename Gr
idType,
typename InterruptT>
203 typename GridType::Ptr
205 float halfWidth, InterruptT* interrupt)
208 static_assert(std::is_floating_point<typename GridType::ValueType>::value,
209 "level set grids must have scalar, floating-point value types");
211 using ValueT =
typename GridType::ValueType;
213 return factory.
getLevelSet(ValueT(voxelSize), ValueT(halfWidth));
220 #endif // OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED