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); }
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 } }
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); } }
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); } }
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()); }
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); } } }