diff --git a/BizHawk.Emulation/Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs b/BizHawk.Emulation/Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs index 4535af45fc..279d9e18f3 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/SNES/SNESGraphicsDecoder.cs @@ -229,6 +229,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES public int X { private set; get; } public int Y { private set; get; } public int Tile { private set; get; } + public int Name { private set; get; } public int Table { private set; get; } public int Palette { private set; get; } public int Priority { private set; get; } @@ -236,14 +237,19 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES public bool HFlip { private set; get; } public int Size { private set; get; } - public OAMInfo(SNESGraphicsDecoder dec, int num) + /// + /// tiledata address + /// + public int Address { private set; get; } + + public OAMInfo(SNESGraphicsDecoder dec, ScreenInfo si, int num) { Index = num; int lowaddr = num*4; X = dec.oam[lowaddr++]; Y = dec.oam[lowaddr++]; - Tile = dec.oam[lowaddr++]; + Name = dec.oam[lowaddr++]; Table = dec.oam[lowaddr] & 1; Palette = (dec.oam[lowaddr]>>1) & 7; Priority = (dec.oam[lowaddr] >> 4) & 3; @@ -259,11 +265,25 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES Size = high & 1; X |= (x << 9); X = (X << 23) >> 23; + + Tile = Table*256 + Name; + Address = 32 * Tile; + + if (Tile < 256) + Address += si.OBJTable0Addr; + else + Address += si.OBJTable1Addr - (256 * 32); + + Address &= 0xFFFF; + } } public class ScreenInfo { + public Dimensions ObjSizeBounds; + public Dimensions ObjSizeBoundsSquare; + public BGInfos BG = new BGInfos(); public ModeInfo Mode = new ModeInfo(); @@ -305,6 +325,11 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES si.OBSEL_NameSel = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.OBSEL_NAMESEL); si.OBSEL_NameBase = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.OBSEL_NAMEBASE); + si.ObjSizeBounds = ObjSizes[si.OBSEL_Size,1]; + int square = Math.Max(si.ObjSizeBounds.Width, si.ObjSizeBounds.Height); + si.ObjSizeBoundsSquare = new Dimensions(square, square); + + si.OBJTable0Addr = si.OBSEL_NameBase << 14; si.OBJTable1Addr = (si.OBJTable0Addr + ((si.OBSEL_NameSel + 1) << 13)) & 0xFFFF; @@ -875,7 +900,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES public void RenderSpriteToScreen(int* screen, int stride, int destx, int desty, ScreenInfo si, int spritenum) { var dims = new[] { SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size, 0], SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size, 1] }; - var oam = new OAMInfo(this, spritenum); + var oam = new OAMInfo(this, si, spritenum); var dim = dims[oam.Size]; int[] tilebuf = _tileCache[4]; @@ -886,13 +911,28 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES else baseaddr = si.OBJTable1Addr; + //TODO - flips of 'undocumented' rectangular oam settings are wrong. probably easy to do right, but we need a test + int bcol = oam.Tile & 0xF; int brow = (oam.Tile >> 4) & 0xF; - for(int y=0;y> 3)) & 0xF; int row = (brow + (y >> 3)) & 0xF; int sx = x & 0x7; @@ -910,6 +950,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES public int Colorize(int rgb555) { + //skip to max luminance in the palette table return colortable[491520 + rgb555]; } diff --git a/BizHawk.MultiClient/SNESTools/SNESGraphicsDebugger.Designer.cs b/BizHawk.MultiClient/SNESTools/SNESGraphicsDebugger.Designer.cs index b407df133a..9e11af8f10 100644 --- a/BizHawk.MultiClient/SNESTools/SNESGraphicsDebugger.Designer.cs +++ b/BizHawk.MultiClient/SNESTools/SNESGraphicsDebugger.Designer.cs @@ -190,17 +190,19 @@ this.paletteViewer = new BizHawk.MultiClient.SNESGraphicsViewer(); this.tabctrlDetails = new System.Windows.Forms.TabControl(); this.tpPalette = new System.Windows.Forms.TabPage(); - this.txtPaletteDetailsIndexSpecific = new System.Windows.Forms.TextBox(); - this.txtPaletteDetailsIndexHexSpecific = new System.Windows.Forms.TextBox(); + this.label53 = new System.Windows.Forms.Label(); + this.label52 = new System.Windows.Forms.Label(); + this.label51 = new System.Windows.Forms.Label(); this.txtPaletteDetailsAddress = new System.Windows.Forms.TextBox(); this.txtPaletteDetailsIndex = new System.Windows.Forms.TextBox(); this.txtPaletteDetailsIndexHex = new System.Windows.Forms.TextBox(); this.txtDetailsPaletteColorRGB = new System.Windows.Forms.TextBox(); this.txtDetailsPaletteColorHex = new System.Windows.Forms.TextBox(); this.txtDetailsPaletteColor = new System.Windows.Forms.TextBox(); - this.lblDetailsOBJOrBG = new System.Windows.Forms.Label(); this.pnDetailsPaletteColor = new System.Windows.Forms.Panel(); this.tpTile = new System.Windows.Forms.TabPage(); + this.label45 = new System.Windows.Forms.Label(); + this.txtTilePalette = new System.Windows.Forms.TextBox(); this.txtTileNumber = new System.Windows.Forms.TextBox(); this.txtTileMode = new System.Windows.Forms.TextBox(); this.label18 = new System.Windows.Forms.Label(); @@ -210,6 +212,7 @@ this.txtTileAddress = new System.Windows.Forms.TextBox(); this.viewerTile = new BizHawk.MultiClient.SNESGraphicsViewer(); this.tpMapEntry = new System.Windows.Forms.TabPage(); + this.textBox2 = new System.Windows.Forms.TextBox(); this.checkMapEntryVFlip = new System.Windows.Forms.CheckBox(); this.label34 = new System.Windows.Forms.Label(); this.checkMapEntryHFlip = new System.Windows.Forms.CheckBox(); @@ -224,19 +227,28 @@ this.txtMapEntryTileNum = new System.Windows.Forms.TextBox(); this.viewerMapEntryTile = new BizHawk.MultiClient.SNESGraphicsViewer(); this.tpOBJ = new System.Windows.Forms.TabPage(); + this.txtObjPriority = new System.Windows.Forms.TextBox(); + this.label50 = new System.Windows.Forms.Label(); + this.txtObjPaletteMemo = new System.Windows.Forms.TextBox(); + this.label49 = new System.Windows.Forms.Label(); + this.txtObjPalette = new System.Windows.Forms.TextBox(); + this.label48 = new System.Windows.Forms.Label(); + this.txtObjNameAddr = new System.Windows.Forms.TextBox(); + this.txtObjName = new System.Windows.Forms.TextBox(); + this.txtObjSize = new System.Windows.Forms.TextBox(); + this.label46 = new System.Windows.Forms.Label(); + this.cbObjLarge = new System.Windows.Forms.CheckBox(); this.txtObjNumber = new System.Windows.Forms.TextBox(); this.txtObjCoord = new System.Windows.Forms.TextBox(); - this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.cbObjVFlip = new System.Windows.Forms.CheckBox(); this.label43 = new System.Windows.Forms.Label(); - this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.cbObjHFlip = new System.Windows.Forms.CheckBox(); this.label44 = new System.Windows.Forms.Label(); this.viewerObj = new BizHawk.MultiClient.SNESGraphicsViewer(); this.viewerPanel = new System.Windows.Forms.Panel(); this.viewer = new BizHawk.MultiClient.SNESGraphicsViewer(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.messagetimer = new System.Windows.Forms.Timer(this.components); - this.txtTilePalette = new System.Windows.Forms.TextBox(); - this.label45 = new System.Windows.Forms.Label(); this.menuStrip1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout(); this.panel1.SuspendLayout(); @@ -820,11 +832,11 @@ // label41 // this.label41.AutoSize = true; - this.label41.Location = new System.Drawing.Point(10, 161); + this.label41.Location = new System.Drawing.Point(4, 161); this.label41.Name = "label41"; - this.label41.Size = new System.Drawing.Size(41, 13); + this.label41.Size = new System.Drawing.Size(49, 13); this.label41.TabIndex = 101; - this.label41.Text = "EN.Pr3"; + this.label41.Text = "EN.Prio3"; // // txtOBSELT1OfsDescr // @@ -967,11 +979,11 @@ // label40 // this.label40.AutoSize = true; - this.label40.Location = new System.Drawing.Point(10, 146); + this.label40.Location = new System.Drawing.Point(4, 146); this.label40.Name = "label40"; - this.label40.Size = new System.Drawing.Size(41, 13); + this.label40.Size = new System.Drawing.Size(49, 13); this.label40.TabIndex = 93; - this.label40.Text = "EN.Pr2"; + this.label40.Text = "EN.Prio2"; // // label28 // @@ -987,9 +999,9 @@ this.label39.AutoSize = true; this.label39.Location = new System.Drawing.Point(162, 130); this.label39.Name = "label39"; - this.label39.Size = new System.Drawing.Size(41, 13); + this.label39.Size = new System.Drawing.Size(49, 13); this.label39.TabIndex = 92; - this.label39.Text = "EN.Pr1"; + this.label39.Text = "EN.Prio1"; // // label20 // @@ -1053,9 +1065,9 @@ this.label37.AutoSize = true; this.label37.Location = new System.Drawing.Point(162, 115); this.label37.Name = "label37"; - this.label37.Size = new System.Drawing.Size(41, 13); + this.label37.Size = new System.Drawing.Size(49, 13); this.label37.TabIndex = 89; - this.label37.Text = "EN.Pr0"; + this.label37.Text = "EN.Prio0"; // // label18391 // @@ -2015,15 +2027,15 @@ // // tpPalette // - this.tpPalette.Controls.Add(this.txtPaletteDetailsIndexSpecific); - this.tpPalette.Controls.Add(this.txtPaletteDetailsIndexHexSpecific); + this.tpPalette.Controls.Add(this.label53); + this.tpPalette.Controls.Add(this.label52); + this.tpPalette.Controls.Add(this.label51); this.tpPalette.Controls.Add(this.txtPaletteDetailsAddress); this.tpPalette.Controls.Add(this.txtPaletteDetailsIndex); this.tpPalette.Controls.Add(this.txtPaletteDetailsIndexHex); this.tpPalette.Controls.Add(this.txtDetailsPaletteColorRGB); this.tpPalette.Controls.Add(this.txtDetailsPaletteColorHex); this.tpPalette.Controls.Add(this.txtDetailsPaletteColor); - this.tpPalette.Controls.Add(this.lblDetailsOBJOrBG); this.tpPalette.Controls.Add(this.pnDetailsPaletteColor); this.tpPalette.Location = new System.Drawing.Point(4, 22); this.tpPalette.Name = "tpPalette"; @@ -2033,39 +2045,46 @@ this.tpPalette.Text = "Color"; this.tpPalette.UseVisualStyleBackColor = true; // - // txtPaletteDetailsIndexSpecific + // label53 // - this.txtPaletteDetailsIndexSpecific.Location = new System.Drawing.Point(69, 42); - this.txtPaletteDetailsIndexSpecific.Multiline = true; - this.txtPaletteDetailsIndexSpecific.Name = "txtPaletteDetailsIndexSpecific"; - this.txtPaletteDetailsIndexSpecific.ReadOnly = true; - this.txtPaletteDetailsIndexSpecific.Size = new System.Drawing.Size(31, 18); - this.txtPaletteDetailsIndexSpecific.TabIndex = 44; - this.txtPaletteDetailsIndexSpecific.Text = "127"; + this.label53.AutoSize = true; + this.label53.Location = new System.Drawing.Point(73, 76); + this.label53.Name = "label53"; + this.label53.Size = new System.Drawing.Size(48, 13); + this.label53.TabIndex = 61; + this.label53.Text = "RGB888"; // - // txtPaletteDetailsIndexHexSpecific + // label52 // - this.txtPaletteDetailsIndexHexSpecific.Location = new System.Drawing.Point(42, 42); - this.txtPaletteDetailsIndexHexSpecific.Multiline = true; - this.txtPaletteDetailsIndexHexSpecific.Name = "txtPaletteDetailsIndexHexSpecific"; - this.txtPaletteDetailsIndexHexSpecific.ReadOnly = true; - this.txtPaletteDetailsIndexHexSpecific.Size = new System.Drawing.Size(26, 18); - this.txtPaletteDetailsIndexHexSpecific.TabIndex = 43; - this.txtPaletteDetailsIndexHexSpecific.Text = "$7F"; + this.label52.AutoSize = true; + this.label52.Location = new System.Drawing.Point(93, 54); + this.label52.Name = "label52"; + this.label52.Size = new System.Drawing.Size(26, 13); + this.label52.TabIndex = 60; + this.label52.Text = "Hex"; + // + // label51 + // + this.label51.AutoSize = true; + this.label51.Location = new System.Drawing.Point(73, 32); + this.label51.Name = "label51"; + this.label51.Size = new System.Drawing.Size(50, 13); + this.label51.TabIndex = 59; + this.label51.Text = "Raw Col."; // // txtPaletteDetailsAddress // - this.txtPaletteDetailsAddress.Location = new System.Drawing.Point(41, 22); + this.txtPaletteDetailsAddress.Location = new System.Drawing.Point(149, 7); this.txtPaletteDetailsAddress.Multiline = true; this.txtPaletteDetailsAddress.Name = "txtPaletteDetailsAddress"; this.txtPaletteDetailsAddress.ReadOnly = true; - this.txtPaletteDetailsAddress.Size = new System.Drawing.Size(58, 18); + this.txtPaletteDetailsAddress.Size = new System.Drawing.Size(54, 18); this.txtPaletteDetailsAddress.TabIndex = 42; - this.txtPaletteDetailsAddress.Text = "@1FE"; + this.txtPaletteDetailsAddress.Text = "@DDD"; // // txtPaletteDetailsIndex // - this.txtPaletteDetailsIndex.Location = new System.Drawing.Point(68, 3); + this.txtPaletteDetailsIndex.Location = new System.Drawing.Point(112, 7); this.txtPaletteDetailsIndex.Multiline = true; this.txtPaletteDetailsIndex.Name = "txtPaletteDetailsIndex"; this.txtPaletteDetailsIndex.ReadOnly = true; @@ -2075,52 +2094,43 @@ // // txtPaletteDetailsIndexHex // - this.txtPaletteDetailsIndexHex.Location = new System.Drawing.Point(41, 3); + this.txtPaletteDetailsIndexHex.Location = new System.Drawing.Point(76, 7); this.txtPaletteDetailsIndexHex.Multiline = true; this.txtPaletteDetailsIndexHex.Name = "txtPaletteDetailsIndexHex"; this.txtPaletteDetailsIndexHex.ReadOnly = true; - this.txtPaletteDetailsIndexHex.Size = new System.Drawing.Size(26, 18); + this.txtPaletteDetailsIndexHex.Size = new System.Drawing.Size(28, 18); this.txtPaletteDetailsIndexHex.TabIndex = 39; - this.txtPaletteDetailsIndexHex.Text = "$7F"; + this.txtPaletteDetailsIndexHex.Text = "$DD"; // // txtDetailsPaletteColorRGB // - this.txtDetailsPaletteColorRGB.Location = new System.Drawing.Point(102, 42); + this.txtDetailsPaletteColorRGB.Location = new System.Drawing.Point(125, 73); this.txtDetailsPaletteColorRGB.Multiline = true; this.txtDetailsPaletteColorRGB.Name = "txtDetailsPaletteColorRGB"; this.txtDetailsPaletteColorRGB.ReadOnly = true; - this.txtDetailsPaletteColorRGB.Size = new System.Drawing.Size(96, 18); + this.txtDetailsPaletteColorRGB.Size = new System.Drawing.Size(78, 18); this.txtDetailsPaletteColorRGB.TabIndex = 38; this.txtDetailsPaletteColorRGB.Text = "(255, 255, 255)"; // // txtDetailsPaletteColorHex // - this.txtDetailsPaletteColorHex.Location = new System.Drawing.Point(102, 22); + this.txtDetailsPaletteColorHex.Location = new System.Drawing.Point(125, 51); this.txtDetailsPaletteColorHex.Multiline = true; this.txtDetailsPaletteColorHex.Name = "txtDetailsPaletteColorHex"; this.txtDetailsPaletteColorHex.ReadOnly = true; - this.txtDetailsPaletteColorHex.Size = new System.Drawing.Size(96, 18); + this.txtDetailsPaletteColorHex.Size = new System.Drawing.Size(78, 18); this.txtDetailsPaletteColorHex.TabIndex = 37; - this.txtDetailsPaletteColorHex.Text = "#FFFFFF"; + this.txtDetailsPaletteColorHex.Text = "#DDDDDD"; // // txtDetailsPaletteColor // - this.txtDetailsPaletteColor.Location = new System.Drawing.Point(102, 2); + this.txtDetailsPaletteColor.Location = new System.Drawing.Point(125, 29); this.txtDetailsPaletteColor.Multiline = true; this.txtDetailsPaletteColor.Name = "txtDetailsPaletteColor"; this.txtDetailsPaletteColor.ReadOnly = true; - this.txtDetailsPaletteColor.Size = new System.Drawing.Size(96, 18); + this.txtDetailsPaletteColor.Size = new System.Drawing.Size(79, 18); this.txtDetailsPaletteColor.TabIndex = 36; - this.txtDetailsPaletteColor.Text = "$7FFF"; - // - // lblDetailsOBJOrBG - // - this.lblDetailsOBJOrBG.Location = new System.Drawing.Point(2, 42); - this.lblDetailsOBJOrBG.Name = "lblDetailsOBJOrBG"; - this.lblDetailsOBJOrBG.Size = new System.Drawing.Size(36, 16); - this.lblDetailsOBJOrBG.TabIndex = 40; - this.lblDetailsOBJOrBG.Text = "(OBJ:)"; - this.lblDetailsOBJOrBG.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.txtDetailsPaletteColor.Text = "$DDDD"; // // pnDetailsPaletteColor // @@ -2128,7 +2138,7 @@ this.pnDetailsPaletteColor.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.pnDetailsPaletteColor.Location = new System.Drawing.Point(3, 4); this.pnDetailsPaletteColor.Name = "pnDetailsPaletteColor"; - this.pnDetailsPaletteColor.Size = new System.Drawing.Size(32, 32); + this.pnDetailsPaletteColor.Size = new System.Drawing.Size(69, 68); this.pnDetailsPaletteColor.TabIndex = 3; this.pnDetailsPaletteColor.DoubleClick += new System.EventHandler(this.pnDetailsPaletteColor_DoubleClick); // @@ -2147,11 +2157,30 @@ this.tpTile.Location = new System.Drawing.Point(4, 22); this.tpTile.Name = "tpTile"; this.tpTile.Padding = new System.Windows.Forms.Padding(3); - this.tpTile.Size = new System.Drawing.Size(206, 94); + this.tpTile.Size = new System.Drawing.Size(206, 92); this.tpTile.TabIndex = 1; this.tpTile.Text = "Tile"; this.tpTile.UseVisualStyleBackColor = true; // + // label45 + // + this.label45.AutoSize = true; + this.label45.Location = new System.Drawing.Point(169, 75); + this.label45.Name = "label45"; + this.label45.Size = new System.Drawing.Size(22, 13); + this.label45.TabIndex = 65; + this.label45.Text = "Pal"; + // + // txtTilePalette + // + this.txtTilePalette.Location = new System.Drawing.Point(139, 73); + this.txtTilePalette.Multiline = true; + this.txtTilePalette.Name = "txtTilePalette"; + this.txtTilePalette.ReadOnly = true; + this.txtTilePalette.Size = new System.Drawing.Size(29, 18); + this.txtTilePalette.TabIndex = 64; + this.txtTilePalette.Text = "$FF"; + // // txtTileNumber // this.txtTileNumber.Location = new System.Drawing.Point(76, 6); @@ -2175,7 +2204,7 @@ // label18 // this.label18.AutoSize = true; - this.label18.Location = new System.Drawing.Point(169, 49); + this.label18.Location = new System.Drawing.Point(169, 53); this.label18.Name = "label18"; this.label18.Size = new System.Drawing.Size(36, 13); this.label18.TabIndex = 61; @@ -2183,7 +2212,7 @@ // // txtTileColors // - this.txtTileColors.Location = new System.Drawing.Point(139, 48); + this.txtTileColors.Location = new System.Drawing.Point(139, 51); this.txtTileColors.Multiline = true; this.txtTileColors.Name = "txtTileColors"; this.txtTileColors.ReadOnly = true; @@ -2193,7 +2222,7 @@ // // txtTileBpp // - this.txtTileBpp.Location = new System.Drawing.Point(139, 28); + this.txtTileBpp.Location = new System.Drawing.Point(139, 29); this.txtTileBpp.Multiline = true; this.txtTileBpp.Name = "txtTileBpp"; this.txtTileBpp.ReadOnly = true; @@ -2204,7 +2233,7 @@ // label42 // this.label42.AutoSize = true; - this.label42.Location = new System.Drawing.Point(169, 30); + this.label42.Location = new System.Drawing.Point(169, 31); this.label42.Name = "label42"; this.label42.Size = new System.Drawing.Size(32, 13); this.label42.TabIndex = 58; @@ -2212,7 +2241,7 @@ // // txtTileAddress // - this.txtTileAddress.Location = new System.Drawing.Point(76, 27); + this.txtTileAddress.Location = new System.Drawing.Point(76, 28); this.txtTileAddress.Multiline = true; this.txtTileAddress.Name = "txtTileAddress"; this.txtTileAddress.ReadOnly = true; @@ -2231,6 +2260,7 @@ // // tpMapEntry // + this.tpMapEntry.Controls.Add(this.textBox2); this.tpMapEntry.Controls.Add(this.checkMapEntryVFlip); this.tpMapEntry.Controls.Add(this.label34); this.tpMapEntry.Controls.Add(this.checkMapEntryHFlip); @@ -2246,11 +2276,21 @@ this.tpMapEntry.Controls.Add(this.viewerMapEntryTile); this.tpMapEntry.Location = new System.Drawing.Point(4, 22); this.tpMapEntry.Name = "tpMapEntry"; - this.tpMapEntry.Size = new System.Drawing.Size(206, 94); + this.tpMapEntry.Size = new System.Drawing.Size(206, 92); this.tpMapEntry.TabIndex = 2; this.tpMapEntry.Text = "Map Entry"; this.tpMapEntry.UseVisualStyleBackColor = true; // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(137, 51); + this.textBox2.Multiline = true; + this.textBox2.Name = "textBox2"; + this.textBox2.ReadOnly = true; + this.textBox2.Size = new System.Drawing.Size(34, 18); + this.textBox2.TabIndex = 63; + this.textBox2.Text = "$DD"; + // // checkMapEntryVFlip // this.checkMapEntryVFlip.AutoSize = true; @@ -2283,7 +2323,7 @@ // label17 // this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(145, 46); + this.label17.Location = new System.Drawing.Point(93, 53); this.label17.Name = "label17"; this.label17.Size = new System.Drawing.Size(40, 13); this.label17.TabIndex = 60; @@ -2301,7 +2341,7 @@ // txtMapEntryPalette // this.txtMapEntryPalette.BackColor = System.Drawing.Color.LightGreen; - this.txtMapEntryPalette.Location = new System.Drawing.Point(126, 43); + this.txtMapEntryPalette.Location = new System.Drawing.Point(76, 51); this.txtMapEntryPalette.Multiline = true; this.txtMapEntryPalette.Name = "txtMapEntryPalette"; this.txtMapEntryPalette.ReadOnly = true; @@ -2312,7 +2352,7 @@ // label14 // this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(95, 46); + this.label14.Location = new System.Drawing.Point(95, 75); this.label14.Name = "label14"; this.label14.Size = new System.Drawing.Size(25, 13); this.label14.TabIndex = 58; @@ -2321,7 +2361,7 @@ // label6 // this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(121, 27); + this.label6.Location = new System.Drawing.Point(121, 31); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(31, 13); this.label6.TabIndex = 56; @@ -2329,7 +2369,7 @@ // // txtMapEntryTileAddr // - this.txtMapEntryTileAddr.Location = new System.Drawing.Point(153, 25); + this.txtMapEntryTileAddr.Location = new System.Drawing.Point(153, 29); this.txtMapEntryTileAddr.Multiline = true; this.txtMapEntryTileAddr.Name = "txtMapEntryTileAddr"; this.txtMapEntryTileAddr.ReadOnly = true; @@ -2340,7 +2380,7 @@ // txtMapEntryPrio // this.txtMapEntryPrio.BackColor = System.Drawing.Color.LightGreen; - this.txtMapEntryPrio.Location = new System.Drawing.Point(76, 43); + this.txtMapEntryPrio.Location = new System.Drawing.Point(76, 73); this.txtMapEntryPrio.Multiline = true; this.txtMapEntryPrio.Name = "txtMapEntryPrio"; this.txtMapEntryPrio.ReadOnly = true; @@ -2361,13 +2401,13 @@ // txtMapEntryTileNum // this.txtMapEntryTileNum.BackColor = System.Drawing.Color.LightGreen; - this.txtMapEntryTileNum.Location = new System.Drawing.Point(76, 25); + this.txtMapEntryTileNum.Location = new System.Drawing.Point(76, 29); this.txtMapEntryTileNum.Multiline = true; this.txtMapEntryTileNum.Name = "txtMapEntryTileNum"; this.txtMapEntryTileNum.ReadOnly = true; - this.txtMapEntryTileNum.Size = new System.Drawing.Size(43, 17); + this.txtMapEntryTileNum.Size = new System.Drawing.Size(44, 17); this.txtMapEntryTileNum.TabIndex = 39; - this.txtMapEntryTileNum.Text = "$1024"; + this.txtMapEntryTileNum.Text = "#$DDD"; // // viewerMapEntryTile // @@ -2380,11 +2420,22 @@ // // tpOBJ // + this.tpOBJ.Controls.Add(this.txtObjPriority); + this.tpOBJ.Controls.Add(this.label50); + this.tpOBJ.Controls.Add(this.txtObjPaletteMemo); + this.tpOBJ.Controls.Add(this.label49); + this.tpOBJ.Controls.Add(this.txtObjPalette); + this.tpOBJ.Controls.Add(this.label48); + this.tpOBJ.Controls.Add(this.txtObjNameAddr); + this.tpOBJ.Controls.Add(this.txtObjName); + this.tpOBJ.Controls.Add(this.txtObjSize); + this.tpOBJ.Controls.Add(this.label46); + this.tpOBJ.Controls.Add(this.cbObjLarge); this.tpOBJ.Controls.Add(this.txtObjNumber); this.tpOBJ.Controls.Add(this.txtObjCoord); - this.tpOBJ.Controls.Add(this.checkBox1); + this.tpOBJ.Controls.Add(this.cbObjVFlip); this.tpOBJ.Controls.Add(this.label43); - this.tpOBJ.Controls.Add(this.checkBox2); + this.tpOBJ.Controls.Add(this.cbObjHFlip); this.tpOBJ.Controls.Add(this.label44); this.tpOBJ.Controls.Add(this.viewerObj); this.tpOBJ.Location = new System.Drawing.Point(4, 22); @@ -2394,6 +2445,115 @@ this.tpOBJ.Text = "OBJ"; this.tpOBJ.UseVisualStyleBackColor = true; // + // txtObjPriority + // + this.txtObjPriority.BackColor = System.Drawing.Color.LightGreen; + this.txtObjPriority.Location = new System.Drawing.Point(187, 29); + this.txtObjPriority.Multiline = true; + this.txtObjPriority.Name = "txtObjPriority"; + this.txtObjPriority.ReadOnly = true; + this.txtObjPriority.Size = new System.Drawing.Size(18, 17); + this.txtObjPriority.TabIndex = 102; + this.txtObjPriority.Text = "3"; + // + // label50 + // + this.label50.AutoSize = true; + this.label50.Location = new System.Drawing.Point(160, 31); + this.label50.Name = "label50"; + this.label50.Size = new System.Drawing.Size(25, 13); + this.label50.TabIndex = 101; + this.label50.Text = "Prio"; + // + // txtObjPaletteMemo + // + this.txtObjPaletteMemo.Location = new System.Drawing.Point(137, 73); + this.txtObjPaletteMemo.Multiline = true; + this.txtObjPaletteMemo.Name = "txtObjPaletteMemo"; + this.txtObjPaletteMemo.ReadOnly = true; + this.txtObjPaletteMemo.Size = new System.Drawing.Size(34, 18); + this.txtObjPaletteMemo.TabIndex = 100; + this.txtObjPaletteMemo.Text = "$DD"; + // + // label49 + // + this.label49.AutoSize = true; + this.label49.Location = new System.Drawing.Point(93, 75); + this.label49.Name = "label49"; + this.label49.Size = new System.Drawing.Size(40, 13); + this.label49.TabIndex = 99; + this.label49.Text = "Palette"; + // + // txtObjPalette + // + this.txtObjPalette.BackColor = System.Drawing.Color.LightGreen; + this.txtObjPalette.Location = new System.Drawing.Point(76, 73); + this.txtObjPalette.Multiline = true; + this.txtObjPalette.Name = "txtObjPalette"; + this.txtObjPalette.ReadOnly = true; + this.txtObjPalette.Size = new System.Drawing.Size(15, 17); + this.txtObjPalette.TabIndex = 98; + this.txtObjPalette.Text = "00"; + // + // label48 + // + this.label48.AutoSize = true; + this.label48.Location = new System.Drawing.Point(121, 53); + this.label48.Name = "label48"; + this.label48.Size = new System.Drawing.Size(31, 13); + this.label48.TabIndex = 96; + this.label48.Text = "Tile#"; + // + // txtObjNameAddr + // + this.txtObjNameAddr.Location = new System.Drawing.Point(153, 51); + this.txtObjNameAddr.Multiline = true; + this.txtObjNameAddr.Name = "txtObjNameAddr"; + this.txtObjNameAddr.ReadOnly = true; + this.txtObjNameAddr.Size = new System.Drawing.Size(45, 18); + this.txtObjNameAddr.TabIndex = 97; + this.txtObjNameAddr.Text = "@0D00"; + // + // txtObjName + // + this.txtObjName.BackColor = System.Drawing.Color.LightGreen; + this.txtObjName.Location = new System.Drawing.Point(76, 51); + this.txtObjName.Multiline = true; + this.txtObjName.Name = "txtObjName"; + this.txtObjName.ReadOnly = true; + this.txtObjName.Size = new System.Drawing.Size(43, 17); + this.txtObjName.TabIndex = 95; + this.txtObjName.Text = "#$DDD"; + // + // txtObjSize + // + this.txtObjSize.Location = new System.Drawing.Point(122, 29); + this.txtObjSize.Multiline = true; + this.txtObjSize.Name = "txtObjSize"; + this.txtObjSize.ReadOnly = true; + this.txtObjSize.Size = new System.Drawing.Size(37, 18); + this.txtObjSize.TabIndex = 93; + this.txtObjSize.Text = "64x64"; + // + // label46 + // + this.label46.AutoSize = true; + this.label46.Location = new System.Drawing.Point(89, 31); + this.label46.Name = "label46"; + this.label46.Size = new System.Drawing.Size(34, 13); + this.label46.TabIndex = 92; + this.label46.Text = "Large"; + // + // cbObjLarge + // + this.cbObjLarge.AutoSize = true; + this.cbObjLarge.Enabled = false; + this.cbObjLarge.Location = new System.Drawing.Point(76, 31); + this.cbObjLarge.Name = "cbObjLarge"; + this.cbObjLarge.Size = new System.Drawing.Size(15, 14); + this.cbObjLarge.TabIndex = 91; + this.cbObjLarge.UseVisualStyleBackColor = true; + // // txtObjNumber // this.txtObjNumber.Location = new System.Drawing.Point(76, 6); @@ -2414,15 +2574,15 @@ this.txtObjCoord.TabIndex = 67; this.txtObjCoord.Text = "(-239,-239)"; // - // checkBox1 + // cbObjVFlip // - this.checkBox1.AutoSize = true; - this.checkBox1.Enabled = false; - this.checkBox1.Location = new System.Drawing.Point(42, 76); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(15, 14); - this.checkBox1.TabIndex = 65; - this.checkBox1.UseVisualStyleBackColor = true; + this.cbObjVFlip.AutoSize = true; + this.cbObjVFlip.Enabled = false; + this.cbObjVFlip.Location = new System.Drawing.Point(42, 76); + this.cbObjVFlip.Name = "cbObjVFlip"; + this.cbObjVFlip.Size = new System.Drawing.Size(15, 14); + this.cbObjVFlip.TabIndex = 65; + this.cbObjVFlip.UseVisualStyleBackColor = true; // // label43 // @@ -2433,15 +2593,15 @@ this.label43.TabIndex = 66; this.label43.Text = "V"; // - // checkBox2 + // cbObjHFlip // - this.checkBox2.AutoSize = true; - this.checkBox2.Enabled = false; - this.checkBox2.Location = new System.Drawing.Point(8, 76); - this.checkBox2.Name = "checkBox2"; - this.checkBox2.Size = new System.Drawing.Size(15, 14); - this.checkBox2.TabIndex = 63; - this.checkBox2.UseVisualStyleBackColor = true; + this.cbObjHFlip.AutoSize = true; + this.cbObjHFlip.Enabled = false; + this.cbObjHFlip.Location = new System.Drawing.Point(8, 76); + this.cbObjHFlip.Name = "cbObjHFlip"; + this.cbObjHFlip.Size = new System.Drawing.Size(15, 14); + this.cbObjHFlip.TabIndex = 63; + this.cbObjHFlip.UseVisualStyleBackColor = true; // // label44 // @@ -2496,25 +2656,6 @@ this.messagetimer.Interval = 5000; this.messagetimer.Tick += new System.EventHandler(this.messagetimer_Tick); // - // txtTilePalette - // - this.txtTilePalette.Location = new System.Drawing.Point(139, 68); - this.txtTilePalette.Multiline = true; - this.txtTilePalette.Name = "txtTilePalette"; - this.txtTilePalette.ReadOnly = true; - this.txtTilePalette.Size = new System.Drawing.Size(29, 18); - this.txtTilePalette.TabIndex = 64; - this.txtTilePalette.Text = "$FF"; - // - // label45 - // - this.label45.AutoSize = true; - this.label45.Location = new System.Drawing.Point(169, 70); - this.label45.Name = "label45"; - this.label45.Size = new System.Drawing.Size(22, 13); - this.label45.TabIndex = 65; - this.label45.Text = "Pal"; - // // SNESGraphicsDebugger // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -2627,15 +2768,12 @@ private System.Windows.Forms.NumericUpDown nudScanline; private System.Windows.Forms.TabControl tabctrlDetails; private System.Windows.Forms.TabPage tpPalette; - private System.Windows.Forms.TextBox txtPaletteDetailsIndexSpecific; - private System.Windows.Forms.TextBox txtPaletteDetailsIndexHexSpecific; private System.Windows.Forms.TextBox txtPaletteDetailsAddress; private System.Windows.Forms.TextBox txtPaletteDetailsIndex; private System.Windows.Forms.TextBox txtPaletteDetailsIndexHex; private System.Windows.Forms.TextBox txtDetailsPaletteColorRGB; private System.Windows.Forms.TextBox txtDetailsPaletteColorHex; private System.Windows.Forms.TextBox txtDetailsPaletteColor; - private System.Windows.Forms.Label lblDetailsOBJOrBG; private System.Windows.Forms.Panel pnDetailsPaletteColor; private System.Windows.Forms.TabPage tpTile; private System.Windows.Forms.Panel viewerPanel; @@ -2767,12 +2905,27 @@ private SNESGraphicsViewer viewerObj; private System.Windows.Forms.TextBox txtObjNumber; private System.Windows.Forms.TextBox txtObjCoord; - private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox cbObjVFlip; private System.Windows.Forms.Label label43; - private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.CheckBox cbObjHFlip; private System.Windows.Forms.Label label44; private System.Windows.Forms.TextBox txtTileNumber; private System.Windows.Forms.Label label45; private System.Windows.Forms.TextBox txtTilePalette; + private System.Windows.Forms.Label label48; + private System.Windows.Forms.TextBox txtObjNameAddr; + private System.Windows.Forms.TextBox txtObjName; + private System.Windows.Forms.TextBox txtObjSize; + private System.Windows.Forms.Label label46; + private System.Windows.Forms.CheckBox cbObjLarge; + private System.Windows.Forms.Label label53; + private System.Windows.Forms.Label label52; + private System.Windows.Forms.Label label51; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.TextBox txtObjPriority; + private System.Windows.Forms.Label label50; + private System.Windows.Forms.TextBox txtObjPaletteMemo; + private System.Windows.Forms.Label label49; + private System.Windows.Forms.TextBox txtObjPalette; } } \ No newline at end of file diff --git a/BizHawk.MultiClient/SNESTools/SNESGraphicsDebugger.cs b/BizHawk.MultiClient/SNESTools/SNESGraphicsDebugger.cs index b515d18aa6..e4c732e621 100644 --- a/BizHawk.MultiClient/SNESTools/SNESGraphicsDebugger.cs +++ b/BizHawk.MultiClient/SNESTools/SNESGraphicsDebugger.cs @@ -6,6 +6,7 @@ // . could this apply to the palette too? //TODO - show the priority list for the current mode. make the priority list have checkboxes, and use that to control whether that item displays (does bsnes have that granularity? maybe) //TODO - use custom checkboxes for register-viewing checkboxes to make them green and checked +//TODO - make freeze actually save the info caches, and re-render in realtime, so that you can pick something you want to see animate without having to hover your mouse just right. also add a checkbox to do the literal freeze (stop it from updating) //DEFERRED: //. 256bpp modes (difficult to use) @@ -47,12 +48,12 @@ namespace BizHawk.MultiClient viewer.ScaleImage = false; + displayTypeItems.Add(new DisplayTypeItem("OBJ", eDisplayType.OBJ)); displayTypeItems.Add(new DisplayTypeItem("BG1", eDisplayType.BG1)); displayTypeItems.Add(new DisplayTypeItem("BG2",eDisplayType.BG2)); displayTypeItems.Add(new DisplayTypeItem("BG3",eDisplayType.BG3)); displayTypeItems.Add(new DisplayTypeItem("BG4",eDisplayType.BG4)); - displayTypeItems.Add(new DisplayTypeItem("OBJ Tiles",eDisplayType.OBJ0)); - displayTypeItems.Add(new DisplayTypeItem("Sprites", eDisplayType.Sprites)); + displayTypeItems.Add(new DisplayTypeItem("OBJ Tiles",eDisplayType.OBJTiles0)); displayTypeItems.Add(new DisplayTypeItem("2bpp tiles",eDisplayType.Tiles2bpp)); displayTypeItems.Add(new DisplayTypeItem("4bpp tiles",eDisplayType.Tiles4bpp)); displayTypeItems.Add(new DisplayTypeItem("8bpp tiles",eDisplayType.Tiles8bpp)); @@ -60,7 +61,7 @@ namespace BizHawk.MultiClient displayTypeItems.Add(new DisplayTypeItem("Mode7Ext tiles",eDisplayType.TilesMode7Ext)); displayTypeItems.Add(new DisplayTypeItem("Mode7 tiles (DC)", eDisplayType.TilesMode7DC)); comboDisplayType.DataSource = displayTypeItems; - comboDisplayType.SelectedIndex = 0; + comboDisplayType.SelectedIndex = 1; var paletteTypeItems = new List(); paletteTypeItems.Add(new PaletteTypeItem("BizHawk", SnesColors.ColorType.BizHawk)); @@ -202,7 +203,7 @@ namespace BizHawk.MultiClient txtOBSELSizeBits.Text = si.OBSEL_Size.ToString(); txtOBSELBaseBits.Text = si.OBSEL_NameBase.ToString(); txtOBSELT1OfsBits.Text = si.OBSEL_NameSel.ToString(); - txtOBSELSizeDescr.Text = string.Format("{0}, {1}", SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size,0], SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size,1]); + txtOBSELSizeDescr.Text = string.Format("{0}, {1}", SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size, 0], SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size, 1]); txtOBSELBaseDescr.Text = FormatVramAddress(si.OBJTable0Addr); txtOBSELT1OfsDescr.Text = FormatVramAddress(si.OBJTable1Addr); @@ -278,7 +279,7 @@ namespace BizHawk.MultiClient if (si.Mode.MODE == 1 && si.Mode1_BG3_Priority) { lblBG3.ForeColor = Color.Red; - if(toolTip1.GetToolTip(lblBG3) != "Mode 1 BG3 priority toggle bit of $2105 is SET") + if (toolTip1.GetToolTip(lblBG3) != "Mode 1 BG3 priority toggle bit of $2105 is SET") toolTip1.SetToolTip(lblBG3, "Mode 1 BG3 priority toggle bit of $2105 is SET"); } else @@ -292,7 +293,12 @@ namespace BizHawk.MultiClient RenderView(); RenderPalette(); RenderTileView(); + //these are likely to be changing all the time UpdateColorDetails(); + UpdateOBJDetails(); + //maybe bg settings changed, or something + UpdateMapEntryDetails(); + UpdateTileDetails(); } eDisplayType CurrDisplaySelection { get { return (comboDisplayType.SelectedValue as eDisplayType?).Value; } } @@ -314,24 +320,22 @@ namespace BizHawk.MultiClient }; var selection = CurrDisplaySelection; - if (selection == eDisplayType.Sprites) + if (selection == eDisplayType.OBJ) { - var dims = new[] { SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size,0], SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size,1] }; - int largestWidth = Math.Max(dims[0].Width, dims[1].Width); - int largestHeight = Math.Max(dims[0].Height, dims[1].Height); - int width = largestWidth * 16; - int height = largestHeight * 8; + var objBounds = si.ObjSizeBounds; + int width = objBounds.Width * 8; + int height = objBounds.Height * 16; allocate(width, height); for (int i = 0; i < 128; i++) { - int tx = i % 16; - int ty = i / 16; - int x = tx * largestWidth; - int y = ty * largestHeight; + int tx = i % 8; + int ty = i / 8; + int x = tx * objBounds.Width; + int y = ty * objBounds.Height; gd.RenderSpriteToScreen(pixelptr, stride / 4, x,y, si, i); } } - if (selection == eDisplayType.OBJ0 || selection == eDisplayType.OBJ1) + if (selection == eDisplayType.OBJTiles0 || selection == eDisplayType.OBJTiles1) { allocate(128, 256); int startTile; @@ -376,7 +380,6 @@ namespace BizHawk.MultiClient if (IsDisplayTypeBG(selection)) { int bgnum = (int)selection; - var si = gd.ScanScreenInfo(); var bg = si.BG[bgnum]; map = new SNESGraphicsDecoder.TileEntry[0]; @@ -434,10 +437,10 @@ namespace BizHawk.MultiClient enum eDisplayType { - BG1=1, BG2=2, BG3=3, BG4=4, Sprites, OBJ0, OBJ1, Tiles2bpp, Tiles4bpp, Tiles8bpp, TilesMode7, TilesMode7Ext, TilesMode7DC + OBJ, BG1 = 1, BG2 = 2, BG3 = 3, BG4 = 4, OBJTiles0, OBJTiles1, Tiles2bpp, Tiles4bpp, Tiles8bpp, TilesMode7, TilesMode7Ext, TilesMode7DC } static bool IsDisplayTypeBG(eDisplayType type) { return type == eDisplayType.BG1 || type == eDisplayType.BG2 || type == eDisplayType.BG3 || type == eDisplayType.BG4; } - static bool IsDisplayTypeOBJ(eDisplayType type) { return type == eDisplayType.OBJ0 || type == eDisplayType.OBJ1; } + static bool IsDisplayTypeOBJ(eDisplayType type) { return type == eDisplayType.OBJTiles0 || type == eDisplayType.OBJTiles1; } static int DisplayTypeBGNum(eDisplayType type) { if(IsDisplayTypeBG(type)) return (int)type; else return -1; } static SNESGraphicsDecoder.BGMode BGModeForDisplayType(eDisplayType type) { @@ -449,8 +452,8 @@ namespace BizHawk.MultiClient case eDisplayType.TilesMode7: return SNESGraphicsDecoder.BGMode.Mode7; case eDisplayType.TilesMode7Ext: return SNESGraphicsDecoder.BGMode.Mode7Ext; case eDisplayType.TilesMode7DC: return SNESGraphicsDecoder.BGMode.Mode7DC; - case eDisplayType.OBJ0: return SNESGraphicsDecoder.BGMode.OBJ; - case eDisplayType.OBJ1: return SNESGraphicsDecoder.BGMode.OBJ; + case eDisplayType.OBJTiles0: return SNESGraphicsDecoder.BGMode.OBJ; + case eDisplayType.OBJTiles1: return SNESGraphicsDecoder.BGMode.OBJ; default: throw new InvalidOperationException(); } } @@ -612,8 +615,8 @@ namespace BizHawk.MultiClient if (selection == eDisplayType.Tiles8bpp) bpp = 8; if (selection == eDisplayType.TilesMode7) bpp = 8; if (selection == eDisplayType.TilesMode7Ext) bpp = 7; - if (selection == eDisplayType.OBJ0) bpp = 4; - if (selection == eDisplayType.OBJ1) bpp = 4; + if (selection == eDisplayType.OBJTiles0) bpp = 4; + if (selection == eDisplayType.OBJTiles1) bpp = 4; SNESGraphicsDecoder.PaletteSelection ret = new SNESGraphicsDecoder.PaletteSelection(); if(bpp == 0) return ret; @@ -700,6 +703,22 @@ namespace BizHawk.MultiClient throw new InvalidOperationException(); } + void UpdateOBJDetails() + { + if (currObjDataState == null) return; + var oam = new SNESGraphicsDecoder.OAMInfo(gd, si, currObjDataState.Number); + txtObjNumber.Text = string.Format("#${0:X2}", currObjDataState.Number); + txtObjCoord.Text = string.Format("({0}, {1})",oam.X,oam.Y); + cbObjHFlip.Checked = oam.HFlip; + cbObjVFlip.Checked = oam.VFlip; + cbObjLarge.Checked = oam.Size == 1; + txtObjSize.Text = SNESGraphicsDecoder.ObjSizes[si.OBSEL_Size, oam.Size].ToString(); + txtObjPriority.Text = oam.Priority.ToString(); + txtObjPalette.Text = oam.Palette.ToString(); + txtObjPaletteMemo.Text = string.Format("${0:X2}", oam.Palette * 16 + 128); + txtObjName.Text = string.Format("#${0:X3}", oam.Tile); + txtObjNameAddr.Text = string.Format("@{0:X4}", oam.Address); + } void UpdateTileDetails() { @@ -754,11 +773,13 @@ namespace BizHawk.MultiClient txtDetailsPaletteColorHex.Text = string.Format("#{0:X6}", color & 0xFFFFFF); txtDetailsPaletteColorRGB.Text = string.Format("({0},{1},{2})", (color >> 16) & 0xFF, (color >> 8) & 0xFF, (color & 0xFF)); - if (lastColorNum < 128) lblDetailsOBJOrBG.Text = "(BG:)"; else lblDetailsOBJOrBG.Text = "(OBJ:)"; txtPaletteDetailsIndexHex.Text = string.Format("${0:X2}", lastColorNum); - txtPaletteDetailsIndexHexSpecific.Text = string.Format("${0:X2}", lastColorNum & 0x7F); txtPaletteDetailsIndex.Text = string.Format("{0}", lastColorNum); - txtPaletteDetailsIndexSpecific.Text = string.Format("{0}", lastColorNum & 0x7F); + + //not being used anymore + //if (lastColorNum < 128) lblDetailsOBJOrBG.Text = "(BG:)"; else lblDetailsOBJOrBG.Text = "(OBJ:)"; + //txtPaletteDetailsIndexHexSpecific.Text = string.Format("${0:X2}", lastColorNum & 0x7F); + //txtPaletteDetailsIndexSpecific.Text = string.Format("{0}", lastColorNum & 0x7F); txtPaletteDetailsAddress.Text = string.Format("${0:X3}", lastColorNum * 2); @@ -929,7 +950,6 @@ namespace BizHawk.MultiClient class ObjDataState { public int Number; - public SNESGraphicsDecoder.OAMInfo OAMInfo; } ObjDataState currObjDataState; @@ -973,7 +993,7 @@ namespace BizHawk.MultiClient gd.RenderMode7TilesToScreen((int*)bmpdata.Scan0, bmpdata.Stride / 4, true, false, 1, currTileDataState.Tile, 1); else if (currTileDataState.Type == eDisplayType.TilesMode7DC) gd.RenderMode7TilesToScreen((int*)bmpdata.Scan0, bmpdata.Stride / 4, false, true, 1, currTileDataState.Tile, 1); - else if (currTileDataState.Type == eDisplayType.OBJ0 || currTileDataState.Type == eDisplayType.OBJ1) + else if (currTileDataState.Type == eDisplayType.OBJTiles0 || currTileDataState.Type == eDisplayType.OBJTiles1) { //render an obj tile int tile = currTileDataState.Address / 32; @@ -984,6 +1004,17 @@ namespace BizHawk.MultiClient bmp.UnlockBits(bmpdata); viewerTile.SetBitmap(bmp); } + else if (currObjDataState != null) + { + var bounds = si.ObjSizeBoundsSquare; + int width = bounds.Width; + int height = bounds.Height; + var bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + var bmpdata = bmp.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + gd.RenderSpriteToScreen((int*)bmpdata.Scan0, bmpdata.Stride / 4, 0, 0, si, currObjDataState.Number); + bmp.UnlockBits(bmpdata); + viewerObj.SetBitmap(bmp); + } else { var bmp = new Bitmap(8, 8, System.Drawing.Imaging.PixelFormat.Format32bppArgb); @@ -1004,9 +1035,8 @@ namespace BizHawk.MultiClient currTileDataState.Tile = tilenum; currTileDataState.Address = (bpp==7?8:bpp) * 8 * currTileDataState.Tile; currTileDataState.Palette = currPaletteSelection.start; - if (CurrDisplaySelection == eDisplayType.OBJ0 || CurrDisplaySelection == eDisplayType.OBJ1) + if (CurrDisplaySelection == eDisplayType.OBJTiles0 || CurrDisplaySelection == eDisplayType.OBJTiles1) { - //adjust address according to if (tilenum < 256) currTileDataState.Address += si.OBJTable0Addr; else @@ -1024,11 +1054,19 @@ namespace BizHawk.MultiClient void HandleSpriteMouseOver(int px, int py) { - //currViewingSprite = tx + ty * 16; + int ox = px / si.ObjSizeBounds.Width; + int oy = py / si.ObjSizeBounds.Height; + + if (ox < 0 || oy < 0 || ox >= 8 || oy >= 16) + return; + + int objNum = oy * 8 + ox; + + currObjDataState = new ObjDataState(); + currObjDataState.Number = objNum; + //RenderView(); //remember, we were going to highlight the selected sprite somehow as we hover over it - int ox = px / 64; - int oy = py / 64; - //if(ox<0 || oy<0 || ox> + SetTab(tpOBJ); } void SetTab(TabPage tpSet) @@ -1054,11 +1092,11 @@ namespace BizHawk.MultiClient switch (CurrDisplaySelection) { - case eDisplayType.OBJ0: - case eDisplayType.OBJ1: + case eDisplayType.OBJTiles0: + case eDisplayType.OBJTiles1: HandleTileViewMouseOver(128, 256, 4, tx, ty); break; - case eDisplayType.Sprites: + case eDisplayType.OBJ: HandleSpriteMouseOver(loc.X, loc.Y); break; case eDisplayType.Tiles2bpp: @@ -1110,6 +1148,7 @@ namespace BizHawk.MultiClient RenderTileView(); UpdateMapEntryDetails(); UpdateTileDetails(); + UpdateOBJDetails(); } private void viewer_MouseLeave(object sender, EventArgs e)