21 #include <OpenCL/cl.h> 35 #define OCL_MIN_NUM_PRIMITIVES 4096 36 #define CH_APP_MIN_NUM_PRIMITIVES 64000 43 #if USE_THREAD == 1 && _OPENMP 44 m_ompNumProcessors = 2 * omp_get_num_procs();
45 omp_set_num_threads(m_ompNumProcessors);
46 #else //USE_THREAD == 1 && _OPENMP 47 m_ompNumProcessors = 1;
48 #endif //USE_THREAD == 1 && _OPENMP 50 m_oclWorkGroupSize = 0;
53 m_oclKernelComputePartialVolumes = 0;
54 m_oclKernelComputeSum = 0;
55 #endif //CL_VERSION_1_1 64 return (uint32_t)m_convexHulls.Size();
72 Mesh* mesh = m_convexHulls[index];
87 mRaycastMesh->release();
88 mRaycastMesh =
nullptr;
92 size_t nCH = m_convexHulls.Size();
93 for (
size_t p = 0; p < nCH; ++p) {
94 delete m_convexHulls[p];
96 m_convexHulls.Clear();
103 bool Compute(
const float*
const points,
104 const uint32_t nPoints,
105 const uint32_t*
const triangles,
106 const uint32_t nTriangles,
108 bool Compute(
const double*
const points,
109 const uint32_t nPoints,
110 const uint32_t*
const triangles,
111 const uint32_t nTriangles,
113 bool OCLInit(
void*
const oclDevice,
117 virtual bool ComputeCenterOfMass(
double centerOfMass[3])
const;
122 virtual uint32_t ComputeConstraints(
void);
126 virtual const Constraint *GetConstraint(uint32_t index)
const;
129 void SetCancel(
bool cancel)
131 m_cancelMutex.Lock();
133 m_cancelMutex.Unlock();
138 m_cancelMutex.Lock();
139 bool cancel = m_cancel;
140 m_cancelMutex.Unlock();
143 void Update(
const double stageProgress,
144 const double operationProgress,
147 m_stageProgress = stageProgress;
148 m_operationProgress = operationProgress;
154 m_operation.c_str());
161 mRaycastMesh->release();
162 mRaycastMesh =
nullptr;
164 memset(m_rot, 0,
sizeof(
double) * 9);
169 m_overallProgress = 0.0;
170 m_stageProgress = 0.0;
171 m_operationProgress = 0.0;
174 m_barycenter[0] = m_barycenter[1] = m_barycenter[2] = 0.0;
175 m_rot[0][0] = m_rot[1][1] = m_rot[2][2] = 1.0;
178 void ComputePrimitiveSet(
const Parameters& params);
180 void MergeConvexHulls(
const Parameters& params);
181 void SimplifyConvexHull(
Mesh*
const ch,
const size_t nvertices,
const double minVolume);
182 void SimplifyConvexHulls(
const Parameters& params);
183 void ComputeBestClippingPlane(
const PrimitiveSet* inputPSet,
190 const int32_t convexhullDownsampling,
191 const double progress0,
192 const double progress1,
194 double& minConcavity,
197 void AlignMesh(
const T*
const points,
198 const uint32_t stridePoints,
199 const uint32_t nPoints,
200 const int32_t*
const triangles,
201 const uint32_t strideTriangles,
202 const uint32_t nTriangles,
205 if (GetCancel() || !params.
m_pca) {
210 m_stage =
"Align mesh";
211 m_operation =
"Voxelization";
213 std::ostringstream msg;
215 msg <<
"+ " << m_stage << std::endl;
219 Update(0.0, 0.0, params);
223 m_dim = (size_t)(pow((
double)params.
m_resolution, 1.0 / 3.0) + 0.5);
225 volume.
Voxelize(points, stridePoints, nPoints,
226 triangles, strideTriangles, nTriangles,
227 m_dim, m_barycenter, m_rot);
229 Update(50.0, 100.0, params);
233 msg <<
"\t dim = " << m_dim <<
"\t-> " << n <<
" voxels" << std::endl;
240 Update(50.0, 0.0, params);
242 m_overallProgress = 1.0;
243 Update(100.0, 100.0, params);
248 msg <<
"\t time " << m_timer.GetElapsedTime() / 1000.0 <<
"s" << std::endl;
253 void VoxelizeMesh(
const T*
const points,
254 const uint32_t stridePoints,
255 const uint32_t nPoints,
256 const int32_t*
const triangles,
257 const uint32_t strideTriangles,
258 const uint32_t nTriangles,
266 m_stage =
"Voxelization";
268 std::ostringstream msg;
270 msg <<
"+ " << m_stage << std::endl;
276 int32_t iteration = 0;
277 const int32_t maxIteration = 5;
278 double progress = 0.0;
279 while (iteration++ < maxIteration && !m_cancel) {
281 msg <<
"Iteration " << iteration;
282 m_operation = msg.str();
284 progress = iteration * 100.0 / maxIteration;
285 Update(progress, 0.0, params);
288 m_volume->
Voxelize(points, stridePoints, nPoints,
289 triangles, strideTriangles, nTriangles,
290 m_dim, m_barycenter, m_rot);
292 Update(progress, 100.0, params);
294 size_t n = m_volume->GetNPrimitivesOnSurf() + m_volume->GetNPrimitivesInsideSurf();
297 msg <<
"\t dim = " << m_dim <<
"\t-> " << n <<
" voxels" << std::endl;
301 double a = pow((
double)(params.
m_resolution) / n, 0.33);
302 size_t dim_next = (size_t)(m_dim * a + 0.5);
303 if (n < params.
m_resolution && iteration < maxIteration && m_volume->GetNPrimitivesOnSurf() < params.
m_resolution / 8 && m_dim != dim_next) {
312 m_overallProgress = 10.0;
313 Update(100.0, 100.0, params);
318 msg <<
"\t time " << m_timer.GetElapsedTime() / 1000.0 <<
"s" << std::endl;
323 bool ComputeACD(
const T*
const points,
324 const uint32_t nPoints,
325 const uint32_t*
const triangles,
326 const uint32_t nTriangles,
337 AlignMesh(points, 3, nPoints, (int32_t *)triangles, 3, nTriangles, params);
338 VoxelizeMesh(points, 3, nPoints, (int32_t *)triangles, 3, nTriangles, params);
339 ComputePrimitiveSet(params);
341 MergeConvexHulls(params);
342 SimplifyConvexHulls(params);
357 std::string m_operation;
358 double m_overallProgress;
359 double m_stageProgress;
360 double m_operationProgress;
370 int32_t m_ompNumProcessors;
371 #ifdef CL_VERSION_1_1 372 cl_device_id* m_oclDevice;
373 cl_context m_oclContext;
374 cl_program m_oclProgram;
375 cl_command_queue* m_oclQueue;
376 cl_kernel* m_oclKernelComputePartialVolumes;
377 cl_kernel* m_oclKernelComputeSum;
378 size_t m_oclWorkGroupSize;
379 #endif //CL_VERSION_1_1 383 #endif // VHACD_VHACD_H
Vec3< double > & ComputeCenter(void)
void AlignToPrincipalAxes(double(&rot)[3][3]) const
const size_t GetNPrimitivesInsideSurf() const
Definition: vhacdVolume.h:239
Definition: vhacdMutex.h:88
uint32_t * m_triangles
Definition: VHACD.h:65
std::vector< VHACD::IVHACD::Constraint > ConstraintVector
Definition: vhacdVHACD.h:32
void Clean(void)
Definition: vhacdVHACD.h:83
Definition: vhacdMesh.h:29
double ComputeVolume() const
size_t GetNTriangles() const
Definition: vhacdMesh.h:80
IUserCallback * m_callback
Definition: VHACD.h:98
SArray.
Definition: vhacdSArray.h:27
double m_center[3]
Definition: VHACD.h:69
virtual void Log(const char *const msg)=0
VHACD()
Constructor.
Definition: vhacdVHACD.h:41
uint32_t m_resolution
Definition: VHACD.h:100
Triangular mesh data structure.
Definition: vhacdMesh.h:65
int32_t * GetTriangles()
Definition: vhacdMesh.h:81
Definition: vhacdRaycastMesh.h:12
double * GetPoints()
Definition: vhacdMesh.h:72
const size_t GetNPrimitivesOnSurf() const
Definition: vhacdVolume.h:238
Definition: vhacdCircularList.h:19
double m_volume
Definition: VHACD.h:68
uint32_t m_pca
Definition: VHACD.h:104
Definition: vhacdVolume.h:42
Definition: vhacdTimer.h:95
uint32_t m_oclAcceleration
Definition: VHACD.h:107
Definition: vhacdVolume.h:211
size_t GetNPoints() const
Definition: vhacdMesh.h:71
void GetConvexHull(const uint32_t index, ConvexHull &ch) const
Definition: vhacdVHACD.h:70
static RaycastMesh * createRaycastMesh(uint32_t vcount, const double *vertices, uint32_t tcount, const uint32_t *indices)
uint32_t GetNConvexHulls() const
Definition: vhacdVHACD.h:62
bool m_projectHullVertices
Definition: VHACD.h:109
uint32_t m_nTriangles
Definition: VHACD.h:67
~VHACD(void)
Destructor.
Definition: vhacdVHACD.h:59
uint32_t m_nPoints
Definition: VHACD.h:66
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition: btVector3.h:281
virtual void Update(const double overallProgress, const double stageProgress, const double operationProgress, const char *const stage, const char *const operation)=0
double * m_points
Definition: VHACD.h:64
void Release(void)
Definition: vhacdVHACD.h:99
void Cancel()
Definition: vhacdVHACD.h:66
IUserLogger * m_logger
Definition: VHACD.h:99
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