Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h
| Show All 13 Lines | |||||
| */ | */ | ||||
| #ifndef BT_OBB_TRIANGLE_MINKOWSKI_H | #ifndef BT_OBB_TRIANGLE_MINKOWSKI_H | ||||
| #define BT_OBB_TRIANGLE_MINKOWSKI_H | #define BT_OBB_TRIANGLE_MINKOWSKI_H | ||||
| #include "btConvexShape.h" | #include "btConvexShape.h" | ||||
| #include "btBoxShape.h" | #include "btBoxShape.h" | ||||
| ATTRIBUTE_ALIGNED16(class) btTriangleShape : public btPolyhedralConvexShape | ATTRIBUTE_ALIGNED16(class) | ||||
| btTriangleShape : public btPolyhedralConvexShape | |||||
| { | { | ||||
| public: | public: | ||||
| BT_DECLARE_ALIGNED_ALLOCATOR(); | BT_DECLARE_ALIGNED_ALLOCATOR(); | ||||
| btVector3 m_vertices1[3]; | btVector3 m_vertices1[3]; | ||||
| virtual int getNumVertices() const | virtual int getNumVertices() const | ||||
| { | { | ||||
| return 3; | return 3; | ||||
| } | } | ||||
| btVector3& getVertexPtr(int index) | btVector3& getVertexPtr(int index) | ||||
| { | { | ||||
| return m_vertices1[index]; | return m_vertices1[index]; | ||||
| } | } | ||||
| const btVector3& getVertexPtr(int index) const | const btVector3& getVertexPtr(int index) const | ||||
| { | { | ||||
| return m_vertices1[index]; | return m_vertices1[index]; | ||||
| } | } | ||||
| virtual void getVertex(int index,btVector3& vert) const | virtual void getVertex(int index, btVector3& vert) const | ||||
| { | { | ||||
| vert = m_vertices1[index]; | vert = m_vertices1[index]; | ||||
| } | } | ||||
| virtual int getNumEdges() const | virtual int getNumEdges() const | ||||
| { | { | ||||
| return 3; | return 3; | ||||
| } | } | ||||
| virtual void getEdge(int i,btVector3& pa,btVector3& pb) const | virtual void getEdge(int i, btVector3& pa, btVector3& pb) const | ||||
| { | { | ||||
| getVertex(i,pa); | getVertex(i, pa); | ||||
| getVertex((i+1)%3,pb); | getVertex((i + 1) % 3, pb); | ||||
| } | } | ||||
| virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax)const | virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const | ||||
| { | { | ||||
| // btAssert(0); | // btAssert(0); | ||||
| getAabbSlow(t,aabbMin,aabbMax); | getAabbSlow(t, aabbMin, aabbMax); | ||||
| } | } | ||||
| btVector3 localGetSupportingVertexWithoutMargin(const btVector3& dir)const | btVector3 localGetSupportingVertexWithoutMargin(const btVector3& dir) const | ||||
| { | { | ||||
| btVector3 dots = dir.dot3(m_vertices1[0], m_vertices1[1], m_vertices1[2]); | btVector3 dots = dir.dot3(m_vertices1[0], m_vertices1[1], m_vertices1[2]); | ||||
| return m_vertices1[dots.maxAxis()]; | return m_vertices1[dots.maxAxis()]; | ||||
| } | } | ||||
| virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const | virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const | ||||
| { | { | ||||
| for (int i=0;i<numVectors;i++) | for (int i = 0; i < numVectors; i++) | ||||
| { | { | ||||
| const btVector3& dir = vectors[i]; | const btVector3& dir = vectors[i]; | ||||
| btVector3 dots = dir.dot3(m_vertices1[0], m_vertices1[1], m_vertices1[2]); | btVector3 dots = dir.dot3(m_vertices1[0], m_vertices1[1], m_vertices1[2]); | ||||
| supportVerticesOut[i] = m_vertices1[dots.maxAxis()]; | supportVerticesOut[i] = m_vertices1[dots.maxAxis()]; | ||||
| } | } | ||||
| } | } | ||||
| btTriangleShape() : btPolyhedralConvexShape () | btTriangleShape() : btPolyhedralConvexShape() | ||||
| { | { | ||||
| m_shapeType = TRIANGLE_SHAPE_PROXYTYPE; | m_shapeType = TRIANGLE_SHAPE_PROXYTYPE; | ||||
| } | } | ||||
| btTriangleShape(const btVector3& p0,const btVector3& p1,const btVector3& p2) : btPolyhedralConvexShape () | btTriangleShape(const btVector3& p0, const btVector3& p1, const btVector3& p2) : btPolyhedralConvexShape() | ||||
| { | { | ||||
| m_shapeType = TRIANGLE_SHAPE_PROXYTYPE; | m_shapeType = TRIANGLE_SHAPE_PROXYTYPE; | ||||
| m_vertices1[0] = p0; | m_vertices1[0] = p0; | ||||
| m_vertices1[1] = p1; | m_vertices1[1] = p1; | ||||
| m_vertices1[2] = p2; | m_vertices1[2] = p2; | ||||
| } | } | ||||
| virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i) const | virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const | ||||
| { | { | ||||
| getPlaneEquation(i,planeNormal,planeSupport); | getPlaneEquation(i, planeNormal, planeSupport); | ||||
| } | } | ||||
| virtual int getNumPlanes() const | virtual int getNumPlanes() const | ||||
| { | { | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| void calcNormal(btVector3& normal) const | void calcNormal(btVector3 & normal) const | ||||
| { | { | ||||
| normal = (m_vertices1[1]-m_vertices1[0]).cross(m_vertices1[2]-m_vertices1[0]); | normal = (m_vertices1[1] - m_vertices1[0]).cross(m_vertices1[2] - m_vertices1[0]); | ||||
| normal.normalize(); | normal.normalize(); | ||||
| } | } | ||||
| virtual void getPlaneEquation(int i, btVector3& planeNormal,btVector3& planeSupport) const | virtual void getPlaneEquation(int i, btVector3& planeNormal, btVector3& planeSupport) const | ||||
| { | { | ||||
| (void)i; | (void)i; | ||||
| calcNormal(planeNormal); | calcNormal(planeNormal); | ||||
| planeSupport = m_vertices1[0]; | planeSupport = m_vertices1[0]; | ||||
| } | } | ||||
| virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const | virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const | ||||
| { | { | ||||
| (void)mass; | (void)mass; | ||||
| btAssert(0); | btAssert(0); | ||||
| inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.)); | inertia.setValue(btScalar(0.), btScalar(0.), btScalar(0.)); | ||||
| } | } | ||||
| virtual bool isInside(const btVector3& pt,btScalar tolerance) const | virtual bool isInside(const btVector3& pt, btScalar tolerance) const | ||||
| { | { | ||||
| btVector3 normal; | btVector3 normal; | ||||
| calcNormal(normal); | calcNormal(normal); | ||||
| //distance to plane | //distance to plane | ||||
| btScalar dist = pt.dot(normal); | btScalar dist = pt.dot(normal); | ||||
| btScalar planeconst = m_vertices1[0].dot(normal); | btScalar planeconst = m_vertices1[0].dot(normal); | ||||
| dist -= planeconst; | dist -= planeconst; | ||||
| if (dist >= -tolerance && dist <= tolerance) | if (dist >= -tolerance && dist <= tolerance) | ||||
| { | { | ||||
| //inside check on edge-planes | //inside check on edge-planes | ||||
| int i; | int i; | ||||
| for (i=0;i<3;i++) | for (i = 0; i < 3; i++) | ||||
| { | { | ||||
| btVector3 pa,pb; | btVector3 pa, pb; | ||||
| getEdge(i,pa,pb); | getEdge(i, pa, pb); | ||||
| btVector3 edge = pb-pa; | btVector3 edge = pb - pa; | ||||
| btVector3 edgeNormal = edge.cross(normal); | btVector3 edgeNormal = edge.cross(normal); | ||||
| edgeNormal.normalize(); | edgeNormal.normalize(); | ||||
| btScalar dist = pt.dot( edgeNormal); | btScalar dist = pt.dot(edgeNormal); | ||||
| btScalar edgeConst = pa.dot(edgeNormal); | btScalar edgeConst = pa.dot(edgeNormal); | ||||
| dist -= edgeConst; | dist -= edgeConst; | ||||
| if (dist < -tolerance) | if (dist < -tolerance) | ||||
| return false; | return false; | ||||
| } | } | ||||
| return true; | return true; | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| //debugging | //debugging | ||||
| virtual const char* getName()const | virtual const char* getName() const | ||||
| { | { | ||||
| return "Triangle"; | return "Triangle"; | ||||
| } | } | ||||
| virtual int getNumPreferredPenetrationDirections() const | virtual int getNumPreferredPenetrationDirections() const | ||||
| { | { | ||||
| return 2; | return 2; | ||||
| } | } | ||||
| virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const | virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const | ||||
| { | { | ||||
| calcNormal(penetrationVector); | calcNormal(penetrationVector); | ||||
| if (index) | if (index) | ||||
| penetrationVector *= btScalar(-1.); | penetrationVector *= btScalar(-1.); | ||||
| } | } | ||||
| }; | }; | ||||
| #endif //BT_OBB_TRIANGLE_MINKOWSKI_H | #endif //BT_OBB_TRIANGLE_MINKOWSKI_H | ||||