From 441acbb6c9de741ff538423a1c49e7b0c2976972 Mon Sep 17 00:00:00 2001 From: jracek Date: Fri, 11 Apr 2025 16:21:41 +0200 Subject: [PATCH] Added basic lua wrapper, currently can't retrieve from registry --- Makefile | 1 + output.bin | Bin 407940 -> 408104 bytes src/lua.cpp | 192 ++++++++++++++++++++++++++++++++++++++++++++- src/lua.h | 20 +++++ src/main.cpp | 8 +- src/splashpack.cpp | 22 +++++- src/splashpack.hh | 4 +- 7 files changed, 242 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 27429bc..ef9f58a 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ src/splashpack.cpp \ src/camera.cpp \ src/gtemath.cpp \ src/navmesh.cpp \ +src/lua.cpp \ output.o include third_party/nugget/psyqo/psyqo.mk diff --git a/output.bin b/output.bin index 317e6d229b7e2e95cb5612ac4c107c042e5fc593..e7ac2058e4866f8a869d30fd98756a6702e50760 100644 GIT binary patch delta 5898 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 VaMBj+-2bHQZRb8GZIhk*{14ewSvmj! delta 5804 zcmZXX3v5(X8pr1rZnxcKwzP$IN?%j@n3=wqI@40NmOdz2TKWRoP74fE+Nskzg;v^9 z9+jdXu!@3652&nV7nVB+2D59#1QX1z2_~3mvLV|A-yiZUrC)f8=d^G>y?_>L+3?^{@la(H7|RAAxZeD^MR z35w}2pnHlG)0D}iR4dd`VSPEQXGM4v`RoV}Yc;}Wkw>G$byPzyqP`K)CDh+Uw2KDnsg4iOs0bv@ zeuJFM-qcNrk}Lu7qDyauBtsxWF0V6KB*{sT&F0B?qw1qDnTVc@mpQTDGG~)Aff+{T zQwcJ%C|ER>BgqKJq;q7EK~94Vxq?L_i)7Bnkv@sWD$F-+=ElLA{?;CuQv*`$tMt1D zB^d*0@9=n6c1aQfakn@+T#b@^0#eo1*x1k_N&GG3bh=xr+9X*H;^=U0w&x6$T*LNH9`4ptSyQaUaTUO2gx6NETUNOFORFV}W1GVGTI++AnI$AMaIUsXh z2dV0>@>lsK`8-T2?;$DQarD{&qpAs{%3p@@Wz}wwN)V&Z8z8Mcjcbkl`4Xh0%eA)H zC#%xG=We(RTYL#;ST_55ETSc-uR?dR5kKo4I+c zW=GvtIaWJ}bBA+Fg-#BD)Q;C}HOSjx(mZBV-2kcBimGwhC-(=NIl*W0#;ua13naKE z&}WQ(5G1oR!Dr;W1LCjsHLrh2R^0;0dMKlL!7@o4|3Qx5+ZpJSWIafNFS9d6e>#Uj zdMBF4dIK`&U64R9&^Mu<%-bNA0n2cb{&b3dw3(CoEyLysS=9p)7nfp*&6VURNS&oK zdzn>|_du3eOA8ifNpc6onw(;Z)8F@!JKTA{->_0X163mAo01$E@L-Nf~>YT+dH#m&PO1VPTXwr_B$G@;8~=4jXUaS zCCE@!?>#vqAQP#ZGWC1x=xLD2crbY%9{m_3Smbr~=KVC5Fe_oyo2Oq}qK3#D-y5yp zQeup#aj3SGJFj0&;W|`*Jo&w4A81vAsjTs>C*; zsy26vexHf+kwUle!irCcR(3Uc+B;;g`Llp3{lz~0auO?us@lpt`Yk6WiORamJo;-a zUMH#^tu^j2@p-rq7nFY0h?Lpk_Er4`Y6_!)%6qbQ6Jc`(jI1{zS=b!;I*Bid>bo1) z>Nl%MSAkq>%ewVzO0*F*v^RP5TS@FC%Gr?F>Cl(`R=995XM<7rHBrUZit$=`eTb}R zpvJ-GF$1*|Ik&h5^-D$^h-9_)7!U1jqCjwDTd#bH#SJ3MaN4B)UW?pc08I>zYzqYC zNig)k4kiqXmsUvZ*Yx7??eg%ecSb8a*JrYH_&HfIbwi+SUGdw)Apn6p8@1w;{FsRUn&U%$FU50PcqHR#+TM-0Ds zmSM|4s=Nfnd*OF+qBmeH`wo#KKR#E#97M@4fl4!Qs}#syej-xDlay7R=F(vkf>`( zi(9{=ggPhO%k0*#B(a2Old{=t+yFxnG#J+#Eqk3Ls%mR!X=s<|qn}WFy+@*0GqUiN zZ86^3$_Q%jXwtJri11BsGYU^fP`#&K{_qeV6D=LB95AjS^RL6Gc0m8>A!>-$G#-+c?3DPICsc3ZX+^z6MV*D zIv+tv{l=^CDbeW4;2PsZ&z~DczGi=|?6ra@HITDG|NSQ>Bgi#q8J1bE6E%-D4jOOm z=Mm)b>K{mv5|6C-+}K>>t zFj{6cj$9j2i+j1-Kzk#o*{&bCKfR@hugp`src8J7gP*^rZyj0xPaDWx)7@Q?91fFv zbKbo#=k|R$MgRK$K0RS_Z=a+0<-B)a&Yk;mO0Ki>y?y*)a_^jv-`-Y1O3ZWt(yrvAz-LFNOZn)uu1JXy`}2`8oR4TZqjsvR zg$SIpA#lwBcaH--eGWuh=~^7hTru0Bl#6qA1oqqE7Um*(%B~cO3!JFcuGER|ZKxQw z!M%`!esktbF5?Dlof8F4S{N#VizwvpswX9)gnlBDG%*W}6;iERfWhk!h^oIMHYF=b(+jZaFIy41nu5@uQ&1D6>q}9p zr}{jWV(i1sZWUfMe5^1bE;FqPNS7j(P$5-Pl|#E)JdVa)ZN12Qg;c>%?dZ7 zXG>9LFGV0!hJd{cfwPOr7PGdTUCPOpkS$@}Z`8e__&4ef5vpKC1@j(c=Lgxjk`*-C zQnICFRb(_;H5H9kLq((2axS&V3oV1|pb6EfyJ9YW@k98ZD5+DE#lv;#MiE-h5tp;- zAs9Q2_OSY#Sp2X$BD8vrSkL+u%v-@|16c!S(MZ)uwUTNjRTH~3!3{ODqM53Ns)ev!-1YU$^RhFIwtMvl9Y#R@MN_CMrpJ`DjMxk);4!1Mn$8IQ;oCVRwxHeXaY^`6O3+Slt$Z5MWgMY z+QEvQ%-cyeNk*eR&b@z}Phl4sjW(q|C5or8u4~o(!)lm`JgD2zM zgJ&Mv%g%e5_mujya6P4t32h&1_wi}%N7S(&>eT}n$bNu%zh#t0dzv$N8uL5%jJi|U zpW#dovfn{QpJm>&WY0l4XhMe=J;dl?MrpL?sh(%v5k`-Yy}&(vfqQzCQ5tQUY?@4v z3C`~rpTaRlkCV}8FH*h8elI~eUP4ptWilG=1Qm_;J1QFO6(l=eVcrZGjdqfXM*BS# zjrIpB8toJnjdq%~r&;?)G8*j+6^*7*(P$wm8tp9ASXY6IsQU3!UL9q@1 diff --git a/src/lua.cpp b/src/lua.cpp index 92fb82b..ddcc1f0 100644 --- a/src/lua.cpp +++ b/src/lua.cpp @@ -1 +1,191 @@ -#include "lua.h" \ No newline at end of file +#include "lua.h" + +#include + +#include "gameobject.hh" +#include "psyqo-lua/lua.hh" + +constexpr const char METATABLE_SCRIPT[] = R"( + print("test") + metatableForAllGameObjects = { + __index = function(self, key) + if key == "position" then + local pos = rawget(self, key) + if pos == nil then + pos = get_position(self.__cpp_ptr) + rawset(self, key, pos) + end + return pos + end + return rawget(self, key) + end, + + __newindex = function(self, key, value) + if key == "position" then + -- Option 1: Directly update C++ + set_position(self.__cpp_ptr, value) + -- Option 2: Also update local cache: + rawset(self, key, value) + return + end + rawset(self, key, value) + end + } +)"; + +// Lua helpers + +int luaPrint(psyqo::Lua L) { + int n = L.getTop(); // Get the number of arguments + + for (int i = 1; i <= n; i++) { + if (i > 1) { + printf("\t"); // Tab between arguments + } + + // Check the type of the argument + if (L.isString(i)) { + printf("%s", L.toString(i)); // If it's a string, print it + } else if (L.isNumber(i)) { + printf("%g", L.toNumber(i)); // If it's a number, print it + } else { + // For other types, just print their type (you can expand this if needed) + printf("[%s]", L.typeName(i)); + } + } + printf("\n"); + + return 0; // No return value +} + +static int gameobjectSetPosition(lua_State* L) { + psxsplash::GameObject* go = (psxsplash::GameObject*)lua_touserdata(L, 1); + lua_newtable(L); + lua_pushnumber(L, go->position.x.raw()); + lua_setfield(L, -2, "x"); + lua_pushnumber(L, go->position.y.raw()); + lua_setfield(L, -2, "y"); + lua_pushnumber(L, go->position.z.raw()); + lua_setfield(L, -2, "z"); + return 1; +} + +static int gameobjectGetPosition(lua_State* L) { + psxsplash::GameObject* go = (psxsplash::GameObject*)lua_touserdata(L, 1); + + lua_getfield(L, 2, "x"); + psyqo::FixedPoint<> x(lua_tonumber(L, -1), psyqo::FixedPoint<>::RAW); + go->position.x = x; + lua_pop(L, 1); + lua_getfield(L, 2, "y"); + psyqo::FixedPoint<> y(lua_tonumber(L, -1), psyqo::FixedPoint<>::RAW); + go->position.x = x; + lua_pop(L, 1); + lua_getfield(L, 2, "z"); + psyqo::FixedPoint<> z(lua_tonumber(L, -1), psyqo::FixedPoint<>::RAW); + go->position.x = x; + lua_pop(L, 1); + + return 0; +} + +void psxsplash::Lua::Init() { + L.push(luaPrint); + L.setGlobal("print"); + + L.push(gameobjectGetPosition); + L.setGlobal("get_position"); + + L.push(gameobjectSetPosition); + L.setGlobal("set_position"); + + // Load and run the metatable script + if (L.loadBuffer(METATABLE_SCRIPT, "metatableForAllGameObjects") == 0) { + if (L.pcall(0, 0) == 0) { + // Script executed successfully + printf("Lua script 'metatableForAllGameObjects' loaded successfully\n"); + } else { + // Print Lua error if script execution fails + printf("Error executing Lua script: %s\n", L.isString(-1) ? L.toString(-1) : "Unknown error"); + L.pop(); + } + } else { + // Print Lua error if script loading fails + printf("Error loading Lua script: %s\n", L.isString(-1) ? L.toString(-1) : "Unknown error"); + L.pop(); + } + + // Check if the metatable was set as a global + L.getGlobal("metatableForAllGameObjects"); + if (L.isTable(-1)) { + printf("metatableForAllGameObjects successfully set as a global\n"); + } else { + printf("Warning: metatableForAllGameObjects not found after init\n"); + } + L.pop(); // Pop the global check +} + +void psxsplash::Lua::LoadLuaFile(const char* code, size_t len) { + if (L.loadBuffer(code, len) != LUA_OK) { + printf("Lua error: %s\n", L.toString(-1)); + L.pop(); + } + if (L.pcall(0, 0)) { + printf("Lua error: %s\n", L.toString(-1)); + L.pop(); + } +} + +void psxsplash::Lua::RegisterGameObject(GameObject* go) { + // Create a new Lua table for the GameObject + L.newTable(); + + // Set the __cpp_ptr field to store the C++ pointer + L.push(go); + L.setField(-2, "__cpp_ptr"); + + // Set the metatable for the table + L.getGlobal("metatableForAllGameObjects"); + if (L.isTable(-1)) { + L.setMetatable(-2); // Set the metatable for the table + } else { + printf("Warning: metatableForAllGameObjects not found\n"); + L.pop(); // Pop the invalid metatable + } + + L.push(go); + L.push(-2); + L.rawSet(LUA_REGISTRYINDEX); + + // Debugging: Confirm the GameObject was registered + printf("GameObject registered in Lua registry: %p\n", go); + + L.pop(); +} + +void psxsplash::Lua::CallOnCollide(GameObject* self, GameObject* other) { + L.getGlobal("onCollision"); + if (!L.isFunction(-1)) { + printf("Lua function 'onCollide' not found\n"); + L.pop(); + return; + } + + PushGameObject(self); + PushGameObject(other); + + if (L.pcall(2, 0)) { + printf("Lua error: %s\n", L.toString(-1)); + L.pop(); + } +} + +void psxsplash::Lua::PushGameObject(GameObject* go) { + L.push(go); + L.rawGet(LUA_REGISTRYINDEX); + + if (!L.isTable(-1)) { + printf("Warning: GameObject not found in Lua registry\n"); + L.pop(); + } +} diff --git a/src/lua.h b/src/lua.h index e69de29..9445f7f 100644 --- a/src/lua.h +++ b/src/lua.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +#include "gameobject.hh" + +namespace psxsplash { +class Lua { + public: + void Init(); + + void LoadLuaFile(const char* code, size_t len); + void RegisterGameObject(GameObject* go); + void CallOnCollide(GameObject* self, GameObject* other); + + private: + void PushGameObject(GameObject* go); + psyqo::Lua L; +}; +} // namespace psxsplash \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index b04f955..58769e7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ #include "EASTL/algorithm.h" #include "camera.hh" +#include "lua.h" #include "navmesh.hh" #include "psyqo/vector.hh" #include "renderer.hh" @@ -30,6 +31,7 @@ class PSXSplash final : public psyqo::Application { void createScene() override; public: + psxsplash::Lua m_lua; psxsplash::SplashPackLoader m_loader; psyqo::Font<> m_font; @@ -75,6 +77,8 @@ void PSXSplash::prepare() { // Initialize the Renderer singleton psxsplash::Renderer::Init(gpu()); + + m_lua.Init(); } void PSXSplash::createScene() { @@ -84,7 +88,8 @@ void PSXSplash::createScene() { } void MainScene::start(StartReason reason) { - app.m_loader.LoadSplashpack(_binary_output_bin_start); + app.m_loader.LoadSplashpack(_binary_output_bin_start, app.m_lua); + app.m_lua.CallOnCollide(app.m_loader.gameObjects[0], app.m_loader.gameObjects[1]); psxsplash::Renderer::GetInstance().SetCamera(m_mainCamera); m_mainCamera.SetPosition(static_cast>(app.m_loader.playerStartPos.x), @@ -184,6 +189,7 @@ void MainScene::frame() { psxsplash::Renderer::GetInstance().RenderNavmeshPreview(*app.m_loader.navmeshes[0], true); } + app.m_font.chainprintf(gpu(), {{.x = 2, .y = 2}}, {{.r = 0xff, .g = 0xff, .b = 0xff}}, "FPS: %i", gpu().getRefreshRate() / deltaTime); diff --git a/src/splashpack.cpp b/src/splashpack.cpp index d5d6b3e..85bb4b5 100644 --- a/src/splashpack.cpp +++ b/src/splashpack.cpp @@ -5,6 +5,7 @@ #include #include "gameobject.hh" +#include "lua.h" #include "mesh.hh" #include "psyqo/fixed-point.hh" #include "psyqo/gte-registers.hh" @@ -15,6 +16,7 @@ namespace psxsplash { struct SPLASHPACKFileHeader { char magic[2]; uint16_t version; + uint16_t luaFileCount; uint16_t gameObjectCount; uint16_t navmeshCount; uint16_t textureAtlasCount; @@ -22,7 +24,15 @@ struct SPLASHPACKFileHeader { psyqo::GTE::PackedVec3 playerStartPos; psyqo::GTE::PackedVec3 playerStartRot; psyqo::FixedPoint<12, uint16_t> playerHeight; - uint16_t pad[1]; + uint16_t pad[2]; +}; + +struct SPLASHPACKLuaFile { + union { + uint32_t luaCodeOffset; + const char* luaCode; + }; + uint32_t length; }; struct SPLASHPACKTextureAtlas { @@ -39,7 +49,7 @@ struct SPLASHPACKClut { uint16_t pad; }; -void SplashPackLoader::LoadSplashpack(uint8_t *data) { +void SplashPackLoader::LoadSplashpack(uint8_t *data, psxsplash::Lua &lua) { psyqo::Kernel::assert(data != nullptr, "Splashpack loading data pointer is null"); psxsplash::SPLASHPACKFileHeader *header = reinterpret_cast(data); psyqo::Kernel::assert(memcmp(header->magic, "SP", 2) == 0, "Splashpack has incorrect magic"); @@ -53,9 +63,17 @@ void SplashPackLoader::LoadSplashpack(uint8_t *data) { uint8_t *curentPointer = data + sizeof(psxsplash::SPLASHPACKFileHeader); + for (uint16_t i = 0; i < header->luaFileCount; i++) { + psxsplash::SPLASHPACKLuaFile *luaHeader = reinterpret_cast(curentPointer); + luaHeader->luaCode = reinterpret_cast(data + luaHeader->luaCodeOffset); + lua.LoadLuaFile(luaHeader->luaCode, luaHeader->length); + curentPointer += sizeof(psxsplash::SPLASHPACKLuaFile); + } + for (uint16_t i = 0; i < header->gameObjectCount; i++) { psxsplash::GameObject *go = reinterpret_cast(curentPointer); go->polygons = reinterpret_cast(data + go->polygonsOffset); + lua.RegisterGameObject(go); gameObjects.push_back(go); curentPointer += sizeof(psxsplash::GameObject); } diff --git a/src/splashpack.hh b/src/splashpack.hh index 11273c8..9806bdc 100644 --- a/src/splashpack.hh +++ b/src/splashpack.hh @@ -5,11 +5,13 @@ #include #include "gameobject.hh" +#include "lua.h" #include "navmesh.hh" #include "psyqo/fixed-point.hh" namespace psxsplash { + class SplashPackLoader { public: eastl::vector gameObjects; @@ -18,7 +20,7 @@ class SplashPackLoader { psyqo::GTE::PackedVec3 playerStartPos, playerStartRot; psyqo::FixedPoint<12, uint16_t> playerHeight; - void LoadSplashpack(uint8_t *data); + void LoadSplashpack(uint8_t *data, Lua &lua); }; }; // namespace psxsplash \ No newline at end of file