Added Lua Bindings for Animations

This commit is contained in:
OusmBlueNinja 2025-04-23 11:42:08 -05:00
parent 3dd28fe3a6
commit 9ddfa06bd9
11 changed files with 446 additions and 233 deletions

View File

@ -10,24 +10,24 @@ Collapsed=1
[Window][WindowOverViewport_11111111] [Window][WindowOverViewport_11111111]
Pos=0,19 Pos=0,19
Size=1920,1158 Size=1280,701
Collapsed=0 Collapsed=0
[Window][Inspector] [Window][Inspector]
Pos=1578,19 Pos=938,19
Size=342,1158 Size=342,701
Collapsed=0 Collapsed=0
DockId=0x00000006,0 DockId=0x00000006,0
[Window][Scene Tree] [Window][Scene Tree]
Pos=0,19 Pos=0,19
Size=342,575 Size=342,348
Collapsed=0 Collapsed=0
DockId=0x00000003,0 DockId=0x00000003,0
[Window][Viewport] [Window][Viewport]
Pos=344,19 Pos=344,19
Size=1232,847 Size=592,390
Collapsed=0 Collapsed=0
DockId=0x00000007,0 DockId=0x00000007,0
@ -36,14 +36,14 @@ Size=1920,19
Collapsed=0 Collapsed=0
[Window][Performance Info] [Window][Performance Info]
Pos=0,19 Pos=344,411
Size=342,575 Size=592,309
Collapsed=0 Collapsed=0
DockId=0x00000003,1 DockId=0x00000008,3
[Window][Console] [Window][Console]
Pos=344,868 Pos=344,411
Size=1232,309 Size=592,309
Collapsed=0 Collapsed=0
DockId=0x00000008,0 DockId=0x00000008,0
@ -54,10 +54,10 @@ Collapsed=0
DockId=0x00000007,1 DockId=0x00000007,1
[Window][Profiler] [Window][Profiler]
Pos=344,868 Pos=344,411
Size=1232,309 Size=592,309
Collapsed=0 Collapsed=0
DockId=0x00000008,1 DockId=0x00000008,2
[Window][Profiler Timeline] [Window][Profiler Timeline]
Pos=265,69 Pos=265,69
@ -78,25 +78,25 @@ Collapsed=0
DockId=0x00000008,1 DockId=0x00000008,1
[Window][Color Correction] [Window][Color Correction]
Pos=1588,867 Pos=344,411
Size=332,310 Size=592,309
Collapsed=0 Collapsed=0
DockId=0x00000008,1 DockId=0x00000008,1
[Window][Asset Browser] [Window][Asset Browser]
Pos=0,596 Pos=0,369
Size=342,581 Size=342,351
Collapsed=0 Collapsed=0
DockId=0x00000004,0 DockId=0x00000004,0
[Docking][Data] [Docking][Data]
DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1920,1158 Split=X DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1280,701 Split=X
DockNode ID=0x00000005 Parent=0x11111111 SizeRef=1576,1158 Split=X DockNode ID=0x00000005 Parent=0x11111111 SizeRef=1576,1158 Split=X
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=342,701 Split=Y Selected=0x12EF0F59 DockNode ID=0x00000001 Parent=0x00000005 SizeRef=342,701 Split=Y Selected=0x12EF0F59
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,575 Selected=0x12EF0F59 DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,575 HiddenTabBar=1 Selected=0x12EF0F59
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=342,581 HiddenTabBar=1 Selected=0x36AF052B DockNode ID=0x00000004 Parent=0x00000001 SizeRef=342,581 HiddenTabBar=1 Selected=0x36AF052B
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1576,701 Split=Y Selected=0xC450F867 DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1576,701 Split=Y Selected=0xC450F867
DockNode ID=0x00000007 Parent=0x00000002 SizeRef=606,847 CentralNode=1 HiddenTabBar=1 Selected=0xC450F867 DockNode ID=0x00000007 Parent=0x00000002 SizeRef=606,847 CentralNode=1 HiddenTabBar=1 Selected=0xC450F867
DockNode ID=0x00000008 Parent=0x00000002 SizeRef=606,309 Selected=0x9B5D3198 DockNode ID=0x00000008 Parent=0x00000002 SizeRef=606,309 Selected=0x9B5D3198
DockNode ID=0x00000006 Parent=0x11111111 SizeRef=342,1158 Selected=0x36DC96AB DockNode ID=0x00000006 Parent=0x11111111 SizeRef=342,1158 HiddenTabBar=1 Selected=0x36DC96AB

View File

