Пример #1
0
        private void Parse(BSPParser bspParser, VPKParser vpkParser)
        {
            if (vpkParser != null)
            {
                string mdlPath = modelPath + ".mdl";
                string vvdPath = modelPath + ".vvd";
                string vtxPath = modelPath + ".vtx";

                if ((bspParser != null && bspParser.HasPakFile(mdlPath)) || (vpkParser != null && vpkParser.FileExists(mdlPath)))
                {
                    if ((bspParser != null && bspParser.HasPakFile(vvdPath)) || (vpkParser != null && vpkParser.FileExists(vvdPath)))
                    {
                        if ((bspParser == null || !bspParser.HasPakFile(vtxPath)) && (vpkParser == null || !vpkParser.FileExists(vtxPath)))
                        {
                            vtxPath = modelPath + ".dx90.vtx";
                        }

                        if ((bspParser != null && bspParser.HasPakFile(vtxPath)) || (vpkParser != null && vpkParser.FileExists(vtxPath)))
                        {
                            using (MDLParser mdl = new MDLParser())
                                using (VVDParser vvd = new VVDParser())
                                    using (VTXParser vtx = new VTXParser())
                                    {
                                        try
                                        {
                                            if (bspParser != null && bspParser.HasPakFile(mdlPath))
                                            {
                                                bspParser.LoadPakFileAsStream(mdlPath, (stream, origOffset, byteCount) => { mdl.ParseHeader(stream, origOffset); });
                                            }
                                            else
                                            {
                                                vpkParser.LoadFileAsStream(mdlPath, (stream, origOffset, byteCount) => { mdl.ParseHeader(stream, origOffset); });
                                            }

                                            if (bspParser != null && bspParser.HasPakFile(vvdPath))
                                            {
                                                bspParser.LoadPakFileAsStream(vvdPath, (stream, origOffset, byteCount) => { vvd.ParseHeader(stream, origOffset); });
                                            }
                                            else
                                            {
                                                vpkParser.LoadFileAsStream(vvdPath, (stream, origOffset, byteCount) => { vvd.ParseHeader(stream, origOffset); });
                                            }

                                            int mdlChecksum = mdl.header1.checkSum;
                                            int vvdChecksum = (int)vvd.header.checksum;

                                            if (mdlChecksum == vvdChecksum)
                                            {
                                                if (bspParser != null && bspParser.HasPakFile(vtxPath))
                                                {
                                                    bspParser.LoadPakFileAsStream(vtxPath, (stream, origOffset, byteCount) => { vtx.ParseHeader(stream, origOffset); });
                                                }
                                                else
                                                {
                                                    vpkParser.LoadFileAsStream(vtxPath, (stream, origOffset, byteCount) => { vtx.ParseHeader(stream, origOffset); });
                                                }

                                                int vtxChecksum = vtx.header.checkSum;

                                                if (mdlChecksum == vtxChecksum)
                                                {
                                                    if (bspParser != null && bspParser.HasPakFile(mdlPath))
                                                    {
                                                        bspParser.LoadPakFileAsStream(mdlPath, (stream, origOffset, byteCount) => { mdl.Parse(stream, origOffset); });
                                                    }
                                                    else
                                                    {
                                                        vpkParser.LoadFileAsStream(mdlPath, (stream, origOffset, byteCount) => { mdl.Parse(stream, origOffset); });
                                                    }

                                                    if (bspParser != null && bspParser.HasPakFile(vvdPath))
                                                    {
                                                        bspParser.LoadPakFileAsStream(vvdPath, (stream, origOffset, byteCount) => { vvd.Parse(stream, mdl.header1.rootLod, origOffset); });
                                                    }
                                                    else
                                                    {
                                                        vpkParser.LoadFileAsStream(vvdPath, (stream, origOffset, byteCount) => { vvd.Parse(stream, mdl.header1.rootLod, origOffset); });
                                                    }

                                                    if (bspParser != null && bspParser.HasPakFile(vtxPath))
                                                    {
                                                        bspParser.LoadPakFileAsStream(vtxPath, (stream, origOffset, byteCount) => { vtx.Parse(stream, origOffset); });
                                                    }
                                                    else
                                                    {
                                                        vpkParser.LoadFileAsStream(vtxPath, (stream, origOffset, byteCount) => { vtx.Parse(stream, origOffset); });
                                                    }

                                                    version = mdl.header1.version;
                                                    id      = mdl.header1.id;

                                                    if (mdl.bodyParts != null)
                                                    {
                                                        ReadFaceMeshes(mdl, vvd, vtx, bspParser, vpkParser);
                                                    }
                                                    else
                                                    {
                                                        Debug.LogError("SourceModel: Could not find body parts of " + modelPath);
                                                    }
                                                }
                                                else
                                                {
                                                    Debug.LogError("SourceModel: MDL and VTX checksums don't match (" + mdlChecksum + " != " + vtxChecksum + ") vtxver(" + vtx.header.version + ") for " + modelPath);
                                                }
                                            }
                                            else
                                            {
                                                Debug.LogError("SourceModel: MDL and VVD checksums don't match (" + mdlChecksum + " != " + vvdChecksum + ") for " + modelPath);
                                            }
                                        }
                                        catch (System.Exception e)
                                        {
                                            Debug.LogError("SourceModel: " + e.ToString());
                                        }
                                    }
                        }
                        else
                        {
                            Debug.LogError("SourceModel: Could not find vtx file (" + vtxPath + ")");
                        }
                    }
                    else
                    {
                        Debug.LogError("SourceModel: Could not find vvd file (" + vvdPath + ")");
                    }
                }
                else
                {
                    Debug.LogError("SourceModel: Could not find mdl file (" + mdlPath + ")");
                }
            }
            else
            {
                Debug.LogError("SourceModel: VPK parser is null");
            }
        }