예제 #1
0
        public static Mipheader Read(BinaryReader br)
        {
            Mipheader mipheader = new Mipheader();

            mipheader.numtex = br.ReadInt32();
            mipheader.offset = new Int32[mipheader.numtex];
            for (int i = 0; i < mipheader.numtex; i++)
            {
                mipheader.offset[i] = br.ReadInt32();
            }
            return(mipheader);
        }
예제 #2
0
        public static Bsp Read(byte[] buf)
        {
            using (var ms = new MemoryStream(buf))
                using (var br = new BinaryReader(ms)) {
                    Header header = Header.Read(br);

                    Bsp bsp = new Bsp();

                    bsp.entities = ReadItems(br, header.entities, (b) => Entity.Read(b));
                    bsp.planes   = ReadItems(br, header.planes, (b) => Plane.Read(b));

                    br.BaseStream.Seek(header.miptex.offset, SeekOrigin.Begin);
                    bsp.mipheader = Mipheader.Read(br);
                    bsp.miptexs   = new Miptex[bsp.mipheader.numtex];
                    for (int i = 0; i < bsp.miptexs.Length; i++)
                    {
                        if (bsp.mipheader.offset[i] == -1)
                        {
                            continue;
                        }
                        br.BaseStream.Seek(header.miptex.offset + bsp.mipheader.offset[i], SeekOrigin.Begin);
                        bsp.miptexs[i] = Miptex.Read(br);
                    }

                    bsp.vertices  = ReadItems(br, header.vertices, (b) => new Vector3D(b.ReadSingle(), b.ReadSingle(), b.ReadSingle()));
                    bsp.vislist   = ReadItems(br, header.visilist, (b) => b.ReadByte());
                    bsp.nodes     = ReadItems(br, header.nodes, (b) => Node.Read(b));
                    bsp.texinfo   = ReadItems(br, header.texinfo, (b) => TexInfo.Read(b));
                    bsp.faces     = ReadItems(br, header.faces, (b) => Face.Read(b));
                    bsp.lightmaps = ReadItems(br, header.lightmaps, (b) => b.ReadByte());
                    bsp.clipnodes = ReadItems(br, header.clipnodes, (b) => Clipnode.Read(b));
                    bsp.leafs     = ReadItems(br, header.leafs, (b) => Leaf.Read(b));
                    bsp.lface     = ReadItems(br, header.lface, (b) => b.ReadUInt16());
                    bsp.edges     = ReadItems(br, header.edges, (b) => Edge.Read(b));
                    bsp.ledges    = ReadItems(br, header.ledges, (b) => b.ReadInt32());
                    bsp.models    = ReadItems(br, header.models, (b) => Model.Read(b));

                    bsp.mipMaterials = bsp.miptexs.Select((mip) => GetMipMaterial(mip)).ToArray();
                    bsp.mipModels    = bsp.faces.Select((face) => bsp.GetMipModel(face)).ToArray();
                    bsp.lightModels  = bsp.faces.Select((face) => bsp.GetLightModel(face)).ToArray();

                    return(bsp);
                }
        }