Пример #1
0
        private void ReadHeader(Stream s)
        {
            MeshHeader h = new MeshHeader();

            h.MinPosition = new Vector3(Helpers.ReadFloat(s), Helpers.ReadFloat(s), Helpers.ReadFloat(s));
            h.Unknown01   = Helpers.ReadFloat(s);
            h.MaxPosition = new Vector3(Helpers.ReadFloat(s), Helpers.ReadFloat(s), Helpers.ReadFloat(s));
            h.Unknown02   = Helpers.ReadFloat(s);
            h.LODoffsets  = new long[6];
            for (int i = 0; i < 6; i++)
            {
                h.LODoffsets[i] = Helpers.ReadLong(s);
            }
            h.MeshPath            = SerializeString(s);
            h.MeshName            = SerializeString(s);
            h.Unknown03           = Helpers.ReadInt(s);
            h.Unknown04           = Helpers.ReadInt(s);
            h.Unknown05           = Helpers.ReadInt(s);
            h.TotalLODCount       = Helpers.ReadShort(s);
            h.TotalSubObjectCount = Helpers.ReadShort(s);
            h.LODs = new List <MeshLOD>();
            for (int i = 0; i < 6; i++)
            {
                if (h.LODoffsets[i] != 0)
                {
                    s.Seek(h.LODoffsets[i], 0);
                    h.LODs.Add(ReadMeshLOD(s));
                }
            }
            header = h;
        }
Пример #2
0
 private int[] readDTris(ByteBuffer buf, MeshHeader header)
 {
     int[] tris = new int[4 * header.detailTriCount];
     for (int i = 0; i < tris.Length; i++)
     {
         tris[i] = buf.get() & 0xFF;
     }
     return(tris);
 }
Пример #3
0
        static MeshHeader WriterHeader(this MeshAsset mesh, BinaryWriter sw)
        {
            MeshHeader header = new MeshHeader();

            header.Signature        = FourCC.Value('M', 'E', 'S', 'H');
            header.Machine          = 0;
            header.NumberOfSections = 1;
            header.SizeOfOptional   = 0;

            sw.Write(header.Signature);
            sw.Write(header.Machine);
            sw.Write(header.NumberOfSections);
            sw.Write(header.SizeOfOptional);
            return(header);
        }
Пример #4
0
 private PolyDetail[] readPolyDetails(ByteBuffer buf, MeshHeader header, bool cCompatibility)
 {
     PolyDetail[] polys = new PolyDetail[header.detailMeshCount];
     for (int i = 0; i < polys.Length; i++)
     {
         polys[i]           = new PolyDetail();
         polys[i].vertBase  = buf.Int;
         polys[i].triBase   = buf.Int;
         polys[i].vertCount = buf.get() & 0xFF;
         polys[i].triCount  = buf.get() & 0xFF;
         if (cCompatibility)
         {
             buf.Short;                     // C struct padding
         }
     }
     return(polys);
 }
Пример #5
0
 private OffMeshConnection[] readOffMeshCons(ByteBuffer buf, MeshHeader header)
 {
     OffMeshConnection[] cons = new OffMeshConnection[header.offMeshConCount];
     for (int i = 0; i < cons.Length; i++)
     {
         cons[i] = new OffMeshConnection();
         for (int j = 0; j < 6; j++)
         {
             cons[i].pos[j] = buf.Float;
         }
         cons[i].rad    = buf.Float;
         cons[i].poly   = buf.Short & 0xFFFF;
         cons[i].flags  = buf.get() & 0xFF;
         cons[i].side   = buf.get() & 0xFF;
         cons[i].userId = buf.Int;
     }
     return(cons);
 }
Пример #6
0
 private BVNode[] readBVTree(ByteBuffer buf, MeshHeader header)
 {
     BVNode[] nodes = new BVNode[header.bvNodeCount];
     for (int i = 0; i < nodes.Length; i++)
     {
         nodes[i] = new BVNode();
         for (int j = 0; j < 3; j++)
         {
             nodes[i].bmin[j] = buf.Short & 0xFFFF;
         }
         for (int j = 0; j < 3; j++)
         {
             nodes[i].bmax[j] = buf.Short & 0xFFFF;
         }
         nodes[i].i = buf.Int;
     }
     return(nodes);
 }
