| 1 | #ifndef _OGREBULLET_HEIGHTMAP_ |
|---|
| 2 | #define _OGREBULLET_HEIGHTMAP_ |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | #include "OgreBulletCollisionsPrerequisites.h" |
|---|
| 6 | |
|---|
| 7 | #include "OgreBulletCollisionsShape.h" |
|---|
| 8 | #include "Debug/OgreBulletCollisionsDebugLines.h" |
|---|
| 9 | |
|---|
| 10 | #include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" |
|---|
| 11 | #include "BulletCollision/CollisionShapes/btTriangleCallback.h" |
|---|
| 12 | #include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" |
|---|
| 13 | |
|---|
| 14 | namespace OgreBulletCollisions |
|---|
| 15 | { |
|---|
| 16 | |
|---|
| 17 | class DebugHelper : public btIDebugDraw |
|---|
| 18 | { |
|---|
| 19 | public: |
|---|
| 20 | |
|---|
| 21 | DebugHelper(DebugLines* pLines) : m_pLines(pLines) {} |
|---|
| 22 | ~DebugHelper () {} |
|---|
| 23 | |
|---|
| 24 | void drawLine(const btVector3& from,const btVector3& to,const btVector3& color) |
|---|
| 25 | { |
|---|
| 26 | Ogre::Vector3 a(from.x(), from.y(), from.z()); |
|---|
| 27 | Ogre::Vector3 b(to.x(), to.y(), to.z()); |
|---|
| 28 | m_pLines->addLine(a, b); |
|---|
| 29 | } |
|---|
| 30 | void draw3dText(const btVector3 &,const char *) |
|---|
| 31 | { |
|---|
| 32 | |
|---|
| 33 | } |
|---|
| 34 | |
|---|
| 35 | void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color) |
|---|
| 36 | { |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | void reportErrorWarning(const char* warningString) |
|---|
| 40 | { |
|---|
| 41 | } |
|---|
| 42 | |
|---|
| 43 | void setDebugMode(int debugMode) |
|---|
| 44 | { |
|---|
| 45 | } |
|---|
| 46 | |
|---|
| 47 | int getDebugMode() const |
|---|
| 48 | { |
|---|
| 49 | return -1; |
|---|
| 50 | } |
|---|
| 51 | |
|---|
| 52 | private: |
|---|
| 53 | DebugLines* m_pLines; |
|---|
| 54 | }; |
|---|
| 55 | |
|---|
| 56 | class DebugTriangleDrawCallback : public btTriangleCallback |
|---|
| 57 | { |
|---|
| 58 | private: |
|---|
| 59 | |
|---|
| 60 | DebugHelper *mDebugHelper; |
|---|
| 61 | btTransform mTransform; |
|---|
| 62 | btVector3 mColor; |
|---|
| 63 | |
|---|
| 64 | public: |
|---|
| 65 | |
|---|
| 66 | DebugTriangleDrawCallback(DebugHelper *db, btTransform &bt, const btVector3& color) : |
|---|
| 67 | btTriangleCallback(), |
|---|
| 68 | mDebugHelper(db), |
|---|
| 69 | mTransform(bt), |
|---|
| 70 | mColor(color) |
|---|
| 71 | { |
|---|
| 72 | |
|---|
| 73 | } |
|---|
| 74 | |
|---|
| 75 | void processTriangle(btVector3* triangle, int partId, int triangleIndex) |
|---|
| 76 | { |
|---|
| 77 | mDebugHelper->drawLine (*triangle, *(triangle+1), mColor); |
|---|
| 78 | mDebugHelper->drawLine (*(triangle+1), *(triangle+2), mColor); |
|---|
| 79 | mDebugHelper->drawLine (*(triangle+2), *triangle, mColor); |
|---|
| 80 | } |
|---|
| 81 | }; |
|---|
| 82 | |
|---|
| 83 | class HeightmapCollisionShape : public CollisionShape |
|---|
| 84 | { |
|---|
| 85 | public: |
|---|
| 86 | HeightmapCollisionShape(int width, int length, Ogre::Vector3& scale, Ogre::Real* pHeightData, bool bFlip) |
|---|
| 87 | { |
|---|
| 88 | int upIndex = 1; |
|---|
| 89 | bool useFloatDatam=true; |
|---|
| 90 | bool flipQuadEdges=bFlip; |
|---|
| 91 | |
|---|
| 92 | btHeightfieldTerrainShape* pHeightShape = |
|---|
| 93 | new btHeightfieldTerrainShape(width, length, pHeightData, scale.y, upIndex, useFloatDatam, flipQuadEdges); |
|---|
| 94 | pHeightShape->setUseDiamondSubdivision(true); |
|---|
| 95 | |
|---|
| 96 | mShape = pHeightShape; |
|---|
| 97 | |
|---|
| 98 | btVector3 sc(scale.x, scale.y, scale.z); |
|---|
| 99 | mShape->setLocalScaling(sc); |
|---|
| 100 | |
|---|
| 101 | } |
|---|
| 102 | |
|---|
| 103 | virtual ~HeightmapCollisionShape() |
|---|
| 104 | { |
|---|
| 105 | } |
|---|
| 106 | |
|---|
| 107 | bool drawWireFrame(DebugLines *wire, |
|---|
| 108 | const Ogre::Vector3 &pos = Ogre::Vector3::ZERO, |
|---|
| 109 | const Ogre::Quaternion &quat= Ogre::Quaternion::IDENTITY) const |
|---|
| 110 | { |
|---|
| 111 | btHeightfieldTerrainShape* pHeightShape = static_cast<btHeightfieldTerrainShape*>(mShape); |
|---|
| 112 | |
|---|
| 113 | btTransform bt; |
|---|
| 114 | bt.setIdentity(); |
|---|
| 115 | |
|---|
| 116 | btVector3 colour(255.0, 255.0, 255.0); |
|---|
| 117 | |
|---|
| 118 | DebugHelper ddraw(wire); |
|---|
| 119 | DebugTriangleDrawCallback cb(&ddraw, bt, colour); |
|---|
| 120 | |
|---|
| 121 | btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30)); |
|---|
| 122 | btVector3 aabbMin(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30)); |
|---|
| 123 | pHeightShape->processAllTriangles(&cb, aabbMin, aabbMax); |
|---|
| 124 | return true; |
|---|
| 125 | } |
|---|
| 126 | |
|---|
| 127 | }; |
|---|
| 128 | } |
|---|
| 129 | |
|---|
| 130 | |
|---|
| 131 | #endif // _OGREBULLET_HEIGHTMAP_ |
|---|