mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 10:56:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			223 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
	
		
			8 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
 |