diff --git a/.gitignore b/.gitignore index b324b026..ff996e7f 100644 --- a/.gitignore +++ b/.gitignore @@ -864,3 +864,4 @@ Nuake/dependencies/glad/glad.vcxproj.filters *.csproj *.filters cloc.exe +Nuake/src/Modules/Modules.cpp \ No newline at end of file diff --git a/Nuake/Engine.cpp b/Nuake/Engine.cpp index f21e8e73..5446bf1f 100644 --- a/Nuake/Engine.cpp +++ b/Nuake/Engine.cpp @@ -11,7 +11,7 @@ #include "src/Scripting/ScriptingEngine.h" #include "src/Scripting/ScriptingEngineNet.h" #include "src/Threading/JobSystem.h" - +#include "src/Modules/Modules.h" #include #include @@ -43,6 +43,8 @@ namespace Nuake Input::Init(); Renderer2D::Init(); Logger::Log("Engine initialized"); + + Modules::StartupModules(); } void Engine::Tick() diff --git a/Nuake/src/Modules/Modules.h b/Nuake/src/Modules/Modules.h new file mode 100644 index 00000000..8886bd7a --- /dev/null +++ b/Nuake/src/Modules/Modules.h @@ -0,0 +1,11 @@ +#pragma once + +namespace Nuake +{ + class Modules + { + public: + static void StartupModules(); + static void ShutdownModules(); + }; +} \ No newline at end of file diff --git a/Nuake/src/Modules/Modules.lua b/Nuake/src/Modules/Modules.lua new file mode 100644 index 00000000..78914b9a --- /dev/null +++ b/Nuake/src/Modules/Modules.lua @@ -0,0 +1,74 @@ +-- Function to scan the "Modules" directory and load all module definitions +function loadModules(modulesDir) + local modules = {} + + -- Get all folders in the Modules directory + local dirs = os.matchdirs(path.join(modulesDir, "*")) + + for _, dir in ipairs(dirs) do + local moduleName = path.getname(dir) + local moduleFile = path.join(dir, "Module.lua") + + if os.isfile(moduleFile) then + -- Load the module data + local moduleData = dofile(moduleFile) + + -- Set the module name from the directory + moduleData._name = moduleName + + print("Found module \"".. moduleData.name .."\" (".. moduleData._name ..")") + + table.insert(modules, moduleData) + end + end + + return modules +end + +-- Function to generate the final C++ file with startup and shutdown functions +function generateModulesFile(modules, outputFilePath, sourceDir) + local outputFile = io.open(outputFilePath, "w") + + if not outputFile then + print("Error: Could not write to file ".. outputFilePath) + return + end + + outputFile:write("// Auto-generated modules management file\n") + outputFile:write("#include \"Modules.h\"\n\n") + + -- Include module header files + for _, module in ipairs(modules) do + outputFile:write("#include \"".. module._name .."/".. module.module_header .."\"\n") + end + outputFile:write("\n") + + outputFile:write("#include \"src/Core/Logger.h\"\n\n") + + -- Generate StartupModules function + outputFile:write("void Nuake::Modules::StartupModules()\n{\n") + for _, module in ipairs(modules) do + outputFile:write(" Logger::Log(\"Starting ".. module._name .."\", \"modules\");\n") + outputFile:write(" Module_".. module._name .."_Startup();\n") + end + outputFile:write("}\n\n") + + -- Generate ShutdownModules function + outputFile:write("void Nuake::Modules::ShutdownModules()\n{\n") + for _, module in ipairs(modules) do + outputFile:write(" Logger::Log(\"Shutting down ".. module._name .."\", \"modules\");\n") + outputFile:write(" Module_".. module._name .."_Shutdown();\n") + end + outputFile:write("}\n") + + outputFile:close() + + local sources = {} + for _, module in ipairs(modules) do + table.insert(sources, sourceDir .. "/" .. module._name .. "/" .. module.module_header) + for _, v in ipairs(module.sources) do + table.insert(sources, sourceDir .. "/" .. module._name .. "/" .. v) + end + end + return sources +end \ No newline at end of file diff --git a/premake5.lua b/premake5.lua index 7c411606..534fda00 100644 --- a/premake5.lua +++ b/premake5.lua @@ -39,6 +39,7 @@ group "" include "NuakeNet/premake5.lua" include "EditorNet/premake5.lua" +include "Nuake/src/Modules/Modules.lua" project "Nuake" location "Nuake" @@ -47,6 +48,17 @@ project "Nuake" language "C++" cppdialect "C++20" + + local moduleSources = {} + + if _ACTION then + local modulesDir = "Nuake/src/Modules" + local outputFilePath = path.join(modulesDir, "Modules.cpp") + + -- Load and generate the modules file + local modules = loadModules(modulesDir) + moduleSources = generateModulesFile(modules, outputFilePath, "Nuake/src/Modules") + end defines { @@ -59,10 +71,37 @@ project "Nuake" files { + -- Main Sources "%{prj.name}/Engine.h", "%{prj.name}/Engine.cpp", - "%{prj.name}/src/**.h", - "%{prj.name}/src/**.cpp", + "%{prj.name}/src/*.h", + "%{prj.name}/src/*.cpp", + "%{prj.name}/src/AI/**.h", + "%{prj.name}/src/AI/**.cpp", + "%{prj.name}/src/Application/**.h", + "%{prj.name}/src/Application/**.cpp", + "%{prj.name}/src/Audio/**.h", + "%{prj.name}/src/Audio/**.cpp", + "%{prj.name}/src/Core/**.h", + "%{prj.name}/src/Core/**.cpp", + "%{prj.name}/src/Physics/**.h", + "%{prj.name}/src/Physics/**.cpp", + "%{prj.name}/src/Rendering/**.h", + "%{prj.name}/src/Rendering/**.cpp", + "%{prj.name}/src/Resource/**.h", + "%{prj.name}/src/Resource/**.cpp", + "%{prj.name}/src/Scene/**.h", + "%{prj.name}/src/Scene/**.cpp", + "%{prj.name}/src/Scripting/**.h", + "%{prj.name}/src/Scripting/**.cpp", + "%{prj.name}/src/Threading/**.h", + "%{prj.name}/src/Threading/**.cpp", + "%{prj.name}/src/UI/**.h", + "%{prj.name}/src/UI/**.cpp", + "%{prj.name}/src/Vendors/**.h", + "%{prj.name}/src/Vendors/**.cpp", + + -- Vendor Sources "%{prj.name}/src/Vendors/libmap/h/*.h", "%{prj.name}/src/Vendors/libmap/c/*.c", "%{prj.name}/src/Vendors/wren/src/vm/*.h", @@ -72,6 +111,11 @@ project "Nuake" "%{prj.name}/src/Vendors/incbin/*.c", "%{prj.name}/src/Vendors/incbin/*.h", "%{prj.name}/src/Vendors/filewatch/*.hpp" + + -- Modules System + "%{prj.name}/src/Modules/Modules.h", + "%{prj.name}/src/Modules/Modules.cpp", + table.unpack(moduleSources) } includedirs @@ -93,7 +137,7 @@ project "Nuake" "%{prj.name}/dependencies/recastnavigation/DetourTileCache/Include", "%{prj.name}/dependencies/recastnavigation/Recast/Include" } - + links { "soloud"