diff options
Diffstat (limited to 'Runtime/Lua')
-rw-r--r-- | Runtime/Lua/LuaBind/LuaBindRef.cpp | 22 | ||||
-rw-r--r-- | Runtime/Lua/LuaBind/LuaBindRef.h | 7 | ||||
-rw-r--r-- | Runtime/Lua/LuaBind/LuaBindState.cpp | 6 | ||||
-rw-r--r-- | Runtime/Lua/LuaHelper.cpp | 132 |
4 files changed, 157 insertions, 10 deletions
diff --git a/Runtime/Lua/LuaBind/LuaBindRef.cpp b/Runtime/Lua/LuaBind/LuaBindRef.cpp index d0f2766..313824e 100644 --- a/Runtime/Lua/LuaBind/LuaBindRef.cpp +++ b/Runtime/Lua/LuaBind/LuaBindRef.cpp @@ -3,6 +3,12 @@ namespace LuaBind { + UniversalRef::UniversalRef(RefMode mode) + : mRefID(LUA_NOREF) + , mMode(mode) + , mOwner(NULL) // 延后设置 + { + } UniversalRef::UniversalRef(LuaBind::VM* vm, RefMode mode) : mRefID(LUA_NOREF) @@ -43,7 +49,11 @@ namespace LuaBind void UniversalRef::SetRef(LuaBind::State& state, int idx) { - assert(state.GetVM() == mOwner); + //assert(state.GetVM() == mOwner); + // 延后设置vm + if (mOwner == NULL) { + mOwner = state.GetVM(); + } VM* vm = mOwner; if (!vm) return; @@ -83,11 +93,21 @@ namespace LuaBind return true; } + StrongRef::StrongRef() + : UniversalRef(STRONG_REF) + { + } + StrongRef::StrongRef(LuaBind::VM* vm) : UniversalRef(vm, STRONG_REF) { } + WeakRef::WeakRef() + : UniversalRef(WEAK_REF) + { + } + WeakRef::WeakRef(LuaBind::VM* vm) : UniversalRef(vm, WEAK_REF) { diff --git a/Runtime/Lua/LuaBind/LuaBindRef.h b/Runtime/Lua/LuaBind/LuaBindRef.h index 793559e..a19e5bf 100644 --- a/Runtime/Lua/LuaBind/LuaBindRef.h +++ b/Runtime/Lua/LuaBind/LuaBindRef.h @@ -18,6 +18,7 @@ namespace LuaBind WEAK_REF }; + UniversalRef(RefMode mode = STRONG_REF); // 延后到SetRef设置vm UniversalRef(LuaBind::VM* vm, RefMode mode = STRONG_REF); virtual ~UniversalRef(); @@ -46,6 +47,9 @@ namespace LuaBind class StrongRef: public UniversalRef { public: + // 延后到SetRef设置vm + StrongRef(); + StrongRef(LuaBind::VM* vm); }; @@ -54,6 +58,9 @@ namespace LuaBind class WeakRef : public UniversalRef { public: + // 延后到SetRef设置vm + WeakRef(); + WeakRef(LuaBind::VM* vm); }; diff --git a/Runtime/Lua/LuaBind/LuaBindState.cpp b/Runtime/Lua/LuaBind/LuaBindState.cpp index 9210768..384cba2 100644 --- a/Runtime/Lua/LuaBind/LuaBindState.cpp +++ b/Runtime/Lua/LuaBind/LuaBindState.cpp @@ -602,6 +602,12 @@ namespace LuaBind case '+': if (type == LUA_TNIL) expected = false; break; + + // nil + case '!': + if (type != LUA_TNIL) expected = false; + break; + } if (!expected) { diff --git a/Runtime/Lua/LuaHelper.cpp b/Runtime/Lua/LuaHelper.cpp index a47d528..e7247c0 100644 --- a/Runtime/Lua/LuaHelper.cpp +++ b/Runtime/Lua/LuaHelper.cpp @@ -1,27 +1,141 @@ #include "LuaHelper.h"
+#include "Runtime/Math/Vector2.h"
+#include "Runtime/Math/Vector3.h"
+#include "Runtime/Math/Vector4.h"
+#include "Runtime/Math/Matrix44.h"
+
using namespace LuaBind;
template <>
-Rect State::GetValue < Rect >(int idx, const Rect value)
+Internal::Rect State::GetValue < Internal::Rect >(int idx, const Internal::Rect value)
{
- Rect rect;
- rect.x = GetField<float>(idx, 1, 0);
- rect.y = GetField<float>(idx, 2, 0);
- rect.width = GetField<float>(idx, 3, 0);
- rect.height = GetField<float>(idx, 4, 0);
+ Internal::Rect rect = value;
+ if (LuaHelper::IsType(*this, "GameLab.Engine.Math.Rect", idx))
+ {
+ rect.x = GetField<float>(idx, "x", 0);
+ rect.y = GetField<float>(idx, "y", 0);
+ rect.width = GetField<float>(idx, "z", 0);
+ rect.height = GetField<float>(idx, "w", 0);
+ }
+ else
+ {
+ rect.x = GetField<float>(idx, 1, 0);
+ rect.y = GetField<float>(idx, 2, 0);
+ rect.width = GetField<float>(idx, 3, 0);
+ rect.height = GetField<float>(idx, 4, 0);
+ }
return rect;
}
template <>
Internal::Vector2 State::GetValue < Internal::Vector2 >(int idx, const Internal::Vector2 value)
{
- Internal::Vector2 v2;
- v2.x = GetField<float>(idx, 1, 0);
- v2.y = GetField<float>(idx, 2, 0);
+ Internal::Vector2 v2 = value;
+ if (LuaHelper::IsType(*this, "GameLab.Engine.Math.Vector2", idx))
+ {
+ v2.x = GetField<float>(idx, "x", 0);
+ v2.y = GetField<float>(idx, "y", 0);
+ }
+ else
+ {
+ v2.x = GetField<float>(idx, 1, 0);
+ v2.y = GetField<float>(idx, 2, 0);
+ }
return v2;
}
+template <>
+Internal::Vector3 State::GetValue < Internal::Vector3 >(int idx, const Internal::Vector3 value)
+{
+ Internal::Vector3 v3 = value;
+ if (LuaHelper::IsType(*this, "GameLab.Engine.Math.Vector3", idx))
+ {
+ v3.x = GetField<float>(idx, "x", 0);
+ v3.y = GetField<float>(idx, "y", 0);
+ v3.z = GetField<float>(idx, "z", 0);
+ }
+ else
+ {
+ v3.x = GetField<float>(idx, 1, 0);
+ v3.y = GetField<float>(idx, 2, 0);
+ v3.z = GetField<float>(idx, 3, 0);
+ }
+ return v3;
+}
+
+template <>
+Internal::Vector4 State::GetValue < Internal::Vector4 >(int idx, const Internal::Vector4 value)
+{
+ Internal::Vector4 v4 = value;
+ if (LuaHelper::IsType(*this, "GameLab.Engine.Math.Vector4", idx))
+ {
+ v4.x = GetField<float>(idx, "x", 0);
+ v4.y = GetField<float>(idx, "y", 0);
+ v4.z = GetField<float>(idx, "z", 0);
+ v4.w = GetField<float>(idx, "w", 0);
+ }
+ else
+ {
+ v4.x = GetField<float>(idx, 1, 0);
+ v4.y = GetField<float>(idx, 2, 0);
+ v4.z = GetField<float>(idx, 3, 0);
+ v4.w = GetField<float>(idx, 4, 0);
+ }
+ return v4;
+}
+
+template <>
+Internal::Matrix44 State::GetValue < Internal::Matrix44 >(int idx, const Internal::Matrix44 value)
+{
+ Internal::Matrix44 m4 = value;
+ if (LuaHelper::IsType(*this, "GameLab.Engine.Math.Matrix44", idx))
+ {
+ m4.m[0][0] = GetField<float>(idx, "m00", 0);
+ m4.m[0][1] = GetField<float>(idx, "m01", 0);
+ m4.m[0][2] = GetField<float>(idx, "m02", 0);
+ m4.m[0][3] = GetField<float>(idx, "m03", 0);
+
+ m4.m[1][0] = GetField<float>(idx, "m10", 0);
+ m4.m[1][1] = GetField<float>(idx, "m11", 0);
+ m4.m[1][2] = GetField<float>(idx, "m12", 0);
+ m4.m[1][3] = GetField<float>(idx, "m13", 0);
+
+ m4.m[2][0] = GetField<float>(idx, "m20", 0);
+ m4.m[2][1] = GetField<float>(idx, "m21", 0);
+ m4.m[2][2] = GetField<float>(idx, "m22", 0);
+ m4.m[2][3] = GetField<float>(idx, "m23", 0);
+
+ m4.m[3][0] = GetField<float>(idx, "m30", 0);
+ m4.m[3][1] = GetField<float>(idx, "m31", 0);
+ m4.m[3][2] = GetField<float>(idx, "m32", 0);
+ m4.m[3][3] = GetField<float>(idx, "m33", 0);
+ }
+ else
+ {
+ m4.m[0][0] = GetField<float>(idx, 1, 0);
+ m4.m[0][1] = GetField<float>(idx, 2, 0);
+ m4.m[0][2] = GetField<float>(idx, 3, 0);
+ m4.m[0][3] = GetField<float>(idx, 4, 0);
+
+ m4.m[1][0] = GetField<float>(idx, 5, 0);
+ m4.m[1][1] = GetField<float>(idx, 6, 0);
+ m4.m[1][2] = GetField<float>(idx, 7, 0);
+ m4.m[1][3] = GetField<float>(idx, 8, 0);
+
+ m4.m[2][0] = GetField<float>(idx, 9, 0);
+ m4.m[2][1] = GetField<float>(idx, 10, 0);
+ m4.m[2][2] = GetField<float>(idx, 11, 0);
+ m4.m[2][3] = GetField<float>(idx, 12, 0);
+
+ m4.m[3][0] = GetField<float>(idx, 13, 0);
+ m4.m[3][1] = GetField<float>(idx, 14, 0);
+ m4.m[3][2] = GetField<float>(idx, 15, 0);
+ m4.m[3][3] = GetField<float>(idx, 16, 0);
+ }
+ return m4;
+}
+
int LuaHelper::Call(const char* func, const char* params, ...)
{
return 1;
|