Added Lua API for AudioPlayerComponent

This commit is contained in:
OusmBlueNinja 2025-05-07 15:34:12 -05:00
parent fca9640e72
commit 90fb92c3ae
11 changed files with 1683 additions and 1470 deletions

View File

@ -10,24 +10,24 @@ Collapsed=1
[Window][WindowOverViewport_11111111] [Window][WindowOverViewport_11111111]
Pos=0,19 Pos=0,19
Size=1280,701 Size=1920,1158
Collapsed=0 Collapsed=0
[Window][Inspector] [Window][Inspector]
Pos=913,19 Pos=1553,19
Size=367,202 Size=367,659
Collapsed=0 Collapsed=0
DockId=0x00000018,0 DockId=0x00000018,0
[Window][Scene Tree] [Window][Scene Tree]
Pos=0,19 Pos=0,19
Size=335,350 Size=335,579
Collapsed=0 Collapsed=0
DockId=0x0000000F,0 DockId=0x0000000F,0
[Window][Viewport] [Window][Viewport]
Pos=337,19 Pos=337,19
Size=574,202 Size=1214,659
Collapsed=0 Collapsed=0
DockId=0x00000017,0 DockId=0x00000017,0
@ -36,14 +36,14 @@ Size=1280,19
Collapsed=0 Collapsed=0
[Window][Performance Info] [Window][Performance Info]
Pos=1106,223 Pos=1628,680
Size=174,268 Size=292,268
Collapsed=0 Collapsed=0
DockId=0x00000019,0 DockId=0x00000019,0
[Window][Console] [Window][Console]
Pos=337,223 Pos=337,680
Size=736,497 Size=1238,497
Collapsed=0 Collapsed=0
DockId=0x00000013,0 DockId=0x00000013,0
@ -78,8 +78,8 @@ Collapsed=0
DockId=0x00000015,1 DockId=0x00000015,1
[Window][Color Correction] [Window][Color Correction]
Pos=1106,493 Pos=1628,950
Size=174,227 Size=292,227
Collapsed=0 Collapsed=0
DockId=0x0000001A,0 DockId=0x0000001A,0
@ -113,8 +113,8 @@ Collapsed=0
DockId=0x0000000E,0 DockId=0x0000000E,0
[Window][Audio Output] [Window][Audio Output]
Pos=1075,223 Pos=1577,680
Size=29,497 Size=49,497
Collapsed=0 Collapsed=0
DockId=0x00000012,0 DockId=0x00000012,0
@ -125,8 +125,8 @@ Collapsed=0
DockId=0x0000000D,0 DockId=0x0000000D,0
[Window][Resources] [Window][Resources]
Pos=0,371 Pos=0,600
Size=335,349 Size=335,577
Collapsed=0 Collapsed=0
DockId=0x00000010,0 DockId=0x00000010,0
@ -141,7 +141,7 @@ Column 0 Weight=1.0000
Column 1 Width=120 Column 1 Width=120
[Docking][Data] [Docking][Data]
DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1280,701 Split=X DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1920,1158 Split=X
DockNode ID=0x00000005 Parent=0x11111111 SizeRef=989,1158 Split=X DockNode ID=0x00000005 Parent=0x11111111 SizeRef=989,1158 Split=X
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=335,701 Split=Y Selected=0x12EF0F59 DockNode ID=0x00000001 Parent=0x00000005 SizeRef=335,701 Split=Y Selected=0x12EF0F59
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 Split=Y Selected=0x12EF0F59 DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 Split=Y Selected=0x12EF0F59

View File

@ -65,6 +65,7 @@ auto_libs:
- ssl - ssl
- crypto - crypto
- dbghelp - dbghelp
- z
auto_includes: auto_includes:
- imgui - imgui

View File

@ -8,5 +8,6 @@
"ssl": "C:\\msys64\\mingw64\\lib\\libssl.a", "ssl": "C:\\msys64\\mingw64\\lib\\libssl.a",
"crypto": "C:\\msys64\\mingw64\\lib\\libcrypto.a", "crypto": "C:\\msys64\\mingw64\\lib\\libcrypto.a",
"dbghelp": "C:\\msys64\\mingw64\\lib\\libdbghelp.a", "dbghelp": "C:\\msys64\\mingw64\\lib\\libdbghelp.a",
"imgui": "src\\vendor\\imgui" "imgui": "src\\vendor\\imgui",
"z": "C:\\msys64\\mingw64\\lib\\libz.a"
} }