Пример #7
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public void write(java.io.OutputStream stream, org.recast4j.detour.MeshData data, java.nio.ByteOrder order, boolean cCompatibility) throws java.io.IOException
        public virtual void write(System.IO.Stream stream, MeshData data, ByteOrder order, bool cCompatibility)
        {
            MeshHeader header = data.header;

            write(stream, header.magic, order);
            write(stream, cCompatibility ? MeshHeader.DT_NAVMESH_VERSION : MeshHeader.DT_NAVMESH_VERSION_RECAST4J, order);
            write(stream, header.x, order);
            write(stream, header.y, order);
            write(stream, header.layer, order);
            write(stream, header.userId, order);
            write(stream, header.polyCount, order);
            write(stream, header.vertCount, order);
            write(stream, header.maxLinkCount, order);
            write(stream, header.detailMeshCount, order);
            write(stream, header.detailVertCount, order);
            write(stream, header.detailTriCount, order);
            write(stream, header.bvNodeCount, order);
            write(stream, header.offMeshConCount, order);
            write(stream, header.offMeshBase, order);
            write(stream, header.walkableHeight, order);
            write(stream, header.walkableRadius, order);
            write(stream, header.walkableClimb, order);
            write(stream, header.bmin[0], order);
            write(stream, header.bmin[1], order);
            write(stream, header.bmin[2], order);
            write(stream, header.bmax[0], order);
            write(stream, header.bmax[1], order);
            write(stream, header.bmax[2], order);
            write(stream, header.bvQuantFactor, order);
            writeVerts(stream, data.verts, header.vertCount, order);
            writePolys(stream, data, order);
            if (cCompatibility)
            {
                sbyte[] linkPlaceholder = new sbyte[header.maxLinkCount * MeshDataReader.getSizeofLink(false)];
                stream.Write(linkPlaceholder, 0, linkPlaceholder.Length);
            }
            writePolyDetails(stream, data, order, cCompatibility);
            writeVerts(stream, data.detailVerts, header.detailVertCount, order);
            writeDTris(stream, data);
            writeBVTree(stream, data, order);
            writeOffMeshCons(stream, data, order);
        }
Пример #8
0
 private Poly[] readPolys(ByteBuffer buf, MeshHeader header, int maxVertPerPoly)
 {
     Poly[] polys = new Poly[header.polyCount];
     for (int i = 0; i < polys.Length; i++)
     {
         polys[i]           = new Poly(i, maxVertPerPoly);
         polys[i].firstLink = buf.Int;
         for (int j = 0; j < polys[i].verts.Length; j++)
         {
             polys[i].verts[j] = buf.Short & 0xFFFF;
         }
         for (int j = 0; j < polys[i].neis.Length; j++)
         {
             polys[i].neis[j] = buf.Short & 0xFFFF;
         }
         polys[i].flags       = buf.Short & 0xFFFF;
         polys[i].vertCount   = buf.get() & 0xFF;
         polys[i].areaAndtype = buf.get() & 0xFF;
     }
     return(polys);
 }
Пример #9
0
        protected MeshHeader ReadHeader(Stream ms)
        {
            var head = new MeshHeader();

            var buffer = new byte[4];

            ms.Read(buffer, 0, buffer.Length);

            if (BitConverter.ToUInt32(buffer, 0) != MeshMagic)
            {
                throw new InvalidDataException("Wrong header magic");
            }

            ms.Read(buffer, 0, buffer.Length);
            head.Platform = BitConverter.ToUInt32(buffer, 0);

            ms.Read(buffer, 0, buffer.Length);
            head.Version = BitConverter.ToUInt32(buffer, 0);

            ms.Read(buffer, 0, buffer.Length);
            head.FileSize = BitConverter.ToUInt32(buffer, 0);

            var chkSumBuffer = new byte[16];

            ms.Read(chkSumBuffer, 0, chkSumBuffer.Length);
            head.Checksum = chkSumBuffer;

            ms.Read(buffer, 0, buffer.Length);
            head.HeaderOffset = BitConverter.ToUInt32(buffer, 0);
            ms.Read(buffer, 0, buffer.Length);
            head.HeaderSize = BitConverter.ToUInt32(buffer, 0);

            ms.Read(buffer, 0, buffer.Length);
            head.ContentOffset = BitConverter.ToUInt32(buffer, 0);
            ms.Read(buffer, 0, buffer.Length);
            head.ContentSize = BitConverter.ToUInt32(buffer, 0);

            return(head);
        }
