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_ |
---|