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

@@ -4,6 +4,7 @@
#include "controls.hh"
#include "camera.hh"
#include "cutscene.hh"
#include "uisystem.hh"
#include <psyqo/soft-math.hh>
#include <psyqo/trigonometry.hh>
@@ -15,6 +16,7 @@ namespace psxsplash {
// Static member
SceneManager* LuaAPI::s_sceneManager = nullptr;
CutscenePlayer* LuaAPI::s_cutscenePlayer = nullptr;
UISystem* LuaAPI::s_uiSystem = nullptr;
// Scale factor: FixedPoint<12> stores 1.0 as raw 4096.
// Lua scripts work in world-space units (1 = one unit), so we convert.
@@ -36,9 +38,10 @@ static psyqo::Trig<> s_trig;
// REGISTRATION
// ============================================================================
void LuaAPI::RegisterAll(psyqo::Lua& L, SceneManager* scene, CutscenePlayer* cutscenePlayer) {
void LuaAPI::RegisterAll(psyqo::Lua& L, SceneManager* scene, CutscenePlayer* cutscenePlayer, UISystem* uiSystem) {
s_sceneManager = scene;
s_cutscenePlayer = cutscenePlayer;
s_uiSystem = uiSystem;
// ========================================================================
// ENTITY API
@@ -281,6 +284,73 @@ void LuaAPI::RegisterAll(psyqo::Lua& L, SceneManager* scene, CutscenePlayer* cut
L.setField(-2, "IsPlaying");
L.setGlobal("Cutscene");
// ========================================================================
// UI API
// ========================================================================
L.newTable(); // UI table
L.push(UI_FindCanvas);
L.setField(-2, "FindCanvas");
L.push(UI_SetCanvasVisible);
L.setField(-2, "SetCanvasVisible");
L.push(UI_IsCanvasVisible);
L.setField(-2, "IsCanvasVisible");
L.push(UI_FindElement);
L.setField(-2, "FindElement");
L.push(UI_SetVisible);
L.setField(-2, "SetVisible");
L.push(UI_IsVisible);
L.setField(-2, "IsVisible");
L.push(UI_SetText);
L.setField(-2, "SetText");
L.push(UI_GetText);
L.setField(-2, "GetText");
L.push(UI_SetProgress);
L.setField(-2, "SetProgress");
L.push(UI_GetProgress);
L.setField(-2, "GetProgress");
L.push(UI_SetColor);
L.setField(-2, "SetColor");
L.push(UI_GetColor);
L.setField(-2, "GetColor");
L.push(UI_SetPosition);
L.setField(-2, "SetPosition");
L.push(UI_GetPosition);
L.setField(-2, "GetPosition");
L.push(UI_SetSize);
L.setField(-2, "SetSize");
L.push(UI_GetSize);
L.setField(-2, "GetSize");
L.push(UI_SetProgressColors);
L.setField(-2, "SetProgressColors");
L.push(UI_GetElementType);
L.setField(-2, "GetElementType");
L.push(UI_GetElementCount);
L.setField(-2, "GetElementCount");
L.push(UI_GetElementByIndex);
L.setField(-2, "GetElementByIndex");
L.setGlobal("UI");
}
// ============================================================================
@@ -1437,4 +1507,252 @@ int LuaAPI::Cutscene_IsPlaying(lua_State* L) {
return 1;
}
// ============================================================================
// UI API IMPLEMENTATION
// ============================================================================
int LuaAPI::UI_FindCanvas(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isString(1)) {
lua.pushNumber(-1);
return 1;
}
const char* name = lua.toString(1);
int idx = s_uiSystem->findCanvas(name);
lua.pushNumber(static_cast<lua_Number>(idx));
return 1;
}
int LuaAPI::UI_SetCanvasVisible(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem) return 0;
int idx;
// Accept number (index) or string (name)
if (lua.isNumber(1)) {
idx = static_cast<int>(lua.toNumber(1));
} else if (lua.isString(1)) {
idx = s_uiSystem->findCanvas(lua.toString(1));
} else {
return 0;
}
bool visible = lua.toBoolean(2);
s_uiSystem->setCanvasVisible(idx, visible);
return 0;
}
int LuaAPI::UI_IsCanvasVisible(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem) {
lua.push(false);
return 1;
}
int idx;
if (lua.isNumber(1)) {
idx = static_cast<int>(lua.toNumber(1));
} else if (lua.isString(1)) {
idx = s_uiSystem->findCanvas(lua.toString(1));
} else {
lua.push(false);
return 1;
}
lua.push(s_uiSystem->isCanvasVisible(idx));
return 1;
}
int LuaAPI::UI_FindElement(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1) || !lua.isString(2)) {
lua.pushNumber(-1);
return 1;
}
int canvasIdx = static_cast<int>(lua.toNumber(1));
const char* name = lua.toString(2);
int handle = s_uiSystem->findElement(canvasIdx, name);
lua.pushNumber(static_cast<lua_Number>(handle));
return 1;
}
int LuaAPI::UI_SetVisible(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) return 0;
int handle = static_cast<int>(lua.toNumber(1));
bool visible = lua.toBoolean(2);
s_uiSystem->setElementVisible(handle, visible);
return 0;
}
int LuaAPI::UI_IsVisible(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) {
lua.push(false);
return 1;
}
int handle = static_cast<int>(lua.toNumber(1));
lua.push(s_uiSystem->isElementVisible(handle));
return 1;
}
int LuaAPI::UI_SetText(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) return 0;
int handle = static_cast<int>(lua.toNumber(1));
const char* text = lua.isString(2) ? lua.toString(2) : "";
s_uiSystem->setText(handle, text);
return 0;
}
int LuaAPI::UI_SetProgress(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) return 0;
int handle = static_cast<int>(lua.toNumber(1));
int value = static_cast<int>(lua.toNumber(2));
if (value < 0) value = 0;
if (value > 100) value = 100;
s_uiSystem->setProgress(handle, (uint8_t)value);
return 0;
}
int LuaAPI::UI_GetProgress(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) {
lua.pushNumber(0);
return 1;
}
int handle = static_cast<int>(lua.toNumber(1));
lua.pushNumber(static_cast<lua_Number>(s_uiSystem->getProgress(handle)));
return 1;
}
int LuaAPI::UI_SetColor(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) return 0;
int handle = static_cast<int>(lua.toNumber(1));
uint8_t r = static_cast<uint8_t>(lua.toNumber(2));
uint8_t g = static_cast<uint8_t>(lua.toNumber(3));
uint8_t b = static_cast<uint8_t>(lua.toNumber(4));
s_uiSystem->setColor(handle, r, g, b);
return 0;
}
int LuaAPI::UI_SetPosition(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) return 0;
int handle = static_cast<int>(lua.toNumber(1));
int16_t x = static_cast<int16_t>(lua.toNumber(2));
int16_t y = static_cast<int16_t>(lua.toNumber(3));
s_uiSystem->setPosition(handle, x, y);
return 0;
}
int LuaAPI::UI_GetText(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) {
lua.push("");
return 1;
}
int handle = static_cast<int>(lua.toNumber(1));
lua.push(s_uiSystem->getText(handle));
return 1;
}
int LuaAPI::UI_GetColor(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) {
lua.pushNumber(0); lua.pushNumber(0); lua.pushNumber(0);
return 3;
}
int handle = static_cast<int>(lua.toNumber(1));
uint8_t r, g, b;
s_uiSystem->getColor(handle, r, g, b);
lua.pushNumber(r); lua.pushNumber(g); lua.pushNumber(b);
return 3;
}
int LuaAPI::UI_GetPosition(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) {
lua.pushNumber(0); lua.pushNumber(0);
return 2;
}
int handle = static_cast<int>(lua.toNumber(1));
int16_t x, y;
s_uiSystem->getPosition(handle, x, y);
lua.pushNumber(static_cast<lua_Number>(x));
lua.pushNumber(static_cast<lua_Number>(y));
return 2;
}
int LuaAPI::UI_SetSize(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) return 0;
int handle = static_cast<int>(lua.toNumber(1));
int16_t w = static_cast<int16_t>(lua.toNumber(2));
int16_t h = static_cast<int16_t>(lua.toNumber(3));
s_uiSystem->setSize(handle, w, h);
return 0;
}
int LuaAPI::UI_GetSize(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) {
lua.pushNumber(0); lua.pushNumber(0);
return 2;
}
int handle = static_cast<int>(lua.toNumber(1));
int16_t w, h;
s_uiSystem->getSize(handle, w, h);
lua.pushNumber(static_cast<lua_Number>(w));
lua.pushNumber(static_cast<lua_Number>(h));
return 2;
}
int LuaAPI::UI_SetProgressColors(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) return 0;
int handle = static_cast<int>(lua.toNumber(1));
uint8_t bgR = static_cast<uint8_t>(lua.toNumber(2));
uint8_t bgG = static_cast<uint8_t>(lua.toNumber(3));
uint8_t bgB = static_cast<uint8_t>(lua.toNumber(4));
uint8_t fR = static_cast<uint8_t>(lua.toNumber(5));
uint8_t fG = static_cast<uint8_t>(lua.toNumber(6));
uint8_t fB = static_cast<uint8_t>(lua.toNumber(7));
s_uiSystem->setProgressColors(handle, bgR, bgG, bgB, fR, fG, fB);
return 0;
}
int LuaAPI::UI_GetElementType(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) {
lua.pushNumber(-1);
return 1;
}
int handle = static_cast<int>(lua.toNumber(1));
lua.pushNumber(static_cast<lua_Number>(static_cast<uint8_t>(s_uiSystem->getElementType(handle))));
return 1;
}
int LuaAPI::UI_GetElementCount(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1)) {
lua.pushNumber(0);
return 1;
}
int canvasIdx = static_cast<int>(lua.toNumber(1));
lua.pushNumber(static_cast<lua_Number>(s_uiSystem->getCanvasElementCount(canvasIdx)));
return 1;
}
int LuaAPI::UI_GetElementByIndex(lua_State* L) {
psyqo::Lua lua(L);
if (!s_uiSystem || !lua.isNumber(1) || !lua.isNumber(2)) {
lua.pushNumber(-1);
return 1;
}
int canvasIdx = static_cast<int>(lua.toNumber(1));
int elemIdx = static_cast<int>(lua.toNumber(2));
int handle = s_uiSystem->getCanvasElementHandle(canvasIdx, elemIdx);
lua.pushNumber(static_cast<lua_Number>(handle));
return 1;
}
} // namespace psxsplash