From 9298692839dde3ef52ff2869b7296ff62561455c Mon Sep 17 00:00:00 2001 From: turanszkij Date: Sun, 30 Aug 2015 13:57:07 +0200 Subject: [PATCH] updated lua bindings --- WickedEngine/Matrix_BindLua.h | 4 +- WickedEngine/Vector_BindLua.h | 4 +- WickedEngine/wiLoader.h | 2 +- WickedEngine/wiLoader_BindLua.cpp | 209 +++++++++++++++++++++++++++--- WickedEngine/wiLoader_BindLua.h | 6 +- WickedEngine/wiLua.cpp | 4 + WickedEngine/wiLua.h | 1 + 7 files changed, 208 insertions(+), 22 deletions(-) diff --git a/WickedEngine/Matrix_BindLua.h b/WickedEngine/Matrix_BindLua.h index 19da72b60..31c8f6a30 100644 --- a/WickedEngine/Matrix_BindLua.h +++ b/WickedEngine/Matrix_BindLua.h @@ -5,9 +5,9 @@ class Matrix_BindLua { -private: - DirectX::XMMATRIX matrix; public: + DirectX::XMMATRIX matrix; + static const char className[]; static Luna::FunctionType methods[]; static Luna::PropertyType properties[]; diff --git a/WickedEngine/Vector_BindLua.h b/WickedEngine/Vector_BindLua.h index 0fba405ad..902e696fe 100644 --- a/WickedEngine/Vector_BindLua.h +++ b/WickedEngine/Vector_BindLua.h @@ -6,9 +6,9 @@ class Vector_BindLua { -private: - DirectX::XMVECTOR vector; public: + DirectX::XMVECTOR vector; + static const char className[]; static Luna::FunctionType methods[]; static Luna::PropertyType properties[]; diff --git a/WickedEngine/wiLoader.h b/WickedEngine/wiLoader.h index 5a1095b0c..6410ce5b9 100644 --- a/WickedEngine/wiLoader.h +++ b/WickedEngine/wiLoader.h @@ -441,7 +441,7 @@ struct Transform : public Node, public Load_Debug_Properties //detach from parent void detach(int erasefromParent = 1); void applyTransform(int t=1, int r=1, int s=1); - void transform(const XMFLOAT3& t = XMFLOAT3(0,0,0), const XMFLOAT4& r = XMFLOAT4(0,0,0,0), const XMFLOAT3& s = XMFLOAT3(0,0,0)); + void transform(const XMFLOAT3& t = XMFLOAT3(0,0,0), const XMFLOAT4& r = XMFLOAT4(0,0,0,1), const XMFLOAT3& s = XMFLOAT3(1,1,1)); void transform(const XMMATRIX& m = XMMatrixIdentity()); }; struct Cullable diff --git a/WickedEngine/wiLoader_BindLua.cpp b/WickedEngine/wiLoader_BindLua.cpp index dc679ba74..34d6dff65 100644 --- a/WickedEngine/wiLoader_BindLua.cpp +++ b/WickedEngine/wiLoader_BindLua.cpp @@ -1,4 +1,6 @@ #include "wiLoader_BindLua.h" +#include "Vector_BindLua.h" +#include "Matrix_BindLua.h" namespace wiLoader_BindLua { @@ -28,7 +30,6 @@ Luna::PropertyType Node_BindLua::properties[] = { Node_BindLua::Node_BindLua(Node* node) { - node = node; this->node = node; } Node_BindLua::Node_BindLua(lua_State *L) @@ -86,10 +87,14 @@ Luna::FunctionType Transform_BindLua::methods[] = { lunamethod(Transform_BindLua, GetName), lunamethod(Transform_BindLua, SetName), - lunamethod(Transform_BindLua, DoTransform), lunamethod(Transform_BindLua, AttachTo), lunamethod(Transform_BindLua, Detach), + lunamethod(Transform_BindLua, DetachChild), lunamethod(Transform_BindLua, ApplyTransform), + lunamethod(Transform_BindLua, Scale), + lunamethod(Transform_BindLua, Rotate), + lunamethod(Transform_BindLua, Translate), + lunamethod(Transform_BindLua, MatrixTransform), { NULL, NULL } }; Luna::PropertyType Transform_BindLua::properties[] = { @@ -103,26 +108,188 @@ Transform_BindLua::Transform_BindLua(Transform* transform) } Transform_BindLua::Transform_BindLua(lua_State *L) { + Node_BindLua(); transform = new Transform(); } Transform_BindLua::~Transform_BindLua() { } -int Transform_BindLua::DoTransform(lua_State* L) -{ - return 0; -} int Transform_BindLua::AttachTo(lua_State* L) { + int argc = wiLua::SGetArgCount(L); + if (argc > 1) + { + Transform_BindLua* parent = Luna::lightcheck(L, 2); + if (parent == nullptr) + parent = Luna::lightcheck(L, 2); + if (parent == nullptr) + parent = Luna::lightcheck(L, 2); + if (parent != nullptr) + { + int s = 1, r = 1, t = 1; + if (argc > 2) + { + t = wiLua::SGetInt(L, 3); + if (argc > 3) + { + r = wiLua::SGetInt(L, 4); + if (argc > 4) + { + s = wiLua::SGetInt(L, 5); + } + } + } + transform->attachTo(parent->transform,t,r,s); + } + else + { + wiLua::SError(L, "AttachTo(Transform parent, opt boolean translation,rotation,scale) argument is not a Transform!"); + } + } + else + { + wiLua::SError(L, "AttachTo(Transform parent, opt boolean translation,rotation,scale) not enough arguments!"); + } return 0; } int Transform_BindLua::Detach(lua_State* L) { + int argc = wiLua::SGetArgCount(L); + int eraseFromParent = 1; + if (argc > 1) + { + eraseFromParent = wiLua::SGetInt(L, 2); + } + transform->detach(eraseFromParent); + return 0; +} +int Transform_BindLua::DetachChild(lua_State* L) +{ + int argc = wiLua::SGetArgCount(L); + if (argc > 1) + { + Transform_BindLua* child = Luna::lightcheck(L, 2); + if (child == nullptr) + child = Luna::lightcheck(L, 2); + if (child == nullptr) + child = Luna::lightcheck(L, 2); + if (child != nullptr) + { + transform->detachChild(child->transform); + return 0; + } + } + transform->detachChild(); return 0; } int Transform_BindLua::ApplyTransform(lua_State* L) { + int argc = wiLua::SGetArgCount(L); + int s = 1, r = 1, t = 1; + if (argc > 1) + { + t = wiLua::SGetInt(L, 2); + if (argc > 2) + { + r = wiLua::SGetInt(L, 3); + if (argc > 3) + { + s = wiLua::SGetInt(L, 4); + } + } + } + transform->applyTransform(t, r, s); + return 0; +} +int Transform_BindLua::Scale(lua_State* L) +{ + int argc = wiLua::SGetArgCount(L); + if (argc > 1) + { + Vector_BindLua* v = Luna::lightcheck(L, 2); + if (v != nullptr) + { + XMFLOAT3 scale; + XMStoreFloat3(&scale, v->vector); + transform->transform(XMFLOAT3(0, 0, 0), XMFLOAT4(0, 0, 0, 1), scale); + } + else + { + wiLua::SError(L, "Scale(Vector vector) argument is not a vector!"); + } + } + else + { + wiLua::SError(L, "Scale(Vector vector) not enough arguments!"); + } + return 0; +} +int Transform_BindLua::Rotate(lua_State* L) +{ + int argc = wiLua::SGetArgCount(L); + if (argc > 1) + { + Vector_BindLua* v = Luna::lightcheck(L, 2); + if (v != nullptr) + { + XMFLOAT4 quaternion; + XMStoreFloat4(&quaternion, XMQuaternionRotationRollPitchYawFromVector(v->vector)); + transform->transform(XMFLOAT3(0, 0, 0), quaternion); + } + else + { + wiLua::SError(L, "Rotate(Vector vectorRollPitchYaw) argument is not a vector!"); + } + } + else + { + wiLua::SError(L, "Rotate(Vector vectorRollPitchYaw) not enough arguments!"); + } + return 0; +} +int Transform_BindLua::Translate(lua_State* L) +{ + int argc = wiLua::SGetArgCount(L); + if (argc > 1) + { + Vector_BindLua* v = Luna::lightcheck(L, 2); + if (v != nullptr) + { + XMFLOAT3 translate; + XMStoreFloat3(&translate, v->vector); + transform->transform(translate); + } + else + { + wiLua::SError(L, "Translate(Vector vector) argument is not a vector!"); + } + } + else + { + wiLua::SError(L, "Translate(Vector vector) not enough arguments!"); + } + return 0; +} +int Transform_BindLua::MatrixTransform(lua_State* L) +{ + int argc = wiLua::SGetArgCount(L); + if (argc > 1) + { + Matrix_BindLua* m = Luna::lightcheck(L, 2); + if (m != nullptr) + { + transform->transform(m->matrix); + } + else + { + wiLua::SError(L, "MatrixTransform(Matrix matrix) argument is not a matrix!"); + } + } + else + { + wiLua::SError(L, "MatrixTransform(Matrix matrix) not enough arguments!"); + } return 0; } @@ -145,10 +312,14 @@ Luna::FunctionType Object_BindLua::methods[] = { lunamethod(Object_BindLua, GetName), lunamethod(Object_BindLua, SetName), - lunamethod(Object_BindLua, DoTransform), - lunamethod(Object_BindLua, AttachTo), - lunamethod(Object_BindLua, Detach), - lunamethod(Object_BindLua, ApplyTransform), + lunamethod(Transform_BindLua, AttachTo), + lunamethod(Transform_BindLua, Detach), + lunamethod(Transform_BindLua, DetachChild), + lunamethod(Transform_BindLua, ApplyTransform), + lunamethod(Transform_BindLua, Scale), + lunamethod(Transform_BindLua, Rotate), + lunamethod(Transform_BindLua, Translate), + lunamethod(Transform_BindLua, MatrixTransform), lunamethod(Object_BindLua, SetTransparency), lunamethod(Object_BindLua, GetTransparency), @@ -163,11 +334,12 @@ Luna::PropertyType Object_BindLua::properties[] = { Object_BindLua::Object_BindLua(Object* object) { node = object; + transform = object; this->object = object; } Object_BindLua::Object_BindLua(lua_State *L) { - node = nullptr; + Transform_BindLua(); object = nullptr; } Object_BindLua::~Object_BindLua() @@ -250,10 +422,14 @@ Luna::FunctionType Armature_BindLua::methods[] = { lunamethod(Armature_BindLua, GetName), lunamethod(Armature_BindLua, SetName), - lunamethod(Armature_BindLua, DoTransform), - lunamethod(Armature_BindLua, AttachTo), - lunamethod(Armature_BindLua, Detach), - lunamethod(Armature_BindLua, ApplyTransform), + lunamethod(Transform_BindLua, AttachTo), + lunamethod(Transform_BindLua, Detach), + lunamethod(Transform_BindLua, DetachChild), + lunamethod(Transform_BindLua, ApplyTransform), + lunamethod(Transform_BindLua, Scale), + lunamethod(Transform_BindLua, Rotate), + lunamethod(Transform_BindLua, Translate), + lunamethod(Transform_BindLua, MatrixTransform), lunamethod(Armature_BindLua, GetActions), lunamethod(Armature_BindLua, GetBones), @@ -267,11 +443,12 @@ Luna::PropertyType Armature_BindLua::properties[] = { Armature_BindLua::Armature_BindLua(Armature* armature) { node = armature; + transform = armature; this->armature = armature; } Armature_BindLua::Armature_BindLua(lua_State *L) { - node = nullptr; + Transform_BindLua(); armature = nullptr; } Armature_BindLua::~Armature_BindLua() diff --git a/WickedEngine/wiLoader_BindLua.h b/WickedEngine/wiLoader_BindLua.h index c86e4eea4..ffd2f9264 100644 --- a/WickedEngine/wiLoader_BindLua.h +++ b/WickedEngine/wiLoader_BindLua.h @@ -40,10 +40,14 @@ public: Transform_BindLua(lua_State *L); ~Transform_BindLua(); - int DoTransform(lua_State* L); int AttachTo(lua_State* L); int Detach(lua_State* L); + int DetachChild(lua_State* L); int ApplyTransform(lua_State* L); + int Scale(lua_State* L); + int Rotate(lua_State* L); + int Translate(lua_State* L); + int MatrixTransform(lua_State* L); static void Bind(); }; diff --git a/WickedEngine/wiLua.cpp b/WickedEngine/wiLua.cpp index c6154b101..a2782b7fb 100644 --- a/WickedEngine/wiLua.cpp +++ b/WickedEngine/wiLua.cpp @@ -234,6 +234,10 @@ string wiLua::SGetString(lua_State* L, int stackpos) return str; return string(""); } +bool wiLua::SIsString(lua_State* L, int stackpos) +{ + return lua_isstring(L, stackpos) != 0; +} int wiLua::SGetInt(lua_State* L, int stackpos) { return static_cast(SGetLongLong(L,stackpos)); diff --git a/WickedEngine/wiLua.h b/WickedEngine/wiLua.h index ddce38d56..0fb737965 100644 --- a/WickedEngine/wiLua.h +++ b/WickedEngine/wiLua.h @@ -67,6 +67,7 @@ public: //get string from lua on stack position static string SGetString(lua_State* L, int stackpos); + static bool SIsString(lua_State* L, int stackpos); //get int from lua on stack position static int SGetInt(lua_State* L, int stackpos); //get long from lua on stack position