168 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| Bullet Continuous Collision Detection and Physics Library
 | |
| Copyright (c) 2003-2009 Erwin Coumans  http://bulletphysics.org
 | |
| 
 | |
| This software is provided 'as-is', without any express or implied warranty.
 | |
| In no event will the authors be held liable for any damages arising from the use of this software.
 | |
| Permission is granted to anyone to use this software for any purpose, 
 | |
| including commercial applications, and to alter it and redistribute it freely, 
 | |
| subject to the following restrictions:
 | |
| 
 | |
| 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.
 | |
| 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
 | |
| 3. This notice may not be removed or altered from any source distribution.
 | |
| */
 | |
| 
 | |
| #ifndef BT_HEIGHTFIELD_TERRAIN_SHAPE_H
 | |
| #define BT_HEIGHTFIELD_TERRAIN_SHAPE_H
 | |
| 
 | |
| #include "btConcaveShape.h"
 | |
| 
 | |
| ///btHeightfieldTerrainShape simulates a 2D heightfield terrain
 | |
| /**
 | |
|   The caller is responsible for maintaining the heightfield array; this
 | |
|   class does not make a copy.
 | |
| 
 | |
|   The heightfield can be dynamic so long as the min/max height values
 | |
|   capture the extremes (heights must always be in that range).
 | |
| 
 | |
|   The local origin of the heightfield is assumed to be the exact
 | |
|   center (as determined by width and length and height, with each
 | |
|   axis multiplied by the localScaling).
 | |
| 
 | |
|   \b NOTE: be careful with coordinates.  If you have a heightfield with a local
 | |
|   min height of -100m, and a max height of +500m, you may be tempted to place it
 | |
|   at the origin (0,0) and expect the heights in world coordinates to be
 | |
|   -100 to +500 meters.
 | |
|   Actually, the heights will be -300 to +300m, because bullet will re-center
 | |
|   the heightfield based on its AABB (which is determined by the min/max
 | |
|   heights).  So keep in mind that once you create a btHeightfieldTerrainShape
 | |
|   object, the heights will be adjusted relative to the center of the AABB.  This
 | |
|   is different to the behavior of many rendering engines, but is useful for
 | |
|   physics engines.
 | |
| 
 | |
|   Most (but not all) rendering and heightfield libraries assume upAxis = 1
 | |
|   (that is, the y-axis is "up").  This class allows any of the 3 coordinates
 | |
|   to be "up".  Make sure your choice of axis is consistent with your rendering
 | |
|   system.
 | |
| 
 | |
|   The heightfield heights are determined from the data type used for the
 | |
|   heightfieldData array.  
 | |
| 
 | |
|    - PHY_UCHAR: height at a point is the uchar value at the
 | |
|        grid point, multipled by heightScale.  uchar isn't recommended
 | |
|        because of its inability to deal with negative values, and
 | |
|        low resolution (8-bit).
 | |
| 
 | |
|    - PHY_SHORT: height at a point is the short int value at that grid
 | |
|        point, multipled by heightScale.
 | |
| 
 | |
|    - PHY_FLOAT: height at a point is the float value at that grid
 | |
|        point.  heightScale is ignored when using the float heightfield
 | |
|        data type.
 | |
| 
 | |
|   Whatever the caller specifies as minHeight and maxHeight will be honored.
 | |
|   The class will not inspect the heightfield to discover the actual minimum
 | |
|   or maximum heights.  These values are used to determine the heightfield's
 | |
|   axis-aligned bounding box, multiplied by localScaling.
 | |
| 
 | |
|   For usage and testing see the TerrainDemo.
 | |
|  */
 | |
| ATTRIBUTE_ALIGNED16(class) btHeightfieldTerrainShape : public btConcaveShape
 | |
