コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        //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();
                }
            }
        }
コード例 #3
0
ファイル: VVDParser.cs プロジェクト: skmasq/ProjectDeagle
    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);
    }