Пример #1
0
 protected override void SaveToStream(Stream stream, DataStructures.MapObjects.Map map)
 {
     var bw = new BinaryWriter(stream, Encoding.UTF8);
     bw.Write(2.2f); // RMF version number
     bw.WriteFixedLengthString(Encoding.UTF8, 3, "RMF");
     WriteVisgroups(bw, map.Visgroups);
     WriteMapObject(bw, map.WorldSpawn);
     bw.WriteFixedLengthString(Encoding.UTF8, 8, "DOCINFO");
     bw.Write(0.2f); // Unused
     bw.Write(map.Cameras.IndexOf(map.ActiveCamera));
     WriteCameras(bw, map.Cameras);
 }
Пример #2
0
 private static void WriteVisgroups(BinaryWriter bw, IEnumerable<Visgroup> visgroups)
 {
     var vis = visgroups.Where(x => !x.IsAutomatic).ToList();
     bw.Write(vis.Count);
     foreach (var visgroup in vis)
     {
         bw.WriteFixedLengthString(Encoding.UTF8, 128, visgroup.Name);
         bw.WriteRGBAColour(visgroup.Colour);
         bw.Write(visgroup.ID);
         bw.Write(visgroup.Visible);
         bw.Write(new byte[3]); // Unused
     }
 }
Пример #3
0
 private static void WritePathNode(BinaryWriter bw, PathNode node)
 {
     bw.WriteCoordinate(node.Position);
     bw.Write(node.ID);
     bw.WriteFixedLengthString(Encoding.UTF8, 128, node.Name);
     bw.Write(node.Properties.Count);
     foreach (var property in node.Properties)
     {
         WriteProperty(bw, property);
     }
 }
Пример #4
0
 private static void WritePath(BinaryWriter bw, Path path)
 {
     bw.WriteFixedLengthString(Encoding.UTF8, 128, path.Name);
     bw.WriteFixedLengthString(Encoding.UTF8, 128, path.Type);
     bw.Write((int) path.Direction);
     bw.Write(path.Nodes.Count);
     foreach (var node in path.Nodes)
     {
         WritePathNode(bw, node);
     }
 }
Пример #5
0
 private static void WriteFace(BinaryWriter bw, Face face)
 {
     bw.WriteFixedLengthString(Encoding.UTF8, 256, face.Texture.Name);
     bw.Write(new byte[4]);
     bw.WriteCoordinate(face.Texture.UAxis);
     bw.WriteDecimalAsSingle(face.Texture.XShift);
     bw.WriteCoordinate(face.Texture.VAxis);
     bw.WriteDecimalAsSingle(face.Texture.YShift);
     bw.WriteDecimalAsSingle(face.Texture.Rotation);
     bw.WriteDecimalAsSingle(face.Texture.XScale);
     bw.WriteDecimalAsSingle(face.Texture.YScale);
     bw.Write(new byte[16]);
     bw.Write(face.Vertices.Count);
     foreach (var vertex in face.Vertices)
     {
         bw.WriteCoordinate(vertex.Location);
     }
     bw.WritePlane(face.Vertices.Select(v => v.Location).ToArray());
 }
Пример #6
0
        private void PrepareData(BinaryReader br)
        {
            var startIndex = br.BaseStream.Position;
            const uint headerSize = 14;
            const uint infoSize = 40;
            _length = headerSize + infoSize + _entry.PaletteSize * 4 + _entry.Width * _entry.Height;
            _data = new byte[_length];
            using (var bw = new BinaryWriter(new MemoryStream(_data, true)))
            {
                // BITMAPFILEHEADER
                bw.WriteFixedLengthString(Encoding.ASCII, 2, "BM"); // Type
                bw.Write(_length); // Size
                bw.Write((short)0); // Reserved 1
                bw.Write((short)0); // Reserved 2
                bw.Write((int) (headerSize + infoSize + _entry.PaletteSize * 4)); // Offset to pixel array

                // BITMAPINFOHEADER
                bw.Write(infoSize); // Header size
                bw.Write(_entry.Width);
                bw.Write(_entry.Height);
                bw.Write((short) 1); // Number of colour planes
                bw.Write((short) 8); // Colour depth
                bw.Write(0); // Compression method
                bw.Write(_entry.Width * _entry.Height); // Image data size
                bw.Write(0); // Horizontal resolution
                bw.Write(0); // Vertical resolution
                bw.Write(_entry.PaletteSize); // Colours used
                bw.Write(_entry.PaletteSize); // "Important" colours used

                br.BaseStream.Position = startIndex + (_entry.PaletteDataOffset - _entry.Offset);
                var paletteData = br.ReadBytes((int)(_entry.PaletteSize * 3));
                for (var i = 0; i < _entry.PaletteSize; i++)
                {
                    // Wad palettes are RGB, bitmap is BGRX
                    bw.Write(paletteData[i * 3 + 2]);
                    bw.Write(paletteData[i * 3 + 1]);
                    bw.Write(paletteData[i * 3 + 0]);
                    bw.Write((byte)0);
                }

                br.BaseStream.Position = startIndex + (_entry.TextureDataOffset - _entry.Offset);
                var imageData = br.ReadBytes((int)(_entry.Width * _entry.Height));
                for (var y = (int)_entry.Height - 1; y >= 0; y--)
                {
                    // The Y axis is reversed
                    bw.Write(imageData, (int)_entry.Width * y, (int) _entry.Width);
                }
            }
        }