Пример #1
0
        public MapGeometryModel(BinaryReader br, List <MapGeometryVertexElementGroup> vertexElementGroups, List <long> vertexBufferOffsets, List <ushort[]> indexBuffers, bool useSeparatePointLights, uint version)
        {
            this.Name = Encoding.ASCII.GetString(br.ReadBytes(br.ReadInt32()));
            uint vertexCount        = br.ReadUInt32();
            uint vertexBufferCount  = br.ReadUInt32();
            int  vertexElementGroup = br.ReadInt32();

            for (int i = 0; i < vertexCount; i++)
            {
                this.Vertices.Add(new MapGeometryVertex());
            }

            for (int i = 0, currentVertexElementGroup = vertexElementGroup; i < vertexBufferCount; i++, currentVertexElementGroup++)
            {
                int  vertexBufferID = br.ReadInt32();
                long returnPosition = br.BaseStream.Position;
                br.BaseStream.Seek(vertexBufferOffsets[vertexBufferID], SeekOrigin.Begin);

                for (int j = 0; j < vertexCount; j++)
                {
                    this.Vertices[j] = MapGeometryVertex.Combine(this.Vertices[j], new MapGeometryVertex(br, vertexElementGroups[currentVertexElementGroup].VertexElements));
                }

                br.BaseStream.Seek(returnPosition, SeekOrigin.Begin);
            }

            uint indexCount  = br.ReadUInt32();
            int  indexBuffer = br.ReadInt32();

            this.Indices.AddRange(indexBuffers[indexBuffer]);

            uint submeshCount = br.ReadUInt32();

            for (int i = 0; i < submeshCount; i++)
            {
                this.Submeshes.Add(new MapGeometrySubmesh(br, this));
            }

            if (version != 5)
            {
                this.FlipNormals = br.ReadBoolean();
            }

            this.BoundingBox    = new R3DBox(br);
            this.Transformation = new R3DMatrix44(br);
            this.Flags          = (MapGeometryModelFlags)br.ReadByte();

            if (version >= 7)
            {
                this.Layer = (MapGeometryLayer)br.ReadByte();

                if (version >= 11)
                {
                    this.UnknownByte = br.ReadByte();
                }
            }

            if (useSeparatePointLights && (version < 7))
            {
                this.SeparatePointLight = br.ReadVector3();
            }

            if (version < 9)
            {
                for (int i = 0; i < 9; i++)
                {
                    this.UnknownFloats.Add(br.ReadVector3());
                }

                this.Lightmap = Encoding.ASCII.GetString(br.ReadBytes(br.ReadInt32()));
                this.Color    = br.ReadColor(ColorFormat.RgbaF32);
            }
            else if (version >= 9)
            {
                this.Lightmap = Encoding.ASCII.GetString(br.ReadBytes(br.ReadInt32()));
                this.Color    = br.ReadColor(ColorFormat.RgbaF32);

                this.BakedPaintTexture = Encoding.ASCII.GetString(br.ReadBytes(br.ReadInt32()));
                this.BakedPaintColor   = br.ReadColor(ColorFormat.RgbaF32);
            }
        }