Пример #10
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: org.recast4j.detour.MeshData read(ByteBuffer buf, int maxVertPerPoly, boolean is32Bit) throws java.io.IOException
        internal virtual MeshData read(ByteBuffer buf, int maxVertPerPoly, bool is32Bit)
        {
            MeshData   data   = new MeshData();
            MeshHeader header = new MeshHeader();

            data.header  = header;
            header.magic = buf.Int;
            if (header.magic != MeshHeader.DT_NAVMESH_MAGIC)
            {
                header.magic = IOUtils.swapEndianness(header.magic);
                if (header.magic != MeshHeader.DT_NAVMESH_MAGIC)
                {
                    throw new IOException("Invalid magic");
                }
                buf.order(buf.order() == ByteOrder.BIG_ENDIAN ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN);
            }
            header.version = buf.Int;
            if (header.version != MeshHeader.DT_NAVMESH_VERSION)
            {
                if (header.version != MeshHeader.DT_NAVMESH_VERSION_RECAST4J)
                {
                    throw new IOException("Invalid version");
                }
            }
            bool cCompatibility = header.version == MeshHeader.DT_NAVMESH_VERSION;

            header.x               = buf.Int;
            header.y               = buf.Int;
            header.layer           = buf.Int;
            header.userId          = buf.Int;
            header.polyCount       = buf.Int;
            header.vertCount       = buf.Int;
            header.maxLinkCount    = buf.Int;
            header.detailMeshCount = buf.Int;
            header.detailVertCount = buf.Int;
            header.detailTriCount  = buf.Int;
            header.bvNodeCount     = buf.Int;
            header.offMeshConCount = buf.Int;
            header.offMeshBase     = buf.Int;
            header.walkableHeight  = buf.Float;
            header.walkableRadius  = buf.Float;
            header.walkableClimb   = buf.Float;
            for (int j = 0; j < 3; j++)
            {
                header.bmin[j] = buf.Float;
            }
            for (int j = 0; j < 3; j++)
            {
                header.bmax[j] = buf.Float;
            }
            header.bvQuantFactor = buf.Float;
            data.verts           = readVerts(buf, header.vertCount);
            data.polys           = readPolys(buf, header, maxVertPerPoly);
            if (cCompatibility)
            {
                buf.position(buf.position() + header.maxLinkCount * getSizeofLink(is32Bit));
            }
            data.detailMeshes = readPolyDetails(buf, header, cCompatibility);
            data.detailVerts  = readVerts(buf, header.detailVertCount);
            data.detailTris   = readDTris(buf, header);
            data.bvTree       = readBVTree(buf, header);
            data.offMeshCons  = readOffMeshCons(buf, header);
            return(data);
        }
