#include "GeometryGens.h"
namespace GeoGen
{
void CreateBox(float width, float height, float depth, MeshData &mesh)
{
mesh.vertices.clear();
mesh.indices.clear();
//24 vertices
mesh.vertices.resize(24);
//36 indices
mesh.indices.resize(36);
float halfW = width * 0.5f;
float halfH = height * 0.5f;
float halfD = depth * 0.5f;
//front
mesh.vertices[0].pos = XMFLOAT3(-halfW,-halfH,-halfD);
mesh.vertices[0].normal = XMFLOAT3(0.f,0.f,-1.f);
mesh.vertices[0].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[0].tex = XMFLOAT2(0.f,1.f);
mesh.vertices[1].pos = XMFLOAT3(-halfW,halfH,-halfD);
mesh.vertices[1].normal = XMFLOAT3(0.f,0.f,-1.f);
mesh.vertices[1].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[1].tex = XMFLOAT2(0.f,0.f);
mesh.vertices[2].pos = XMFLOAT3(halfW,halfH,-halfD);
mesh.vertices[2].normal = XMFLOAT3(0.f,0.f,-1.f);
mesh.vertices[2].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[2].tex = XMFLOAT2(1.f,0.f);
mesh.vertices[3].pos = XMFLOAT3(halfW,-halfH,-halfD);
mesh.vertices[3].normal = XMFLOAT3(0.f,0.f,-1.f);
mesh.vertices[3].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[3].tex = XMFLOAT2(1.f,1.f);
//left
mesh.vertices[4].pos = XMFLOAT3(-halfW,-halfH,halfD);
mesh.vertices[4].normal = XMFLOAT3(-1.f,0.f,0.f);
mesh.vertices[4].tangent = XMFLOAT3(0.f,0.f,-1.f);
mesh.vertices[4].tex = XMFLOAT2(0.f,1.f);
mesh.vertices[5].pos = XMFLOAT3(-halfW,halfH,halfD);
mesh.vertices[5].normal = XMFLOAT3(-1.f,0.f,0.f);
mesh.vertices[5].tangent = XMFLOAT3(0.f,0.f,-1.f);
mesh.vertices[5].tex = XMFLOAT2(0.f,0.f);
mesh.vertices[6].pos = XMFLOAT3(-halfW,halfH,-halfD);
mesh.vertices[6].normal = XMFLOAT3(-1.f,0.f,0.f);
mesh.vertices[6].tangent = XMFLOAT3(0.f,0.f,-1.f);
mesh.vertices[6].tex = XMFLOAT2(1.f,0.f);
mesh.vertices[7].pos = XMFLOAT3(-halfW,-halfH,-halfD);
mesh.vertices[7].normal = XMFLOAT3(-1.f,0.f,0.f);
mesh.vertices[7].tangent = XMFLOAT3(0.f,0.f,-1.f);
mesh.vertices[7].tex = XMFLOAT2(1.f,1.f);
//back
mesh.vertices[8].pos = XMFLOAT3(halfW,-halfH,halfD);
mesh.vertices[8].normal = XMFLOAT3(0.f,0.f,1.f);
mesh.vertices[8].tangent = XMFLOAT3(-1.f,0.f,0.f);
mesh.vertices[8].tex = XMFLOAT2(0.f,1.f);
mesh.vertices[9].pos = XMFLOAT3(halfW,halfH,halfD);
mesh.vertices[9].normal = XMFLOAT3(0.f,0.f,1.f);
mesh.vertices[9].tangent = XMFLOAT3(-1.f,0.f,0.f);
mesh.vertices[9].tex = XMFLOAT2(0.f,0.f);
mesh.vertices[10].pos = XMFLOAT3(-halfW,halfH,halfD);
mesh.vertices[10].normal = XMFLOAT3(0.f,0.f,1.f);
mesh.vertices[10].tangent = XMFLOAT3(-1.f,0.f,0.f);
mesh.vertices[10].tex = XMFLOAT2(1.f,0.f);
mesh.vertices[11].pos = XMFLOAT3(-halfW,-halfH,halfD);
mesh.vertices[11].normal = XMFLOAT3(0.f,0.f,1.f);
mesh.vertices[11].tangent = XMFLOAT3(-1.f,0.f,0.f);
mesh.vertices[11].tex = XMFLOAT2(1.f,1.f);
//right
mesh.vertices[12].pos = XMFLOAT3(halfW,-halfH,-halfD);
mesh.vertices[12].normal = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[12].tangent = XMFLOAT3(0.f,0.f,1.f);
mesh.vertices[12].tex = XMFLOAT2(0.f,1.f);
mesh.vertices[13].pos = XMFLOAT3(halfW,halfH,-halfD);
mesh.vertices[13].normal = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[13].tangent = XMFLOAT3(0.f,0.f,1.f);
mesh.vertices[13].tex = XMFLOAT2(0.f,0.f);
mesh.vertices[14].pos = XMFLOAT3(halfW,halfH,halfD);
mesh.vertices[14].normal = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[14].tangent = XMFLOAT3(0.f,0.f,1.f);
mesh.vertices[14].tex = XMFLOAT2(1.f,0.f);
mesh.vertices[15].pos = XMFLOAT3(halfW,-halfH,halfD);
mesh.vertices[15].normal = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[15].tangent = XMFLOAT3(0.f,0.f,1.f);
mesh.vertices[15].tex = XMFLOAT2(1.f,1.f);
//top
mesh.vertices[16].pos = XMFLOAT3(-halfW,halfH,-halfD);
mesh.vertices[16].normal = XMFLOAT3(0.f,1.f,0.f);
mesh.vertices[16].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[16].tex = XMFLOAT2(0.f,1.f);
mesh.vertices[17].pos = XMFLOAT3(-halfW,halfH,halfD);
mesh.vertices[17].normal = XMFLOAT3(0.f,1.f,0.f);
mesh.vertices[17].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[17].tex = XMFLOAT2(0.f,0.f);
mesh.vertices[18].pos = XMFLOAT3(halfW,halfH,halfD);
mesh.vertices[18].normal = XMFLOAT3(0.f,1.f,0.f);
mesh.vertices[18].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[18].tex = XMFLOAT2(1.f,0.f);
mesh.vertices[19].pos = XMFLOAT3(halfW,halfH,-halfD);
mesh.vertices[19].normal = XMFLOAT3(0.f,1.f,0.f);
mesh.vertices[19].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[19].tex = XMFLOAT2(1.f,1.f);
//bottom
mesh.vertices[20].pos = XMFLOAT3(-halfW,-halfH,halfD);
mesh.vertices[20].normal = XMFLOAT3(0.f,-1.f,0.f);
mesh.vertices[20].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[20].tex = XMFLOAT2(0.f,1.f);
mesh.vertices[21].pos = XMFLOAT3(-halfW,-halfH,-halfD);
mesh.vertices[21].normal = XMFLOAT3(0.f,-1.f,0.f);
mesh.vertices[21].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[21].tex = XMFLOAT2(0.f,0.f);
mesh.vertices[22].pos = XMFLOAT3(halfW,-halfH,-halfD);
mesh.vertices[22].normal = XMFLOAT3(0.f,-1.f,0.f);
mesh.vertices[22].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[22].tex = XMFLOAT2(1.f,0.f);
mesh.vertices[23].pos = XMFLOAT3(halfW,-halfH,halfD);
mesh.vertices[23].normal = XMFLOAT3(0.f,-1.f,0.f);
mesh.vertices[23].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[23].tex = XMFLOAT2(1.f,1.f);
//Construct index
mesh.indices[0] = 0;
mesh.indices[1] = 1;
mesh.indices[2] = 2;
mesh.indices[3] = 0;
mesh.indices[4] = 2;
mesh.indices[5] = 3;
mesh.indices[6] = 4;
mesh.indices[7] = 5;
mesh.indices[8] = 6;
mesh.indices[9] = 4;
mesh.indices[10] = 6;
mesh.indices[11] = 7;
mesh.indices[12] = 8;
mesh.indices[13] = 9;
mesh.indices[14] = 10;
mesh.indices[15] = 8;
mesh.indices[16] = 10;
mesh.indices[17] = 11;
mesh.indices[18] = 12;
mesh.indices[19] = 13;
mesh.indices[20] = 14;
mesh.indices[21] = 12;
mesh.indices[22] = 14;
mesh.indices[23] = 15;
mesh.indices[24] = 16;
mesh.indices[25] = 17;
mesh.indices[26] = 18;
mesh.indices[27] = 16;
mesh.indices[28] = 18;
mesh.indices[29] = 19;
mesh.indices[30] = 20;
mesh.indices[31] = 21;
mesh.indices[32] = 22;
mesh.indices[33] = 20;
mesh.indices[34] = 22;
mesh.indices[35] = 23;
}
void CreateGrid(float width, float height, UINT m, UINT n, MeshData &mesh)
{
mesh.vertices.clear();
mesh.indices.clear();
UINT nVertsRow = m + 1;
UINT nVertsCol = n + 1;
//Start coordinates: oX, oZ
float oX = -width * 0.5f;
float oZ = height * 0.5f;
float dx = width / m;
float dz = height /n;
//texture coordinate delta
float dxTex = 1.f / m;
float dyTex = 1.f /n;
//Vertex number:nVertsRow * nVertsCol
mesh.vertices.resize(nVertsRow * nVertsCol);
for(UINT i=0; i<nVertsCol; ++i)
{
float tmpZ = oZ - dz * i;
for(UINT j=0; j<nVertsRow; ++j)
{
UINT index = nVertsRow * i + j;
mesh.vertices[index].pos.x = oX + dx * j;
mesh.vertices[index].pos.y = 0.f;
mesh.vertices[index].pos.z = tmpZ;
mesh.vertices[index].normal = XMFLOAT3(0.f,1.f,0.f);
mesh.vertices[index].tangent = XMFLOAT3(1.f,0.f,0.f);
mesh.vertices[index].tex = XMFLOAT2(dxTex*j,dyTex*i);
}
}
//Total grid number: m*n
UINT nIndices = m * n * 6;
mesh.indices.resize(nIndices);
UINT tmp = 0;
for(UINT i=0; i<n; ++i)
{
for(UINT j=0; j<m; ++j)
{
mesh.indices[tmp] = i * nVertsRow + j;
mesh.indices[tmp+1] = i * nVertsRow + j + 1;
mesh.indices[tmp+2] = (i + 1) * nVertsRow + j;
mesh.indices[tmp+3] = i * nVertsRow + j + 1;
mesh.indices[tmp+4] = (i + 1) * nVertsRow + j + 1;
mesh.indices[tmp+5] = (i + 1) * nVertsRow + j;
tmp += 6;
}
}
}
void CreateCylinder(float topRadius, float bottomRadius, float height, int
- 1
- 2
- 3
- 4
- 5
前往页