From 85376b7304a69ce2ed30ffbd37e82a4f7ac32d32 Mon Sep 17 00:00:00 2001 From: Megumumpkin Date: Sat, 13 Aug 2022 07:13:19 +0700 Subject: [PATCH] Lua Async Done! --- CMakeLists.txt | 19 +------------------ Source/BindLua.cpp | 31 +++++++++++++++++-------------- Source/BindLua.h | 4 ++-- Source/Resources_BindLua.cpp | 28 +++++++++++++++------------- 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ae7199..89cbcb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,21 +106,4 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WickedEngine_DIR}/../../WickedEngine/shaders/*" "${CMAKE_CURRENT_BINARY_DIR}/Data/Shader/" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WickedEngine_DIR}/../../WickedEngine/shaders/ffx-fsr/*" "${CMAKE_CURRENT_BINARY_DIR}/Data/Shader/ffx-fsr" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WickedEngine_DIR}/../../WickedEngine/shaders/ffx-shadows-dnsr/*" "${CMAKE_CURRENT_BINARY_DIR}/Data/Shader/ffx-shadows-dnsr" -) - -# Sync back and forth scripts -if(EXISTS "build/startup.lua") - add_custom_command( - TARGET Game POST_BUILD - # Copy back scripts - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/startup.lua" "${CMAKE_CURRENT_SOURCE_DIR}/Source/Scripts/Root/startup.lua" - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/editor.lua" "${CMAKE_CURRENT_SOURCE_DIR}/Source/Scripts/Root/editor.lua" - ) -else() - add_custom_command( - TARGET Game POST_BUILD - # Copy forth scripts - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/Source/Scripts/Root/startup.lua" "${CMAKE_CURRENT_BINARY_DIR}/startup.lua" - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/Source/Scripts/Root/editor.lua" "${CMAKE_CURRENT_BINARY_DIR}/editor.lua" - ) -endif() \ No newline at end of file +) \ No newline at end of file diff --git a/Source/BindLua.cpp b/Source/BindLua.cpp index 8e02fb7..d7b7fda 100644 --- a/Source/BindLua.cpp +++ b/Source/BindLua.cpp @@ -4,7 +4,9 @@ #include "WickedEngine.h" #include #include +#include #include +#include #if IS_DEV #include "ImGui/imgui_BindLua.h" @@ -74,8 +76,8 @@ namespace Game::ScriptBindings{ wi::jobsystem::context script_sys_jobs; std::mutex script_sys_mutex; - wi::unordered_map> async_callback_solvers; - wi::unordered_map async_callbacks; + wi::unordered_map)>> async_callback_solvers; + wi::unordered_map> async_callbacks; int Internal_DoFile(lua_State* L) { @@ -141,7 +143,6 @@ namespace Game::ScriptBindings{ std::stringstream ss(types); while(std::getline(ss, token, ';')){ type_list.push_back(token); - wi::backlog::post(token); } } std::string TID = "FILEDIALOG"; @@ -155,12 +156,14 @@ namespace Game::ScriptBindings{ wi::eventhandler::Subscribe_Once(wi::eventhandler::EVENT_THREAD_SAFE_POINT, [=](uint64_t userdata){ std::scoped_lock lock (script_sys_mutex); - wi::Archive callback_data; + std::shared_ptr callback_data_ptr = std::make_shared(); + auto& callback_data = *callback_data_ptr; callback_data.SetReadModeAndResetPos(false); - callback_data << "filedialog"; + std::string callback_type = "filedialog"; + callback_data << callback_type; callback_data << fileName; - Push_AsyncCallback(TID, callback_data); + Push_AsyncCallback(TID, callback_data_ptr); }); }); }); @@ -192,7 +195,8 @@ namespace Game::ScriptBindings{ wi::lua::RegisterFunc("dofile", Internal_DoFile); #if IS_DEV wi::lua::RegisterFunc("filedialog", Internal_FileDialog); - Register_AsyncCallback("filedialog",[=](std::string tid, wi::Archive archive){ + Register_AsyncCallback("filedialog",[=](std::string tid, std::shared_ptr archive_ptr){ + auto& archive = *archive_ptr; std::string filepath; archive >> filepath; auto L = wi::lua::GetLuaState(); @@ -214,10 +218,10 @@ namespace Game::ScriptBindings{ // Updates stuff which needs synchronization from Lua void Update(float dt){ // Updates all async callbacks from lua here - /* for(auto& callback : async_callbacks){ auto& UID = callback.first; - auto& archive = callback.second; + auto& archive = *callback.second; + auto archive_ptr = callback.second; archive.SetReadModeAndResetPos(true); std::string callback_solver_type; @@ -225,18 +229,17 @@ namespace Game::ScriptBindings{ auto find_callback = async_callback_solvers.find(callback_solver_type); if(find_callback != async_callback_solvers.end()){ - find_callback->second(UID,archive); + find_callback->second(UID,archive_ptr); } } - async_callbacks.clear(); - */ + async_callbacks.clear(); } - void Register_AsyncCallback(std::string callback_type, std::function callback_solver){ + void Register_AsyncCallback(std::string callback_type, std::function)> callback_solver){ async_callback_solvers[callback_type] = callback_solver; } - void Push_AsyncCallback(std::string callback_UID, wi::Archive& async_data){ + void Push_AsyncCallback(std::string callback_UID, std::shared_ptr async_data){ async_callbacks[callback_UID] = async_data; } } diff --git a/Source/BindLua.h b/Source/BindLua.h index b6c169a..75ec5e8 100644 --- a/Source/BindLua.h +++ b/Source/BindLua.h @@ -6,8 +6,8 @@ namespace Game::ScriptBindings{ void Init(); void Update(float dt); - void Register_AsyncCallback(std::string callback_type, std::function); - void Push_AsyncCallback(std::string callback_UID, wi::Archive& async_data); + void Register_AsyncCallback(std::string callback_type, std::function)>); + void Push_AsyncCallback(std::string callback_UID, std::shared_ptr async_data); namespace LiveUpdate{ struct ScriptReloadEvent{ enum MODE{ diff --git a/Source/Resources_BindLua.cpp b/Source/Resources_BindLua.cpp index d949c06..8e50b49 100644 --- a/Source/Resources_BindLua.cpp +++ b/Source/Resources_BindLua.cpp @@ -1,6 +1,8 @@ #include "BindLua.h" #include "Resources.h" #include "Resources_BindLua.h" +#include +#include #include #include #include @@ -30,15 +32,16 @@ namespace Game::ScriptBindings::Resources{ wi::lua::RunText("Resources.LibraryFlags.COMPONENT_FILTER_USE_LAYER_TRANSFORM = "+std::to_string(Game::Resources::Library::COMPONENT_FILTER_USE_LAYER_TRANSFORM)); wi::lua::RunText("Resources.LibraryFlags.COMPONENT_FILTER_REMOVE_CONFIG_AFTER = "+std::to_string(Game::Resources::Library::COMPONENT_FILTER_REMOVE_CONFIG_AFTER)); - // Game::ScriptBindings::Register_AsyncCallback("asyncload",[=](std::string tid, wi::Archive archive){ - // uint32_t instance_uuid; - // archive >> instance_uuid; - // auto L = wi::lua::GetLuaState(); - // lua_getglobal(L, "asyncload_setresult"); - // lua_pushstring(L, tid.c_str()); - // lua_pushnumber(L, instance_uuid); - // lua_call(L,3,0); - // }); + Game::ScriptBindings::Register_AsyncCallback("asyncload",[=](std::string tid, std::shared_ptr archive_ptr){ + auto& archive = *archive_ptr; + uint32_t instance_uuid; + archive >> instance_uuid; + auto L = wi::lua::GetLuaState(); + lua_getglobal(L, "asyncload_setresult"); + lua_pushstring(L, tid.c_str()); + lua_pushnumber(L, instance_uuid); + lua_call(L,3,0); + }); } const char Library_BindLua::className[] = "Library"; @@ -107,13 +110,12 @@ namespace Game::ScriptBindings::Resources{ uint32_t loadingflags = 0; if(argc >= 6) loadingflags = wi::lua::SGetInt(L, 6); Game::Resources::Library::Load_Async(filepath, [=](uint32_t instance_uuid){ - /* - wi::Archive callback_data; + std::shared_ptr callback_data_ptr = std::make_shared(); + auto& callback_data = *callback_data_ptr; callback_data.SetReadModeAndResetPos(false); callback_data << "asyncload"; callback_data << instance_uuid; - Push_AsyncCallback(TID, callback_data); - */ + Push_AsyncCallback(TID, callback_data_ptr); }, subresource, root, loadingstrategy, loadingflags); return 1; }else{