Broken UI system
This commit is contained in:
@@ -26,6 +26,7 @@ namespace SplashEdit.EditorCode
|
||||
private Color bufferColor2 = new Color(0, 1, 0, 0.5f);
|
||||
private Color prohibitedColor = new Color(1, 0, 0, 0.3f);
|
||||
private PSXData _psxData;
|
||||
private PSXFontData[] _cachedFonts;
|
||||
|
||||
private static readonly Vector2[] resolutions =
|
||||
{
|
||||
@@ -144,6 +145,62 @@ namespace SplashEdit.EditorCode
|
||||
vramImage.SetPixel(x, VramHeight - y - 1, packed.vramPixels[x, y].GetUnityColor());
|
||||
}
|
||||
}
|
||||
|
||||
// Overlay custom font textures into the VRAM preview.
|
||||
// Fonts live at x=960 (4bpp = 64 VRAM hwords wide), stacking from y=0.
|
||||
PSXFontData[] fonts;
|
||||
PSXUIExporter.CollectCanvases(selectedResolution, out fonts);
|
||||
_cachedFonts = fonts;
|
||||
if (fonts != null && fonts.Length > 0)
|
||||
{
|
||||
foreach (var font in fonts)
|
||||
{
|
||||
if (font.PixelData == null || font.PixelData.Length == 0) continue;
|
||||
|
||||
int vramX = font.VramX;
|
||||
int vramY = font.VramY;
|
||||
int texH = font.TextureHeight;
|
||||
int bytesPerRow = 256 / 2; // 4bpp: 2 pixels per byte, 256 pixels wide = 128 bytes/row
|
||||
|
||||
// Each byte holds two 4bpp pixels. In VRAM, 4 4bpp pixels = 1 16-bit hword.
|
||||
// So 256 4bpp pixels = 64 VRAM hwords.
|
||||
for (int y = 0; y < texH && (vramY + y) < VramHeight; y++)
|
||||
{
|
||||
for (int x = 0; x < 64 && (vramX + x) < VramWidth; x++)
|
||||
{
|
||||
// Read 4 4bpp pixels from this VRAM hword position
|
||||
int byteIdx = y * bytesPerRow + x * 2;
|
||||
if (byteIdx + 1 >= font.PixelData.Length) continue;
|
||||
byte b0 = font.PixelData[byteIdx];
|
||||
byte b1 = font.PixelData[byteIdx + 1];
|
||||
// Each byte: low nibble = first pixel, high nibble = second
|
||||
// 4 pixels per hword: b0 low, b0 high, b1 low, b1 high
|
||||
bool anyOpaque = ((b0 & 0x0F) | (b0 >> 4) | (b1 & 0x0F) | (b1 >> 4)) != 0;
|
||||
|
||||
if (anyOpaque)
|
||||
{
|
||||
int px = vramX + x;
|
||||
int py = VramHeight - 1 - (vramY + y);
|
||||
if (px < VramWidth && py >= 0)
|
||||
vramImage.SetPixel(px, py, new Color(0.8f, 0.8f, 1f));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Also show system font area (960, 464)-(1023, 511) = 64x48
|
||||
for (int y = 464; y < 512 && y < VramHeight; y++)
|
||||
{
|
||||
for (int x = 960; x < 1024 && x < VramWidth; x++)
|
||||
{
|
||||
int py = VramHeight - 1 - y;
|
||||
Color existing = vramImage.GetPixel(x, py);
|
||||
if (existing.r < 0.01f && existing.g < 0.01f && existing.b < 0.01f)
|
||||
vramImage.SetPixel(x, py, new Color(0.3f, 0.3f, 0.5f));
|
||||
}
|
||||
}
|
||||
|
||||
vramImage.Apply();
|
||||
|
||||
// Prompt the user to select a file location and save the VRAM data.
|
||||
@@ -297,6 +354,24 @@ namespace SplashEdit.EditorCode
|
||||
EditorGUI.DrawRect(areaRect, prohibitedColor);
|
||||
}
|
||||
|
||||
// Draw font region overlays.
|
||||
if (_cachedFonts != null)
|
||||
{
|
||||
Color fontColor = new Color(0.2f, 0.4f, 0.9f, 0.25f);
|
||||
foreach (var font in _cachedFonts)
|
||||
{
|
||||
if (font.PixelData == null || font.PixelData.Length == 0) continue;
|
||||
Rect fontRect = new Rect(vramRect.x + font.VramX, vramRect.y + font.VramY, 64, font.TextureHeight);
|
||||
EditorGUI.DrawRect(fontRect, fontColor);
|
||||
GUI.Label(new Rect(fontRect.x + 2, fontRect.y + 2, 60, 16), "Font", EditorStyles.miniLabel);
|
||||
}
|
||||
|
||||
// System font overlay
|
||||
Rect sysFontRect = new Rect(vramRect.x + 960, vramRect.y + 464, 64, 48);
|
||||
EditorGUI.DrawRect(sysFontRect, new Color(0.4f, 0.2f, 0.9f, 0.25f));
|
||||
GUI.Label(new Rect(sysFontRect.x + 2, sysFontRect.y + 2, 60, 16), "SysFont", EditorStyles.miniLabel);
|
||||
}
|
||||
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user