Added Lua API for AudioPlayerComponent
This commit is contained in:
parent
fca9640e72
commit
90fb92c3ae
32
imgui.ini
32
imgui.ini
@ -10,24 +10,24 @@ Collapsed=1
|
||||
|
||||
[Window][WindowOverViewport_11111111]
|
||||
Pos=0,19
|
||||
Size=1280,701
|
||||
Size=1920,1158
|
||||
Collapsed=0
|
||||
|
||||
[Window][Inspector]
|
||||
Pos=913,19
|
||||
Size=367,202
|
||||
Pos=1553,19
|
||||
Size=367,659
|
||||
Collapsed=0
|
||||
DockId=0x00000018,0
|
||||
|
||||
[Window][Scene Tree]
|
||||
Pos=0,19
|
||||
Size=335,350
|
||||
Size=335,579
|
||||
Collapsed=0
|
||||
DockId=0x0000000F,0
|
||||
|
||||
[Window][Viewport]
|
||||
Pos=337,19
|
||||
Size=574,202
|
||||
Size=1214,659
|
||||
Collapsed=0
|
||||
DockId=0x00000017,0
|
||||
|
||||
@ -36,14 +36,14 @@ Size=1280,19
|
||||
Collapsed=0
|
||||
|
||||
[Window][Performance Info]
|
||||
Pos=1106,223
|
||||
Size=174,268
|
||||
Pos=1628,680
|
||||
Size=292,268
|
||||
Collapsed=0
|
||||
DockId=0x00000019,0
|
||||
|
||||
[Window][Console]
|
||||
Pos=337,223
|
||||
Size=736,497
|
||||
Pos=337,680
|
||||
Size=1238,497
|
||||
Collapsed=0
|
||||
DockId=0x00000013,0
|
||||
|
||||
@ -78,8 +78,8 @@ Collapsed=0
|
||||
DockId=0x00000015,1
|
||||
|
||||
[Window][Color Correction]
|
||||
Pos=1106,493
|
||||
Size=174,227
|
||||
Pos=1628,950
|
||||
Size=292,227
|
||||
Collapsed=0
|
||||
DockId=0x0000001A,0
|
||||
|
||||
@ -113,8 +113,8 @@ Collapsed=0
|
||||
DockId=0x0000000E,0
|
||||
|
||||
[Window][Audio Output]
|
||||
Pos=1075,223
|
||||
Size=29,497
|
||||
Pos=1577,680
|
||||
Size=49,497
|
||||
Collapsed=0
|
||||
DockId=0x00000012,0
|
||||
|
||||
@ -125,8 +125,8 @@ Collapsed=0
|
||||
DockId=0x0000000D,0
|
||||
|
||||
[Window][Resources]
|
||||
Pos=0,371
|
||||
Size=335,349
|
||||
Pos=0,600
|
||||
Size=335,577
|
||||
Collapsed=0
|
||||
DockId=0x00000010,0
|
||||
|
||||
@ -141,7 +141,7 @@ Column 0 Weight=1.0000
|
||||
Column 1 Width=120
|
||||
|
||||
[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=0x00000001 Parent=0x00000005 SizeRef=335,701 Split=Y Selected=0x12EF0F59
|
||||
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 Split=Y Selected=0x12EF0F59
|
||||
|
@ -65,6 +65,7 @@ auto_libs:
|
||||
- ssl
|
||||
- crypto
|
||||
- dbghelp
|
||||
- z
|
||||
|
||||
auto_includes:
|
||||
- imgui
|
||||
|
@ -8,5 +8,6 @@
|
||||
"ssl": "C:\\msys64\\mingw64\\lib\\libssl.a",
|
||||
"crypto": "C:\\msys64\\mingw64\\lib\\libcrypto.a",
|
||||
"dbghelp": "C:\\msys64\\mingw64\\lib\\libdbghelp.a",
|
||||
"imgui": "src\\vendor\\imgui"
|
||||
"imgui": "src\\vendor\\imgui",
|
||||
"z": "C:\\msys64\\mingw64\\lib\\libz.a"
|
||||
}
|
@ -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\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\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
|
||||
[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
|
||||
[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
|
||||
[ERROR] Runtime crash
|
||||
Command 'src\build\app.exe' returned non-zero exit status 3221225477.
|
||||
|
17
src/assets/lua/sound_test.lua
Normal file
17
src/assets/lua/sound_test.lua
Normal 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
@ -10,6 +10,7 @@
|
||||
#include "../Components/TextComponent.h"
|
||||
#include "../Components/TilemapComponent.h"
|
||||
#include "../Components/AnimationComponent.h"
|
||||
#include "../Components/AudioPlayerComponent.h"
|
||||
|
||||
#include "../core/utils/Profiler.h"
|
||||
#include "../core/utils/utils.h"
|
||||
@ -19,7 +20,6 @@
|
||||
#include "../core/types/vec2.h"
|
||||
#include "../core/types/vec3.h"
|
||||
|
||||
|
||||
#include <lua.hpp>
|
||||
#include <memory>
|
||||
#include <cstring>
|
||||
@ -57,20 +57,16 @@ struct LuaLightWrapper
|
||||
{
|
||||
LightComponent *comp;
|
||||
};
|
||||
struct LuaSoundWrapper
|
||||
{
|
||||
AudioPlayerComponent *comp;
|
||||
};
|
||||
|
||||
#define LUA_SOUND_MT "LuaSoundMeta"
|
||||
#define LUA_LIGHT_MT "LuaLightMeta"
|
||||
#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()
|
||||
@ -157,26 +153,32 @@ static int Lua_DebugLua(lua_State *L)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Component *GetComponentByName(Object *obj, const std::string &type)
|
||||
|
||||
static Component* GetComponentByName(Object* obj, const std::string& type)
|
||||
{
|
||||
PROFILE_DEEP_SCOPE("GetComponentByName");
|
||||
if (type == "SpriteComponent")
|
||||
return obj->GetComponent<SpriteComponent>().get();
|
||||
if (type == "CameraComponent")
|
||||
return obj->GetComponent<CameraComponent>().get();
|
||||
if (type == "LightComponent")
|
||||
return obj->GetComponent<LightComponent>().get();
|
||||
if (type == "TilemapComponent")
|
||||
return obj->GetComponent<TilemapComponent>().get();
|
||||
if (type == "TextComponent")
|
||||
return obj->GetComponent<TextComponent>().get();
|
||||
if (type == "ScriptComponent")
|
||||
return obj->GetComponent<ScriptComponent>().get();
|
||||
if (type == "AnimationComponent")
|
||||
return obj->GetComponent<AnimationComponent>().get();
|
||||
|
||||
using GetterFn = std::function<Component*(Object*)>;
|
||||
static const std::unordered_map<std::string, GetterFn> table = {
|
||||
{"SpriteComponent", [](Object* o) { return o->GetComponent<SpriteComponent>().get(); }},
|
||||
{"CameraComponent", [](Object* o) { return o->GetComponent<CameraComponent>().get(); }},
|
||||
{"LightComponent", [](Object* o) { return o->GetComponent<LightComponent>().get(); }},
|
||||
{"TilemapComponent", [](Object* o) { return o->GetComponent<TilemapComponent>().get(); }},
|
||||
{"TextComponent", [](Object* o) { return o->GetComponent<TextComponent>().get(); }},
|
||||
{"ScriptComponent", [](Object* o) { return o->GetComponent<ScriptComponent>().get(); }},
|
||||
{"AnimationComponent", [](Object* o) { return o->GetComponent<AnimationComponent>().get(); }},
|
||||
{"AudioPlayerComponent", [](Object* o) { return o->GetComponent<AudioPlayerComponent>().get(); }},
|
||||
};
|
||||
|
||||
auto it = table.find(type);
|
||||
if (it != table.end())
|
||||
return it->second(obj);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int Lua_GetMousePos(lua_State *L)
|
||||
{
|
||||
PROFILE_DEEP_SCOPE("Engine::GetMousePos");
|
||||
@ -226,12 +228,67 @@ static int Lua_Object_GetComponent(lua_State *L)
|
||||
lua_pushnil(L);
|
||||
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);
|
||||
lua_pushlightuserdata(L, comp ? comp : nullptr);
|
||||
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)
|
||||
{
|
||||
PROFILE_DEEP_SCOPE("Object::GetPosition");
|
||||
@ -305,12 +362,6 @@ static int Lua_GetObjectByTag(lua_State *L)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static LightComponent *CheckLight(lua_State *L)
|
||||
{
|
||||
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);
|
||||
glm::vec3 c = light->GetColor();
|
||||
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);
|
||||
lua_setmetatable(L, -2);
|
||||
return 1;
|
||||
@ -329,13 +382,12 @@ static int Lua_Light_GetColor(lua_State *L)
|
||||
|
||||
static int Lua_Light_SetColor(lua_State *L)
|
||||
{
|
||||
auto* light = CheckLight(L);
|
||||
auto *light = CheckLight(L);
|
||||
core::types::Vec3 color = GetLuaVector3(L, 2);
|
||||
light->SetColor(color);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int Lua_Light_GetIntensity(lua_State *L)
|
||||
{
|
||||
lua_pushnumber(L, CheckLight(L)->GetIntensity());
|
||||
@ -392,26 +444,16 @@ static int Lua_Light_Index(lua_State *L)
|
||||
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_Light_SetColor); lua_setfield(L, -2, "SetColor");
|
||||
lua_pushcfunction(L, Lua_Sound_Play); lua_setfield(L, -2, "Play");
|
||||
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_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_pushcfunction(L, Lua_Sound_Index);
|
||||
lua_setfield(L, -2, "__index");
|
||||
|
||||
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 ---
|
||||
static AnimationComponent *CheckAnimationComponent(lua_State *L, int idx)
|
||||
@ -665,26 +740,26 @@ static int Lua_KeyDown(lua_State *L)
|
||||
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))
|
||||
{
|
||||
auto* vec = static_cast<LuaVector3*>(lua_touserdata(L, index));
|
||||
auto *vec = static_cast<LuaVector3 *>(lua_touserdata(L, index));
|
||||
return core::types::Vec3(vec->x, vec->y, vec->z);
|
||||
}
|
||||
else if (lua_istable(L, index))
|
||||
{
|
||||
core::types::Vec3 result;
|
||||
|
||||
static const char* keys1[3] = { "x", "y", "z" };
|
||||
static const char* keys2[3] = { "r", "g", "b" };
|
||||
static const char *keys1[3] = {"x", "y", "z"};
|
||||
static const char *keys2[3] = {"r", "g", "b"};
|
||||
|
||||
const char** keys = keys1;
|
||||
const char **keys = keys1;
|
||||
|
||||
lua_pushstring(L, "x");
|
||||
lua_rawget(L, index);
|
||||
if (lua_isnil(L, -1)) {
|
||||
if (lua_isnil(L, -1))
|
||||
{
|
||||
keys = keys2;
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static int Lua_Vector3_New(lua_State *L)
|
||||
{
|
||||
PROFILE_DEEP_SCOPE("Vector3()");
|
||||
@ -901,6 +973,7 @@ void ScriptComponent::ReloadScript()
|
||||
RegisterAnimationType(L);
|
||||
RegisterEngineBindings();
|
||||
RegisterLightType(L);
|
||||
RegisterSoundType(L);
|
||||
|
||||
keycode_loader(L);
|
||||
|
||||
|
@ -1791,7 +1791,6 @@ void Engine::Shutdown()
|
||||
AudioEngine::Shutdown();
|
||||
|
||||
|
||||
AssetManager::ClearAllAssets();
|
||||
|
||||
|
||||
|
||||
@ -1801,5 +1800,8 @@ void Engine::Shutdown()
|
||||
glfwDestroyWindow(window);
|
||||
glfwTerminate();
|
||||
|
||||
AssetManager::ClearAllAssets();
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
80
src/src/core/functions/ScenePacker.cpp
Normal file
80
src/src/core/functions/ScenePacker.cpp
Normal 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));
|
||||
}
|
23
src/src/core/functions/ScenePacker.h
Normal file
23
src/src/core/functions/ScenePacker.h
Normal 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);
|
||||
};
|
@ -398,11 +398,13 @@ void AssetManager::UnloadAsset(uint64_t uaid)
|
||||
|
||||
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);
|
||||
|
||||
s_Assets.clear();
|
||||
s_PathToUAID.clear();
|
||||
}
|
||||
|
||||
void AssetManager::Save(YAML::Emitter &out)
|
||||
@ -558,8 +560,6 @@ void PrefabAssetInfo::Load(const YAML::Node &node)
|
||||
ReloadFromYAML();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void PrefabAssetInfo::ReloadFromYAML()
|
||||
{
|
||||
if (!prefabYAML || !prefabYAML.IsMap())
|
||||
|
Loading…
Reference in New Issue
Block a user