Browse Source

Draw solid quads as two sided

Marko Pintera 11 years ago
parent
commit
d9d9aeb050

+ 2 - 2
BansheeEngine/Include/BsShapeMeshes3D.h

@@ -236,7 +236,7 @@ namespace BansheeEngine
 			const MeshDataPtr& meshData, UINT32 vertexOffset, UINT32 indexOffset, UINT32 quality = 10);
 
 		/**
-		 * @brief	Fills the mesh data with vertices representing a quad (2 triangles).
+		 * @brief	Fills the mesh data with vertices representing a quad (4 triangles, two sided).
 		 *
 		 * @param	area			Area in which to draw the quad.
 		 * @param	meshData		Mesh data that will be populated.
@@ -247,7 +247,7 @@ namespace BansheeEngine
 		 * 			  Vector3 VES_POSITION
 		 *			  Vector3 VES_NORMAL
 		 * 			  32bit index buffer
-		 * 			  Enough space for 4 vertices and 6 indices
+		 * 			  Enough space for 8 vertices and 12 indices
 		 *
 		 *			Primitives are output in the form of a triangle list.
 		 */

+ 2 - 2
BansheeEngine/Source/BsDrawHelper.cpp

@@ -343,8 +343,8 @@ namespace BansheeEngine
 			rawData.meshType = MeshType::Solid;
 			rawData.shapeType = ShapeType::Rectangle;
 			rawData.distance = shapeData.center.distance(reference);
-			rawData.numVertices = 4;
-			rawData.numIndices = 6;
+			rawData.numVertices = 8;
+			rawData.numIndices = 12;
 			idx++;
 		}
 

+ 21 - 2
BansheeEngine/Source/BsShapeMeshes3D.cpp

@@ -168,8 +168,8 @@ namespace BansheeEngine
 		UINT8* positionData = meshData->getElementData(VES_POSITION);
 		UINT8* normalData = meshData->getElementData(VES_NORMAL);
 
-		assert((vertexOffset + 4) <= meshData->getNumVertices());
-		assert((indexOffset + 6) <= meshData->getNumIndices());
+		assert((vertexOffset + 8) <= meshData->getNumVertices());
+		assert((indexOffset + 12) <= meshData->getNumIndices());
 
 		solidQuad(area, positionData, normalData, vertexOffset,
 			meshData->getVertexDesc()->getVertexStride(), indexData, indexOffset);
@@ -669,7 +669,13 @@ namespace BansheeEngine
 		outVertices = writeVector3(outVertices, vertexStride, botRight);
 		outVertices = writeVector3(outVertices, vertexStride, botLeft);
 
+		outVertices = writeVector3(outVertices, vertexStride, topLeft);
+		outVertices = writeVector3(outVertices, vertexStride, topRight);
+		outVertices = writeVector3(outVertices, vertexStride, botRight);
+		outVertices = writeVector3(outVertices, vertexStride, botLeft);
+
 		Vector3 normal = area.getAxisHorz().cross(area.getAxisVert());
+		Vector3 reverseNormal = -normal;
 
 		outNormals += (vertexOffset * vertexStride);
 		outNormals = writeVector3(outNormals, vertexStride, normal);
@@ -677,6 +683,11 @@ namespace BansheeEngine
 		outNormals = writeVector3(outNormals, vertexStride, normal);
 		outNormals = writeVector3(outNormals, vertexStride, normal);
 
+		outNormals = writeVector3(outNormals, vertexStride, reverseNormal);
+		outNormals = writeVector3(outNormals, vertexStride, reverseNormal);
+		outNormals = writeVector3(outNormals, vertexStride, reverseNormal);
+		outNormals = writeVector3(outNormals, vertexStride, reverseNormal);
+
 		outIndices += indexOffset;
 		outIndices[0] = vertexOffset;
 		outIndices[1] = vertexOffset + 1;
@@ -685,6 +696,14 @@ namespace BansheeEngine
 		outIndices[3] = vertexOffset;
 		outIndices[4] = vertexOffset + 2;
 		outIndices[5] = vertexOffset + 3;
+
+		outIndices[6] = vertexOffset;
+		outIndices[7] = vertexOffset + 2;
+		outIndices[8] = vertexOffset + 1;
+
+		outIndices[9] = vertexOffset;
+		outIndices[10] = vertexOffset + 3;
+		outIndices[11] = vertexOffset + 2;
 	}
 
 	Vector3 ShapeMeshes3D::calcCenter(UINT8* vertices, UINT32 numVertices, UINT32 vertexStride)