diff options
Diffstat (limited to 'extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp')
-rw-r--r-- | extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp | 115 |
1 files changed, 56 insertions, 59 deletions
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp index 94be43c88e2..a291d6b7ce7 100644 --- a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp +++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp @@ -18,16 +18,18 @@ subject to the following restrictions: #include "LinearMath/btTransformUtil.h" -btHeightfieldTerrainShape::btHeightfieldTerrainShape(int width,int length,void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges) -:m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)), -m_width(width), -m_length(length), -m_heightfieldDataUnknown(heightfieldData), +btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges) +: m_heightStickWidth(heightStickWidth), +m_heightStickLength(heightStickLength), m_maxHeight(maxHeight), -m_upAxis(upAxis), +m_width((btScalar)heightStickWidth-1), +m_length((btScalar)heightStickLength-1), +m_heightfieldDataUnknown(heightfieldData), m_useFloatData(useFloatData), m_flipQuadEdges(flipQuadEdges), -m_useDiamondSubdivision(false) +m_useDiamondSubdivision(false), +m_upAxis(upAxis), +m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)) { @@ -43,25 +45,25 @@ m_useDiamondSubdivision(false) case 0: { halfExtents.setValue( - m_maxHeight, - m_width, - m_length); + btScalar(m_maxHeight), + btScalar(m_width), //?? don't know if this should change + btScalar(m_length)); break; } case 1: { halfExtents.setValue( - m_width, - m_maxHeight, - m_length); + btScalar(m_width), + btScalar(m_maxHeight), + btScalar(m_length)); break; }; case 2: { halfExtents.setValue( - m_width, - m_length, - m_maxHeight + btScalar(m_width), + btScalar(m_length), + btScalar(m_maxHeight) ); break; } @@ -89,19 +91,15 @@ btHeightfieldTerrainShape::~btHeightfieldTerrainShape() void btHeightfieldTerrainShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const { -/* - aabbMin.setValue(-1e30f,-1e30f,-1e30f); - aabbMax.setValue(1e30f,1e30f,1e30f); -*/ - btVector3 halfExtents = (m_localAabbMax-m_localAabbMin)* m_localScaling * btScalar(0.5); + halfExtents += btVector3(getMargin(),getMargin(),getMargin()); btMatrix3x3 abs_b = t.getBasis().absolute(); btPoint3 center = t.getOrigin(); btVector3 extent = btVector3(abs_b[0].dot(halfExtents), abs_b[1].dot(halfExtents), abs_b[2].dot(halfExtents)); - extent += btVector3(getMargin(),getMargin(),getMargin()); + aabbMin = center - extent; aabbMax = center + extent; @@ -114,11 +112,11 @@ btScalar btHeightfieldTerrainShape::getHeightFieldValue(int x,int y) const btScalar val = 0.f; if (m_useFloatData) { - val = m_heightfieldDataFloat[(y*m_width)+x]; + val = m_heightfieldDataFloat[(y*m_heightStickWidth)+x]; } else { //assume unsigned short int - unsigned char heightFieldValue = m_heightfieldDataUnsignedChar[(y*m_width)+x]; + unsigned char heightFieldValue = m_heightfieldDataUnsignedChar[(y*m_heightStickWidth)+x]; val = heightFieldValue* (m_maxHeight/btScalar(65535)); } return val; @@ -133,8 +131,8 @@ void btHeightfieldTerrainShape::getVertex(int x,int y,btVector3& vertex) const btAssert(x>=0); btAssert(y>=0); - btAssert(x<m_width); - btAssert(y<m_length); + btAssert(x<m_heightStickWidth); + btAssert(y<m_heightStickLength); btScalar height = getHeightFieldValue(x,y); @@ -145,25 +143,25 @@ void btHeightfieldTerrainShape::getVertex(int x,int y,btVector3& vertex) const { vertex.setValue( height, - (-m_width/2 ) + x, - (-m_length/2 ) + y + (-m_width/btScalar(2.0)) + x, + (-m_length/btScalar(2.0) ) + y ); break; } case 1: { vertex.setValue( - (-m_width/2 ) + x, + (-m_width/btScalar(2.0)) + x, height, - (-m_length/2 ) + y + (-m_length/btScalar(2.0)) + y ); break; }; case 2: { vertex.setValue( - (-m_width/2 ) + x, - (-m_length/2 ) + y, + (-m_width/btScalar(2.0)) + x, + (-m_length/btScalar(2.0)) + y, height ); break; @@ -180,21 +178,20 @@ void btHeightfieldTerrainShape::getVertex(int x,int y,btVector3& vertex) const } -void btHeightfieldTerrainShape::quantizeWithClamp(int* out, const btVector3& point) const +void btHeightfieldTerrainShape::quantizeWithClamp(int* out, const btVector3& point,int /*isMax*/) const { - - btVector3 clampedPoint(point); clampedPoint.setMax(m_localAabbMin); clampedPoint.setMin(m_localAabbMax); - btVector3 v = (clampedPoint );// * m_quantization; - - out[0] = (int)(v.getX()); - out[1] = (int)(v.getY()); - out[2] = (int)(v.getZ()); - //correct for + btVector3 v = (clampedPoint);// - m_bvhAabbMin) * m_bvhQuantization; + //TODO: optimization: check out how to removed this btFabs + + out[0] = (int)(v.getX() + v.getX() / btFabs(v.getX())* btScalar(0.5) ); + out[1] = (int)(v.getY() + v.getY() / btFabs(v.getY())* btScalar(0.5) ); + out[2] = (int)(v.getZ() + v.getZ() / btFabs(v.getZ())* btScalar(0.5) ); + } @@ -212,24 +209,24 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback btVector3 localAabbMin = aabbMin*btVector3(1.f/m_localScaling[0],1.f/m_localScaling[1],1.f/m_localScaling[2]); btVector3 localAabbMax = aabbMax*btVector3(1.f/m_localScaling[0],1.f/m_localScaling[1],1.f/m_localScaling[2]); - quantizeWithClamp(quantizedAabbMin, localAabbMin); - quantizeWithClamp(quantizedAabbMax, localAabbMax); + quantizeWithClamp(quantizedAabbMin, localAabbMin,0); + quantizeWithClamp(quantizedAabbMax, localAabbMax,1); int startX=0; - int endX=m_width-1; + int endX=m_heightStickWidth-1; int startJ=0; - int endJ=m_length-1; + int endJ=m_heightStickLength-1; switch (m_upAxis) { case 0: { - quantizedAabbMin[1]+=m_width/2-1; - quantizedAabbMax[1]+=m_width/2+1; - quantizedAabbMin[2]+=m_length/2-1; - quantizedAabbMax[2]+=m_length/2+1; + quantizedAabbMin[1]+=m_heightStickWidth/2-1; + quantizedAabbMax[1]+=m_heightStickWidth/2+1; + quantizedAabbMin[2]+=m_heightStickLength/2-1; + quantizedAabbMax[2]+=m_heightStickLength/2+1; if (quantizedAabbMin[1]>startX) startX = quantizedAabbMin[1]; @@ -243,10 +240,10 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback } case 1: { - quantizedAabbMin[0]+=m_width/2-1; - quantizedAabbMax[0]+=m_width/2+1; - quantizedAabbMin[2]+=m_length/2-1; - quantizedAabbMax[2]+=m_length/2+1; + quantizedAabbMin[0]+=m_heightStickWidth/2-1; + quantizedAabbMax[0]+=m_heightStickWidth/2+1; + quantizedAabbMin[2]+=m_heightStickLength/2-1; + quantizedAabbMax[2]+=m_heightStickLength/2+1; if (quantizedAabbMin[0]>startX) startX = quantizedAabbMin[0]; @@ -260,10 +257,10 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback }; case 2: { - quantizedAabbMin[0]+=m_width/2-1; - quantizedAabbMax[0]+=m_width/2+1; - quantizedAabbMin[1]+=m_length/2-1; - quantizedAabbMax[1]+=m_length/2+1; + quantizedAabbMin[0]+=m_heightStickWidth/2-1; + quantizedAabbMax[0]+=m_heightStickWidth/2+1; + quantizedAabbMin[1]+=m_heightStickLength/2-1; + quantizedAabbMax[1]+=m_heightStickLength/2+1; if (quantizedAabbMin[0]>startX) startX = quantizedAabbMin[0]; @@ -290,7 +287,7 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback for(int x=startX; x<endX; x++) { btVector3 vertices[3]; - if (m_flipQuadEdges || (m_useDiamondSubdivision && ((j+x) & 1))) + if (m_flipQuadEdges || (m_useDiamondSubdivision && !((j+x) & 1))) { //first triangle getVertex(x,j,vertices[0]); @@ -322,7 +319,7 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback } -void btHeightfieldTerrainShape::calculateLocalInertia(btScalar ,btVector3& inertia) +void btHeightfieldTerrainShape::calculateLocalInertia(btScalar ,btVector3& inertia) const { //moving concave objects not supported |