Bullet Collision Detection & Physics Library
btHeightfieldTerrainShape.h
Go to the documentation of this file.
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
4 
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
10 
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15 
16 #ifndef BT_HEIGHTFIELD_TERRAIN_SHAPE_H
17 #define BT_HEIGHTFIELD_TERRAIN_SHAPE_H
18 
19 #include "btConcaveShape.h"
21 
23 
72 {
73 public:
74  struct Range
75  {
76  Range() {}
77  Range(btScalar min, btScalar max) : min(min), max(max) {}
78 
79  bool overlaps(const Range& other) const
80  {
81  return !(min > other.max || max < other.min);
82  }
83 
86  };
87 
88 protected:
92 
101  union {
102  const unsigned char* m_heightfieldDataUnsignedChar;
105  const double* m_heightfieldDataDouble;
107  };
108 
114  int m_upAxis;
115 
117 
118  // Accelerator
123 
124 
126 
128 
129  virtual btScalar getRawHeightFieldValue(int x, int y) const;
130  void quantizeWithClamp(int* out, const btVector3& point, int isMax) const;
131 
133 
137  void initialize(int heightStickWidth, int heightStickLength,
138  const void* heightfieldData, btScalar heightScale,
139  btScalar minHeight, btScalar maxHeight, int upAxis,
140  PHY_ScalarType heightDataType, bool flipQuadEdges);
141 
142 public:
144 
147  int heightStickWidth, int heightStickLength,
148  const float* heightfieldData, btScalar minHeight, btScalar maxHeight,
149  int upAxis, bool flipQuadEdges);
151  int heightStickWidth, int heightStickLength,
152  const double* heightfieldData, btScalar minHeight, btScalar maxHeight,
153  int upAxis, bool flipQuadEdges);
155  int heightStickWidth, int heightStickLength,
156  const short* heightfieldData, btScalar heightScale, btScalar minHeight, btScalar maxHeight,
157  int upAxis, bool flipQuadEdges);
159  int heightStickWidth, int heightStickLength,
160  const unsigned char* heightfieldData, btScalar heightScale, btScalar minHeight, btScalar maxHeight,
161  int upAxis, bool flipQuadEdges);
162 
164 
173  btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,
174  const void* heightfieldData, btScalar heightScale,
175  btScalar minHeight, btScalar maxHeight,
176  int upAxis, PHY_ScalarType heightDataType,
177  bool flipQuadEdges);
178 
180 
186  btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength, const void* heightfieldData, btScalar maxHeight, int upAxis, bool useFloatData, bool flipQuadEdges);
187 
188  virtual ~btHeightfieldTerrainShape();
189 
190  void setUseDiamondSubdivision(bool useDiamondSubdivision = true) { m_useDiamondSubdivision = useDiamondSubdivision; }
191 
193  void setUseZigzagSubdivision(bool useZigzagSubdivision = true) { m_useZigzagSubdivision = useZigzagSubdivision; }
194 
195  void setFlipTriangleWinding(bool flipTriangleWinding)
196  {
197  m_flipTriangleWinding = flipTriangleWinding;
198  }
199  virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
200 
201  virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const;
202 
203  virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
204 
205  virtual void setLocalScaling(const btVector3& scaling);
206 
207  virtual const btVector3& getLocalScaling() const;
208 
209  void getVertex(int x, int y, btVector3& vertex) const;
210 
211  void performRaycast(btTriangleCallback * callback, const btVector3& raySource, const btVector3& rayTarget) const;
212 
213  void buildAccelerator(int chunkSize = 16);
214  void clearAccelerator();
215 
216  int getUpAxis() const
217  {
218  return m_upAxis;
219  }
220  //debugging
221  virtual const char* getName() const { return "HEIGHTFIELD"; }
222 
223 
225  {
226  m_userValue3 = value;
227  }
229  {
230  return m_userValue3;
231  }
232  const struct btTriangleInfoMap* getTriangleInfoMap() const
233  {
234  return m_triangleInfoMap;
235  }
237  {
238  return m_triangleInfoMap;
239  }
241  {
242  m_triangleInfoMap = map;
243  }
244  const unsigned char* getHeightfieldRawData() const
245  {
246  return m_heightfieldDataUnsignedChar;
247  }
248 };
249 
250 #endif //BT_HEIGHTFIELD_TERRAIN_SHAPE_H
PHY_ScalarType
PHY_ScalarType enumerates possible scalar types.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:314
#define ATTRIBUTE_ALIGNED16(a)
Definition: btScalar.h:99
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
The btConcaveShape class provides an interface for non-moving (static) concave shapes.
btHeightfieldTerrainShape simulates a 2D heightfield terrain
void setFlipTriangleWinding(bool flipTriangleWinding)
virtual const char * getName() const
void setUseZigzagSubdivision(bool useZigzagSubdivision=true)
could help compatibility with Ogre heightfields. See https://code.google.com/p/bullet/issues/detail?...
void setUseDiamondSubdivision(bool useDiamondSubdivision=true)
const struct btTriangleInfoMap * getTriangleInfoMap() const
const unsigned char * getHeightfieldRawData() const
const unsigned char * m_heightfieldDataUnsignedChar
btAlignedObjectArray< Range > m_vboundsGrid
void setTriangleInfoMap(btTriangleInfoMap *map)
struct btTriangleInfoMap * getTriangleInfoMap()
struct btTriangleInfoMap * m_triangleInfoMap
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition: btTransform.h:30
The btTriangleCallback provides a callback for each overlapping triangle when calling processAllTrian...
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:82
bool overlaps(const Range &other) const
The btTriangleInfoMap stores edge angle information for some triangles. You can compute this informat...