View File

@ -1,3 +1,4 @@
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\core\audio\AudioEngine.cpp -o src\build\core\audio\AudioEngine.o [COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\core\functions\ScenePacker.cpp -o src\build\core\functions\ScenePacker.o
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\Engine.cpp -o src\build\Engine.o [LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\AudioPlayerComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\audio\AudioEngine.o src\build\core\functions\Prefab.o src\build\core\functions\ScenePacker.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Popup.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\AudioInfo.o src\build\editor\windows\Inspector.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o src\build\xxhash.o src\build\miniaudio.o src\build\ImGuizmo.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -ldbghelp -lz
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\AudioPlayerComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\audio\AudioEngine.o src\build\core\functions\Prefab.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Popup.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\AudioInfo.o src\build\editor\windows\Inspector.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o src\build\xxhash.o src\build\miniaudio.o src\build\ImGuizmo.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -ldbghelp [ERROR] Runtime crash
Command 'src\build\app.exe' returned non-zero exit status 3221225477.

View File

@ -0,0 +1,17 @@
local jumpSound = nil
function OnInit()
jumpSound = Engine.GetObjectByTag("Jump_Object_Sound")
if not jumpSound then
Engine.LogError("Jump_Object_Sound object not found!")
end
end
function OnUpdate(dt)
if Engine.KeyDown(Keycode.Space) and jumpSound then
local sound = jumpSound:GetComponent("SoundComponent")
if sound then
sound:Play()
end
end
end

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,7 @@
#include "../Components/TextComponent.h" #include "../Components/TextComponent.h"
#include "../Components/TilemapComponent.h" #include "../Components/TilemapComponent.h"
#include "../Components/AnimationComponent.h" #include "../Components/AnimationComponent.h"
#include "../Components/AudioPlayerComponent.h"
#include "../core/utils/Profiler.h" #include "../core/utils/Profiler.h"
#include "../core/utils/utils.h" #include "../core/utils/utils.h"
@ -19,7 +20,6 @@
#include "../core/types/vec2.h" #include "../core/types/vec2.h"
#include "../core/types/vec3.h" #include "../core/types/vec3.h"
#include <lua.hpp> #include <lua.hpp>
#include <memory> #include <memory>
#include <cstring> #include <cstring>
@ -57,21 +57,17 @@ struct LuaLightWrapper
{ {
LightComponent *comp; LightComponent *comp;
}; };
struct LuaSoundWrapper
{
AudioPlayerComponent *comp;
};
#define LUA_SOUND_MT "LuaSoundMeta"
#define LUA_LIGHT_MT "LuaLightMeta" #define LUA_LIGHT_MT "LuaLightMeta"
#define LUA_ANIMATION_MT "LuaAnimationMeta" #define LUA_ANIMATION_MT "LuaAnimationMeta"
static core::types::Vec3 GetLuaVector3(lua_State *L, int index); static core::types::Vec3 GetLuaVector3(lua_State *L, int index);
ScriptComponent::ScriptComponent(Object *owner) : Component(owner), L(nullptr) {} ScriptComponent::ScriptComponent(Object *owner) : Component(owner), L(nullptr) {}
ScriptComponent::~ScriptComponent() ScriptComponent::~ScriptComponent()
{ {
@ -157,26 +153,32 @@ static int Lua_DebugLua(lua_State *L)
return 0; return 0;
} }
static Component* GetComponentByName(Object* obj, const std::string& type) static Component* GetComponentByName(Object* obj, const std::string& type)
{ {
PROFILE_DEEP_SCOPE("GetComponentByName"); PROFILE_DEEP_SCOPE("GetComponentByName");
if (type == "SpriteComponent")
return obj->GetComponent<SpriteComponent>().get(); using GetterFn = std::function<Component*(Object*)>;
if (type == "CameraComponent") static const std::unordered_map<std::string, GetterFn> table = {
return obj->GetComponent<CameraComponent>().get(); {"SpriteComponent", [](Object* o) { return o->GetComponent<SpriteComponent>().get(); }},
if (type == "LightComponent") {"CameraComponent", [](Object* o) { return o->GetComponent<CameraComponent>().get(); }},
return obj->GetComponent<LightComponent>().get(); {"LightComponent", [](Object* o) { return o->GetComponent<LightComponent>().get(); }},
if (type == "TilemapComponent") {"TilemapComponent", [](Object* o) { return o->GetComponent<TilemapComponent>().get(); }},
return obj->GetComponent<TilemapComponent>().get(); {"TextComponent", [](Object* o) { return o->GetComponent<TextComponent>().get(); }},
if (type == "TextComponent") {"ScriptComponent", [](Object* o) { return o->GetComponent<ScriptComponent>().get(); }},
return obj->GetComponent<TextComponent>().get(); {"AnimationComponent", [](Object* o) { return o->GetComponent<AnimationComponent>().get(); }},
if (type == "ScriptComponent") {"AudioPlayerComponent", [](Object* o) { return o->GetComponent<AudioPlayerComponent>().get(); }},
return obj->GetComponent<ScriptComponent>().get(); };
if (type == "AnimationComponent")
return obj->GetComponent<AnimationComponent>().get(); auto it = table.find(type);
if (it != table.end())
return it->second(obj);
return nullptr; return nullptr;
} }
static int Lua_GetMousePos(lua_State *L) static int Lua_GetMousePos(lua_State *L)
{ {
PROFILE_DEEP_SCOPE("Engine::GetMousePos"); PROFILE_DEEP_SCOPE("Engine::GetMousePos");
@ -226,12 +228,67 @@ static int Lua_Object_GetComponent(lua_State *L)
lua_pushnil(L); lua_pushnil(L);
return 1; return 1;
} }
if (strcmp(type, "SoundComponent") == 0)
{
auto compPtr = wrapper->obj->GetComponent<AudioPlayerComponent>();
if (compPtr)
{
LuaSoundWrapper *sw = (LuaSoundWrapper *)lua_newuserdata(L, sizeof(LuaSoundWrapper));
sw->comp = compPtr.get();
luaL_getmetatable(L, LUA_SOUND_MT);
lua_setmetatable(L, -2);
return 1;
}
lua_pushnil(L);
return 1;
}
Component *comp = GetComponentByName(wrapper->obj, type); Component *comp = GetComponentByName(wrapper->obj, type);
lua_pushlightuserdata(L, comp ? comp : nullptr); lua_pushlightuserdata(L, comp ? comp : nullptr);
return 1; return 1;
} }
static AudioPlayerComponent* CheckSound(lua_State* L)
{
return ((LuaSoundWrapper*)luaL_checkudata(L, 1, LUA_SOUND_MT))->comp;
}
static int Lua_Sound_Play(lua_State* L)
{
CheckSound(L)->Play();
return 0;
}
static int Lua_Sound_Stop(lua_State* L)
{
CheckSound(L)->Stop();
return 0;
}
static int Lua_Sound_Pause(lua_State* L)
{
CheckSound(L)->Pause();
return 0;
}
static int Lua_Sound_SetVolume(lua_State* L)
{
float vol = static_cast<float>(luaL_checknumber(L, 2));
CheckSound(L)->SetVolume(vol);
return 0;
}
static int Lua_Sound_Index(lua_State* L)
{
luaL_getmetatable(L, LUA_SOUND_MT);
lua_pushvalue(L, 2);
lua_rawget(L, -2);
return 1;
}
static int Lua_Object_GetPosition(lua_State *L) static int Lua_Object_GetPosition(lua_State *L)
{ {
PROFILE_DEEP_SCOPE("Object::GetPosition"); PROFILE_DEEP_SCOPE("Object::GetPosition");
@ -305,12 +362,6 @@ static int Lua_GetObjectByTag(lua_State *L)
return 1; return 1;
} }
static LightComponent *CheckLight(lua_State *L) static LightComponent *CheckLight(lua_State *L)
{ {
return ((LuaLightWrapper *)luaL_checkudata(L, 1, LUA_LIGHT_MT))->comp; return ((LuaLightWrapper *)luaL_checkudata(L, 1, LUA_LIGHT_MT))->comp;
@ -321,7 +372,9 @@ static int Lua_Light_GetColor(lua_State *L)
auto *light = CheckLight(L); auto *light = CheckLight(L);
glm::vec3 c = light->GetColor(); glm::vec3 c = light->GetColor();
LuaVector3 *vec = (LuaVector3 *)lua_newuserdata(L, sizeof(LuaVector3)); LuaVector3 *vec = (LuaVector3 *)lua_newuserdata(L, sizeof(LuaVector3));
vec->x = c.x; vec->y = c.y; vec->z = c.z; vec->x = c.x;
vec->y = c.y;
vec->z = c.z;
luaL_getmetatable(L, LUA_VECTOR3_MT); luaL_getmetatable(L, LUA_VECTOR3_MT);
lua_setmetatable(L, -2); lua_setmetatable(L, -2);
return 1; return 1;
@ -335,7 +388,6 @@ static int Lua_Light_SetColor(lua_State *L)
return 0; return 0;
} }
static int Lua_Light_GetIntensity(lua_State *L) static int Lua_Light_GetIntensity(lua_State *L)
{ {
lua_pushnumber(L, CheckLight(L)->GetIntensity()); lua_pushnumber(L, CheckLight(L)->GetIntensity());
@ -392,26 +444,16 @@ static int Lua_Light_Index(lua_State *L)
return 1; return 1;
} }
void RegisterLightType(lua_State *L) void RegisterSoundType(lua_State* L)
{ {
luaL_newmetatable(L, LUA_LIGHT_MT); luaL_newmetatable(L, LUA_SOUND_MT);
lua_pushcfunction(L, Lua_Light_GetColor); lua_setfield(L, -2, "GetColor"); lua_pushcfunction(L, Lua_Sound_Play); lua_setfield(L, -2, "Play");
lua_pushcfunction(L, Lua_Light_SetColor); lua_setfield(L, -2, "SetColor"); lua_pushcfunction(L, Lua_Sound_Stop); lua_setfield(L, -2, "Stop");
lua_pushcfunction(L, Lua_Sound_Pause); lua_setfield(L, -2, "Pause");
lua_pushcfunction(L, Lua_Sound_SetVolume); lua_setfield(L, -2, "SetVolume");
lua_pushcfunction(L, Lua_Light_GetIntensity); lua_setfield(L, -2, "GetIntensity"); lua_pushcfunction(L, Lua_Sound_Index);
lua_pushcfunction(L, Lua_Light_SetIntensity); lua_setfield(L, -2, "SetIntensity");
lua_pushcfunction(L, Lua_Light_GetRadius); lua_setfield(L, -2, "GetRadius");
lua_pushcfunction(L, Lua_Light_SetRadius); lua_setfield(L, -2, "SetRadius");
lua_pushcfunction(L, Lua_Light_GetFalloff); lua_setfield(L, -2, "GetFalloff");
lua_pushcfunction(L, Lua_Light_SetFalloff); lua_setfield(L, -2, "SetFalloff");
lua_pushcfunction(L, Lua_Light_GetType); lua_setfield(L, -2, "GetType");
lua_pushcfunction(L, Lua_Light_SetType); lua_setfield(L, -2, "SetType");
lua_pushcfunction(L, Lua_Light_Index);
lua_setfield(L, -2, "__index"); lua_setfield(L, -2, "__index");
lua_pop(L, 1); lua_pop(L, 1);
@ -420,7 +462,40 @@ void RegisterLightType(lua_State *L)
void RegisterLightType(lua_State *L)
{
luaL_newmetatable(L, LUA_LIGHT_MT);
lua_pushcfunction(L, Lua_Light_GetColor);
lua_setfield(L, -2, "GetColor");
lua_pushcfunction(L, Lua_Light_SetColor);
lua_setfield(L, -2, "SetColor");
lua_pushcfunction(L, Lua_Light_GetIntensity);
lua_setfield(L, -2, "GetIntensity");
lua_pushcfunction(L, Lua_Light_SetIntensity);
lua_setfield(L, -2, "SetIntensity");
lua_pushcfunction(L, Lua_Light_GetRadius);
lua_setfield(L, -2, "GetRadius");
lua_pushcfunction(L, Lua_Light_SetRadius);
lua_setfield(L, -2, "SetRadius");
lua_pushcfunction(L, Lua_Light_GetFalloff);
lua_setfield(L, -2, "GetFalloff");
lua_pushcfunction(L, Lua_Light_SetFalloff);
lua_setfield(L, -2, "SetFalloff");
lua_pushcfunction(L, Lua_Light_GetType);
lua_setfield(L, -2, "GetType");
lua_pushcfunction(L, Lua_Light_SetType);
lua_setfield(L, -2, "SetType");
lua_pushcfunction(L, Lua_Light_Index);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
}
// --- AnimationComponent Lua bindings --- // --- AnimationComponent Lua bindings ---
static AnimationComponent *CheckAnimationComponent(lua_State *L, int idx) static AnimationComponent *CheckAnimationComponent(lua_State *L, int idx)
@ -665,7 +740,6 @@ static int Lua_KeyDown(lua_State *L)
return 1; return 1;
} }
static core::types::Vec3 GetLuaVector3(lua_State *L, int index) static core::types::Vec3 GetLuaVector3(lua_State *L, int index)
{ {
if (luaL_testudata(L, index, LUA_VECTOR3_MT)) if (luaL_testudata(L, index, LUA_VECTOR3_MT))
@ -684,7 +758,8 @@ static core::types::Vec3 GetLuaVector3(lua_State* L, int index)
lua_pushstring(L, "x"); lua_pushstring(L, "x");
lua_rawget(L, index); lua_rawget(L, index);
if (lua_isnil(L, -1)) { if (lua_isnil(L, -1))
{
keys = keys2; keys = keys2;
lua_pop(L, 1); lua_pop(L, 1);
} }
@ -704,9 +779,6 @@ static core::types::Vec3 GetLuaVector3(lua_State* L, int index)
return core::types::Vec3(0, 0, 0); return core::types::Vec3(0, 0, 0);
} }
static int Lua_Vector3_New(lua_State *L) static int Lua_Vector3_New(lua_State *L)
{ {
PROFILE_DEEP_SCOPE("Vector3()"); PROFILE_DEEP_SCOPE("Vector3()");
@ -901,6 +973,7 @@ void ScriptComponent::ReloadScript()
RegisterAnimationType(L); RegisterAnimationType(L);
RegisterEngineBindings(); RegisterEngineBindings();
RegisterLightType(L); RegisterLightType(L);
RegisterSoundType(L);
keycode_loader(L); keycode_loader(L);

View File

@ -1791,7 +1791,6 @@ void Engine::Shutdown()
AudioEngine::Shutdown(); AudioEngine::Shutdown();
AssetManager::ClearAllAssets();
@ -1801,5 +1800,8 @@ void Engine::Shutdown()
glfwDestroyWindow(window); glfwDestroyWindow(window);
glfwTerminate(); glfwTerminate();
AssetManager::ClearAllAssets();
} }