Пример #11
0
        public void Read(byte[] data)
        {
            int pos = 0;

            // read the data header
            CmpParser.ParseUInt32(data, ref pos); // MeshType
            CmpParser.ParseUInt32(data, ref pos); // SurfaceType
            this.MeshCount            = CmpParser.ParseUInt16(data, ref pos);
            this.NumRefVertices       = CmpParser.ParseUInt16(data, ref pos);
            this.FlexibleVertexFormat = (D3Dfvf)CmpParser.ParseUInt16(data, ref pos);
            this.VertexCount          = CmpParser.ParseUInt16(data, ref pos);

            // the FVF defines what fields are included for each vertex

            /*switch (FlexibleVertexFormat)
             * {
             *  case D3DFVF.XYZ:
             *  case D3DFVF.XYZ | D3DFVF.NORMAL:
             *  case D3DFVF.XYZ | D3DFVF.TEX1:
             *  case D3DFVF.XYZ | D3DFVF.NORMAL  | D3DFVF.TEX1:
             *  case D3DFVF.XYZ | D3DFVF.DIFFUSE | D3DFVF.TEX1:
             *  case D3DFVF.XYZ | D3DFVF.NORMAL  | D3DFVF.DIFFUSE | D3DFVF.TEX1:
             *  case D3DFVF.XYZ | D3DFVF.NORMAL  | D3DFVF.TEX2:
             *  case D3DFVF.XYZ | D3DFVF.NORMAL  | D3DFVF.DIFFUSE | D3DFVF.TEX2:
             *      break;
             *  default:
             *      throw new Exception(string.Format("FVF 0x{0:X} not supported.", FlexibleVertexFormat));
             * }*/

            // read the mesh headers
            int triangleStartOffset = 0;

            this.Meshes = new MeshHeader[this.MeshCount];
            for (int i = 0; i < this.MeshCount; ++i)
            {
                MeshHeader mesh = new MeshHeader();
                CmpParser.ParseUInt32(data, ref pos); // MaterialId
                mesh.StartVertex    = CmpParser.ParseUInt16(data, ref pos);
                mesh.EndVertex      = CmpParser.ParseUInt16(data, ref pos);
                mesh.NumRefVertices = CmpParser.ParseUInt16(data, ref pos);
                CmpParser.ParseUInt16(data, ref pos); // Padding

                mesh.TriangleStart   = triangleStartOffset;
                triangleStartOffset += mesh.NumRefVertices;

                this.Meshes[i] = mesh;
            }

            // read the triangle data
            int triangleCount = this.NumRefVertices / 3;

            this.Triangles = new Triangle[triangleCount];
            for (int i = 0; i < triangleCount; ++i)
            {
                Triangle triangle = new Triangle();
                triangle.Vertex1  = CmpParser.ParseUInt16(data, ref pos);
                triangle.Vertex3  = CmpParser.ParseUInt16(data, ref pos);
                triangle.Vertex2  = CmpParser.ParseUInt16(data, ref pos);
                this.Triangles[i] = triangle;
            }

            // read the vertex data
            try
            {
                this.Vertices = new Vertex[this.VertexCount];
                for (int i = 0; i < this.VertexCount; ++i)
                {
                    Vertex vertex = new Vertex();
                    vertex.Fvf = this.FlexibleVertexFormat;

                    vertex.Position = CmpParser.ParsePoint3D(data, ref pos);

                    if ((this.FlexibleVertexFormat & D3Dfvf.Normal) == D3Dfvf.Normal)
                    {
                        vertex.Normal = CmpParser.ParseVector3D(data, ref pos);
                    }

                    if ((this.FlexibleVertexFormat & D3Dfvf.Diffuse) == D3Dfvf.Diffuse)
                    {
                        CmpParser.ParseUInt32(data, ref pos); // Diffuse
                    }

                    if ((this.FlexibleVertexFormat & D3Dfvf.Tex1) == D3Dfvf.Tex1)
                    {
                        CmpParser.ParseFloat(data, ref pos); // S
                        CmpParser.ParseFloat(data, ref pos); // T
                    }

                    if ((this.FlexibleVertexFormat & D3Dfvf.Tex2) == D3Dfvf.Tex2)
                    {
                        CmpParser.ParseFloat(data, ref pos); // S
                        CmpParser.ParseFloat(data, ref pos); // T
                        CmpParser.ParseFloat(data, ref pos); // U
                        CmpParser.ParseFloat(data, ref pos); // V
                    }

                    if ((this.FlexibleVertexFormat & D3Dfvf.Tex4) == D3Dfvf.Tex4)
                    {
                        CmpParser.ParseFloat(data, ref pos); // S
                        CmpParser.ParseFloat(data, ref pos); // T
                        CmpParser.ParseFloat(data, ref pos); // TangentX
                        CmpParser.ParseFloat(data, ref pos); // TangentY
                        CmpParser.ParseFloat(data, ref pos); // TangentZ
                        CmpParser.ParseFloat(data, ref pos); // BinormalX
                        CmpParser.ParseFloat(data, ref pos); // BinormalY
                        CmpParser.ParseFloat(data, ref pos); // BinormalZ
                    }

                    if ((this.FlexibleVertexFormat & D3Dfvf.Tex5) == D3Dfvf.Tex5)
                    {
                        CmpParser.ParseFloat(data, ref pos); // S
                        CmpParser.ParseFloat(data, ref pos); // T
                        CmpParser.ParseFloat(data, ref pos); // U
                        CmpParser.ParseFloat(data, ref pos); // V
                        CmpParser.ParseFloat(data, ref pos); // TangentX
                        CmpParser.ParseFloat(data, ref pos); // TangentY
                        CmpParser.ParseFloat(data, ref pos); // TangentZ
                        CmpParser.ParseFloat(data, ref pos); // BinormalX
                        CmpParser.ParseFloat(data, ref pos); // BinormalY
                        CmpParser.ParseFloat(data, ref pos); // BinormalZ
                    }

                    this.Vertices[i] = vertex;
                }
            }
            catch
            {
                // MessageBox.Show("Header has more vertices then data", "Error");
            }
        }
