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
 |