16 #ifndef VHACD_VOLUME_H 17 #define VHACD_VOLUME_H 24 #pragma warning(disable:4456 4701) 46 virtual const size_t GetNPrimitives()
const = 0;
47 virtual const size_t GetNPrimitivesOnSurf()
const = 0;
48 virtual const size_t GetNPrimitivesInsideSurf()
const = 0;
49 virtual const double GetEigenValue(
AXIS axis)
const = 0;
50 virtual const double ComputeMaxVolumeError()
const = 0;
51 virtual const double ComputeVolume()
const = 0;
56 virtual void ComputeExteriorPoints(
const Plane& plane,
const Mesh& mesh,
58 virtual void ComputeClippedVolumes(
const Plane& plane,
double& positiveVolume,
59 double& negativeVolume)
const = 0;
60 virtual void SelectOnSurface(
PrimitiveSet*
const onSurfP)
const = 0;
61 virtual void ComputeConvexHull(
Mesh& meshCH,
const size_t sampling = 1)
const = 0;
62 virtual void ComputeBB() = 0;
63 virtual void ComputePrincipalAxes() = 0;
64 virtual void AlignToPrincipalAxes() = 0;
65 virtual void RevertAlignToPrincipalAxes() = 0;
87 const double ComputeVolume()
const {
return m_unitVolume * m_voxels.Size(); }
92 const double&
GetScale()
const {
return m_scale; }
97 voxel[1] * m_scale + m_minBB[1],
98 voxel[2] * m_scale + m_minBB[2]);
103 voxel.
m_coord[1] * m_scale + m_minBB[1],
104 voxel.
m_coord[2] * m_scale + m_minBB[2]);
109 voxel[1] * m_scale + m_minBB[1],
110 voxel[2] * m_scale + m_minBB[2]);
113 void ComputeConvexHull(
Mesh& meshCH,
const size_t sampling = 1)
const;
117 void ComputeExteriorPoints(
const Plane& plane,
const Mesh& mesh,
119 void ComputeClippedVolumes(
const Plane& plane,
double& positiveVolume,
double& negativeVolume)
const;
120 void SelectOnSurface(
PrimitiveSet*
const onSurfP)
const;
123 void ComputePrincipalAxes();
134 size_t m_numVoxelsOnSurface;
135 size_t m_numVoxelsInsideSurface;
174 const double ComputeVolume()
const;
175 const double ComputeMaxVolumeError()
const;
176 void ComputeConvexHull(
Mesh& meshCH,
const size_t sampling = 1)
const;
177 void ComputePrincipalAxes();
178 void AlignToPrincipalAxes();
179 void RevertAlignToPrincipalAxes();
183 void ComputeExteriorPoints(
const Plane& plane,
const Mesh& mesh,
185 void ComputeClippedVolumes(
const Plane& plane,
double& positiveVolume,
double& negativeVolume)
const;
186 void SelectOnSurface(
PrimitiveSet*
const onSurfP)
const;
197 void AddClippedTetrahedra(
const Vec3<double> (&pts)[10],
const int32_t nPts);
199 size_t m_numTetrahedraOnSurface;
200 size_t m_numTetrahedraInsideSurface;
221 void Voxelize(
const T*
const points,
const uint32_t stridePoints,
const uint32_t nPoints,
222 const int32_t*
const triangles,
const uint32_t strideTriangles,
const uint32_t nTriangles,
223 const size_t dim,
const Vec3<double>& barycenter,
const double (&rot)[3][3]);
224 unsigned char&
GetVoxel(
const size_t i,
const size_t j,
const size_t k)
226 assert(i < m_dim[0] || i >= 0);
227 assert(j < m_dim[0] || j >= 0);
228 assert(k < m_dim[0] || k >= 0);
229 return m_data[i + j * m_dim[0] + k * m_dim[0] * m_dim[1]];
231 const unsigned char&
GetVoxel(
const size_t i,
const size_t j,
const size_t k)
const 233 assert(i < m_dim[0] || i >= 0);
234 assert(j < m_dim[0] || j >= 0);
235 assert(k < m_dim[0] || k >= 0);
236 return m_data[i + j * m_dim[0] + k * m_dim[0] * m_dim[1]];
243 void AlignToPrincipalAxes(
double (&rot)[3][3])
const;
246 void FillOutsideSurface(
const size_t i0,
const size_t j0,
const size_t k0,
const size_t i1,
247 const size_t j1,
const size_t k1);
248 void FillInsideSurface();
250 void ComputeBB(
const T*
const points,
const uint32_t stridePoints,
const uint32_t nPoints,
251 const Vec3<double>& barycenter,
const double (&rot)[3][3]);
259 size_t m_numVoxelsOnSurface;
260 size_t m_numVoxelsInsideSurface;
261 size_t m_numVoxelsOutsideSurface;
272 double x = points[idx + 0] - barycenter[0];
273 double y = points[idx + 1] - barycenter[1];
274 double z = points[idx + 2] - barycenter[2];
275 pt[0] = rot[0][0] * x + rot[1][0] * y + rot[2][0] *
z;
276 pt[1] = rot[0][1] * x + rot[1][1] * y + rot[2][1] *
z;
277 pt[2] = rot[0][2] * x + rot[1][2] * y + rot[2][2] *
z;
282 double x = points[idx + 0] - barycenter[0];
283 double y = points[idx + 1] - barycenter[1];
284 double z = points[idx + 2] - barycenter[2];
285 pt[0] = rot[0][0] * x + rot[1][0] * y + rot[2][0] *
z;
286 pt[1] = rot[0][1] * x + rot[1][1] * y + rot[2][1] *
z;
287 pt[2] = rot[0][2] * x + rot[1][2] * y + rot[2][2] *
z;
290 void Volume::ComputeBB(
const T*
const points,
const uint32_t stridePoints,
const uint32_t nPoints,
291 const Vec3<double>& barycenter,
const double (&rot)[3][3])
297 for (uint32_t v = 1; v < nPoints; ++v) {
299 for (int32_t i = 0; i < 3; ++i) {
300 if (pt[i] < m_minBB[i])
302 else if (pt[i] > m_maxBB[i])
308 void Volume::Voxelize(
const T*
const points,
const uint32_t stridePoints,
const uint32_t nPoints,
309 const int32_t*
const triangles,
const uint32_t strideTriangles,
const uint32_t nTriangles,
310 const size_t dim,
const Vec3<double>& barycenter,
const double (&rot)[3][3])
315 ComputeBB(points, stridePoints, nPoints, barycenter, rot);
317 double d[3] = { m_maxBB[0] - m_minBB[0], m_maxBB[1] - m_minBB[1], m_maxBB[2] - m_minBB[2] };
319 if (d[0] > d[1] && d[0] > d[2]) {
322 m_dim[1] = 2 +
static_cast<size_t>(dim * d[1] / d[0]);
323 m_dim[2] = 2 +
static_cast<size_t>(dim * d[2] / d[0]);
325 else if (d[1] > d[0] && d[1] > d[2]) {
328 m_dim[0] = 2 +
static_cast<size_t>(dim * d[0] / d[1]);
329 m_dim[2] = 2 +
static_cast<size_t>(dim * d[2] / d[1]);
334 m_dim[0] = 2 +
static_cast<size_t>(dim * d[0] / d[2]);
335 m_dim[1] = 2 +
static_cast<size_t>(dim * d[1] / d[2]);
338 m_scale = r / (dim - 1);
339 double invScale = (dim - 1) / r;
342 m_numVoxelsOnSurface = 0;
343 m_numVoxelsInsideSurface = 0;
344 m_numVoxelsOutsideSurface = 0;
353 for (
size_t t = 0, ti = 0; t < nTriangles; ++t, ti += strideTriangles) {
357 for (int32_t c = 0; c < 3; ++c) {
359 p[c][0] = (pt[0] - m_minBB[0]) * invScale;
360 p[c][1] = (pt[1] - m_minBB[1]) * invScale;
361 p[c][2] = (pt[2] - m_minBB[2]) * invScale;
362 i =
static_cast<size_t>(p[c][0] + 0.5);
363 j =
static_cast<size_t>(p[c][1] + 0.5);
364 k =
static_cast<size_t>(p[c][2] + 0.5);
365 assert(i < m_dim[0] && i >= 0 && j < m_dim[1] && j >= 0 && k < m_dim[2] && k >= 0);
399 for (
size_t i = i0; i < i1; ++i) {
400 boxcenter[0] = (double)i;
401 for (
size_t j = j0; j < j1; ++j) {
402 boxcenter[1] = (double)j;
403 for (
size_t k = k0; k < k1; ++k) {
404 boxcenter[2] = (double)k;
405 int32_t res =
TriBoxOverlap(boxcenter, boxhalfsize, p[0], p[1], p[2]);
406 unsigned char& value = GetVoxel(i, j, k);
409 ++m_numVoxelsOnSurface;
415 FillOutsideSurface(0, 0, 0, m_dim[0], m_dim[1], 1);
416 FillOutsideSurface(0, 0, m_dim[2] - 1, m_dim[0], m_dim[1], m_dim[2]);
417 FillOutsideSurface(0, 0, 0, m_dim[0], 1, m_dim[2]);
418 FillOutsideSurface(0, m_dim[1] - 1, 0, m_dim[0], m_dim[1], m_dim[2]);
419 FillOutsideSurface(0, 0, 0, 1, m_dim[1], m_dim[2]);
420 FillOutsideSurface(m_dim[0] - 1, 0, 0, m_dim[0], m_dim[1], m_dim[2]);
430 #endif // VHACD_VOLUME_H void RevertAlignToPrincipalAxes()
Definition: vhacdVolume.h:129
Definition: vhacdVolume.h:33
Vec3< double > GetPoint(Vec3< short > voxel) const
Definition: vhacdVolume.h:94
Vec3< double > GetPoint(const Voxel &voxel) const
Definition: vhacdVolume.h:100
Vec3< double > GetPoint(Vec3< double > voxel) const
Definition: vhacdVolume.h:106
const size_t GetNPrimitivesInsideSurf() const
Definition: vhacdVolume.h:239
const Vec3< double > & GetMinBB() const
Definition: vhacdVolume.h:169
const double ComputeMaxVolumeError() const
Definition: vhacdVolume.h:88
const double ComputeVolume() const
Definition: vhacdVolume.h:87
void AlignToPrincipalAxes()
Definition: vhacdVolume.h:128
const size_t GetNPrimitivesInsideSurf() const
Definition: vhacdVolume.h:168
const double GetEigenValue(AXIS axis) const
Definition: vhacdVolume.h:172
SIMD_FORCE_INLINE const btScalar & x() const
Return the x value.
Definition: btVector3.h:275
Voxel *const GetVoxels()
Definition: vhacdVolume.h:130
int32_t TriBoxOverlap(const Vec3< double > &boxcenter, const Vec3< double > &boxhalfsize, const Vec3< double > &triver0, const Vec3< double > &triver1, const Vec3< double > &triver2)
Definition: vhacdVolume.h:32
PrimitiveSet * Create() const
Definition: vhacdVolume.h:124
const unsigned char & GetVoxel(const size_t i, const size_t j, const size_t k) const
Definition: vhacdVolume.h:231
Definition: vhacdMesh.h:29
const Vec3< double > & GetMaxBB() const
Definition: vhacdVolume.h:170
const double & GetUnitVolume() const
Definition: vhacdVolume.h:93
const size_t GetNPrimitives() const
Definition: vhacdVolume.h:83
void ComputeAlignedPoint(const T *const points, const uint32_t idx, const Vec3< double > &barycenter, const double(&rot)[3][3], Vec3< double > &pt)
Definition: vhacdVolume.h:267
SArray.
Definition: vhacdSArray.h:27
Definition: vhacdVolume.h:30
unsigned char m_data
Definition: vhacdVolume.h:153
Definition: vhacdVolume.h:150
short m_coord[3]
Definition: vhacdVolume.h:38
virtual ~PrimitiveSet()
Definition: vhacdVolume.h:44
void ComputeAlignedPoint< double >(const double *const points, const uint32_t idx, const Vec3< double > &barycenter, const double(&rot)[3][3], Vec3< double > &pt)
Definition: vhacdVolume.h:280
short m_data
Definition: vhacdVolume.h:39
static const double EPS
Definition: vhacdVolume.h:194
Triangular mesh data structure.
Definition: vhacdMesh.h:65
const size_t GetNPrimitivesInsideSurf() const
Definition: vhacdVolume.h:85
SIMD_FORCE_INLINE const btScalar & y() const
Return the y value.
Definition: btVector3.h:277
const Vec3< short > & GetMaxBBVoxels() const
Definition: vhacdVolume.h:90
const double & GetScale() const
Definition: vhacdVolume.h:92
const size_t GetNPrimitivesOnSurf() const
Definition: vhacdVolume.h:238
const Vec3< double > & GetBarycenter() const
Definition: vhacdVolume.h:171
Mesh & GetConvexHull()
Definition: vhacdVolume.h:68
Definition: vhacdCircularList.h:19
const double GetSacle() const
Definition: vhacdVolume.h:173
Definition: vhacdVolume.h:74
Definition: vhacdVolume.h:42
Definition: vhacdVolume.h:157
PrimitiveSet * Create() const
Definition: vhacdVolume.h:190
Definition: vhacdVolume.h:31
const size_t GetNPrimitivesOnSurf() const
Definition: vhacdVolume.h:167
AXIS
Definition: vhacdMesh.h:24
Definition: vhacdVolume.h:211
VOXEL_VALUE
Definition: vhacdVolume.h:29
const size_t GetNPrimitives() const
Definition: vhacdVolume.h:166
const size_t GetNPrimitivesOnSurf() const
Definition: vhacdVolume.h:84
Definition: vhacdVolume.h:36
const Mesh & GetConvexHull() const
Definition: vhacdVolume.h:67
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition: btVector3.h:279
const Vec3< short > & GetMinBBVoxels() const
Definition: vhacdVolume.h:89
unsigned char & GetVoxel(const size_t i, const size_t j, const size_t k)
Definition: vhacdVolume.h:224
const Vec3< double > & GetMinBB() const
Definition: vhacdVolume.h:91
const double GetEigenValue(AXIS axis) const
Definition: vhacdVolume.h:86
void ComputeAlignedPoint< float >(const float *const points, const uint32_t idx, const Vec3< double > &barycenter, const double(&rot)[3][3], Vec3< double > &pt)
Definition: vhacdVolume.h:270
void Voxelize(const T *const points, const uint32_t stridePoints, const uint32_t nPoints, const int32_t *const triangles, const uint32_t strideTriangles, const uint32_t nTriangles, const size_t dim, const Vec3< double > &barycenter, const double(&rot)[3][3])
Voxelize.
Definition: vhacdVolume.h:308
const Voxel *const GetVoxels() const
Definition: vhacdVolume.h:131