Пример #12
0
        public static async Task HandleIncomingConnections()
        {
            while (true)
            {
                // Will wait here until we hear from a connection
                HttpListenerContext ctx = await listener.GetContextAsync();

                // Peel out the requests and response objects
                HttpListenerRequest  req  = ctx.Request;
                HttpListenerResponse resp = ctx.Response;

                byte[] data = { };

                switch (req.Url.AbsolutePath)
                {
                case "/getvmf":
                    string[] files = Directory.GetFiles(@"D:\Downloads\INFRA vmf\", req.QueryString["q"], SearchOption.AllDirectories);
                    if (files.Length > 0)
                    {
                        data = File.ReadAllBytes(files[0]);
                    }
                    break;

                case "/getmat":
                    string mat_dir = "materials/" + req.QueryString["q"] + ".vmt";

                    if (!File.Exists(gamefiles + mat_dir))                             // check if this material even exists
                    {
                        Console.Write("material doesnt exist " + mat_dir);
                        data = Encoding.UTF8.GetBytes("bad material " + mat_dir);
                        break;
                    }

                    string matname = Path.GetFileNameWithoutExtension(mat_dir.Split("\\").Last());
                    string outfile = $"{matname}.png";

                    if (File.Exists(sourceImport + outfile))                             // check if this material has already been extracted
                    {
                        data = Encoding.UTF8.GetBytes("rbxasset://sourceimport/" + outfile);
                        break;
                    }

                    vmt    vmtdata = new vmt(gamefiles + mat_dir);
                    string png     = vtf2png(vmtdata.basetexture);

                    if (File.Exists(png))                             // if it doesn't exist lets send back an invalid asset anyways.
                    {
                        File.Copy(png, sourceImport + outfile, true);
                    }

                    data = Encoding.UTF8.GetBytes("rbxasset://sourceimport/" + outfile);
                    break;

                case "/getmodel":
                    string mdl_dir = req.QueryString["q"];

                    if (!mdl_dir.StartsWith("models/") || !File.Exists(gamefiles + mdl_dir))                             // check if this model even exists
                    {
                        data = Encoding.UTF8.GetBytes("bad model");
                        break;
                    }

                    string mdlname     = Path.GetFileNameWithoutExtension(mdl_dir.Split("/").Last());
                    string outFileName = mdlname + ".mesh";
                    string outFile     = sourceImport + outFileName;

                    if (!File.Exists(outFile))                             // check if this model has already been extracted
                    {
                        Process.Start("Crowbar.exe", $"-p \"{gamefiles + mdl_dir}\" -o \"tmp\\{mdlname}\"");
                    }

                    while (!Directory.Exists($"tmp\\{mdlname}"))
                    {
                        Thread.Sleep(10);
                    }

                    WaitForExtract($"tmp\\{mdlname}\\{mdlname}.qc");
                    qc modelInfo = new qc(mdlname);
                    WaitForExtract($"tmp\\{mdlname}\\{modelInfo.smdFile}");

                    List <smdVert> verts = smd.GetSmdData($"tmp\\{mdlname}\\{modelInfo.smdFile}");
                    string         probablythetexture = modelInfo.cdmaterials + modelInfo.texturegroup[0][0];

                    using (FileStream file = File.Open(outFile, FileMode.Create))
                    {
                        StreamWriter writer = new StreamWriter(file);
                        writer.WriteLine("version 2.00");
                        writer.Flush();

                        MeshHeader meshHeader = new MeshHeader();
                        meshHeader.sizeof_MeshHeader = (short)Marshal.SizeOf(typeof(MeshHeader));
                        meshHeader.sizeof_Vertex     = (byte)Marshal.SizeOf(typeof(Vertex));
                        meshHeader.sizeof_Face       = (byte)Marshal.SizeOf(typeof(Face));
                        meshHeader.numVerts          = (uint)verts.Count;
                        meshHeader.numFaces          = (uint)verts.Count / 3;
                        Write(file, meshHeader);

                        for (int i = 0; i < meshHeader.numVerts; i++)
                        {
                            Vertex vertex = new Vertex();
                            vertex.px = verts[i].PosX;
                            vertex.py = verts[i].PosY;
                            vertex.pz = verts[i].PosZ;
                            vertex.nx = verts[i].NormX;
                            vertex.ny = verts[i].NormY;
                            vertex.nz = verts[i].NormZ;
                            vertex.tu = verts[i].U;
                            vertex.tv = 1 - verts[i].V;
                            vertex.tw = 0;
                            vertex.r  = 255;
                            vertex.g  = 255;
                            vertex.b  = 255;
                            vertex.a  = 255;

                            Write(file, vertex);
                        }

                        for (uint i = 0; i < meshHeader.numFaces; i++)
                        {
                            Face face = new Face();
                            face.a = i * 3 + 0;
                            face.b = i * 3 + 1;
                            face.c = i * 3 + 2;

                            Write(file, face);
                        }

                        writer.Close();
                    }

                    data = Encoding.UTF8.GetBytes("rbxasset://sourceimport/" + outFileName + "|" + probablythetexture);
                    Console.WriteLine("Exported.");

                    break;
                }

                // Write the response info
                resp.ContentType     = "text/html";
                resp.ContentEncoding = Encoding.UTF8;
                resp.ContentLength64 = data.LongLength;

                // Write out to the response stream (asynchronously), then close it
                await resp.OutputStream.WriteAsync(data, 0, data.Length);

                resp.Close();
            }
        }
Пример #13
0
 private void ReadHeader(Stream s)
 {
     MeshHeader h = new MeshHeader();
     h.MinPosition = new Vector3(Helpers.ReadFloat(s), Helpers.ReadFloat(s), Helpers.ReadFloat(s));
     h.Unknown01 = Helpers.ReadFloat(s);
     h.MaxPosition = new Vector3(Helpers.ReadFloat(s), Helpers.ReadFloat(s), Helpers.ReadFloat(s));
     h.Unknown02 = Helpers.ReadFloat(s);
     h.LODoffsets = new long[6];
     for (int i = 0; i < 6; i++)
         h.LODoffsets[i] = Helpers.ReadLong(s);
     h.MeshPath = SerializeString(s);
     h.MeshName = SerializeString(s);
     h.Unknown03 = Helpers.ReadInt(s);
     h.Unknown04 = Helpers.ReadInt(s);
     h.Unknown05 = Helpers.ReadInt(s);
     h.TotalLODCount = Helpers.ReadShort(s);
     h.TotalSubObjectCount = Helpers.ReadShort(s);
     h.LODs = new List<MeshLOD>();
     for (int i = 0; i < 6; i++)
         if (h.LODoffsets[i] != 0)
         {
             s.Seek(h.LODoffsets[i], 0);
             h.LODs.Add(ReadMeshLOD(s));
         }
     header = h;
 }
Пример #14
0
 public Mesh(MeshHeader header, BinaryReader reader)
 {
     Header = header;
     var start = reader.BaseStream.Position;
 }