コード例 #1
0
ファイル: mesh.cpp プロジェクト: n3on/clearsky
	int MOFMesh::loadIndexChunk(MOF_CHUNK_HEADER *header, int meshNum)
	{
		//printf("MOF Load Index Chunk\n");

		int byteCount=0;
		MOFSubmesh *mesh = this->m_meshes[meshNum];

		mesh->setNumIndices(header->num);

		//printf("MOF num indices %i\n",header->num);

		char indexType = 0;
		byteCount += fread(&indexType,1,1,this->m_file);

		int *indexData = new int[header->num];

		for(int i=0;i<header->num;++i)
		{
			int index;
			int num;
			//if(indexType==1)
			num = fread(&index,1,4,this->m_file);
			//else if(indexType==0)
			//	num = fread(&index,1,2,this->m_file);

			byteCount +=num; 
			if(num!=4)
			{
				SAFE_ARRAY_DELETE(indexData);
				return RETURN_ERROR;
			}

			indexData[i] = index;

			//printf("MOF index[%i] %i\n",i,index);
		}


		IBuffer *indexBuffer = GLOBALS->getRenderer()->createBuffer();
		if(!indexBuffer)
		{
			SAFE_ARRAY_DELETE(indexData);
			return -1;
		}

		/*if(indexType==0)
		{
			printf("16!!\n");
			if(indexBuffer->create(indexData,2,header->num,BT_INDEX, FORMAT_R32_UINT)!=RETURN_OK)
				return -1;
		}
		else if(indexType==1)
		{
			printf("32!!\n");*/
		if(indexBuffer->create(indexData,4,header->num,BT_INDEX)!=RETURN_OK)
		{
			SAFE_ARRAY_DELETE(indexData);
			return -1;
		}
		//}

		mesh->setIndexBuffer(indexBuffer);

		SAFE_ARRAY_DELETE(indexData);
		return byteCount;
	}
コード例 #2
0
ファイル: mesh.cpp プロジェクト: n3on/clearsky
	int MOFMesh::loadVertexChunk(MOF_CHUNK_HEADER *header,int meshNum)
	{
		if(!this->m_file)
			return RETURN_ERROR;

		int byteCount;

		char numElements=0;
		byteCount = fread(&numElements,1,1,this->m_file);
			//return RETURN_ERROR;

		char topology=0;
		byteCount = fread(&topology,1,1,this->m_file);

		char windingOrder=0;
		byteCount = fread(&windingOrder,1,1,this->m_file);
		//if(header->num<=0)
		//	return RETURN_ERROR;

		MOFSubmesh *mesh = this->m_meshes[meshNum];

		if(windingOrder)
			mesh->setFrontOrder(true);
		else
			mesh->setFrontOrder(false);

		mesh->setNumVertices(header->num);
		mesh->setNumElementsVertex(numElements);

		Vertex *verts = new Vertex[header->num];
		//int count=sizeof(header->id)+sizeof(header->num)+sizeof(header->size)+sizeof(numElements);
		//int readBytes=0;

		//printf("\nMOF_VERTEX_CHUNK: \n");
		//printf("  numVertices: %d(hex: %x)\n  numElements %d(hex: %x)\n",header->num,header->num,numElements,numElements);

		char typeId;
		for(int i=0; i<header->num; ++i)
		{
			for(int j=0; j<numElements; ++j)
			{
				byteCount += fread(&typeId,1,1,this->m_file);

				switch(typeId)
				{
					case MOF_VERTEX_POSITION:
					{
						float vertVals[3];
				
						byteCount += fread(&vertVals,4,3,this->m_file);
						
						/*printf("\nMOF read %d Position: %f %f %f\n",i,vertVals[0],
								vertVals[1],
								vertVals[2]);*/

						Vector3D position(vertVals);
						verts[i].position = position;
					}break;
					case MOF_VERTEX_NORMAL:
					{
						float normVals[3];

						byteCount += fread(&normVals,4,3,this->m_file);
		
						Vector3D normal(normVals);
						D3DXVec3Normalize(&normal, &normal);
						verts[i].normal = normal;

						/*printf("\nMOF read %d Normals: %f %f %f\n",i,verts[i].normal.x,
								verts[i].normal.y,
								verts[i].normal.z);*/
					}break;
					case MOF_VERTEX_TANGENT:
					{
						float tangentVals[3];

						byteCount += fread(&tangentVals,4,3,this->m_file);
		
						Vector3D tangent(tangentVals);
						D3DXVec3Normalize(&tangent, &tangent);
						verts[i].tangent = tangent;

						//printf("\nMOF read %d Tangent: %f %f %f\n",i,verts[i].tangent.x,
						//		verts[i].tangent.y,
						//		verts[i].tangent.z);
					}break;
					case MOF_VERTEX_TEX:
					{
						float texVals[2];

						byteCount += fread(&texVals,4,2,this->m_file);

						Vector2D tex(texVals);
						//tex.x = 1-tex.x;
						tex.y = 1-tex.y;
						verts[i].texCoord0 = tex;

						//printf("\nMOF read %d Texture Coords: %f %f\n",i,texVals[0],texVals[1]);

					}break;
					case MOF_VERTEX_COLOR:
					{
						float colVals[4];

						byteCount += fread(&colVals,4*4,1,this->m_file);

						Color color(colVals);
						//verts[i].color = color;
					}break;
					default:
					{
					};

				}//end switch
					
			}//end for numelements
		}//end for num

		//TODO: improve codepaths to avoid multiple SAFE_DELETE stuff

		IBuffer *vertexBuffer = GLOBALS->getRenderer()->createBuffer();
		if(!vertexBuffer)
		{
			SAFE_DELETE(vertexBuffer);
			SAFE_ARRAY_DELETE(verts);
			return -1;
		}

		//mesh.setVertexBuffer(vertexBuffer);
		if(vertexBuffer->create(verts,sizeof(Vertex),header->num)!=RETURN_OK)
		{
			SAFE_DELETE(vertexBuffer);
			SAFE_ARRAY_DELETE(verts);
			return -1;
		}

		mesh->setVertexBuffer(vertexBuffer);

		//generate bounding box for the submesh
		AABB submeshAABB;
		submeshAABB.loadFromPosition(verts, header->num);
		mesh->setBoundingBox(submeshAABB);

		SAFE_ARRAY_DELETE(verts);
		return byteCount;
	}