Browse Source

DebugDraw: Added spin, and quad.

Branimir Karadžić 9 years ago
parent
commit
b063d2b029

+ 13 - 6
examples/29-debugdraw/debugdraw.cpp

@@ -171,13 +171,18 @@ class DebugDrawApp : public entry::AppI
 			ddSetColor(0xffffffff);
 
 			ddPush();
-				ddSetStipple(true, 1.0f, time*0.1f);
-				ddSetColor(0xff0000ff);
-				{
-					float normal[3] = {  0.0f, 0.0f, 1.0f };
-					float center[3] = { -8.0f, 0.0f, 0.0f };
+			{
+				float normal[3] = {  0.0f, 0.0f, 1.0f };
+				float center[3] = { -8.0f, 0.0f, 0.0f };
+				ddPush();
+					ddSetStipple(true, 1.0f, time*0.1f);
+					ddSetColor(0xff0000ff);
 					ddDrawCircle(normal, center, 1.0f, 0.5f + bx::fsin(time*10.0f) );
-				}
+				ddPop();
+
+				ddSetSpin(time);
+				ddDrawQuad(normal, center, 2.0f);
+			}
 			ddPop();
 
 			ddPush();
@@ -187,6 +192,7 @@ class DebugDrawApp : public entry::AppI
 
 			ddPush();
 				ddSetLod(UINT8_MAX);
