absence_thelab
diff src/3deng/objectgen.cpp @ 0:1cffe3409164
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 23 Oct 2014 01:46:07 +0300 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/3deng/objectgen.cpp Thu Oct 23 01:46:07 2014 +0300 1.3 @@ -0,0 +1,155 @@ 1.4 +#include "objectgen.h" 1.5 +#include "n3dmath.h" 1.6 + 1.7 +struct Quad { 1.8 + Index verts[4]; 1.9 + Vector3 norm; 1.10 +}; 1.11 + 1.12 +/////////////////////////////////////////////// 1.13 +// --==( Generate a tesselated plane )==-- // 1.14 +/////////////////////////////////////////////// 1.15 + 1.16 +void ObjGen::CreatePlane(GraphicsContext *gc, float size, dword subdivisions, TriMesh **mesh, byte LODLevels) { 1.17 + 1.18 + dword VertexNum = (subdivisions+2) * (subdivisions+2); 1.19 + dword TriNum = ((subdivisions+1) * (subdivisions+1)) << 1; 1.20 + int QuadNum = TriNum >> 1; 1.21 + int QuadsRow = subdivisions+1; // quads per row 1.22 + int VertsRow = subdivisions+2; // vertices per row 1.23 + int VertsCol = VertsRow; 1.24 + 1.25 + Vertex *varray = new Vertex[VertexNum]; 1.26 + Triangle *tarray = new Triangle[TriNum]; 1.27 + 1.28 + for(int j=0; j<VertsCol; j++) { 1.29 + for(int i=0; i<VertsRow; i++) { 1.30 + 1.31 + float u = (float)i/(float)QuadsRow; 1.32 + float v = (float)j/(float)QuadsRow; 1.33 + varray[j*VertsRow+i] = Vertex(Vector3(u - 0.5f, 1.0f - v - 0.5f, 0), u, v, 0x00ffffff); 1.34 + varray[j*VertsRow+i].pos *= size; 1.35 + } 1.36 + } 1.37 + 1.38 + // first seperate the quads and then triangulate 1.39 + Quad *quads = new Quad[QuadNum]; 1.40 + 1.41 + for(int i=0; i<QuadNum; i++) { 1.42 + quads[i].verts[0] = i + i/QuadsRow; 1.43 + quads[i].verts[1] = quads[i].verts[0] + 1; 1.44 + quads[i].verts[2] = quads[i].verts[0] + VertsRow; 1.45 + quads[i].verts[3] = quads[i].verts[1] + VertsRow; 1.46 + } 1.47 + 1.48 + for(int i=0; i<QuadNum; i++) { 1.49 + tarray[i<<1] = Triangle(quads[i].verts[0], quads[i].verts[1], quads[i].verts[3]); 1.50 + tarray[(i<<1)+1] = Triangle(quads[i].verts[0], quads[i].verts[3], quads[i].verts[2]); 1.51 + } 1.52 + 1.53 + for(dword i=0; i<VertexNum; i++) { 1.54 + varray[i].normal = Vector3(0, 0, -1); 1.55 + } 1.56 + 1.57 + *mesh = new TriMesh(LODLevels, gc); 1.58 + (*mesh)->SetData(varray, tarray, VertexNum, TriNum); 1.59 + 1.60 + delete [] quads; 1.61 + delete [] varray; 1.62 + delete [] tarray; 1.63 +} 1.64 + 1.65 + 1.66 + 1.67 + 1.68 +///////////////////////////////////////////////////////// 1.69 +// --==( Generate Cube without shared vertices )==-- // 1.70 +///////////////////////////////////////////////////////// 1.71 + 1.72 +void ObjGen::CreateCube(GraphicsContext *gc, float size, TriMesh **mesh, byte LODLevels) { 1.73 + 1.74 + Vertex verts[36]; 1.75 + verts[0] = Vertex(Vector3(-1, +1, -1), 0, 0); 1.76 + verts[1] = Vertex(Vector3(+1, +1, -1), 1, 0); 1.77 + verts[2] = Vertex(Vector3(+1, -1, -1), 1, 1); 1.78 + verts[3] = Vertex(Vector3(-1, +1, -1), 0, 0); 1.79 + verts[4] = Vertex(Vector3(+1, -1, -1), 1, 1); 1.80 + verts[5] = Vertex(Vector3(-1, -1, -1), 0, 1); 1.81 + verts[6] = Vertex(Vector3(-1, +1, +1), 0, 0); 1.82 + verts[7] = Vertex(Vector3(-1, +1, -1), 1, 0); 1.83 + verts[8] = Vertex(Vector3(-1, -1, -1), 1, 1); 1.84 + verts[9] = Vertex(Vector3(-1, +1, +1), 0, 0); 1.85 + verts[10] = Vertex(Vector3(-1, -1, -1), 1, 1); 1.86 + verts[11] = Vertex(Vector3(-1, -1, +1), 0, 1); 1.87 + verts[12] = Vertex(Vector3(-1, +1, +1), 1, 0); 1.88 + verts[13] = Vertex(Vector3(-1, -1, +1), 1, 1); 1.89 + verts[14] = Vertex(Vector3(+1, +1, +1), 0, 0); 1.90 + verts[15] = Vertex(Vector3(+1, +1, +1), 0, 0); 1.91 + verts[16] = Vertex(Vector3(-1, -1, +1), 1, 1); 1.92 + verts[17] = Vertex(Vector3(+1, -1, +1), 0, 1); 1.93 + verts[18] = Vertex(Vector3(+1, +1, -1), 0, 0); 1.94 + verts[19] = Vertex(Vector3(+1, +1, +1), 1, 0); 1.95 + verts[20] = Vertex(Vector3(+1, -1, +1), 1, 1); 1.96 + verts[21] = Vertex(Vector3(+1, +1, -1), 0, 0); 1.97 + verts[22] = Vertex(Vector3(+1, -1, +1), 1, 1); 1.98 + verts[23] = Vertex(Vector3(+1, -1, -1), 0, 1); 1.99 + verts[24] = Vertex(Vector3(-1, +1, -1), 0, 1); 1.100 + verts[25] = Vertex(Vector3(+1, +1, +1), 1, 0); 1.101 + verts[26] = Vertex(Vector3(+1, +1, -1), 1, 1); 1.102 + verts[27] = Vertex(Vector3(-1, +1, +1), 0, 0); 1.103 + verts[28] = Vertex(Vector3(+1, +1, +1), 1, 0); 1.104 + verts[29] = Vertex(Vector3(-1, +1, -1), 0, 1); 1.105 + verts[30] = Vertex(Vector3(-1, -1, +1), 0, 1); 1.106 + verts[31] = Vertex(Vector3(-1, -1, -1), 0, 0); 1.107 + verts[32] = Vertex(Vector3(+1, -1, +1), 1, 1); 1.108 + verts[33] = Vertex(Vector3(-1, -1, -1), 0, 0); 1.109 + verts[34] = Vertex(Vector3(+1, -1, -1), 1, 0); 1.110 + verts[35] = Vertex(Vector3(+1, -1, +1), 1, 1); 1.111 + 1.112 + Triangle tri[12]; 1.113 + for(int i=0; i<12; i++) { 1.114 + tri[i].vertices[0] = i*3; 1.115 + tri[i].vertices[1] = i*3+1; 1.116 + tri[i].vertices[2] = i*3+2; 1.117 + } 1.118 + 1.119 + for(int i=0; i<36; i++) { 1.120 + verts[i].pos *= size / 2.0f; 1.121 + verts[i].color = 0x00ffffff; 1.122 + } 1.123 + 1.124 + TriMesh *tmpmesh = new TriMesh(LODLevels, gc); 1.125 + tmpmesh->SetData(verts, tri, 36, 12); 1.126 + 1.127 + tmpmesh->CalculateNormals(); 1.128 + 1.129 + *mesh = tmpmesh; 1.130 +} 1.131 + 1.132 + 1.133 +///////////////////////////////////// 1.134 +// --==( Generate Cylinder )==-- // 1.135 +///////////////////////////////////// 1.136 +/* 1.137 +void ObjGen::CreateCylinder(float radius, float height, int sides, int hsegs, bool caps, TriMesh **mesh, byte LODLevels) { 1.138 + 1.139 + int slices = hsegs + 1; 1.140 + unsigned long vertex_count = sides * slices + (caps ? (sides + 1)<<1 : 0); 1.141 + unsigned long tri_count = (sides << 1) * (slices - 1) + (caps ? sides : 0); 1.142 + 1.143 + Vertex *varray = new Vertex[vertex_count]; 1.144 + Triangle *tarray = new Triangle[tri_count]; 1.145 + 1.146 + Vertex *vptr = varray; 1.147 + Triangle *tptr = tarray; 1.148 + 1.149 + // create a circle by rotating a vector around the y axis 1.150 + Vector3 x_axis(radius, 0, 0); 1.151 + 1.152 + float rot_rads = TwoPi / (float)sides; 1.153 + for(int i=0; i<sides; i++) { 1.154 + Vector3 pos = x_axis; 1.155 + pos.Rotate(0, rot_rads * (float)i, 0); 1.156 + 1.157 + *vptr++ = pos; 1.158 +*/ 1.159 \ No newline at end of file