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