broken ui system

This commit is contained in:
Jan Racek
2026-03-25 12:25:29 +01:00
parent 60a7063a17
commit f485ec36a8
14 changed files with 1309 additions and 18 deletions

View File

@@ -16,6 +16,9 @@ using namespace psyqo::fixed_point_literals;
using namespace psxsplash;
// Static member definition
psyqo::Font<>* psxsplash::SceneManager::s_font = nullptr;
void psxsplash::SceneManager::InitializeScene(uint8_t* splashpackData) {
L.Reset();
@@ -23,7 +26,7 @@ void psxsplash::SceneManager::InitializeScene(uint8_t* splashpackData) {
m_audio.init();
// Register the Lua API
LuaAPI::RegisterAll(L.getState(), this, &m_cutscenePlayer);
LuaAPI::RegisterAll(L.getState(), this, &m_cutscenePlayer, &m_uiSystem);
#ifdef PSXSPLASH_PROFILER
debug::Profiler::getInstance().initialize();
@@ -84,9 +87,56 @@ void psxsplash::SceneManager::InitializeScene(uint8_t* splashpackData) {
m_cutsceneCount > 0 ? m_cutscenes : nullptr,
m_cutsceneCount,
&m_currentCamera,
&m_audio
&m_audio,
&m_uiSystem
);
// Initialize UI system (v13+)
if (sceneSetup.uiCanvasCount > 0 && sceneSetup.uiTableOffset != 0 && s_font != nullptr) {
m_uiSystem.init(*s_font);
m_uiSystem.loadFromSplashpack(splashpackData, sceneSetup.uiCanvasCount,
sceneSetup.uiFontCount, sceneSetup.uiTableOffset);
m_uiSystem.uploadFonts(Renderer::GetInstance().getGPU());
Renderer::GetInstance().SetUISystem(&m_uiSystem);
// Resolve UI track handles: the splashpack loader stored raw name pointers
// in CutsceneTrack.target for UI tracks. Now that UISystem is loaded, resolve
// those names to canvas indices / element handles.
for (int ci = 0; ci < m_cutsceneCount; ci++) {
for (uint8_t ti = 0; ti < m_cutscenes[ci].trackCount; ti++) {
auto& track = m_cutscenes[ci].tracks[ti];
bool isUI = static_cast<uint8_t>(track.trackType) >= 5;
if (!isUI || track.target == nullptr) continue;
const char* nameStr = reinterpret_cast<const char*>(track.target);
track.target = nullptr; // Clear the temporary name pointer
if (track.trackType == TrackType::UICanvasVisible) {
// Name is just the canvas name
track.uiHandle = static_cast<int16_t>(m_uiSystem.findCanvas(nameStr));
} else {
// Name is "canvasName/elementName" — find the '/' separator
const char* sep = nameStr;
while (*sep && *sep != '/') sep++;
if (*sep == '/') {
// Temporarily null-terminate the canvas portion
// (nameStr points into splashpack data, which is mutable)
char* mutableSep = const_cast<char*>(sep);
*mutableSep = '\0';
int canvasIdx = m_uiSystem.findCanvas(nameStr);
*mutableSep = '/'; // Restore the separator
if (canvasIdx >= 0) {
track.uiHandle = static_cast<int16_t>(
m_uiSystem.findElement(canvasIdx, sep + 1));
}
}
}
}
}
} else {
Renderer::GetInstance().SetUISystem(nullptr);
}
m_playerPosition = sceneSetup.playerStartPosition;
playerRotationX = 0.0_pi;
@@ -607,6 +657,9 @@ void psxsplash::SceneManager::clearScene() {
m_cutscenePlayer.init(nullptr, 0, nullptr, nullptr); // Reset cutscene player
// BVH, WorldCollision, and NavRegions will be overwritten by next load
// Reset UI system (disconnect from renderer before splashpack data disappears)
Renderer::GetInstance().SetUISystem(nullptr);
// Reset room/portal pointers (they point into splashpack data which is being freed)
m_rooms = nullptr;
m_roomCount = 0;