From 83bd028e8fc06a51f4a6cf9f779107ec5806a291 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 13 Dec 2015 03:29:57 +0100 Subject: [PATCH 1/4] Lua/LuaClass: Add inheritance (first implementation) Former-commit-id: 6c7f8d7dace5c857ae71958e15cc13d6a6f9ccb2 --- include/Nazara/Lua/LuaClass.hpp | 36 ++++--- include/Nazara/Lua/LuaClass.inl | 161 ++++++++++++++++++++++---------- 2 files changed, 135 insertions(+), 62 deletions(-) diff --git a/include/Nazara/Lua/LuaClass.hpp b/include/Nazara/Lua/LuaClass.hpp index fe592a4aa..16399fd3a 100644 --- a/include/Nazara/Lua/LuaClass.hpp +++ b/include/Nazara/Lua/LuaClass.hpp @@ -13,14 +13,16 @@ #include #include #include -//#include +#include +#include namespace Nz { - template + template class LuaClass { - //static_assert(std::is_same::value || std::is_base_of::value, "P must be a base of T"); + template + friend class LuaClass; public: using ClassFunc = std::function; @@ -32,7 +34,8 @@ namespace Nz LuaClass(const String& name); - //void Inherit(LuaClass

& parent); + template + void Inherit(LuaClass

& parent); void Register(LuaInstance& lua); @@ -44,7 +47,6 @@ namespace Nz void SetMethod(const String& name, ClassFunc method); template std::enable_if_t::value> SetMethod(const String& name, R(P::*func)(Args...), DefArgs... defArgs); template std::enable_if_t::value> SetMethod(const String& name, R(P::*func)(Args...) const, DefArgs... defArgs); - void SetBindMode(LuaBindMode mode); void SetSetter(ClassIndexFunc setter); void SetStaticGetter(StaticIndexFunc getter); void SetStaticMethod(const String& name, StaticFunc func); @@ -52,20 +54,15 @@ namespace Nz void SetStaticSetter(StaticIndexFunc getter); private: - static int ConstructorProxy(lua_State* state); - static int FinalizerProxy(lua_State* state); - static int InfoDestructor(lua_State* state); - static int GetterProxy(lua_State* state); - static int MethodProxy(lua_State* state); - static int SetterProxy(lua_State* state); - static int StaticGetterProxy(lua_State* state); - static int StaticMethodProxy(lua_State* state); - static int StaticSetterProxy(lua_State* state); + using ParentFunc = std::function; + using InstanceGetter = std::function; struct ClassInfo { std::vector methods; + std::vector parentGetters; std::vector staticMethods; + std::unordered_map instanceGetters; ClassIndexFunc getter = nullptr; ClassIndexFunc setter = nullptr; ConstructorFunc constructor = nullptr; @@ -76,6 +73,17 @@ namespace Nz int globalTableRef = -1; }; + static int ConstructorProxy(lua_State* state); + static int FinalizerProxy(lua_State* state); + static int InfoDestructor(lua_State* state); + static void Get(const std::shared_ptr& info, LuaInstance& lua, T& instance); + static int GetterProxy(lua_State* state); + static int MethodProxy(lua_State* state); + static int SetterProxy(lua_State* state); + static int StaticGetterProxy(lua_State* state); + static int StaticMethodProxy(lua_State* state); + static int StaticSetterProxy(lua_State* state); + std::map m_methods; std::map m_staticMethods; std::shared_ptr m_info; diff --git a/include/Nazara/Lua/LuaClass.inl b/include/Nazara/Lua/LuaClass.inl index afe89c702..79f92c385 100644 --- a/include/Nazara/Lua/LuaClass.inl +++ b/include/Nazara/Lua/LuaClass.inl @@ -4,6 +4,7 @@ #include #include +#include #include namespace Nz @@ -23,6 +24,26 @@ namespace Nz m_info->parentInfo = parent.m_info; } */ + + template + template + inline void LuaClass::Inherit(LuaClass

& parent) + { + static_assert(!std::is_same::value || std::is_base_of::value, "P must be a base of T"); + + std::shared_ptr::ClassInfo>& parentInfo = parent.m_info; + + parentInfo->instanceGetters[m_info->name] = [info = m_info](LuaInstance& lua) -> P* + { + return *static_cast(lua.CheckUserdata(1, info->name)); + }; + + m_info->parentGetters.emplace_back([parentInfo] (LuaInstance& lua, T& instance) + { + LuaClass

::Get(parentInfo, lua, instance); + }); + } + template void LuaClass::Register(LuaInstance& lua) { @@ -48,27 +69,32 @@ namespace Nz if (!lua.NewMetatable(m_info->name)) NazaraWarning("Class \"" + m_info->name + "\" already registred in this instance"); { - lua.PushValue(1); // On associe l'UserData avec la fonction - lua.PushCFunction(FinalizerProxy, 1); - lua.SetField("__gc"); // Finalizer + // Set the type in a __type field + lua.PushString(m_info->name); + lua.SetField("__type"); - if (m_info->getter) + // Define the Finalizer + lua.PushValue(1); + lua.PushCFunction(FinalizerProxy, 1); + lua.SetField("__gc"); + + if (m_info->getter || !m_info->parentGetters.empty()) { - lua.PushValue(1); - lua.PushValue(-2); + lua.PushValue(1); // shared_ptr on UserData + lua.PushValue(-2); // Metatable lua.PushCFunction(GetterProxy, 2); } else // Optimisation, plutôt que de rediriger vers une fonction C qui ne fera rien d'autre que rechercher // dans la table, nous envoyons directement la table, de sorte que Lua fasse directement la recherche // Ceci n'est possible que si nous n'avons ni getter, ni parent - lua.PushValue(-1); + lua.PushValue(-1); // Metatable lua.SetField("__index"); // Getter if (m_info->setter) { - lua.PushValue(1); + lua.PushValue(1); // shared_ptr on UserData lua.PushCFunction(SetterProxy, 1); lua.SetField("__newindex"); // Setter } @@ -76,14 +102,20 @@ namespace Nz m_info->methods.reserve(m_methods.size()); for (auto& pair : m_methods) { + std::size_t methodIndex = m_info->methods.size(); m_info->methods.push_back(pair.second); - lua.PushValue(1); - lua.PushInteger(m_info->methods.size() - 1); + lua.PushValue(1); // shared_ptr on UserData + lua.PushInteger(methodIndex); lua.PushCFunction(MethodProxy, 2); - lua.SetField(pair.first); // Méthode + lua.SetField(pair.first); // Method name } + + m_info->instanceGetters[m_info->name] = [info = m_info](LuaInstance& lua) + { + return *static_cast(lua.CheckUserdata(1, info->name)); + }; } lua.Pop(); // On pop la metatable @@ -104,21 +136,21 @@ namespace Nz if (m_info->staticGetter) { - lua.PushValue(1); - lua.PushValue(-2); + lua.PushValue(1); // shared_ptr on UserData + lua.PushValue(-2); // ClassMeta lua.PushCFunction(StaticGetterProxy, 2); } else // Optimisation, plutôt que de rediriger vers une fonction C qui ne fera rien d'autre que rechercher // dans la table, nous envoyons directement la table, de sorte que Lua fasse directement la recherche // Ceci n'est possible que si nous n'avons ni getter, ni parent - lua.PushValue(-1); + lua.PushValue(-1); // ClassMeta lua.SetField("__index"); // ClassMeta.__index = StaticGetterProxy/ClassMeta if (m_info->staticSetter) { - lua.PushValue(1); + lua.PushValue(1); // shared_ptr on UserData lua.PushCFunction(StaticSetterProxy, 1); lua.SetField("__newindex"); // ClassMeta.__newindex = StaticSetterProxy } @@ -126,10 +158,11 @@ namespace Nz m_info->staticMethods.reserve(m_staticMethods.size()); for (auto& pair : m_staticMethods) { + std::size_t methodIndex = m_info->staticMethods.size(); m_info->staticMethods.push_back(pair.second); - lua.PushValue(1); - lua.PushInteger(m_info->staticMethods.size() - 1); + lua.PushValue(1); // shared_ptr on UserData + lua.PushInteger(methodIndex); lua.PushCFunction(StaticMethodProxy, 2); lua.SetField(pair.first); // ClassMeta.method = StaticMethodProxy @@ -181,7 +214,7 @@ namespace Nz { SetMethod(name, [func, defArgs...] (LuaInstance& instance, T& object) -> int { - LuaImplMethodProxy::Impl handler(instance, object, defArgs...); + typename LuaImplMethodProxy::template Impl handler(instance, object, defArgs...); handler.ProcessArgs(); return handler.Invoke(func); @@ -243,8 +276,8 @@ namespace Nz { LuaInstance& lua = *LuaInstance::GetInstance(state); - ClassInfo* info = *static_cast(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - ConstructorFunc constructor = info->constructor; + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + const ConstructorFunc& constructor = info->constructor; lua.Remove(1); // On enlève l'argument "table" du stack @@ -267,8 +300,8 @@ namespace Nz { LuaInstance& lua = *LuaInstance::GetInstance(state); - ClassInfo* info = *static_cast(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - FinalizerFunc finalizer = info->finalizer; + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + const FinalizerFunc& finalizer = info->finalizer; T* instance = *static_cast(lua.CheckUserdata(1, info->name)); lua.Remove(1); //< Remove the instance from the Lua stack @@ -284,34 +317,54 @@ namespace Nz { LuaInstance& lua = *LuaInstance::GetInstance(state); - std::shared_ptr& infoPtr = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - lua.DestroyReference(infoPtr->globalTableRef); + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + lua.DestroyReference(info->globalTableRef); using namespace std; // Obligatoire pour le destructeur - infoPtr.~shared_ptr(); // Si vous voyez une autre façon de faire, je suis preneur + info.~shared_ptr(); // Si vous voyez une autre façon de faire, je suis preneur return 0; } + template + void LuaClass::Get(const std::shared_ptr& info, LuaInstance& lua, T& instance) + { + const ClassIndexFunc& getter = info->getter; + + if (!getter || !getter(lua, instance)) + { + // Query from the metatable + lua.GetMetatable(info->name); //< Metatable + lua.PushValue(1); //< Field + lua.GetTable(); // Metatable[Field] + + lua.Remove(-2); // Remove Metatable + + if (!lua.IsValid(-1)) + { + for (const ParentFunc& getter : info->parentGetters) + { + lua.Pop(); //< Pop the last nil value + + getter(lua, instance); + if (lua.IsValid(-1)) + return; + } + } + } + } + template int LuaClass::GetterProxy(lua_State* state) { LuaInstance& lua = *LuaInstance::GetInstance(state); - ClassInfo* info = *static_cast(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - ClassIndexFunc getter = info->getter; + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); T& instance = *(*static_cast(lua.CheckUserdata(1, info->name))); lua.Remove(1); //< Remove the instance from the Lua stack - if (!getter(lua, instance)) - { - // On accède alors à la table - lua.PushValue(lua.GetIndexOfUpValue(2)); - lua.PushValue(-2); - lua.GetTable(); - } - + Get(info, lua, instance); return 1; } @@ -320,14 +373,26 @@ namespace Nz { LuaInstance& lua = *LuaInstance::GetInstance(state); - ClassInfo* info = *static_cast(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - unsigned int index = static_cast(lua.ToInteger(lua.GetIndexOfUpValue(2))); - ClassFunc method = info->methods[index]; + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + + T* instance = nullptr; + if (lua.GetMetatable(1)) + { + LuaType type = lua.GetField("__type"); + if (type == LuaType_String) + { + String name = lua.ToString(-1); + auto it = info->instanceGetters.find(name); + if (it != info->instanceGetters.end()) + instance = it->second(lua); + } + } - T& instance = *(*static_cast(lua.CheckUserdata(1, info->name))); lua.Remove(1); //< Remove the instance from the Lua stack - return method(lua, instance); + unsigned int index = static_cast(lua.ToInteger(lua.GetIndexOfUpValue(2))); + const ClassFunc& method = info->methods[index]; + return method(lua, *instance); } template @@ -335,8 +400,8 @@ namespace Nz { LuaInstance& lua = *LuaInstance::GetInstance(state); - ClassInfo* info = *static_cast(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - ClassIndexFunc setter = info->setter; + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + const ClassIndexFunc& setter = info->setter; T& instance = *(*static_cast(lua.CheckUserdata(1, info->name))); lua.Remove(1); //< Remove the instance from the Lua stack @@ -357,8 +422,8 @@ namespace Nz { LuaInstance& lua = *LuaInstance::GetInstance(state); - ClassInfo* info = *static_cast(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - StaticIndexFunc getter = info->staticGetter; + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + const StaticIndexFunc& getter = info->staticGetter; if (!getter(lua)) { @@ -376,9 +441,9 @@ namespace Nz { LuaInstance& lua = *LuaInstance::GetInstance(state); - ClassInfo* info = *static_cast(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); unsigned int index = static_cast(lua.ToInteger(lua.GetIndexOfUpValue(2))); - StaticFunc method = info->staticMethods[index]; + const StaticFunc& method = info->staticMethods[index]; return method(lua); } @@ -388,8 +453,8 @@ namespace Nz { LuaInstance& lua = *LuaInstance::GetInstance(state); - ClassInfo* info = *static_cast(lua.ToUserdata(lua.GetIndexOfUpValue(1))); - StaticIndexFunc setter = info->staticSetter; + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + const StaticIndexFunc& setter = info->staticSetter; if (!setter(lua)) { From 2c79e5f4e0a05d08f7aff0e5fe809cf888c4493a Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 13 Dec 2015 04:40:50 +0100 Subject: [PATCH 2/4] Lua/LuaInstance: Add PushInstance Former-commit-id: 0e65124d5920a1b5ea3c644e496ae58ddee1cd8e --- include/Nazara/Lua/LuaClass.inl | 14 +------------- include/Nazara/Lua/LuaInstance.hpp | 2 ++ include/Nazara/Lua/LuaInstance.inl | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/include/Nazara/Lua/LuaClass.inl b/include/Nazara/Lua/LuaClass.inl index 79f92c385..5ff49defe 100644 --- a/include/Nazara/Lua/LuaClass.inl +++ b/include/Nazara/Lua/LuaClass.inl @@ -15,15 +15,6 @@ namespace Nz { m_info->name = name; } - /* - template - void LuaClass::Inherit(LuaClass

& parent) - { - static_assert(std::is_base_of::value, "P must be a base of T"); - - m_info->parentInfo = parent.m_info; - } - */ template template @@ -288,10 +279,7 @@ namespace Nz return 0; // Normalement jamais exécuté (l'erreur provoquant une exception) } - T** ud = static_cast(lua.PushUserdata(sizeof(T*))); - *ud = instance; - lua.SetMetatable(info->name); - + lua.PushInstance(info->name.GetConstBuffer(), instance); return 1; } diff --git a/include/Nazara/Lua/LuaInstance.hpp b/include/Nazara/Lua/LuaInstance.hpp index b194bf11f..504a79254 100644 --- a/include/Nazara/Lua/LuaInstance.hpp +++ b/include/Nazara/Lua/LuaInstance.hpp @@ -117,6 +117,8 @@ namespace Nz void PushCFunction(LuaCFunction func, unsigned int upvalueCount = 0); void PushFunction(LuaFunction func); template void PushFunction(R(*func)(Args...), DefArgs... defArgs); + template void PushInstance(const char* tname, T* instance); + template void PushInstance(const char* tname, Args&&... args); void PushInteger(long long value); void PushLightUserdata(void* value); void PushMetatable(const char* str); diff --git a/include/Nazara/Lua/LuaInstance.inl b/include/Nazara/Lua/LuaInstance.inl index 20f568f64..bd57b2308 100644 --- a/include/Nazara/Lua/LuaInstance.inl +++ b/include/Nazara/Lua/LuaInstance.inl @@ -404,4 +404,18 @@ namespace Nz return handler.Invoke(func); }); } + + template + void LuaInstance::PushInstance(const char* tname, T* instance) + { + T** userdata = static_cast(PushUserdata(sizeof(T*))); + *userdata = instance; + SetMetatable(tname); + } + + template + void LuaInstance::PushInstance(const char* tname, Args&&... args) + { + PushInstance(tname, new T(std::forward(args)...)); + } } From 4c72e277841cac57094989c74462a5634e1a0152 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 13 Dec 2015 16:35:42 +0100 Subject: [PATCH 3/4] Lua/LuaClass: Add pointer objects support Former-commit-id: b4cf6fb6674278ed341a27d2a8e432845531a333 --- include/Nazara/Core/Algorithm.hpp | 6 ++++++ include/Nazara/Core/Algorithm.inl | 5 +++++ include/Nazara/Core/ObjectRef.hpp | 4 ++++ include/Nazara/Lua/LuaClass.hpp | 15 +++++++++------ include/Nazara/Lua/LuaClass.inl | 26 ++++++++++++++++++++++++++ include/Nazara/Lua/LuaInstance.inl | 26 ++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 6 deletions(-) diff --git a/include/Nazara/Core/Algorithm.hpp b/include/Nazara/Core/Algorithm.hpp index cbbd8af04..408eb79cf 100644 --- a/include/Nazara/Core/Algorithm.hpp +++ b/include/Nazara/Core/Algorithm.hpp @@ -25,6 +25,12 @@ namespace Nz template ByteArray ComputeHash(AbstractHash* hash, const T& v); template void HashCombine(std::size_t& seed, const T& v); + template + struct PointedType + { + using type = void; //< FIXME: I can't make SFINAE work + }; + template struct TypeTag {}; diff --git a/include/Nazara/Core/Algorithm.inl b/include/Nazara/Core/Algorithm.inl index 7c117e626..a23fea4e1 100644 --- a/include/Nazara/Core/Algorithm.inl +++ b/include/Nazara/Core/Algorithm.inl @@ -79,6 +79,11 @@ namespace Nz seed = static_cast(b * kMul); } + template struct PointedType {typedef T type;}; + template struct PointedType {typedef T type;}; + template struct PointedType {typedef T type;}; + template struct PointedType {typedef T type;}; + inline bool Serialize(SerializationContext& context, bool value) { if (context.currentBitPos == 8) diff --git a/include/Nazara/Core/ObjectRef.hpp b/include/Nazara/Core/ObjectRef.hpp index 0c82b3abc..8debb7d91 100644 --- a/include/Nazara/Core/ObjectRef.hpp +++ b/include/Nazara/Core/ObjectRef.hpp @@ -8,6 +8,7 @@ #define NAZARA_RESOURCEREF_HPP #include +#include #include #include @@ -44,6 +45,9 @@ namespace Nz private: T* m_object; }; + + template struct PointedType> {typedef T type;}; + template struct PointedType const> {typedef T type;}; } #include diff --git a/include/Nazara/Lua/LuaClass.hpp b/include/Nazara/Lua/LuaClass.hpp index 16399fd3a..7494dbe83 100644 --- a/include/Nazara/Lua/LuaClass.hpp +++ b/include/Nazara/Lua/LuaClass.hpp @@ -8,6 +8,7 @@ #define NAZARA_LUACLASS_HPP #include +#include #include #include #include @@ -47,6 +48,8 @@ namespace Nz void SetMethod(const String& name, ClassFunc method); template std::enable_if_t::value> SetMethod(const String& name, R(P::*func)(Args...), DefArgs... defArgs); template std::enable_if_t::value> SetMethod(const String& name, R(P::*func)(Args...) const, DefArgs... defArgs); + template std::enable_if_t::type>::value> SetMethod(const String& name, R(P::*func)(Args...), DefArgs... defArgs); + template std::enable_if_t::type>::value> SetMethod(const String& name, R(P::*func)(Args...) const, DefArgs... defArgs); void SetSetter(ClassIndexFunc setter); void SetStaticGetter(StaticIndexFunc getter); void SetStaticMethod(const String& name, StaticFunc func); @@ -63,12 +66,12 @@ namespace Nz std::vector parentGetters; std::vector staticMethods; std::unordered_map instanceGetters; - ClassIndexFunc getter = nullptr; - ClassIndexFunc setter = nullptr; - ConstructorFunc constructor = nullptr; - FinalizerFunc finalizer = nullptr; - StaticIndexFunc staticGetter = nullptr; - StaticIndexFunc staticSetter = nullptr; + ClassIndexFunc getter; + ClassIndexFunc setter; + ConstructorFunc constructor; + FinalizerFunc finalizer; + StaticIndexFunc staticGetter; + StaticIndexFunc staticSetter; String name; int globalTableRef = -1; }; diff --git a/include/Nazara/Lua/LuaClass.inl b/include/Nazara/Lua/LuaClass.inl index 5ff49defe..5ca323a79 100644 --- a/include/Nazara/Lua/LuaClass.inl +++ b/include/Nazara/Lua/LuaClass.inl @@ -225,6 +225,32 @@ namespace Nz }); } + template + template + std::enable_if_t::type>::value> LuaClass::SetMethod(const String& name, R(P::*func)(Args...), DefArgs... defArgs) + { + SetMethod(name, [func, defArgs...](LuaInstance& instance, T& object) -> int + { + typename LuaImplMethodProxy::template Impl handler(instance, object, defArgs...); + handler.ProcessArgs(); + + return handler.Invoke(func); + }); + } + + template + template + std::enable_if_t::type>::value> LuaClass::SetMethod(const String& name, R(P::*func)(Args...) const, DefArgs... defArgs) + { + SetMethod(name, [func, defArgs...](LuaInstance& instance, T& object) -> int + { + typename LuaImplMethodProxy::template Impl handler(instance, object, defArgs...); + handler.ProcessArgs(); + + return handler.Invoke(func); + }); + } + template void LuaClass::SetSetter(ClassIndexFunc setter) { diff --git a/include/Nazara/Lua/LuaInstance.inl b/include/Nazara/Lua/LuaInstance.inl index bd57b2308..47712161c 100644 --- a/include/Nazara/Lua/LuaInstance.inl +++ b/include/Nazara/Lua/LuaInstance.inl @@ -344,6 +344,32 @@ namespace Nz return LuaImplReplyVal(m_instance, std::move(Apply(m_object, func, m_args)), TypeTag()); } + template + std::enable_if_t::type>::value, int> Invoke(void(P::*func)(Args...)) + { + Apply(*m_object, func, m_args); + return 0; + } + + template + std::enable_if_t::type>::value, int> Invoke(Ret(P::*func)(Args...)) + { + return LuaImplReplyVal(m_instance, std::move(Apply(*m_object, func, m_args)), TypeTag()); + } + + template + std::enable_if_t::type>::value, int> Invoke(void(P::*func)(Args...) const) + { + Apply(*m_object, func, m_args); + return 0; + } + + template + std::enable_if_t::type>::value, int> Invoke(Ret(P::*func)(Args...) const) + { + return LuaImplReplyVal(m_instance, std::move(Apply(*m_object, func, m_args)), TypeTag()); + } + private: using ArgContainer = std::tuple>...>; using DefArgContainer = std::tuple>...>; From cfe7c79991c69653b20f22adb80b34ded63b2f16 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 13 Dec 2015 16:36:38 +0100 Subject: [PATCH 4/4] Sdk: Add server-side module Former-commit-id: 4df27d1e44d791aad234d095af08ae3c19660fba --- SDK/src/NDK/Sdk.cpp | 76 ++++++++++++++++++------------ SDK/src/NDK/World.cpp | 14 ++++-- build/scripts/tools/ndk_server.lua | 40 ++++++++++++++++ 3 files changed, 97 insertions(+), 33 deletions(-) create mode 100644 build/scripts/tools/ndk_server.lua diff --git a/SDK/src/NDK/Sdk.cpp b/SDK/src/NDK/Sdk.cpp index 3a45b65b3..21bfd236f 100644 --- a/SDK/src/NDK/Sdk.cpp +++ b/SDK/src/NDK/Sdk.cpp @@ -13,64 +13,80 @@ #include #include #include -#include #include -#include -#include -#include #include #include #include -#include #include -#include #include +#ifndef NDK_SERVER +#include +#include +#include +#include +#include +#include +#endif + namespace Ndk { bool Sdk::Initialize() { if (s_referenceCounter++ > 0) - return true; // Déjà initialisé + return true; // Already initialized try { Nz::ErrorFlags errFlags(Nz::ErrorFlag_ThrowException, true); - // Initialisation du moteur + // Initialize the engine first - // Modules clients - Nz::Audio::Initialize(); - Nz::Graphics::Initialize(); - - // Modules serveurs + // Shared modules Nz::Lua::Initialize(); Nz::Noise::Initialize(); Nz::Physics::Initialize(); Nz::Utility::Initialize(); - // Initialisation du SDK + #ifndef NDK_SERVER + // Client modules + Nz::Audio::Initialize(); + Nz::Graphics::Initialize(); + #endif - // Initialisation des composants et systèmes + // SDK Initialization + + // Components BaseComponent::Initialize(); - BaseSystem::Initialize(); - // Composants - InitializeComponent("NdkCam"); + // Shared components InitializeComponent("NdkColli"); - InitializeComponent("NdkLight"); - InitializeComponent("NdkList"); - InitializeComponent("NdkGfx"); InitializeComponent("NdkNode"); InitializeComponent("NdkPhys"); InitializeComponent("NdkVeloc"); - // Systèmes - InitializeSystem(); + #ifndef NDK_SERVER + // Client components + InitializeComponent("NdkCam"); + InitializeComponent("NdkLight"); + InitializeComponent("NdkList"); + InitializeComponent("NdkGfx"); + #endif + + // Systems + + BaseSystem::Initialize(); + + // Shared systems InitializeSystem(); - InitializeSystem(); InitializeSystem(); + #ifndef NDK_SERVER + // Client systems + InitializeSystem(); + InitializeSystem(); + #endif + NazaraNotice("Initialized: SDK"); return true; } @@ -86,23 +102,25 @@ namespace Ndk { if (s_referenceCounter != 1) { - // Le module est soit encore utilisé, soit pas initialisé + // Either the module is not initialized, either it was initialized multiple times if (s_referenceCounter > 1) s_referenceCounter--; return; } - // Libération du SDK + // Uninitialize the SDK s_referenceCounter = 0; - // Libération du moteur + // Uninitialize the engine - // Modules clients + #ifndef NDK_SERVER + // Client modules Nz::Audio::Uninitialize(); Nz::Graphics::Uninitialize(); + #endif - // Modules serveurs + // Shared modules Nz::Lua::Uninitialize(); Nz::Noise::Uninitialize(); Nz::Physics::Uninitialize(); diff --git a/SDK/src/NDK/World.cpp b/SDK/src/NDK/World.cpp index 92b3fa654..e8fff42f2 100644 --- a/SDK/src/NDK/World.cpp +++ b/SDK/src/NDK/World.cpp @@ -4,11 +4,14 @@ #include #include -#include #include -#include #include +#ifndef NDK_SERVER +#include +#include +#endif + namespace Ndk { World::~World() @@ -19,10 +22,13 @@ namespace Ndk void World::AddDefaultSystems() { - AddSystem(); AddSystem(); - AddSystem(); AddSystem(); + + #ifndef NDK_SERVER + AddSystem(); + AddSystem(); + #endif } const EntityHandle& World::CreateEntity() diff --git a/build/scripts/tools/ndk_server.lua b/build/scripts/tools/ndk_server.lua new file mode 100644 index 000000000..c94170dce --- /dev/null +++ b/build/scripts/tools/ndk_server.lua @@ -0,0 +1,40 @@ +TOOL.Name = "SDKServer" + +TOOL.Directory = "../SDK/lib" +TOOL.Kind = "Library" + +TOOL.Defines = { + "NDK_BUILD", + "NDK_SERVER" +} + +TOOL.Includes = { + "../SDK/include" +} + +TOOL.Files = { + "../SDK/include/NDK/**.hpp", + "../SDK/include/NDK/**.inl", + "../SDK/src/NDK/**.hpp", + "../SDK/src/NDK/**.inl", + "../SDK/src/NDK/**.cpp" +} + +-- Exlude client-only files +TOOL.FilesExclusion = { + "../SDK/**/CameraComponent.*", + "../SDK/**/GraphicsComponent.*", + "../SDK/**/LightComponent.*", + "../SDK/**/ListenerComponent.*", + "../SDK/**/ListenerSystem.*", + "../SDK/**/RenderSystem.*", + "../SDK/**/LuaInterface_Audio.*" +} + +TOOL.Libraries = { + "NazaraCore", + "NazaraLua", + "NazaraNoise", + "NazaraPhysics", + "NazaraUtility" +}