View File

@ -0,0 +1,80 @@
#include "ScenePacker.h"
#include "../../core/utils/Logging.h"
#include "../../core/utils/ExceptionHandler.h"
#include <zlib.h>
#include <cstring>
using namespace Create;
static constexpr size_t HEADER_SIZE = 8; // 4 bytes CRC32 + 4 bytes decompressed size
// CRC32 via zlib
uint32_t ScenePacker::ComputeCRC32(const void* data, size_t length)
{
return crc32(0L, static_cast<const Bytef*>(data), static_cast<uInt>(length));
}
std::vector<uint8_t> ScenePacker::Pack(const YAML::Node& node)
{
YAML::Emitter out;
out << node;
return PackText(out.c_str());
}
std::vector<uint8_t> ScenePacker::PackText(const std::string& yamlText)
{
const uint8_t* input = reinterpret_cast<const uint8_t*>(yamlText.data());
uLongf maxCompressedSize = compressBound(static_cast<uLongf>(yamlText.size()));
std::vector<uint8_t> compressed(HEADER_SIZE + maxCompressedSize);
uLongf actualSize = maxCompressedSize;
if (compress(&compressed[HEADER_SIZE], &actualSize, input, yamlText.size()) != Z_OK) {
throw FatalError("[ScenePacker] Compression failed.", Exceptions::SystemFailure);
}
uint32_t crc = ComputeCRC32(&compressed[HEADER_SIZE], actualSize);
uint32_t originalSize = static_cast<uint32_t>(yamlText.size());
std::memcpy(&compressed[0], &crc, sizeof(uint32_t));
std::memcpy(&compressed[4], &originalSize, sizeof(uint32_t));
compressed.resize(HEADER_SIZE + actualSize);
return compressed;
}
std::string ScenePacker::UnpackText(const std::vector<uint8_t>& binary)
{
if (binary.size() < HEADER_SIZE) {
throw RecoverableError("[ScenePacker] Binary too small for header.", Exceptions::InvalidFormat);
}
uint32_t storedCRC, decompressedSize;
std::memcpy(&storedCRC, &binary[0], sizeof(uint32_t));
std::memcpy(&decompressedSize, &binary[4], sizeof(uint32_t));
const uint8_t* compressedData = binary.data() + HEADER_SIZE;
size_t compressedSize = binary.size() - HEADER_SIZE;
uint32_t actualCRC = ComputeCRC32(compressedData, compressedSize);
if (actualCRC != storedCRC) {
throw RecoverableError("[ScenePacker] CRC32 mismatch — file corrupted.", Exceptions::InvalidFormat);
}
std::vector<uint8_t> output(decompressedSize);
uLongf outSize = decompressedSize;
if (uncompress(output.data(), &outSize, compressedData, compressedSize) != Z_OK) {
throw RecoverableError("[ScenePacker] Failed to decompress scene.", Exceptions::InvalidFormat);
}
return std::string(output.begin(), output.end());
}
YAML::Node ScenePacker::Unpack(const std::vector<uint8_t>& binary)
{
return YAML::Load(UnpackText(binary));
}

