diff --git a/SDK/include/NDK/LuaAPI.inl b/SDK/include/NDK/LuaAPI.inl index 708577e0e..903e76c05 100644 --- a/SDK/include/NDK/LuaAPI.inl +++ b/SDK/include/NDK/LuaAPI.inl @@ -102,6 +102,36 @@ namespace Nz return 1; } + inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Rectd* rect, TypeTag) + { + instance.CheckType(index, LuaType_Table); + + rect->x = instance.CheckField("x", index); + rect->y = instance.CheckField("y", index); + rect->width = instance.CheckField("width", index); + rect->height = instance.CheckField("height", index); + + return 1; + } + + inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Rectf* rect, TypeTag) + { + Rectd rectDouble; + unsigned int ret = LuaImplQueryArg(instance, index, &rectDouble, TypeTag()); + + rect->Set(rectDouble); + return ret; + } + + inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Rectui* rect, TypeTag) + { + Rectd rectDouble; + unsigned int ret = LuaImplQueryArg(instance, index, &rectDouble, TypeTag()); + + rect->Set(rectDouble); + return ret; + } + inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Quaterniond* quat, TypeTag) { switch (instance.GetType(index)) @@ -341,6 +371,24 @@ namespace Nz return 1; } + inline int LuaImplReplyVal(const LuaInstance& instance, Rectd&& val, TypeTag) + { + instance.PushInstance("Rect", val); + return 1; + } + + inline int LuaImplReplyVal(const LuaInstance& instance, Rectf&& val, TypeTag) + { + instance.PushInstance("Rect", val); + return 1; + } + + inline int LuaImplReplyVal(const LuaInstance& instance, Rectui&& val, TypeTag) + { + instance.PushInstance("Rect", val); + return 1; + } + inline int LuaImplReplyVal(const LuaInstance& instance, Vector2d&& val, TypeTag) { instance.PushInstance("Vector2", val); diff --git a/SDK/include/NDK/LuaBinding.hpp b/SDK/include/NDK/LuaBinding.hpp index 66bb88978..265e9e452 100644 --- a/SDK/include/NDK/LuaBinding.hpp +++ b/SDK/include/NDK/LuaBinding.hpp @@ -69,6 +69,7 @@ namespace Ndk // Math Nz::LuaClass eulerAnglesClass; Nz::LuaClass quaternionClass; + Nz::LuaClass rectClass; Nz::LuaClass vector2dClass; Nz::LuaClass vector3dClass; diff --git a/SDK/src/NDK/LuaBinding.cpp b/SDK/src/NDK/LuaBinding.cpp index a23311075..33c70dbe1 100644 --- a/SDK/src/NDK/LuaBinding.cpp +++ b/SDK/src/NDK/LuaBinding.cpp @@ -14,6 +14,7 @@ namespace Ndk // Math eulerAnglesClass("EulerAngles"), quaternionClass("Quaternion"), + rectClass("Rect"), vector2dClass("Vector2"), vector3dClass("Vector3"), diff --git a/SDK/src/NDK/LuaBinding_Math.cpp b/SDK/src/NDK/LuaBinding_Math.cpp index 99767a1e2..cf5454450 100644 --- a/SDK/src/NDK/LuaBinding_Math.cpp +++ b/SDK/src/NDK/LuaBinding_Math.cpp @@ -149,6 +149,152 @@ namespace Ndk return false; }); + /*********************************** Nz::Rect **********************************/ + rectClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::Rectd* rect) + { + unsigned int argCount = std::min(lua.GetStackTop(), 4U); + switch (argCount) + { + case 0: + case 4: + PlacementNew(rect, lua.CheckNumber(1, 0.0), lua.CheckNumber(2, 0.0), lua.CheckNumber(3, 0.0), lua.CheckNumber(4, 0.0)); + return true; + + case 1: + { + if (lua.IsOfType(1, "Rect")) + PlacementNew(rect, *static_cast(lua.ToUserdata(1))); + else if (lua.IsOfType(1, Nz::LuaType_Table)) + { + // TODO => Faire sans avoir à mettre de nom dans la table et prendre les éléments un à un pour créer le Rectd + PlacementNew(rect, lua.CheckField("x", 1), + lua.CheckField("y", 1), + lua.CheckField("width", 1), + lua.CheckField("height", 1)); + } + else if (lua.IsOfType(1, "Vector2")) + PlacementNew(rect, *static_cast(lua.ToUserdata(1))); + else + break; + + return true; + } + + case 2: + { + if (lua.IsOfType(1, Nz::LuaType_Number) && lua.IsOfType(2, Nz::LuaType_Number)) + PlacementNew(rect, lua.CheckNumber(1), lua.CheckNumber(2)); + else if (lua.IsOfType(1, "Vector2") && lua.IsOfType(2, "Vector2")) + PlacementNew(rect, *static_cast(lua.ToUserdata(1)), *static_cast(lua.ToUserdata(2))); + else + break; + + return true; + } + } + + lua.Error("No matching overload for Rect constructor"); + return false; + }); + + rectClass.BindMethod("__tostring", &Nz::Rectd::ToString); + + rectClass.SetGetter([] (Nz::LuaInstance& lua, Nz::Rectd& instance) + { + switch (lua.GetType(1)) + { + case Nz::LuaType_Number: + { + long long index = lua.CheckInteger(1); + if (index < 1 || index > 4) + return false; + + lua.Push(instance[index - 1]); + return true; + } + + case Nz::LuaType_String: + { + std::size_t length; + const char* xywh = lua.CheckString(1, &length); + + if (length != 1) + break; + + switch (xywh[0]) + { + case 'x': + lua.Push(instance.x); + return true; + + case 'y': + lua.Push(instance.y); + return true; + + case 'w': + lua.Push(instance.width); + return true; + + case 'h': + lua.Push(instance.height); + return true; + } + break; + } + } + + return false; + }); + + rectClass.SetSetter([] (Nz::LuaInstance& lua, Nz::Rectd& instance) + { + switch (lua.GetType(1)) + { + case Nz::LuaType_Number: + { + long long index = lua.CheckInteger(1); + if (index < 1 || index > 4) + return false; + + instance[index - 1] = lua.CheckNumber(2); + return true; + } + + case Nz::LuaType_String: + { + std::size_t length; + const char* xywh = lua.CheckString(1, &length); + + if (length != 1) + break; + + double value = lua.CheckNumber(2); + + switch (xywh[0]) + { + case 'x': + instance.x = value; + return true; + + case 'y': + instance.y = value; + return true; + + case 'w': + instance.width = value; + return true; + + case 'h': + instance.height = value; + return true; + } + break; + } + } + + return false; + }); + /*********************************** Nz::Quaternion **********************************/ quaternionClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::Quaterniond* quaternion) { @@ -494,6 +640,7 @@ namespace Ndk { eulerAnglesClass.Register(instance); quaternionClass.Register(instance); + rectClass.Register(instance); vector2dClass.Register(instance); vector3dClass.Register(instance); }