224 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			224 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | //
 | ||
|  | // Copyright (c) 2009-2010 Mikko Mononen memon@inside.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 DEBUGDRAW_H
 | ||
|  | #define DEBUGDRAW_H
 | ||
|  | 
 | ||
|  | // Some math headers don't have PI defined.
 | ||
|  | static const float DU_PI = 3.14159265f; | ||
|  | 
 | ||
|  | enum duDebugDrawPrimitives | ||
|  | { | ||
|  | 	DU_DRAW_POINTS, | ||
|  | 	DU_DRAW_LINES, | ||
|  | 	DU_DRAW_TRIS, | ||
|  | 	DU_DRAW_QUADS,	 | ||
|  | }; | ||
|  | 
 | ||
|  | /// Abstract debug draw interface.
 | ||
|  | struct duDebugDraw | ||
|  | { | ||
|  | 	virtual ~duDebugDraw() = 0; | ||
|  | 	 | ||
|  | 	virtual void depthMask(bool state) = 0; | ||
|  | 
 | ||
|  | 	virtual void texture(bool state) = 0; | ||
|  | 
 | ||
|  | 	/// Begin drawing primitives.
 | ||
|  | 	///  @param prim [in] primitive type to draw, one of rcDebugDrawPrimitives.
 | ||
|  | 	///  @param size [in] size of a primitive, applies to point size and line width only.
 | ||
|  | 	virtual void begin(duDebugDrawPrimitives prim, float size = 1.0f) = 0; | ||
|  | 
 | ||
|  | 	/// Submit a vertex
 | ||
|  | 	///  @param pos [in] position of the verts.
 | ||
|  | 	///  @param color [in] color of the verts.
 | ||
|  | 	virtual void vertex(const float* pos, unsigned int color) = 0; | ||
|  | 
 | ||
|  | 	/// Submit a vertex
 | ||
|  | 	///  @param x,y,z [in] position of the verts.
 | ||
|  | 	///  @param color [in] color of the verts.
 | ||
|  | 	virtual void vertex(const float x, const float y, const float z, unsigned int color) = 0; | ||
|  | 
 | ||
|  | 	/// Submit a vertex
 | ||
|  | 	///  @param pos [in] position of the verts.
 | ||
|  | 	///  @param color [in] color of the verts.
 | ||
|  | 	virtual void vertex(const float* pos, unsigned int color, const float* uv) = 0; | ||
|  | 	 | ||
|  | 	/// Submit a vertex
 | ||
|  | 	///  @param x,y,z [in] position of the verts.
 | ||
|  | 	///  @param color [in] color of the verts.
 | ||
|  | 	virtual void vertex(const float x, const float y, const float z, unsigned int color, const float u, const float v) = 0; | ||
|  | 	 | ||
|  | 	/// End drawing primitives.
 | ||
|  | 	virtual void end() = 0; | ||
|  | 
 | ||
|  | 	/// Compute a color for given area.
 | ||
|  | 	virtual unsigned int areaToCol(unsigned int area); | ||
|  | }; | ||
|  | 
 | ||
|  | inline unsigned int duRGBA(int r, int g, int b, int a) | ||
|  | { | ||
|  | 	return ((unsigned int)r) | ((unsigned int)g << 8) | ((unsigned int)b << 16) | ((unsigned int)a << 24); | ||
|  | } | ||
|  | 
 | ||
|  | inline unsigned int duRGBAf(float fr, float fg, float fb, float fa) | ||
|  | { | ||
|  | 	unsigned char r = (unsigned char)(fr*255.0f); | ||
|  | 	unsigned char g = (unsigned char)(fg*255.0f); | ||
|  | 	unsigned char b = (unsigned char)(fb*255.0f); | ||
|  | 	unsigned char a = (unsigned char)(fa*255.0f); | ||
|  | 	return duRGBA(r,g,b,a); | ||
|  | } | ||
|  | 
 | ||
|  | unsigned int duIntToCol(int i, int a); | ||
|  | void duIntToCol(int i, float* col); | ||
|  | 
 | ||
|  | inline unsigned int duMultCol(const unsigned int col, const unsigned int d) | ||
|  | { | ||
|  | 	const unsigned int r = col & 0xff; | ||
|  | 	const unsigned int g = (col >> 8) & 0xff; | ||
|  | 	const unsigned int b = (col >> 16) & 0xff; | ||
|  | 	const unsigned int a = (col >> 24) & 0xff; | ||
|  | 	return duRGBA((r*d) >> 8, (g*d) >> 8, (b*d) >> 8, a); | ||
|  | } | ||
|  | 
 | ||
|  | inline unsigned int duDarkenCol(unsigned int col) | ||
|  | { | ||
|  | 	return ((col >> 1) & 0x007f7f7f) | (col & 0xff000000); | ||
|  | } | ||
|  | 
 | ||
|  | inline unsigned int duLerpCol(unsigned int ca, unsigned int cb, unsigned int u) | ||
|  | { | ||
|  | 	const unsigned int ra = ca & 0xff; | ||
|  | 	const unsigned int ga = (ca >> 8) & 0xff; | ||
|  | 	const unsigned int ba = (ca >> 16) & 0xff; | ||
|  | 	const unsigned int aa = (ca >> 24) & 0xff; | ||
|  | 	const unsigned int rb = cb & 0xff; | ||
|  | 	const unsigned int gb = (cb >> 8) & 0xff; | ||
|  | 	const unsigned int bb = (cb >> 16) & 0xff; | ||
|  | 	const unsigned int ab = (cb >> 24) & 0xff; | ||
|  | 	 | ||
|  | 	unsigned int r = (ra*(255-u) + rb*u)/255; | ||
|  | 	unsigned int g = (ga*(255-u) + gb*u)/255; | ||
|  | 	unsigned int b = (ba*(255-u) + bb*u)/255; | ||
|  | 	unsigned int a = (aa*(255-u) + ab*u)/255; | ||
|  | 	return duRGBA(r,g,b,a); | ||
|  | } | ||
|  | 
 | ||
