Example #1
0
	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;			
	
	}
Example #2
0
	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;										
		
	}
Example #3
0
	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;										
				
	}
Example #4
0
	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;										
		
	}
Example #5
0
	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;							
	}