void MeshBuffer_SetVertex2T(IntPtr meshb, unsigned int nr, IntPtr vert) { SMeshBufferLightMap *mb = ((SMeshBufferLightMap*)meshb); if(nr >= mb->getVertexCount()) { mb->Vertices.push_back(*((S3DVertex2TCoords*)vert)); MeshBuffer_SetVertex2T(meshb, nr, vert); } else (((S3DVertex2TCoords*)(mb->getVertices()))[nr]) = *((S3DVertex2TCoords*)vert); }
//! constructs a mesh from the quake 3 level file. void CQ3LevelMesh::constructMesh() { // reserve buffer. s32 i; // new ISO for scoping problem with some compilers for (i=0; i<(NumTextures+1) * (NumLightMaps+1); ++i) { scene::SMeshBufferLightMap* buffer = new scene::SMeshBufferLightMap(); buffer->Material.MaterialType = video::EMT_LIGHTMAP_M4; buffer->Material.Wireframe = false; buffer->Material.Lighting = false; buffer->Material.BilinearFilter = true; Mesh[0]->addMeshBuffer(buffer); buffer->drop(); } // go through all faces and add them to the buffer. video::S3DVertex2TCoords temp[3]; for (i=0; i<NumFaces; ++i) { if (Faces[i].lightmapID < -1) Faces[i].lightmapID = -1; if (Faces[i].lightmapID > NumLightMaps-1) Faces[i].lightmapID = -1; // there are lightmapsids and textureid with -1 s32 meshBufferIndex = ((Faces[i].lightmapID+1) * (NumTextures+1)) + (Faces[i].textureID+1); SMeshBufferLightMap* meshBuffer = ((SMeshBufferLightMap*)Mesh[0]->getMeshBuffer(meshBufferIndex)); switch(Faces[i].type) { //case 3: // mesh vertices case 1: // normal polygons { for (s32 tf=0; tf<Faces[i].numMeshVerts; tf+=3) { s32 idx = meshBuffer->getVertexCount(); s32 vidxes[3]; vidxes[0] = MeshVerts[Faces[i].meshVertIndex + tf +0] + Faces[i].vertexIndex; vidxes[1] = MeshVerts[Faces[i].meshVertIndex + tf +1] + Faces[i].vertexIndex; vidxes[2] = MeshVerts[Faces[i].meshVertIndex + tf +2] + Faces[i].vertexIndex; // add all three vertices copy ( &temp[0], &Vertices[ vidxes[0] ], 0 ); copy ( &temp[1], &Vertices[ vidxes[1] ], 0 ); copy ( &temp[2], &Vertices[ vidxes[2] ], 0 ); meshBuffer->Vertices.push_back( temp[0] ); meshBuffer->Vertices.push_back( temp[1] ); meshBuffer->Vertices.push_back( temp[2] ); // add indexes meshBuffer->Indices.push_back(idx); meshBuffer->Indices.push_back(idx+1); meshBuffer->Indices.push_back(idx+2); } } break; case 2: // curved surfaces createCurvedSurface(meshBuffer, i); break; case 4: // billboards break; } // end switch } }