+				ddSetSpin(time*0.3f);
 				{
 					float from[3] = { -11.0f, 4.0f,  0.0f };
 					float to[3]   = { -13.0f, 6.0f,  1.0f };
@@ -233,6 +239,7 @@ class DebugDrawApp : public entry::AppI
 			ddPop();
 
 			ddDrawOrb(-11.0f, 0.0f, 0.0f, 1.0f);
+
 			ddEnd();
 
 			// Advance to next frame. Rendering thread will be kicked to

+ 0 - 3
examples/common/bounds.h

@@ -100,9 +100,6 @@ void calcMaxBoundingSphere(Sphere& _sphere, const void* _vertices, uint32_t _num
 /// Calculate minimum bounding sphere.
 void calcMinBoundingSphere(Sphere& _sphere, const void* _vertices, uint32_t _numVertices, uint32_t _stride, float _step = 0.01f);
 
-/// Calculate coplanar U/V vectors.
-void calcPlaneUv(const Plane& _plane, float* _udir, float* _vdir);
-
 /// Returns 6 (near, far, left, right, top, bottom) planes representing frustum planes.
 void buildFrustumPlanes(Plane* _planes, const float* _viewProj);
 

+ 68 - 6
examples/common/debugdraw/debugdraw.cpp

@@ -683,6 +683,7 @@ struct DebugDraw
 			| BGFX_STATE_DEPTH_WRITE
 			;
 		attrib.m_scale     = 1.0f;
+		attrib.m_spin      = 0.0f;
 		attrib.m_offset    = 0.0f;
 		attrib.m_abgr      = UINT32_MAX;
 		attrib.m_stipple   = false;
@@ -820,6 +821,12 @@ struct DebugDraw
 		attrib.m_scale   = _scale;
 	}
 
+	void setSpin(float _spin)
+	{
+		Attrib& attrib = m_attrib[m_stack];
+		attrib.m_spin = _spin;
+	}
+
 	void moveTo(float _x, float _y, float _z = 0.0f)
 	{
 		BX_CHECK(State::Count != m_state);
@@ -1126,10 +1133,9 @@ struct DebugDraw
 		const float step = bx::pi * 2.0f / num;
 		_weight = bx::fclamp(_weight, 0.0f, 2.0f);
 
-		Plane plane = { { _normal[0], _normal[1], _normal[2] }, 0.0f };
 		float udir[3];
 		float vdir[3];
-		calcPlaneUv(plane, udir, vdir);
+		bx::vec3TangentFrame(_normal, udir, vdir, attrib.m_spin);
 
 		float pos[3];
 		float tmp0[3];
@@ -1201,6 +1207,50 @@ struct DebugDraw
 		close();
 	}
 
+	void drawQuad(const float* _normal, const float* _center, float _size)
+	{
+		const Attrib& attrib = m_attrib[m_stack];
+
+		float udir[3];
+		float vdir[3];
+
+		bx::vec3TangentFrame(_normal, udir, vdir, attrib.m_spin);
+
+		const float halfExtent = _size*0.5f;
+
+		float umin[3];
+		bx::vec3Mul(umin, udir, -halfExtent);
+
+		float umax[3];
+		bx::vec3Mul(umax, udir,  halfExtent);
+
+		float vmin[3];
+		bx::vec3Mul(vmin, vdir, -halfExtent);
+
+		float vmax[3];
+		bx::vec3Mul(vmax, vdir,  halfExtent);
+
+		float pt[3];
+		float tmp[3];
+		bx::vec3Add(tmp, umin, vmin);
+		bx::vec3Add(pt, _center, tmp);
+		moveTo(pt);
+
+		bx::vec3Add(tmp, umax, vmin);
+		bx::vec3Add(pt, _center, tmp);
+		lineTo(pt);
+
+		bx::vec3Add(tmp, umax, vmax);
+		bx::vec3Add(pt, _center, tmp);
+		lineTo(pt);
+
+		bx::vec3Add(tmp, umin, vmax);
+		bx::vec3Add(pt, _center, tmp);
+		lineTo(pt);
+
+		close();
+	}
+
 	void drawCone(const float* _from, const float* _to, float _radius)
 	{
 		const Attrib& attrib = m_attrib[m_stack];
@@ -1212,7 +1262,7 @@ struct DebugDraw
 		bx::vec3Norm(normal, tmp0);
 
 		float mtx[2][16];
-		bx::mtxFromNormal(mtx[0], normal, _radius, _from);
+		bx::mtxFromNormal(mtx[0], normal, _radius, _from, attrib.m_spin);
 
 		memcpy(mtx[1], mtx[0], 64);
 		mtx[1][12] = _to[0];
@@ -1242,7 +1292,7 @@ struct DebugDraw
 		bx::vec3Norm(normal, tmp0);
 
 		float mtx[2][16];
-		bx::mtxFromNormal(mtx[0], normal, _radius, _from);
+		bx::mtxFromNormal(mtx[0], normal, _radius, _from, attrib.m_spin);
 
 		memcpy(mtx[1], mtx[0], 64);
 		mtx[1][12] = _to[0];
@@ -1340,10 +1390,11 @@ struct DebugDraw
 
 	void drawGrid(const float* _normal, const float* _center, uint32_t _size, float _step)
 	{
+		const Attrib& attrib = m_attrib[m_stack];
+
 		float udir[3];
 		float vdir[3];
-		Plane plane = { { _normal[0], _normal[1], _normal[2] }, 0.0f };
-		calcPlaneUv(plane, udir, vdir);
+		bx::vec3TangentFrame(_normal, udir, vdir, attrib.m_spin);
 
 		bx::vec3Mul(udir, udir, _step);
 		bx::vec3Mul(vdir, vdir, _step);
@@ -1648,6 +1699,7 @@ private:
 		uint64_t m_state;
 		float    m_offset;
 		float    m_scale;
+		float    m_spin;
 		uint32_t m_abgr;
 		bool     m_stipple;
 		bool     m_wireframe;
@@ -1726,6 +1778,11 @@ void ddSetStipple(bool _stipple, float _scale, float _offset)
 	s_dd.setStipple(_stipple, _scale, _offset);
 }
 
+void ddSetSpin(float _spin)
+{
+	s_dd.setSpin(_spin);
+}
+
 void ddSetTransform(const void* _mtx)
 {
 	s_dd.setTransform(_mtx);
@@ -1806,6 +1863,11 @@ void ddDrawCircle(Axis::Enum _axis, float _x, float _y, float _z, float _radius,
 	s_dd.drawCircle(_axis, _x, _y, _z, _radius, _weight);
 }
 
+void ddDrawQuad(const float* _normal, const float* _center, float _size)
+{
+	s_dd.drawQuad(_normal, _center, _size);
+}
+
 void ddDrawCone(const void* _from, const void* _to, float _radius)
 {
 	s_dd.drawCone(_from, _to, _radius);

+ 6 - 0
examples/common/debugdraw/debugdraw.h

@@ -54,6 +54,9 @@ void ddSetWireframe(bool _wireframe);
 ///
 void ddSetStipple(bool _stipple, float _scale = 1.0f, float _offset = 0.0f);
 
+///
+void ddSetSpin(float _spin);
+
 ///
 void ddSetTransform(const void* _mtx);
 
@@ -102,6 +105,9 @@ void ddDrawCircle(const void* _normal, const void* _center, float _radius, float
 ///
 void ddDrawCircle(Axis::Enum _axis, float _x, float _y, float _z, float _radius, float _weight = 0.0f);
 
+///
+void ddDrawQuad(const float* _normal, const float* _center, float _size);
+
 ///
 void ddDrawCone(const void* _from, const void* _to, float _radius);