39 #ifndef OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED
40 #define OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED
42 #include <openvdb/openvdb.h>
43 #include <openvdb/util/NullInterrupter.h>
44 #include <boost/utility.hpp>
45 #include <boost/type_traits/is_floating_point.hpp>
66 template<
typename Gr
idType,
typename InterruptT>
67 typename GridType::Ptr
83 template<
typename Gr
idType>
84 typename GridType::Ptr
88 return createLevelSetSphere<GridType, util::NullInterrupter>(radius,center,voxelSize,halfWidth);
100 template<
typename Gr
idT,
typename InterruptT = util::NullInterrupter>
104 typedef typename GridT::ValueType
ValueT;
106 BOOST_STATIC_ASSERT(boost::is_floating_point<ValueT>::value);
119 : mRadius(radius), mCenter(center), mInterrupt(interrupt)
130 mGrid = createLevelSet<GridT>(voxelSize, halfWidth);
131 this->rasterSphere(voxelSize, halfWidth);
139 void rasterSphere(ValueT dx, ValueT w)
145 const ValueT r0 = mRadius/dx, rmax = r0 + w;
148 if (r0 < 1.5f)
return;
151 const Vec3T c(mCenter[0]/dx, mCenter[1]/dx, mCenter[2]/dx);
155 int &i = ijk[0], &j = ijk[1], &k = ijk[2], m=1;
161 typename GridT::Accessor accessor = mGrid->getAccessor();
163 if (mInterrupt) mInterrupt->start(
"Generating level set of sphere");
165 for ( i = imin; i <= imax; ++i ) {
168 for ( j = jmin; j <= jmax; ++j ) {
170 for (k=kmin; k<=kmax; k += m) {
176 accessor.setValue(ijk, dx*v);
184 mGrid->signedFloodFill();
185 if (mInterrupt) mInterrupt->end();
188 const ValueT mRadius;
190 InterruptT* mInterrupt;
191 typename GridT::Ptr mGrid;
197 template<
typename Gr
idType,
typename InterruptT>
198 typename GridType::Ptr
200 float halfWidth, InterruptT* interrupt)
203 BOOST_STATIC_ASSERT(boost::is_floating_point<typename GridType::ValueType>::value);
205 typedef typename GridType::ValueType ValueT;
207 return factory.
getLevelSet(ValueT(voxelSize), ValueT(halfWidth));
228 template<
typename InterruptT>
230 float voxelSize,
float halfWidth, InterruptT* interrupt)
240 #endif // OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED