diff --git a/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp b/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp index bbe47f59..e547d1d5 100644 --- a/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp +++ b/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp @@ -32,6 +32,30 @@ namespace Nuake void ExampleFunction() { } +class TestClass : public Class +{ + NUAKECLASS(TestClass) + static void InitializeClass() + { + BindField<&TestClass::Intensity>("Intensity", "Intensity"); + BindProperty<&TestClass::SetIntensity, &TestClass::GetIntensity>("Intensity2", "Intensity2"); + } + +public: + float Intensity = 1.0f; + + void SetIntensity(float value) + { + Intensity = value; + } + + float GetIntensity() + { + return Intensity; + } +}; + + void ExampleModuleLog(const std::string& hi) { Nuake::Logger::Log(hi, "ExampleModule", Nuake::VERBOSE); @@ -42,6 +66,9 @@ void ExampleModule_Startup() { using namespace Nuake; + TestClass::InternalInitializeClass(); + + auto& module = ModuleDB::Get().RegisterModule(); module.instance = module.Resolve().construct(); @@ -50,7 +77,7 @@ void ExampleModule_Startup() // This is to expose functions to the rest of the engine module.BindFunction("ExampleFunction"); module.BindFunction("ExampleModuleLog", "hi"); - module.Invoke("ExampleModuleLog", "Hello World"); + //module.Invoke("ExampleModuleLog", "Hello World"); entt::id_type typeId = entt::hashed_string("ExampleModuleLog"); entt::meta_type metaType = entt::resolve(typeId); diff --git a/Nuake/Source/Nuake/Modules/ModuleDB.h b/Nuake/Source/Nuake/Modules/ModuleDB.h index 0239440a..dd22e6c2 100644 --- a/Nuake/Source/Nuake/Modules/ModuleDB.h +++ b/Nuake/Source/Nuake/Modules/ModuleDB.h @@ -3,8 +3,79 @@ #include #include +#include "Nuake/Core/Object/Object.h" + #include +class Class +{ +protected: + static void InitializeClass() {} + + static void (*GetInitializeClass(void))() + { + return &Class::InitializeClass; + } + +public: + static std::string GetName(const entt::meta_type& componentMeta); +}; + +#define NUAKECLASS(klass) \ +public: \ + static std::string ClassName() \ + { \ + static std::string className = #klass; \ + return className; \ + } \ + \ + static void (*GetInitializeClass())() \ + { \ + return &klass::InitializeClass; \ + } \ + \ + inline static auto ClassFactory = entt::meta(); \ + static void InternalInitializeClass() \ + { \ + static bool initialized = false; \ + if (initialized) \ + return; \ + \ + ClassFactory.type(entt::hashed_string(#klass)); \ + ClassFactory.func<&klass::ClassName>(entt::hashed_string("ClassName")); \ + if (klass::GetInitializeClass() != Class::GetInitializeClass()) \ + { \ + GetInitializeClass()(); \ + } \ + \ + initialized = true; \ + } \ + \ + template \ + static auto BindField(const char* varName, const char* displayName) \ + { \ + return ClassFactory \ + .data(entt::hashed_string(varName)) \ + .prop(Nuake::HashedName::DisplayName, displayName); \ + } \ + \ + template \ + static auto BindProperty(const char* varName, const char* displayName) \ + { \ + return ClassFactory \ + .data(entt::hashed_string(varName)) \ + .prop(Nuake::HashedName::DisplayName, displayName); \ + } \ + \ + template \ + static void BindAction(const char* funcName, const char* actionName) \ + { \ + ClassFactory \ + .func(entt::hashed_string(funcName)) \ + .prop(Nuake::HashedName::DisplayName, actionName); \ + } + + #define NUAKEMODULE(moduleName) \ using TypeNameMap = std::map; \ \