コード例 #1
0
        public AreaFile ReadZoneData(byte[] data)
        {
            var areaFile = new AreaFile();

            using (var ms = new MemoryStream(data))
            {
                var buffer = new byte[4];

                ms.AssertAreaMagic();

                ms.Read(buffer, 0, buffer.Length);
                int version = BitConverter.ToInt32(buffer, 0);
                if (version != 0)
                    throw new InvalidDataException("Not supported version of area format!");

                ms.Seek(4, SeekOrigin.Current);
                //ms.Read(buffer, 0, buffer.Length);
                //uint dataLen = BitConverter.ToUInt32(buffer, 0);

                ms.Read(buffer, 0, buffer.Length);
                int layerCount = BitConverter.ToInt32(buffer, 0);

                for (int lc = 0; lc < layerCount; lc++)
                {
                    var areaList = new AreaColletion();

                    ms.Read(buffer, 0, buffer.Length);
                    int areasToRead = BitConverter.ToInt32(buffer, 0);

                    for (int a = 0; a < areasToRead; a++)
                        areaList.Add(ReadArea(ms));

                    areaFile.AreaManagers.Add(areaList);
                }
            }

            return areaFile;
        }
コード例 #2
0
        protected byte[] CreateAreaSubFile(AreaFile file)
        {
            using (var ms = new MemoryStream())
            {
                ms.WriteAreaMagic();
                ms.Write(BitConverter.GetBytes(AreaFileVersion), 0, 4);

                // Seek size part, needs to be written as we know.
                ms.Seek(4, SeekOrigin.Current);

                ms.Write(BitConverter.GetBytes(file.AreaManagers.Count), 0, 4);

                foreach (var areaManager in file.AreaManagers)
                {
                    ms.Write(BitConverter.GetBytes(areaManager.Count), 0, 4);

                    foreach (var area in areaManager)
                    {
                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(AreaPartVersion), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Id), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Name.Length), 0, 4);
                        var nameBuffer = Encoding.UTF8.GetBytes(area.Name);
                        ms.Write(nameBuffer, 0, nameBuffer.Length);
                        ms.Seek(Util.Utils.RoundToNextDivBy4(nameBuffer.Length) - nameBuffer.Length, SeekOrigin.Current);

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes((float)area.AttachmentPoint.X), 0, 4);
                        ms.Write(BitConverter.GetBytes((float)area.AttachmentPoint.Y), 0, 4);
                        ms.Write(BitConverter.GetBytes((float)area.AttachmentPoint.Z), 0, 4);

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(area.Content.ClippedAreas.Count),0,4);
                        foreach (var clippedArea in area.Content.ClippedAreas)
                        {
                            ms.Write(BitConverter.GetBytes(clippedArea.StartTriangle), 0, 4);
                            ms.Write(BitConverter.GetBytes(clippedArea.TriangleCount), 0, 4);
                            ms.Write(BitConverter.GetBytes(clippedArea.StartVertex), 0, 4);
                            ms.Write(BitConverter.GetBytes(clippedArea.VertexCount), 0, 4);
                        }

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(area.Content.BorderTriangle.StartTriangle), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.BorderTriangle.TriangleCount), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.BorderTriangle.StartVertex), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.BorderTriangle.VertexCount), 0, 4);

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(area.Content.BorderVertex.StartVertex), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.BorderVertex.VertexCount), 0, 4);

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(area.Content.Vertices.Count), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.Triangles.Count), 0, 4);
                        foreach (var vertex in area.Content.Vertices)
                        {
                            ms.Write(BitConverter.GetBytes(vertex.X), 0, 4);
                            ms.Write(BitConverter.GetBytes(vertex.Y), 0, 4);
                            ms.Write(BitConverter.GetBytes(vertex.Z), 0, 4);
                            ms.Write(BitConverter.GetBytes(vertex.W), 0, 4);
                            ms.Write(BitConverter.GetBytes(vertex.Center), 0, 4);
                        }

                        ms.WriteAreaMagic();
                        foreach (var triangle in area.Content.Triangles)
                        {
                            ms.Write(BitConverter.GetBytes(triangle.Point1), 0, 4);
                            ms.Write(BitConverter.GetBytes(triangle.Point2), 0, 4);
                            ms.Write(BitConverter.GetBytes(triangle.Point3), 0, 4);
                        }

                        ms.WriteAreaMagic();
                        ms.Seek(4, SeekOrigin.Current);
                        ms.WriteAreaMagic();

                        ms.Write(BitConverter.GetBytes(809782853), 0, 4);
                    }
                }

                ms.Seek(8, SeekOrigin.Begin);
                ms.Write(BitConverter.GetBytes((uint)(ms.Length-12)),0,4);

                return ms.ToArray();
            }
        }