Differential D8762 Diff 28333 extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
| Show All 19 Lines | |||||
| void btConvexPointCloudShape::setLocalScaling(const btVector3& scaling) | void btConvexPointCloudShape::setLocalScaling(const btVector3& scaling) | ||||
| { | { | ||||
| m_localScaling = scaling; | m_localScaling = scaling; | ||||
| recalcLocalAabb(); | recalcLocalAabb(); | ||||
| } | } | ||||
| #ifndef __SPU__ | #ifndef __SPU__ | ||||
| btVector3 btConvexPointCloudShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const | btVector3 btConvexPointCloudShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0) const | ||||
| { | { | ||||
| btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.)); | btVector3 supVec(btScalar(0.), btScalar(0.), btScalar(0.)); | ||||
| btScalar maxDot = btScalar(-BT_LARGE_FLOAT); | btScalar maxDot = btScalar(-BT_LARGE_FLOAT); | ||||
| btVector3 vec = vec0; | btVector3 vec = vec0; | ||||
| btScalar lenSqr = vec.length2(); | btScalar lenSqr = vec.length2(); | ||||
| if (lenSqr < btScalar(0.0001)) | if (lenSqr < btScalar(0.0001)) | ||||
| { | { | ||||
| vec.setValue(1,0,0); | vec.setValue(1, 0, 0); | ||||
| } else | } | ||||
| else | |||||
| { | { | ||||
| btScalar rlen = btScalar(1.) / btSqrt(lenSqr ); | btScalar rlen = btScalar(1.) / btSqrt(lenSqr); | ||||
| vec *= rlen; | vec *= rlen; | ||||
| } | } | ||||
| if( m_numPoints > 0 ) | if (m_numPoints > 0) | ||||
| { | { | ||||
| // Here we take advantage of dot(a*b, c) = dot( a, b*c) to do less work. Note this transformation is true mathematically, not numerically. | // Here we take advantage of dot(a*b, c) = dot( a, b*c) to do less work. Note this transformation is true mathematically, not numerically. | ||||
| // btVector3 scaled = vec * m_localScaling; | // btVector3 scaled = vec * m_localScaling; | ||||
| int index = (int) vec.maxDot( &m_unscaledPoints[0], m_numPoints, maxDot); //FIXME: may violate encapsulation of m_unscaledPoints | int index = (int)vec.maxDot(&m_unscaledPoints[0], m_numPoints, maxDot); //FIXME: may violate encapsulation of m_unscaledPoints | ||||
| return getScaledPoint(index); | return getScaledPoint(index); | ||||
| } | } | ||||
| return supVec; | return supVec; | ||||
| } | } | ||||
| void btConvexPointCloudShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const | void btConvexPointCloudShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const | ||||
| { | { | ||||
| for( int j = 0; j < numVectors; j++ ) | for (int j = 0; j < numVectors; j++) | ||||
| { | { | ||||
| const btVector3& vec = vectors[j] * m_localScaling; // dot( a*c, b) = dot(a, b*c) | const btVector3& vec = vectors[j] * m_localScaling; // dot( a*c, b) = dot(a, b*c) | ||||
| btScalar maxDot; | btScalar maxDot; | ||||
| int index = (int) vec.maxDot( &m_unscaledPoints[0], m_numPoints, maxDot); | int index = (int)vec.maxDot(&m_unscaledPoints[0], m_numPoints, maxDot); | ||||
| supportVerticesOut[j][3] = btScalar(-BT_LARGE_FLOAT); | supportVerticesOut[j][3] = btScalar(-BT_LARGE_FLOAT); | ||||
| if( 0 <= index ) | if (0 <= index) | ||||
| { | { | ||||
| //WARNING: don't swap next lines, the w component would get overwritten! | //WARNING: don't swap next lines, the w component would get overwritten! | ||||
| supportVerticesOut[j] = getScaledPoint(index); | supportVerticesOut[j] = getScaledPoint(index); | ||||
| supportVerticesOut[j][3] = maxDot; | supportVerticesOut[j][3] = maxDot; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| btVector3 btConvexPointCloudShape::localGetSupportingVertex(const btVector3& vec)const | btVector3 btConvexPointCloudShape::localGetSupportingVertex(const btVector3& vec) const | ||||
| { | { | ||||
| btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec); | btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec); | ||||
| if ( getMargin()!=btScalar(0.) ) | if (getMargin() != btScalar(0.)) | ||||
| { | { | ||||
| btVector3 vecnorm = vec; | btVector3 vecnorm = vec; | ||||
| if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON)) | if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON)) | ||||
| { | { | ||||
| vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.)); | vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.)); | ||||
| } | } | ||||
| vecnorm.normalize(); | vecnorm.normalize(); | ||||
| supVertex+= getMargin() * vecnorm; | supVertex += getMargin() * vecnorm; | ||||
| } | } | ||||
| return supVertex; | return supVertex; | ||||
| } | } | ||||
| #endif | #endif | ||||
| //currently just for debugging (drawing), perhaps future support for algebraic continuous collision detection | //currently just for debugging (drawing), perhaps future support for algebraic continuous collision detection | ||||
| //Please note that you can debug-draw btConvexHullShape with the Raytracer Demo | //Please note that you can debug-draw btConvexHullShape with the Raytracer Demo | ||||
| int btConvexPointCloudShape::getNumVertices() const | int btConvexPointCloudShape::getNumVertices() const | ||||
| { | { | ||||
| return m_numPoints; | return m_numPoints; | ||||
| } | } | ||||
| int btConvexPointCloudShape::getNumEdges() const | int btConvexPointCloudShape::getNumEdges() const | ||||
| { | { | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| void btConvexPointCloudShape::getEdge(int i,btVector3& pa,btVector3& pb) const | void btConvexPointCloudShape::getEdge(int i, btVector3& pa, btVector3& pb) const | ||||
| { | { | ||||
| btAssert (0); | btAssert(0); | ||||
| } | } | ||||
| void btConvexPointCloudShape::getVertex(int i,btVector3& vtx) const | void btConvexPointCloudShape::getVertex(int i, btVector3& vtx) const | ||||
| { | { | ||||
| vtx = m_unscaledPoints[i]*m_localScaling; | vtx = m_unscaledPoints[i] * m_localScaling; | ||||
| } | } | ||||
| int btConvexPointCloudShape::getNumPlanes() const | int btConvexPointCloudShape::getNumPlanes() const | ||||
| { | { | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| void btConvexPointCloudShape::getPlane(btVector3& ,btVector3& ,int ) const | void btConvexPointCloudShape::getPlane(btVector3&, btVector3&, int) const | ||||
| { | { | ||||
| btAssert(0); | btAssert(0); | ||||
| } | } | ||||
| //not yet | //not yet | ||||
| bool btConvexPointCloudShape::isInside(const btVector3& ,btScalar ) const | bool btConvexPointCloudShape::isInside(const btVector3&, btScalar) const | ||||
| { | { | ||||
| btAssert(0); | btAssert(0); | ||||
| return false; | return false; | ||||
| } | } | ||||