diff options
author | chai <chaifix@163.com> | 2021-11-13 17:29:45 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-11-13 17:29:45 +0800 |
commit | 73dc62da054cbc18afc694f803ebff7fe24f4eca (patch) | |
tree | 5ed1fa0166891569e3dd6f3fa9d2ec2a83754624 | |
parent | 9b1f8214eea0c86d41f903a5feba9aac78603df1 (diff) |
* split
18 files changed, 268 insertions, 110 deletions
diff --git a/Data/DefaultContent/Libraries/GameLab/Debug.lua b/Data/DefaultContent/Libraries/GameLab/Debug.lua deleted file mode 100644 index 9f68160..0000000 --- a/Data/DefaultContent/Libraries/GameLab/Debug.lua +++ /dev/null @@ -1,6 +0,0 @@ - -local c_log = GameLab.Debug.Log -local c_log_editor = GameLab.Debug.LogEditor -local c_log_warning = GameLab.Debug.LogWarning -local c_log_error = GameLab.Debug.LogError - diff --git a/Data/DefaultContent/Libraries/GameLab/Debug/init.lua b/Data/DefaultContent/Libraries/GameLab/Debug/init.lua index 47a507d..0b6bd7c 100644 --- a/Data/DefaultContent/Libraries/GameLab/Debug/init.lua +++ b/Data/DefaultContent/Libraries/GameLab/Debug/init.lua @@ -1,5 +1,9 @@ local Debug = GameLab.Debug or {}
GameLab.Debug = Debug
+local c_log = GameLab.Debug.Log
+local c_log_editor = GameLab.Debug.LogEditor
+local c_log_warning = GameLab.Debug.LogWarning
+local c_log_error = GameLab.Debug.LogError
return Debug
\ No newline at end of file diff --git a/Data/DefaultContent/Libraries/GameLab/Engine/GUI/IMGUI.lua b/Data/DefaultContent/Libraries/GameLab/Engine/GUI/IMGUI.lua index 33299a2..4c10780 100644 --- a/Data/DefaultContent/Libraries/GameLab/Engine/GUI/IMGUI.lua +++ b/Data/DefaultContent/Libraries/GameLab/Engine/GUI/IMGUI.lua @@ -25,11 +25,11 @@ GUI.EndOnGUI = function() end
GUI.BeginFrame = function()
-
+ imgui.hotControl = 0
end
GUI.EndFrame = function()
-
+ imgui.hotControl = 0
end
GUI.SetHotControl = function(id)
@@ -46,7 +46,7 @@ end GUI.Button = function(rect, content )
local id = GUI.GetControlID()
-
+
end
GUI.Toggle = function()
diff --git a/Data/DefaultContent/Libraries/GameLab/Engine/GUI/init.lua b/Data/DefaultContent/Libraries/GameLab/Engine/GUI/init.lua index 4424a2a..d8bd558 100644 --- a/Data/DefaultContent/Libraries/GameLab/Engine/GUI/init.lua +++ b/Data/DefaultContent/Libraries/GameLab/Engine/GUI/init.lua @@ -1,3 +1,8 @@ +local GUI = GameLab.Engine.GUI or {}
+GameLab.Engine.GUI = GUI
+
local import = GameLab.import(...)
import("imgui")
+
+return GUI
\ No newline at end of file diff --git a/Data/DefaultContent/Libraries/GameLab/Engine/Math/Rect.lua b/Data/DefaultContent/Libraries/GameLab/Engine/Math/Rect.lua index e52f8f0..5284cf9 100644 --- a/Data/DefaultContent/Libraries/GameLab/Engine/Math/Rect.lua +++ b/Data/DefaultContent/Libraries/GameLab/Engine/Math/Rect.lua @@ -8,10 +8,17 @@ Rect.Ctor = function(self, x, y, width, height) end
Rect.Set = function(self, rect)
- self.x = rect.x or rect[1]
- self.y = rect.y or rect[2]
- self.z = rect.z or rect[3]
- self.w = rect.w or rect[4]
+ if rect._type and rect._type.fullName == "GameLab.Engine.Math.Rect" then
+ self.x = rect.x or rect.x
+ self.y = rect.y or rect.y
+ self.width = rect.z or rect.width
+ self.height = rect.w or rect.height
+ else
+ self.x = rect.x or rect[1]
+ self.y = rect.y or rect[2]
+ self.width = rect.z or rect[3]
+ self.height = rect.w or rect[4]
+ end
end
Rect.GetPosition = function(self)
diff --git a/Data/DefaultContent/Libraries/GameLab/Engine/Math/init.lua b/Data/DefaultContent/Libraries/GameLab/Engine/Math/init.lua index 5131b07..68934e5 100644 --- a/Data/DefaultContent/Libraries/GameLab/Engine/Math/init.lua +++ b/Data/DefaultContent/Libraries/GameLab/Engine/Math/init.lua @@ -14,4 +14,16 @@ import("Rect") GameLab.Debug.Log("GameLab.Engine.Math loaded")
+m.Max = function(a, b)
+ return a >= b and a or b
+end
+
+m.Min = function(a, b)
+ return a <= b and a or b
+end
+
+m.Clamp = function(v, min, max)
+ return m.Min(m.Max(v, min), max)
+end
+
return m
\ No newline at end of file diff --git a/Data/Libraries/GameLab/Editor/Window/ContainerWindow.lua b/Data/Libraries/GameLab/Editor/Window/ContainerWindow.lua index caf3b37..1e75cdc 100644 --- a/Data/Libraries/GameLab/Editor/Window/ContainerWindow.lua +++ b/Data/Libraries/GameLab/Editor/Window/ContainerWindow.lua @@ -1,10 +1,13 @@ +local Debug = require("GameLab.Debug") +local Rect = require("GameLab.Engine.Math.Rect") + local NativeContainWidow = GameLab.Editor.Window.Internal.ContainerWindow local Window = GameLab.Editor.Window local ContainerWindow = GameLab.GlobalClass("GameLab.Editor.Window.ContainerWindow") ContainerWindow.Ctor = function(self, position, showMode, min, max) - self.m_Native = NativeContainWidow.New(position, showMode, min, max) + self.m_Native = NativeContainWidow.New(self, position, showMode, min, max) self.m_RootSplitWindow = Window.SplitWindow.New(Window.ESplitMode.Horizontal) end @@ -32,4 +35,21 @@ ContainerWindow.GetHeight = function(self) return self:GetSize().y end +ContainerWindow.OnSizeChanged = function(self) + if self.m_Native == nil then + return + end + local pos = self:GetSize() + local position = Rect.New() + position.x = 0 + position.y = 0 + position.width = pos.x + position.height = pos.y + self.m_RootSplitWindow:SetPosition(position) +end + +ContainerWindow.SetRootSplitWindow = function(self, sp) + self.m_RootSplitWindow = sp +end + return ContainerWindow
\ No newline at end of file diff --git a/Data/Libraries/GameLab/Editor/Window/GUIWindow.lua b/Data/Libraries/GameLab/Editor/Window/GUIWindow.lua index 6f6335b..51ee128 100644 --- a/Data/Libraries/GameLab/Editor/Window/GUIWindow.lua +++ b/Data/Libraries/GameLab/Editor/Window/GUIWindow.lua @@ -1,13 +1,13 @@ local GUIWindow = GameLab.GlobalClass("GameLab.Editor.Window.GUIWindow")
local NativeGUIWindow = GameLab.Editor.Window.Internal.GUIWindow
-local inspect = require("inspect")
-local Debug = require("GameLab.Debug")
-local GL = require("GameLab.Engine.GL")
-local Math = require("GameLab.Engine.Math")
-local Rendering = require("GameLab.Engine.Rendering")
-local Utils = require("GameLab.Utils")
-local Events = require("GameLab.Events")
+local inspect = require "inspect"
+local Debug = require "GameLab.Debug"
+local GL = require "GameLab.Engine.GL"
+local Math = require "GameLab.Engine.Math"
+local Rendering = require "GameLab.Engine.Rendering"
+local Utils = require "GameLab.Utils"
+local Events = require "GameLab.Events"
local Rect = Math.Rect
local Event = Events.Event
@@ -17,7 +17,8 @@ local i = 0 local col = {
{1, 0, 0, 1},
{1, 1, 0, 1},
- {1, 0, 1, 1},
+ {0, 0, 1, 1},
+ {0, 1, 1, 1},
}
GUIWindow.Ctor = function(self)
@@ -42,7 +43,7 @@ end GUIWindow.SetPosition = function(self, pos)
self.m_Position:Set(pos)
- self.m_Native:SetPosition(pos)
+ self.m_Native:SetPosition({pos.x, pos.y, pos.width, pos.height})
end
GUIWindow.GetPosition = function(self)
@@ -58,9 +59,9 @@ GUIWindow.OnGUI = function(self) local event = Event.current
- if self.m_SplitWindow then
+ if self.m_SplitWindow ~= nil and event ~= nil then
local e = Events.CopyEvent(event)
- e.mousePosition:Add(self.m_Position:GetPosition())
+ e.mousePosition:Add(self.m_Position:GetPosition()) -- 坐标转换到全局containerWindow的坐标
self.m_SplitWindow:DoSplit(e)
end
end
diff --git a/Data/Libraries/GameLab/Editor/Window/SplitWindow.lua b/Data/Libraries/GameLab/Editor/Window/SplitWindow.lua index 9dd6446..8f126a9 100644 --- a/Data/Libraries/GameLab/Editor/Window/SplitWindow.lua +++ b/Data/Libraries/GameLab/Editor/Window/SplitWindow.lua @@ -1,31 +1,38 @@ local Debug = GameLab.Debug local EEventType = GameLab.Events.EEventType -local Rect = require("GameLab.Engine.Math.Rect") -local GUI = require("GameLab.Engine.GUI") +local Math = require "GameLab.Engine.Math" +local GUI = require "GameLab.Engine.GUI" +local inspect = require "inspect" + +local Rect = Math.Rect local Splitter = GameLab.Class("GameLab.Editor.Window.Internal.Splitter") Splitter.Ctor = function(self, value) - self.size = 10 + self.size = 20 self.value = value -- [0-1] 位置 end --- 抽象的窗口,用来处理布局 -local SplitWindow = GameLab.GlobalClass("GameLab.Editor.Window.SplitWindow") - local ESplitMode = GameLab.GlobalEnum("GameLab.Editor.Window.ESplitMode", { "Horizontal", -- 水平划分 "Vertical", -- 垂直划分 }) +-- 布局状态 +local SplitState = { + currentSplitter = nil +} + +-- 抽象的窗口,用来处理布局 +local SplitWindow = GameLab.GlobalClass("GameLab.Editor.Window.SplitWindow") + SplitWindow.Ctor = function(self, mode, splitter) + self.m_ContainerWindow = nil self.m_SplitMode = mode self.m_Parent = nil -- 父节点是一个split window或者空 - self.m_SubSplit = {} -- 子节点也是split windows - self.m_GUIWindow = {} -- 不包含subSplit的有一个GUIWindow + self.m_SubWindows = {} -- 子窗口,可以是SplitWindow或GUIWindow self.m_Splitter = {} - self.m_CurSplitter = nil - self.m_ContainerWindow = nil + self.m_Position = Rect.New() if splitter ~= nil and type(splitter) == "table" then for _, v in ipairs(splitter) do local sp = Splitter.New(v) @@ -43,50 +50,86 @@ SplitWindow.DoSplit = function(self, event) local id = GUI.GetControlID() if event.type == EEventType.MouseDown then - + local bHandled = false + for i, sp in ipairs(self.m_Splitter) do + local rect = Rect.New() + if self.m_SplitMode == ESplitMode.Horizontal then + local x = sp.value * self.m_Position.width + self.m_Position.x - sp.size / 2 + local w = sp.size + rect.x = x + rect.y = self.m_Position.y + rect.width = w + rect.height = self.m_Position.height + else + local y = sp.value * self.m_Position.height + self.m_Position.y - sp.size / 2 + local h = sp.size + rect.x = self.m_Position.x + rect.y = y + rect.width = self.m_Position.width + rect.height = h + end + if rect:Contains(event.mousePosition) then + SplitState.currentSplitter = sp + GUI.SetHotControl(id) + bHandled = true + break + end + end elseif event.type == EEventType.MouseDrag then - + local hot = GUI.GetHotControl() + if hot == id then + local splitter = SplitState.currentSplitter + if splitter ~= nil then + local mousePos = event.mousePosition + mousePos.x = mousePos.x - self.m_Position.x + mousePos.y = mousePos.y - self.m_Position.y + if self.m_SplitMode == ESplitMode.Horizontal then + splitter.value = mousePos.x / self.m_Position.width + else + splitter.value = mousePos.y / self.m_Position.height + end + splitter.value = Math.Clamp(splitter.value, 0, 1) + self:SetPosition(self.m_Position) + end + end elseif event.type == EEventType.MouseUp then - + if GUI.GetHotControl() == id then + SplitState.currentSplitter = nil + end end end --- 返回在containerWindow下的像素大小和位置 -SplitWindow.GetPosition = function(self) - local position = Rect.New() - local parent = self.GetParent - if parent == nil then --最顶层的split window - position.x = 0 - position.y = 0 - position.width = self.m_ContainerWindow:GetWidth() - position.height = self.m_ContainerWindow:GetHeight() - return position - end - local parentPos = parent:GetPosition() - local index = self:GetIndexOfParent() - -- 前后的splitter - local prev = index > 1 and parent.m_Splitter[index - 1] or nil - local next = index <= #parent.m_Splitter and parent.m_Splitter[index] or nil - local offset = prev ~= nil and prev.value or 0 - local pv = offset - local nv = next ~= nil and next.value or 1 - local size = nv - pv - position:CopyFrom(parentPos) - if parent.m_SplitMode == ESplitMode.Horizontal then - position.x = position.x + offset - position.width = position.width * size - else - position.y = position.y + offset - position.height = position.height * size +-- 设置在containerwindow中的位置和大小 +SplitWindow.SetPosition = function(self, position) + self.m_Position:CopyFrom(position) + for i, subWindow in ipairs(self.m_SubWindows) do + local prev = i > 1 and self.m_Splitter[i-1].value or 0 + local next = i <= #self.m_Splitter and self.m_Splitter[i].value or 1 + local pos = Rect.New() + pos:CopyFrom(position) + if self.m_SplitMode == ESplitMode.Horizontal then + pos.x = pos.x + prev * position.width + pos.width = position.width * (next - prev) + else + pos.y = pos.y + prev * position.height + pos.height = position.height * (next - prev) + end + subWindow:SetPosition(pos) end end +SplitWindow.GetPosition = function(self) + local pos = Rect.New() + pos:CopyFrom(self.m_Position) + return pos +end + -- 返回guiWnd SplitWindow.GetIndexOfParent = function(self) if self.m_Parent == nil then return 1 end - for i, sp in ipairs(self.m_Parent.m_SubSplit) do + for i, sp in ipairs(self.m_Parent.m_SubWindows) do if sp == self then return i end @@ -97,4 +140,9 @@ SplitWindow.GetParent = function(self) return self.m_Parent end +SplitWindow.AddSubWindow = function(self, subWindow) + table.insert(self.m_SubWindows, subWindow) + subWindow.m_Parent = self +end + return SplitWindow
\ No newline at end of file diff --git a/Data/Scripts/EditorApplication.lua b/Data/Scripts/EditorApplication.lua index 01f5b70..c8d3d99 100644 --- a/Data/Scripts/EditorApplication.lua +++ b/Data/Scripts/EditorApplication.lua @@ -24,13 +24,15 @@ mainWindow:SetIcon("./Data/Icon/GameLab.ico") app:SetMainWindow(mainWindow:GetNative()) EditorWindowManager.SetMainWindow(mainWindow) -local guiWindow = Window.GUIWindow.New() -guiWindow:SetContainerWindow(mainWindow) -guiWindow:SetPosition({0,0, 400, 400}) +EditorWindowManager.TestGUIWindow() -local guiWindow2 = Window.GUIWindow.New() -guiWindow2:SetContainerWindow(mainWindow) -guiWindow2:SetPosition({400,0, 400, 400}) +-- local guiWindow = Window.GUIWindow.New() +-- guiWindow:SetContainerWindow(mainWindow) +-- guiWindow:SetPosition({0,0, 400, 400}) + +-- local guiWindow2 = Window.GUIWindow.New() +-- guiWindow2:SetContainerWindow(mainWindow) +-- guiWindow2:SetPosition({400,0, 400, 400}) local v = GameLab.Engine.Math.Vector4.New(1,2,3,4) diff --git a/Data/Scripts/EditorGUI/EditorWindowManager.lua b/Data/Scripts/EditorGUI/EditorWindowManager.lua index ecd6912..56083df 100644 --- a/Data/Scripts/EditorGUI/EditorWindowManager.lua +++ b/Data/Scripts/EditorGUI/EditorWindowManager.lua @@ -1,6 +1,10 @@ +local inspect = require("inspect")
+local Debug = require("GameLab.Debug")
local ContainerWindow = require("GameLab.Editor.Window.ContainerWindow")
-local GUIWindow = require("GameLab.Editor.Window.GUIWindow")
-local SplitWindow = require("GameLab.Editor.Window.SplitWindow")
+local GUIWindow = require("GameLab.Editor.Window.GUIWindow")
+local SplitWindow = require("GameLab.Editor.Window.SplitWindow")
+local ESplitMode = GameLab.Editor.Window.ESplitMode
+local Rect = require("GameLab.Engine.Math.Rect")
local EditorWindowManager = {}
@@ -27,4 +31,50 @@ EditorWindowManager.SetMainWindow = function(wnd) EditorWindowManager.mainWindow = wnd
end
+EditorWindowManager.TestGUIWindow = function()
+ Debug.Log("TestGUIWindow")
+
+ local guiWindow = GUIWindow.New()
+ guiWindow:SetContainerWindow(EditorWindowManager.mainWindow)
+
+ local guiWindow2 = GUIWindow.New()
+ guiWindow2:SetContainerWindow(EditorWindowManager.mainWindow)
+
+ local guiWindow3 = GUIWindow.New()
+ guiWindow3:SetContainerWindow(EditorWindowManager.mainWindow)
+
+ local guiWindow4 = GUIWindow.New()
+ guiWindow4:SetContainerWindow(EditorWindowManager.mainWindow)
+
+ local splitWnd = SplitWindow.New(ESplitMode.Horizontal, {0.3, 0.7} )
+ EditorWindowManager.rootSplitWindow = splitWnd
+ splitWnd:AddSubWindow(guiWindow)
+
+ local splitWnd2 = SplitWindow.New(ESplitMode.Vertical, {0.5} )
+
+ splitWnd:AddSubWindow(splitWnd2)
+
+ splitWnd:AddSubWindow(guiWindow4)
+
+ guiWindow.m_SplitWindow = splitWnd
+ guiWindow4.m_SplitWindow = splitWnd
+
+ splitWnd2:AddSubWindow(guiWindow2)
+ splitWnd2:AddSubWindow(guiWindow3)
+ guiWindow2.m_SplitWindow = splitWnd2
+ guiWindow3.m_SplitWindow = splitWnd2
+
+ local mainWindowSize = EditorWindowManager.mainWindow:GetSize()
+ local position = Rect.New()
+ position.x = 0
+ position.y = 0
+ position.width = mainWindowSize.x
+ position.height = mainWindowSize.y
+
+ splitWnd:SetPosition(position)
+
+ EditorWindowManager.mainWindow:SetRootSplitWindow(splitWnd)
+
+end
+
return EditorWindowManager
\ No newline at end of file diff --git a/Data/boot.lua b/Data/boot.lua index 091aff0..f6eeea9 100644 --- a/Data/boot.lua +++ b/Data/boot.lua @@ -36,7 +36,7 @@ require "GameLab.Editor" require "GameLab.Editor.Window"
-- debugging
---require("LuaPanda").start("127.0.0.1",8818)
+require("LuaPanda").start("127.0.0.1",8818)
-- launch editor
dofile("./Scripts/EditorApplication.lua")
diff --git a/Documents/窗口.xlsx b/Documents/窗口.xlsx Binary files differindex ceb1118..8a85923 100644 --- a/Documents/窗口.xlsx +++ b/Documents/窗口.xlsx diff --git a/Editor/GUI/ContainerWindow.cpp b/Editor/GUI/ContainerWindow.cpp index 59cd008..f76ac73 100644 --- a/Editor/GUI/ContainerWindow.cpp +++ b/Editor/GUI/ContainerWindow.cpp @@ -96,19 +96,12 @@ LRESULT CALLBACK ContainerWindow::ContainerWndProc(HWND hWnd, UINT message, WPAR case WM_WINDOWPOSCHANGED: // ڴСλáz㼶ı䣬ı { + //log_info_tag("WndProc", "WM_WINDOWPOSCHANGED" ); + if (!self->m_IsClosing && !IsIconic(hWnd)) //IsIconic ǷСͼ껯 { - // OnRectChanged()ص - self->OnRectChanged(); + self->OnSizeChanged(); } - // WM_WINDOWPOSCHANGED ϢҵDefWindowProcŷWM_SIZEWM_MOVEϢWM_WINDOWPOSCHANGED - // һСλøıЧ - /* - By default, the DefWindowProc function sends the WM_SIZE and WM_MOVE messages to the window. - The WM_SIZE and WM_MOVE messages are not sent if an application handles the WM_WINDOWPOSCHANGED - message without calling DefWindowProc. It is more efficient to perform any move or size change - processing during the WM_WINDOWPOSCHANGED message without calling DefWindowProc. - */ break; } @@ -441,9 +434,15 @@ Vector2f ContainerWindow::GetSize() return size; } -void ContainerWindow::OnRectChanged() +void ContainerWindow::OnSizeChanged() { + LuaBind::State state = GetVM()->GetCurThread(); + LuaBind::MemberInvoker invoker = MemberInvoker(state, this); + invoker.member = m_Script; + invoker.method = "OnSizeChanged"; + invoker.AddMember(m_Script); + invoker.Invoke(0); } void ContainerWindow::OnActivateApplication(bool active) diff --git a/Editor/GUI/ContainerWindow.h b/Editor/GUI/ContainerWindow.h index 08f08fe..09a1f0f 100644 --- a/Editor/GUI/ContainerWindow.h +++ b/Editor/GUI/ContainerWindow.h @@ -47,7 +47,7 @@ public: GET(HWND, WindowHandle, m_Window); GET(HDC, DC, m_DC); - void OnRectChanged(); + void OnSizeChanged(); void OnActivateApplication(bool active); private: @@ -66,10 +66,10 @@ private: POINT m_MinSize; POINT m_MaxSize; -#ifdef GAMELAB_WIN HWND m_Window; HDC m_DC; -#endif + + LuaBind::MemberRef m_Script; //-------------------------------------------------------- diff --git a/Editor/GUI/GUIWindow.cpp b/Editor/GUI/GUIWindow.cpp index aaab6a8..19ceb85 100644 --- a/Editor/GUI/GUIWindow.cpp +++ b/Editor/GUI/GUIWindow.cpp @@ -168,6 +168,8 @@ LRESULT CALLBACK GUIWindow::GUIViewWndProc(HWND hWnd, UINT message, WPARAM wPara // self->RequestRepaint(); // } + self->DoPaint(); + // // Update the scene so that scripts marked with [ExecuteInEditMode] are able to react to screen size changes // GetApplication().SetSceneRepaintDirty(); //} @@ -269,6 +271,8 @@ void GUIWindow::ProcessEventMessages(UINT message, WPARAM wParam, LPARAM lParam) SCRIPT_GLOBAL.guiBeginOnGUI.Invoke(state, 0); + SetAsRenderContext(); + LuaBind::MemberInvoker invoker = LuaBind::MemberInvoker(state, this); invoker.member = m_Script; invoker.method = "OnGUI"; diff --git a/Editor/Scripting/Window/ContainerWindow.bind.cpp b/Editor/Scripting/Window/ContainerWindow.bind.cpp index 5e7319b..f459c85 100644 --- a/Editor/Scripting/Window/ContainerWindow.bind.cpp +++ b/Editor/Scripting/Window/ContainerWindow.bind.cpp @@ -18,6 +18,26 @@ LUA_BIND_POSTPROCESS(ContainerWindow) { } +// self, position, showMode, min, max +LUA_BIND_IMPL_METHOD(ContainerWindow, ContainerWindow::_New) +{ + LUA_BIND_STATE(L, ContainerWindow); + LUA_BIND_CHECK(L, "TTNTT"); + + ContainerWindow* wnd = new ContainerWindow(state.GetVM()); + + wnd->SetMemberRef(state, wnd->m_Script, 1); + Rect rect = state.GetValue<Rect>(2, Rect()); + int showMode = state.GetValue<int>(3, 0); + Vector2 min = state.GetValue<Vector2>(4, Vector2(50, 50)); + Vector2 max = state.GetValue<Vector2>(5, Vector2(10000, 10000)); + + wnd->Init(rect, showMode, min, max); + wnd->PushUserdata(state); + + return 1; +} + LUA_BIND_IMPL_METHOD(ContainerWindow, _SetTitle) { LUA_BIND_PREPARE(L, ContainerWindow); @@ -53,22 +73,3 @@ LUA_BIND_IMPL_METHOD(ContainerWindow, _DoPaint) self->DoPaint(); return 0; } - -LUA_BIND_IMPL_METHOD(ContainerWindow, ContainerWindow::_New) -{ - LUA_BIND_STATE(L, ContainerWindow); - LUA_BIND_CHECK(L, "TNTT"); - - ContainerWindow* wnd = new ContainerWindow(state.GetVM()); - - Rect rect = state.GetValue<Rect>(state, Rect()); - int showMode = state.GetValue<int>(2, 0); - Vector2 min = state.GetValue<Vector2>(state, Vector2()); - Vector2 max = state.GetValue<Vector2>(state, Vector2()); - - wnd->Init(rect, showMode, min, max); - - wnd->PushUserdata(state); - - return 1; -} diff --git a/Runtime/Math/Vector2.h b/Runtime/Math/Vector2.h index aba4262..f83a521 100644 --- a/Runtime/Math/Vector2.h +++ b/Runtime/Math/Vector2.h @@ -70,10 +70,21 @@ namespace Internal void RestoreFromLuaObject(LuaBind::State& state, int index) override { + if (lua_isnil(state, index)) + return; + if (LuaHelper::IsType(state, "GameLab.Engine.Math.Vector2", index)) + { + x = state.GetField<float>(index, "x", 0); + y = state.GetField<float>(index, "y", 0); + } + else if (LuaHelper::IsType(state, "table", index)) + { + x = state.GetField<float>(index, 0, 0); + y = state.GetField<float>(index, 1, 0); + } } - - + T x, y; static Vector2T<T> zero; |