broken ui system
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user