| {
 | |
| protected:
 | |
| 	btVector3	m_localAabbMin;
 | |
| 	btVector3	m_localAabbMax;
 | |
| 	btVector3	m_localOrigin;
 | |
| 
 | |
| 	///terrain data
 | |
| 	int	m_heightStickWidth;
 | |
| 	int m_heightStickLength;
 | |
| 	btScalar	m_minHeight;
 | |
| 	btScalar	m_maxHeight;
 | |
| 	btScalar m_width;
 | |
| 	btScalar m_length;
 | |
| 	btScalar m_heightScale;
 | |
| 	union
 | |
| 	{
 | |
| 		const unsigned char*	m_heightfieldDataUnsignedChar;
 | |
| 		const short*		m_heightfieldDataShort;
 | |
| 		const btScalar*			m_heightfieldDataFloat;
 | |
| 		const void*	m_heightfieldDataUnknown;
 | |
| 	};
 | |
| 
 | |
| 	PHY_ScalarType	m_heightDataType;	
 | |
| 	bool	m_flipQuadEdges;
 | |
|   	bool  m_useDiamondSubdivision;
 | |
| 	bool m_useZigzagSubdivision;
 | |
| 
 | |
| 	int	m_upAxis;
 | |
| 	
 | |
| 	btVector3	m_localScaling;
 | |
| 
 | |
| 	virtual btScalar	getRawHeightFieldValue(int x,int y) const;
 | |
| 	void		quantizeWithClamp(int* out, const btVector3& point,int isMax) const;
 | |
| 	void		getVertex(int x,int y,btVector3& vertex) const;
 | |
| 
 | |
| 
 | |
| 
 | |
| 	/// protected initialization
 | |
| 	/**
 | |
| 	  Handles the work of constructors so that public constructors can be
 | |
| 	  backwards-compatible without a lot of copy/paste.
 | |
| 	 */
 | |
| 	void initialize(int heightStickWidth, int heightStickLength,
 | |
| 	                const void* heightfieldData, btScalar heightScale,
 | |
| 	                btScalar minHeight, btScalar maxHeight, int upAxis,
 | |
| 	                PHY_ScalarType heightDataType, bool flipQuadEdges);
 | |
| 
 | |
| public:
 | |
| 	
 | |
| 	BT_DECLARE_ALIGNED_ALLOCATOR();
 | |
| 	
 | |
| 	/// preferred constructor
 | |
| 	/**
 | |
| 	  This constructor supports a range of heightfield
 | |
| 	  data types, and allows for a non-zero minimum height value.
 | |
| 	  heightScale is needed for any integer-based heightfield data types.
 | |
| 	 */
 | |
| 	btHeightfieldTerrainShape(int heightStickWidth,int heightStickLength,
 | |
| 	                          const void* heightfieldData, btScalar heightScale,
 | |
| 	                          btScalar minHeight, btScalar maxHeight,
 | |
| 	                          int upAxis, PHY_ScalarType heightDataType,
 | |
| 	                          bool flipQuadEdges);
 | |
| 
 | |
| 	/// legacy constructor
 | |
| 	/**
 | |
| 	  The legacy constructor assumes the heightfield has a minimum height
 | |
| 	  of zero.  Only unsigned char or floats are supported.  For legacy
 | |
| 	  compatibility reasons, heightScale is calculated as maxHeight / 65535 
 | |
| 	  (and is only used when useFloatData = false).
 | |
|  	 */
 | |
| 	btHeightfieldTerrainShape(int heightStickWidth,int heightStickLength,const void* heightfieldData, btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges);
 | |
| 
 | |
| 	virtual ~btHeightfieldTerrainShape();
 | |
| 
 | |
| 
 | |
| 	void setUseDiamondSubdivision(bool useDiamondSubdivision=true) { m_useDiamondSubdivision = useDiamondSubdivision;}
 | |
| 
 | |
| 	///could help compatibility with Ogre heightfields. See https://code.google.com/p/bullet/issues/detail?id=625	
 | |
| 	void setUseZigzagSubdivision(bool useZigzagSubdivision=true) { m_useZigzagSubdivision = useZigzagSubdivision;}
 | |
| 
 | |
| 	virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
 | |
| 
 | |
| 	virtual void	processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
 | |
| 
 | |
| 	virtual void	calculateLocalInertia(btScalar mass,btVector3& inertia) const;
 | |
| 
 | |
| 	virtual void	setLocalScaling(const btVector3& scaling);
 | |
| 	
 | |
| 	virtual const btVector3& getLocalScaling() const;
 | |
| 	
 | |
| 	//debugging
 | |
| 	virtual const char*	getName()const {return "HEIGHTFIELD";}
 | |
| 
 | |
| };
 | |
| 
 | |
| #endif //BT_HEIGHTFIELD_TERRAIN_SHAPE_H
 |