void Mesh::createCone(Number height, Number radius, int numSegments) { setMeshType(Mesh::TRI_MESH); Number lastx = -1; Number lastz = -1; for (int i=0 ; i < numSegments+1; i++) { Number pos = ((PI*2.0)/((Number)numSegments)) * i; Number x = sinf(pos) * radius; Number z = cosf(pos) * radius; if(i > 0) { // ie only construct faces one we have vertexes from i-1 to use. Polygon *polygon = new Polygon(); polygon->addVertex(lastx,0,lastz,0,0); polygon->addVertex(x,0,z, 1, 0); polygon->addVertex(0,height,0, 1, 1); addPolygon(polygon); polygon = new Polygon(); polygon->addVertex(x,0,z, 1, 1); polygon->addVertex(lastx,0,lastz, 1, 1); polygon->addVertex(0,0,0,0,0); addPolygon(polygon); } lastx = x; lastz = z; /* Polygon *polygon = new Polygon(); polygon->addVertex(w,0,h, 1, 1); polygon->addVertex(0,0,h, 1, 0); polygon->addVertex(0,0,0,0,0); polygon->addVertex(w,0,0,0,1); addPolygon(polygon); */ } for(int i=0; i < polygons.size(); i++) { for(int j=0; j < polygons[i]->getVertexCount(); j++) { // polygons[i]->getVertex(j)->x = polygons[i]->getVertex(j)->x - (radius/2.0f); polygons[i]->getVertex(j)->y = polygons[i]->getVertex(j)->y - (height/2.0f); // polygons[i]->getVertex(j)->z = polygons[i]->getVertex(j)->z - (radius/2.0f); } } calculateNormals(); calculateTangents(); arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::TANGENT_DATA_ARRAY] = true; }
void Mesh::createCylinder(Number height, Number radius, int numSegments) { setMeshType(Mesh::TRI_MESH); Number lastx = 0; Number lastz = 0; Number lastv = 0; for (int i=0 ; i < numSegments+1; i++) { Number v = ((Number)i)/((Number)numSegments); Number pos = ((PI*2.0)/((Number)numSegments)) * i; Number x = sin(pos) * radius; Number z = cos(pos) * radius; if(i > 0) { Polygon *polygon = new Polygon(); polygon->addVertex(lastx,0,lastz,lastv,0); polygon->addVertex(x,0,z, v, 0); polygon->addVertex(x,height,z, v, 1); addPolygon(polygon); polygon = new Polygon(); polygon->addVertex(x,height,z, v, 1); polygon->addVertex(lastx,height,lastz, lastv, 1); polygon->addVertex(lastx,0,lastz,lastv,0); addPolygon(polygon); polygon = new Polygon(); polygon->addVertex(lastx,height,lastz, 0.5+(lastz/radius*0.5), 0.5+(lastx/radius*0.5)); polygon->addVertex(x,height,z, 0.5+(z/radius*0.5), 0.5+(x/radius*0.5)); polygon->addVertex(0,height,0,0.5,0.5); addPolygon(polygon); polygon = new Polygon(); polygon->addVertex(lastx,0,lastz, 0.5+(lastz/radius*0.5), 0.5+(lastx/radius*0.5)); polygon->addVertex(0,0,0,0.5,0.5); polygon->addVertex(x,0,z, 0.5+(z/radius*0.5), 0.5+(x/radius*0.5)); addPolygon(polygon); } lastx = x; lastz = z; lastv = v; /* Polygon *polygon = new Polygon(); polygon->addVertex(w,0,h, 1, 1); polygon->addVertex(0,0,h, 1, 0); polygon->addVertex(0,0,0,0,0); polygon->addVertex(w,0,0,0,1); addPolygon(polygon); */ } for(int i=0; i < polygons.size(); i++) { for(int j=0; j < polygons[i]->getVertexCount(); j++) { // polygons[i]->getVertex(j)->x = polygons[i]->getVertex(j)->x - (radius/2.0f); polygons[i]->getVertex(j)->y = polygons[i]->getVertex(j)->y - (height/2.0f); // polygons[i]->getVertex(j)->z = polygons[i]->getVertex(j)->z - (radius/2.0f); } } calculateNormals(); arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true; }
void Mesh::createTorus(Number radius, Number tubeRadius, int rSegments, int tSegments) { setMeshType(Mesh::TRI_MESH); Vector3 **grid = (Vector3 **) malloc(sizeof(Vector3*) * rSegments); for (int i=0 ; i < rSegments; i++) { grid[i] = (Vector3*) malloc(sizeof(Vector3) * tSegments); } for (int i=0 ; i < rSegments; i++) { for (int j = 0; j < tSegments; ++j) { Number u = ((Number)i) / rSegments * 2.0 * PI; Number v = ((Number)j) / tSegments * 2.0 * PI; grid[i][j] = Vector3((radius + tubeRadius*cos(v))*cos(u), tubeRadius*sin(v), (radius + tubeRadius*cos(v))*sin(u)); } } for (int i=0 ; i < rSegments; i++) { for (int j = 0; j < tSegments; ++j) { int ip = (i+1) % rSegments; int jp = (j+1) % tSegments; Vector3 a = grid[i ][j]; Vector3 b = grid[ip][j]; Vector3 c = grid[i ][jp]; Vector3 d = grid[ip][jp]; Vector2 uva = Vector2(((Number)i) / ((Number)rSegments), ((Number)j) / ((Number)tSegments)); Vector2 uvb = Vector2((((Number)i)+1.0) / ((Number)rSegments), ((Number)j) / ((Number)tSegments)); Vector2 uvc = Vector2(((Number)i) / ((Number)rSegments), (((Number)j)+1.0) / ((Number)tSegments)); Vector2 uvd = Vector2((((Number)i)+1.0) / ((Number)rSegments), (((Number)j)+1.0) / ((Number)tSegments)); Polygon *polygon = new Polygon(); polygon->addVertex(c.x, c.y, c.z, uvc.x ,uvc.y); polygon->addVertex(b.x, b.y, b.z, uvb.x ,uvb.y); polygon->addVertex(a.x, a.y, a.z, uva.x ,uva.y); addPolygon(polygon); polygon = new Polygon(); polygon->addVertex(b.x, b.y, b.z, uvb.x ,uvb.y); polygon->addVertex(c.x, c.y, c.z, uvc.x ,uvc.y); polygon->addVertex(d.x, d.y, d.z, uvd.x ,uvd.y); addPolygon(polygon); } } for (int i=0 ; i < rSegments; i++) { free(grid[i]); } free(grid); calculateNormals(); arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true; }
void Mesh::createSphere(Number _radius, int _segmentsH, int _segmentsW) { setMeshType(Mesh::TRI_MESH); Vector3 **grid = (Vector3 **) malloc(sizeof(Vector3*) * (_segmentsH+1)); for (int i=0 ; i < _segmentsH+1; i++) { grid[i] = (Vector3*) malloc(sizeof(Vector3) * _segmentsW+1); } for (int i = 0; i < _segmentsW; i++) { grid[0][i] = Vector3(0,-_radius,0); } for (int j = 1; j < _segmentsH; j++) { Number horangle = ((float)j) / ((float)_segmentsH) * PI; Number z = -_radius * cos(horangle); Number ringradius = _radius * sin(horangle); for (int i = 0; i < _segmentsW; i++) { Number verangle = 2.0 * ((float)i) / ((float)_segmentsW) * PI; Number x = ringradius * sin(verangle); Number y = ringradius * cos(verangle); grid[j][i] = Vector3(y, z, x); } } for (int i = 0; i < _segmentsW; i++) { grid[_segmentsH][i] = Vector3(0,_radius, 0); } for (int j = 1; j <= _segmentsH; j++) { for (int i = 0; i < _segmentsW; i++) { Vector3 a = grid[j][i]; Vector3 b = grid[j][(i-1+_segmentsW) % _segmentsW]; Vector3 c = grid[j-1][(i-1+_segmentsW) % _segmentsW]; Vector3 d = grid[j-1][i]; int i2 = i; if (i == 0) i2 = _segmentsW; Number vab = ((float)j) / ((float)_segmentsH); Number vcd = (((float)j)-1.0) / ((float)_segmentsH); Number uad = ((float)i2) / ((float)_segmentsW); Number ubc = (((float)i2)-1.0) / ((float)_segmentsW); Vector2 uva = Vector2(uad,vab); Vector2 uvb = Vector2(ubc,vab); Vector2 uvc = Vector2(ubc,vcd); Vector2 uvd = Vector2(uad,vcd); if (j < _segmentsH) { Polygon *polygon = new Polygon(); polygon->addVertex(c.x, c.y, c.z, uvc.x ,uvc.y); polygon->addVertex(b.x, b.y, b.z, uvb.x ,uvb.y); polygon->addVertex(a.x, a.y, a.z, uva.x ,uva.y); addPolygon(polygon); } if (j > 1) { Polygon *polygon = new Polygon(); polygon->addVertex(d.x, d.y, d.z, uvd.x ,uvd.y); polygon->addVertex(c.x, c.y, c.z, uvc.x ,uvc.y); polygon->addVertex(a.x, a.y, a.z, uva.x ,uva.y); addPolygon(polygon); } } } calculateNormals(); arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true; }
void Mesh::loadFromFile(OSFILE *inFile) { unsigned int meshType; OSBasics::read(&meshType, sizeof(unsigned int), 1, inFile); setMeshType(meshType); int verticesPerFace; switch(meshType) { case TRI_MESH: verticesPerFace = 3; break; case QUAD_MESH: verticesPerFace = 4; break; default: verticesPerFace = 1; break; } unsigned int numFaces; OSBasics::read(&numFaces, sizeof(unsigned int), 1, inFile); Vector3_struct pos; Vector3_struct nor; Vector4_struct col; Vector2_struct tex; for(int i=0; i < numFaces; i++) { Polygon *poly = new Polygon(); for(int j=0; j < verticesPerFace; j++) { OSBasics::read(&pos, sizeof(Vector3_struct), 1, inFile); OSBasics::read(&nor, sizeof(Vector3_struct), 1, inFile); OSBasics::read(&col, sizeof(Vector4_struct), 1, inFile); OSBasics::read(&tex, sizeof(Vector2_struct), 1, inFile); Vertex *vertex = new Vertex(pos.x, pos.y, pos.z); vertex->setNormal(nor.x,nor.y, nor.z); vertex->restNormal.set(nor.x,nor.y, nor.z); vertex->vertexColor.setColor(col.x,col.y, col.z, col.w); vertex->setTexCoord(tex.x, tex.y); unsigned int numBoneWeights; OSBasics::read(&numBoneWeights, sizeof(unsigned int), 1, inFile); for(int b=0; b < numBoneWeights; b++) { float weight; unsigned int boneID; OSBasics::read(&boneID, sizeof(unsigned int), 1, inFile); OSBasics::read(&weight, sizeof(float), 1, inFile); vertex->addBoneAssignment(boneID, weight); } Number totalWeight = 0; for(int m=0; m < vertex->getNumBoneAssignments(); m++) { BoneAssignment *ba = vertex->getBoneAssignment(m); totalWeight += ba->weight; } for(int m=0; m < vertex->getNumBoneAssignments(); m++) { BoneAssignment *ba = vertex->getBoneAssignment(m); ba->weight = ba->weight/totalWeight; } poly->addVertex(vertex); } addPolygon(poly); } arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true; arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true; }