Browse Source

Added AABox debug draw rendering

Marko Pintera 12 năm trước cách đây
mục cha
commit
200d516c80

+ 21 - 0
BansheeEngine/Include/BsDrawHelper3D.h

@@ -11,6 +11,22 @@ namespace BansheeEngine
 	class BS_EXPORT DrawHelper3D : public DrawHelperTemplate<CM::Vector3>, public CM::Module<DrawHelper3D>
 	class BS_EXPORT DrawHelper3D : public DrawHelperTemplate<CM::Vector3>, public CM::Module<DrawHelper3D>
 	{
 	{
 	public:
 	public:
+		/**
+		 * @brief	Fills the mesh data with vertices representing an axis aligned box.
+		 *
+		 * @param	aabox			Axis aligned box to get the mesh data for
+		 * @param	color			Color of the line.
+		 * @param	meshData		Mesh data that will be populated.
+		 * @param	vertexOffset	Offset in number of vertices from the start of the buffer to start writing at.
+		 * @param	indexOffset 	Offset in number of indices from the start of the buffer to start writing at.
+		 * 							
+		 * @note	Provided MeshData must have some specific elements at least:
+		 * 			  Vector3 VES_POSITION
+		 * 			  32bit index buffer
+		 * 			  Enough space for 8 vertices and 36 indices
+		 */
+		void aabox(const CM::AABox& box, const CM::MeshDataPtr& meshData, CM::UINT32 vertexOffset, CM::UINT32 indexOffset);
+
 		/**
 		/**
 		 * @brief	Fills the mesh data with vertices representing a per-pixel line.
 		 * @brief	Fills the mesh data with vertices representing a per-pixel line.
 		 *
 		 *
@@ -92,6 +108,8 @@ namespace BansheeEngine
 		void drawLineList_AA(const HCamera& camera, const CM::Vector<CM::Vector3>::type& linePoints, float width, float borderWidth, 
 		void drawLineList_AA(const HCamera& camera, const CM::Vector<CM::Vector3>::type& linePoints, float width, float borderWidth, 
 			const CM::Color& color = CM::Color::White, float timeout = 0.0f);
 			const CM::Color& color = CM::Color::White, float timeout = 0.0f);
 
 
+		void drawAABox(const HCamera& camera, const CM::AABox& box, const CM::Color& color = CM::Color::White, float timeout = 0.0f);
+
 	private:
 	private:
 		CM::Vector3 calcCenter(CM::UINT8* vertices, CM::UINT32 numVertices, CM::UINT32 vertexStride);
 		CM::Vector3 calcCenter(CM::UINT8* vertices, CM::UINT32 numVertices, CM::UINT32 vertexStride);
 
 
@@ -101,5 +119,8 @@ namespace BansheeEngine
 
 
 		void polygon_AA(const CM::Vector<CM::Vector3>::type& points, float borderWidth, const CM::Color& color, CM::UINT8* outVertices, CM::UINT8* outColors, 
 		void polygon_AA(const CM::Vector<CM::Vector3>::type& points, float borderWidth, const CM::Color& color, CM::UINT8* outVertices, CM::UINT8* outColors, 
 			CM::UINT32 vertexOffset, CM::UINT32 vertexStride, CM::UINT32* outIndices, CM::UINT32 indexOffset);
 			CM::UINT32 vertexOffset, CM::UINT32 vertexStride, CM::UINT32* outIndices, CM::UINT32 indexOffset);
+
+		void aabox(const CM::AABox& box, CM::UINT8* outVertices, CM::UINT32 vertexOffset, CM::UINT32 vertexStride, 
+			CM::UINT32* outIndices, CM::UINT32 indexOffset);
 	};
 	};
 }
 }

+ 0 - 7
BansheeEngine/Source/BsD3D11BuiltinMaterialFactory.cpp

@@ -366,12 +366,5 @@ namespace BansheeEngine
 
 
 		HBlendState blendState = BlendState::create(desc);
 		HBlendState blendState = BlendState::create(desc);
 		newPass->setBlendState(blendState);
 		newPass->setBlendState(blendState);
-
-		DEPTH_STENCIL_STATE_DESC depthStateDesc;
-		depthStateDesc.depthReadEnable = false;
-		depthStateDesc.depthWriteEnable = false;
-
-		HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
-		newPass->setDepthStencilState(depthState);
 	}
 	}
 }
 }

+ 0 - 7
BansheeEngine/Source/BsD3D9BuiltinMaterialFactory.cpp

@@ -364,12 +364,5 @@ namespace BansheeEngine
 
 
 		HBlendState blendState = BlendState::create(desc);
 		HBlendState blendState = BlendState::create(desc);
 		newPass->setBlendState(blendState);
 		newPass->setBlendState(blendState);
-
-		DEPTH_STENCIL_STATE_DESC depthStateDesc;
-		depthStateDesc.depthReadEnable = false;
-		depthStateDesc.depthWriteEnable = false;
-
-		HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
-		newPass->setDepthStencilState(depthState);
 	}
 	}
 }
 }

+ 156 - 4
BansheeEngine/Source/BsDrawHelper3D.cpp

@@ -15,6 +15,17 @@ using namespace CamelotFramework;
 
 
 namespace BansheeEngine
 namespace BansheeEngine
 {
 {
+	void DrawHelper3D::aabox(const CM::AABox& box, const CM::MeshDataPtr& meshData, CM::UINT32 vertexOffset, CM::UINT32 indexOffset)
+	{
+		UINT32* indexData = meshData->getIndices32();
+		UINT8* positionData = meshData->getElementData(VES_POSITION);
+
+		assert((vertexOffset + 8) <= meshData->getNumVertices());
+		assert((indexOffset + 36) <= meshData->getNumIndices());	
+
+		aabox(box, positionData, vertexOffset, meshData->getVertexStride(), indexData, indexOffset);
+	}
+
 	void DrawHelper3D::line_Pixel(const Vector3& a, const Vector3& b, const CM::Color& color, const CM::MeshDataPtr& meshData, CM::UINT32 vertexOffset, CM::UINT32 indexOffset)
 	void DrawHelper3D::line_Pixel(const Vector3& a, const Vector3& b, const CM::Color& color, const CM::MeshDataPtr& meshData, CM::UINT32 vertexOffset, CM::UINT32 indexOffset)
 	{
 	{
 		DrawHelperTemplate<Vector3>::line_Pixel(a, b, color, meshData, vertexOffset, indexOffset);
 		DrawHelperTemplate<Vector3>::line_Pixel(a, b, color, meshData, vertexOffset, indexOffset);
@@ -54,7 +65,7 @@ namespace BansheeEngine
 		meshData->beginDesc();
 		meshData->beginDesc();
 
 
 		meshData->addSubMesh(2, 0, DOT_LINE_LIST);
 		meshData->addSubMesh(2, 0, DOT_LINE_LIST);
-		meshData->addVertElem(VET_FLOAT2, VES_POSITION);
+		meshData->addVertElem(VET_FLOAT3, VES_POSITION);
 		meshData->addVertElem(VET_COLOR, VES_COLOR);
 		meshData->addVertElem(VET_COLOR, VES_COLOR);
 
 
 		meshData->endDesc();
 		meshData->endDesc();
@@ -89,7 +100,7 @@ namespace BansheeEngine
 		meshData->beginDesc();
 		meshData->beginDesc();
 
 
 		meshData->addSubMesh(30, 0, DOT_TRIANGLE_LIST);
 		meshData->addSubMesh(30, 0, DOT_TRIANGLE_LIST);
-		meshData->addVertElem(VET_FLOAT2, VES_POSITION);
+		meshData->addVertElem(VET_FLOAT3, VES_POSITION);
 		meshData->addVertElem(VET_COLOR, VES_COLOR);
 		meshData->addVertElem(VET_COLOR, VES_COLOR);
 
 
 		meshData->endDesc();
 		meshData->endDesc();
@@ -124,7 +135,7 @@ namespace BansheeEngine
 		meshData->beginDesc();
 		meshData->beginDesc();
 
 
 		meshData->addSubMesh((UINT32)(linePoints.size() * 2), 0, DOT_LINE_LIST);
 		meshData->addSubMesh((UINT32)(linePoints.size() * 2), 0, DOT_LINE_LIST);
-		meshData->addVertElem(VET_FLOAT2, VES_POSITION);
+		meshData->addVertElem(VET_FLOAT3, VES_POSITION);
 		meshData->addVertElem(VET_COLOR, VES_COLOR);
 		meshData->addVertElem(VET_COLOR, VES_COLOR);
 
 
 		meshData->endDesc();
 		meshData->endDesc();
@@ -160,7 +171,7 @@ namespace BansheeEngine
 		meshData->beginDesc();
 		meshData->beginDesc();
 
 
 		meshData->addSubMesh((UINT32)(linePoints.size() * 15), 0, DOT_TRIANGLE_LIST);
 		meshData->addSubMesh((UINT32)(linePoints.size() * 15), 0, DOT_TRIANGLE_LIST);
-		meshData->addVertElem(VET_FLOAT2, VES_POSITION);
+		meshData->addVertElem(VET_FLOAT3, VES_POSITION);
 		meshData->addVertElem(VET_COLOR, VES_COLOR);
 		meshData->addVertElem(VET_COLOR, VES_COLOR);
 
 
 		meshData->endDesc();
 		meshData->endDesc();
@@ -180,6 +191,147 @@ namespace BansheeEngine
 		dbgCmd.material = BuiltinMaterialManager::instance().createDebugDraw3DMaterial();
 		dbgCmd.material = BuiltinMaterialManager::instance().createDebugDraw3DMaterial();
 	}
 	}
 
 
+	void DrawHelper3D::drawAABox(const HCamera& camera, const CM::AABox& box, const CM::Color& color, float timeout)
+	{
+		const Viewport* viewport = camera->getViewport().get();
+
+		Vector<DebugDrawCommand>::type& commands = mCommandsPerViewport[viewport];
+
+		commands.push_back(DebugDrawCommand());
+		DebugDrawCommand& dbgCmd = commands.back();
+		dbgCmd.endTime = gTime().getTime() + timeout;
+
+		MeshDataPtr meshData = cm_shared_ptr<MeshData, ScratchAlloc>(8);
+
+		meshData->beginDesc();
+
+		meshData->addSubMesh(36, 0, DOT_TRIANGLE_LIST);
+		meshData->addVertElem(VET_FLOAT3, VES_POSITION);
+		meshData->addVertElem(VET_COLOR, VES_COLOR);
+
+		meshData->endDesc();
+
+		aabox(box, meshData, 0, 0);	
+
+		UINT32 vertexStride = meshData->getVertexStride();
+		UINT8* colorData = meshData->getElementData(VES_COLOR);
+
+		for(UINT32 i = 0; i < meshData->getNumVertices(); i++)
+		{
+			UINT32* colors = (UINT32*)colorData;
+			(*colors) = color.getAsRGBA();
+
+			colorData += vertexStride;
+		}
+
+		UINT8* positionData = meshData->getElementData(VES_POSITION);
+		dbgCmd.worldCenter = calcCenter(positionData, meshData->getNumVertices(), meshData->getVertexStride());
+
+		HMesh mesh = Mesh::create();
+
+		gMainSyncedCA().writeSubresource(mesh.getInternalPtr(), 0, *meshData);
+		gMainSyncedCA().submitToCoreThread(true);
+
+		dbgCmd.mesh = mesh;
+		dbgCmd.type = DebugDrawType::WorldSpace;
+		dbgCmd.material = BuiltinMaterialManager::instance().createDebugDraw3DMaterial();
+	}
+
+	void DrawHelper3D::aabox(const AABox& box, UINT8* outVertices, UINT32 vertexOffset, UINT32 vertexStride, UINT32* outIndices, UINT32 indexOffset)
+	{
+		outVertices += (vertexOffset * vertexStride);
+
+		Vector3 pt;
+
+		pt = box.getCorner(AABox::FAR_LEFT_BOTTOM);
+		memcpy(outVertices, &pt, sizeof(pt));
+		outVertices += vertexStride;
+
+		pt = box.getCorner(AABox::FAR_RIGHT_BOTTOM);
+		memcpy(outVertices, &pt, sizeof(pt));
+		outVertices += vertexStride;
+
+		pt = box.getCorner(AABox::FAR_LEFT_TOP);
+		memcpy(outVertices, &pt, sizeof(pt));
+		outVertices += vertexStride;
+
+		pt = box.getCorner(AABox::FAR_RIGHT_TOP);
+		memcpy(outVertices, &pt, sizeof(pt));
+		outVertices += vertexStride;
+
+		pt = box.getCorner(AABox::NEAR_LEFT_BOTTOM);
+		memcpy(outVertices, &pt, sizeof(pt));
+		outVertices += vertexStride;
+
+		pt = box.getCorner(AABox::NEAR_RIGHT_BOTTOM);
+		memcpy(outVertices, &pt, sizeof(pt));
+		outVertices += vertexStride;
+
+		pt = box.getCorner(AABox::NEAR_LEFT_TOP);
+		memcpy(outVertices, &pt, sizeof(pt));
+		outVertices += vertexStride;
+
+		pt = box.getCorner(AABox::NEAR_RIGHT_TOP);
+		memcpy(outVertices, &pt, sizeof(pt));
+		outVertices += vertexStride;
+
+		outIndices += indexOffset;
+
+		// Front
+		outIndices[0] = vertexOffset + 6;
+		outIndices[1] = vertexOffset + 7;
+		outIndices[2] = vertexOffset + 5;
+
+		outIndices[3] = vertexOffset + 6;
+		outIndices[4] = vertexOffset + 5;
+		outIndices[5] = vertexOffset + 4;
+
+		// Back
+		outIndices[6] = vertexOffset + 2;
+		outIndices[7] = vertexOffset + 1;
+		outIndices[8] = vertexOffset + 3;
+
+		outIndices[9] = vertexOffset + 2;
+		outIndices[10] = vertexOffset + 0;
+		outIndices[11] = vertexOffset + 1;
+
+		// Left
+		outIndices[12] = vertexOffset + 2;
+		outIndices[13] = vertexOffset + 6;
+		outIndices[14] = vertexOffset + 4;
+
+		outIndices[15] = vertexOffset + 2;
+		outIndices[16] = vertexOffset + 4;
+		outIndices[17] = vertexOffset + 0;
+
+		// Right
+		outIndices[18] = vertexOffset + 7;
+		outIndices[19] = vertexOffset + 3;
+		outIndices[20] = vertexOffset + 1;
+
+		outIndices[21] = vertexOffset + 7;
+		outIndices[22] = vertexOffset + 1;
+		outIndices[23] = vertexOffset + 5;
+
+		// Top
+		outIndices[24] = vertexOffset + 6;
+		outIndices[25] = vertexOffset + 2;
+		outIndices[26] = vertexOffset + 3;
+
+		outIndices[27] = vertexOffset + 6;
+		outIndices[28] = vertexOffset + 3;
+		outIndices[29] = vertexOffset + 7;
+
+		// Bottom
+		outIndices[30] = vertexOffset + 5;
+		outIndices[31] = vertexOffset + 1;
+		outIndices[32] = vertexOffset + 0;
+
+		outIndices[33] = vertexOffset + 5;
+		outIndices[34] = vertexOffset + 0;
+		outIndices[35] = vertexOffset + 4;
+	}
+
 	CM::Vector3 DrawHelper3D::calcCenter(UINT8* vertices, UINT32 numVertices, UINT32 vertexStride)
 	CM::Vector3 DrawHelper3D::calcCenter(UINT8* vertices, UINT32 numVertices, UINT32 vertexStride)
 	{
 	{
 		Vector3 center = Vector3::ZERO;
 		Vector3 center = Vector3::ZERO;

+ 0 - 7
BansheeEngine/Source/BsGLBuiltinMaterialFactory.cpp

@@ -383,12 +383,5 @@ namespace BansheeEngine
 
 
 		HBlendState blendState = BlendState::create(desc);
 		HBlendState blendState = BlendState::create(desc);
 		newPass->setBlendState(blendState);
 		newPass->setBlendState(blendState);
-
-		DEPTH_STENCIL_STATE_DESC depthStateDesc;
-		depthStateDesc.depthReadEnable = false;
-		depthStateDesc.depthWriteEnable = false;
-
-		HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
-		newPass->setDepthStencilState(depthState);
 	}
 	}
 }
 }

+ 8 - 4
CamelotClient/Source/BsMainEditorWindow.cpp

@@ -8,6 +8,7 @@
 #include "CmTestTextSprite.h"
 #include "CmTestTextSprite.h"
 #include "CmDebugCamera.h"
 #include "CmDebugCamera.h"
 #include "BsDrawHelper2D.h"
 #include "BsDrawHelper2D.h"
+#include "BsDrawHelper3D.h"
 #include "CmFRect.h"
 #include "CmFRect.h"
 
 
 using namespace CamelotFramework;
 using namespace CamelotFramework;
@@ -39,12 +40,15 @@ namespace BansheeEditor
 
 
 		textSprite->init(sceneCamera, "Testing in a new row, does this work?", nullptr);
 		textSprite->init(sceneCamera, "Testing in a new row, does this work?", nullptr);
 
 
-		DrawHelper2D::instance().drawQuad(sceneCamera, FRect(0.0f, 0.2f, 0.75f, 0.5f), Color::White, DebugDrawCoordType::Normalized, 250.0f);
-		DrawHelper2D::instance().drawQuad(sceneCamera, FRect(50.0f, 50.0f, 100.0f, 50.0f), Color::Blue, DebugDrawCoordType::Pixel, 250.0f);
+		//DrawHelper2D::instance().drawQuad(sceneCamera, FRect(0.0f, 0.2f, 0.75f, 0.5f), Color::White, DebugDrawCoordType::Normalized, 250.0f);
+		//DrawHelper2D::instance().drawQuad(sceneCamera, FRect(50.0f, 50.0f, 100.0f, 50.0f), Color::Blue, DebugDrawCoordType::Pixel, 250.0f);
 
 
-		DrawHelper2D::instance().drawLine_Pixel(sceneCamera, Vector2(0, 0), Vector2(20, 20), Color::Blue, DebugDrawCoordType::Pixel, 250.0f);
+		//DrawHelper2D::instance().drawLine_Pixel(sceneCamera, Vector2(0, 0), Vector2(20, 20), Color::Blue, DebugDrawCoordType::Pixel, 250.0f);
 
 
-		DrawHelper2D::instance().drawLine_AA(sceneCamera, Vector2(100, 10), Vector2(120, 40), 1.0f, 1.0f, Color::Blue, DebugDrawCoordType::Pixel, 250.0f);
+		//DrawHelper2D::instance().drawLine_AA(sceneCamera, Vector2(100, 10), Vector2(120, 40), 1.0f, 1.0f, Color::Blue, DebugDrawCoordType::Pixel, 250.0f);
+
+		AABox dbgBox(Vector3(-300, -200, 1000), Vector3(300, 300, 1500));
+		DrawHelper3D::instance().drawAABox(sceneCamera, dbgBox, Color::Green, 250.0f);
 	}
 	}
 
 
 	MainEditorWindow::~MainEditorWindow()
 	MainEditorWindow::~MainEditorWindow()

+ 2 - 2
CamelotCore/Source/CmMesh.cpp

@@ -53,7 +53,7 @@ namespace CamelotFramework
 			mIndexData->indexCount, 
 			mIndexData->indexCount, 
 			GBU_STATIC);
 			GBU_STATIC);
 
 
-		UINT8* idxData = static_cast<UINT8*>(mIndexData->indexBuffer->lock(GBL_WRITE_ONLY_DISCARD));
+		UINT8* idxData = static_cast<UINT8*>(mIndexData->indexBuffer->lock(GBL_WRITE_ONLY));
 		UINT32 idxElementSize = meshData.getIndexElementSize();
 		UINT32 idxElementSize = meshData.getIndexElementSize();
 
 
 		UINT32 indicesSize = meshData.getIndexBufferSize();
 		UINT32 indicesSize = meshData.getIndexBufferSize();
@@ -84,7 +84,7 @@ namespace CamelotFramework
 			mVertexData->setBuffer(i, vertexBuffer);
 			mVertexData->setBuffer(i, vertexBuffer);
 
 
 			UINT8* srcVertBufferData = meshData.getStreamData(i);
 			UINT8* srcVertBufferData = meshData.getStreamData(i);
-			UINT8* vertBufferData = static_cast<UINT8*>(vertexBuffer->lock(GBL_WRITE_ONLY_DISCARD));
+			UINT8* vertBufferData = static_cast<UINT8*>(vertexBuffer->lock(GBL_WRITE_ONLY));
 
 
 			UINT32 bufferSize = meshData.getStreamSize(i);
 			UINT32 bufferSize = meshData.getStreamSize(i);
 
 

+ 2 - 1
DrawHelper.txt

@@ -7,5 +7,6 @@
 AA line stuff doesn't work in 3d unless I specify a plane :/
 AA line stuff doesn't work in 3d unless I specify a plane :/
  - A better way might be to draw two lines in an X (for lines)
  - A better way might be to draw two lines in an X (for lines)
  - And for polygons use the normal formed by their triangle
  - And for polygons use the normal formed by their triangle
+ - See how Recast draws 3d lines and polys
 
 
-Need support for drawing AABox
+Make sure AABox can be rendered transparently and make sure it gets sorted properly