View File

@ -0,0 +1,23 @@
#pragma once
#include <string>
#include <vector>
#include <yaml-cpp/yaml.h>
class ScenePacker
{
public:
// Serialize a YAML::Node to compressed binary
static std::vector<uint8_t> Pack(const YAML::Node& node);
// Serialize a YAML text string to compressed binary
static std::vector<uint8_t> PackText(const std::string& yamlText);
// Deserialize binary to YAML::Node (verifies and decompresses)
static YAML::Node Unpack(const std::vector<uint8_t>& binary);
// Deserialize binary to raw YAML string
static std::string UnpackText(const std::vector<uint8_t>& binary);
private:
static uint32_t ComputeCRC32(const void* data, size_t size);
};

View File

@ -398,11 +398,13 @@ void AssetManager::UnloadAsset(uint64_t uaid)
void AssetManager::ClearAllAssets() void AssetManager::ClearAllAssets()
{ {
for (auto &[id, asset] : s_Assets) std::vector<uint64_t> idsToUnload;
for (const auto &[id, _] : s_Assets)
idsToUnload.push_back(id);
for (uint64_t id : idsToUnload)
UnloadAsset(id); UnloadAsset(id);
s_Assets.clear();
s_PathToUAID.clear();
} }
void AssetManager::Save(YAML::Emitter &out) void AssetManager::Save(YAML::Emitter &out)
@ -558,8 +560,6 @@ void PrefabAssetInfo::Load(const YAML::Node &node)
ReloadFromYAML(); ReloadFromYAML();
} }
void PrefabAssetInfo::ReloadFromYAML() void PrefabAssetInfo::ReloadFromYAML()
{ {
if (!prefabYAML || !prefabYAML.IsMap()) if (!prefabYAML || !prefabYAML.IsMap())