forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			484 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			484 lines
		
	
	
		
			17 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_IDEBUG_DRAW__H
 | ||
|  | #define BT_IDEBUG_DRAW__H
 | ||
|  | 
 | ||
|  | #include "btVector3.h"
 | ||
|  | #include "btTransform.h"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ///The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
 | ||
|  | ///Typical use case: create a debug drawer object, and assign it to a btCollisionWorld or btDynamicsWorld using setDebugDrawer and call debugDrawWorld.
 | ||
|  | ///A class that implements the btIDebugDraw interface has to implement the drawLine method at a minimum.
 | ||
|  | ///For color arguments the X,Y,Z components refer to Red, Green and Blue each in the range [0..1]
 | ||
|  | class	btIDebugDraw | ||
|  | { | ||
|  | 	public: | ||
|  | 
 | ||
|  | 	ATTRIBUTE_ALIGNED16(struct) DefaultColors | ||
|  | 	{ | ||
|  | 		btVector3	m_activeObject; | ||
|  | 		btVector3	m_deactivatedObject; | ||
|  | 		btVector3	m_wantsDeactivationObject; | ||
|  | 		btVector3	m_disabledDeactivationObject; | ||
|  | 		btVector3	m_disabledSimulationObject; | ||
|  | 		btVector3	m_aabb; | ||
|  | 		btVector3 m_contactPoint; | ||
|  | 		 | ||
|  | 		DefaultColors() | ||
|  | 		:	m_activeObject(1,1,1), | ||
|  | 			m_deactivatedObject(0,1,0), | ||
|  | 			m_wantsDeactivationObject(0,1,1), | ||
|  | 			m_disabledDeactivationObject(1,0,0), | ||
|  | 			m_disabledSimulationObject(1,1,0), | ||
|  | 			m_aabb(1,0,0), | ||
|  | 			m_contactPoint(1,1,0) | ||
|  | 		{ | ||
|  | 		} | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	 | ||
|  | 	enum	DebugDrawModes | ||
|  | 	{ | ||
|  | 		DBG_NoDebug=0, | ||
|  | 		DBG_DrawWireframe = 1, | ||
|  | 		DBG_DrawAabb=2, | ||
|  | 		DBG_DrawFeaturesText=4, | ||
|  | 		DBG_DrawContactPoints=8, | ||
|  | 		DBG_NoDeactivation=16, | ||
|  | 		DBG_NoHelpText = 32, | ||
|  | 		DBG_DrawText=64, | ||
|  | 		DBG_ProfileTimings = 128, | ||
|  | 		DBG_EnableSatComparison = 256, | ||
|  | 		DBG_DisableBulletLCP = 512, | ||
|  | 		DBG_EnableCCD = 1024, | ||
|  | 		DBG_DrawConstraints = (1 << 11), | ||
|  | 		DBG_DrawConstraintLimits = (1 << 12), | ||
|  | 		DBG_FastWireframe = (1<<13), | ||
|  | 		DBG_DrawNormals = (1<<14), | ||
|  | 		DBG_DrawFrames = (1<<15), | ||
|  | 		DBG_MAX_DEBUG_DRAW_MODE | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	virtual ~btIDebugDraw() {}; | ||
|  | 
 | ||
|  | 	 | ||
|  | 	virtual DefaultColors	getDefaultColors() const	{	DefaultColors colors;	return colors;	} | ||
|  | 	///the default implementation for setDefaultColors has no effect. A derived class can implement it and store the colors.
 | ||
|  | 	virtual void setDefaultColors(const DefaultColors& /*colors*/) {} | ||
|  | 	 | ||
|  | 	virtual void	drawLine(const btVector3& from,const btVector3& to,const btVector3& color)=0; | ||
|  | 		 | ||
|  | 	virtual void    drawLine(const btVector3& from,const btVector3& to, const btVector3& fromColor, const btVector3& toColor) | ||
|  | 	{ | ||
|  |         (void) toColor; | ||
|  | 		drawLine (from, to, fromColor); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void	drawSphere(btScalar radius, const btTransform& transform, const btVector3& color) | ||
|  | 	{ | ||
|  | 		 | ||
|  | 		btVector3 center = transform.getOrigin(); | ||
|  | 		btVector3 up = transform.getBasis().getColumn(1); | ||
|  | 		btVector3 axis = transform.getBasis().getColumn(0); | ||
|  | 		btScalar minTh = -SIMD_HALF_PI; | ||
|  | 		btScalar maxTh = SIMD_HALF_PI; | ||
|  | 		btScalar minPs = -SIMD_HALF_PI; | ||
|  | 		btScalar maxPs = SIMD_HALF_PI; | ||
|  | 		btScalar stepDegrees = 30.f; | ||
|  | 		drawSpherePatch(center, up, axis, radius,minTh, maxTh, minPs, maxPs, color, stepDegrees ,false); | ||
|  | 		drawSpherePatch(center, up, -axis, radius,minTh, maxTh, minPs, maxPs, color, stepDegrees,false ); | ||
|  | 	} | ||
|  | 	 | ||
|  | 	virtual void	drawSphere (const btVector3& p, btScalar radius, const btVector3& color) | ||
|  | 	{ | ||
|  | 		btTransform tr; | ||
|  | 		tr.setIdentity(); | ||
|  | 		tr.setOrigin(p); | ||
|  | 		drawSphere(radius,tr,color); | ||
|  | 	} | ||
|  | 	 | ||
|  | 	virtual	void	drawTriangle(const btVector3& v0,const btVector3& v1,const btVector3& v2,const btVector3& /*n0*/,const btVector3& /*n1*/,const btVector3& /*n2*/,const btVector3& color, btScalar alpha) | ||
|  | 	{ | ||
|  | 		drawTriangle(v0,v1,v2,color,alpha); | ||
|  | 	} | ||
|  | 	virtual	void	drawTriangle(const btVector3& v0,const btVector3& v1,const btVector3& v2,const btVector3& color, btScalar /*alpha*/) | ||
|  | 	{ | ||
|  | 		drawLine(v0,v1,color); | ||
|  | 		drawLine(v1,v2,color); | ||
|  | 		drawLine(v2,v0,color); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void	drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)=0; | ||
|  | 
 | ||
|  | 	virtual void	reportErrorWarning(const char* warningString) = 0; | ||
|  | 
 | ||
|  | 	virtual void	draw3dText(const btVector3& location,const char* textString) = 0; | ||
|  | 	 | ||
|  | 	virtual void	setDebugMode(int debugMode) =0; | ||
|  | 	 | ||
|  | 	virtual int		getDebugMode() const = 0; | ||
|  | 
 | ||
|  | 	virtual void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color) | ||
|  | 	{ | ||
|  | 
 | ||
|  | 		btVector3 halfExtents = (to-from)* 0.5f; | ||
|  | 		btVector3 center = (to+from) *0.5f; | ||
|  | 		int i,j; | ||
|  | 
 | ||
|  | 		btVector3 edgecoord(1.f,1.f,1.f),pa,pb; | ||
|  | 		for (i=0;i<4;i++) | ||
|  | 		{ | ||
|  | 			for (j=0;j<3;j++) | ||
|  | 			{ | ||
|  | 				pa = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],		 | ||
|  | 					edgecoord[2]*halfExtents[2]); | ||
|  | 				pa+=center; | ||
|  | 
 | ||
|  | 				int othercoord = j%3; | ||
|  | 				edgecoord[othercoord]*=-1.f; | ||
|  | 				pb = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],	 | ||
|  | 					edgecoord[2]*halfExtents[2]); | ||
|  | 				pb+=center; | ||
|  | 
 | ||
|  | 				drawLine(pa,pb,color); | ||
|  | 			} | ||
|  | 			edgecoord = btVector3(-1.f,-1.f,-1.f); | ||
|  | 			if (i<3) | ||
|  | 				edgecoord[i]*=-1.f; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	virtual void drawTransform(const btTransform& transform, btScalar orthoLen) | ||
|  | 	{ | ||
|  | 		btVector3 start = transform.getOrigin(); | ||
|  | 		drawLine(start, start+transform.getBasis() * btVector3(orthoLen, 0, 0), btVector3(1.f,0.3,0.3)); | ||
|  | 		drawLine(start, start+transform.getBasis() * btVector3(0, orthoLen, 0), btVector3(0.3,1.f, 0.3)); | ||
|  | 		drawLine(start, start+transform.getBasis() * btVector3(0, 0, orthoLen), btVector3(0.3, 0.3,1.f)); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void drawArc(const btVector3& center, const btVector3& normal, const btVector3& axis, btScalar radiusA, btScalar radiusB, btScalar minAngle, btScalar maxAngle,  | ||
|  | 				const btVector3& color, bool drawSect, btScalar stepDegrees = btScalar(10.f)) | ||
|  | 	{ | ||
|  | 		const btVector3& vx = axis; | ||
|  | 		btVector3 vy = normal.cross(axis); | ||
|  | 		btScalar step = stepDegrees * SIMD_RADS_PER_DEG; | ||
|  | 		int nSteps = (int)btFabs((maxAngle - minAngle) / step); | ||
|  | 		if(!nSteps) nSteps = 1; | ||
|  | 		btVector3 prev = center + radiusA * vx * btCos(minAngle) + radiusB * vy * btSin(minAngle); | ||
|  | 		if(drawSect) | ||
|  | 		{ | ||
|  | 			drawLine(center, prev, color); | ||
|  | 		} | ||
|  | 		for(int i = 1; i <= nSteps; i++) | ||
|  | 		{ | ||
|  | 			btScalar angle = minAngle + (maxAngle - minAngle) * btScalar(i) / btScalar(nSteps); | ||
|  | 			btVector3 next = center + radiusA * vx * btCos(angle) + radiusB * vy * btSin(angle); | ||
|  | 			drawLine(prev, next, color); | ||
|  | 			prev = next; | ||
|  | 		} | ||
|  | 		if(drawSect) | ||
|  | 		{ | ||
|  | 			drawLine(center, prev, color); | ||
|  | 		} | ||
|  | 	} | ||
|  | 	virtual void drawSpherePatch(const btVector3& center, const btVector3& up, const btVector3& axis, btScalar radius,  | ||
|  | 		btScalar minTh, btScalar maxTh, btScalar minPs, btScalar maxPs, const btVector3& color, btScalar stepDegrees = btScalar(10.f),bool drawCenter = true) | ||
|  | 	{ | ||
|  | 		btVector3 vA[74]; | ||
|  | 		btVector3 vB[74]; | ||
|  | 		btVector3 *pvA = vA, *pvB = vB, *pT; | ||
|  | 		btVector3 npole = center + up * radius; | ||
|  | 		btVector3 spole = center - up * radius; | ||
|  | 		btVector3 arcStart; | ||
|  | 		btScalar step = stepDegrees * SIMD_RADS_PER_DEG; | ||
|  | 		const btVector3& kv = up; | ||
|  | 		const btVector3& iv = axis; | ||
|  | 		btVector3 jv = kv.cross(iv); | ||
|  | 		bool drawN = false; | ||
|  | 		bool drawS = false; | ||
|  | 		if(minTh <= -SIMD_HALF_PI) | ||
|  | 		{ | ||
|  | 			minTh = -SIMD_HALF_PI + step; | ||
|  | 			drawN = true; | ||
|  | 		} | ||
|  | 		if(maxTh >= SIMD_HALF_PI) | ||
|  | 		{ | ||
|  | 			maxTh = SIMD_HALF_PI - step; | ||
|  | 			drawS = true; | ||
|  | 		} | ||
|  | 		if(minTh > maxTh) | ||
|  | 		{ | ||
|  | 			minTh = -SIMD_HALF_PI + step; | ||
|  | 			maxTh =  SIMD_HALF_PI - step; | ||
|  | 			drawN = drawS = true; | ||
|  | 		} | ||
|  | 		int n_hor = (int)((maxTh - minTh) / step) + 1; | ||
|  | 		if(n_hor < 2) n_hor = 2; | ||
|  | 		btScalar step_h = (maxTh - minTh) / btScalar(n_hor - 1); | ||
|  | 		bool isClosed = false; | ||
|  | 		if(minPs > maxPs) | ||
|  | 		{ | ||
|  | 			minPs = -SIMD_PI + step; | ||
|  | 			maxPs =  SIMD_PI; | ||
|  | 			isClosed = true; | ||
|  | 		} | ||
|  | 		else if((maxPs - minPs) >= SIMD_PI * btScalar(2.f)) | ||
|  | 		{ | ||
|  | 			isClosed = true; | ||
|  | 		} | ||
|  | 		else | ||
|  | 		{ | ||
|  | 			isClosed = false; | ||
|  | 		} | ||
|  | 		int n_vert = (int)((maxPs - minPs) / step) + 1; | ||
|  | 		if(n_vert < 2) n_vert = 2; | ||
|  | 		btScalar step_v = (maxPs - minPs) / btScalar(n_vert - 1); | ||
|  | 		for(int i = 0; i < n_hor; i++) | ||
|  | 		{ | ||
|  | 			btScalar th = minTh + btScalar(i) * step_h; | ||
|  | 			btScalar sth = radius * btSin(th); | ||
|  | 			btScalar cth = radius * btCos(th); | ||
|  | 			for(int j = 0; j < n_vert; j++) | ||
|  | 			{ | ||
|  | 				btScalar psi = minPs + btScalar(j) * step_v; | ||
|  | 				btScalar sps = btSin(psi); | ||
|  | 				btScalar cps = btCos(psi); | ||
|  | 				pvB[j] = center + cth * cps * iv + cth * sps * jv + sth * kv; | ||
|  | 				if(i) | ||
|  | 				{ | ||
|  | 					drawLine(pvA[j], pvB[j], color); | ||
|  | 				} | ||
|  | 				else if(drawS) | ||
|  | 				{ | ||
|  | 					drawLine(spole, pvB[j], color); | ||
|  | 				} | ||
|  | 				if(j) | ||
|  | 				{ | ||
|  | 					drawLine(pvB[j-1], pvB[j], color); | ||
|  | 				} | ||
|  | 				else | ||
|  | 				{ | ||
|  | 					arcStart = pvB[j]; | ||
|  | 				} | ||
|  | 				if((i == (n_hor - 1)) && drawN) | ||
|  | 				{ | ||
|  | 					drawLine(npole, pvB[j], color); | ||
|  | 				} | ||
|  | 				 | ||
|  | 				if (drawCenter) | ||
|  | 				{ | ||
|  | 					if(isClosed) | ||
|  | 					{ | ||
|  | 						if(j == (n_vert-1)) | ||
|  | 						{ | ||
|  | 							drawLine(arcStart, pvB[j], color); | ||
|  | 						} | ||
|  | 					} | ||
|  | 					else | ||
|  | 					{ | ||
|  | 						if(((!i) || (i == (n_hor-1))) && ((!j) || (j == (n_vert-1)))) | ||
|  | 						{ | ||
|  | 							drawLine(center, pvB[j], color); | ||
|  | 						} | ||
|  | 					} | ||
|  | 				} | ||
|  | 			} | ||
|  | 			pT = pvA; pvA = pvB; pvB = pT; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	 | ||
|  |    | ||
|  | 	virtual void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btVector3& color) | ||
|  | 	{ | ||
|  | 		drawLine(btVector3(bbMin[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMin[1], bbMin[2]), color); | ||
|  | 		drawLine(btVector3(bbMax[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMax[1], bbMin[2]), color); | ||
|  | 		drawLine(btVector3(bbMax[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMax[1], bbMin[2]), color); | ||
|  | 		drawLine(btVector3(bbMin[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMin[1], bbMin[2]), color); | ||
|  | 		drawLine(btVector3(bbMin[0], bbMin[1], bbMin[2]), btVector3(bbMin[0], bbMin[1], bbMax[2]), color); | ||
|  | 		drawLine(btVector3(bbMax[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMin[1], bbMax[2]), color); | ||
|  | 		drawLine(btVector3(bbMax[0], bbMax[1], bbMin[2]), btVector3(bbMax[0], bbMax[1], bbMax[2]), color); | ||
|  | 		drawLine(btVector3(bbMin[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMax[1], bbMax[2]), color); | ||
|  | 		drawLine(btVector3(bbMin[0], bbMin[1], bbMax[2]), btVector3(bbMax[0], bbMin[1], bbMax[2]), color); | ||
|  | 		drawLine(btVector3(bbMax[0], bbMin[1], bbMax[2]), btVector3(bbMax[0], bbMax[1], bbMax[2]), color); | ||
|  | 		drawLine(btVector3(bbMax[0], bbMax[1], bbMax[2]), btVector3(bbMin[0], bbMax[1], bbMax[2]), color); | ||
|  | 		drawLine(btVector3(bbMin[0], bbMax[1], bbMax[2]), btVector3(bbMin[0], bbMin[1], bbMax[2]), color); | ||
|  | 	} | ||
|  | 	virtual void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btTransform& trans, const btVector3& color) | ||
|  | 	{ | ||
|  | 		drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), color); | ||
|  | 		drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), color); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void drawCapsule(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color) | ||
|  | 	{ | ||
|  | 		int stepDegrees = 30; | ||
|  | 
 | ||
|  | 		btVector3 capStart(0.f,0.f,0.f); | ||
|  | 		capStart[upAxis] = -halfHeight; | ||
|  | 
 | ||
|  | 		btVector3 capEnd(0.f,0.f,0.f); | ||
|  | 		capEnd[upAxis] = halfHeight; | ||
|  | 
 | ||
|  | 		// Draw the ends
 | ||
|  | 		{ | ||
|  | 
 | ||
|  | 			btTransform childTransform = transform; | ||
|  | 			childTransform.getOrigin() = transform * capStart; | ||
|  | 			{ | ||
|  | 				btVector3 center = childTransform.getOrigin(); | ||
|  | 				btVector3 up = childTransform.getBasis().getColumn((upAxis+1)%3); | ||
|  | 				btVector3 axis = -childTransform.getBasis().getColumn(upAxis); | ||
|  | 				btScalar minTh = -SIMD_HALF_PI; | ||
|  | 				btScalar maxTh = SIMD_HALF_PI; | ||
|  | 				btScalar minPs = -SIMD_HALF_PI; | ||
|  | 				btScalar maxPs = SIMD_HALF_PI; | ||
|  | 				 | ||
|  | 				drawSpherePatch(center, up, axis, radius,minTh, maxTh, minPs, maxPs, color, btScalar(stepDegrees) ,false); | ||
|  | 			} | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		{ | ||
|  | 			btTransform childTransform = transform; | ||
|  | 			childTransform.getOrigin() = transform * capEnd; | ||
|  | 			{ | ||
|  | 				btVector3 center = childTransform.getOrigin(); | ||
|  | 				btVector3 up = childTransform.getBasis().getColumn((upAxis+1)%3); | ||
|  | 				btVector3 axis = childTransform.getBasis().getColumn(upAxis); | ||
|  | 				btScalar minTh = -SIMD_HALF_PI; | ||
|  | 				btScalar maxTh = SIMD_HALF_PI; | ||
|  | 				btScalar minPs = -SIMD_HALF_PI; | ||
|  | 				btScalar maxPs = SIMD_HALF_PI; | ||
|  | 				drawSpherePatch(center, up, axis, radius,minTh, maxTh, minPs, maxPs, color, btScalar(stepDegrees) ,false); | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Draw some additional lines
 | ||
|  | 		btVector3 start = transform.getOrigin(); | ||
|  | 
 | ||
|  | 		for (int i=0;i<360;i+=stepDegrees) | ||
|  | 		{ | ||
|  | 			capEnd[(upAxis+1)%3] = capStart[(upAxis+1)%3] = btSin(btScalar(i)*SIMD_RADS_PER_DEG)*radius; | ||
|  | 			capEnd[(upAxis+2)%3] = capStart[(upAxis+2)%3]  = btCos(btScalar(i)*SIMD_RADS_PER_DEG)*radius; | ||
|  | 			drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color); | ||
|  | 		} | ||
|  | 		 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void drawCylinder(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color) | ||
|  | 	{ | ||
|  | 		btVector3 start = transform.getOrigin(); | ||
|  | 		btVector3	offsetHeight(0,0,0); | ||
|  | 		offsetHeight[upAxis] = halfHeight; | ||
|  | 		int stepDegrees=30; | ||
|  | 		btVector3 capStart(0.f,0.f,0.f); | ||
|  | 		capStart[upAxis] = -halfHeight; | ||
|  | 		btVector3 capEnd(0.f,0.f,0.f); | ||
|  | 		capEnd[upAxis] = halfHeight; | ||
|  | 
 | ||
|  | 		for (int i=0;i<360;i+=stepDegrees) | ||
|  | 		{ | ||
|  | 			capEnd[(upAxis+1)%3] = capStart[(upAxis+1)%3] = btSin(btScalar(i)*SIMD_RADS_PER_DEG)*radius; | ||
|  | 			capEnd[(upAxis+2)%3] = capStart[(upAxis+2)%3]  = btCos(btScalar(i)*SIMD_RADS_PER_DEG)*radius; | ||
|  | 			drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color); | ||
|  | 		} | ||
|  | 		// Drawing top and bottom caps of the cylinder
 | ||
|  | 		btVector3 yaxis(0,0,0); | ||
|  | 		yaxis[upAxis] = btScalar(1.0); | ||
|  | 		btVector3 xaxis(0,0,0); | ||
|  | 		xaxis[(upAxis+1)%3] = btScalar(1.0); | ||
|  | 		drawArc(start-transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,btScalar(10.0)); | ||
|  | 		drawArc(start+transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,btScalar(10.0)); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void drawCone(btScalar radius, btScalar height, int upAxis, const btTransform& transform, const btVector3& color) | ||
|  | 	{ | ||
|  | 		int stepDegrees = 30; | ||
|  | 		btVector3 start = transform.getOrigin(); | ||
|  | 
 | ||
|  | 		btVector3	offsetHeight(0,0,0); | ||
|  | 		btScalar halfHeight = height * btScalar(0.5); | ||
|  | 		offsetHeight[upAxis] = halfHeight; | ||
|  | 		btVector3	offsetRadius(0,0,0); | ||
|  | 		offsetRadius[(upAxis+1)%3] = radius; | ||
|  | 		btVector3	offset2Radius(0,0,0); | ||
|  | 		offset2Radius[(upAxis+2)%3] = radius; | ||
|  | 
 | ||
|  | 
 | ||
|  | 		btVector3 capEnd(0.f,0.f,0.f); | ||
|  | 		capEnd[upAxis] = -halfHeight; | ||
|  | 
 | ||
|  | 		for (int i=0;i<360;i+=stepDegrees) | ||
|  | 		{ | ||
|  | 			capEnd[(upAxis+1)%3] = btSin(btScalar(i)*SIMD_RADS_PER_DEG)*radius; | ||
|  | 			capEnd[(upAxis+2)%3] = btCos(btScalar(i)*SIMD_RADS_PER_DEG)*radius; | ||
|  | 			drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * capEnd, color); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight+offsetRadius),color); | ||
|  | 		drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight-offsetRadius),color); | ||
|  | 		drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight+offset2Radius),color); | ||
|  | 		drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight-offset2Radius),color); | ||
|  | 
 | ||
|  | 		// Drawing the base of the cone
 | ||
|  | 		btVector3 yaxis(0,0,0); | ||
|  | 		yaxis[upAxis] = btScalar(1.0); | ||
|  | 		btVector3 xaxis(0,0,0); | ||
|  | 		xaxis[(upAxis+1)%3] = btScalar(1.0); | ||
|  | 		drawArc(start-transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,10.0); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void drawPlane(const btVector3& planeNormal, btScalar planeConst, const btTransform& transform, const btVector3& color) | ||
|  | 	{ | ||
|  | 		btVector3 planeOrigin = planeNormal * planeConst; | ||
|  | 		btVector3 vec0,vec1; | ||
|  | 		btPlaneSpace1(planeNormal,vec0,vec1); | ||
|  | 		btScalar vecLen = 100.f; | ||
|  | 		btVector3 pt0 = planeOrigin + vec0*vecLen; | ||
|  | 		btVector3 pt1 = planeOrigin - vec0*vecLen; | ||
|  | 		btVector3 pt2 = planeOrigin + vec1*vecLen; | ||
|  | 		btVector3 pt3 = planeOrigin - vec1*vecLen; | ||
|  | 		drawLine(transform*pt0,transform*pt1,color); | ||
|  | 		drawLine(transform*pt2,transform*pt3,color); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void clearLines() | ||
|  | 	{ | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void flushLines() | ||
|  | 	{ | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif //BT_IDEBUG_DRAW__H
 | ||
|  | 
 |