Ejemplo n.º 1
0
        public static void Save(WadFile wad, Stream stream)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            var writer = new BinaryWriter(stream);

            var startOffset = stream.Position;

            // Version
            writer.Write(Version);
            writer.Flush();

            // Header

            // Valid texture count (number of entries)
            writer.Write((int)wad.Textures.Count(t => t is Texture));
            // TextureLumpInfo offset position
            // Will be changed later
            var global_textureLumpInfo_offset_position = stream.Position;

            writer.Write((int)0);
            writer.Flush();

            List <int>    positions = new List <int>();
            List <char[]> names     = new List <char[]>();
            List <int>    sizes     = new List <int>();

            for (int i = 0; i < wad.Textures.Count; i++)
            {
                long position = stream.Position - startOffset;
                positions.Add((int)position);

                TextureByteIndexPaletteWithMipmaps texture;
                TextureLumpInfo textureLump;

                var t = wad.Textures[i];

                if (t is TextureByteIndexPalette)
                {
                    if (t is TextureByteIndexPaletteWithMipmaps)
                    {
                        texture = (TextureByteIndexPaletteWithMipmaps)t;
                    }
                    else
                    {
                        var tbip = (TextureByteIndexPalette)t;
                        texture = tbip.GenerateMipmaps(TextureLumpInfo.MipmapOffsetsLength);
                    }
                }
                else
                {
                    //throw new NotImplementedException("Textures without byte palette are not supported yet");
                    var tbip = TextureByteIndexPalette.CreateFromBitmap(t);
                    texture = tbip.GenerateMipmaps(TextureLumpInfo.MipmapOffsetsLength);
                }
                textureLump = new TextureLumpInfo(texture);

                textureLump.Save(writer);

                long length = stream.Position - position - startOffset;
                sizes.Add((int)length);
            }

            var global_wadEntry_position = stream.Position;

            stream.Position = global_textureLumpInfo_offset_position;
            writer.Write((int)(global_wadEntry_position - startOffset));
            writer.Flush();

            stream.Position = global_wadEntry_position;

            for (int i = 0; i < positions.Count; i++)
            {
                var position = positions[i];
                var name     = names[i];
                var size     = sizes[i];

                var entry = new WadEntry((int)(position - startOffset), size, WadEntry.TextureType, name);
                entry.Write(writer);
            }
        }