nuclear@0: #include "objectgen.h" nuclear@0: #include "n3dmath.h" nuclear@0: nuclear@0: struct Quad { nuclear@0: Index verts[4]; nuclear@0: Vector3 norm; nuclear@0: }; nuclear@0: nuclear@0: /////////////////////////////////////////////// nuclear@0: // --==( Generate a tesselated plane )==-- // nuclear@0: /////////////////////////////////////////////// nuclear@0: nuclear@0: void ObjGen::CreatePlane(GraphicsContext *gc, float size, dword subdivisions, TriMesh **mesh, byte LODLevels) { nuclear@0: nuclear@0: dword VertexNum = (subdivisions+2) * (subdivisions+2); nuclear@0: dword TriNum = ((subdivisions+1) * (subdivisions+1)) << 1; nuclear@0: int QuadNum = TriNum >> 1; nuclear@0: int QuadsRow = subdivisions+1; // quads per row nuclear@0: int VertsRow = subdivisions+2; // vertices per row nuclear@0: int VertsCol = VertsRow; nuclear@0: nuclear@0: Vertex *varray = new Vertex[VertexNum]; nuclear@0: Triangle *tarray = new Triangle[TriNum]; nuclear@0: nuclear@0: for(int j=0; jSetData(varray, tarray, VertexNum, TriNum); nuclear@0: nuclear@0: delete [] quads; nuclear@0: delete [] varray; nuclear@0: delete [] tarray; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: nuclear@0: nuclear@0: ///////////////////////////////////////////////////////// nuclear@0: // --==( Generate Cube without shared vertices )==-- // nuclear@0: ///////////////////////////////////////////////////////// nuclear@0: nuclear@0: void ObjGen::CreateCube(GraphicsContext *gc, float size, TriMesh **mesh, byte LODLevels) { nuclear@0: nuclear@0: Vertex verts[36]; nuclear@0: verts[0] = Vertex(Vector3(-1, +1, -1), 0, 0); nuclear@0: verts[1] = Vertex(Vector3(+1, +1, -1), 1, 0); nuclear@0: verts[2] = Vertex(Vector3(+1, -1, -1), 1, 1); nuclear@0: verts[3] = Vertex(Vector3(-1, +1, -1), 0, 0); nuclear@0: verts[4] = Vertex(Vector3(+1, -1, -1), 1, 1); nuclear@0: verts[5] = Vertex(Vector3(-1, -1, -1), 0, 1); nuclear@0: verts[6] = Vertex(Vector3(-1, +1, +1), 0, 0); nuclear@0: verts[7] = Vertex(Vector3(-1, +1, -1), 1, 0); nuclear@0: verts[8] = Vertex(Vector3(-1, -1, -1), 1, 1); nuclear@0: verts[9] = Vertex(Vector3(-1, +1, +1), 0, 0); nuclear@0: verts[10] = Vertex(Vector3(-1, -1, -1), 1, 1); nuclear@0: verts[11] = Vertex(Vector3(-1, -1, +1), 0, 1); nuclear@0: verts[12] = Vertex(Vector3(-1, +1, +1), 1, 0); nuclear@0: verts[13] = Vertex(Vector3(-1, -1, +1), 1, 1); nuclear@0: verts[14] = Vertex(Vector3(+1, +1, +1), 0, 0); nuclear@0: verts[15] = Vertex(Vector3(+1, +1, +1), 0, 0); nuclear@0: verts[16] = Vertex(Vector3(-1, -1, +1), 1, 1); nuclear@0: verts[17] = Vertex(Vector3(+1, -1, +1), 0, 1); nuclear@0: verts[18] = Vertex(Vector3(+1, +1, -1), 0, 0); nuclear@0: verts[19] = Vertex(Vector3(+1, +1, +1), 1, 0); nuclear@0: verts[20] = Vertex(Vector3(+1, -1, +1), 1, 1); nuclear@0: verts[21] = Vertex(Vector3(+1, +1, -1), 0, 0); nuclear@0: verts[22] = Vertex(Vector3(+1, -1, +1), 1, 1); nuclear@0: verts[23] = Vertex(Vector3(+1, -1, -1), 0, 1); nuclear@0: verts[24] = Vertex(Vector3(-1, +1, -1), 0, 1); nuclear@0: verts[25] = Vertex(Vector3(+1, +1, +1), 1, 0); nuclear@0: verts[26] = Vertex(Vector3(+1, +1, -1), 1, 1); nuclear@0: verts[27] = Vertex(Vector3(-1, +1, +1), 0, 0); nuclear@0: verts[28] = Vertex(Vector3(+1, +1, +1), 1, 0); nuclear@0: verts[29] = Vertex(Vector3(-1, +1, -1), 0, 1); nuclear@0: verts[30] = Vertex(Vector3(-1, -1, +1), 0, 1); nuclear@0: verts[31] = Vertex(Vector3(-1, -1, -1), 0, 0); nuclear@0: verts[32] = Vertex(Vector3(+1, -1, +1), 1, 1); nuclear@0: verts[33] = Vertex(Vector3(-1, -1, -1), 0, 0); nuclear@0: verts[34] = Vertex(Vector3(+1, -1, -1), 1, 0); nuclear@0: verts[35] = Vertex(Vector3(+1, -1, +1), 1, 1); nuclear@0: nuclear@0: Triangle tri[12]; nuclear@0: for(int i=0; i<12; i++) { nuclear@0: tri[i].vertices[0] = i*3; nuclear@0: tri[i].vertices[1] = i*3+1; nuclear@0: tri[i].vertices[2] = i*3+2; nuclear@0: } nuclear@0: nuclear@0: for(int i=0; i<36; i++) { nuclear@0: verts[i].pos *= size / 2.0f; nuclear@0: verts[i].color = 0x00ffffff; nuclear@0: } nuclear@0: nuclear@0: TriMesh *tmpmesh = new TriMesh(LODLevels, gc); nuclear@0: tmpmesh->SetData(verts, tri, 36, 12); nuclear@0: nuclear@0: tmpmesh->CalculateNormals(); nuclear@0: nuclear@0: *mesh = tmpmesh; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: ///////////////////////////////////// nuclear@0: // --==( Generate Cylinder )==-- // nuclear@0: ///////////////////////////////////// nuclear@0: /* nuclear@0: void ObjGen::CreateCylinder(float radius, float height, int sides, int hsegs, bool caps, TriMesh **mesh, byte LODLevels) { nuclear@0: nuclear@0: int slices = hsegs + 1; nuclear@0: unsigned long vertex_count = sides * slices + (caps ? (sides + 1)<<1 : 0); nuclear@0: unsigned long tri_count = (sides << 1) * (slices - 1) + (caps ? sides : 0); nuclear@0: nuclear@0: Vertex *varray = new Vertex[vertex_count]; nuclear@0: Triangle *tarray = new Triangle[tri_count]; nuclear@0: nuclear@0: Vertex *vptr = varray; nuclear@0: Triangle *tptr = tarray; nuclear@0: nuclear@0: // create a circle by rotating a vector around the y axis nuclear@0: Vector3 x_axis(radius, 0, 0); nuclear@0: nuclear@0: float rot_rads = TwoPi / (float)sides; nuclear@0: for(int i=0; i