コード例 #1
0
        public static Frame ParseFrame(RomData romData, BitmapTexture[,] bitmapFrame)
        {
            var frame = new Frame();

            // parse palettes and textures
            GBPalette[,] palettes = new GBPalette[Frame.Height, Frame.Width];
            GBTexture[,] textures = new GBTexture[Frame.Height, Frame.Width];

            var pushedPalettes = new List <int>();
            var pushedTextures = new List <int>();

            foreach (var vec in ArrayUtility.ForEach(Frame.Height, Frame.Width))
            {
                var palette = GetPalette(bitmapFrame[vec.y, vec.x]);
                var texture = GetTexture(bitmapFrame[vec.y, vec.x], palette);

                palettes[vec.y, vec.x] = GetPalette(bitmapFrame[vec.y, vec.x]);
                textures[vec.y, vec.x] = GetTexture(bitmapFrame[vec.y, vec.x], palettes[vec.y, vec.x]);

                // Add Palette / Texture to rom
                var paletteIndex = romData.UpsertPalette(palette, pushedPalettes);
                var textureIndex = romData.UpsertTexture(texture, pushedTextures);

                // Add tile to frame
                var tile = new GBTile();
                tile.Palette = romData.PaletteData[paletteIndex];
                tile.Texture = romData.TextureData[textureIndex];
                frame.TileUpdates[vec.y, vec.x] = tile;
            }

            foreach (var vec in ArrayUtility.ForEach(Frame.Height, Frame.Width))
            {
                var index = romData.TextureData.IndexOf(frame.TileUpdates[vec.y, vec.x].Texture);
                if (index == -1)
                {
                    throw new Exception("Texture missing at " + vec.x + ", " + vec.y);
                }
            }

            pushedPalettes.Sort();
            pushedTextures.Sort();

            // palettes changes
            frame.PaletteUpdates = pushedPalettes.ToDictionary(i => i, i => romData.PaletteData[i]);

            // texture changes
            frame.LoadOrders = GetLoads(pushedTextures).ToList();

            return(frame);
        }
コード例 #2
0
        public int UpsertTexture(GBTexture texture, List <int> pushedTextures)
        {
            for (int i = 0; i < TextureData.Count; i++)
            {
                if (texture.Match(TextureData[i]))
                {
                    return(i);
                }
            }

            TextureData.Add(texture);
            var index = TextureData.Count - 1;

            pushedTextures.Add(index);
            return(index);
        }
コード例 #3
0
        public ScreenState()
        {
            Tiles = new GBTile[Frame.Height][];
            for (int y = 0; y < Frame.Height; y++)
            {
                Tiles[y] = new GBTile[Frame.Width];
                for (int x = 0; x < Frame.Width; x++)
                {
                    Tiles[y][x] = new GBTile();
                }
            }

            Textures = new GBTexture[2][];
            for (int y = 0; y < MaxTextureBank; y++)
            {
                Textures[y] = new GBTexture[MaxTextures];
            }

            Palette = new GBPalette[MaxPalettes];
        }
コード例 #4
0
        static GBTexture GetTexture(BitmapTexture bitmapTexture, GBPalette palette)
        {
            if (bitmapTexture == null)
            {
                return(GBTexture.Default);
            }

            var tex = new GBTexture();

            for (int y = 0; y < GBTexture.WidthPx; y++)
            {
                for (int x = 0; x < GBTexture.WidthPx; x++)
                {
                    var color   = bitmapTexture.Get(x, y);
                    var bgColor = palette.GetGBColor(color);
                    tex.Set(x, y, bgColor);
                }
            }

            return(tex);
        }