@ -1,5 +1,2 @@
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\Components\AnimationComponent.cpp -o src\build\Components\AnimationComponent.o
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\editor\windows\Inspector.cpp -o src\build\editor\windows\Inspector.o
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.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\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\Logging.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\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 -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto [LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.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\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\Logging.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\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 -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto
[ERROR] Runtime crash [RUN] Executed app.exe successfully.
Command 'src\build\app.exe' returned non-zero exit status 3221225477.

View File

@ -0,0 +1,25 @@
-- EffectAnimation.lua
-- cache references
local effectObj = nil
local anim = nil
function OnInit()
effectObj = Engine.GetObjectByTag("Effect")
if effectObj then
anim = effectObj:GetComponent("AnimationComponent")
if anim then
anim:Play()
end
end
end
function OnUpdate(dt)
if anim and Engine.KeyDown(Keycode.Space) then
anim:SetStartFrame(36)
anim:SetEndFrame(54)
anim:SetFrame(36)
end
end

View File

@ -253,39 +253,9 @@ color_correction:
intensity: 0.200000003 intensity: 0.200000003
threshold: 1.75999999 threshold: 1.75999999
Assets: Assets:
- uaid: 1 - uaid: 8
path: C:\Users\spenc\OneDrive\Pictures\textures\bark_willow_02_diff_1k.png path: C:\Users\spenc\OneDrive\Pictures\textures\metal_plate_nor_gl_1k.png
filename: bark_willow_02_diff_1k.png filename: metal_plate_nor_gl_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 2
path: C:\Users\spenc\OneDrive\Pictures\textures\bark_willow_02_nor_gl_1k.png
filename: bark_willow_02_nor_gl_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 3
path: C:\Users\spenc\OneDrive\Pictures\textures\wood_floor_worn_diff_1k.png
filename: wood_floor_worn_diff_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 4
path: C:\Users\spenc\OneDrive\Pictures\textures\wood_floor_worn_nor_gl_1k.png
filename: wood_floor_worn_nor_gl_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 5
path: C:\Users\spenc\OneDrive\Pictures\textures\ganges_river_pebbles_nor_gl_1k.png
filename: ganges_river_pebbles_nor_gl_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 6
path: C:\Users\spenc\OneDrive\Pictures\textures\ganges_river_pebbles_diff_1k.png
filename: ganges_river_pebbles_diff_1k.png
filetype: png filetype: png
type: 0 type: 0
size: [1024, 1024] size: [1024, 1024]
@ -295,9 +265,39 @@ Assets:
filetype: png filetype: png
type: 0 type: 0
size: [1024, 1024] size: [1024, 1024]
- uaid: 8 - uaid: 6
path: C:\Users\spenc\OneDrive\Pictures\textures\metal_plate_nor_gl_1k.png path: C:\Users\spenc\OneDrive\Pictures\textures\ganges_river_pebbles_diff_1k.png
filename: metal_plate_nor_gl_1k.png filename: ganges_river_pebbles_diff_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 5
path: C:\Users\spenc\OneDrive\Pictures\textures\ganges_river_pebbles_nor_gl_1k.png
filename: ganges_river_pebbles_nor_gl_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 4
path: C:\Users\spenc\OneDrive\Pictures\textures\wood_floor_worn_nor_gl_1k.png
filename: wood_floor_worn_nor_gl_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 3
path: C:\Users\spenc\OneDrive\Pictures\textures\wood_floor_worn_diff_1k.png
filename: wood_floor_worn_diff_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 2
path: C:\Users\spenc\OneDrive\Pictures\textures\bark_willow_02_nor_gl_1k.png
filename: bark_willow_02_nor_gl_1k.png
filetype: png
type: 0
size: [1024, 1024]
- uaid: 1
path: C:\Users\spenc\OneDrive\Pictures\textures\bark_willow_02_diff_1k.png
filename: bark_willow_02_diff_1k.png
filetype: png filetype: png
type: 0 type: 0
size: [1024, 1024] size: [1024, 1024]

View File

@ -49,6 +49,17 @@ void AnimationComponent::SetTextureAtlas(uint64_t uaid, int texelWidth, int texe
startFrame = 0; startFrame = 0;
endFrame = totalFrames > 0 ? totalFrames - 1 : 0; endFrame = totalFrames > 0 ? totalFrames - 1 : 0;
if (start != 0)
{
startFrame = start;
}
if (end != 0)
{
endFrame = end;
}
frameDuration = duration; frameDuration = duration;
currentFrame = startFrame; currentFrame = startFrame;
@ -57,9 +68,37 @@ void AnimationComponent::SetTextureAtlas(uint64_t uaid, int texelWidth, int texe
void AnimationComponent::Play() { playing = true; } void AnimationComponent::Play() { playing = true; }
void AnimationComponent::Stop() { playing = false; } void AnimationComponent::Stop() { playing = false; }
void AnimationComponent::SetLooping(bool l) { loop = l; } void AnimationComponent::SetLooping(bool loop_) { loop = loop_; }
void AnimationComponent::SetSpeed(float s) { speed = s; }
void AnimationComponent::SetFrame(int f) { currentFrame = std::clamp(f, startFrame, endFrame); } bool AnimationComponent::IsPlaying() const { return playing; }
void AnimationComponent::SetPlaying(bool play) { playing = play; }
uint64_t AnimationComponent::GetTextureUAID() const { return textureUAID; }
void AnimationComponent::SetTextureUAID(uint64_t uaid) { textureUAID = uaid; }
bool AnimationComponent::IsLooping() const { return loop; }
void AnimationComponent::SetSpeed(float speed_) { speed = speed_; }
float AnimationComponent::GetSpeed() const { return speed; }
void AnimationComponent::SetFrame(int frame)
{
currentFrame = std::clamp(frame, startFrame, endFrame);
time = 0.0f;
}
int AnimationComponent::GetCurrentFrame() const { return currentFrame; }
int AnimationComponent::GetStartFrame() const { return startFrame; }
void AnimationComponent::SetStartFrame(int start) { startFrame = std::clamp(start, 0, totalFrames - 1); }
int AnimationComponent::GetEndFrame() const { return endFrame; }
void AnimationComponent::SetEndFrame(int end) { endFrame = std::clamp(end, 0, totalFrames - 1); }
int AnimationComponent::GetTotalFrames() const { return totalFrames; }
float AnimationComponent::GetFrameDuration() const { return frameDuration; }
void AnimationComponent::SetFrameDuration(float duration) { frameDuration = duration; }
TextureAtlas* AnimationComponent::GetAtlas() { return &atlas; }
const TextureAtlas* AnimationComponent::GetAtlas() const { return &atlas; }
void AnimationComponent::Update(float dt) void AnimationComponent::Update(float dt)
{ {

View File

@ -9,41 +9,65 @@
#include "../core/utils/AssetManager.h" #include "../core/utils/AssetManager.h"
#include "../core/utils/Logging.h" #include "../core/utils/Logging.h"
class AnimationComponent : public Component class AnimationComponent : public Component
{ {
public: public:
AnimationComponent(Object *owner); AnimationComponent(Object *owner);
void SetTextureAtlasPath(const std::string &path, int texelWidth, int texelHeight, float frameDuration, int startFrame = 0, int endFrame = INT_MAX); // Initialize with texture atlas path or UAID
void SetTextureAtlas(uint64_t uaid, int texelWidth, int texelHeight, float frameDuration, int startFrame = 0, int endFrame = INT_MAX); void SetTextureAtlasPath(const std::string &path,
int texelWidth,
int texelHeight,
float frameDuration,
int startFrame = 0,
int endFrame = INT_MAX);
void SetTextureAtlas(uint64_t uaid,
int texelWidth,
int texelHeight,
float frameDuration,
int startFrame = 0,
int endFrame = INT_MAX);
// Playback controls
void Play(); void Play();
void Stop(); void Stop();
void SetLooping(bool loop); void SetLooping(bool loop);
bool IsLooping() const;
void SetSpeed(float speed); void SetSpeed(float speed);
float GetSpeed() const;
void SetPlaying(bool play);
bool IsPlaying() const;
// Frame controls
void SetFrame(int frame); void SetFrame(int frame);
int GetCurrentFrame() const;
int GetStartFrame() const;
void SetStartFrame(int start);
int GetEndFrame() const;
void SetEndFrame(int end);
int GetTotalFrames() const;
bool IsPlaying() const { return playing; } // Texture UAID
bool IsLooping() const { return loop; } uint64_t GetTextureUAID() const;
float GetSpeed() const { return speed; } void SetTextureUAID(uint64_t uaid);
TextureAtlas *GetAtlas() { return &atlas; } // Timing
const TextureAtlas *GetAtlas() const { return &atlas; } float GetFrameDuration() const;
void SetFrameDuration(float duration);
int GetCurrentFrame() const { return currentFrame; } // Access atlas
TextureAtlas* GetAtlas();
uint64_t GetTextureUAID() const { return textureUAID; } const TextureAtlas* GetAtlas() const;
float GetFrameDuration() const { return frameDuration; }
// Update per tick
void Update(float dt); void Update(float dt);
// Component overrides
std::string GetName() const override; std::string GetName() const override;
void Save(YAML::Emitter &out) const override; void Save(YAML::Emitter &out) const override;
void Load(const YAML::Node &node) override; void Load(const YAML::Node &node) override;
RenderType renderType; RenderType renderType;
private: private:
@ -60,6 +84,7 @@ private:
float frameDuration = 0.1f; float frameDuration = 0.1f;
float time = 0.0f; float time = 0.0f;
int currentFrame = 0; int currentFrame = 0;
bool playing = true; bool playing = true;
bool loop = true; bool loop = true;
float speed = 1.0f; float speed = 1.0f;

View File

@ -9,6 +9,7 @@
#include "../Components/LightComponent.h" #include "../Components/LightComponent.h"
#include "../Components/TextComponent.h" #include "../Components/TextComponent.h"
#include "../Components/TilemapComponent.h" #include "../Components/TilemapComponent.h"
#include "../Components/AnimationComponent.h"
#include "../core/utils/Profiler.h" #include "../core/utils/Profiler.h"
#include "../core/utils/utils.h" #include "../core/utils/utils.h"
@ -17,8 +18,6 @@
#include "../core/types/vec2.h" #include "../core/types/vec2.h"
#include <lua.hpp> #include <lua.hpp>
#include <memory> #include <memory>
#include <cstring> #include <cstring>
@ -26,13 +25,10 @@
static bool luaDebugEnabled = false; static bool luaDebugEnabled = false;
static bool old_state = false; static bool old_state = false;
#define SET_KC(name) \ #define SET_KC(name) \
lua_pushinteger(L, static_cast<int>(Keycode::name)); \ lua_pushinteger(L, static_cast<int>(Keycode::name)); \
lua_setfield(L, -2, #name); lua_setfield(L, -2, #name);
struct LuaObjectWrapper struct LuaObjectWrapper
{ {
Object *obj; Object *obj;
@ -45,6 +41,13 @@ struct LuaVector2
}; };
#define LUA_VECTOR2_MT "LuaVector2Meta" #define LUA_VECTOR2_MT "LuaVector2Meta"
#define LUA_ANIMATION_MT "LuaAnimationMeta"
struct LuaAnimationWrapper
{
AnimationComponent *comp;
};
ScriptComponent::ScriptComponent(Object *owner) : Component(owner), L(nullptr) {} ScriptComponent::ScriptComponent(Object *owner) : Component(owner), L(nullptr) {}
ScriptComponent::~ScriptComponent() ScriptComponent::~ScriptComponent()
{ {
@ -145,16 +148,19 @@ static Component *GetComponentByName(Object *obj, const std::string &type)
return obj->GetComponent<TextComponent>().get(); return obj->GetComponent<TextComponent>().get();
if (type == "ScriptComponent") if (type == "ScriptComponent")
return obj->GetComponent<ScriptComponent>().get(); return obj->GetComponent<ScriptComponent>().get();
if (type == "AnimationComponent")
return obj->GetComponent<AnimationComponent>().get();
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");
core::types::Vec2 m = Input::GetMousePosition(); core::types::Vec2 m = Input::GetMousePosition();
LuaVector2* vec = (LuaVector2*)lua_newuserdata(L, sizeof(LuaVector2)); LuaVector2 *vec = (LuaVector2 *)lua_newuserdata(L, sizeof(LuaVector2));
vec->x = m.x; vec->x = m.x;
vec->y = m.y; vec->y = m.y;
@ -169,6 +175,21 @@ static int Lua_Object_GetComponent(lua_State *L)
PROFILE_DEEP_SCOPE("Object::GetComponent"); PROFILE_DEEP_SCOPE("Object::GetComponent");
auto *wrapper = (LuaObjectWrapper *)luaL_checkudata(L, 1, LUA_OBJECT_MT); auto *wrapper = (LuaObjectWrapper *)luaL_checkudata(L, 1, LUA_OBJECT_MT);
const char *type = luaL_checkstring(L, 2); const char *type = luaL_checkstring(L, 2);
if (strcmp(type, "AnimationComponent") == 0)
{
auto compPtr = wrapper->obj->GetComponent<AnimationComponent>();
if (compPtr)
{
LuaAnimationWrapper *aw = (LuaAnimationWrapper *)lua_newuserdata(L, sizeof(LuaAnimationWrapper));
aw->comp = compPtr.get();
luaL_getmetatable(L, LUA_ANIMATION_MT);
lua_setmetatable(L, -2);
return 1;
}
lua_pushnil(L);
return 1;
}
// fallback for other components
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;
@ -247,9 +268,95 @@ static int Lua_GetObjectByTag(lua_State *L)
return 1; return 1;
} }
// --- AnimationComponent Lua bindings ---
static AnimationComponent *CheckAnimationComponent(lua_State *L, int idx)
{
void *ptr = lua_touserdata(L, idx);
return static_cast<AnimationComponent *>(ptr);
}
static int Lua_Animation_GetCurrentFrame(lua_State *L)
{
PROFILE_DEEP_SCOPE("Animation::GetCurrentFrame");
AnimationComponent *anim = CheckAnimationComponent(L, 1);
lua_pushinteger(L, anim ? anim->GetCurrentFrame() : -1);
return 1;
}
static int Lua_Animation_SetCurrentFrame(lua_State *L)
{
PROFILE_DEEP_SCOPE("Animation::SetCurrentFrame");
AnimationComponent *anim = CheckAnimationComponent(L, 1);
int frame = luaL_checkinteger(L, 2);
if (anim)
anim->SetFrame(frame);
return 0;
}
static int Lua_Animation_IsPlaying(lua_State *L)
{
PROFILE_DEEP_SCOPE("Animation::IsPlaying");
AnimationComponent *anim = CheckAnimationComponent(L, 1);
lua_pushboolean(L, anim ? anim->IsPlaying() : false);
return 1;
}
static int Lua_Animation_SetPlaying(lua_State *L)
{
PROFILE_DEEP_SCOPE("Animation::SetPlaying");
AnimationComponent *anim = CheckAnimationComponent(L, 1);
bool play = lua_toboolean(L, 2);
if (anim)
anim->SetPlaying(play);
return 0;
}
static int Lua_Animation_GetStartFrame(lua_State *L)
{
PROFILE_DEEP_SCOPE("Animation::GetStartFrame");
AnimationComponent *anim = CheckAnimationComponent(L, 1);
lua_pushinteger(L, anim ? anim->GetStartFrame() : 0);
return 1;
}
static int Lua_Animation_SetStartFrame(lua_State *L)
{
PROFILE_DEEP_SCOPE("Animation::SetStartFrame");
AnimationComponent *anim = CheckAnimationComponent(L, 1);
int start = luaL_checkinteger(L, 2);
if (anim)
anim->SetStartFrame(start);
return 0;
}
static int Lua_Animation_GetEndFrame(lua_State *L)
{
PROFILE_DEEP_SCOPE("Animation::GetEndFrame");
AnimationComponent *anim = CheckAnimationComponent(L, 1);
lua_pushinteger(L, anim ? anim->GetEndFrame() : 0);
return 1;
}
static int Lua_Animation_SetEndFrame(lua_State *L)
{
PROFILE_DEEP_SCOPE("Animation::SetEndFrame");
AnimationComponent *anim = CheckAnimationComponent(L, 1);
int end = luaL_checkinteger(L, 2);
if (anim)
anim->SetEndFrame(end);
return 0;
}
static int Lua_Animation_Index(lua_State *L)
{
// stack: [1]=userdata, [2]=key
luaL_getmetatable(L, LUA_ANIMATION_MT);
lua_pushvalue(L, 2);
lua_rawget(L, -2);
return 1;
}
static int keycode_loader(lua_State *L) static int keycode_loader(lua_State *L)
{ {
@ -383,20 +490,13 @@ static int keycode_loader(lua_State *L)
SET_KC(RightSuper) SET_KC(RightSuper)
SET_KC(Menu) SET_KC(Menu)
#undef SET_KC #undef SET_KC
lua_setglobal(L, "Keycode"); lua_setglobal(L, "Keycode");
return 1; return 1;
} }
static int Lua_KeyDown(lua_State *L) static int Lua_KeyDown(lua_State *L)
{ {
// match your other deepprofile scopes // match your other deepprofile scopes
@ -413,7 +513,6 @@ static int Lua_KeyDown(lua_State *L)
return 1; return 1;
} }
static int Lua_Vector2_New(lua_State *L) static int Lua_Vector2_New(lua_State *L)
{ {
PROFILE_DEEP_SCOPE("Vector2()"); PROFILE_DEEP_SCOPE("Vector2()");
@ -482,6 +581,35 @@ void RegisterVector2Type(lua_State *L)
lua_setglobal(L, "Vector2"); lua_setglobal(L, "Vector2");
} }
// Register the AnimationComponent metatable
void RegisterAnimationType(lua_State *L)
{
PROFILE_DEEP_SCOPE("RegisterAnimationType");
luaL_newmetatable(L, LUA_ANIMATION_MT);
// methods
lua_pushcfunction(L, Lua_Animation_GetCurrentFrame);
lua_setfield(L, -2, "GetCurrentFrame");
lua_pushcfunction(L, Lua_Animation_SetCurrentFrame);
lua_setfield(L, -2, "SetCurrentFrame");
lua_pushcfunction(L, Lua_Animation_IsPlaying);
lua_setfield(L, -2, "IsPlaying");
lua_pushcfunction(L, Lua_Animation_SetPlaying);
lua_setfield(L, -2, "SetPlaying");
lua_pushcfunction(L, Lua_Animation_GetStartFrame);
lua_setfield(L, -2, "GetStartFrame");
lua_pushcfunction(L, Lua_Animation_SetStartFrame);
lua_setfield(L, -2, "SetStartFrame");
lua_pushcfunction(L, Lua_Animation_GetEndFrame);
lua_setfield(L, -2, "GetEndFrame");
lua_pushcfunction(L, Lua_Animation_SetEndFrame);
lua_setfield(L, -2, "SetEndFrame");
// __index
lua_pushcfunction(L, Lua_Animation_Index);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
}
void ScriptComponent::RegisterEngineBindings() void ScriptComponent::RegisterEngineBindings()
{ {
PROFILE_DEEP_SCOPE("RegisterEngineBindings"); PROFILE_DEEP_SCOPE("RegisterEngineBindings");
@ -500,12 +628,12 @@ void ScriptComponent::RegisterEngineBindings()
lua_pushcfunction(L, Lua_KeyDown); lua_pushcfunction(L, Lua_KeyDown);
lua_setfield(L, -2, "KeyDown"); lua_setfield(L, -2, "KeyDown");
lua_pushcfunction(L, Lua_GetMousePos); lua_pushcfunction(L, Lua_GetMousePos);
lua_setfield(L, -2, "GetMousePos"); lua_setfield(L, -2, "GetMousePos");
lua_setglobal(L, "Engine"); lua_setglobal(L, "Engine");
} }
void ScriptComponent::ReloadScript() void ScriptComponent::ReloadScript()
@ -523,9 +651,10 @@ void ScriptComponent::ReloadScript()
RegisterObjectType(L); RegisterObjectType(L);
RegisterVector2Type(L); RegisterVector2Type(L);
RegisterAnimationType(L);
RegisterEngineBindings(); RegisterEngineBindings();
keycode_loader(L);
keycode_loader(L);
Logger::LogVerbose("[Lua] Loading Script from file."); Logger::LogVerbose("[Lua] Loading Script from file.");
if (luaL_dofile(L, scriptPath.c_str())) if (luaL_dofile(L, scriptPath.c_str()))

View File

@ -1,10 +1,10 @@
#include "SpriteComponent.h" #include "SpriteComponent.h"
#include "../core/utils/AssetManager.h" #include "../core/utils/AssetManager.h"
#include "../core/utils/Logging.h" #include "../core/utils/Logging.h"
#include <GL/glew.h> #include <GL/glew.h>
SpriteComponent::SpriteComponent(Object *owner) : Component(owner) {} SpriteComponent::SpriteComponent(Object *owner) : Component(owner) {}
bool SpriteComponent::HasTexture() bool SpriteComponent::HasTexture()
@ -12,6 +12,8 @@ bool SpriteComponent::HasTexture()
return texture_loaded; return texture_loaded;
} }
void SpriteComponent::SetTexture(const std::string &path) void SpriteComponent::SetTexture(const std::string &path)
{ {
if (path.empty()) return; if (path.empty()) return;
@ -22,6 +24,8 @@ void SpriteComponent::SetTexture(const std::string &path)
SetTexture(asset->uaid); SetTexture(asset->uaid);
} }
void SpriteComponent::SetNormalMap(const std::string &path) void SpriteComponent::SetNormalMap(const std::string &path)
{ {
if (path.empty()) return; if (path.empty()) return;
@ -32,6 +36,8 @@ void SpriteComponent::SetNormalMap(const std::string &path)
SetNormalMap(asset->uaid); SetNormalMap(asset->uaid);
} }
void SpriteComponent::SetTexture(uint64_t uaid) void SpriteComponent::SetTexture(uint64_t uaid)
{ {
textureUAID = uaid; textureUAID = uaid;
@ -44,6 +50,8 @@ void SpriteComponent::SetTexture(uint64_t uaid)
} }
} }
void SpriteComponent::SetNormalMap(uint64_t uaid) void SpriteComponent::SetNormalMap(uint64_t uaid)
{ {
normalMapUAID = uaid; normalMapUAID = uaid;
@ -54,26 +62,36 @@ void SpriteComponent::SetNormalMap(uint64_t uaid)
} }
} }
unsigned int SpriteComponent::GetTextureID() const unsigned int SpriteComponent::GetTextureID() const
{ {
return textureID; return textureID;
} }
unsigned int SpriteComponent::GetNormalMapID() const unsigned int SpriteComponent::GetNormalMapID() const
{ {
return normalMapID; return normalMapID;
} }
uint64_t SpriteComponent::GetTextureUAID() const uint64_t SpriteComponent::GetTextureUAID() const
{ {
return textureUAID; return textureUAID;
} }
uint64_t SpriteComponent::GetNormalMapUAID() const uint64_t SpriteComponent::GetNormalMapUAID() const
{ {
return normalMapUAID; return normalMapUAID;
} }
void SpriteComponent::Save(YAML::Emitter &out) const void SpriteComponent::Save(YAML::Emitter &out) const
{ {
out << YAML::BeginMap; out << YAML::BeginMap;
@ -84,6 +102,8 @@ void SpriteComponent::Save(YAML::Emitter &out) const
out << YAML::EndMap; out << YAML::EndMap;
} }
void SpriteComponent::Load(const YAML::Node& node) void SpriteComponent::Load(const YAML::Node& node)
{ {
try { try {

View File

@ -1,85 +1,58 @@
// AssetManager.cpp
#include "AssetManager.h" #include "AssetManager.h"
#include "utils.h" #include "utils.h"
#include "../../Renderer.h" #include <GL/glew.h>
#define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h> #include <stb_image.h>
#include <future>
#include <string> // Static definitions
#include <random>
#include <mutex>
#include <functional> // for std::hash
std::unordered_map<uint64_t, AssetInfo> AssetManager::s_Assets; std::unordered_map<uint64_t, AssetInfo> AssetManager::s_Assets;
std::unordered_map<std::string, uint64_t> AssetManager::s_PathToUAID;
std::mutex AssetManager::s_Mutex; std::mutex AssetManager::s_Mutex;
uint64_t AssetManager::s_NextUAID = 1; uint64_t AssetManager::s_NextUAID = 1;
inline static std::unordered_map<std::string, uint64_t> s_PathToUAID;
inline std::string GetFileExtension(const std::string &path)
{
size_t dot = path.find_last_of('.');
if (dot == std::string::npos)
return "";
return path.substr(dot + 1);
}
inline GLuint CreateOpenGLTexture(unsigned char *data, int width, int height)
{
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D, 0);
return tex;
}
void AssetManager::Init() {} void AssetManager::Init() {}
uint64_t AssetManager::GenerateUAID() uint64_t AssetManager::GenerateUAID()
{ {
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
return s_NextUAID++;
static std::random_device rd;
static std::mt19937 gen(rd());
static std::uniform_int_distribution<int> dist(0, 9);
std::string digits;
digits.reserve(32);
for (int i = 0; i < 32; ++i)
digits += static_cast<char>('0' + dist(gen));
return std::hash<std::string>{}(digits);
} }
void AssetManager::LoadAssetAsync(const std::string &path, AssetType type) void AssetManager::LoadAssetAsync(const std::string &path, AssetType type)
{ {
uint64_t uaid = GenerateUAID(); {
std::lock_guard<std::mutex> lock(s_Mutex);
auto itPath = s_PathToUAID.find(path);
if (itPath != s_PathToUAID.end() && s_Assets[itPath->second].loaded)
{
Logger::LogVerbose("[AssetManager] Skipping already-loaded image: %s (UAID: %llu)", path.c_str(), itPath->second);
return;
}
}
uint64_t uaid = GenerateUAID();
{
AssetInfo info; AssetInfo info;
info.uaid = uaid; info.uaid = uaid;
info.path = path; info.path = path;
info.filename = GetFilenameFromPath(path); info.filename = GetFilenameFromPath(path);
info.filetype = GetFileExtension(path); info.filetype = ::GetFileExtension(path);
info.type = type; info.type = type;
{
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
s_Assets[uaid] = info; s_Assets[uaid] = info;
s_PathToUAID[path] = uaid;
} }
if (type == AssetType::Image) if (type == AssetType::Image)
{ {
Logger::LogVerbose("[AssetManager] Loading image: %s (UAID: %llu)", path.c_str(), uaid); Logger::LogVerbose("[AssetManager] Scheduling load: %s (UAID: %llu)", path.c_str(), uaid);
LoadImageInternal(path, uaid); AssetManager::LoadImageInternal(path, uaid);
} }
else else
{ {
Logger::LogWarning("Unknown Asset Type: '%d'", type); Logger::LogWarning("[AssetManager] Unknown Asset Type: '%d'", static_cast<int>(type));
} }
} }
@ -87,22 +60,16 @@ void AssetManager::LoadImageInternal(const std::string &path, uint64_t uaid)
{ {
{ {
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
auto it = s_PathToUAID.find(path); auto it = s_Assets.find(uaid);
if (it != s_PathToUAID.end()) if (it != s_Assets.end() && it->second.loaded)
{ return;
const auto &asset = s_Assets[it->second]; auto itPath = s_PathToUAID.find(path);
if (asset.loaded) if (itPath != s_PathToUAID.end() && s_Assets[itPath->second].loaded)
{
Logger::LogVerbose("[AssetManager] Skipping already loaded asset: %s (UAID: %llu)", path.c_str(), asset.uaid);
return; return;
}
}
} }
Logger::LogVerbose("[AssetManager] Begin loading image: %s (UAID: %llu)", path.c_str(), uaid); Logger::LogVerbose("[AssetManager] Begin loading image: %s (UAID: %llu)", path.c_str(), uaid);
stbi_set_flip_vertically_on_load(false); stbi_set_flip_vertically_on_load(false);
int w, h, channels; int w, h, channels;
stbi_uc *pixels = stbi_load(path.c_str(), &w, &h, &channels, STBI_rgb_alpha); stbi_uc *pixels = stbi_load(path.c_str(), &w, &h, &channels, STBI_rgb_alpha);
if (!pixels) if (!pixels)
@ -111,50 +78,50 @@ void AssetManager::LoadImageInternal(const std::string &path, uint64_t uaid)
return; return;
} }
GLuint texID = CreateOpenGLTexture(pixels, w, h); GLuint texID;
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
glBindTexture(GL_TEXTURE_2D, 0);
stbi_image_free(pixels); stbi_image_free(pixels);
if (texID == 0)
{
Logger::LogError("[AssetManager] Failed to Load asset.");
return;
}
{ {
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
auto &asset = s_Assets[uaid]; auto &asset = s_Assets[uaid];
asset.path = path; asset.size = {static_cast<float>(w), static_cast<float>(h)};
asset.filename = GetFilenameFromPath(path);
asset.filetype = GetFileExtension(path);
asset.size = {(float)w, (float)h};
asset.textureID = texID; asset.textureID = texID;
asset.type = AssetType::Image;
asset.loaded = true; asset.loaded = true;
} }
{ Logger::LogVerbose("[AssetManager] Finished loading image: %s (%dx%d) (UAID: %llu, Texture ID: %u)", path.c_str(), w, h, uaid, texID);
std::lock_guard<std::mutex> lock(s_Mutex);
s_PathToUAID[path] = uaid;
}
Logger::LogVerbose("[AssetManager] Finished loading image: %s (%dx%d) (UAID: %llu, Texture ID: %u)",
path.c_str(), w, h, uaid, texID);
} }
const AssetInfo *AssetManager::GetAssetByID(uint64_t uaid) const AssetInfo *AssetManager::GetAssetByID(uint64_t uaid)
{ {
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
auto it = s_Assets.find(uaid); auto it = s_Assets.find(uaid);
return (it != s_Assets.end()) ? &it->second : nullptr; return it != s_Assets.end() ? &it->second : nullptr;
} }
const AssetInfo *AssetManager::GetAssetByPath(const std::string &path) const AssetInfo *AssetManager::GetAssetByPath(const std::string &path)
{ {
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
for (const auto &[id, asset] : s_Assets) auto it = s_PathToUAID.find(path);
if (asset.path == path) return it != s_PathToUAID.end() ? &s_Assets[it->second] : nullptr;
return &asset;
return nullptr;
} }
const std::unordered_map<uint64_t, AssetInfo> &AssetManager::GetAllAssets() const std::unordered_map<uint64_t, AssetInfo> &AssetManager::GetAllAssets()
{ {
return s_Assets; // Assume read-only external usage return s_Assets;
} }
void AssetManager::UnloadAsset(uint64_t uaid) void AssetManager::UnloadAsset(uint64_t uaid)
@ -165,43 +132,37 @@ void AssetManager::UnloadAsset(uint64_t uaid)
{ {
if (it->second.textureID) if (it->second.textureID)
glDeleteTextures(1, &it->second.textureID); glDeleteTextures(1, &it->second.textureID);
s_Assets.erase(it);
s_PathToUAID.erase(it->second.path); s_PathToUAID.erase(it->second.path);
s_Assets.erase(it);
} }
} }
void AssetManager::ClearAllAssets() void AssetManager::ClearAllAssets()
{ {
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
for (auto &[id, asset] : s_Assets) for (auto &kv : s_Assets)
{ if (kv.second.textureID)
if (asset.textureID) glDeleteTextures(1, &kv.second.textureID);
glDeleteTextures(1, &asset.textureID);
}
s_Assets.clear(); s_Assets.clear();
s_PathToUAID.clear(); s_PathToUAID.clear();
} }
void AssetManager::Save(YAML::Emitter &out) void AssetManager::Save(YAML::Emitter &out)
{ {
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
out << YAML::Key << "Assets"; out << YAML::Key << "Assets" << YAML::BeginSeq;
out << YAML::BeginSeq; for (const auto &kv : s_Assets)
for (const auto &[uaid, asset] : s_Assets)
{ {
out << YAML::BeginMap; const auto &a = kv.second;
out << YAML::Key << "uaid" << YAML::Value << asset.uaid; out << YAML::BeginMap
out << YAML::Key << "path" << YAML::Value << asset.path; << YAML::Key << "uaid" << YAML::Value << a.uaid
out << YAML::Key << "filename" << YAML::Value << asset.filename; << YAML::Key << "path" << YAML::Value << a.path
out << YAML::Key << "filetype" << YAML::Value << asset.filetype; << YAML::Key << "filename" << YAML::Value << a.filename
out << YAML::Key << "type" << YAML::Value << static_cast<int>(asset.type); << YAML::Key << "filetype" << YAML::Value << a.filetype
out << YAML::Key << "size" << YAML::Value << YAML::Flow << YAML::BeginSeq << asset.size.x << asset.size.y << YAML::EndSeq; << YAML::Key << "type" << YAML::Value << static_cast<int>(a.type)
out << YAML::EndMap; << YAML::Key << "size" << YAML::Value << YAML::Flow << YAML::BeginSeq << a.size.x << a.size.y << YAML::EndSeq
<< YAML::EndMap;
} }
out << YAML::EndSeq; out << YAML::EndSeq;
} }
@ -209,35 +170,43 @@ void AssetManager::Load(const YAML::Node &node)
{ {
if (!node) if (!node)
return; return;
for (const auto &item : node) for (const auto &item : node)
{ {
AssetInfo asset; uint64_t uaid = item["uaid"].as<uint64_t>();
asset.uaid = item["uaid"].as<uint64_t>(); std::string path = item["path"].as<std::string>();
asset.path = item["path"].as<std::string>(); AssetType type = static_cast<AssetType>(item["type"].as<int>());
asset.filename = item["filename"].as<std::string>(); float sx = item["size"][0].as<float>();
asset.filetype = item["filetype"].as<std::string>(); float sy = item["size"][1].as<float>();
asset.type = static_cast<AssetType>(item["type"].as<int>());
const auto &size = item["size"];
asset.size = {size[0].as<float>(), size[1].as<float>()};
asset.loaded = false;
bool already = false;
{ {
std::lock_guard<std::mutex> lock(s_Mutex); std::lock_guard<std::mutex> lock(s_Mutex);
s_Assets[asset.uaid] = asset; auto it = s_Assets.find(uaid);
if (asset.uaid >= s_NextUAID) if (it != s_Assets.end() && it->second.loaded)
s_NextUAID = asset.uaid + 1;
}
if (asset.type == AssetType::Image)
{ {
Logger::LogVerbose("[AssetManager] Reloading from file: %s (UAID: %llu)", asset.path.c_str(), asset.uaid); already = true;
LoadImageInternal(asset.path, asset.uaid);
} }
else else
{ {
Logger::LogWarning("Unknown Asset Type: '%d'", asset.type); AssetInfo asset;
asset.uaid = uaid;
asset.path = path;
asset.filename = GetFilenameFromPath(path);
asset.filetype = ::GetFileExtension(path);
asset.type = type;
asset.size = {sx, sy};
asset.loaded = false;
asset.textureID = 0;
s_Assets[uaid] = asset;
s_PathToUAID[path] = uaid;
if (uaid >= s_NextUAID)
s_NextUAID = uaid + 1;
}
}
if (!already && type == AssetType::Image)
{
Logger::LogVerbose("[AssetManager] Reloading from file: %s (UAID: %llu)", path.c_str(), uaid);
LoadImageInternal(path, uaid);
} }
} }
} }

View File

@ -42,6 +42,7 @@ public:
private: private:
static std::unordered_map<uint64_t, AssetInfo> s_Assets; static std::unordered_map<uint64_t, AssetInfo> s_Assets;
static std::unordered_map<std::string, uint64_t> s_PathToUAID;
static std::mutex s_Mutex; static std::mutex s_Mutex;
static uint64_t s_NextUAID; static uint64_t s_NextUAID;

View File

@ -59,3 +59,11 @@ inline glm::vec3 HSVtoRGB(float h, float s, float v)
return glm::vec3(r, g, b); return glm::vec3(r, g, b);
} }
inline std::string GetFileExtension(const std::string &path)
{
size_t dot = path.find_last_of('.');
if (dot == std::string::npos)
return "";
return path.substr(dot + 1);
}