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