static void ParseVvdFile() { if (VVD_Header.checksum != MDL_Header.checksum) { throw new FileLoadException(String.Format("{0}: Does not match the checksum in the .mdl", ModelObject.name + ".vvd")); } VVD_Fixups = new vertexFileFixup_t[VVD_Header.numFixups]; ModelFileLoader.ReadArray(ref VVD_Fixups, VVD_Header.fixupTableStart); if (VVD_Header.numFixups == 0) { mstudiovertex_t[] thisVertexes = new mstudiovertex_t[VVD_Header.numLODVertexes[0]]; ModelFileLoader.ReadArray(ref thisVertexes, VVD_Header.vertexDataStart); VVD_Vertexes.AddRange(thisVertexes); } for (Int32 i = 0; i < VVD_Header.numFixups; i++) { if (VVD_Fixups[i].lod >= 0) { mstudiovertex_t[] thisVertexes = new mstudiovertex_t[VVD_Fixups[i].numVertexes]; ModelFileLoader.ReadArray(ref thisVertexes, VVD_Header.vertexDataStart + (VVD_Fixups[i].sourceVertexID * 48)); VVD_Vertexes.AddRange(thisVertexes); } } }
//TODO //public Boolean HasTangents; //TODO: //Fix missed vertexes on some meshes. (on lod's & sometimes the main model) public VVDFile(Stream FileInput, MDLFile mdl) { using (uReader FileStream = new uReader(FileInput)) { FileStream.ReadTypeFixed(ref VVD_Header, 64); if (VVD_Header.checksum != mdl.MDL_Header.checksum) { throw new FileLoadException(String.Format("{0}: Does not match the checksum in the .mdl", mdl.MDL_Header.Name)); } if (VVD_Header.numFixups > 0) { VVD_Fixups = new vertexFileFixup_t[VVD_Header.numFixups]; FileStream.ReadArrayFixed(ref VVD_Fixups, 12, VVD_Header.fixupTableStart); } //TODO //HasTangents = VVD_Header.tangentDataStart != 0; //"HasTagents" used to avoid non-zero length //Int64 TotalVerts = (HasTangents ? VVD_Header.tangentDataStart - VVD_Header.vertexDataStart : FileStream.InputStream.Length - VVD_Header.vertexDataStart) / 48; mstudiovertex_t[] tempVerts = new mstudiovertex_t[VVD_Header.numLODVertexes[0]]; FileStream.ReadArrayFixed(ref tempVerts, 48, VVD_Header.vertexDataStart); VVD_Vertexes = new mstudiovertex_t[VVD_Header.numLODs][]; List <mstudiovertex_t> TempVerts = new List <mstudiovertex_t>(); for (Int32 LODID = 0; LODID < VVD_Header.numLODs; ++LODID) { if (VVD_Header.numFixups == 0) { VVD_Vertexes[LODID] = tempVerts.Take(VVD_Header.numLODVertexes[LODID]).ToArray(); continue; } TempVerts.Clear(); for (Int32 FixupID = 0; FixupID < VVD_Fixups.Length; FixupID++) { if (VVD_Fixups[FixupID].lod >= LODID) { TempVerts.AddRange(tempVerts.Skip(VVD_Fixups[FixupID].sourceVertexID).Take(VVD_Fixups[FixupID].numVertexes)); } } VVD_Vertexes[LODID] = TempVerts.ToArray(); } } }
public mstudiovertex_t[][] ParseVertices() { if (header.numLODs > 0) { stream.Position = header.vertexDataStart; vertices = new mstudiovertex_t[header.numLODVertices.Length][]; for (int i = 0; i < vertices.Length; i++) { vertices[i] = new mstudiovertex_t[header.numLODVertices[i]]; for (int j = 0; j < vertices[i].Length; j++) { vertices[i][j].m_BoneWeights.weight = new float[MAX_NUM_BONES_PER_VERT]; for (int k = 0; k < vertices[i][j].m_BoneWeights.weight.Length; k++) { vertices[i][j].m_BoneWeights.weight[k] = FileReader.readFloat(stream); } vertices[i][j].m_BoneWeights.bone = new char[MAX_NUM_BONES_PER_VERT]; for (int k = 0; k < vertices[i][j].m_BoneWeights.bone.Length; k++) { vertices[i][j].m_BoneWeights.bone[k] = FileReader.readChar(stream); } vertices[i][j].m_BoneWeights.numbones = FileReader.readByte(stream); vertices[i][j].m_vecPosition = new Vector3(FileReader.readFloat(stream), FileReader.readFloat(stream), FileReader.readFloat(stream)); vertices[i][j].m_vecPosition = new Vector3(vertices[i][j].m_vecPosition.x, vertices[i][j].m_vecPosition.z, vertices[i][j].m_vecPosition.y); vertices[i][j].m_vecNormal = new Vector3(FileReader.readFloat(stream), FileReader.readFloat(stream), FileReader.readFloat(stream)); vertices[i][j].m_vecNormal = new Vector3(vertices[i][j].m_vecNormal.x, vertices[i][j].m_vecNormal.z, vertices[i][j].m_vecNormal.y); vertices[i][j].m_vecTexCoord = new Vector2(FileReader.readFloat(stream), FileReader.readFloat(stream)); vertices[i][j].m_vecTexCoord = new Vector2(vertices[i][j].m_vecTexCoord.x, 1 - vertices[i][j].m_vecTexCoord.y); } } } return(vertices); }