123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- //
- // 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
|