Sdk/LuaBinding: Expose BindComponent for user components

Former-commit-id: 3d9f1d14f6b63ec72b61e15e6e549e46e958a92f
This commit is contained in:
Lynix 2016-04-17 20:50:26 +02:00
parent 922e49accb
commit 6a259c9ef9
3 changed files with 72 additions and 68 deletions

View File

@ -27,12 +27,14 @@
namespace Ndk namespace Ndk
{ {
class LuaBinding class NDK_API LuaBinding
{ {
public: public:
LuaBinding(); LuaBinding();
~LuaBinding() = default; ~LuaBinding() = default;
template<typename T> void BindComponent(const Nz::String& name);
void RegisterClasses(Nz::LuaInstance& instance); void RegisterClasses(Nz::LuaInstance& instance);
private: private:
@ -42,8 +44,6 @@ namespace Ndk
void BindSDK(); void BindSDK();
void BindUtility(); void BindUtility();
template<typename T> void EnableComponentBinding();
void RegisterCore(Nz::LuaInstance& instance); void RegisterCore(Nz::LuaInstance& instance);
void RegisterMath(Nz::LuaInstance& instance); void RegisterMath(Nz::LuaInstance& instance);
void RegisterNetwork(Nz::LuaInstance& instance); void RegisterNetwork(Nz::LuaInstance& instance);
@ -93,8 +93,9 @@ namespace Ndk
struct ComponentBinding struct ComponentBinding
{ {
AddComponentFunc adder; AddComponentFunc adder;
ComponentIndex index;
GetComponentFunc getter; GetComponentFunc getter;
bool valid = false; Nz::String name;
}; };
std::vector<ComponentBinding> m_componentBinding; std::vector<ComponentBinding> m_componentBinding;
@ -115,6 +116,14 @@ namespace Ndk
Nz::LuaClass<GraphicsComponentHandle> graphicsComponent; Nz::LuaClass<GraphicsComponentHandle> graphicsComponent;
#endif #endif
}; };
template<typename T>
int AddComponentOfType(Nz::LuaInstance& lua, EntityHandle& handle);
template<typename T>
int PushComponentOfType(Nz::LuaInstance& lua, BaseComponent& component);
} }
#include <NDK/LuaBinding.inl>
#endif // NDK_LUABINDING_HPP #endif // NDK_LUABINDING_HPP

View File

@ -0,0 +1,45 @@
// Copyright (C) 2015 Jérôme Leclercq
// This file is part of the "Nazara Development Kit"
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp
#include <NDK/LuaBinding.hpp>
namespace Ndk
{
template<typename T>
void LuaBinding::BindComponent(const Nz::String& name)
{
NazaraAssert(!name.IsEmpty(), "Component name cannot be empty");
ComponentBinding binding;
binding.adder = &AddComponentOfType<T>;
binding.getter = &PushComponentOfType<T>;
binding.index = T::componentIndex;
binding.name = name;
if (m_componentBinding.size() <= T::componentIndex)
m_componentBinding.resize(T::componentIndex + 1);
m_componentBinding[T::componentIndex] = std::move(binding);
}
template<typename T>
int AddComponentOfType(Nz::LuaInstance& lua, EntityHandle& handle)
{
static_assert(std::is_base_of<BaseComponent, T>::value, "ComponentType must inherit BaseComponent");
T& component = handle->AddComponent<T>();
lua.Push(component.CreateHandle());
return 1;
}
template<typename T>
int PushComponentOfType(Nz::LuaInstance& lua, BaseComponent& component)
{
static_assert(std::is_base_of<BaseComponent, T>::value, "ComponentType must inherit BaseComponent");
T& rightComponent = static_cast<T&>(component);
lua.Push(rightComponent.CreateHandle());
return 1;
}
}

View File

