Example #1
0
void Plane::ToLineList(VertexBuffer &vb, float uWidth, float vHeight, const vec &centerPoint, int numLinesU, int numLinesV) const
{
	vec topLeft = Point(-uWidth*0.5f, -vHeight *0.5f, centerPoint);
	vec uEdge = (Point(uWidth*0.5f, -vHeight *0.5f, centerPoint) - topLeft) / (float)numLinesU;
	vec vEdge = (Point(-uWidth*0.5f, vHeight *0.5f, centerPoint) - topLeft) / (float)numLinesV;

	int i = vb.AppendVertices((numLinesU + numLinesV) * 2);
	for(int y = 0; y < numLinesV; ++y)
	{
		float4 start = POINT_TO_FLOAT4(topLeft + vEdge * (float)y);
		float4 end   = POINT_TO_FLOAT4(topLeft + uWidth * uEdge + vEdge * (float)y);
		vb.Set(i, VDPosition, start);
		vb.Set(i+1, VDPosition, end);
		i += 2;
	}

	for(int x = 0; x < numLinesU; ++x)
	{
		float4 start = POINT_TO_FLOAT4(topLeft + uEdge * (float)x);
		float4 end   = POINT_TO_FLOAT4(topLeft + vHeight * vEdge + uEdge * (float)x);
		vb.Set(i, VDPosition, start);
		vb.Set(i+1, VDPosition, end);
		i += 2;
	}
}
Example #2
0
void Polyhedron::Triangulate(VertexBuffer &vb, bool ccwIsFrontFacing) const
{
	for(int i = 0; i < NumFaces(); ++i)
	{
		Polygon p = FacePolygon(i);
		std::vector<Triangle> tris = p.Triangulate();
		int idx = vb.AppendVertices(3*(int)tris.size());
		for(size_t j = 0; j < tris.size(); ++j)
		{
			vb.Set(idx, VDPosition, float4(tris[j].a, 1.f));
			if (ccwIsFrontFacing)
			{
				vb.Set(idx+1, VDPosition, float4(tris[j].c, 1.f));
				vb.Set(idx+2, VDPosition, float4(tris[j].b, 1.f));
			}
			else
			{
				vb.Set(idx+1, VDPosition, float4(tris[j].b, 1.f));
				vb.Set(idx+2, VDPosition, float4(tris[j].c, 1.f));
			}
			// Generate flat normals if VB has space for normals.
			if (vb.Declaration()->TypeOffset(VDNormal) >= 0)
			{
				float3 normal = ccwIsFrontFacing ? tris[j].NormalCCW() : tris[j].NormalCW();
				vb.Set(idx, VDNormal, float4(normal, 0.f));
				vb.Set(idx+1, VDNormal, float4(normal, 0.f));
				vb.Set(idx+2, VDNormal, float4(normal, 0.f));
			}
			idx += 3;
		}
	}
}
Example #3
0
void AABB::ToLineList(VertexBuffer &vb) const
{
	Array<vec> pos;
	pos.Resize_pod(NumVerticesInEdgeList());
	ToEdgeList(&pos[0]);
	int startIndex = vb.AppendVertices((int)pos.size());
	for(int i = 0; i < (int)pos.size(); ++i)
		vb.Set(startIndex+i, VDPosition, POINT_TO_FLOAT4(pos[i]));
}
Example #4
0
void Polyhedron::ToLineList(VertexBuffer &vb) const
{
	std::vector<LineSegment> edges = Edges();

	int startIndex = vb.AppendVertices((int)edges.size()*2);
	for(int i = 0; i < (int)edges.size(); ++i)
	{
		vb.Set(startIndex+2*i, VDPosition, float4(edges[i].a, 1.f));
		vb.Set(startIndex+2*i+1, VDPosition, float4(edges[i].b, 1.f));
	}
}
Example #5
0
void Plane::Triangulate(VertexBuffer &vb, float uWidth, float vHeight, const vec &centerPoint, int numFacesU, int numFacesV, bool ccwIsFrontFacing) const
{
	vec topLeft = Point(-uWidth*0.5f, -vHeight *0.5f, centerPoint);
	vec uEdge = (Point(uWidth*0.5f, -vHeight *0.5f, centerPoint) - topLeft) / (float)numFacesU;
	vec vEdge = (Point(-uWidth*0.5f, vHeight *0.5f, centerPoint) - topLeft) / (float)numFacesV;

	int i = vb.AppendVertices(numFacesU * numFacesV * 6);
	for(int y = 0; y < numFacesV; ++y)
		for(int x = 0; x < numFacesU; ++x)
		{
			float4 tl = POINT_TO_FLOAT4(topLeft + uEdge * (float)x + vEdge * (float)y);
			float4 tr = POINT_TO_FLOAT4(topLeft + uEdge * (float)(x+1) + vEdge * (float)y);
			float4 bl = POINT_TO_FLOAT4(topLeft + uEdge * (float)x + vEdge * (float)(y+1));
			float4 br = POINT_TO_FLOAT4(topLeft + uEdge * (float)(x+1) + vEdge * (float)(y+1));
			int i0 = ccwIsFrontFacing ? i : i+5;
			int i1 = ccwIsFrontFacing ? i+5 : i;
			vb.Set(i0, VDPosition, tl);
			vb.Set(i+1, VDPosition, tr);
			vb.Set(i+2, VDPosition, bl);
			vb.Set(i+3, VDPosition, bl);
			vb.Set(i+4, VDPosition, tr);
			vb.Set(i1, VDPosition, br);

			if (vb.Declaration()->HasType(VDUV))
			{
				float4 uvTL((float)x/numFacesU, (float)y/numFacesV, 0.f, 1.f);
				float4 uvTR((float)(x+1)/numFacesU, (float)y/numFacesV, 0.f, 1.f);
				float4 uvBL((float)x/numFacesU, (float)(y+1)/numFacesV, 0.f, 1.f);
				float4 uvBR((float)(x+1)/numFacesU, (float)(y+1)/numFacesV, 0.f, 1.f);

				vb.Set(i0, VDUV, uvTL);
				vb.Set(i+1, VDUV, uvTR);
				vb.Set(i+2, VDUV, uvBL);
				vb.Set(i+3, VDUV, uvBL);
				vb.Set(i+4, VDUV, uvTR);
				vb.Set(i1, VDUV, uvBR);
			}

			if (vb.Declaration()->HasType(VDNormal))
			{
				for(int k = 0; k < 6; ++k)
					vb.Set(i+k, VDNormal, DIR_TO_FLOAT4(normal));
			}

			i += 6;
		}
}
Example #6
0
void Sphere::Triangulate(VertexBuffer &vb, int numVertices, bool ccwIsFrontFacing) const
{
	Array<vec> position;
	Array<vec> normal;
	Array<float2> uv;
	position.Resize_unspecified(numVertices);
	normal.Resize_unspecified(numVertices);
	uv.Resize_unspecified(numVertices);
	Triangulate(position.ptr(), normal.ptr(), uv.ptr(), numVertices, ccwIsFrontFacing);
	int startIndex = vb.AppendVertices(numVertices);
	for(int i = 0; i < (int)position.size(); ++i)
	{
		vb.Set(startIndex+i, VDPosition, POINT_TO_FLOAT4(position[i]));
		if (vb.Declaration()->TypeOffset(VDNormal) >= 0)
			vb.Set(startIndex+i, VDNormal, DIR_TO_FLOAT4(normal[i]));
		if (vb.Declaration()->TypeOffset(VDUV) >= 0)
			vb.SetFloat2(startIndex+i, VDUV, 0, uv[i]);
	}
}
Example #7
0
void Sphere::Triangulate(VertexBuffer &vb, int numVertices, bool ccwIsFrontFacing) const
{
	Array<float3> pos;
	Array<float3> normal;
	Array<float2> uv;
	pos.Resize_pod(numVertices);
	normal.Resize_pod(numVertices);
	uv.Resize_pod(numVertices);
	Triangulate(pos.beginptr(), normal.beginptr(), uv.beginptr(), numVertices, ccwIsFrontFacing);
	int startIndex = vb.AppendVertices(numVertices);
	for(int i = 0; i < (int)pos.size(); ++i)
	{
		vb.Set(startIndex+i, VDPosition, float4(pos[i],1.f));
		if (vb.Declaration()->TypeOffset(VDNormal) >= 0)
			vb.Set(startIndex+i, VDNormal, float4(normal[i],0.f));
		if (vb.Declaration()->TypeOffset(VDUV) >= 0)
			vb.SetFloat2(startIndex+i, VDUV, 0, uv[i]);
	}
}
Example #8
0
void AABB::Triangulate(VertexBuffer &vb, int numFacesX, int numFacesY, int numFacesZ, bool ccwIsFrontFacing) const
{
	Array<vec> pos;
	Array<vec> normal;
	Array<float2> uv;
	int numVertices = (numFacesX*numFacesY + numFacesY*numFacesZ + numFacesX*numFacesZ)*2*6;
	pos.Resize_pod(numVertices);
	normal.Resize_pod(numVertices);
	uv.Resize_pod(numVertices);
	Triangulate(numFacesX, numFacesY, numFacesZ, &pos[0], &normal[0], &uv[0], ccwIsFrontFacing);
	int startIndex = vb.AppendVertices(numVertices);
	for(int i = 0; i < (int)pos.size(); ++i)
	{
		vb.Set(startIndex+i, VDPosition, POINT_TO_FLOAT4(pos[i]));
		if (vb.Declaration()->TypeOffset(VDNormal) >= 0)
			vb.Set(startIndex+i, VDNormal, DIR_TO_FLOAT4(normal[i]));
		if (vb.Declaration()->TypeOffset(VDUV) >= 0)
			vb.SetFloat2(startIndex+i, VDUV, 0, uv[i]);
	}
}