Revamped collision system
This commit is contained in:
@@ -187,23 +187,48 @@ namespace SplashEdit.RuntimeCode
|
||||
}
|
||||
}
|
||||
|
||||
// ── Font pixel data (written BEFORE the UI table, alongside atlas/CLUT data) ──
|
||||
// The C++ parser expects canvas descriptors immediately after font descriptors
|
||||
// (font pixel data is at absolute offsets, not inline). Write pixel data here
|
||||
// so it doesn't sit between font descriptors and canvas descriptors.
|
||||
List<long> fontDataOffsetPositions = new List<long>();
|
||||
List<long> fontPixelDataPositions = new List<long>();
|
||||
if (fonts != null)
|
||||
{
|
||||
for (int fi = 0; fi < fonts.Length; fi++)
|
||||
{
|
||||
var font = fonts[fi];
|
||||
if (font.PixelData == null || font.PixelData.Length == 0)
|
||||
{
|
||||
fontPixelDataPositions.Add(0);
|
||||
continue;
|
||||
}
|
||||
|
||||
AlignToFourBytes(writer);
|
||||
long dataPos = writer.BaseStream.Position;
|
||||
writer.Write(font.PixelData);
|
||||
fontPixelDataPositions.Add(dataPos);
|
||||
}
|
||||
}
|
||||
|
||||
// ── UI table (same format as splashpack UI section) ──
|
||||
AlignToFourBytes(writer);
|
||||
long uiTableStart = writer.BaseStream.Position;
|
||||
|
||||
// ── Font descriptors (112 bytes each) ──
|
||||
List<long> fontDataOffsetPositions = new List<long>();
|
||||
if (fonts != null)
|
||||
{
|
||||
foreach (var font in fonts)
|
||||
for (int fi = 0; fi < fonts.Length; fi++)
|
||||
{
|
||||
var font = fonts[fi];
|
||||
writer.Write(font.GlyphWidth); // [0]
|
||||
writer.Write(font.GlyphHeight); // [1]
|
||||
writer.Write(font.VramX); // [2-3]
|
||||
writer.Write(font.VramY); // [4-5]
|
||||
writer.Write(font.TextureHeight); // [6-7]
|
||||
fontDataOffsetPositions.Add(writer.BaseStream.Position);
|
||||
writer.Write((uint)0); // [8-11] dataOffset placeholder
|
||||
// dataOffset: use the pre-written pixel data position
|
||||
long pixPos = fontPixelDataPositions[fi];
|
||||
writer.Write((uint)pixPos); // [8-11] dataOffset (0 if no data)
|
||||
writer.Write((uint)(font.PixelData?.Length ?? 0)); // [12-15] dataSize
|
||||
if (font.AdvanceWidths != null && font.AdvanceWidths.Length >= 96)
|
||||
writer.Write(font.AdvanceWidths, 0, 96);
|
||||
@@ -212,26 +237,13 @@ namespace SplashEdit.RuntimeCode
|
||||
}
|
||||
}
|
||||
|
||||
// ── Font pixel data ──
|
||||
if (fonts != null)
|
||||
{
|
||||
for (int fi = 0; fi < fonts.Length; fi++)
|
||||
{
|
||||
var font = fonts[fi];
|
||||
if (font.PixelData == null || font.PixelData.Length == 0) continue;
|
||||
|
||||
AlignToFourBytes(writer);
|
||||
long dataPos = writer.BaseStream.Position;
|
||||
writer.Write(font.PixelData);
|
||||
|
||||
long curPos = writer.BaseStream.Position;
|
||||
writer.Seek((int)fontDataOffsetPositions[fi], SeekOrigin.Begin);
|
||||
writer.Write((uint)dataPos);
|
||||
writer.Seek((int)curPos, SeekOrigin.Begin);
|
||||
}
|
||||
}
|
||||
// Canvas descriptors now follow immediately after font descriptors
|
||||
// (no font pixel data in between — it was written above).
|
||||
|
||||
// ── Canvas descriptor (12 bytes) ──
|
||||
// Must align here: the C++ parser aligns fontDataEnd to 4 bytes
|
||||
// when skipping past font pixel data to find the canvas descriptor.
|
||||
AlignToFourBytes(writer);
|
||||
var elements = canvas.Elements ?? new PSXUIElementData[0];
|
||||
string cvName = canvas.Name ?? "loading";
|
||||
if (cvName.Length > 24) cvName = cvName.Substring(0, 24);
|
||||
|
||||
Reference in New Issue
Block a user