@ -7,41 +7,6 @@
namespace Ndk namespace Ndk
{ {
namespace
{
int AddNilComponent(Nz::LuaInstance& lua, EntityHandle&)
{
lua.PushNil();
return 1;
}
template<typename T>
int AddComponentOfType(Nz::LuaInstance& lua, EntityHandle& handle)
{
static_assert(std::is_base_of<BaseComponent, T>::value, "ComponentType must inherit BaseComponent");
T& component = handle->AddComponent<T>();
lua.Push(component.CreateHandle());
return 1;
}
int PushNilComponent(Nz::LuaInstance& lua, BaseComponent&)
{
lua.PushNil();
return 1;
}
template<typename T>
int PushComponentOfType(Nz::LuaInstance& lua, BaseComponent& component)
{
static_assert(std::is_base_of<BaseComponent, T>::value, "ComponentType must inherit BaseComponent");
T& rightComponent = static_cast<T&>(component);
lua.Push(rightComponent.CreateHandle());
return 1;
}
}
void LuaBinding::BindSDK() void LuaBinding::BindSDK()
{ {
/*********************************** Ndk::Application **********************************/ /*********************************** Ndk::Application **********************************/
@ -110,7 +75,7 @@ namespace Ndk
} }
ComponentBinding& binding = m_componentBinding[componentIndex]; ComponentBinding& binding = m_componentBinding[componentIndex];
if (!binding.valid) if (binding.name.IsEmpty())
{ {
lua.Error("This component is not available to the LuaAPI"); lua.Error("This component is not available to the LuaAPI");
return 0; return 0;
@ -137,7 +102,7 @@ namespace Ndk
} }
ComponentBinding& binding = m_componentBinding[componentIndex]; ComponentBinding& binding = m_componentBinding[componentIndex];
if (!binding.valid) if (binding.name.IsEmpty())
{ {
lua.Error("This component is not available to the LuaAPI"); lua.Error("This component is not available to the LuaAPI");
return 0; return 0;
@ -195,29 +160,16 @@ namespace Ndk
// Components functions // Components functions
m_componentBinding.resize(BaseComponent::GetMaxComponentIndex() + 1); m_componentBinding.resize(BaseComponent::GetMaxComponentIndex());
EnableComponentBinding<NodeComponent>(); BindComponent<NodeComponent>("Node");
EnableComponentBinding<VelocityComponent>(); BindComponent<VelocityComponent>("Velocity");
#ifndef NDK_SERVER #ifndef NDK_SERVER
EnableComponentBinding<GraphicsComponent>(); BindComponent<GraphicsComponent>("Graphics");
#endif #endif
} }
template<typename T>
void LuaBinding::EnableComponentBinding()
{
ComponentBinding binding;
binding.adder = &AddComponentOfType<T>;
binding.getter = &PushComponentOfType<T>;
binding.valid = true;
NazaraAssert(T::componentIndex < m_componentBinding.size(), "Component index is over component binding size");
m_componentBinding[T::componentIndex] = std::move(binding);
}
void LuaBinding::RegisterSDK(Nz::LuaInstance& instance) void LuaBinding::RegisterSDK(Nz::LuaInstance& instance)
{ {
// Classes // Classes
@ -235,18 +187,16 @@ namespace Ndk
// Enums // Enums
// ComponentType (fake enumeration to expose component indexes) // ComponentType (fake enumeration to expose component indexes)
instance.PushTable(); instance.PushTable(0, m_componentBinding.size());
{ {
#ifndef NDK_SERVER for (const ComponentBinding& entry : m_componentBinding)
instance.PushInteger(GraphicsComponent::componentIndex); {
instance.SetField("Graphics"); if (entry.name.IsEmpty())
#endif continue;
instance.PushInteger(NodeComponent::componentIndex); instance.PushInteger(entry.index);
instance.SetField("Node"); instance.SetField(entry.name);
}
instance.PushInteger(VelocityComponent::componentIndex);
instance.SetField("Velocity");
} }
instance.SetGlobal("ComponentType"); instance.SetGlobal("ComponentType");
} }