@@ -236,15 +236,19 @@ void MeshShape::setMesh(
236236// ==============================================================================
237237void MeshShape::setScale (const Eigen::Vector3d& scale)
238238{
239- assert ((scale.array () > 0.0 ).all ());
240-
241239 mScale = scale;
242240 mIsBoundingBoxDirty = true ;
243241 mIsVolumeDirty = true ;
244242
245243 incrementVersion ();
246244}
247245
246+ // ==============================================================================
247+ void MeshShape::setScale (const double scale)
248+ {
249+ setScale (Eigen::Vector3d::Constant (scale));
250+ }
251+
248252// ==============================================================================
249253const Eigen::Vector3d& MeshShape::getScale () const
250254{
@@ -332,33 +336,21 @@ void MeshShape::updateBoundingBox() const
332336 return ;
333337 }
334338
335- double max_X = -std::numeric_limits<double >::infinity ();
336- double max_Y = -std::numeric_limits<double >::infinity ();
337- double max_Z = -std::numeric_limits<double >::infinity ();
338- double min_X = std::numeric_limits<double >::infinity ();
339- double min_Y = std::numeric_limits<double >::infinity ();
340- double min_Z = std::numeric_limits<double >::infinity ();
341-
342- for (unsigned int i = 0 ; i < mMesh ->mNumMeshes ; i++) {
343- for (unsigned int j = 0 ; j < mMesh ->mMeshes [i]->mNumVertices ; j++) {
344- if (mMesh ->mMeshes [i]->mVertices [j].x > max_X)
345- max_X = mMesh ->mMeshes [i]->mVertices [j].x ;
346- if (mMesh ->mMeshes [i]->mVertices [j].x < min_X)
347- min_X = mMesh ->mMeshes [i]->mVertices [j].x ;
348- if (mMesh ->mMeshes [i]->mVertices [j].y > max_Y)
349- max_Y = mMesh ->mMeshes [i]->mVertices [j].y ;
350- if (mMesh ->mMeshes [i]->mVertices [j].y < min_Y)
351- min_Y = mMesh ->mMeshes [i]->mVertices [j].y ;
352- if (mMesh ->mMeshes [i]->mVertices [j].z > max_Z)
353- max_Z = mMesh ->mMeshes [i]->mVertices [j].z ;
354- if (mMesh ->mMeshes [i]->mVertices [j].z < min_Z)
355- min_Z = mMesh ->mMeshes [i]->mVertices [j].z ;
339+ Eigen::Vector3d minPoint
340+ = Eigen::Vector3d::Constant (std::numeric_limits<double >::infinity ());
341+ Eigen::Vector3d maxPoint = -minPoint;
342+
343+ for (unsigned i = 0u ; i < mMesh ->mNumMeshes ; i++) {
344+ for (unsigned j = 0u ; j < mMesh ->mMeshes [i]->mNumVertices ; j++) {
345+ const auto & vertex = mMesh ->mMeshes [i]->mVertices [j];
346+ const Eigen::Vector3d eigenVertex (vertex.x , vertex.y , vertex.z );
347+ minPoint = minPoint.cwiseMin (eigenVertex.cwiseProduct (mScale ));
348+ maxPoint = maxPoint.cwiseMax (eigenVertex.cwiseProduct (mScale ));
356349 }
357350 }
358- mBoundingBox .setMin (
359- Eigen::Vector3d (min_X * mScale [0 ], min_Y * mScale [1 ], min_Z * mScale [2 ]));
360- mBoundingBox .setMax (
361- Eigen::Vector3d (max_X * mScale [0 ], max_Y * mScale [1 ], max_Z * mScale [2 ]));
351+
352+ mBoundingBox .setMin (minPoint);
353+ mBoundingBox .setMax (maxPoint);
362354
363355 mIsBoundingBoxDirty = false ;
364356}
0 commit comments