|  | inline unsigned int duTransCol(unsigned int c, unsigned int a) | ||
|  | { | ||
|  | 	return (a<<24) | (c & 0x00ffffff); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | void duCalcBoxColors(unsigned int* colors, unsigned int colTop, unsigned int colSide); | ||
|  | 
 | ||
|  | void duDebugDrawCylinderWire(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 							 float maxx, float maxy, float maxz, unsigned int col, const float lineWidth); | ||
|  | 
 | ||
|  | void duDebugDrawBoxWire(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 						float maxx, float maxy, float maxz, unsigned int col, const float lineWidth); | ||
|  | 
 | ||
|  | void duDebugDrawArc(struct duDebugDraw* dd, const float x0, const float y0, const float z0, | ||
|  | 					const float x1, const float y1, const float z1, const float h, | ||
|  | 					const float as0, const float as1, unsigned int col, const float lineWidth); | ||
|  | 
 | ||
|  | void duDebugDrawArrow(struct duDebugDraw* dd, const float x0, const float y0, const float z0, | ||
|  | 					  const float x1, const float y1, const float z1, | ||
|  | 					  const float as0, const float as1, unsigned int col, const float lineWidth); | ||
|  | 
 | ||
|  | void duDebugDrawCircle(struct duDebugDraw* dd, const float x, const float y, const float z, | ||
|  | 					   const float r, unsigned int col, const float lineWidth); | ||
|  | 
 | ||
|  | void duDebugDrawCross(struct duDebugDraw* dd, const float x, const float y, const float z, | ||
|  | 					  const float size, unsigned int col, const float lineWidth); | ||
|  | 
 | ||
|  | void duDebugDrawBox(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 					float maxx, float maxy, float maxz, const unsigned int* fcol); | ||
|  | 
 | ||
|  | void duDebugDrawCylinder(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 						 float maxx, float maxy, float maxz, unsigned int col); | ||
|  | 
 | ||
|  | void duDebugDrawGridXZ(struct duDebugDraw* dd, const float ox, const float oy, const float oz, | ||
|  | 					   const int w, const int h, const float size, | ||
|  | 					   const unsigned int col, const float lineWidth); | ||
|  | 
 | ||
|  | 
 | ||
|  | // Versions without begin/end, can be used to draw multiple primitives.
 | ||
|  | void duAppendCylinderWire(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 						  float maxx, float maxy, float maxz, unsigned int col); | ||
|  | 
 | ||
|  | void duAppendBoxWire(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 					 float maxx, float maxy, float maxz, unsigned int col); | ||
|  | 
 | ||
|  | void duAppendBoxPoints(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 					   float maxx, float maxy, float maxz, unsigned int col); | ||
|  | 
 | ||
|  | void duAppendArc(struct duDebugDraw* dd, const float x0, const float y0, const float z0, | ||
|  | 				 const float x1, const float y1, const float z1, const float h, | ||
|  | 				 const float as0, const float as1, unsigned int col); | ||
|  | 
 | ||
|  | void duAppendArrow(struct duDebugDraw* dd, const float x0, const float y0, const float z0, | ||
|  | 				   const float x1, const float y1, const float z1, | ||
|  | 				   const float as0, const float as1, unsigned int col); | ||
|  | 
 | ||
|  | void duAppendCircle(struct duDebugDraw* dd, const float x, const float y, const float z, | ||
|  | 					const float r, unsigned int col); | ||
|  | 
 | ||
|  | void duAppendCross(struct duDebugDraw* dd, const float x, const float y, const float z, | ||
|  | 				   const float size, unsigned int col); | ||
|  | 
 | ||
|  | void duAppendBox(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 				 float maxx, float maxy, float maxz, const unsigned int* fcol); | ||
|  | 
 | ||
|  | void duAppendCylinder(struct duDebugDraw* dd, float minx, float miny, float minz, | ||
|  | 					  float maxx, float maxy, float maxz, unsigned int col); | ||
|  | 
 | ||
|  | 
 | ||
|  | class duDisplayList : public duDebugDraw | ||
|  | { | ||
|  | 	float* m_pos; | ||
|  | 	unsigned int* m_color; | ||
|  | 	int m_size; | ||
|  | 	int m_cap; | ||
|  | 
 | ||
|  | 	bool m_depthMask; | ||
|  | 	duDebugDrawPrimitives m_prim; | ||
|  | 	float m_primSize; | ||
|  | 	 | ||
|  | 	void resize(int cap); | ||
|  | 	 | ||
|  | public: | ||
|  | 	duDisplayList(int cap = 512); | ||
|  | 	~duDisplayList(); | ||
|  | 	virtual void depthMask(bool state); | ||
|  | 	virtual void begin(duDebugDrawPrimitives prim, float size = 1.0f); | ||
|  | 	virtual void vertex(const float x, const float y, const float z, unsigned int color); | ||
|  | 	virtual void vertex(const float* pos, unsigned int color); | ||
|  | 	virtual void end(); | ||
|  | 	void clear(); | ||
|  | 	void draw(struct duDebugDraw* dd); | ||
|  | private: | ||
|  | 	// Explicitly disabled copy constructor and copy assignment operator.
 | ||
|  | 	duDisplayList(const duDisplayList&); | ||
|  | 	duDisplayList& operator=(const duDisplayList&); | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif // DEBUGDRAW_H
 |