diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 41b09782..4e9d0f6c 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -34,4 +34,19 @@ add_test( NAME run COMMAND ${NAME} WORKING_DIRECTORY "$<TARGET_FILE_DIR:${NAME}>" +) + + +set(LIBNAME ce_module) + +add_library(${LIBNAME} + SHARED + "./ce_module_api.cpp" +) +target_link_libraries(${LIBNAME} + ${CE_LIBS} +) +include_directories(${LIBNAME} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CE_INCLUDES} ) \ No newline at end of file diff --git a/engine/ce_module_api.cpp b/engine/ce_module_api.cpp new file mode 100644 index 00000000..85df827a --- /dev/null +++ b/engine/ce_module_api.cpp @@ -0,0 +1,9 @@ +/** + * Cinnabar Module API + * Author: Cameron Trow <tumblegamer@gmail.com> + * + * Entry point for the version of the module api for use during module development + * + */ + +#include "core/module.h" \ No newline at end of file diff --git a/engine/core/module.h b/engine/core/module.h new file mode 100644 index 00000000..5c0fcbd7 --- /dev/null +++ b/engine/core/module.h @@ -0,0 +1,18 @@ +/** + * API FOR CREATING MODULES FOR CINNABAR ENGINE + */ + +#pragma once + +namespace ce { + class Module { + private: + public: + virtual void tick(float deltaTime) = 0; + }; + typedef Module* init_module_t(); + typedef void delete_module_t(Module*); +} +#define CE_MODULE(X) \ + extern "C" ce::Module* init_module() { return new X; } \ + extern "C" void delete_module(ce::Module* m) { delete m; } \ No newline at end of file diff --git a/engine/main.cpp b/engine/main.cpp index 151f31bf..b8e3e1dc 100644 --- a/engine/main.cpp +++ b/engine/main.cpp @@ -174,6 +174,9 @@ int main(int argc, char* argv[]) { } } } + + moduleManager->tickModules(time->getDeltaTime()); + // Rotate cube cubePos->roll(25.0f * time->getDeltaTime()); cubePos->yaw(50.0f * time->getDeltaTime()); diff --git a/engine/managers/module_manager.cpp b/engine/managers/module_manager.cpp index f1cc50f8..1a12d1bf 100644 --- a/engine/managers/module_manager.cpp +++ b/engine/managers/module_manager.cpp @@ -20,18 +20,28 @@ void ce::ModuleManger::loadModules() { } //reset Errors dlerror(); + const char* error; LOG_ERROR("Loading Symbols for: " + path); - module_t module = (module_t)dlsym(lib, "hello"); - const char* error = dlerror(); + // Get a function called "Hello" + init_module_t* init_module = (init_module_t*)dlsym(lib, "init_module"); + // Handle any errors + error = dlerror(); if (error) { LOG_ERROR(dlerror()); dlclose(lib); continue; } - - module(); - - dlclose(lib); + delete_module_t* delete_module = (delete_module_t*)dlsym(lib, "delete_module"); + error = dlerror(); + if (error) { + LOG_ERROR(dlerror()); + dlclose(lib); + continue; + } + Module* module = init_module(); + m_modules.push_back({module, lib, init_module, delete_module}); + //delete_module(module); + //dlclose(lib); } } @@ -40,4 +50,14 @@ ce::ModuleManger::ModuleManger() { } ce::ModuleManger::~ModuleManger() { + for (int i = 0; i < m_modules.size(); i++) { + ModuleRef module = m_modules[i]; + module.delete_module(module.module); + dlclose(module.lib); + } } + +void ce::ModuleManger::tickModules(float deltaTime) { + for (int i = 0; i < m_modules.size(); i++) + m_modules[i].module->tick(deltaTime); +} \ No newline at end of file diff --git a/engine/managers/module_manager.h b/engine/managers/module_manager.h index 179f8292..1ec6d43d 100644 --- a/engine/managers/module_manager.h +++ b/engine/managers/module_manager.h @@ -1,18 +1,30 @@ #pragma once #include <string> +#include <vector> + +#include <core/module.h> namespace ce { - typedef void (*module_t)(); class ModuleManger { - private: + struct ModuleRef { + Module* module; + void* lib; + init_module_t* inti_module; + delete_module_t* delete_module; + }; + inline static const std::string MODULE_FOLDER = "modules"; + std::vector<ModuleRef> m_modules; + void loadModules(); public: ModuleManger(); ~ModuleManger(); + + void tickModules(float deltaTime); }; } \ No newline at end of file diff --git a/res/modules/libhello.so b/res/modules/libhello.so deleted file mode 100644 index f135fb00..00000000 Binary files a/res/modules/libhello.so and /dev/null differ diff --git a/res/modules/libsample_module.so b/res/modules/libsample_module.so new file mode 100644 index 00000000..193eda3c Binary files /dev/null and b/res/modules/libsample_module.so differ