From bd16d7c97ddffac2ed1623187f7071d75d93a80a Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 3 Aug 2020 23:32:33 +0200 Subject: [PATCH 01/50] Removed submodule --- .gitmodules | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.gitmodules b/.gitmodules index a73927e..1784531 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,3 @@ -[submodule "Libs\/GLFW"] +[submodule "Libs/GLFW"] path = Libs/GLFW - url = https://github.com/MineGame159/glfw-beef -[submodule "Libs/ImGui"] - path = Libs/ImGui - url = https://github.com/Beef-Community-Project/imgui-beef - branch = docking + url = https://github.com/MineGame159/glfw-beef \ No newline at end of file From b87b8ed18b7488857e5803e2a1651b67084c5932 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 3 Aug 2020 23:40:08 +0200 Subject: [PATCH 02/50] Removed submodule *again --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 1784531..952fbf5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "Libs/GLFW"] path = Libs/GLFW - url = https://github.com/MineGame159/glfw-beef \ No newline at end of file + url = https://github.com/MineGame159/glfw-beef From 562c8fcab7836526122e581a3d11c6d3713046a0 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Wed, 5 Aug 2020 22:10:52 +0200 Subject: [PATCH 03/50] ImGui should be working --- .gitignore | 3 +- .gitmodules | 6 +++- BeefSpace.toml | 5 ++- Editor/BeefProj.toml | 5 ++- Editor/src/Editor.bf | 22 ++++++++++++ Editor/src/ImGuiLayer.bf | 74 +++++++++++++++++++++++++++++++++++++++ Editor/src/Program.bf | 16 +++++++++ Engine/src/Application.bf | 48 ++++++++++++++++++------- Engine/src/LayerStack.bf | 19 ++++++++-- Libs/ImGui | 1 + 10 files changed, 179 insertions(+), 20 deletions(-) create mode 100644 Editor/src/Editor.bf create mode 100644 Editor/src/ImGuiLayer.bf create mode 100644 Editor/src/Program.bf create mode 160000 Libs/ImGui diff --git a/.gitignore b/.gitignore index abec243..6bc8098 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ build/ # Files -BeefSpace_User.toml \ No newline at end of file +BeefSpace_User.toml +Editor/imgui.ini \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 952fbf5..65e0013 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,7 @@ -[submodule "Libs/GLFW"] +[submodule "GLFW"] path = Libs/GLFW url = https://github.com/MineGame159/glfw-beef +[submodule "ImGui"] + path = Libs/ImGui + url = https://github.com/Beef-Community-Project/imgui-beef + branch = docking diff --git a/BeefSpace.toml b/BeefSpace.toml index 9ff8b0e..a9a1a70 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,2 +1,5 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}} +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-beef = {Path = "Libs/ImGui/imgui-beef"}, imgui-impl-glfw = {Path = "Libs/ImGui/imgui-impl-glfw"}, imgui-impl-opengl3 = {Path = "Libs/ImGui/imgui-impl-opengl3"}} + +[Workspace] +StartupProject = "SteelEditor" diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index bc3ed3c..3199659 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,6 +1,9 @@ FileVersion = 1 -Dependencies = {corlib = "*", glfw-beef = "*", SteelEngine = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", imgui-beef = "*", imgui-impl-glfw = "*", imgui-impl-opengl3 = "*"} [Project] Name = "SteelEditor" StartupObject = "SteelEditor.Program" + +[Configs.Debug.Win64] +BeefLibType = "DynamicDebug" diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf new file mode 100644 index 0000000..c98f33a --- /dev/null +++ b/Editor/src/Editor.bf @@ -0,0 +1,22 @@ +using SteelEngine; +using SteelEngine.Window; +using imgui_beef; + +namespace SteelEditor +{ + public class Editor : Application + { + private ImGuiLayer _imGuiLayer; + + public override void OnInit() + { + _imGuiLayer = new .(Window); + PushOverlay(_imGuiLayer); + } + + public override void OnCleanup() + { + + } + } +} diff --git a/Editor/src/ImGuiLayer.bf b/Editor/src/ImGuiLayer.bf new file mode 100644 index 0000000..6f098a0 --- /dev/null +++ b/Editor/src/ImGuiLayer.bf @@ -0,0 +1,74 @@ +using SteelEngine; +using SteelEngine.Events; +using imgui_beef; +using glfw_beef; +using SteelEngine.Window; +using System; + +namespace SteelEditor +{ + public class ImGuiLayer : Layer + { + static bool show = true; + private float _time = 0.0f; + + private Window _window; + + public this(Window window) : base("ImGuiLayer") + { + _window = window; + } + + public override void OnAttach() + { + ImGui.CreateContext(); + ImGui.StyleColorsDark(); + + + ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, false); + + ImGuiImplOpengl3.ImGui_ImplOpenGL3_Init(=> Glfw.GetProcAddress); + } + + public override void OnDetach() + { + ImGuiImplOpengl3.ImGui_ImplOpenGL3_Shutdown(); + //ImGuiImplGlfw.Shutdown(); + ImGui.DestroyContext(); + } + + public override void OnUpdate() + { + var io = ref ImGui.GetIO(); + var app = Application.Instance; + io.DisplaySize = ImGui.Vec2(app.Window.GetSize.X, app.Window.GetSize.Y); + + ImGuiImplOpengl3.ImGui_ImplOpenGL3_NewFrame(); + ImGuiImplGlfw.NewFrame(); + ImGui.NewFrame(); + + float time = (float) Glfw.GetTime(); + io.DeltaTime = _time > 0.0f ? (time - _time) : (1.0f / 60.0f); + _time = time; + + ImGui.ShowDemoWindow(&show); + + if (ImGui.Begin("test", &show)) + { + ImGui.Checkbox("Bop", &show); + ImGui.End(); + } + + ImGui.EndFrame(); + ImGui.Render(); + ImGuiImplOpengl3GL.glClearColor(0.45f, 0.55f, 0.60f, 1.00f); + ImGuiImplOpengl3GL.glClear(ImGuiImplOpengl3GL.GL_COLOR_BUFFER_BIT); + ImGuiImplOpengl3.ImGui_ImplOpenGL3_RenderDrawData(ImGui.GetDrawData()); + } + + public override void OnEvent(Event event) + { + + } + } +} \ No newline at end of file diff --git a/Editor/src/Program.bf b/Editor/src/Program.bf new file mode 100644 index 0000000..28001ce --- /dev/null +++ b/Editor/src/Program.bf @@ -0,0 +1,16 @@ +using System; + +namespace SteelEditor +{ + class Program + { + public static int Main(String[] args) + { + var editor = new Editor(); + editor.Run(); + delete editor; + + return 0; + } + } +} \ No newline at end of file diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 1acc016..71d56a8 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -1,21 +1,27 @@ using System; using SteelEngine.Window; using SteelEngine.Events; +using glfw_beef; namespace SteelEngine { public abstract class Application : IDisposable { + public static Application Instance = null; + private bool _isRunning = false; - private Window _window ~ delete _; + public Window Window { get; protected set; } private Window.EventCallback _eventCallback = new => OnEvent ~ delete _; private LayerStack _layerStack = new .() ~ delete _; + private Glfw.ErrorCallback _errorCallback = new => OnGlfwError; + public this() { - OnInit(); + Instance = this; + Log.AddHandle(Console.Out); } public ~this() @@ -28,28 +34,26 @@ namespace SteelEngine _isRunning = true; var windowConfig = WindowConfig(1080, 720, "SteelEngine"); - _window = new Window(windowConfig, _eventCallback); + Window = new Window(windowConfig, _eventCallback); + + OnInit(); + + Glfw.SetErrorCallback(_errorCallback, true); while (_isRunning) { for (var layer in _layerStack) layer.OnUpdate(); - _window.Update(); + Window.Update(); } } - // Gets called right before the window is created - public virtual void OnInit() - { - Log.AddHandle(Console.Out); - } + // Gets called right after the window is created + public virtual void OnInit() {} // Gets called when the window is destroyed - public virtual void OnCleanup() - { - _window.Destroy(); - } + public virtual void OnCleanup() {} // Gets called when an event occurs in the window public void OnEvent(Event event) @@ -65,6 +69,11 @@ namespace SteelEngine } } + private void OnGlfwError(Glfw.Error error) + { + Log.Error("(GLFW) {}", error); + } + private bool OnWindowClose(WindowCloseEvent event) { _isRunning = false; @@ -74,6 +83,19 @@ namespace SteelEngine public void Dispose() { OnCleanup(); + + Window.Destroy(); + delete Window; + } + + public void PushLayer(Layer layer) + { + _layerStack.PushLayer(layer); + } + + public void PushOverlay(Layer layer) + { + _layerStack.PushOverlay(layer); } } } diff --git a/Engine/src/LayerStack.bf b/Engine/src/LayerStack.bf index 879d22f..6bfea19 100644 --- a/Engine/src/LayerStack.bf +++ b/Engine/src/LayerStack.bf @@ -5,17 +5,30 @@ namespace SteelEngine { public class LayerStack : IEnumerable { - private List _layers = new .() ~ DeleteContainerAndItems!(_); + private List _layers = new .(); private int _layerInsert = 0; + public ~this() + { + for (var layer in _layers) + { + layer.OnDetach(); + delete layer; + } + + delete _layers; + } + public void PushLayer(Layer layer) { _layers.Insert(_layerInsert++, layer); + layer.OnAttach(); } - public void PushOverlay(Layer overlay) + public void PushOverlay(Layer layer) { - _layers.Add(overlay); + _layers.Add(layer); + layer.OnAttach(); } public void PopLayer(StringView debugName = "") diff --git a/Libs/ImGui b/Libs/ImGui new file mode 160000 index 0000000..b3e4557 --- /dev/null +++ b/Libs/ImGui @@ -0,0 +1 @@ +Subproject commit b3e4557a706c999594b4a6cb519d56daa1b0e830 From afba6c56d22326c86bc28053f09b0d6cddf3e27f Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 8 Aug 2020 22:51:16 +0200 Subject: [PATCH 04/50] Removed ImGui submodule --- .gitmodules | 4 --- BeefSpace.toml | 2 +- Editor/BeefProj.toml | 2 +- Editor/src/Editor.bf | 9 +++++++ Editor/src/EditorGUI.bf | 20 +++++++++++++++ Editor/src/EditorWindow.bf | 31 ++++++++++++++++++++++ Editor/src/ImGuiLayer.bf | 51 +++++++++++++++++++++++++++---------- Editor/src/TestWindow.bf | 34 +++++++++++++++++++++++++ Engine/src/Application.bf | 12 ++++++++- Engine/src/Window/Window.bf | 6 ++--- Libs/ImGui | 1 - TestLibs/imgui | 1 + 12 files changed, 148 insertions(+), 25 deletions(-) create mode 100644 Editor/src/EditorGUI.bf create mode 100644 Editor/src/EditorWindow.bf create mode 100644 Editor/src/TestWindow.bf delete mode 160000 Libs/ImGui create mode 160000 TestLibs/imgui diff --git a/.gitmodules b/.gitmodules index 65e0013..f6e29e9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,3 @@ [submodule "GLFW"] path = Libs/GLFW url = https://github.com/MineGame159/glfw-beef -[submodule "ImGui"] - path = Libs/ImGui - url = https://github.com/Beef-Community-Project/imgui-beef - branch = docking diff --git a/BeefSpace.toml b/BeefSpace.toml index a9a1a70..2e62a89 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-beef = {Path = "Libs/ImGui/imgui-beef"}, imgui-impl-glfw = {Path = "Libs/ImGui/imgui-impl-glfw"}, imgui-impl-opengl3 = {Path = "Libs/ImGui/imgui-impl-opengl3"}} +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "TestLibs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "TestLibs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "TestLibs/imgui/imgui-beef"}} [Workspace] StartupProject = "SteelEditor" diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index 3199659..90a07e6 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", SteelEngine = "*", imgui-beef = "*", imgui-impl-glfw = "*", imgui-impl-opengl3 = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", imgui-impl-opengl3 = "*", imgui-impl-glfw = "*", imgui-beef = "*"} [Project] Name = "SteelEditor" diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index c98f33a..9a319cd 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -12,11 +12,20 @@ namespace SteelEditor { _imGuiLayer = new .(Window); PushOverlay(_imGuiLayer); + + // SpawnWindow(); } public override void OnCleanup() { } + + public void SpawnWindow() where T : EditorWindow + { + var window = new T(); + window.OnInit(); + _imGuiLayer.AddWindow(window); + } } } diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf new file mode 100644 index 0000000..7c5a4d9 --- /dev/null +++ b/Editor/src/EditorGUI.bf @@ -0,0 +1,20 @@ +using System; +using imgui_beef; + +namespace SteelEditor +{ + public static class EditorGUI + { + public static bool Button(StringView name) => ImGui.Button(name.Ptr); + + public static void Text(StringView fmt, params Object[] args) => ImGui.Text(scope String()..AppendF(fmt, params args)); + public static void LabelText(StringView label, StringView fmt, params Object[] args) => ImGui.LabelText(scope String()..AppendF(fmt, params args), label.Ptr); + + public static bool Checkbox(StringView name, bool value) + { + bool isChecked = value; + ImGui.Checkbox(name.Ptr, &isChecked); + return isChecked; + } + } +} diff --git a/Editor/src/EditorWindow.bf b/Editor/src/EditorWindow.bf new file mode 100644 index 0000000..ad86c97 --- /dev/null +++ b/Editor/src/EditorWindow.bf @@ -0,0 +1,31 @@ +using System; +using imgui_beef; + +namespace SteelEditor +{ + + public abstract class EditorWindow + { + // Pointer to fixed memory i.e. public override StringView Title => "MyEditorWindow"; + public abstract StringView Title { get; } + + public bool IsActive = true; + + public void Update() + { + if (!IsActive) + return; + + // ImGui.ShowDemoWindow(); + + if (ImGui.Begin(Title.Ptr, &IsActive)) + OnRender(); + + ImGui.End(); + } + + public virtual void OnInit() {} + public virtual void OnRender() {} + public virtual void OnClose() {} + } +} diff --git a/Editor/src/ImGuiLayer.bf b/Editor/src/ImGuiLayer.bf index 6f098a0..595e2ae 100644 --- a/Editor/src/ImGuiLayer.bf +++ b/Editor/src/ImGuiLayer.bf @@ -1,18 +1,19 @@ +using System; +using System.Collections; using SteelEngine; using SteelEngine.Events; +using SteelEngine.Window; using imgui_beef; using glfw_beef; -using SteelEngine.Window; -using System; namespace SteelEditor { public class ImGuiLayer : Layer { - static bool show = true; private float _time = 0.0f; private Window _window; + private List _editorWindows = new .(); public this(Window window) : base("ImGuiLayer") { @@ -22,18 +23,29 @@ namespace SteelEditor public override void OnAttach() { ImGui.CreateContext(); - ImGui.StyleColorsDark(); - - ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, false); + var style = ref ImGui.GetStyle(); + style.WindowMenuButtonPosition = .None; + ImGui.StyleColorsClassic(&style); + ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, false); ImGuiImplOpengl3.ImGui_ImplOpenGL3_Init(=> Glfw.GetProcAddress); + + Log.Trace("OpenGL version: {}", ImGuiImplOpengl3.[Friend]g_GlVersion); + Log.Trace("GLSL version: {}", ImGuiImplOpengl3.[Friend]g_GlslVersionString); } public override void OnDetach() { + for (var editorWindow in _editorWindows) + { + editorWindow.OnClose(); + delete editorWindow; + } + + delete _editorWindows; + ImGuiImplOpengl3.ImGui_ImplOpenGL3_Shutdown(); - //ImGuiImplGlfw.Shutdown(); ImGui.DestroyContext(); } @@ -42,24 +54,23 @@ namespace SteelEditor var io = ref ImGui.GetIO(); var app = Application.Instance; io.DisplaySize = ImGui.Vec2(app.Window.GetSize.X, app.Window.GetSize.Y); - ImGuiImplOpengl3.ImGui_ImplOpenGL3_NewFrame(); ImGuiImplGlfw.NewFrame(); ImGui.NewFrame(); + // Should be changed to use Steel DeltaTime float time = (float) Glfw.GetTime(); io.DeltaTime = _time > 0.0f ? (time - _time) : (1.0f / 60.0f); _time = time; - ImGui.ShowDemoWindow(&show); - - if (ImGui.Begin("test", &show)) + for (var editorWindow in _editorWindows) { - ImGui.Checkbox("Bop", &show); - ImGui.End(); + if (editorWindow.IsActive) + editorWindow.Update(); + else + CloseWindow(editorWindow); } - ImGui.EndFrame(); ImGui.Render(); ImGuiImplOpengl3GL.glClearColor(0.45f, 0.55f, 0.60f, 1.00f); ImGuiImplOpengl3GL.glClear(ImGuiImplOpengl3GL.GL_COLOR_BUFFER_BIT); @@ -70,5 +81,17 @@ namespace SteelEditor { } + + public void AddWindow(EditorWindow window) + { + _editorWindows.Add(window); + } + + public void CloseWindow(EditorWindow window) + { + window.OnClose(); + _editorWindows.Remove(window); + delete window; + } } } \ No newline at end of file diff --git a/Editor/src/TestWindow.bf b/Editor/src/TestWindow.bf new file mode 100644 index 0000000..dafb34e --- /dev/null +++ b/Editor/src/TestWindow.bf @@ -0,0 +1,34 @@ +using System; +using SteelEngine; + +namespace SteelEditor +{ + public class TestWindow : EditorWindow + { + public override StringView Title => "Test"; + + private bool _isChecked = false; + + public override void OnInit() + { + Log.Trace("OnInit()"); + } + + public override void OnRender() + { + if (EditorGUI.Button("TestButton")) + Log.Trace("You hit the test button!"); + + EditorGUI.Text("Try hitting this checkbox"); + + _isChecked = EditorGUI.Checkbox("Checkbox", _isChecked); + + EditorGUI.LabelText("Value: ", "{}", _isChecked); + } + + public override void OnClose() + { + Log.Trace("OnClose()"); + } + } +} diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 71d56a8..bdf6912 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -33,7 +33,17 @@ namespace SteelEngine { _isRunning = true; - var windowConfig = WindowConfig(1080, 720, "SteelEngine"); + var windowConfig = WindowConfig( + 1080, // Width + 720, // Height + "SteelEngine", // Title + false, // Undecorated + true, // Resizable + false, // VSync + false, // Maximized + false // Invisible + ); + Window = new Window(windowConfig, _eventCallback); OnInit(); diff --git a/Engine/src/Window/Window.bf b/Engine/src/Window/Window.bf index 8e90e38..7a611d9 100644 --- a/Engine/src/Window/Window.bf +++ b/Engine/src/Window/Window.bf @@ -62,10 +62,10 @@ namespace SteelEngine.Window Log.Fatal("Could not initialize GLFW"); } - Glfw.WindowHint(GlfwWindow.Hint.ContextVersionMajor, 3); - Glfw.WindowHint(GlfwWindow.Hint.ContextVersionMinor, 3); + /*Glfw.WindowHint(GlfwWindow.Hint.ContextVersionMajor, 4); + Glfw.WindowHint(GlfwWindow.Hint.ContextVersionMinor, 6); Glfw.WindowHint(GlfwWindow.Hint.OpenGlProfile, .CoreProfile); - Glfw.WindowHint(GlfwWindow.Hint.OpenGlForwardCompat, Glfw.TRUE); + Glfw.WindowHint(GlfwWindow.Hint.OpenGlForwardCompat, Glfw.TRUE);*/ // TODO(Sheep): few other flags to set Glfw.WindowHint(GlfwWindow.Hint.Decorated, !cfg.Undecorated); diff --git a/Libs/ImGui b/Libs/ImGui deleted file mode 160000 index b3e4557..0000000 --- a/Libs/ImGui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b3e4557a706c999594b4a6cb519d56daa1b0e830 diff --git a/TestLibs/imgui b/TestLibs/imgui new file mode 160000 index 0000000..f8dd72e --- /dev/null +++ b/TestLibs/imgui @@ -0,0 +1 @@ +Subproject commit f8dd72e63c1e45ee6c798454088da715be5b42ee From 473cf0e42fa294b1eec65d6bc7b0840edc9a1d0f Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 8 Aug 2020 22:52:00 +0200 Subject: [PATCH 05/50] Removed ImGui Testilb --- TestLibs/imgui | 1 - 1 file changed, 1 deletion(-) delete mode 160000 TestLibs/imgui diff --git a/TestLibs/imgui b/TestLibs/imgui deleted file mode 160000 index f8dd72e..0000000 --- a/TestLibs/imgui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f8dd72e63c1e45ee6c798454088da715be5b42ee From 255aa026f2b685c1e10f872516ac167a1b56c9f5 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 8 Aug 2020 23:26:12 +0200 Subject: [PATCH 06/50] Added ImGui as submodule --- .gitmodules | 3 +++ Libs/ImGui | 1 + 2 files changed, 4 insertions(+) create mode 160000 Libs/ImGui diff --git a/.gitmodules b/.gitmodules index f6e29e9..0e67450 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "GLFW"] path = Libs/GLFW url = https://github.com/MineGame159/glfw-beef +[submodule "Libs/ImGui"] + path = Libs/ImGui + url = https://github.com/qzole/imgui-beef diff --git a/Libs/ImGui b/Libs/ImGui new file mode 160000 index 0000000..cdc410f --- /dev/null +++ b/Libs/ImGui @@ -0,0 +1 @@ +Subproject commit cdc410faf55b854d84fe6cb50a856f9f65190acc From 1c30053a975068fcce9b5bdc62bb81f18bb5e73e Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 8 Aug 2020 23:26:38 +0200 Subject: [PATCH 07/50] Code refactoring --- BeefSpace.toml | 2 +- Editor/src/Editor.bf | 9 +++++---- Editor/src/ImGuiLayer.bf | 17 +++++++++++------ Engine/src/Application.bf | 8 +++++++- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/BeefSpace.toml b/BeefSpace.toml index 2e62a89..8e274a6 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "TestLibs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "TestLibs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "TestLibs/imgui/imgui-beef"}} +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}} [Workspace] StartupProject = "SteelEditor" diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 9a319cd..f959c8d 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -1,3 +1,4 @@ +using System; using SteelEngine; using SteelEngine.Window; using imgui_beef; @@ -13,19 +14,19 @@ namespace SteelEditor _imGuiLayer = new .(Window); PushOverlay(_imGuiLayer); - // SpawnWindow(); + SpawnWindow(); } public override void OnCleanup() { - + delete _imGuiLayer; } - public void SpawnWindow() where T : EditorWindow + public static void SpawnWindow() where T : EditorWindow { var window = new T(); window.OnInit(); - _imGuiLayer.AddWindow(window); + GetInstance()._imGuiLayer.AddWindow(window); } } } diff --git a/Editor/src/ImGuiLayer.bf b/Editor/src/ImGuiLayer.bf index 595e2ae..a2ee30e 100644 --- a/Editor/src/ImGuiLayer.bf +++ b/Editor/src/ImGuiLayer.bf @@ -25,11 +25,11 @@ namespace SteelEditor ImGui.CreateContext(); var style = ref ImGui.GetStyle(); - style.WindowMenuButtonPosition = .None; + style.WindowMenuButtonPosition = .None; // This disables the collapse button on windows ImGui.StyleColorsClassic(&style); ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, false); - ImGuiImplOpengl3.ImGui_ImplOpenGL3_Init(=> Glfw.GetProcAddress); + ImGuiImplOpengl3.Init(=> Glfw.GetProcAddress); Log.Trace("OpenGL version: {}", ImGuiImplOpengl3.[Friend]g_GlVersion); Log.Trace("GLSL version: {}", ImGuiImplOpengl3.[Friend]g_GlslVersionString); @@ -45,7 +45,8 @@ namespace SteelEditor delete _editorWindows; - ImGuiImplOpengl3.ImGui_ImplOpenGL3_Shutdown(); + ImGuiImplOpengl3.Shutdown(); + ImGuiImplGlfw.Shutdown(); ImGui.DestroyContext(); } @@ -54,7 +55,7 @@ namespace SteelEditor var io = ref ImGui.GetIO(); var app = Application.Instance; io.DisplaySize = ImGui.Vec2(app.Window.GetSize.X, app.Window.GetSize.Y); - ImGuiImplOpengl3.ImGui_ImplOpenGL3_NewFrame(); + ImGuiImplOpengl3.NewFrame(); ImGuiImplGlfw.NewFrame(); ImGui.NewFrame(); @@ -63,6 +64,7 @@ namespace SteelEditor io.DeltaTime = _time > 0.0f ? (time - _time) : (1.0f / 60.0f); _time = time; + // Update ImGui windows for (var editorWindow in _editorWindows) { if (editorWindow.IsActive) @@ -71,10 +73,13 @@ namespace SteelEditor CloseWindow(editorWindow); } - ImGui.Render(); + // Background color ImGuiImplOpengl3GL.glClearColor(0.45f, 0.55f, 0.60f, 1.00f); ImGuiImplOpengl3GL.glClear(ImGuiImplOpengl3GL.GL_COLOR_BUFFER_BIT); - ImGuiImplOpengl3.ImGui_ImplOpenGL3_RenderDrawData(ImGui.GetDrawData()); + + // ImGui rendering + ImGui.Render(); + ImGuiImplOpengl3.RenderDrawData(ImGui.GetDrawData()); } public override void OnEvent(Event event) diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index bdf6912..53d7c87 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -14,7 +14,7 @@ namespace SteelEngine public Window Window { get; protected set; } private Window.EventCallback _eventCallback = new => OnEvent ~ delete _; - private LayerStack _layerStack = new .() ~ delete _; + private LayerStack _layerStack = new .(); private Glfw.ErrorCallback _errorCallback = new => OnGlfwError; @@ -93,6 +93,7 @@ namespace SteelEngine public void Dispose() { OnCleanup(); + delete _layerStack; Window.Destroy(); delete Window; @@ -107,5 +108,10 @@ namespace SteelEngine { _layerStack.PushOverlay(layer); } + + public static T GetInstance() where T : Application + { + return (T) Instance; + } } } From 00ab35cd33a7046a0a1d8c3909f76360c31cb4c8 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sun, 9 Aug 2020 11:20:27 +0200 Subject: [PATCH 08/50] Merged master --- .gitmodules | 3 +++ Editor/src/Editor.bf | 4 +-- Editor/src/EditorGUI.bf | 26 ++++++++++++++++++++ Editor/src/EditorWindow.bf | 5 ++-- Editor/src/ImGuiLayer.bf | 2 +- Editor/src/TestWindow.bf | 21 ++++++++++------ Engine/src/ECS/Systems/BaseSystem.bf | 5 +--- Engine/src/ECS/Systems/BehaviorSystem.bf | 2 +- Engine/src/ECS/Systems/Physics2dSystem.bf | 2 -- Engine/src/ECS/Systems/Physics3dSystem.bf | 2 +- Engine/src/ECS/Systems/Render3dSystem.bf | 2 +- Engine/src/ECS/Systems/RenderSpriteSystem.bf | 2 -- Engine/src/ECS/Systems/RenderTextSystem.bf | 2 +- Engine/src/ECS/Systems/SoundSystem.bf | 2 +- Libs/ImGui | 1 + 15 files changed, 55 insertions(+), 26 deletions(-) create mode 160000 Libs/ImGui diff --git a/.gitmodules b/.gitmodules index f6e29e9..e0e0b33 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "GLFW"] path = Libs/GLFW url = https://github.com/MineGame159/glfw-beef +[submodule "ImGui"] + path = Libs/ImGui + url = https://github.com/qzole/imgui-beef diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index f959c8d..fe3b7d2 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -13,13 +13,13 @@ namespace SteelEditor { _imGuiLayer = new .(Window); PushOverlay(_imGuiLayer); - + SpawnWindow(); } public override void OnCleanup() { - delete _imGuiLayer; + } public static void SpawnWindow() where T : EditorWindow diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 7c5a4d9..3108684 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -7,14 +7,40 @@ namespace SteelEditor { public static bool Button(StringView name) => ImGui.Button(name.Ptr); + // Text + public static void Text(StringView fmt, params Object[] args) => ImGui.Text(scope String()..AppendF(fmt, params args)); public static void LabelText(StringView label, StringView fmt, params Object[] args) => ImGui.LabelText(scope String()..AppendF(fmt, params args), label.Ptr); + // Input + public static bool Checkbox(StringView name, bool value) { bool isChecked = value; ImGui.Checkbox(name.Ptr, &isChecked); + return isChecked; } + + public static void InputText(StringView label, String buffer, int maxSize = 128) + { + char8[] rawBuffer = new char8[maxSize]; + buffer.Reserve(maxSize); + ImGui.InputText(label.Ptr, &rawBuffer[0], (uint) maxSize); + buffer.Set(StringView(&rawBuffer[0])); + delete rawBuffer; + } + + public static int InputInt(StringView label, int value) + { + int input = value; + InputInt(label, ref input); + return input; + } + + public static void InputInt(StringView label, ref int value) + { + ImGui.InputInt(label.Ptr, &value); + } } } diff --git a/Editor/src/EditorWindow.bf b/Editor/src/EditorWindow.bf index ad86c97..cfab2ec 100644 --- a/Editor/src/EditorWindow.bf +++ b/Editor/src/EditorWindow.bf @@ -1,5 +1,6 @@ using System; using imgui_beef; +using SteelEngine; namespace SteelEditor { @@ -24,8 +25,8 @@ namespace SteelEditor ImGui.End(); } - public virtual void OnInit() {} + public virtual void OnInit() { Log.Trace("Creating window ({})", Title); } public virtual void OnRender() {} - public virtual void OnClose() {} + public virtual void OnClose() { Log.Trace("Closing window ({})", Title); } } } diff --git a/Editor/src/ImGuiLayer.bf b/Editor/src/ImGuiLayer.bf index a2ee30e..827a23f 100644 --- a/Editor/src/ImGuiLayer.bf +++ b/Editor/src/ImGuiLayer.bf @@ -28,7 +28,7 @@ namespace SteelEditor style.WindowMenuButtonPosition = .None; // This disables the collapse button on windows ImGui.StyleColorsClassic(&style); - ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, false); + ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, true); ImGuiImplOpengl3.Init(=> Glfw.GetProcAddress); Log.Trace("OpenGL version: {}", ImGuiImplOpengl3.[Friend]g_GlVersion); diff --git a/Editor/src/TestWindow.bf b/Editor/src/TestWindow.bf index dafb34e..4a36367 100644 --- a/Editor/src/TestWindow.bf +++ b/Editor/src/TestWindow.bf @@ -9,10 +9,9 @@ namespace SteelEditor private bool _isChecked = false; - public override void OnInit() - { - Log.Trace("OnInit()"); - } + private String _previousTextInput = new String() ~ delete _; + + private int _intInput = 0; public override void OnRender() { @@ -24,11 +23,17 @@ namespace SteelEditor _isChecked = EditorGUI.Checkbox("Checkbox", _isChecked); EditorGUI.LabelText("Value: ", "{}", _isChecked); - } - public override void OnClose() - { - Log.Trace("OnClose()"); + String textInput = scope String(); + EditorGUI.InputText("InputText", textInput); + if (textInput != _previousTextInput) + { + Log.Trace("Input: {}", textInput); + _previousTextInput.Set(textInput); + } + + #unwarn + EditorGUI.InputInt("InputInt", ref _intInput); } } } diff --git a/Engine/src/ECS/Systems/BaseSystem.bf b/Engine/src/ECS/Systems/BaseSystem.bf index d6ae3e8..7acd85a 100644 --- a/Engine/src/ECS/Systems/BaseSystem.bf +++ b/Engine/src/ECS/Systems/BaseSystem.bf @@ -9,9 +9,8 @@ namespace SteelEngine.ECS.Systems /// public abstract class BaseSystem { - protected this(Application app) + protected this() { - App = app; IsEnabled = true; EntityToComponents = new Dictionary>(); _uninitializedComponents = new Queue(); @@ -20,8 +19,6 @@ namespace SteelEngine.ECS.Systems RegisterComponentTypes(); } - public Application App { get; protected set; } - /// /// All tracked components. /// diff --git a/Engine/src/ECS/Systems/BehaviorSystem.bf b/Engine/src/ECS/Systems/BehaviorSystem.bf index f069096..c72a85e 100644 --- a/Engine/src/ECS/Systems/BehaviorSystem.bf +++ b/Engine/src/ECS/Systems/BehaviorSystem.bf @@ -6,7 +6,7 @@ namespace SteelEngine.ECS.Systems { public class BehaviorSystem : BaseSystem { - public this(Application app) : base(app) {} + public this() : base() {} protected override void RegisterComponentTypes() { diff --git a/Engine/src/ECS/Systems/Physics2dSystem.bf b/Engine/src/ECS/Systems/Physics2dSystem.bf index 0be5d46..d303cff 100644 --- a/Engine/src/ECS/Systems/Physics2dSystem.bf +++ b/Engine/src/ECS/Systems/Physics2dSystem.bf @@ -6,8 +6,6 @@ namespace SteelEngine.ECS.Systems { public class Physics2dSystem : BaseSystem { - public this(Application app) : base(app) {} - protected override void RegisterComponentTypes() { _registeredTypes = new Type[]{ typeof(Physics2dComponent), typeof(TransformComponent) }; diff --git a/Engine/src/ECS/Systems/Physics3dSystem.bf b/Engine/src/ECS/Systems/Physics3dSystem.bf index c787d3d..f9322ca 100644 --- a/Engine/src/ECS/Systems/Physics3dSystem.bf +++ b/Engine/src/ECS/Systems/Physics3dSystem.bf @@ -6,7 +6,7 @@ namespace SteelEngine.ECS.Systems { public class Physics3dSystem : BaseSystem { - public this(Application app) : base(app) {} + public this() : base() {} protected override void RegisterComponentTypes() { diff --git a/Engine/src/ECS/Systems/Render3dSystem.bf b/Engine/src/ECS/Systems/Render3dSystem.bf index 4ce78ab..f33f94c 100644 --- a/Engine/src/ECS/Systems/Render3dSystem.bf +++ b/Engine/src/ECS/Systems/Render3dSystem.bf @@ -6,7 +6,7 @@ namespace SteelEngine.ECS.Systems { public class Render3DSystem : BaseSystem { - public this(Application app) : base(app) {} + public this() : base() {} protected override void RegisterComponentTypes() { diff --git a/Engine/src/ECS/Systems/RenderSpriteSystem.bf b/Engine/src/ECS/Systems/RenderSpriteSystem.bf index 5984578..329cba3 100644 --- a/Engine/src/ECS/Systems/RenderSpriteSystem.bf +++ b/Engine/src/ECS/Systems/RenderSpriteSystem.bf @@ -6,8 +6,6 @@ namespace SteelEngine.ECS.Systems { public class RenderSpriteSystem : BaseSystem { - public this(Application app) : base(app) {} - protected override void RegisterComponentTypes() { _registeredTypes = new Type[]{ typeof(SpriteComponent), typeof(TransformComponent) }; diff --git a/Engine/src/ECS/Systems/RenderTextSystem.bf b/Engine/src/ECS/Systems/RenderTextSystem.bf index 4967568..b1726a1 100644 --- a/Engine/src/ECS/Systems/RenderTextSystem.bf +++ b/Engine/src/ECS/Systems/RenderTextSystem.bf @@ -6,7 +6,7 @@ namespace SteelEngine.ECS.Systems { public class RenderTextSystem : BaseSystem { - public this(Application app) : base(app) {} + public this() : base() {} protected override void RegisterComponentTypes() { diff --git a/Engine/src/ECS/Systems/SoundSystem.bf b/Engine/src/ECS/Systems/SoundSystem.bf index 100cc3e..a3a2fa8 100644 --- a/Engine/src/ECS/Systems/SoundSystem.bf +++ b/Engine/src/ECS/Systems/SoundSystem.bf @@ -6,7 +6,7 @@ namespace SteelEngine.ECS.Systems { public class SoundSystem : BaseSystem { - public this(Application app) : base(app) {} + public this() : base() {} protected override void RegisterComponentTypes() { diff --git a/Libs/ImGui b/Libs/ImGui new file mode 160000 index 0000000..cdc410f --- /dev/null +++ b/Libs/ImGui @@ -0,0 +1 @@ +Subproject commit cdc410faf55b854d84fe6cb50a856f9f65190acc From 83d3c0f9e61f204ee3ccd1945e6d6dfa3ed157e3 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sun, 16 Aug 2020 23:04:49 +0200 Subject: [PATCH 09/50] Basic GUI and ConsoleWindow --- .gitmodules | 6 + BeefSpace.toml | 3 +- Editor/BeefProj.toml | 2 +- Editor/src/Editor.bf | 215 ++++- Editor/src/EditorConfig.bf | 13 + Editor/src/EditorGUI.bf | 302 ++++++- Editor/src/EditorLayer.bf | 193 ++++ Editor/src/EditorWindow.bf | 14 +- Editor/src/ImGuiLayer.bf | 102 --- Editor/src/Program.bf | 7 + Editor/src/SteelPath.bf | 22 + Editor/src/TestWindow.bf | 39 - Editor/src/Windows/ConsoleWindow.bf | 161 ++++ Editor/src/Windows/StyleWindow.bf | 18 + Editor/src/Windows/TestWindow.bf | 51 ++ Engine/src/Application.bf | 45 +- Engine/src/Console/CVar.bf | 124 +++ Engine/src/Console/CVarFlags.bf | 17 + Engine/src/Console/CVarUtil.bf | 148 +++ Engine/src/Console/CommandHistory.bf | 64 ++ Engine/src/Console/ConsoleLineParser.bf | 105 +++ Engine/src/Console/EnumUtils.bf | 29 + Engine/src/Console/ExampleUsage.bf | 62 ++ Engine/src/Console/GameConsole.bf | 222 +++++ Engine/src/Log.bf | 43 +- Engine/src/Math/Direction.bf | 22 + Engine/src/Math/Helpers.bf | 36 + Engine/src/Math/Matrix33.bf | 195 ++++ Engine/src/Math/Matrix34.bf | 72 ++ Engine/src/Math/Matrix44.bf | 292 ++++++ Engine/src/Math/Quaternion.bf | 272 ++++++ Engine/src/Math/Typealias.bf | 12 + Engine/src/Math/Vector2.bf | 319 +++++++ Engine/src/Math/Vector3.bf | 363 ++++++++ Engine/src/Math/Vector4.bf | 369 ++++++++ Engine/src/SteelPath.bf | 44 + Engine/src/Time.bf | 40 + Engine/src/Window/Window.bf | 16 +- Libs/BGFX | 1 + Libs/Beef-Extensions-Lib/.gitignore | 3 + Libs/Beef-Extensions-Lib/BeefProj.toml | 6 + Libs/Beef-Extensions-Lib/LICENSE | 21 + Libs/Beef-Extensions-Lib/README.md | 17 + .../src/System/IO/PathExtensions.bf | 15 + .../System/Reflection/FieldInfoExtensions.bf | 10 + Libs/BeefToml | 1 + Libs/JSON_Beef/.gitignore | 3 + Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml | 12 + .../JSON_Beef_Test/json/valid_array.json | 48 + .../JSON_Beef_Test/json/valid_object.json | 32 + Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf | 70 ++ Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf | 556 ++++++++++++ .../JSON_Beef/JSON_Beef_Test/src/TestClass.bf | 12 + Libs/JSON_Beef/LICENSE | 21 + Libs/JSON_Beef/README.md | 138 +++ Libs/JSON_Beef/lib/BeefProj.toml | 13 + .../lib/src/Attributes/JSONAttributes.bf | 9 + .../lib/src/Serialization/JSONDeserializer.bf | 702 +++++++++++++++ .../lib/src/Serialization/JSONSerializer.bf | 447 +++++++++ Libs/JSON_Beef/lib/src/Types/JSONArray.bf | 197 ++++ Libs/JSON_Beef/lib/src/Types/JSONDocument.bf | 849 ++++++++++++++++++ Libs/JSON_Beef/lib/src/Types/JSONObject.bf | 265 ++++++ .../lib/src/Util/AttributeChecker.bf | 15 + Libs/JSON_Beef/lib/src/Util/JSONUtil.bf | 266 ++++++ Libs/JSON_Beef/lib/src/Util/JSONValidator.bf | 442 +++++++++ Libs/JSON_Beef/lib/src/Util/TypeChecker.bf | 36 + 66 files changed, 8047 insertions(+), 219 deletions(-) create mode 100644 Editor/src/EditorConfig.bf create mode 100644 Editor/src/EditorLayer.bf delete mode 100644 Editor/src/ImGuiLayer.bf create mode 100644 Editor/src/SteelPath.bf delete mode 100644 Editor/src/TestWindow.bf create mode 100644 Editor/src/Windows/ConsoleWindow.bf create mode 100644 Editor/src/Windows/StyleWindow.bf create mode 100644 Editor/src/Windows/TestWindow.bf create mode 100644 Engine/src/Console/CVar.bf create mode 100644 Engine/src/Console/CVarFlags.bf create mode 100644 Engine/src/Console/CVarUtil.bf create mode 100644 Engine/src/Console/CommandHistory.bf create mode 100644 Engine/src/Console/ConsoleLineParser.bf create mode 100644 Engine/src/Console/EnumUtils.bf create mode 100644 Engine/src/Console/ExampleUsage.bf create mode 100644 Engine/src/Console/GameConsole.bf create mode 100644 Engine/src/Math/Direction.bf create mode 100644 Engine/src/Math/Helpers.bf create mode 100644 Engine/src/Math/Matrix33.bf create mode 100644 Engine/src/Math/Matrix34.bf create mode 100644 Engine/src/Math/Matrix44.bf create mode 100644 Engine/src/Math/Quaternion.bf create mode 100644 Engine/src/Math/Typealias.bf create mode 100644 Engine/src/Math/Vector2.bf create mode 100644 Engine/src/Math/Vector3.bf create mode 100644 Engine/src/Math/Vector4.bf create mode 100644 Engine/src/SteelPath.bf create mode 100644 Engine/src/Time.bf create mode 160000 Libs/BGFX create mode 100644 Libs/Beef-Extensions-Lib/.gitignore create mode 100644 Libs/Beef-Extensions-Lib/BeefProj.toml create mode 100644 Libs/Beef-Extensions-Lib/LICENSE create mode 100644 Libs/Beef-Extensions-Lib/README.md create mode 100644 Libs/Beef-Extensions-Lib/src/System/IO/PathExtensions.bf create mode 100644 Libs/Beef-Extensions-Lib/src/System/Reflection/FieldInfoExtensions.bf create mode 160000 Libs/BeefToml create mode 100644 Libs/JSON_Beef/.gitignore create mode 100644 Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml create mode 100644 Libs/JSON_Beef/JSON_Beef_Test/json/valid_array.json create mode 100644 Libs/JSON_Beef/JSON_Beef_Test/json/valid_object.json create mode 100644 Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf create mode 100644 Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf create mode 100644 Libs/JSON_Beef/JSON_Beef_Test/src/TestClass.bf create mode 100644 Libs/JSON_Beef/LICENSE create mode 100644 Libs/JSON_Beef/README.md create mode 100644 Libs/JSON_Beef/lib/BeefProj.toml create mode 100644 Libs/JSON_Beef/lib/src/Attributes/JSONAttributes.bf create mode 100644 Libs/JSON_Beef/lib/src/Serialization/JSONDeserializer.bf create mode 100644 Libs/JSON_Beef/lib/src/Serialization/JSONSerializer.bf create mode 100644 Libs/JSON_Beef/lib/src/Types/JSONArray.bf create mode 100644 Libs/JSON_Beef/lib/src/Types/JSONDocument.bf create mode 100644 Libs/JSON_Beef/lib/src/Types/JSONObject.bf create mode 100644 Libs/JSON_Beef/lib/src/Util/AttributeChecker.bf create mode 100644 Libs/JSON_Beef/lib/src/Util/JSONUtil.bf create mode 100644 Libs/JSON_Beef/lib/src/Util/JSONValidator.bf create mode 100644 Libs/JSON_Beef/lib/src/Util/TypeChecker.bf diff --git a/.gitmodules b/.gitmodules index e0e0b33..a9a7d63 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,9 @@ [submodule "ImGui"] path = Libs/ImGui url = https://github.com/qzole/imgui-beef +[submodule "BGFX"] + path = Libs/BGFX + url = https://github.com/ExoKomodo/Bgfx-bf +[submodule "BeefToml"] + path = Libs/BeefToml + url = https://github.com/killamaaki/Beef-Toml diff --git a/BeefSpace.toml b/BeefSpace.toml index 8e274a6..1097ddc 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,5 +1,6 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}} +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}, BeefToml = {Path = "Libs/BeefToml/lib"}} +Locked = ["glfw-beef", "imgui-impl-opengl3", "imgui-impl-glfw", "imgui-beef"] [Workspace] StartupProject = "SteelEditor" diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index 90a07e6..2defe0a 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", SteelEngine = "*", imgui-impl-opengl3 = "*", imgui-impl-glfw = "*", imgui-beef = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", imgui-impl-opengl3 = "*", imgui-impl-glfw = "*", imgui-beef = "*", BeefToml = "*"} [Project] Name = "SteelEditor" diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index fe3b7d2..b9a1516 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -1,32 +1,229 @@ using System; +using System.Collections; +using System.IO; using SteelEngine; using SteelEngine.Window; +using SteelEditor.Windows; +using JetFistGames.Toml; using imgui_beef; namespace SteelEditor { public class Editor : Application { - private ImGuiLayer _imGuiLayer; + private EditorLayer _editorLayer; + + private EditorConfig _config = new .(); public override void OnInit() { - _imGuiLayer = new .(Window); - PushOverlay(_imGuiLayer); + _editorLayer = new .(Window); + PushOverlay(_editorLayer); + + AddWindow(); + AddWindow(); + AddWindow(); + + if (LoadConfig() case .Ok) + { + var style = ref ImGui.GetStyle(); + style = _config.Style; + + for (var window in _config.Windows) + ShowWindow(window); + } - SpawnWindow(); + ShowWindow(); } public override void OnCleanup() { - + SaveConfig(); + + delete _config; + } + + public static void ShowWindow() where T : EditorWindow + { + GetInstance()._editorLayer.ShowWindow(); + } + + public static void ShowWindow(StringView windowName) + { + GetInstance()._editorLayer.ShowWindow(windowName); + } + + public static void ShowWindow(EditorWindow window) + { + GetInstance()._editorLayer.ShowWindow(window); + } + + public static void AddWindow() where T : EditorWindow + { + GetInstance()._editorLayer.AddWindow(); + } + + public static void CloseWindow(EditorWindow window) + { + GetInstance()._editorLayer.CloseWindow(window); + } + + public static void UpdateConfig() + { + let editor = GetInstance(); + + var editorWindows = editor._editorLayer.[Friend]_editorWindows; + editorWindows.Clear(); + + for (var window in editorWindows) + editor._config.Windows.Add(window.Title); + + editor._config.Style = ImGui.GetStyle(); + } + + public static void SaveConfig() + { + Log.Trace("Saving config"); + + /*let serializeResult = JSONSerializer.Serialize(GetInstance()._config); + + if (serializeResult case .Err) + { + Log.Error("Could not serialize config"); + return; + } + + var serialized = serializeResult.Get(); + + var configPath = scope String(); + SteelPath.GetEditorUserFile("Config.json", configPath); + + if (File.WriteAllText(configPath, serialized) case .Err) + Log.Error("Failed to save style"); + + delete serialized;*/ + + TomlTableNode config = new .(); + + // Style + + var style = ImGui.GetStyle(); + TomlTableNode styleTable = new .(); + config.AddChild("Style", styleTable); + + AddSetting(styleTable, "Alpha", style.Alpha); + AddSetting(styleTable, "WindowPadding", style.WindowPadding); + AddSetting(styleTable, "WindowRounding", style.WindowRounding); + AddSetting(styleTable, "WindowBorderSize", style.WindowBorderSize); + AddSetting(styleTable, "WindowMinSize", style.WindowMinSize); + AddSetting(styleTable, "WindowTitleAlign", style.WindowTitleAlign); + AddSetting(styleTable, "WindowMenuButtonPosition", style.WindowMenuButtonPosition); + AddSetting(styleTable, "ChildRounding", style.ChildRounding); + AddSetting(styleTable, "ChildBorderSize", style.ChildBorderSize); + AddSetting(styleTable, "PopupRounding", style.PopupRounding); + AddSetting(styleTable, "PopupBorderSize", style.PopupBorderSize); + AddSetting(styleTable, "FramePadding", style.FramePadding); + AddSetting(styleTable, "FrameRounding", style.FrameRounding); + AddSetting(styleTable, "ItemSpacing", style.ItemSpacing); + AddSetting(styleTable, "ItemInnerSpacing", style.ItemInnerSpacing); + AddSetting(styleTable, "TouchExtraPadding", style.TouchExtraPadding); + AddSetting(styleTable, "IndentSpacing", style.IndentSpacing); + AddSetting(styleTable, "ColumnsMinSpacing", style.ColumnsMinSpacing); + AddSetting(styleTable, "ScrollbarSize", style.ScrollbarSize); + AddSetting(styleTable, "ScrollbarRounding", style.ScrollbarRounding); + AddSetting(styleTable, "GrabMinSize", style.GrabMinSize); + AddSetting(styleTable, "GrabRounding", style.GrabRounding); + AddSetting(styleTable, "TabRounding", style.TabRounding); + AddSetting(styleTable, "TabBorderSize", style.TabBorderSize); + AddSetting(styleTable, "ColorButtonPosition", style.ColorButtonPosition); + AddSetting(styleTable, "ButtonTextAlign", style.ButtonTextAlign); + AddSetting(styleTable, "SelectableTextAlign", style.SelectableTextAlign); + AddSetting(styleTable, "DisplayWindowPadding", style.DisplayWindowPadding); + AddSetting(styleTable, "DisplaySafeAreaPadding", style.DisplaySafeAreaPadding); + AddSetting(styleTable, "MouseCursorScale", style.MouseCursorScale); + AddSetting(styleTable, "AntiAliasedLines", style.AntiAliasedLines); + AddSetting(styleTable, "AntiAliasedFill", style.AntiAliasedFill); + AddSetting(styleTable, "CurveTessellationTol", style.CurveTessellationTol); + AddSetting(styleTable, "CircleSegmentMaxError", style.CircleSegmentMaxError); + AddSetting(styleTable, "Colors", style.Colors); + + // Windows + + var windowsArray = new TomlArrayNode(); + config.AddChild("Windows", windowsArray); + + for (var window in GetInstance()._editorLayer.[Friend]_editorWindows) + { + if (window.IsActive) + windowsArray.AddChild(new TomlValueNode(.String, window.Title)); + } + + var configPath = scope String(); + SteelPath.GetEditorUserFile("Config.toml", configPath); + + var serialized = scope String(); + TomlSerializer.Write(config, serialized); + + if (File.WriteAllText(configPath, serialized) case .Err) + Log.Error("Failed to save style"); + + delete config; + + void AddSetting(TomlTableNode parent, StringView name, float value) + { + parent.AddChild(name).SetFloat(value); + } + + void AddSetting(TomlTableNode parent, StringView name, bool value) + { + parent.AddChild(name).SetBool(value); + } + + void AddSetting(TomlTableNode parent, StringView name, ImGui.Vec2 value) + { + var array = parent.AddChild(name); + array.AddChild().SetFloat(value.x); + array.AddChild().SetFloat(value.y); + } + + void AddSetting(TomlTableNode parent, StringView name, ImGui.Dir value) + { + parent.AddChild(name).SetInt((int) value); + } + + void AddSetting(TomlTableNode parent, StringView name, ImGui.Vec4[(.) ImGui.Col.COUNT] value) + { + var array = parent.AddChild(name); + for (var vec in value) + { + var subArray = array.AddChild(); + subArray.AddChild().SetFloat(vec.w); + subArray.AddChild().SetFloat(vec.x); + subArray.AddChild().SetFloat(vec.y); + subArray.AddChild().SetFloat(vec.z); + } + } } - public static void SpawnWindow() where T : EditorWindow + public static Result LoadConfig() { - var window = new T(); - window.OnInit(); - GetInstance()._imGuiLayer.AddWindow(window); + // Deserializing the file causes a Stack overflow. TODO(RogueMacro): Fix BeefToml and remove this return statement + return .Err; + + var configPath = scope String(); + SteelPath.GetEditorUserFile("Config.toml", configPath); + + if (!File.Exists(configPath)) + return .Err; + + if (TomlSerializer.ReadFile(configPath, GetInstance()._config) case .Err(let err)) + { + Log.Error("Could not load config: {}", err); + err.Dispose(); + return .Err; + } + + return .Ok; } } } diff --git a/Editor/src/EditorConfig.bf b/Editor/src/EditorConfig.bf new file mode 100644 index 0000000..2c21753 --- /dev/null +++ b/Editor/src/EditorConfig.bf @@ -0,0 +1,13 @@ +using System; +using System.Collections; +using imgui_beef; + +namespace SteelEditor +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class EditorConfig + { + public List Windows = new .() ~ delete _; + public ImGui.Style Style; + } +} diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 3108684..3d9cccc 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -1,46 +1,322 @@ using System; +using System.Collections; using imgui_beef; +using SteelEngine; +using SteelEngine.Math; +using SteelEngine.Input; namespace SteelEditor { public static class EditorGUI { - public static bool Button(StringView name) => ImGui.Button(name.Ptr); + public delegate void HistoryCallback(VerticalDirection direction); + + private static HistoryCallback _historyCallback = null; + private static Dictionary _inputTextBuffers = new .() ~ DeleteDictionaryAndKeysAndItems!(_); + private static uint _popItemWidthCount = 0; // Text - public static void Text(StringView fmt, params Object[] args) => ImGui.Text(scope String()..AppendF(fmt, params args)); - public static void LabelText(StringView label, StringView fmt, params Object[] args) => ImGui.LabelText(scope String()..AppendF(fmt, params args), label.Ptr); + public static void Text(StringView fmt, params Object[] args) + { + ImGui.Text(scope String()..AppendF(fmt, params args)); + CheckItem(); + } + + public static void Label(StringView label) + { + if (label.StartsWith("##")) + return; + + ImGui.AlignTextToFramePadding(); + Text(label); + CheckItem(); + ImGui.SameLine(); + } + + public static void LabelText(StringView label, StringView fmt, params Object[] args) + { + ImGui.LabelText(scope String()..AppendF(fmt, params args), label.Ptr); + CheckItem(); + } // Input - public static bool Checkbox(StringView name, bool value) + public static bool Button(StringView name) + { + var isClicked = ImGui.Button(name.Ptr); + CheckItem(); + return isClicked; + } + + public static bool Checkbox(StringView label, bool value) { bool isChecked = value; - ImGui.Checkbox(name.Ptr, &isChecked); + Checkbox(label, ref isChecked); return isChecked; } - public static void InputText(StringView label, String buffer, int maxSize = 128) + public static void Checkbox(StringView label, ref bool value) { - char8[] rawBuffer = new char8[maxSize]; - buffer.Reserve(maxSize); - ImGui.InputText(label.Ptr, &rawBuffer[0], (uint) maxSize); - buffer.Set(StringView(&rawBuffer[0])); - delete rawBuffer; + Label(label); + ImGui.Checkbox(scope UniqueLabel(label, "Checkbox"), &value); + CheckItem(); + } + + public static bool Input(StringView label, String buffer, StringView hint = "", uint maxSize = 256, HistoryCallback historyCallback = null) + { + Label(label); + + _historyCallback = historyCallback; + var labelStr = scope String(label); + + if (!_inputTextBuffers.ContainsKey(labelStr)) + _inputTextBuffers[new String(label)] = new .(); + + var inputTextBuffer = _inputTextBuffers[labelStr]; + inputTextBuffer.ReAlloc(maxSize); + + bool enterPressed = false; + + ImGui.InputTextFlags flags = .EnterReturnsTrue | .CallbackHistory; + + if (hint != "") + enterPressed = ImGui.InputTextWithHint(scope UniqueLabel(label, "Input"), hint.Ptr, inputTextBuffer.Ptr, maxSize, flags, => InputTextCallback); + else + enterPressed = ImGui.InputText(scope UniqueLabel(label, "Input"), inputTextBuffer.Ptr, maxSize, flags, => InputTextCallback); + + CheckItem(); + buffer.Set(inputTextBuffer.View()); + _historyCallback = null; + + return enterPressed; + } + + private static int InputTextCallback(ImGui.InputTextCallbackData* data) + { + if (data.EventFlag == .CallbackHistory) + { + if (_historyCallback == null) + return 0; + + VerticalDirection dir = .Up; + if (data.EventKey == ImGui.Key.DownArrow) + dir = .Down; + _historyCallback(dir); + } + + return 0; } public static int InputInt(StringView label, int value) { - int input = value; + var input = value; InputInt(label, ref input); return input; } public static void InputInt(StringView label, ref int value) { - ImGui.InputInt(label.Ptr, &value); + Label(label); + ImGui.InputInt(scope UniqueLabel(label, "InputInt"), &value); + CheckItem(); + } + + public static float InputFloat(StringView label, float value) + { + var input = value; + InputFloat(label, ref input); + return input; + } + + public static void InputFloat(StringView label, ref float value) + { + Label(label); + ImGui.InputFloat(scope UniqueLabel(label, "InputFloat"), &value); + CheckItem(); + } + + public static double InputDouble(StringView label, double value) + { + var input = value; + InputDouble(label, ref input); + return input; + } + + public static void InputDouble(StringView label, ref double value) + { + Label(label); + ImGui.InputDouble(scope UniqueLabel(label, "InputDouble"), &value); + CheckItem(); + } + + public static Vector2 InputVector2(StringView label, Vector2 value) + { + var input = value; + InputVector2(label, ref input); + return input; + } + + public static void InputVector2(StringView label, ref Vector2 value) + { + Label(label); + ImGui.InputFloat2(scope UniqueLabel(label, "InputVector2"), value.data); + CheckItem(); + } + + public static Vector3 InputVector3(StringView label, Vector3 value) + { + var input = value; + InputVector3(label, ref input); + return input; + } + + public static void InputVector3(StringView label, ref Vector3 value) + { + Label(label); + ImGui.InputFloat3(scope UniqueLabel(label, "InputVector3"), value.data); + CheckItem(); + } + + public static void SliderFloat(StringView label, ref float value, float minValue, float maxValue) + { + Label(label); + ImGui.SliderFloat(scope UniqueLabel(label, "SliderFloat"), &value, minValue, maxValue); + CheckItem(); + } + + public static bool Combo(StringView label, ref TEnum currentItem) + where TEnum : Enum + where int : operator explicit TEnum + where TEnum : operator explicit int + { + Label(label); + + var enumItems = scope List(); + for (var item in typeof(TEnum).GetFields()) + enumItems.Add(item.Name.Ptr); + + var str = scope String(); + for (var item in enumItems) + str.AppendF("{}\0", StringView(item)); + + int tmp = (.) currentItem; + + let result = ImGui.Combo(scope UniqueLabel(label, "Combo"), &tmp, str); + CheckItem(); + currentItem = (.) tmp; + return result; + } + + // Layout + + public static void Line() + { + ImGui.Separator(); + } + + public static void SameLine() + { + ImGui.SameLine(); + } + + public static void ItemWidth(float percent) + { + //let windowWidth = ImGui.GetWindowContentRegionWidth(); + //ImGui.PushItemWidth(windowWidth / 100 * percent); + ImGui.PushItemWidth(-50); + _popItemWidthCount++; + } + + // Other + + public static void Tooltip(StringView fmt, params Object[] args) + { + ImGui.BeginTooltip(); + Text(fmt, params args); + ImGui.EndTooltip(); + } + + private static void CheckItem() + { + if (_popItemWidthCount > 0) + { + ImGui.PopItemWidth(); + _popItemWidthCount--; + } + } + + private class UniqueLabel + { + public String ID ~ delete _; + + public this(StringView label, StringView widget, params Object[] seeds) + { + ID = new String()..AppendF("##{}_{}", label, widget); + var enumerator = seeds.GetEnumerator(); + for (var seed in enumerator) + { + if (enumerator.[Friend]mIndex < enumerator.[Friend]mList.Length) + ID.AppendF("{}_", seed); + else + ID.AppendF("{}", seed); + } + } + + public static implicit operator char8*(Self uniqueLabel) + { + if (uniqueLabel == null) + return null; + + return uniqueLabel.ID; + } + } + + private class InputTextBuffer + { + private char8[] _buffer = null; + private uint _size = 0; + + public this(uint size = 1) + { + ReAlloc(size); + } + + public ~this() + { + if (_buffer != null) + delete _buffer; + } + + public void ReAlloc(uint size) + { + if (size == _size) + return; + + _size = size; + + if (_buffer != null) + { + var newBuffer = new char8[size]; + _buffer.CopyTo(newBuffer); + delete _buffer; + _buffer = newBuffer; + } + else + { + _buffer = new char8[size]; + } + } + + public override void ToString(String strBuffer) + { + strBuffer.Append(StringView(Ptr)); + } + + public StringView View() => StringView(Ptr); + + public char8* Ptr => &_buffer[0]; } } } diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf new file mode 100644 index 0000000..1a5d982 --- /dev/null +++ b/Editor/src/EditorLayer.bf @@ -0,0 +1,193 @@ +using System; +using System.Collections; +using SteelEngine; +using SteelEngine.Events; +using SteelEngine.Window; +using imgui_beef; +using glfw_beef; + +namespace SteelEditor +{ + public class EditorLayer : Layer + { + private Window _window; + private List _editorWindows = new .(); + + private bool _showDemoWindow = false; + + private String _iniPath = new .() ~ delete _; + + public this(Window window) : base("EditorLayer") + { + _window = window; + } + + public override void OnAttach() + { + ImGui.CreateContext(); + + SteelPath.GetEditorUserFile("imgui.ini", _iniPath); + + var io = ref ImGui.GetIO(); + io.IniFilename = _iniPath; + + var style = ref ImGui.GetStyle(); + style.WindowMenuButtonPosition = .None; // This disables the collapse button on windows + ImGui.StyleColorsClassic(&style); + + ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, true); + ImGuiImplOpengl3.Init(=> Glfw.GetProcAddress); + + Log.Trace("OpenGL version: {}", ImGuiImplOpengl3.[Friend]g_GlVersion); + Log.Trace("GLSL version: {}", ImGuiImplOpengl3.[Friend]g_GlslVersionString); + } + + public override void OnDetach() + { + for (var editorWindow in _editorWindows) + { + CloseWindow(editorWindow); + delete editorWindow; + } + + delete _editorWindows; + + ImGuiImplOpengl3.Shutdown(); + ImGuiImplGlfw.Shutdown(); + ImGui.DestroyContext(); + } + + public override void OnUpdate() + { + var io = ref ImGui.GetIO(); + var app = Application.Instance; + io.DisplaySize = ImGui.Vec2(app.Window.GetSize.x, app.Window.GetSize.y); + ImGuiImplOpengl3.NewFrame(); + ImGuiImplGlfw.NewFrame(); + ImGui.NewFrame(); + + if (ImGui.BeginMainMenuBar()) + { + if (ImGui.BeginMenu("File")) + { + ImGui.EndMenu(); + } + + if (ImGui.BeginMenu("Edit")) + { + ImGui.EndMenu(); + } + + if (ImGui.BeginMenu("Window")) + { + for (var window in _editorWindows) + { + if (ImGui.MenuItem(window.Title.Ptr)) + ShowWindow(window); + } + + if (ImGui.MenuItem("Demo")) + _showDemoWindow = true; + + ImGui.EndMenu(); + } + + ImGui.EndMainMenuBar(); + } + + if (_showDemoWindow) + ImGui.ShowDemoWindow(&_showDemoWindow); + + // Update ImGui windows + for (var window in _editorWindows) + { + if (!window.IsActive && !window.IsClosed) + CloseWindow(window); + else + window.Update(); + } + + // Background color + ImGuiImplOpengl3GL.glClearColor(0.45f, 0.55f, 0.60f, 1.00f); + ImGuiImplOpengl3GL.glClear(ImGuiImplOpengl3GL.GL_COLOR_BUFFER_BIT); + + // ImGui rendering + ImGui.Render(); + ImGuiImplOpengl3.RenderDrawData(ImGui.GetDrawData()); + } + + public void ShowWindow() where T : EditorWindow + { + for (var window in _editorWindows) + { + if (window.GetType() == typeof(T)) + { + ShowWindow(window); + return; + } + } + + var fullTypeName = scope String()..AppendF("{}", typeof(T)); + StringView typeName = StringView("null"); + for (var str in fullTypeName.Split('.')) + typeName = str; + + Log.Error("{} does not exist in application", typeName); + } + + public void ShowWindow(StringView windowName) + { + for (var window in _editorWindows) + { + if (window.Title == windowName) + { + ShowWindow(window); + break; + } + } + } + + public void ShowWindow(EditorWindow window) + { + if (!window.IsActive) + { + Log.Trace("Showing window ({})", window.Title); + + window.IsActive = true; + window.OnInit(); + window.IsClosed = false; + } + } + + public void AddWindow() where T : EditorWindow + { + _editorWindows.Add(new T()); + } + + public void CloseWindow() where T : EditorWindow + { + EditorWindow window = GetWindow(); + + if (window != null) + CloseWindow(window); + } + + public void CloseWindow(EditorWindow window) + { + Log.Trace("Closing window ({})", window.Title); + + window.IsActive = false; + window.OnClose(); + window.IsClosed = true; + } + + public T GetWindow() where T : EditorWindow + { + for (var window in _editorWindows) + if (typeof(T) == window.GetType()) + return window; + + return null; + } + } +} \ No newline at end of file diff --git a/Editor/src/EditorWindow.bf b/Editor/src/EditorWindow.bf index cfab2ec..3809e9a 100644 --- a/Editor/src/EditorWindow.bf +++ b/Editor/src/EditorWindow.bf @@ -10,23 +10,23 @@ namespace SteelEditor // Pointer to fixed memory i.e. public override StringView Title => "MyEditorWindow"; public abstract StringView Title { get; } - public bool IsActive = true; + public bool IsActive = false; + public bool IsClosed = true; public void Update() { if (!IsActive) return; - // ImGui.ShowDemoWindow(); - if (ImGui.Begin(Title.Ptr, &IsActive)) + { OnRender(); - - ImGui.End(); + ImGui.End(); + } } - public virtual void OnInit() { Log.Trace("Creating window ({})", Title); } + public virtual void OnInit() {} public virtual void OnRender() {} - public virtual void OnClose() { Log.Trace("Closing window ({})", Title); } + public virtual void OnClose() {} } } diff --git a/Editor/src/ImGuiLayer.bf b/Editor/src/ImGuiLayer.bf deleted file mode 100644 index 827a23f..0000000 --- a/Editor/src/ImGuiLayer.bf +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Collections; -using SteelEngine; -using SteelEngine.Events; -using SteelEngine.Window; -using imgui_beef; -using glfw_beef; - -namespace SteelEditor -{ - public class ImGuiLayer : Layer - { - private float _time = 0.0f; - - private Window _window; - private List _editorWindows = new .(); - - public this(Window window) : base("ImGuiLayer") - { - _window = window; - } - - public override void OnAttach() - { - ImGui.CreateContext(); - - var style = ref ImGui.GetStyle(); - style.WindowMenuButtonPosition = .None; // This disables the collapse button on windows - ImGui.StyleColorsClassic(&style); - - ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, true); - ImGuiImplOpengl3.Init(=> Glfw.GetProcAddress); - - Log.Trace("OpenGL version: {}", ImGuiImplOpengl3.[Friend]g_GlVersion); - Log.Trace("GLSL version: {}", ImGuiImplOpengl3.[Friend]g_GlslVersionString); - } - - public override void OnDetach() - { - for (var editorWindow in _editorWindows) - { - editorWindow.OnClose(); - delete editorWindow; - } - - delete _editorWindows; - - ImGuiImplOpengl3.Shutdown(); - ImGuiImplGlfw.Shutdown(); - ImGui.DestroyContext(); - } - - public override void OnUpdate() - { - var io = ref ImGui.GetIO(); - var app = Application.Instance; - io.DisplaySize = ImGui.Vec2(app.Window.GetSize.X, app.Window.GetSize.Y); - ImGuiImplOpengl3.NewFrame(); - ImGuiImplGlfw.NewFrame(); - ImGui.NewFrame(); - - // Should be changed to use Steel DeltaTime - float time = (float) Glfw.GetTime(); - io.DeltaTime = _time > 0.0f ? (time - _time) : (1.0f / 60.0f); - _time = time; - - // Update ImGui windows - for (var editorWindow in _editorWindows) - { - if (editorWindow.IsActive) - editorWindow.Update(); - else - CloseWindow(editorWindow); - } - - // Background color - ImGuiImplOpengl3GL.glClearColor(0.45f, 0.55f, 0.60f, 1.00f); - ImGuiImplOpengl3GL.glClear(ImGuiImplOpengl3GL.GL_COLOR_BUFFER_BIT); - - // ImGui rendering - ImGui.Render(); - ImGuiImplOpengl3.RenderDrawData(ImGui.GetDrawData()); - } - - public override void OnEvent(Event event) - { - - } - - public void AddWindow(EditorWindow window) - { - _editorWindows.Add(window); - } - - public void CloseWindow(EditorWindow window) - { - window.OnClose(); - _editorWindows.Remove(window); - delete window; - } - } -} \ No newline at end of file diff --git a/Editor/src/Program.bf b/Editor/src/Program.bf index 28001ce..21303c4 100644 --- a/Editor/src/Program.bf +++ b/Editor/src/Program.bf @@ -1,4 +1,5 @@ using System; +using JetFistGames.Toml; namespace SteelEditor { @@ -6,6 +7,12 @@ namespace SteelEditor { public static int Main(String[] args) { + /*var serialized = scope String(); + var style = imgui_beef.ImGui.Style(); + TomlSerializer.Write(style, serialized); + + Console.WriteLine(serialized);*/ + var editor = new Editor(); editor.Run(); delete editor; diff --git a/Editor/src/SteelPath.bf b/Editor/src/SteelPath.bf new file mode 100644 index 0000000..4bd3b5c --- /dev/null +++ b/Editor/src/SteelPath.bf @@ -0,0 +1,22 @@ +using System; +using System.IO; + +namespace SteelEngine +{ + extension SteelPath + { + public static void GetEditorUserFolder(String relativePath, String target, bool create = false) + { + var path = scope String(); + Path.InternalCombine(path, "Editor", relativePath); + GetUserFolder(path, target, create); + } + + public static void GetEditorUserFile(String relativePath, String target, bool create = false) + { + var path = scope String(); + Path.InternalCombine(path, "Editor", relativePath); + GetUserFile(path, target, create); + } + } +} diff --git a/Editor/src/TestWindow.bf b/Editor/src/TestWindow.bf deleted file mode 100644 index 4a36367..0000000 --- a/Editor/src/TestWindow.bf +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using SteelEngine; - -namespace SteelEditor -{ - public class TestWindow : EditorWindow - { - public override StringView Title => "Test"; - - private bool _isChecked = false; - - private String _previousTextInput = new String() ~ delete _; - - private int _intInput = 0; - - public override void OnRender() - { - if (EditorGUI.Button("TestButton")) - Log.Trace("You hit the test button!"); - - EditorGUI.Text("Try hitting this checkbox"); - - _isChecked = EditorGUI.Checkbox("Checkbox", _isChecked); - - EditorGUI.LabelText("Value: ", "{}", _isChecked); - - String textInput = scope String(); - EditorGUI.InputText("InputText", textInput); - if (textInput != _previousTextInput) - { - Log.Trace("Input: {}", textInput); - _previousTextInput.Set(textInput); - } - - #unwarn - EditorGUI.InputInt("InputInt", ref _intInput); - } - } -} diff --git a/Editor/src/Windows/ConsoleWindow.bf b/Editor/src/Windows/ConsoleWindow.bf new file mode 100644 index 0000000..1ebd7a8 --- /dev/null +++ b/Editor/src/Windows/ConsoleWindow.bf @@ -0,0 +1,161 @@ +using System; +using System.IO; +using System.Collections; +using SteelEngine; +using SteelEngine.Math; +using SteelEngine.Console; +using SteelEditor; +using imgui_beef; + +namespace SteelEditor.Windows +{ + public class ConsoleWindow : EditorWindow + { + public override StringView Title => "Console"; + + public ImGui.Vec4 TraceColor = .(0.603f, 0.603f, 0.035f, 1f); + public ImGui.Vec4 WarningColor = .(0.93f, 0.82f, 0.01f, 1f); + public ImGui.Vec4 ErrorColor = .(0.952f, 0.2f, 0.011f, 1f); + + private String _commandBuffer = new .() ~ delete _; + private List<(String str, LogLevel level)> _log = new .() ~ { ClearLog(); delete _log; }; + + private bool _scrollToBottom = false; + private LogLevel _minLogLevel = .Trace; + private ConsoleType _consoleType = .Log; + private GameConsole _gameConsole = new .() ~ delete _; + + private int _commandStartIndex = 0; + private int _commandIndex = 0; + private int _newCommandIndex = 1; + + private EditorGUI.HistoryCallback _historyCallback = new => OnCommandHistoryChange ~ delete _; + + private const float consoleComboWidth = 86; + private const float clearButtonOffset = 55; + private const float levelComboWidth = 100; + + public override void OnInit() + { + Log.AddCallback(new (str, level) => _log.Add((new String(str), level))); + } + + public override void OnRender() + { + ImGui.PushItemWidth(consoleComboWidth); + EditorGUI.Combo("Console:", ref _consoleType); + ImGui.PopItemWidth(); + + ImGui.SameLine(ImGui.GetWindowWidth() - clearButtonOffset); + if (EditorGUI.Button("Clear")) + Clear(); + + ImGui.PushItemWidth(levelComboWidth); + EditorGUI.Combo("Level:", ref _minLogLevel); + ImGui.PopItemWidth(); + + var footerSpacing = ImGui.GetStyle().ItemSpacing.y + ImGui.GetFrameHeightWithSpacing(); + ImGui.BeginChild("CommandScrollingRegion", .(0, -footerSpacing), false, .HorizontalScrollbar); + + if (_consoleType == .Game) + { + for (int i = _commandStartIndex; i < _gameConsole.History.Count; i++) + ImGui.Text(scope String()..AppendF("> {}\n", StringView(_gameConsole.History.AtIndex(i)))); + } + else + { + for (var message in _log) + { + if (message.level < _minLogLevel) + continue; + + bool hasColor = true; + ImGui.Vec4 color = .(); + + switch (message.level) + { + case .Trace: + color = TraceColor; + break; + case .Warning: + color = WarningColor; + break; + case .Error: + color = ErrorColor; + break; + default: + hasColor = false; + } + + ImGui.PushStyleColor(.Text, color); + ImGui.TextUnformatted(message.str.Ptr); + ImGui.PopStyleColor(); + } + } + + if (_scrollToBottom) + ImGui.SetScrollHereY(1.0f); + _scrollToBottom = false; + + ImGui.EndChild(); + + EditorGUI.Line(); + ImGui.PushItemWidth(-10); + if (EditorGUI.Input(scope String()..AppendF("##CommandInputBuffer_{}", _commandIndex), _commandBuffer, "", 256, _historyCallback) && !_commandBuffer.IsEmpty) + { + _consoleType = .Game; + _gameConsole.History.Add(_commandBuffer); + + ImGui.SetKeyboardFocusHere(-1); + _scrollToBottom = true; + + _gameConsole.Execute(_commandBuffer); + ClearCommandBuffer(); + } + ImGui.PopItemWidth(); + } + + private void OnCommandHistoryChange(VerticalDirection dir) + { + if (dir == .Up && _commandIndex > _commandStartIndex) + _commandIndex--; + else if (_commandIndex < _newCommandIndex) + _commandIndex++; + + ImGui.SetKeyboardFocusHere(-1); + } + + public void Clear() + { + if (_consoleType == .Log) + ClearLog(); + else + ClearCommands(); + } + + public void ClearLog() + { + for (var log in _log) + delete log.str; + _log.Clear(); + } + + public void ClearCommands() + { + _commandStartIndex = _newCommandIndex; + _commandIndex = _commandStartIndex; + } + + public void ClearCommandBuffer() + { + _commandIndex = _newCommandIndex; + _newCommandIndex++; + } + + private enum ConsoleType + { + Log, + Game + } + } +} diff --git a/Editor/src/Windows/StyleWindow.bf b/Editor/src/Windows/StyleWindow.bf new file mode 100644 index 0000000..be9da2b --- /dev/null +++ b/Editor/src/Windows/StyleWindow.bf @@ -0,0 +1,18 @@ +using System; +using imgui_beef; + +namespace SteelEditor.Windows +{ + public class StyleWindow : EditorWindow + { + public override StringView Title => "Style"; + + public override void OnRender() + { + ImGui.ShowStyleEditor(); + + if (EditorGUI.Button("Save")) + Editor.SaveConfig(); + } + } +} diff --git a/Editor/src/Windows/TestWindow.bf b/Editor/src/Windows/TestWindow.bf new file mode 100644 index 0000000..5b3c6e2 --- /dev/null +++ b/Editor/src/Windows/TestWindow.bf @@ -0,0 +1,51 @@ +using System; +using System.Collections; +using SteelEngine; +using SteelEngine.Math; + +namespace SteelEditor.Windows +{ + public class TestWindow : EditorWindow + { + public override StringView Title => "Test"; + + private bool _isChecked = false; + + private String _textInput = new String() ~ delete _; + private String _hintTextInput = new String() ~ delete _; + private int _intInput = 0; + private Vector2 _vector2Input; + private Vector3 _vector3Input; + private ComboItem _comboItem = .Item1; + + public override void OnRender() + { + if (EditorGUI.Button("TestButton")) + Log.Trace("You hit the test button!"); + + EditorGUI.Text("Try hitting this checkbox"); + + _isChecked = EditorGUI.Checkbox("Checkbox", _isChecked); + if (_isChecked) + EditorGUI.Text("Checked!"); + + EditorGUI.Input("Input", _textInput); + + EditorGUI.Input("Input with hint", _hintTextInput, "Enter text here"); + + EditorGUI.InputInt("Int", ref _intInput); + + EditorGUI.InputVector2("Vector2", ref _vector2Input); + EditorGUI.InputVector3("Vector3", ref _vector3Input); + + EditorGUI.Combo("Combo", ref _comboItem); + } + + private enum ComboItem + { + Item1, + Item2, + Item3 + } + } +} diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 44f2bcc..bafb070 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -34,7 +34,31 @@ namespace SteelEngine Log.Trace("Initiating application"); Instance = this; - Log.AddHandle(Console.Out); + Log.AddCallback(new (str, level) => + { + ConsoleColor color; + + switch (level) + { + case .Trace: + color = .Gray; + break; + case .Info: + color = .White; + break; + case .Warning: + color = .Yellow; + break; + case .Error, .Fatal: + color = .Red; + break; + } + + var origin = Console.ForegroundColor; + Console.ForegroundColor = color; + Console.WriteLine(str); + Console.ForegroundColor = origin; + }); _components = new Dictionary(); _componentsToDelete = new List(); @@ -126,6 +150,7 @@ namespace SteelEngine Glfw.SetErrorCallback(_errorCallback, true); + Time.[Friend]Initialize(); _inputManager.Initialize(); for (let system in _systems) { @@ -140,7 +165,7 @@ namespace SteelEngine while (_isRunning) { - Update(0f); // Should eventually send a delta representing the time between frames. + Update(); Draw(); } } @@ -154,8 +179,6 @@ namespace SteelEngine // Gets called when an event occurs in the window public void OnEvent(Event event) { - _inputManager.OnEvent(event); - var dispatcher = scope EventDispatcher(event); dispatcher.Dispatch(scope => OnWindowClose); @@ -163,8 +186,10 @@ namespace SteelEngine { layer.OnEvent(event); if (event.IsHandled) - break; + return; } + + _inputManager.OnEvent(event); } private void OnGlfwError(Glfw.Error error) @@ -178,22 +203,28 @@ namespace SteelEngine return true; } + protected virtual void OnUpdate() { } - private void Update(float delta) + private void Update() { + let dt = Time.[Friend]Update(); + _inputManager.Update(); DeleteQueuedComponents(); DeleteQueuedEntities(); + for (let system in _systems) { system.[Friend]PreUpdate(); - system.[Friend]Update(delta); + system.[Friend]Update(dt); system.[Friend]PostUpdate(); } for (var layer in _layerStack) layer.OnUpdate(); + + OnUpdate(); } public void PushLayer(Layer layer) diff --git a/Engine/src/Console/CVar.bf b/Engine/src/Console/CVar.bf new file mode 100644 index 0000000..9782a29 --- /dev/null +++ b/Engine/src/Console/CVar.bf @@ -0,0 +1,124 @@ +using System; +using System.Collections; + +namespace SteelEngine.Console +{ + abstract class CVar + { + protected String _name ~ delete _; + protected String _help ~ delete _; + + public StringView Name => _name; + public StringView Help => _help; + public CVarFlags Flags { get; protected set; } + + public abstract int64 GetValueInt32(); + public abstract int64 GetValueInt64(); + public abstract float GetValueFloat() ; + public abstract void GetValueString(String buffer) ; + + public abstract bool Execute(StringView line, Span args); + + protected this(StringView name, StringView help, CVarFlags flags) + { + _name = new .(name); + _help = new .(help); + Flags = flags; + } + } + + public delegate void OnCVarChange(CVar cvar); + + class ConsoleVar : CVar where T : var + { + protected T* _value; + protected OnCVarChange _onChange ~ delete _; + + public override int64 GetValueInt32() { return CVarUtil.GetValueInt32(*_value); } + public override int64 GetValueInt64() { return CVarUtil.GetValueInt64(*_value); } + public override float GetValueFloat() { return CVarUtil.GetValueFloat(*_value); } + public override void GetValueString(String buffer) { (*_value).ToString(buffer); } + + public override bool Execute(StringView line, Span args) + { + if (args.Length >= 1 && CVarUtil.TryParse(args[0], ref *_value)) + { + _onChange?.Invoke(this); + return true; + } + + return false; + } + + public this(StringView name, StringView help, T* val, CVarFlags flags, OnCVarChange onChange) : base(name, help, flags) + { + _value = val; + _onChange = _onChange; + } + } + + + class EnumConsoleVar : CVar where TEnum: Enum + { + protected TEnum* _value; + protected OnCVarChange _onChange ~ delete _; + + public override int64 GetValueInt32() { return (*_value); } + public override int64 GetValueInt64() { return (*_value); } + public override float GetValueFloat() { return (int)(*_value); } + public override void GetValueString(String buffer) { (*_value).ToString(buffer); } + + public override bool Execute(StringView line, Span args) + { + if (args.Length >= 1) + { + if (TEnum.Parse(args[0], true) case .Ok(let val)) + { + *_value = val; + _onChange?.Invoke(this); + return true; + } + if((int64.Parse(args[0]) case .Ok(var iVal)) && EnumUtils.HasValue(iVal)) + { + *_value = *(TEnum*)&iVal; + _onChange?.Invoke(this); + return true; + } + + } + + return false; + } + + public this(StringView name, StringView help, TEnum* val, CVarFlags flags, OnCVarChange onChange) : base(name, help, flags) + { + _value = val; + _onChange = _onChange; + } + } + + public delegate bool OnCmdExecute(ConsoleCommand cmd, StringView line, Span args); + + class ConsoleCommand : CVar + { + protected OnCmdExecute _onExecute ~ delete _; + + public override int64 GetValueInt32() => 0; + public override int64 GetValueInt64() => 0; + public override float GetValueFloat() => 0; + public override void GetValueString(String buffer) {} + + public override bool Execute(StringView line, Span args) + { + if (_onExecute == null) + return false; + + return _onExecute.Invoke(this, line, args); + } + + public this(StringView name, StringView help, OnCmdExecute onExec, CVarFlags flags) : base(name, help, flags) + { + _onExecute = onExec; + } + } +} diff --git a/Engine/src/Console/CVarFlags.bf b/Engine/src/Console/CVarFlags.bf new file mode 100644 index 0000000..12b12eb --- /dev/null +++ b/Engine/src/Console/CVarFlags.bf @@ -0,0 +1,17 @@ +namespace SteelEngine.Console +{ + enum CVarFlags + { + None = 0x0000, + // Can be executed only when sv.cheats is True + Cheat = 0x0001, + // Indicates that this CVar will change value on registration to match value in config file + Config = 0x0002, + // This flag is set when CVar was present in config file + WasInConfig = 0x0004, + // CVar value was changed after config load + Changed = 0x0008, + // CVar won't show in console but can be changed through code + Hidden = 0x0010, + } +} diff --git a/Engine/src/Console/CVarUtil.bf b/Engine/src/Console/CVarUtil.bf new file mode 100644 index 0000000..93ebb34 --- /dev/null +++ b/Engine/src/Console/CVarUtil.bf @@ -0,0 +1,148 @@ +using System; + +namespace SteelEngine.Console +{ + static class CVarUtil + { + public static bool TryParse(StringView strval, ref bool result) + { + switch(strval) + { + case "true", "True", "TRUE", "1": + result = true; + case "false", "False", "FALSE", "0": + result = false; + } + + return false; + } + + public static bool TryParse(StringView strval, ref int32 result) + { + if (int32.Parse(strval) case .Ok(let val)) + { + result = val; + return true; + } + + return false; + } + + public static bool TryParse(StringView strval, ref int64 result) + { + if (int64.Parse(strval) case .Ok(let val)) + { + result = val; + return true; + } + + return false; + } + + public static bool TryParse(StringView strval, ref float result) + { + if (float.Parse(strval) case .Ok(let val)) + { + result = val; + return true; + } + + return false; + } + + public static bool TryParse(StringView strval, ref String result) + { + result.Clear(); + result.Append(strval); + return true; + } + + public static int32 GetValueInt32(bool* val) + { + return *val ? 1 : 0; + } + + public static int32 GetValueInt32(int32* val) + { + return *val; + } + + public static int32 GetValueInt32(int64* val) + { + return (int32)*val; + } + + public static int32 GetValueInt32(float* val) + { + return (int32)*val; + } + + public static int32 GetValueInt32(String* val) + { + if (int32.Parse(*val) case .Ok(let res)) + { + return res; + } + return 0; + } + + public static int32 GetValueInt64(bool* val) + { + return *val ? 1 : 0; + } + + public static int64 GetValueInt64(int32* val) + { + return (int64)*val; + } + + public static int64 GetValueInt64(int64* val) + { + return *val; + } + + public static int64 GetValueInt64(float* val) + { + return (int64)*val; + } + + public static int64 GetValueInt64(String* val) + { + if (int64.Parse(*val) case .Ok(let res)) + { + return res; + } + return 0; + } + + public static int32 GetValueFloat(bool* val) + { + return *val ? 1 : 0; + } + + public static float GetValueFloat(int32* val) + { + return (float)*val; + } + + public static float GetValueFloat(int64* val) + { + return (float)*val; + } + + public static float GetValueFloat(float* val) + { + return *val; + } + + public static float GetValueFloat(String* val) + { + if (float.Parse(*val) case .Ok(let res)) + { + return res; + } + return 0; + } + + } +} diff --git a/Engine/src/Console/CommandHistory.bf b/Engine/src/Console/CommandHistory.bf new file mode 100644 index 0000000..e59e9f4 --- /dev/null +++ b/Engine/src/Console/CommandHistory.bf @@ -0,0 +1,64 @@ +using System; + +namespace SteelEngine.Console +{ + class CommandHistory + { + private String[] _history ~ DeleteContainerAndItems!(_); + private int _addIndex; + private int _pos; + + public int Count => _addIndex; + + public this(int maxCount) + { + _history = new String[maxCount]; + } + + public void Add(StringView line) + { + if (_addIndex >= _history.Count) + { + delete _history[0]; + + int prev = 0; + int cur = 1; + for (; cur < _history.Count; cur++) + { + _history[prev] = _history[cur]; + prev++; + } + + _history[cur] = new .(line); + } + else + { + _history[_addIndex++] = new .(line); + } + } + + public StringView HistoryUp() + { + if (_pos >= _history.Count - 1) + return default; + + return AtIndex(++_pos); + } + + public StringView HistoryDown() + { + if (_pos <= 0) + return default; + + return AtIndex(--_pos); + } + + public StringView AtIndex(int index) + { + if (index < 0 || index >= Count) + return default; + + return _history[index]; + } + } +} diff --git a/Engine/src/Console/ConsoleLineParser.bf b/Engine/src/Console/ConsoleLineParser.bf new file mode 100644 index 0000000..92d6a6c --- /dev/null +++ b/Engine/src/Console/ConsoleLineParser.bf @@ -0,0 +1,105 @@ +using System; +using System.Collections; + +namespace SteelEngine.Console +{ + class ConsoleLineParser + { + const char8 SEPARATOR_CHAR = ';'; + const char8 QUOTE_CHAR = '"'; + + static void SkipWhitespace(StringView input, ref int i) + { + while (i < input.Length) + { + if (!input[i].IsWhiteSpace) + break; + + i++; + } + } + + static StringView? ParseNormal(StringView input, ref int i) + { + let startPos = i; + while (i < input.Length) + { + if (input[i].IsWhiteSpace || input[i] == SEPARATOR_CHAR) + break; + + i++; + } + + if (startPos < i) + return .(input, startPos, i - startPos); + + return default; + } + + static StringView? ParseQuotes(StringView input, ref int i) + { + // @TODO(fusion) - how to handle when quote is not in pair currently this is ignored + + bool isPair = false; + var startPos = i; + + while (i < input.Length) + { + i++; + + if (input[i] == QUOTE_CHAR && input[i-1] != '\\') + { + isPair = true; + i++; + break; + } + } + + if (startPos < i) + { + if (isPair) + { + startPos++; + return .(input, startPos, i - 1 - startPos); + } + + return .(input, startPos, i - startPos); + } + + return default; + } + + public static bool Tokenize(StringView input, ref int i, ref int start, List tokens) + { + tokens.Clear(); + + while (i < input.Length) + { + SkipWhitespace(input, ref i); + if (i < input.Length) + { + if (tokens.IsEmpty) + start = i; + + if (input[i] == SEPARATOR_CHAR && !tokens.IsEmpty) + break; + + StringView? token; + if (input[i] == '"') + token = ParseQuotes(input, ref i); + else + token = ParseNormal(input, ref i); + + if (token.HasValue) + tokens.Add(token.Value); + else + i++; + } + } + + + + return !tokens.IsEmpty; + } + } +} diff --git a/Engine/src/Console/EnumUtils.bf b/Engine/src/Console/EnumUtils.bf new file mode 100644 index 0000000..31d7d59 --- /dev/null +++ b/Engine/src/Console/EnumUtils.bf @@ -0,0 +1,29 @@ +using System; +using System.Collections; + +namespace SteelEngine.Console +{ + public static class EnumUtils where TEnum : Enum + { + private static Dictionary _keys ~ delete _; + private static HashSet _values ~ delete _; + + static this() + { + _keys = new .(); + _values = new .(); + + let type = typeof(TEnum); + for (var field in type.GetFields()) + { + _values.Add(field.[Friend]mFieldData.[Friend]mData); + _keys.Add(field.[Friend]mFieldData.[Friend]mName, field.[Friend]mFieldData.[Friend]mData); + } + } + + public static bool HasValue(int iVal) + { + return _values.Contains(iVal); + } + } +} diff --git a/Engine/src/Console/ExampleUsage.bf b/Engine/src/Console/ExampleUsage.bf new file mode 100644 index 0000000..d6c6a39 --- /dev/null +++ b/Engine/src/Console/ExampleUsage.bf @@ -0,0 +1,62 @@ +using System; +namespace SteelEngine.Console +{ + class ExampleUsage + { + public static void Run() + { + GameConsole c = scope .(); + int32 x = 5; + int64 q = 6; + float f = 7; + String s = scope .("sad"); + CVarFlags flags = .Cheat; + + String buffer = scope .(); + let xv = c.RegisterCVar("sv.int32", "", ref x)..GetValueString(buffer); + let qv = c.RegisterCVar("sv.int64", "", ref q)..GetValueString(buffer); + let fv = c.RegisterCVar("sv.float", "", ref f)..GetValueString(buffer); + let sv = c.RegisterCVar("sv.string", "", ref s)..GetValueString(buffer); + let flv = c.RegisterCVar("sv.enum", "", ref flags)..GetValueString(buffer); + + c.Execute("sv.int32 16; sv.float 14.1;"); + c.Execute("sv.string \"wowo dsjakdas\"; sv.float 14.1;"); + c.Execute("sv.string \"\";dasd"); + c.Execute("echo halo you beautiful person; echo second command?;"); + + c.Enqueue("wait.seconds 1"); + + String line = scope .(); + + Time.[Friend]Initialize(); + + while(true) + { + Time.[Friend]Update(); + + line.Clear(); + Console.ReadLine(line); + if (line == "quit") + break; + c.Enqueue(line); + c.Update(); + } + + x = 10; + q = 50; + f = 14.1f; + //s = "dasdadas"; + + flags = .Config; + + StringView[1] asd = .("12"); + + buffer.Append(" "); + xv.GetValueString(buffer); + qv.GetValueString(buffer); + fv.GetValueString(buffer); + sv.GetValueString(buffer); + flv.GetValueString(buffer); + } + } +} diff --git a/Engine/src/Console/GameConsole.bf b/Engine/src/Console/GameConsole.bf new file mode 100644 index 0000000..b58db33 --- /dev/null +++ b/Engine/src/Console/GameConsole.bf @@ -0,0 +1,222 @@ +using System; +using System.Collections; + +namespace SteelEngine.Console +{ + class GameConsole + { + const int HISTORY_SIZE = 50; + + private Dictionary _cvars = new Dictionary() ~ delete _; + private Queue _enqueuedCommands = new Queue() ~ delete _; + + public CommandHistory History = new CommandHistory(HISTORY_SIZE) ~ delete _; + + protected bool _cvarCheatsEnabled = false; + protected float _cvarWaitTime = 0; + protected int _cvarWaitFrames = 0; + + public LogLevel LogLevel { get; set; } + + public this() + { + RegisterCVar("sv.cheats", "Enable execution of commands with Cheat flag.", ref _cvarCheatsEnabled); + RegisterCVar("wait.frames", "Wait number of frames before continuing execution of commands.", ref _cvarWaitFrames); + RegisterCVar("wait.seconds", "Wait number of real time seconds before continuing execution of commands.", ref _cvarWaitTime); + + + RegisterCommand("echo", "", new (cmd, line, args) => + { + if (line.Length <= 4) + return false; + + let cmdNameLength = cmd.Name.Length + 1; + let str = StringView(line, cmdNameLength, line.Length - cmdNameLength); + if (!str.IsEmpty) + Log.Info(str); + + return true; + }); + + RegisterCommand("help", "Show list of variables and commands", new (cmd, line, args) => + { + StringView filter = default; + if(args.Length >= 1) + { + filter = args[0]; + } + + for(let v in _cvars) + { + Log.Info("{0} - {1}", v.key, v.value.Help); + } + + return true; + }); + } + + public ~this() + { + for (let cvar in _cvars.Values) + delete cvar; + } + + protected mixin CheckCVarRegistered(StringView name) + { + if (_cvars.TryGetValue(name, let cvar)) + { + Log.Warning("CVar '{0}' already registered!", name); + return cvar; + } + } + + public CVar RegisterCVar(StringView name, StringView help, ref bool varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); + return _cvars[cvar.Name] = cvar; + } + + public CVar RegisterCVar(StringView name, StringView help, ref int32 varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); + return _cvars[cvar.Name] = cvar; + } + + public CVar RegisterCVar(StringView name, StringView help, ref int64 varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); + return _cvars[cvar.Name] = cvar; + } + + public CVar RegisterCVar(StringView name, StringView help, ref float varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); + return _cvars[cvar.Name] = cvar; + } + + public CVar RegisterCVar(StringView name, StringView help, ref String varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); + return _cvars[cvar.Name] = cvar; + } + + public CVar RegisterCVar(StringView name, StringView help, ref TEnum varRef, CVarFlags flags = .None, OnCVarChange onChange = null) where TEnum : Enum + { + CheckCVarRegistered!(name); + let cvar = new EnumConsoleVar(name, help, &varRef, flags, onChange); + return _cvars[cvar.Name] = cvar; + } + + public CVar RegisterCommand(StringView name, StringView help, OnCmdExecute onExecute, CVarFlags flags = .None) + { + CheckCVarRegistered!(name); + let cvar = new ConsoleCommand(name, help, onExecute , flags); + return _cvars[cvar.Name] = cvar; + } + + public bool UnregisterCVar(StringView name) + { + if (_cvars.GetAndRemove(name) case .Ok(let val)) + { + return true; + } + return false; + } + + public bool UnregisterCVar(CVar cvar) + { + return UnregisterCVar(cvar.Name); + } + + public CVar GetCVar(StringView name) + { + return _cvars.GetValueOrDefault(name); + } + + public void Execute(StringView cmdLine) + { + int i, start; + start = i = 0; + + List tokens = scope .(); + + while (ConsoleLineParser.Tokenize(cmdLine, ref i, ref start, tokens)) + { + System.Diagnostics.Debug.Assert(!tokens.IsEmpty); + StringView command = .(cmdLine, start, i - start); + ExecuteLineTokens(command, .(tokens.Ptr, tokens.Count)); + } + } + + protected void ExecuteLineTokens(StringView line, Span tokens) + { + let cmdName = tokens[0]; + if (_cvars.TryGetValue(cmdName, let cvar)) + { + if (tokens.Length > 1 && tokens[1] == "?") + { + String buffer = scope .(); + cvar.GetValueString(buffer); + if (buffer.IsEmpty) + Log.Info("{0} - '{1}'", cvar.Name, cvar.Help); + else + Log.Info("{0} {1} - '{2}'", cvar.Name, buffer, cvar.Help); + + return; + } + + let result = cvar.Execute(line, .(tokens.Ptr+1, tokens.Length-1)); + if (!result) + { + Log.Error("Error occurred while executing '{0}'", cmdName); + } + } + else + { + Log.Error("Couldn't find cvar named '{0}'", cmdName); + } + } + + protected void AddHistory(StringView cmdLine) + { + History.Add(cmdLine); + } + + public void Enqueue(StringView cmdLine) + { + AddHistory(cmdLine); + EnqueueNoHistory(cmdLine); + } + + public void EnqueueNoHistory(StringView cmdLine) + { + _enqueuedCommands.Enqueue(new .(cmdLine)); + } + + public void Update() + { + let dt = Time.DeltaTimeUnscaled; + if (_cvarWaitTime > 0) { + _cvarWaitTime -= dt; + return; + } + + if (_cvarWaitFrames > 0) { + _cvarWaitFrames--; + return; + } + + while(!(_cvarWaitTime > 0 || _cvarWaitFrames > 0) && _enqueuedCommands.Count > 0) + { + let line = _enqueuedCommands.Dequeue(); + Execute(line); + delete line; + } + } + } +} diff --git a/Engine/src/Log.bf b/Engine/src/Log.bf index 24c78f6..0aa6940 100644 --- a/Engine/src/Log.bf +++ b/Engine/src/Log.bf @@ -9,14 +9,23 @@ namespace SteelEngine { public static LogLevel LogLevel = .Trace; - private static List _handles = new .() ~ delete _; + public delegate void LogCallback(StringView str, LogLevel level); - public static void AddHandle(StreamWriter handle) => _handles.Add(handle); + private static List _callbacks = new .() ~ DeleteContainerAndItems!(_); + + public static void AddCallback(LogCallback callback) => _callbacks.Add(callback); public static void Trace(StringView format, params Object[] args) => Print(.Trace, format, params args); + public static void Trace(Object arg) => Print(.Trace, "{}", arg); + public static void Info(StringView format, params Object[] args) => Print(.Info, format, params args); + public static void Info(Object arg) => Print(.Info, "{}", arg); + public static void Warning(StringView format, params Object[] args) => Print(.Warning, format, params args); + public static void Warning(Object arg) => Print(.Warning, "{}", arg); + public static void Error(StringView format, params Object[] args) => Print(.Error, format, params args); + public static void Error(Object arg) => Print(.Error, "{}", arg); public static void Fatal(StringView format, params Object[] args) { @@ -27,36 +36,12 @@ namespace SteelEngine private static void Print(LogLevel level, StringView format, params Object[] args) { - ConsoleColor color; - - switch (level) - { - case .Trace: - color = .Gray; - break; - case .Info: - color = .White; - break; - case .Warning: - color = .Yellow; - break; - case .Error, .Fatal: - color = .Red; - break; - } - - var origin = Console.ForegroundColor; // Store original color - Console.ForegroundColor = color; // Set new color - var time = scope String()..AppendF("{}:{}:{}", DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond); // Format current time var message = scope String()..AppendF(format, params args); // Format users message - var line = scope String()..AppendF("[{}] {}: {}", time, level, message); // Format line to print - - // Print the line to all handles - for (var handle in _handles) - handle.WriteLine(line); + var line = scope String()..AppendF("[{}] [{}] {}", time, level, message); // Format line to print - Console.ForegroundColor = origin; // Set color back to original + for (var callback in _callbacks) + callback(line, level); } } } diff --git a/Engine/src/Math/Direction.bf b/Engine/src/Math/Direction.bf new file mode 100644 index 0000000..309861c --- /dev/null +++ b/Engine/src/Math/Direction.bf @@ -0,0 +1,22 @@ +namespace SteelEngine.Math +{ + enum Direction + { + Up, + Down, + Left, + Right + } + + enum VerticalDirection + { + Up, + Down + } + + enum HorizontalDirection + { + Left, + Right + } +} diff --git a/Engine/src/Math/Helpers.bf b/Engine/src/Math/Helpers.bf new file mode 100644 index 0000000..68f7790 --- /dev/null +++ b/Engine/src/Math/Helpers.bf @@ -0,0 +1,36 @@ +using System; + +namespace SteelEngine.Math +{ + public class Helpers + { + public static void HashCombine(ref int seed, int _hash) + { + int hash = _hash; + hash += 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= hash; + } + + } + + public static + { + public static mixin Deg2Rad(float deg) + { + deg / 180 * System.Math.PI_f + } + public static mixin Rad2Deg(float rad) + { + rad / System.Math.PI_d * 180 + } + + public static mixin Deg2Rad(double deg) + { + deg / 180 * System.Math.PI_f + } + public static mixin Rad2Deg(double rad) + { + rad / System.Math.PI_d * 180 + } + } +} diff --git a/Engine/src/Math/Matrix33.bf b/Engine/src/Math/Matrix33.bf new file mode 100644 index 0000000..d52b8c4 --- /dev/null +++ b/Engine/src/Math/Matrix33.bf @@ -0,0 +1,195 @@ +using System; + +namespace SteelEngine.Math +{ + [CRepr, Union] + public struct Matrix33 + where T : operator T * T, operator T + T, operator T - T, operator T / T, operator -T, operator implicit float, operator explicit double + where int : operator T <=> T + where double : operator implicit T + { + public const let ROWS = 3; + public const let COLUMNS = 3; + public const let SIZE = ROWS * COLUMNS; + + public T[COLUMNS][ROWS] data2d; + public T[SIZE] data; + public Vector3[COLUMNS] columns; + + public this() + { + this = default; + } + + public this(T m00, T m01, T m02, + T m10, T m11, T m12, + T m20, T m21, T m22) + { + data = .(m00, m01, m02, + m10, m11, m12, + m20, m21, m22); + } + + public this(Vector3 c1, Vector3 c2, Vector3 c3) + { + columns = .(c1, c2, c3); + } + + public T m00 { [Inline] get { return data[0]; } [Inline] set mut { data[0] = value; } } + public T m01 { [Inline] get { return data[1]; } [Inline] set mut { data[1] = value; } } + public T m02 { [Inline] get { return data[2]; } [Inline] set mut { data[2] = value; } } + + public T m10 { [Inline] get { return data[3]; } [Inline] set mut { data[3] = value; } } + public T m11 { [Inline] get { return data[4]; } [Inline] set mut { data[4] = value; } } + public T m12 { [Inline] get { return data[5]; } [Inline] set mut { data[5] = value; } } + + public T m20 { [Inline] get { return data[6]; } [Inline] set mut { data[6] = value; } } + public T m21 { [Inline] get { return data[7]; } [Inline] set mut { data[7] = value; } } + public T m22 { [Inline] get { return data[8]; } [Inline] set mut { data[8] = value; } } + + public T this[int i] + { + [Inline] get { return data[i]; } + [Inline] set mut { data[i] = value; } + } + + public T this[int row, int column] + { + [Inline] get { return data2d[column][row]; } + [Inline] set mut { data2d[column][row] = value; } + } + + public Vector3 Column(int i) + { + return columns[i]; + } + + public static Self Zero => .(0,0,0, 0,0,0, 0,0,0); + + public static Self Identity => .(1,0,0, 0,1,0, 0,0,1); + + + public T Determinant + { + get + { + return m00 * (m11*m22 - m12*m21) - m01 * (m10*m22 - m12*m20) + m02 * (m10*m21 - m11*m20); + } + } + + public Self Inverse + { + get + { + // Find determinant of matrix. + T sub11 = data[4] * data[8] - data[5] * data[7], sub12 = -data[1] * data[8] + data[2] * data[7], + sub13 = data[1] * data[5] - data[2] * data[4]; + T determinant = data[0] * sub11 + data[3] * sub12 + data[6] * sub13; + + // Find determinants of 2x2 submatrices for the elements of the inverse. + Self inverse = .(sub11, sub12, sub13, + data[6] * data[5] - data[3] * data[8], data[0] * data[8] - data[6] * data[2], + data[3] * data[2] - data[0] * data[5], data[3] * data[7] - data[6] * data[4], + data[6] * data[1] - data[0] * data[7], data[0] * data[4] - data[3] * data[1]); + inverse *= (T)1 / determinant; + return inverse; + } + } + + public void Transpose() mut + { + Vector3[COLUMNS] tmp = ?; + tmp[0] = .(this[0, 0], this[0, 1], this[0, 2]); + tmp[1] = .(this[1, 0], this[1, 1], this[1, 2]); + tmp[2] = .(this[2, 0], this[2, 1], this[2, 2]); + columns = tmp; + } + + public Self Transposed + { + [Inline] + get + { + Self tmp = this; + return tmp..Transpose(); + } + } + + public static Self operator+(Self lv, Self rv) + { + Self tmp = lv; + tmp.columns[0] += rv.columns[0]; + tmp.columns[1] += rv.columns[1]; + tmp.columns[2] += rv.columns[2]; + return tmp; + } + + [Commutable] + public static Self operator+(Self lv, T rv) + { + Self tmp = lv; + tmp.columns[0] += rv; + tmp.columns[1] += rv; + tmp.columns[2] += rv; + return tmp; + } + + public static Self operator-(Self lv, Self rv) + { + Self tmp = lv; + tmp.columns[0] -= rv.columns[0]; + tmp.columns[1] -= rv.columns[1]; + tmp.columns[2] -= rv.columns[2]; + return tmp; + } + + [Commutable] + public static Self operator-(Self lv, T rv) + { + Self tmp = lv; + tmp.columns[0] -= rv; + tmp.columns[1] -= rv; + tmp.columns[2] -= rv; + return tmp; + } + + public static Self operator*(Self lv, Self rv) + { + Self tmp = ?; + { + Vector3 row = .(lv[0], lv[3], lv[6]); + tmp[0] = Vector3.DotProduct(rv.Column(0), row); + tmp[3] = Vector3.DotProduct(rv.Column(1), row); + tmp[6] = Vector3.DotProduct(rv.Column(2), row); + } + { + Vector3 row = .(lv[1], lv[4], lv[7]); + tmp[1] = Vector3.DotProduct(rv.Column(0), row); + tmp[4] = Vector3.DotProduct(rv.Column(1), row); + tmp[7] = Vector3.DotProduct(rv.Column(2), row); + } + { + Vector3 row = .(lv[2], lv[5], lv[8]); + tmp[2] = Vector3.DotProduct(rv.Column(0), row); + tmp[5] = Vector3.DotProduct(rv.Column(1), row); + tmp[8] = Vector3.DotProduct(rv.Column(2), row); + } + return tmp; + } + + [Commutable] + public static Self operator*(Self lv, T rv) + { + Self tmp = lv; + tmp.columns[0] *= rv; + tmp.columns[1] *= rv; + tmp.columns[2] *= rv; + return tmp; + } + + public static Self operator/(Self lv, T rv) + { + return lv * (1 / rv); + } + } +} diff --git a/Engine/src/Math/Matrix34.bf b/Engine/src/Math/Matrix34.bf new file mode 100644 index 0000000..ff3d5a9 --- /dev/null +++ b/Engine/src/Math/Matrix34.bf @@ -0,0 +1,72 @@ +using System; + +namespace SteelEngine.Math +{ + [CRepr, Union] + public struct Matrix34 + where T : operator T * T, operator T + T, operator T - T, operator T / T, operator -T, operator implicit float, operator explicit double + where int : operator T <=> T + where double : operator implicit T + { + public const let ROWS = 3; + public const let COLUMNS = 4; + public const let SIZE = ROWS * COLUMNS; + + public T[COLUMNS][ROWS] data2d; + public T[SIZE] data; + public Vector3[COLUMNS] columns; + + public this() + { + this = default; + } + + public this(T m00, T m01, T m02, T m03, + T m10, T m11, T m12, T m13, + T m20, T m21, T m22, T m23) + { + data = .(m00, m01, m02, m03, + m10, m11, m12, m13, + m20, m21, m22, m23); + } + + public this(Matrix33 m) + { + data = .(m[0],m[1],m[2], 1, + m[3],m[4],m[5], 1, + m[6],m[7],m[8], 1); + } + + public T m00 { [Inline] get { return data[0]; } [Inline] set mut { data[0] = value; } } + public T m01 { [Inline] get { return data[1]; } [Inline] set mut { data[1] = value; } } + public T m02 { [Inline] get { return data[2]; } [Inline] set mut { data[2] = value; } } + public T m03 { [Inline] get { return data[3]; } [Inline] set mut { data[3] = value; } } + + public T m10 { [Inline] get { return data[3]; } [Inline] set mut { data[4] = value; } } + public T m11 { [Inline] get { return data[4]; } [Inline] set mut { data[5] = value; } } + public T m12 { [Inline] get { return data[5]; } [Inline] set mut { data[6] = value; } } + public T m13 { [Inline] get { return data[7]; } [Inline] set mut { data[7] = value; } } + + public T m20 { [Inline] get { return data[6]; } [Inline] set mut { data[8] = value; } } + public T m21 { [Inline] get { return data[7]; } [Inline] set mut { data[9] = value; } } + public T m22 { [Inline] get { return data[8]; } [Inline] set mut { data[10] = value; } } + public T m23 { [Inline] get { return data[11]; } [Inline] set mut { data[11] = value; } } + + public T this[int i] + { + [Inline] get { return data[i]; } + [Inline] set mut { data[i] = value; } + } + + public T this[int row, int column] + { + [Inline] get { return data2d[column][row]; } + [Inline] set mut { data2d[column][row] = value; } + } + + public Vector3 Column(int i) + { + return columns[i]; + } + } +} diff --git a/Engine/src/Math/Matrix44.bf b/Engine/src/Math/Matrix44.bf new file mode 100644 index 0000000..c6aaef7 --- /dev/null +++ b/Engine/src/Math/Matrix44.bf @@ -0,0 +1,292 @@ +using System; + +namespace SteelEngine.Math +{ + [CRepr, Union] + public struct Matrix44 + where T : operator T * T, operator T + T, operator T - T, operator T / T, operator -T, operator implicit float, operator explicit double + where int : operator T <=> T + where double : operator implicit T + { + public const let ROWS = 4; + public const let COLUMNS = 4; + public const let SIZE = ROWS * COLUMNS; + + public T[COLUMNS][ROWS] data2d; + public T[SIZE] data; + public Vector4[COLUMNS] columns; + + public this() + { + this = default; + } + + public this(T m00, T m01, T m02, T m03, + T m10, T m11, T m12, T m13, + T m20, T m21, T m22, T m23, + T m30, T m31, T m32, T m33) + { + data = .(m00, m01, m02, m03, + m10, m11, m12, m13, + m20, m21, m22, m23, + m30, m31, m32, m33); + } + + public this(T[SIZE] values) + { + data = values; + } + + public this(Vector4 c1, Vector4 c2, Vector4 c3, Vector4 c4) + { + columns = .(c1, c2, c3, c4); + } + + public T m00 { [Inline] get { return data[0]; } [Inline] set mut { data[0] = value; } } + public T m01 { [Inline] get { return data[1]; } [Inline] set mut { data[1] = value; } } + public T m02 { [Inline] get { return data[2]; } [Inline] set mut { data[2] = value; } } + public T m03 { [Inline] get { return data[3]; } [Inline] set mut { data[3] = value; } } + + public T m10 { [Inline] get { return data[3]; } [Inline] set mut { data[4] = value; } } + public T m11 { [Inline] get { return data[4]; } [Inline] set mut { data[5] = value; } } + public T m12 { [Inline] get { return data[5]; } [Inline] set mut { data[6] = value; } } + public T m13 { [Inline] get { return data[7]; } [Inline] set mut { data[7] = value; } } + + public T m20 { [Inline] get { return data[6]; } [Inline] set mut { data[8] = value; } } + public T m21 { [Inline] get { return data[7]; } [Inline] set mut { data[9] = value; } } + public T m22 { [Inline] get { return data[8]; } [Inline] set mut { data[10] = value; } } + public T m23 { [Inline] get { return data[11]; } [Inline] set mut { data[11] = value; } } + + public T m30 { [Inline] get { return data[12]; } [Inline] set mut { data[12] = value; } } + public T m31 { [Inline] get { return data[13]; } [Inline] set mut { data[13] = value; } } + public T m32 { [Inline] get { return data[14]; } [Inline] set mut { data[14] = value; } } + public T m33 { [Inline] get { return data[15]; } [Inline] set mut { data[15] = value; } } + + public T this[int i] + { + get { return data[i]; } + set mut { data[i] = value; } + } + + public T this[int row, int column] + { + get { return data2d[column][row]; } + set mut { data2d[column][row] = value; } + } + + public Vector4 Column(int i) + { + return columns[i]; + } + + public static Self Zero => .(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0); + + public static Self Identity => .(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1); + + public Self Inverse + { + [Error("Not implemented")] + get { + Self inverse = ?; + + // @TODO(fusion) + return inverse; + } + } + + public T Trace + { + [Inline] + get + { + return data2d[0][0] + data2d[1][1] + data2d[2][2] + data2d[3][3]; + } + } + + public T Determinant + { + get + { + return m00*(m11*(m22*m33 - m23*m32) - m12*(m23*m31 - m21*m33) + m13*(m21*m32 - m22*m31)) - + m01*(m12*(m23*m30 - m20*m33) - m13*(m20*m32 - m22*m30) + m10*(m22*m33 - m23*m32)) + + m02*(m13*(m20*m31 - m21*m30) - m10*(m21*m33 - m23*m31) + m11*(m23*m30 - m20*m33)) - + m03*(m10*(m21*m32 - m22*m31) - m11*(m22*m30 - m20*m32) + m12*(m20*m31 - m21*m30)); + } + } + + public void Normalize() mut + { + T det = 1 / Determinant; + + columns[0] *= det; + columns[1] *= det; + columns[2] *= det; + columns[3] *= det; + } + + public Self Normalized + { + [Inline] + get + { + var tmp = this; + return tmp..Normalize(); + } + } + + public void Transpose() mut + { + Vector4[COLUMNS] tmp = ?; + tmp[0] = .(this[0, 0], this[0, 1], this[0, 2], this[0, 3]); + tmp[1] = .(this[1, 0], this[1, 1], this[1, 2], this[1, 3]); + tmp[2] = .(this[2, 0], this[2, 1], this[2, 2], this[2, 3]); + tmp[2] = .(this[3, 0], this[3, 1], this[3, 2], this[3, 3]); + columns = tmp; + } + + public Self Transposed + { + [Inline] + get + { + var tmp = this; + return tmp..Transpose(); + } + } + + public Matrix33 RotationMatrix + { + get { return .(data[0], data[1], data[2], + data[4], data[5], data[6], + data[8], data[9], data[10]); } + } + + public Vector3 TranslationVector3D => columns[3].xyz; + + public Vector3 ScaleVector3D + { + get { return .(columns[0].xyz.Length, + columns[1].xyz.Length, + columns[2].xyz.Length); } + } + + public static Self Perspective(T fovy, T aspect, T znear, T zfar, T handedness = 1) + { + let y = (T)(1 / Math.Tan(fovy * (T)0.5f)); + let x = y / aspect; + let zdist = (znear - zfar); + let zfar_per_zdist = zfar / zdist; + return .(x, 0, 0, 0, 0, y, 0, 0, 0, 0, + zfar_per_zdist * handedness, -1 * handedness, 0, 0, + 2.0f * znear * zfar_per_zdist, 0); + } + + public static Self Ortho(T left, T right, T bottom, T top, T znear, T zfar, T handedness = 1) + { + return .((T)(2) / (right - left), 0, 0, 0, 0, + (T)(2) / (top - bottom), 0, 0, 0, 0, + -handedness * (T)(2) / (zfar - znear), 0, + -(right + left) / (right - left), + -(top + bottom) / (top - bottom), + -(zfar + znear) / (zfar - znear), (T)(1)); + } + + public static Self LookAt(Vector3 at, Vector3 eye, Vector3 up, T handedness = 1) + { + Vector3[4] axes = ?; + axes[2] = (at - eye).Normalized; + axes[0] = Vector3.CrossProduct(up, axes[2]).Normalized; + axes[1] = Vector3.CrossProduct(axes[2], axes[0]); + axes[3] = .(handedness * Vector3.DotProduct(axes[0], eye), + -Vector3.DotProduct(axes[1], eye), + handedness * Vector3.DotProduct(axes[2], eye)); + + // Default calculation is left-handed (i.e. handedness=-1). + // Negate x and z axes for right-handed (i.e. handedness=+1) case. + let neg = -handedness; + axes[0] *= neg; + axes[2] *= neg; + + Vector4 column0 = .(axes[0][0], axes[1][0], axes[2][0], 0); + Vector4 column1 = .(axes[0][1], axes[1][1], axes[2][1], 0); + Vector4 column2 = .(axes[0][2], axes[1][2], axes[2][2], 0); + Vector4 column3 = .(axes[3], 1); + return .(column0, column1, column2, column3); + } + + + public static Self Transform(Vector3 pos, Quaternion rot, Vector3 scale) + { + Matrix33 rotation = rot.ToMatrix(); + Vector4 c0 = .(rotation[0, 0], rotation[1, 0], rotation[2, 0], 0); + Vector4 c1 = .(rotation[0, 1], rotation[1, 1], rotation[2, 1], 0); + Vector4 c2 = .(rotation[0, 2], rotation[1, 2], rotation[2, 2], 0); + Vector4 c3 = .(0, 0, 0, 1); + c0 *= scale.x; + c1 *= scale.y; + c2 *= scale.z; + c3[0] = pos.x; + c3[1] = pos.y; + c3[2] = pos.z; + return .(c0, c1, c2, c3); + } + + public static Self Translation(Vector3 pos) + { + return .(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + pos.x, pos.y, pos.z, 1); + } + + public static Self Scale(Vector3 scale) + { + return .(scale.x, 0, 0, 0, + 0, scale.y, 0, 0, + 0, 0, scale.z, 0, + 0, 0, 0, 1); + } + + public static Self RotationX(T angle) + { + Self m = .Identity; + + T cosT = (T)Math.Cos(angle); + T sinT = (T)Math.Sin(angle); + m.columns[1].y = cosT; + m.columns[1].z = -sinT; + m.columns[2].y = sinT; + m.columns[2].z = -cosT; + + return m; + } + + public static Self RotationY(T angle) + { + Self m = .Identity; + + T cosT = (T)Math.Cos(angle); + T sinT = (T)Math.Sin(angle); + m.columns[0].x = cosT; + m.columns[0].z = sinT; + m.columns[2].x = -sinT; + m.columns[2].z = cosT; + + return m; + } + + public static Self RotationZ(T angle) + { + Self m = .Identity; + + T cosT = (T)Math.Cos(angle); + T sinT = (T)Math.Sin(angle); + m.columns[0].x = cosT; + m.columns[0].y = -sinT; + m.columns[1].x = sinT; + m.columns[1].y = cosT; + + return m; + } + } +} diff --git a/Engine/src/Math/Quaternion.bf b/Engine/src/Math/Quaternion.bf new file mode 100644 index 0000000..a643eb2 --- /dev/null +++ b/Engine/src/Math/Quaternion.bf @@ -0,0 +1,272 @@ +using System; + +namespace SteelEngine.Math +{ + public struct Quaternion : Vector4 where T : IHashable + { + public this() + { + data = default; + } + + public this(T x, T y, T z, T w) + { + data = .(x, y, z, w); + } + + public this(T[4] values) + { + data = values; + } + + public this(Vector3 v, T w) + { + data = .(v.x, v.y, v.z, w); + } + } + + public extension Quaternion + where T : operator T * T, operator T + T, operator T - T, operator T / T, operator -T, operator implicit float, operator explicit double + where int : operator T <=> T + where double : operator implicit T + { + public static Self Identity => .(1, 0, 0, 0); + + [Error("Not implemented")] + public static Self LookAt(Vector3 forward, Vector3 up) + { + // @TODO(fusion) + //Matrix33_t.LookAt(forward, up); + return default;//FromMatrix(Matrix33_t()); + } + + public void operator+=(Self rv) mut + { + x += rv.x; + y += rv.y; + z += rv.z; + w += rv.w; + } + + public static Self operator+(Self lv, Self rv) + { + return .(lv.x + rv.x, lv.y + rv.y, lv.z + rv.z, lv.z + rv.z); + } + + public static Self operator*(Self lv, Self rv) + { + let w = lv.w * rv.w - Vector3.DotProduct(lv.xyz, rv.xyz); + let v = lv.w * rv.xyz + rv.w * lv.xyz + Vector3.CrossProduct(lv.xyz, rv.xyz); + return .(v, w); + } + + public static Vector3 operator*(Self lv, Vector3 rv) + { + T ww = lv.w + lv.w; + return ww * Vector3.CrossProduct(lv.xyz, rv) + (ww * lv.w - 1) * rv + + 2 * Vector3.DotProduct(lv.xyz, rv) * lv.w; + } + + public new Self Normalized + { + [Inline] + get + { + var tmp = this; + return tmp..Normalize(); + } + } + + public Matrix33 ToMatrix() + { + let x2 = x * x, y2 = y * y, z2 = z * z; + let sx = w * x, sy = w * y, sz = w * z; + let xz = x * z, yz = y * z, xy = x * y; + return .(1 - 2 * (y2 + z2), 2 * (xy + sz), 2 * (xz - sy), + 2 * (xy - sz), 1 - 2 * (x2 + z2), 2 * (sx + yz), + 2 * (sy + xz), 2 * (yz - sx), 1 - 2 * (x2 + y2)); + } + + public Matrix44 ToMatrix44() + { + let x2 = x * x, y2 = y * y, z2 = z * z; + let sx = w * x, sy = w * y, sz = w * z; + let xz = x * z, yz = y * z, xy = x * y; + return .(1 - 2 * (y2 + z2), 2 * (xy + sz), 2 * (xz - sy), (T)(0), + 2 * (xy - sz), 1 - 2 * (x2 + z2), 2 * (sx + yz), (T)(0), + 2 * (sy + xz), 2 * (yz - sx), 1 - 2 * (x2 + y2), (T)(0), + (T)(0), (T)(0), (T)(0), (T)(1)); + } + + public Self Inverse => .(-x, -y, -z, w); + + public Vector3 EulerAngles + { + get + { + Matrix33 m = ToMatrix(); + T cos2 = m[0] * m[0] + m[1] * m[1]; + if (cos2 < 1e-6f) + { + return .( + 0, + m[2] < 0 ? (T)(0.5 * Math.PI_d) : (T)(-0.5 * Math.PI_d), + (T)-Math.Atan2(m[3], m[4])); + } + else + { + return .((T)Math.Atan2(m[5], m[8]), + (T)Math.Atan2(-m[2], (T)Math.Sqrt(cos2)), + (T)Math.Atan2(m[1], m[0])); + } + } + } + + /// + /// The resulting angle-axis uses the full range of angles supported by quaternions + /// + /// + /// Tuple containing angle and normalized axis + /// + public (T angle, Vector3 axis) AngleAxis + { + get + { + Vector3 axis = xyz; + let axisLength = axis.Normalize(); + T angle = 2 * (T)Math.Atan2(axisLength, w); + if (axisLength == 0) + { + // If angle = 0 and 360. All axes are correct + return (angle, Vector3(1, 0, 0)); + } + return (angle, axis); + } + } + + /// + /// Create quaternion from 3 euler angles + /// + public static Self FromEulerAngles(T xRotation, T yRotation, T zRotation) + { + Vector3 halfAngles = .((T)(0.5) * xRotation, (T)(0.5) * yRotation, (T)(0.5) * zRotation); + let sinx = (T)Math.Sin(halfAngles[0]); + let cosx = (T)Math.Cos(halfAngles[0]); + let siny = (T)Math.Sin(halfAngles[1]); + let cosy = (T)Math.Cos(halfAngles[1]); + let sinz = (T)Math.Sin(halfAngles[2]); + let cosz = (T)Math.Cos(halfAngles[2]); + return .(sinx * cosy * cosz - cosx * siny * sinz, + cosx * siny * cosz + sinx * cosy * sinz, + cosx * cosy * sinz - sinx * siny * cosz, + cosx * cosy * cosz + sinx * siny * sinz); + } + + /// + /// Create quaternion from 3 euler angles + /// + [Inline] + public static Self FromEulerAngles(Vector3 angles) + { + return FromEulerAngles(angles.x, angles.y, angles.z); + } + + /// + /// Create quaternion from rotation matrix + /// + public static Self FromMatrix(Matrix33 m) + { + let trace = m[0, 0] + m[1, 1]+ m[2, 2]; + if (trace > 0) + { + let s = (T)Math.Sqrt(trace + 1) * 2; + let oneOverS = 1 / s; + return .((T)(0.25) * s, (m[5] - m[7]) * oneOverS, (m[6] - m[2]) * oneOverS, (m[1] - m[3]) * oneOverS); + } + else if (m[0] > m[4] && m[0] > m[8]) + { + let s = (T)Math.Sqrt(m[0] - m[4] - m[8] + 1) * 2; + let oneOverS = 1 / s; + return .((m[5] - m[7]) * oneOverS, (T)(0.25) * s, (m[3] + m[1]) * oneOverS, (m[6] + m[2]) * oneOverS); + } + else if (m[4] > m[8]) + { + let s = (T)Math.Sqrt(m[4] - m[0] - m[8] + 1) * 2; + let oneOverS = 1 / s; + return .((m[6] - m[2]) * oneOverS, (m[3] + m[1]) * oneOverS, (T)(0.25) * s, (m[5] + m[7]) * oneOverS); + } + else + { + let s = (T)Math.Sqrt(m[8] - m[0] - m[4] + 1) * 2; + let oneOverS = 1 / s; + return .((m[1] - m[3]) * oneOverS, (m[6] + m[2]) * oneOverS, (m[5] + m[7]) * oneOverS, (T)(0.25) * s); + } + } + + /// + /// Create quaternion from upper-left 3x3 rotation matrix of 4x4 matrix + /// + public static Self FromMatrix(Matrix44 m) + { + let trace = m[0, 0] + m[1, 1] + m[2, 2]; + if (trace > 0) + { + let s = (T)Math.Sqrt(trace + 1) * 2; + let oneOverS = 1 / s; + return .((T)(0.25) * s, (m[6] - m[9]) * oneOverS, (m[8] - m[2]) * oneOverS, (m[1] - m[4]) * oneOverS); + } + else if (m[0] > m[5] && m[0] > m[10]) + { + let s = (T)Math.Sqrt(m[0] - m[5] - m[10] + 1) * 2; + let oneOverS = 1 / s; + return .((m[6] - m[9]) * oneOverS, (T)(0.25) * s, (m[4] + m[1]) * oneOverS, (m[8] + m[2]) * oneOverS); + } + else if (m[5] > m[10]) + { + let s = (T)Math.Sqrt(m[5] - m[0] - m[10] + 1) * 2; + let oneOverS = 1 / s; + return .((m[8] - m[2]) * oneOverS, (m[4] + m[1]) * oneOverS, (T)(0.25) * s, (m[6] + m[9]) * oneOverS); + } + else + { + let s = (T)Math.Sqrt(m[10] - m[0] - m[5] + 1) * 2; + let oneOverS = 1 / s; + return .((m[1] - m[4]) * oneOverS, (m[8] + m[2]) * oneOverS, (m[6] + m[9]) * oneOverS, (T)(0.25) * s); + } + } + + public static Self FromAngleAxis(T angle, Vector3 axis) + { + let halfAngle = (T)0.5 * angle; + return .(axis.Normalized * (T)Math.Sin(halfAngle), (T)Math.Cos(halfAngle)); + } + + public static Vector3 PerpendicularVector(Vector3 v) + { + var axis = Vector3.CrossProduct(.(1, 0, 0), v); + if (axis.LengthSquared > (T)0.05) + { + axis = Vector3.CrossProduct(.(0, 1, 0), v); + } + return axis; + } + + public static Self RotateFromTo(Vector3 from, Vector3 to) + { + let start = from.Normalized; + let end = to.Normalized; + + let dotProduct = Vector3.DotProduct(start, end); + // Any rotation < 0.1 degrees is treated as no rotation to avoid division by zero errors + // cos( 0.1 degrees) = 0.99999847691 + if (dotProduct >= (T)(0.99999847691)) + return .Identity; + // If the vectors point in opposite directions, return a 180 degree rotation on an arbitrary axis. + if (dotProduct <= (T)(-0.99999847691)) + return .(PerpendicularVector(start), 0); + + let crossProduct = Vector3.CrossProduct(start, end); + return .(crossProduct.x, crossProduct.y, crossProduct.z, (T)(1 + dotProduct)).Normalized; + } + } +} diff --git a/Engine/src/Math/Typealias.bf b/Engine/src/Math/Typealias.bf new file mode 100644 index 0000000..f4be41d --- /dev/null +++ b/Engine/src/Math/Typealias.bf @@ -0,0 +1,12 @@ +using SteelEngine.Math; + +namespace SteelEngine.Math +{ + typealias Vector2 = Vector2; + typealias Vector3 = Vector3; + typealias Vector4 = Vector4; + typealias Quaternion = Quaternion; + typealias Matrix33 = Matrix33; + typealias Matrix34 = Matrix34; + typealias Matrix44 = Matrix44; +} diff --git a/Engine/src/Math/Vector2.bf b/Engine/src/Math/Vector2.bf new file mode 100644 index 0000000..b2fc327 --- /dev/null +++ b/Engine/src/Math/Vector2.bf @@ -0,0 +1,319 @@ +using System; + +namespace SteelEngine.Math +{ + [CRepr] + public struct Vector2 : IHashable where T : IHashable + { + public T[2] data; + + // Creates a new Vector with default values + public this() + { + data = default; + } + + // Creates a new Vector and sets all components to v + public this(T v) + { + data = T[](v, v); + } + + // Creates a new Vector with given x, y components + public this(T x, T y) + { + data = T[](x, y); + } + + // Creates a new Vector with given array (0 = x, 1 = y) + public this(T[2] values) + { + data = values; + } + + public T x + { + [Inline] get { return data[0]; } + [Inline] set mut { data[0] = value; } + } + public T y + { + [Inline] get { return data[1]; } + [Inline] set mut { data[1] = value; } + } + + public T this[int i] + { + [Inline] get { return data[i]; } + [Inline] set mut { data[i] = value; } + } + + public static bool operator ==(Self v1, Self v2) + { + return (v1.x == v2.x) && + (v1.y == v2.y); + } + + public static bool operator !=(Self value1, Self value2) + { + return !(value1 == value2); + } + + public override void ToString(String str) + { + str.AppendF("{0:0.0#}, {1:0.0#}", x, y); + } + + public int GetHashCode() + { + int seed = 0; + Helpers.HashCombine(ref seed, x.GetHashCode()); + Helpers.HashCombine(ref seed, y.GetHashCode()); + return seed; + } + } + + public extension Vector2 where T : operator implicit int + { + public static Self Zero => .(0, 0); + public static Self One => .(1, 1); + + public static Self Left => .(1, 0); + public static Self Right => .(-1, 0); + public static Self Up => .(0, 1); + public static Self Down => .(0, -1); + } + + public extension Vector2 + where T : operator implicit float + where float : operator implicit T + { + public static Self PositiveInfinity => .(float.PositiveInfinity, float.PositiveInfinity); + public static Self NegativeInfinity => .(float.NegativeInfinity, float.NegativeInfinity); + } + + public extension Vector2 + where T : operator implicit double + where double : operator implicit T + { + public static Self PositiveInfinity => .(double.PositiveInfinity, double.PositiveInfinity); + public static Self NegativeInfinity => .(double.NegativeInfinity, double.NegativeInfinity); + } + + public extension Vector2 where T : operator T + T, operator T - T, operator T * T, operator T / T, operator -T + { + public void operator+=(Self rv) mut + { + x += rv.x; + y += rv.y; + } + + public static Self operator+(Self lv, Self rv) + { + return .(lv.x + rv.x, lv.y + rv.y); + } + + public void operator+=(T rv) mut + { + x += rv; + y += rv; + } + + [Commutable] + public static Self operator+(Self lv, T rv) + { + return .(lv.x + rv, lv.y + rv); + } + + public static Self operator-(Self lv) + { + return .(-lv.x, -lv.y); + } + + public void operator-=(Self rv) mut + { + x -= rv.x; + y -= rv.y; + } + + public static Self operator-(Self lv, Self rv) + { + return .(lv.x - rv.x, lv.y - rv.y); + } + + public void operator-=(T rv) mut + { + x -= rv; + y -= rv; + } + + [Commutable] + public static Self operator-(Self lv, T rv) + { + return .(lv.x - rv, lv.y - rv); + } + + public void operator*=(Self rv) mut + { + x *= rv.x; + y *= rv.y; + } + + public static Self operator*(Self lv, Self rv) + { + return .(lv.x * rv.x, lv.y * rv.y); + } + + public void operator*=(T rv) mut + { + x *= rv; + y *= rv; + } + + [Commutable] + public static Self operator*(Self lv, T rv) + { + return .(lv.x * rv, lv.y * rv); + } + + public void operator/=(Self rv) mut + { + x /= rv.x; + y /= rv.y; + } + + public static Self operator/(Self lv, Self rv) + { + return .(lv.x / rv.x, lv.y / rv.y); + } + + public void operator/=(T rv) mut + { + x *= rv; + y *= rv; + } + + [Commutable] + public static Self operator/(Self lv, T rv) + { + return .(lv.x / rv, lv.y / rv); + } + + /// + /// Squared length of this vector + /// + public T LengthSquared=> x * x + y * y; + + /// + /// Squared distance between two vectors + /// + public static T DistanceSquared(Self v1, Self v2) + { + return (v1 - v2).LengthSquared; + } + + } + + public extension Vector2 + where T : operator T * T, operator T + T, operator T - T, operator T / T, operator -T, operator implicit float, operator explicit double + where int : operator T <=> T + where double : operator implicit T + { + /// + /// Magnitude of vector + /// + public T Length => (T)System.Math.Sqrt(LengthSquared); + + /// + /// Makes this vector have a magnitude of 1 + /// + public T Normalize() mut + { + let length = Length; + let factor = 1 / length; + x *= factor; + y *= factor; + return length; + } + + /// + /// This vector with magnitude of 1 + /// + public Self Normalized + { + get + { + var tmp = this; + return tmp..Normalize(); + } + } + + /// + /// Unsigned angle in radians between vectors + /// + public static T Angle(Self v1, Self v2) + { + let div = (v1.Length * v2.Length); + // div can be 0 so we need to make sure we are not dividing by zero + if (div == 0) + return 0; + let cosVal = DotProduct(v1, v2) / div; + // if cosVal > 1 the Acos will return NaN + return (T)(cosVal > (T)1 ? 0 : Math.Acos(cosVal)); + } + + /// + /// Distance between two vectors + /// + public static T Distance(Self v1, Self v2) + { + return (v1 - v2).Length; + } + + /// + /// Vector with magnitude clamped to value + /// + public static Self ClampMagnitude(Self v, T value) + { + let length = v.Length; + let factor = value / length; + return .(v.x * factor, v.y * factor); + } + } + + public extension Vector2 where T : operator T + T, operator T - T, operator T * T, operator T / T, operator -T + { + /// + /// Linearly interpolates between vectors by value + /// + /// + /// Vector containing interpolated value + /// + public static Self Lerp(Self v1, Self v2, T value) + { + return .(v1.x + value * (v2.x - v1.x), v1.y + value * (v2.y - v1.y)); + } + + /// + /// Dot product of vectors + /// + public static T DotProduct(Self v1, Self v2) + { + return v1.x * v2.x + v1.y * v2.y; + } + + } + + public extension Vector2 where T : operator T <=> T + { + public static Self Min(Self v1, Self v2) + { + return .(Math.Min(v1.x, v2.x), Math.Min(v1.y, v2.y)); + } + + public static Self Max(Self v1, Self v2) + { + return .(Math.Max(v1.x, v2.x), Math.Max(v1.y, v2.y)); + } + } +} diff --git a/Engine/src/Math/Vector3.bf b/Engine/src/Math/Vector3.bf new file mode 100644 index 0000000..a5080ef --- /dev/null +++ b/Engine/src/Math/Vector3.bf @@ -0,0 +1,363 @@ +using System; + +namespace SteelEngine.Math +{ + [CRepr] + public struct Vector3 : IHashable where T : IHashable + { + public T[3] data; + + // Creates a new Vector with default values + public this() + { + data = default; + } + + // Creates a new Vector and sets all components to v + public this(T v) + { + data = .(v, v, v); + } + + // Creates a new Vector with given x, y components and sets z to default + public this(T x, T y) + { + data = .(x, y, default); + } + + // Creates a new Vector with given x, y, z components + public this(T x, T y, T z) + { + data = .(x, y, z); + } + + // Creates a new Vector with given array (0 = x, 1 = y, 2 = z) + public this(T[3] values) + { + data = values; + } + + // Creates a new Vector with given x, y components and sets z to default + public this(Vector2 v2) + { + data = .(v2.x, v2.y, default); + } + + public T x + { + [Inline] get { return data[0]; } + [Inline] set mut { data[0] = value; } + } + + public T y + { + [Inline] get { return data[1]; } + [Inline] set mut { data[1] = value; } + } + + public T z + { + [Inline] get { return data[2]; } + [Inline] set mut { data[2] = value; } + } + + public T this[int i] + { + [Inline] get { return data[i]; } + [Inline] set mut { data[i] = value; } + } + + public Vector2 xy => .(x,y); + + public static bool operator ==(Self value1, Self value2) + { + return (value1.x == value2.x) && + (value1.y == value2.y) && + (value1.z == value2.z); + } + + public static bool operator !=(Self value1, Self value2) + { + return !(value1 == value2); + } + + public override void ToString(String str) + { + str.AppendF("{0:0.0#}, {1:0.0#}, {2:0.0#}", x, y, z); + } + + public int GetHashCode() + { + int seed = 0; + Helpers.HashCombine(ref seed, x.GetHashCode()); + Helpers.HashCombine(ref seed, y.GetHashCode()); + Helpers.HashCombine(ref seed, z.GetHashCode()); + return seed; + } + } + + public extension Vector3 where T : operator implicit int + { + public static Self Zero=> .(0, 0, 0); + public static Self One=> .(1,1,1); + + public static Self Left=> .(-1, 0, 0); + public static Self Right=> .(1, 0, 0); + public static Self Up=> .(0, 1, 0); + public static Self Down=> .(0, -1, 0); + public static Self Forward=> .(0, 0, -1); + public static Self Back=> .(0, 0, 1); + } + + public extension Vector3 + where T : operator implicit float + where float : operator implicit T + { + public static Self PositiveInfinity => .(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + public static Self NegativeInfinity => .(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + } + + public extension Vector3 + where T : operator implicit double + where double : operator implicit T + { + public static Self PositiveInfinity => .(double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity); + public static Self NegativeInfinity => .(double.NegativeInfinity, double.NegativeInfinity, double.NegativeInfinity); + } + + + public extension Vector3 where T : operator T + T, operator T - T, operator T * T, operator T / T, operator -T + { + public void operator+=(Self rv) mut + { + x += rv.x; + y += rv.y; + z += rv.z; + } + + public static Self operator+(Self lv, Self rv) + { + return .(lv.x + rv.x, lv.y + rv.y, lv.z + rv.z); + } + + public void operator+=(T rv) mut + { + x += rv; + y += rv; + z += rv; + } + + [Commutable] + public static Self operator+(Self lv, T rv) + { + return .(lv.x + rv, lv.y + rv, lv.z + rv); + } + + public static Self operator-(Self lv) + { + return .(-lv.x, -lv.y, -lv.z); + } + + public void operator-=(Self rv) mut + { + x -= rv.x; + y -= rv.y; + z -= rv.z; + } + + public static Self operator-(Self lv, Self rv) + { + return .(lv.x - rv.x, lv.y - rv.y, lv.z - rv.z); + } + + public void operator-=(T rv) mut + { + x -= rv; + y -= rv; + z -= rv; + } + + [Commutable] + public static Self operator-(Self lv, T rv) + { + return .(lv.x - rv, lv.y - rv, lv.z + rv); + } + + public void operator*=(Self rv) mut + { + x *= rv.x; + y *= rv.y; + z *= rv.z; + } + + public static Self operator*(Self lv, Self rv) + { + return .(lv.x * rv.x, lv.y * rv.y, lv.z * rv.z); + } + + public void operator*=(T rv) mut + { + x *= rv; + y *= rv; + z *= rv; + } + + [Commutable] + public static Self operator*(Self lv, T rv) + { + return .(lv.x * rv, lv.y * rv, lv.z * rv); + } + + public void operator/=(Self rv) mut + { + x /= rv.x; + y /= rv.y; + z /= rv.z; + } + + public static Self operator/(Self lv, Self rv) + { + return .(lv.x / rv.x, lv.y / rv.y, lv.z / rv.z); + } + + public void operator/=(T rv) mut + { + x /= rv; + y /= rv; + z /= rv; + } + + [Commutable] + public static Self operator/(Self lv, T rv) + { + return .(lv.x / rv, lv.y / rv, lv.y / rv); + } + + /// + /// Squared length of this vector + /// + public T LengthSquared=> x * x + y * y + z * z; + + /// + /// Squared distance between two vectors + /// + public static T DistanceSquared(Self v1, Self v2) + { + return (v1 - v2).LengthSquared; + } + + } + + public extension Vector3 + where T : operator T * T, operator T + T, operator T - T, operator T / T, operator -T, operator implicit float, operator explicit double + where int : operator T <=> T + where double : operator implicit T + { + /// + /// Magnitude of vector + /// + public T Length => (T)System.Math.Sqrt(LengthSquared); + + /// + /// Makes this vector have a magnitude of 1 + /// + public T Normalize() mut + { + let length = Length; + let factor = 1 / length; + x *= factor; + y *= factor; + z *= factor; + return length; + } + + /// + /// This vector with magnitude of 1 + /// + public Self Normalized + { + get + { + var tmp = this; + return tmp..Normalize(); + } + } + + /// + /// Unsigned angle in radians between vectors + /// + public static T Angle(Self v1, Self v2) + { + let div = (v1.Length * v2.Length); + // div can be 0 so we need to make sure we are not dividing by zero + if (div == 0) + return 0; + let cosVal = DotProduct(v1, v2) / div; + // cosVal > 1 the Acos will return NaN + return (T)(cosVal > 1 ? 0 : Math.Acos(cosVal)); + } + + /// + /// Distance between vectors + /// + public static T Distance(Self v1, Self v2) + { + return (v1 - v2).Length; + } + + /// + /// Vector with magnitude clamped to value + /// + public static Self ClampMagnitude(Self v, T value) + { + let length = v.Length; + let factor = value / length; + return .(v.x * factor, v.y * factor, v.z * factor); + } + } + + public extension Vector3 where T : operator T + T, operator T - T, operator T * T, operator -T + { + /// + /// Linearly interpolates between vectors by value + /// + /// + /// Vector containing interpolated value + /// + public static Self Lerp(Self v1, Self v2, T value) + { + return .(v1.x + value * (v2.x - v1.x), v1.y + value * (v2.y - v1.y), v1.z + value * (v2.z - v1.z)); + } + + /// + /// Dot product of vectors + /// + public static T DotProduct(Self v1, Self v2) + { + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; + } + + /// + /// Cross product of vectors + /// + public static Self CrossProduct(Self v1, Self v2) + { + return .(v1.y * v2.z - v2.y * v1.z, + -(v1.x * v2.z - v2.x * v1.z), + v1.x * v2.y - v2.x * v1.y); + } + } + + public extension Vector3 where T : operator T <=> T + { + public static Self Min(Self v1, Self v2) + { + return .(Math.Min(v1.x, v2.x), Math.Min(v1.y, v2.y), Math.Min(v1.z, v2.z)); + } + + public static Self Max(Self v1, Self v2) + { + return .(Math.Max(v1.x, v2.x), Math.Max(v1.y, v2.y), Math.Max(v1.z, v2.z)); + } + } +} diff --git a/Engine/src/Math/Vector4.bf b/Engine/src/Math/Vector4.bf new file mode 100644 index 0000000..5fcc719 --- /dev/null +++ b/Engine/src/Math/Vector4.bf @@ -0,0 +1,369 @@ +using System; + +namespace SteelEngine.Math +{ + [CRepr] + public struct Vector4 : IHashable where T : IHashable + { + public T[4] data; + + // Creates a new Vector with default values + public this() + { + data = default; + } + // Creates a new Vector and sets all components to v + public this(T v) + { + data = .(v, v, v, v); + } + + // Creates a new Vector with given x, y components and sets z and w to default + public this(T x, T y) + { + data = .(x, y, default, default); + } + + // Creates a new Vector with given x, y, z components and sets w to zero + public this(T x, T y, T z) + { + data = .(x, y, z, default); + } + + // Creates a new Vector with given x, y, z components + public this(T x, T y, T z, T w) + { + data = .(x, y, z, w); + } + + // Creates a new Vector with given array (0 = x, 1 = y, 2 = z, 3 = w) + public this(T[4] values) + { + data = values; + } + + public this(Vector2 vec2, T z, T w) + { + data = .(vec2.x, vec2.y, z, w); + } + + public this(Vector3 vec3, T w) + { + data = .(vec3.x, vec3.y, vec3.z, w); + } + + public T x + { + [Inline] get { return data[0]; } + [Inline] set mut { data[0] = value; } + } + + public T y + { + [Inline] get { return data[1]; } + [Inline] set mut { data[1] = value; } + } + + public T z + { + [Inline] get { return data[2]; } + [Inline] set mut { data[2] = value; } + } + + public T w + { + [Inline] get { return data[3]; } + [Inline] set mut { data[3] = value; } + } + + public T this[int i] + { + [Inline] get { return data[i]; } + [Inline] set mut { data[i] = value; } + } + + public Vector3 xyz => .(x,y,z); + + public static bool operator ==(Self v1, Self v2) + { + return (v1.x == v2.x) && + (v1.y == v2.y) && + (v1.z == v2.z) && + (v1.w == v2.w); + } + + public static bool operator !=(Self v1, Self v2) + { + return !(v1 == v2); + } + + public override void ToString(String str) + { + str.AppendF("{0:0.0#}, {1:0.0#}, {2:0.0#}, {3:0.0#}", x, y, z, w); + } + + public int GetHashCode() + { + int seed = 0; + Helpers.HashCombine(ref seed, x.GetHashCode()); + Helpers.HashCombine(ref seed, y.GetHashCode()); + Helpers.HashCombine(ref seed, z.GetHashCode()); + Helpers.HashCombine(ref seed, w.GetHashCode()); + return seed; + } + } + + public extension Vector4 where T : operator implicit float + { + public static Self Zero=> .(0, 0, 0, 0); + public static Self One=> .(1, 1, 1, 1); + } + + public extension Vector4 + where T : operator implicit float + where float : operator implicit T + { + public static Self PositiveInfinity => .(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity); + public static Self NegativeInfinity => .(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity); + } + + public extension Vector4 + where T : operator implicit double + where double : operator implicit T + { + public static Self PositiveInfinity => .(double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity); + public static Self NegativeInfinity => .(double.NegativeInfinity, double.NegativeInfinity, double.NegativeInfinity, double.NegativeInfinity); + } + + + public extension Vector4 where T : operator T + T, operator T - T, operator T * T, operator T / T, operator -T + { + public void operator+=(Self rv) mut + { + x += rv.x; + y += rv.y; + z += rv.z; + w += rv.w; + } + + public static Self operator+(Self lv, Self rv) + { + return .(lv.x + rv.x, lv.y + rv.y, lv.z + rv.z, lv.w + rv.w); + } + + public void operator+=(T rv) mut + { + x += rv; + y += rv; + z += rv; + w += rv; + } + + public static Self operator+(Self lv, T rv) + { + return .(lv.x + rv, lv.y + rv, lv.z + rv, lv.z + rv); + } + + public static Self operator-(Self lv) + { + return .(-lv.x, -lv.y, -lv.z, -lv.w); + } + + public void operator-=(Self rv) mut + { + x -= rv.x; + y -= rv.y; + z -= rv.z; + w -= rv.w; + } + + public static Self operator-(Self lv, Self rv) + { + return .(lv.x - rv.x, lv.y - rv.y, lv.z - rv.z, lv.w - rv.w); + } + + public void operator-=(T rv) mut + { + x -= rv; + y -= rv; + z -= rv; + w -= rv; + } + + public static Self operator-(Self lv, T rv) + { + return .(lv.x - rv, lv.y - rv, lv.z + rv, lv.w - rv); + } + + public void operator*=(Self rv) mut + { + x *= rv.x; + y *= rv.y; + z *= rv.z; + w *= rv.w; + } + + public static Self operator*(Self lv, Self rv) + { + return .(lv.x * rv.x, lv.y * rv.y, lv.z * rv.z, lv.w * rv.w); + } + + public void operator*=(T rv) mut + { + x *= rv; + y *= rv; + z *= rv; + w *= rv; + } + + public static Self operator*(Self lv, T rv) + { + return .(lv.x * rv, lv.y * rv, lv.z * rv, lv.w * rv); + } + + public void operator/=(Self rv) mut + { + x /= rv.x; + y /= rv.y; + z /= rv.z; + w /= rv.w; + } + + public static Self operator/(Self lv, Self rv) + { + return .(lv.x / rv.x, lv.y / rv.y, lv.z / rv.z, lv.w / rv.w); + } + + public void operator/=(T rv) mut + { + x /= rv; + y /= rv; + z /= rv; + w /= rv; + } + + public static Self operator/(Self lv, T rv) + { + return .(lv.x / rv, lv.y / rv, lv.y / rv, lv.w / rv); + } + + /// + /// Squared length of this vector + /// + public T LengthSquared=> x * x + y * y + z * z + w * w; + + /// + /// Squared distance between two vectors + /// + public static T DistanceSquared(Self v1, Self v2) + { + return (v1 - v2).LengthSquared; + } + + } + + public extension Vector4 + where T : operator T * T, operator T + T, operator T - T, operator T / T, operator -T, operator implicit float, operator explicit double + where int : operator T <=> T + where double : operator implicit T + { + /// + /// Magnitude of vector + /// + public T Length => (T)System.Math.Sqrt(LengthSquared); + + /// + /// Distance between vectors + /// + public static T Distance(Self v1, Self v2) + { + return (v1 - v2).Length; + } + + /// + /// Makes this vector have a magnitude of 1 + /// + public T Normalize() mut + { + let length = Length; + let factor = 1 / length; + x *= factor; + y *= factor; + z *= factor; + w *= factor; + return length; + } + + /// + /// This vector with magnitude of 1 + /// + public Self Normalized + { + get + { + var tmp = this; + return tmp..Normalize(); + } + } + + /// + /// Unsigned angle in radians between vectors + /// + public static T Angle(Self v1, Self v2) + { + let div = (v1.Length * v2.Length); + // div can be 0 so we need to make sure we are not dividing by zero + if (div == 0) + return 0; + let cosVal = DotProduct(v1, v2) / div; + // cosVal > 1 the Acos will return NaN + return (T)(cosVal > 1 ? 0 : Math.Acos(cosVal)); + } + + /// + /// Vector with magnitude clamped to value + /// + public static Self ClampMagnitude(Self v, T value) + { + let length = v.Length; + let factor = value / length; + return .(v.x * factor, v.y * factor, v.z * factor, v.w * factor); + } + } + + public extension Vector4 where T : operator T + T, operator T - T, operator T * T, operator -T + { + /// + /// Linearly interpolates between vectors by value + /// + /// + /// Vector containing interpolated value + /// + public static Self Lerp(Self v1, Self v2, T value) + { + return .(v1.x + value * (v2.x - v1.x), v1.y + value * (v2.y - v1.y), v1.z + value * (v2.z - v1.z), v1.w + value * (v2.w - v1.w)); + } + + /// + /// Dot product of vectors + /// + public static T DotProduct(Self v1, Self v2) + { + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w; + } + } + + public extension Vector4 where T : operator T <=> T + { + public static Self Min(Self v1, Self v2) + { + return .(Math.Min(v1.x, v2.x), Math.Min(v1.y, v2.y), Math.Min(v1.z, v2.z), Math.Min(v1.w, v2.w)); + } + + public static Self Max(Self v1, Self v2) + { + return .(Math.Max(v1.x, v2.x), Math.Max(v1.y, v2.y), Math.Max(v1.z, v2.z), Math.Max(v1.w, v2.w)); + } + } + +} diff --git a/Engine/src/SteelPath.bf b/Engine/src/SteelPath.bf new file mode 100644 index 0000000..fb40a98 --- /dev/null +++ b/Engine/src/SteelPath.bf @@ -0,0 +1,44 @@ +using System; +using System.Collections; +using System.IO; + +namespace SteelEngine +{ + public static class SteelPath + { + public static String UserDirectory = new .() ~ delete _; + + public static this() + { + Dictionary envVars = new .(); + Environment.GetEnvironmentVariables(envVars); + + if (envVars.ContainsKey("APPDATA")) + Path.InternalCombine(UserDirectory, envVars["APPDATA"], "Steel"); + + DeleteDictionaryAndKeysAndItems!(envVars); + } + + public static void GetUserFolder(String relativePath, String target, bool create = false) + { + Path.InternalCombine(target, UserDirectory, relativePath); + + if (create && !Directory.Exists(target)) + { + if (Directory.CreateDirectory(target) case .Err(let err)) + Log.Error("Failed to create user directory: {}", err); + } + } + + public static void GetUserFile(String relativePath, String target, bool create = false) + { + Path.InternalCombine(target, UserDirectory, relativePath); + + if (create && !File.Exists(target)) + { + if (File.WriteAllText(target, "") case .Err(let err)) + Log.Error("Failed to create user directory: {}", err); + } + } + } +} diff --git a/Engine/src/Time.bf b/Engine/src/Time.bf new file mode 100644 index 0000000..e4d72aa --- /dev/null +++ b/Engine/src/Time.bf @@ -0,0 +1,40 @@ +using System; +using System.Diagnostics; + +namespace SteelEngine +{ + class Time + { + static Stopwatch s_stopwatch ~ delete _; + + protected static void Initialize() + { + TimeScale = 1.0f; + + StartTime = DateTime.Now; + + s_stopwatch = new Stopwatch(); + s_stopwatch.Start(); + } + + protected static float Update() + { + float dt = s_stopwatch.ElapsedMicroseconds / 1000000.0f; + s_stopwatch.Restart(); + + DeltaTime = dt * TimeScale; + DeltaTimeUnscaled = dt; + + TimeSinceStart += DeltaTime; + TimeSinceStartUnscaled += DeltaTimeUnscaled; + return dt; + } + + public static float TimeScale { get; set; } + public static DateTime StartTime { get; private set; } + public static float DeltaTime { get; private set; } + public static float DeltaTimeUnscaled { get; private set; } + public static float TimeSinceStart { get; private set; } + public static float TimeSinceStartUnscaled { get; private set; } + } +} diff --git a/Engine/src/Window/Window.bf b/Engine/src/Window/Window.bf index 7a611d9..bcfddef 100644 --- a/Engine/src/Window/Window.bf +++ b/Engine/src/Window/Window.bf @@ -3,16 +3,10 @@ using glfw_beef; using SteelEngine.Events; using SteelEngine.GL; +using SteelEngine.Math; namespace SteelEngine.Window { - // NOTE(Sheep): temporary vector struct - struct Vector2 - { - public T X; - public T Y; - } - // WindowConfig is used to specify properties of a Window before initializing it. // Only Width and Height are necessary. The rest is optional and has sensible default parameters struct WindowConfig @@ -51,8 +45,8 @@ namespace SteelEngine.Window public this(WindowConfig cfg, EventCallback callback) { - this._size.X = cfg.Width; - this._size.Y = cfg.Height; + this._size.x = cfg.Width; + this._size.y = cfg.Height; this._vSync = cfg.VSync; this._eventCallback = callback; @@ -98,8 +92,8 @@ namespace SteelEngine.Window // Resize callback void sizeC(GlfwWindow* window, int width, int height) { - _size.X = width; - _size.Y = height; + _size.x = width; + _size.y = height; WindowResizeEvent event = scope WindowResizeEvent(width, height); _eventCallback(event); } diff --git a/Libs/BGFX b/Libs/BGFX new file mode 160000 index 0000000..2147829 --- /dev/null +++ b/Libs/BGFX @@ -0,0 +1 @@ +Subproject commit 2147829d5acf6d9b2ab49eca76ede804cd3797d5 diff --git a/Libs/Beef-Extensions-Lib/.gitignore b/Libs/Beef-Extensions-Lib/.gitignore new file mode 100644 index 0000000..7a4bc7e --- /dev/null +++ b/Libs/Beef-Extensions-Lib/.gitignore @@ -0,0 +1,3 @@ +build +BeefSpace.toml +BeefSpace_User.toml \ No newline at end of file diff --git a/Libs/Beef-Extensions-Lib/BeefProj.toml b/Libs/Beef-Extensions-Lib/BeefProj.toml new file mode 100644 index 0000000..8cd54a4 --- /dev/null +++ b/Libs/Beef-Extensions-Lib/BeefProj.toml @@ -0,0 +1,6 @@ +FileVersion = 1 + +[Project] +Name = "BeefExtensionsLib" +TargetType = "BeefLib" +StartupObject = "BeefExtensionsLib.Program" diff --git a/Libs/Beef-Extensions-Lib/LICENSE b/Libs/Beef-Extensions-Lib/LICENSE new file mode 100644 index 0000000..507bc67 --- /dev/null +++ b/Libs/Beef-Extensions-Lib/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Jonathan Racaud + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Libs/Beef-Extensions-Lib/README.md b/Libs/Beef-Extensions-Lib/README.md new file mode 100644 index 0000000..06a485e --- /dev/null +++ b/Libs/Beef-Extensions-Lib/README.md @@ -0,0 +1,17 @@ +# Beef-Extensions-Lib +A library consisting of useful extensions for the Beef core lib types. + +Thanks to Beef's extension mechanism it is easy to add method to already defined types such as String, Path, List or other from the Beef corelib. +The goal of this library is to regroup useful extensions that Beef programers might frequently use. + +# Contributing +Contributions are welcomed and here are some rules to follow when adding new extensions: + +1. Add the extension inside the folder that follows the type's namespace. + - For example, the String type's namespace is *System* so its extension should live under the System folder. The Path type is under System.IO +so its extension should be located in the folder System.IO. +2. Create new folders following the namespace of the type you are extending. +2. The extension's file must follow the following naming convention TypeExtensions.bf + - The *String* extensions are inside the **StringExtensions.bf** file, the *Path* extensions inside the **PathExtensions.bf** file. +3. One file per type's extension + - The *String* extensions lives in the **StringExtensions.bf** file only. diff --git a/Libs/Beef-Extensions-Lib/src/System/IO/PathExtensions.bf b/Libs/Beef-Extensions-Lib/src/System/IO/PathExtensions.bf new file mode 100644 index 0000000..a877ddb --- /dev/null +++ b/Libs/Beef-Extensions-Lib/src/System/IO/PathExtensions.bf @@ -0,0 +1,15 @@ +namespace System.IO +{ + extension Path + { + public static void Join(StringView pathA, StringView pathB, String outPath) + { + if (pathA.IsNull || pathB.IsNull || (outPath == null)) + { + return; + } + outPath.Clear(); + outPath.AppendF("{}{}{}", pathA, Path.DirectorySeparatorChar, pathB); + } + } +} diff --git a/Libs/Beef-Extensions-Lib/src/System/Reflection/FieldInfoExtensions.bf b/Libs/Beef-Extensions-Lib/src/System/Reflection/FieldInfoExtensions.bf new file mode 100644 index 0000000..0b42177 --- /dev/null +++ b/Libs/Beef-Extensions-Lib/src/System/Reflection/FieldInfoExtensions.bf @@ -0,0 +1,10 @@ +namespace System.Reflection +{ + extension FieldInfo + { + public bool HasFieldFlag(FieldFlags flag) + { + return (*mFieldData).mFlags == flag; + } + } +} diff --git a/Libs/BeefToml b/Libs/BeefToml new file mode 160000 index 0000000..7958a14 --- /dev/null +++ b/Libs/BeefToml @@ -0,0 +1 @@ +Subproject commit 7958a149f21d7031f11549386a584a76f774ed65 diff --git a/Libs/JSON_Beef/.gitignore b/Libs/JSON_Beef/.gitignore new file mode 100644 index 0000000..6de4014 --- /dev/null +++ b/Libs/JSON_Beef/.gitignore @@ -0,0 +1,3 @@ +build/ +BeefSpace.toml +BeefSpace_User.toml \ No newline at end of file diff --git a/Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml b/Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml new file mode 100644 index 0000000..d06388e --- /dev/null +++ b/Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml @@ -0,0 +1,12 @@ +FileVersion = 1 +Dependencies = {corlib = "*", JSON_Beef = "*", BeefExtensionsLib = "*"} + +[Project] +Name = "JSON_Beef_Test" +StartupObject = "JSON_Beef_Test.Program" + +[Configs.Debug.Win64] +PostBuildCmds = ["Execute(\"powershell.exe -Command Copy-Item -Recurse -Force $(ProjectDir)/json $(TargetDir)\")"] + +[Configs.Test.Win64] +PostBuildCmds = ["Execute(\"powershell.exe -Command Copy-Item -Recurse -Force $(ProjectDir)/json $(TargetDir)\")"] diff --git a/Libs/JSON_Beef/JSON_Beef_Test/json/valid_array.json b/Libs/JSON_Beef/JSON_Beef_Test/json/valid_array.json new file mode 100644 index 0000000..86e6551 --- /dev/null +++ b/Libs/JSON_Beef/JSON_Beef_Test/json/valid_array.json @@ -0,0 +1,48 @@ +[ + [ + 42, + -42, + 1.8, + -1.8, + 1.8e+5, + 1.8e-5, + 42e7, + -42e7, + true, + false, + null, + "a string" + ], + { + "a int": 42, + "a negative int": -42, + "a float": 1.8, + "a negative float": -1.8, + "a float scientific notation number": 1.8e+42, + "a float negative scientific notation number": 1.8e-42, + "an int scientific notation number": 42e7, + "an int negative scientific notation number": -42e7, + "true": true, + "false": false, + "null": null, + "a string": "a string", + "escaped char in string": "line 1 \n\tline 2 \r\n\tline 2", + "an array": [ + 42, + -42, + 1.8, + -1.8, + 1.8e+5, + 1.8e-3, + 42e7, + -42e7, + true, + false, + null, + "a string" + ], + "an object": { + "hello": true + } + } +] \ No newline at end of file diff --git a/Libs/JSON_Beef/JSON_Beef_Test/json/valid_object.json b/Libs/JSON_Beef/JSON_Beef_Test/json/valid_object.json new file mode 100644 index 0000000..62d5821 --- /dev/null +++ b/Libs/JSON_Beef/JSON_Beef_Test/json/valid_object.json @@ -0,0 +1,32 @@ +{ + "a int": 42, + "a negative int": -42, + "a float": 1.8, + "a negative float": -1.8, + "a float scientific notation number": 1.8e+7, + "a float negative scientific notation number": 1.8e-12, + "an int scientific notation number": 42e7, + "an int negative scientific notation number": -42e3, + "true": true, + "false": false, + "null": null, + "a string": "a string", + "escaped char in string": "line 1 \n\tline 2 \r\n\tline 2", + "an array": [ + 42, + -42, + 1.8, + -1.8, + 1.8e+5, + 1.8e-3, + 42e7, + -42e7, + true, + false, + null, + "a string" + ], + "an object": { + "hello": true + } +} diff --git a/Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf b/Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf new file mode 100644 index 0000000..a99c978 --- /dev/null +++ b/Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf @@ -0,0 +1,70 @@ +using System; +using System.Collections; +using JSON_Beef.Attributes; + +namespace JSON_Beef_Test +{ + [AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + [Reflect] + public class Person + { + public String FirstName; + public String LastName; + + [IgnoreSerialize] + public int Age; + } + + [AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + [Reflect] + public class Author: Person + { + public int Id; + public float Test; + public bool Known; + public List Books = new List() ~ DeleteContainerAndItems!(_); + public List Publishers = new List() ~ DeleteContainerAndItems!(_); + + public this(String firstName = "", String lastName = "", int age = 0) + { + FirstName = firstName; + LastName = lastName; + Age = age; + } + } + + [AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + [Reflect] + public class Book + { + public String Name; + + public this(String name = "Book") + { + Name = new String(name); + } + + public ~this() + { + if (Name != null) + { + delete Name; + } + } + + public void Test() + { + + } + + public static bool operator==(Book a, Book b) + { + return a.Name.Equals(b.Name); + } + + public static bool operator!=(Book a, Book b) + { + return !(a == b); + } + } +} diff --git a/Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf b/Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf new file mode 100644 index 0000000..da5dc9f --- /dev/null +++ b/Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf @@ -0,0 +1,556 @@ +using System; +using System.Collections; +using System.IO; +using JSON_Beef.Serialization; +using JSON_Beef.Util; +using JSON_Beef.Types; + +namespace JSON_Beef_Test +{ + // Todo: + // Fix memory leaks from JSONDeserializer and this program class. + class Program + { + static void Main() + { + Console.WriteLine("Test suit for JSON Beef."); + + Console.WriteLine("Testing validation rules:"); + + TestStringsValidation(); + TestNumbersValidation(); + TestLiteralsValidation(); + TestArraysValidation(); + TestObjectsValidation(); + TestJsonFileValidation(); + TestJsonUtil(); + TestJsonParsing(); + TestJsonSerializing(); + TestJsonDeserializing(); + + Console.WriteLine("Press any [enter] to exit."); + Console.In.Read(); + } + + [Test] + static void TestStringsValidation() + { + Test.Assert(JSONValidator.IsValidString("\"\""), "String Validation Test #1 failed"); + Test.Assert(JSONValidator.IsValidString("\"abcdefghijklmnopqrstuvwxyz1234567890-!@#$%^&*()_+[]{};:'?.><,/\""), "String Validation Test #2 failed"); + Test.Assert(JSONValidator.IsValidString("\"\r\n\t\f\b\u{0063}\""), "String Validation Test #3 failed"); + Test.Assert(JSONValidator.IsValidString("\"\a\"") == false, "String Validation Test #4 failed"); + + Console.WriteLine("Strings validation tests passed"); + } + + [Test] + static void TestNumbersValidation() + { + Test.Assert(JSONValidator.IsValidNumber("42"), "Numbers Validation Test #1 failed"); + Test.Assert(JSONValidator.IsValidNumber("-42"), "Numbers Validation Test #2 failed"); + Test.Assert(JSONValidator.IsValidNumber("4242"), "Numbers Validation Test #3 failed"); + Test.Assert(JSONValidator.IsValidNumber("-42.42"), "Numbers Validation Test #4 failed"); + Test.Assert(JSONValidator.IsValidNumber("42e3"), "Numbers Validation Test #5 failed"); + Test.Assert(JSONValidator.IsValidNumber("42e+3"), "Numbers Validation Test #6 failed"); + Test.Assert(JSONValidator.IsValidNumber("42e-3"), "Numbers Validation Test #7 failed"); + Test.Assert(JSONValidator.IsValidNumber("-42e3"), "Numbers Validation Test #8 failed"); + Test.Assert(JSONValidator.IsValidNumber("-42e+3"), "Numbers Validation Test #9 failed"); + Test.Assert(JSONValidator.IsValidNumber("-42e-3"), "Numbers Validation Test #10 failed"); + Test.Assert(JSONValidator.IsValidNumber("4.2e+3"), "Numbers Validation Test #11 failed"); + Test.Assert(JSONValidator.IsValidNumber("-4.2e+3"), "Numbers Validation Test #12 failed"); + Test.Assert(JSONValidator.IsValidNumber("4.2e+3.3") == false, "Numbers Validation Test #13 failed"); + Test.Assert(JSONValidator.IsValidNumber("4.2.3") == false, "Numbers Validation Test #14 failed"); + Test.Assert(JSONValidator.IsValidNumber("4.2e-3.3") == false, "Numbers Validation Test #15 failed"); + Test.Assert(JSONValidator.IsValidNumber("4.2e3.3") == false, "Numbers Validation Test #16 failed"); + Test.Assert(JSONValidator.IsValidNumber("4.2+3.3") == false, "Numbers Validation Test #17 failed"); + Test.Assert(JSONValidator.IsValidNumber("4.2-3.3") == false, "Numbers Validation Test #18 failed"); + Test.Assert(JSONValidator.IsValidNumber("--4.2") == false, "Numbers Validation Test #19 failed"); + Test.Assert(JSONValidator.IsValidNumber(".43") == false, "Numbers Validation Test #20 failed"); + Test.Assert(JSONValidator.IsValidNumber("e43") == false, "Numbers Validation Test #21 failed"); + Test.Assert(JSONValidator.IsValidNumber("-e43") == false, "Numbers Validation Test #22 failed"); + Test.Assert(JSONValidator.IsValidNumber("+e43") == false, "Numbers Validation Test #23 failed"); + Test.Assert(JSONValidator.IsValidNumber("+") == false, "Numbers Validation Test #24 failed"); + Test.Assert(JSONValidator.IsValidNumber("-") == false, "Numbers Validation Test #25 failed"); + Test.Assert(JSONValidator.IsValidNumber("e43") == false, "Numbers Validation Test #26 failed"); + Test.Assert(JSONValidator.IsValidNumber("\r\n\t\f\b\u{0063}") == false, "Numbers Validation Test #27 failed"); + Test.Assert(JSONValidator.IsValidNumber("true") == false, "Numbers Validation Test #28 failed"); + + Console.WriteLine("Numbers validation tests passed"); + } + + [Test] + static void TestLiteralsValidation() + { + Test.Assert(JSONValidator.IsValidLiteral("true"), "Literals Validation Test #1 failed"); + Test.Assert(JSONValidator.IsValidLiteral("false"), "Literals Validation Test #2 failed"); + Test.Assert(JSONValidator.IsValidLiteral("null"), "Literals Validation Test #3 failed"); + Test.Assert(JSONValidator.IsValidLiteral("test") == false, "Literals Validation Test #4 failed"); + Test.Assert(JSONValidator.IsValidLiteral("42") == false, "Literals Validation Test #5 failed"); + Test.Assert(JSONValidator.IsValidLiteral("[]") == false, "Literals Validation Test #6 failed"); + Test.Assert(JSONValidator.IsValidLiteral("{}") == false, "Literals Validation Test #7 failed"); + + Console.WriteLine("Literals validation tests passed"); + } + + [Test] + static void TestArraysValidation() + { + Test.Assert(JSONValidator.IsValidArray("[]"), "Arrays Validation Test #1 failed"); + Test.Assert(JSONValidator.IsValidArray("[42,\"toto\", true]"), "Arrays Validation Test #2 failed"); + Test.Assert(JSONValidator.IsValidArray("[{}]"), "Arrays Validation Test #3 failed"); + Test.Assert(JSONValidator.IsValidArray("[[]]"), "Arrays Validation Test #4 failed"); + Test.Assert(JSONValidator.IsValidArray("[,,,,]") == false, "Arrays Validation Test #5 failed"); + Test.Assert(JSONValidator.IsValidArray("[,]") == false, "Arrays Validation Test #6 failed"); + Test.Assert(JSONValidator.IsValidArray("[42,]") == false, "Arrays Validation Test #7 failed"); + Test.Assert(JSONValidator.IsValidArray("[{}") == false, "Arrays Validation Test #8 failed"); + Test.Assert(JSONValidator.IsValidArray("[") == false, "Arrays Validation Test #9 failed"); + Test.Assert(JSONValidator.IsValidArray("[\"t") == false, "Arrays Validation Test #10 failed"); + + Console.WriteLine("Arrays validation tests passed"); + } + + [Test] + static void TestObjectsValidation() + { + Test.Assert(JSONValidator.IsValidObject("{}"), "Objects Validation Test #1 failed"); + Test.Assert(JSONValidator.IsValidObject("{\"key\":\"a string value\", \"another key\": 42}"), "Objects Validation Test #2 failed"); + Test.Assert(JSONValidator.IsValidObject("{\"key\":[], \"another key\": {}}"), "Objects Validation Test #3 failed"); + Test.Assert(JSONValidator.IsValidObject("{\"key\":\"a string value\", \"another key\":}") == false, "Objects Validation Test #4 failed"); + Test.Assert(JSONValidator.IsValidObject("{\"key\":\"a string value\", 'another key': 42") == false, "Objects Validation Test #5 failed"); + Test.Assert(JSONValidator.IsValidObject("{\"key\":\"a string value\", \"another key") == false, "Objects Validation Test #6 failed"); + + Console.WriteLine("Objects validation tests passed"); + } + + [Test] + static void TestJsonFileValidation() + { + var data = scope String(); + var gotData = GetValidArrayData(data); + + if (gotData) + { + Test.Assert(JSONValidator.IsValidJson(data), "Json file validation test #1 failed"); + } + else + { + Test.Assert(false, "Failed loading array data"); + } + + gotData = GetValidObjectData(data); + if (gotData) + { + Test.Assert(JSONValidator.IsValidJson(data), "Json file validation test #2 failed"); + } + else + { + Test.Assert(false, "Failed loading object data"); + } + + Console.WriteLine("Json file validation tests passed"); + } + + static bool GetValidArrayData(String outData) + { + outData.Clear(); + var exePath = scope String(); + Environment.GetExecutableFilePath(exePath); + + var dir = scope String(); + Path.GetDirectoryPath(exePath, dir); + + var file = scope String(); + Path.Join(dir, "json\\valid_array.json", file); + + let sr = scope StreamReader(); + let isOpened = sr.Open(file); + + switch (isOpened) + { + case .Err(.NotFile), .Err(.NotFound), .Err(.SharingViolation), .Err(.Unknown): + sr.Dispose(); + return false; + default: + sr.ReadToEnd(outData); + sr.Dispose(); + return true; + } + } + + static bool GetValidObjectData(String outData) + { + outData.Clear(); + var exePath = scope String(); + Environment.GetExecutableFilePath(exePath); + + var dir = scope String(); + Path.GetDirectoryPath(exePath, dir); + + var file = scope String(); + Path.Join(dir, "json\\valid_object.json", file); + + let sr = scope StreamReader(); + let isOpened = sr.Open(file); + + switch (isOpened) + { + case .Err(.NotFile), .Err(.NotFound), .Err(.SharingViolation), .Err(.Unknown): + sr.Dispose(); + return false; + default: + sr.ReadToEnd(outData); + sr.Dispose(); + return true; + } + } + + [Test] + static void TestJsonUtil() + { + Test.Assert(JSONUtil.ParseNumber("42") == (uint)42, "JSONUtil test #1 failed"); + Test.Assert(JSONUtil.ParseNumber("42e5") == (uint64)4200000, "JSONUtil test #2 failed"); + Test.Assert(JSONUtil.ParseNumber("-42e3") == -42000, "JSONUtil test #3 failed"); + + var res = JSONUtil.ParseNumber("4.2"); + Test.Assert(ValidError(ref res), "JSONUtil test #4 failed"); + + res = JSONUtil.ParseNumber("42e-3"); + Test.Assert(ValidError(ref res), "JSONUtil test #5 failed"); + + Test.Assert(JSONUtil.ParseNumber("42").Value.Equals(42f), "JSONUtil test #6 failed"); + Test.Assert(JSONUtil.ParseNumber("-42").Value.Equals(-42f), "JSONUtil test #7 failed"); + Test.Assert(JSONUtil.ParseNumber("4.2").Value.Equals(4.2f), "JSONUtil test #8 failed"); + Test.Assert(JSONUtil.ParseNumber("-4.2").Value.Equals(-4.2f), "JSONUtil test #9 failed"); + Test.Assert(JSONUtil.ParseNumber("42e3").Value.Equals(42000f), "JSONUtil test #10 failed"); + Test.Assert(JSONUtil.ParseNumber("-42e3").Value.Equals(-42000f), "JSONUtil test #11 failed"); + Test.Assert(JSONUtil.ParseNumber("4.2e3").Value.Equals(4200f), "JSONUtil test #12 failed"); + Test.Assert(JSONUtil.ParseNumber("-4.2e3").Value.Equals(-4200f), "JSONUtil test #13 failed"); + Test.Assert(JSONUtil.ParseNumber("4.2e-3").Value.Equals(0.0042f), "JSONUtil test #14 failed"); + Test.Assert(JSONUtil.ParseNumber("-4.2e-3").Value.Equals(-0.0042f), "JSONUtil test #15 failed"); + + Test.Assert(JSONUtil.ParseNumber("42").Value.Equals(42), "JSONUtil test #6 failed"); + Test.Assert(JSONUtil.ParseNumber("-42").Value.Equals(-42), "JSONUtil test #7 failed"); + Test.Assert(JSONUtil.ParseNumber("4.2").Value.Equals(4.2), "JSONUtil test #8 failed"); + Test.Assert(JSONUtil.ParseNumber("-4.2").Value.Equals(-4.2), "JSONUtil test #9 failed"); + Test.Assert(JSONUtil.ParseNumber("42e3").Value.Equals(42000), "JSONUtil test #10 failed"); + Test.Assert(JSONUtil.ParseNumber("-42e3").Value.Equals(-42000), "JSONUtil test #11 failed"); + Test.Assert(JSONUtil.ParseNumber("4.2e3").Value.Equals(4200), "JSONUtil test #12 failed"); + Test.Assert(JSONUtil.ParseNumber("-4.2e3").Value.Equals(-4200), "JSONUtil test #13 failed"); + Test.Assert(JSONUtil.ParseNumber("4.2e-3").Value.Equals(0.0042), "JSONUtil test #14 failed"); + Test.Assert(JSONUtil.ParseNumber("-4.2e-3").Value.Equals(-0.0042), "JSONUtil test #15 failed"); + + Test.Assert(JSONUtil.ParseBool("true") == true, "JSONUtil test #16 failed"); + Test.Assert(JSONUtil.ParseBool("false") == false, "JSONUtil test #16 failed"); + Test.Assert(JSONUtil.ParseBool("null") == .Err(.INVALID_LITERAL_VALUE), "JSONUtil test #16 failed"); + + Console.WriteLine("JSONUtil tests passed"); + } + + static bool ValidError(ref Result res) + { + switch (res) + { + case .Err(.INVALID_NUMBER_REPRESENTATION): + return true; + default: + return false; + } + } + + static void TestJsonParsing() + { + var data = scope String(); + var gotData = GetValidArrayData(data); + + if (gotData) + { + let doc = scope JSONDocument(); + if (JSONValidator.IsValidJson(data) && (doc.GetJsonType(data) == .ARRAY)) + { + let array = doc.ParseArray(data); + ValidateArrayFile(array); + delete array.Get(); + } + } + + gotData = GetValidObjectData(data); + + if (gotData) + { + let doc = scope JSONDocument(); + if (JSONValidator.IsValidJson(data) && (doc.GetJsonType(data) == .OBJECT)) + { + let object = doc.ParseObject(data); + ValidateObject(object); + delete object.Get(); + } + } + + Console.WriteLine("JSON Parsing tests passed"); + } + + static void ValidateArrayFile(JSONArray array) + { + ValidateFirstArray(array); + ValidateObject(array); + } + + static void ValidateFirstArray(JSONArray array) + { + var arr = array.Get(0); + Test.Assert(IsValidType(ref arr), "JSON Parsing failed: Invalid type first value in array"); + let v = arr.Get(); + + Test.Assert(v.Count == 12, "JSON Parsing failed: invalid count in first array"); + Test.Assert(IsValidTypeAndValue(v, 0, 42), "JSON Parsing failed: array invalid type or value #1"); + Test.Assert(IsValidTypeAndValue(v, 1, -42), "JSON Parsing failed: array invalid type or value #2"); + Test.Assert(IsValidTypeAndValue(v, 2, 1.8f), "JSON Parsing failed: array invalid type or value #3"); + Test.Assert(IsValidTypeAndValue(v, 3, -1.8f), "JSON Parsing failed: array invalid type or value #4"); + Test.Assert(IsValidTypeAndValue(v, 4, 1.8e5f), "JSON Parsing failed: array invalid type or value #5"); + Test.Assert(IsValidTypeAndValue(v, 5, 1.8e-5f), "JSON Parsing failed: array invalid type or value #6"); + Test.Assert(IsValidTypeAndValue(v, 6, 420000000), "JSON Parsing failed: array invalid type or value #7"); + Test.Assert(IsValidTypeAndValue(v, 7, -420000000), "JSON Parsing failed: array invalid type or value #8"); + Test.Assert(IsValidTypeAndValue(v, 8, true), "JSON Parsing failed: array invalid type or value #9"); + Test.Assert(IsValidTypeAndValue(v, 9, false), "JSON Parsing failed: array invalid type or value #10"); + Test.Assert(IsValidTypeAndValue(v, 10, null), "JSON Parsing failed: array invalid type or value #11"); + Test.Assert(IsValidTypeAndValue(v, 11, "a string"), "JSON Parsing failed: array invalid type or value #12"); + } + + static void ValidateObject(JSONArray array) + { + var obj = array.Get(1); + Test.Assert(IsValidType(ref obj), "JSON Parsing failed: Invalid type second value in array"); + let v = obj.Get(); + + Test.Assert(IsValidTypeAndValue(v, "a int", 42), "JSON Parsing failed: object invalid type or value #1"); + Test.Assert(IsValidTypeAndValue(v, "a negative int", -42), "JSON Parsing failed: object invalid type or value #2"); + Test.Assert(IsValidTypeAndValue(v, "a float", 1.8f), "JSON Parsing failed: object invalid type or value #3"); + Test.Assert(IsValidTypeAndValue(v, "a negative float", -1.8f), "JSON Parsing failed: object invalid type or value #4"); + Test.Assert(IsValidTypeAndValue(v, "a float scientific notation number", 1.8e42f), "JSON Parsing failed: object invalid type or value #5"); + Test.Assert(IsValidTypeAndValue(v, "a float negative scientific notation number", 1.8e-42f), "JSON Parsing failed: object invalid type or value #6"); + Test.Assert(IsValidTypeAndValue(v, "an int scientific notation number", 420000000), "JSON Parsing failed: object invalid type or value #7"); + Test.Assert(IsValidTypeAndValue(v, "an int negative scientific notation number", -420000000), "JSON Parsing failed: object invalid type or value #8"); + Test.Assert(IsValidTypeAndValue(v, "true", true), "JSON Parsing failed: object invalid type or value #9"); + Test.Assert(IsValidTypeAndValue(v, "false", false), "JSON Parsing failed: object invalid type or value #10"); + Test.Assert(IsValidTypeAndValue(v, "null", null), "JSON Parsing failed: object invalid type or value #11"); + Test.Assert(IsValidTypeAndValue(v, "a string", "a string"), "JSON Parsing failed: object invalid type or value #12"); + Test.Assert(IsValidTypeAndValue(v, "escaped char in string", "line 1 \n\tline 2 \r\n\tline 2"), "JSON Parsing failed: object invalid type or value #13"); + + var arr = v.Get("an array"); + Test.Assert(IsValidType(ref arr), "JSON Parsing failed: object invalid type or value #14"); + ValidateArray(arr); + + var anotherObj = v.Get("an object"); + Test.Assert(IsValidType(ref anotherObj), "JSON Parsing failed: object invalid type or value #15"); + Test.Assert(IsValidTypeAndValue(anotherObj, "hello", true), "JSON Parsing failed: object invalid type or value #16"); + } + + static void ValidateObject(JSONObject v) + { + Test.Assert(IsValidTypeAndValue(v, "a int", 42), "JSON Parsing failed: object invalid type or value #1"); + Test.Assert(IsValidTypeAndValue(v, "a negative int", -42), "JSON Parsing failed: object invalid type or value #2"); + Test.Assert(IsValidTypeAndValue(v, "a float", 1.8f), "JSON Parsing failed: object invalid type or value #3"); + Test.Assert(IsValidTypeAndValue(v, "a negative float", -1.8f), "JSON Parsing failed: object invalid type or value #4"); + Test.Assert(IsValidTypeAndValue(v, "a float scientific notation number", 1.8e7f), "JSON Parsing failed: object invalid type or value #5"); + Test.Assert(IsValidTypeAndValue(v, "a float negative scientific notation number", 1.8e-12f), "JSON Parsing failed: object invalid type or value #6"); + Test.Assert(IsValidTypeAndValue(v, "an int scientific notation number", 420000000), "JSON Parsing failed: object invalid type or value #7"); + Test.Assert(IsValidTypeAndValue(v, "an int negative scientific notation number", -42000), "JSON Parsing failed: object invalid type or value #8"); + Test.Assert(IsValidTypeAndValue(v, "true", true), "JSON Parsing failed: object invalid type or value #9"); + Test.Assert(IsValidTypeAndValue(v, "false", false), "JSON Parsing failed: object invalid type or value #10"); + Test.Assert(IsValidTypeAndValue(v, "null", null), "JSON Parsing failed: object invalid type or value #11"); + Test.Assert(IsValidTypeAndValue(v, "a string", "a string"), "JSON Parsing failed: object invalid type or value #12"); + Test.Assert(IsValidTypeAndValue(v, "escaped char in string", "line 1 \n\tline 2 \r\n\tline 2"), "JSON Parsing failed: object invalid type or value #13"); + + var arr = v.Get("an array"); + Test.Assert(IsValidType(ref arr), "JSON Parsing failed: object invalid type or value #14"); + ValidateArray(arr); + + var anotherObj = v.Get("an object"); + Test.Assert(IsValidType(ref anotherObj), "JSON Parsing failed: object invalid type or value #15"); + Test.Assert(IsValidTypeAndValue(anotherObj, "hello", true), "JSON Parsing failed: object invalid type or value #16"); + } + + static void ValidateArray(JSONArray v) + { + Test.Assert(v.Count == 12, "JSON Parsing failed: invalid count in array"); + Test.Assert(IsValidTypeAndValue(v, 0, 42), "JSON Parsing failed: array invalid type or value #17"); + Test.Assert(IsValidTypeAndValue(v, 1, -42), "JSON Parsing failed: array invalid type or value #18"); + Test.Assert(IsValidTypeAndValue(v, 2, 1.8f), "JSON Parsing failed: array invalid type or value #19"); + Test.Assert(IsValidTypeAndValue(v, 3, -1.8f), "JSON Parsing failed: array invalid type or value #20"); + Test.Assert(IsValidTypeAndValue(v, 4, 1.8e5f), "JSON Parsing failed: array invalid type or value #21"); + Test.Assert(IsValidTypeAndValue(v, 5, 1.8e-3f), "JSON Parsing failed: array invalid type or value #22"); + Test.Assert(IsValidTypeAndValue(v, 6, 420000000), "JSON Parsing failed: array invalid type or value #23"); + Test.Assert(IsValidTypeAndValue(v, 7, -420000000), "JSON Parsing failed: array invalid type or value #24"); + Test.Assert(IsValidTypeAndValue(v, 8, true), "JSON Parsing failed: array invalid type or value #25"); + Test.Assert(IsValidTypeAndValue(v, 9, false), "JSON Parsing failed: array invalid type or value #26"); + Test.Assert(IsValidTypeAndValue(v, 10, null), "JSON Parsing failed: array invalid type or value #27"); + Test.Assert(IsValidTypeAndValue(v, 11, "a string"), "JSON Parsing failed: array invalid type or value #28"); + } + + static bool IsValidType(ref Result res) + { + switch (res) + { + case .Err(.INDEX_OUT_OF_BOUNDS), .Err(.INVALID_RETURN_TYPE): + return false; + default: + return true; + } + } + + static bool IsValidTypeAndValue(JSONArray a, int idx, T value) + { + var v = a.Get(idx); + + var isValidType = IsValidType(ref v); + var isValidValue = (v.Get() == value); + + return (isValidType && isValidValue); + } + + static bool IsValidTypeAndValue(JSONObject o, String key, T value) + { + var v = o.Get(key); + + var isValidType = IsValidType(ref v); + var isValidValue = (v.Get() == value); + + return (isValidType && isValidValue); + } + + [Test] + static void TestJsonSerializing() + { + let author = scope Author("Jonathan", "Racaud", 25); + author.Id = 1; + author.Test = 25.4f; + author.Known = false; + author.Publishers.Add(new String("GoldenBooks")); + author.Publishers.Add(new String("AncientBooks")); + author.Publishers.Add(new String("NewBooks")); + author.Books.Add(new Book("The Art of War")); + author.Books.Add(new Book("Flowers for Algernon")); + author.Books.Add(new Book("Another book")); + + //let finalStr = "{\"FirstName\":\"Jonathan\",\"LastName\":\"Racaud\",\"Id\":1,\"Test\":25.4,\"Books\":[{\"Name\":\"The Art of War\"},{\"Name\":\"Flowers for Algernon\"},{\"Name\":\"Another book\"}],\"Publishers\":[\"GoldenBooks\",\"AncientBooks\",\"NewBooks\"]}"; + + let resObj = JSONSerializer.Serialize(author); + + if (resObj != .Err) + { + let json = resObj.Value; + let str = scope String(); + + json.ToString(str); + + let deserializedAuthor = scope Author(); + let res = JSONDeserializer.Deserialize(str, deserializedAuthor); + + switch (res) + { + case .Err(let err): + Test.Assert(false, "JSON Serializing failed #1"); + case .Ok(let val): + Test.Assert(ObjectsMatch(author, deserializedAuthor), "JSON Serializing failed #2"); + } + + delete json; + } + + /// Need to find a way to reliably test serializing works when serializing to String. + /// Especially because of the float that can have representation different than the set value. + /*let resStr = JSONSerializer.Serialize(author); + + if (resStr != .Err) + { + Test.Assert(resStr.Value.Equals(finalStr), "JSON Serializing failed #1"); + delete resStr.Value; + }*/ + + Console.WriteLine("JSONSerializing tests passed"); + } + + [Test] + static void TestJsonDeserializing() + { + let json = "{\"Id\": 256, \"Test\": 4.2, \"Known\": false, \"FirstName\":\"Jonathan\",\"LastName\":\"Racaud\",\"Books\":[{\"Name\":\"The Art of War\"},{\"Name\":\"Flowers for Algernon\"},{\"Name\":\"Another book\"}],\"Publishers\":[\"GoldenBooks\",\"AncientBooks\",\"NewBooks\"]}"; + let author = scope Author("Jonathan", "Racaud", 25); + author.Id = 256; + author.Test = 4.2f; + author.Known = false; + author.Publishers.Add(new String("GoldenBooks")); + author.Publishers.Add(new String("AncientBooks")); + author.Publishers.Add(new String("NewBooks")); + author.Books.Add(new Book("The Art of War")); + author.Books.Add(new Book("Flowers for Algernon")); + author.Books.Add(new Book("Another book")); + + let deserializedAuthor = scope Author(); + var res = JSONDeserializer.Deserialize(json, deserializedAuthor); + + switch (res) + { + case .Err(let err): + Test.Assert(false, "JSON Deserializing failed #1"); + case .Ok: + Test.Assert(ObjectsMatch(author, deserializedAuthor), "JSON Deserializing failed #1"); + } + + let deserializedTest = scope TestClass(); + let jsonTest = "{\"MultipleList\": [[\"1\", \"2\"], [\"3\", \"4\"], [\"5\", \"6\"]]}"; + res = JSONDeserializer.Deserialize(jsonTest, deserializedTest); + + switch (res) + { + case .Err(let err): + Test.Assert(false, "JSON Deserializing failed #2"); + case .Ok: + Test.Assert(deserializedTest.MultipleList.Count == 3, "JSON Deserializing failed #2"); + } + + Console.WriteLine("JSONDeserializing tests passed"); + } + + static bool ObjectsMatch(Author a, Author b) + { + if ((a.FirstName != b.FirstName) || + ((a.LastName != b.LastName)) || + (a.Publishers.Count != b.Publishers.Count) || + (a.Books.Count != b.Books.Count) || + (a.Id != b.Id) || + !a.Test.Equals(b.Test) || + (a.Known != b.Known)) + { + return false; + } + + var missingBooks = a.Books.Count; + for (int i = 0; i < a.Books.Count; i++) + { + for (int j = 0; j < b.Books.Count; j++) + { + if (b.Books[j] == a.Books[i]) + { + missingBooks--; + break; + } + } + } + + var missingPublishers = a.Publishers.Count; + for (int i = 0; i < a.Publishers.Count; i++) + { + for (int j = 0; j < b.Publishers.Count; j++) + { + if (b.Publishers[j] == a.Publishers[i]) + { + missingPublishers--; + break; + } + } + } + + return ((missingBooks == 0) && (missingPublishers == 0)); + } + } +} diff --git a/Libs/JSON_Beef/JSON_Beef_Test/src/TestClass.bf b/Libs/JSON_Beef/JSON_Beef_Test/src/TestClass.bf new file mode 100644 index 0000000..f76440a --- /dev/null +++ b/Libs/JSON_Beef/JSON_Beef_Test/src/TestClass.bf @@ -0,0 +1,12 @@ +using System; +using System.Collections; + +namespace JSON_Beef_Test +{ + [AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + [Reflect] + public class TestClass + { + public List> MultipleList = new List>(); + } +} diff --git a/Libs/JSON_Beef/LICENSE b/Libs/JSON_Beef/LICENSE new file mode 100644 index 0000000..507bc67 --- /dev/null +++ b/Libs/JSON_Beef/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Jonathan Racaud + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Libs/JSON_Beef/README.md b/Libs/JSON_Beef/README.md new file mode 100644 index 0000000..161dafc --- /dev/null +++ b/Libs/JSON_Beef/README.md @@ -0,0 +1,138 @@ +# JSON_Beef +A JSON parser library made in the Beef programming language. + +Still a work in progress. + +Todo: +- JSON String parsing: + - Handle unescaped characters in strings as error. + - Parse UTF-8 characters e.g.: u0063. +- Object deserialization: + - Create and add to a List object through reflection. + +## Project organization +This repository consist of two distinct folders: +- JSON_Beef_Test: A program to test the objects and methods from the JSON_Beef lib. +- lib: The JSON_Beef library. + +The JSON_Beef library depends on the Beef Extensions Library that can be found here: [Beef Extensions Library](https://github.com/Jonathan-Racaud/Beef-Extensions-Lib). + +## How to use JSON Beef + +**Adding JSON_Beef to your project:** +1. Clone the Beef Extensions Library in the location of your choice. +2. Clone the JSON_Beef library in the location of your choice. +3. In Beef IDE, right click on Workspace->Add existing project. +4. Select the BeefProj.toml file ffrom the JSON_Beef project. +5. Repeat step 3 and 4 for the Beef Extensions Library. +6. Open your project's properties. +7. Go to General->Dependencies +8. Tick JSON_Beef (you can also tick Beef Extensions Library, but it should be added as dependencies automatically when building). +9. You can now start using the library. + + +**Using the library:** +JSON_Beef consists of several objects to manipulate JSON data: +- JSONDocument: Used to validate and parse a JSON String into either a **JSONObject** or a **JSONArray** +- JSONObject: Class representing a JSON Object. +- JSONArray: Class representing a JSON Array. +- JSONValidator: Class implementing the JSON specification validation rules. +- JSONUtil: Utility class for working with certain aspect of the JSON specification. +- JSONSerializer: Class serializing an Object into either a **JSONObject** a **JSONArray** or **String** object. +- JSONDeserializer: Class deserializing a JSON String into an Object of the specified type **(Work in progress)** +- JsonList: Class inheriting from List to allow Deserialization of JSON Lists into a List like class. This class does not provided more methods than a List. Its only use is for being able to find the *Add* method through reflection. + +**Validating a JSON String:** +```c# +JSONValidator.IsValidJson(jsonString); +``` + +**Parsing a JSON String into a JSONArray:** +```c# +let doc = scope JSONDocument(); +if (JSONValidator.IsValidJson(data) && (doc.GetJsonType(data) == .ARRAY)) +{ + let array = doc.ParseArray(data); + + // Work with the JSONArray object. + + // You are responsible for the deletion of the JSONArray. + delete array.Get(); +} +``` + +**Parsing a JSON String into a JSON Object:** +```c# +let doc = scope JSONDocument(); +if (JSONValidator.IsValidJson(data) && (doc.GetJsonType(data) == .OBJECT)) +{ + let array = doc.ParseObject(data); + + // Work with the JSONAObject object. + + // You are responsible for the deletion of the JSONObject. + delete array.Get(); +} +``` + +**Serializing a user defined class:** +Serializing a user defined class uses reflection so in order for it to work, you must declare your class like so: +```c# +[AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] // Allows for the type to be created via reflection (used by the Deserializer). +[Reflect] // Allows for the type's fields to be discoverable via reflection in order to serialize them. +public class CustomClass +{ + // public fields will be automatically serialized. + public String Name; + + // This attributes allows for ignoring fields. + [IgnoreSerialize] + public String IgnoredField; + + // Private fields are ignored. + private int mRandomId; +} +``` + +You can then use the JSONSerializer class like so: +```c# +let jsonObject = JSONSerializer.Serialize(object); +let jsonArray = JSONSerializer.Serialize(object); +let str = JSONSerializer.Serialize(object); +``` + +**Deserializing a user defined class (Work in progress):** +In order to deserialize a user defined type, it must be marked with the following attributes: +```c# +[AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] // Allows for the type to be created via reflection (used by the Deserializer). +[Reflect] // Allows for the type's fields to be discoverable via reflection in order to serialize them. +``` + +Now you can deserialize a JSON string into your CustomClass using JSONDeserializer: +```c# +let customClass = JSONDeserializer.Deserialize(json); +``` + +Due to a limitation with the Beef language that do not provide by default reflection for the List type nor a way to add it without modifying the language (from my knowledge), you need to use the JsonList type which is a thin wrapper around the List type providing the necessary reflection capabilities for the Deserialization to work with Lists. + +In the future, if the language allows reflection for its List type, then the JsonList class shall be removed. + +For more examples about how to use the library you can look at the JSON_Beef_Test project. + +## Important notes +- The JSON_Beef library can only serialize ```List``` or ```JsonList``` types into JSONArray and only deserialize a JSON array into a ```JsonList```. +- Because the ```List``` type does not provides its method through reflection, the JSONDeserializer cannot successfully deserialize a JSON Array into its corresponding field of type ```List```. While waiting for a better way of doing it, the ```JsonList``` has been added. See the issue [Working with lists](https://github.com/Jonathan-Racaud/JSON_Beef/issues/2) for more information. +- When deserializing into a user defined type, the keys inside the JSON object string representation must match the field's name as declared (case sensitive): + +```c# +public class Person +{ + public String FirstName; +} + +let wrongJson = "{\"Firstname\": \"Jonathan\"}"; +let person = JSONDeserialize(wrongJson); // Will not yield expected results because the type Person doesn't have a field named: Firstname. + +let rightJson = "{\"FirstName\": \"Jonathan\"}"; +let person = JSONDeserialize(rightJson); // the person object will successfully be serialized. +``` diff --git a/Libs/JSON_Beef/lib/BeefProj.toml b/Libs/JSON_Beef/lib/BeefProj.toml new file mode 100644 index 0000000..8fa0a51 --- /dev/null +++ b/Libs/JSON_Beef/lib/BeefProj.toml @@ -0,0 +1,13 @@ +FileVersion = 1 +Dependencies = {corlib = "*", corlib = "*", BeefExtensionsLib = "*"} + +[Project] +Name = "JSON_Beef" + +[[Project.DistinctOptions]] +Filter = "System.Collections.List<*>" +ReflectAlwaysInclude = "IncludeAll" +ReflectStaticMethods = true +ReflectNonStaticMethods = true +ReflectConstructors = true +ReflectMethodFilter = "__BfCtor; Add" diff --git a/Libs/JSON_Beef/lib/src/Attributes/JSONAttributes.bf b/Libs/JSON_Beef/lib/src/Attributes/JSONAttributes.bf new file mode 100644 index 0000000..a6c89ae --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Attributes/JSONAttributes.bf @@ -0,0 +1,9 @@ +using System; + +namespace JSON_Beef.Attributes +{ + [AttributeUsage(.Field | .Property, .ReflectAttribute, ReflectUser=.All)] + public struct IgnoreSerializeAttribute: Attribute + { + } +} diff --git a/Libs/JSON_Beef/lib/src/Serialization/JSONDeserializer.bf b/Libs/JSON_Beef/lib/src/Serialization/JSONDeserializer.bf new file mode 100644 index 0000000..f06ef59 --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Serialization/JSONDeserializer.bf @@ -0,0 +1,702 @@ +using System; +using System.Collections; +using System.Reflection; +using JSON_Beef.Types; +using JSON_Beef.Util; + +namespace JSON_Beef.Serialization +{ + public static class JSONDeserializer + { + public enum DESERIALIZE_ERRORS + { + JSON_NOT_MATCHING_OBJECT, + ERROR_PARSING, + CANNOT_ASSIGN_VALUE, + FIELD_NOT_FOUND, + INVALID_FIELD_TYPE, + INVALID_JSON, + OBJECT_IS_NULL, + CANNOT_ASSIGN_LIST_TO_OBJECT + } + + public static Result Deserialize(String jsonString, T object) + { + if (!JSONValidator.IsValidJson(jsonString)) + { + return .Err(.INVALID_JSON); + } + + if (object == null) + { + return .Err(.OBJECT_IS_NULL); + } + + let doc = scope JSONDocument(); + + switch (doc.GetJsonType(jsonString)) + { + case .OBJECT: + var jsonObject = scope JSONObject(); + doc.ParseObject(jsonString, ref jsonObject); + + if (!AreTypeMatching(jsonObject, object)) + { + return .Err(.JSON_NOT_MATCHING_OBJECT); + } + + return DeserializeObject(jsonObject, object); + case .ARRAY: + var jsonArray = scope JSONArray(); + doc.ParseArray(jsonString, ref jsonArray); + + return DeserializeArray(jsonArray, object); + case .UNKNOWN: + return .Err(.INVALID_JSON); + } + } + + // The object corresponds to the jsonObject + // e.g.: jsonArray => {"Key": "Value"} -- object => CustomObject + private static Result DeserializeObject(JSONObject jsonObject, Object object) + { + if (object == null) + { + return .Err(.ERROR_PARSING); + } + + Try!(DeserializeBaseObject(jsonObject, object)); + + let type = object.GetType() as TypeInstance; + let fields = type.GetFields(); + + for (var field in fields) + { + if (AttributeChecker.ShouldIgnore(field)) + { + continue; + } + + if (TypeChecker.IsTypeList(field.FieldType)) + { + Try!(SetArrayField(field, jsonObject, object)); + } + else if (TypeChecker.IsUserObject(field.FieldType)) + { + Try!(SetObjectField(field, jsonObject, object)); + } + else if (TypeChecker.IsPrimitive(field.FieldType)) + { + Try!(SetPrimitiveField(field, jsonObject, object)); + } + else + { + return .Err(.ERROR_PARSING); + } + } + + return .Ok; + } + + private static Result DeserializeBaseObject(JSONObject jsonObject, Object obj) + { + let type = obj.GetType(); + let baseType = type.BaseType; + + if (baseType == type) + { + return .Ok; + } + + let fields = baseType.GetFields(); + + for (var field in fields) + { + if (AttributeChecker.ShouldIgnore(field)) + { + continue; + } + + if (TypeChecker.IsTypeList(field.FieldType)) + { + Try!(SetArrayField(field, jsonObject, obj)); + } + else if (TypeChecker.IsUserObject(field.FieldType)) + { + Try!(SetObjectField(field, jsonObject, obj)); + } + else if (TypeChecker.IsPrimitive(field.FieldType)) + { + Try!(SetPrimitiveField(field, jsonObject, obj)); + } + else + { + return .Err(.ERROR_PARSING); + } + } + return .Ok; + } + + // The object corresponds to the jsonArray + // e.g.: jsonArray => [["1", "2", "3"], ["1", "2"]] -- object => List> + // e.g.: jsonArray => ["1", "2", "3"] -- object => List + // e.g.: jsonArray => [{"Key": "Value"}] -- object => List + private static Result DeserializeArray(JSONArray jsonArray, Object object) + { + if (!TypeChecker.IsTypeList(object)) + { + return .Err(.CANNOT_ASSIGN_LIST_TO_OBJECT); + } + + let type = object.GetType() as SpecializedGenericType; + let addMethod = Try!(type.GetMethod("Add")); + let paramType = type.GetGenericArg(0) as TypeInstance; + + for (int i = 0; i < jsonArray.Count; i++) + { + // Calls recursively for handling List> + if (TypeChecker.IsTypeList(paramType) && (paramType.CreateObject() case .Ok(let innerList))) + { + let innerJsonArray = Try!(jsonArray.Get(i)); + + Try!(DeserializeArray(innerJsonArray, innerList)); + + if (addMethod.Invoke(object, innerList) case .Err) + { + return .Err(.CANNOT_ASSIGN_VALUE); + } + continue; + } + + if (TypeChecker.IsUserObject(paramType) && (paramType.CreateObject() case .Ok(let innerObject))) + { + let jsonObject = Try!(jsonArray.Get(i)); + + Try!(DeserializeObject(jsonObject, innerObject)); + + if (addMethod.Invoke(object, innerObject) case .Err) + { + return .Err(.CANNOT_ASSIGN_VALUE); + } + continue; + } + + if (TypeChecker.IsPrimitive(paramType)) + { + Try!(AddPrimitiveToArray(paramType, jsonArray, i, object, addMethod)); + } + } + + return .Ok; + } + + private static Result AddPrimitiveToArray(Type type, JSONArray jsonArray, int i, Object obj, MethodInfo addMethod) + { + switch (type) + { + case typeof(int): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(int8): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(int16): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(int32): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(int64): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint8): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint16): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint32): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint64): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(char8): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(char16): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(char32): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(float): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(double): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(bool): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(String): + if (jsonArray.Get(i) case .Ok(let val)) + { + addMethod.Invoke(obj, new String(val)); + } + else + { + return .Err(.ERROR_PARSING); + } + } + + return .Ok; + } + + private static bool AreTypeMatching(JSONObject jsonObject, Object obj) + { + let type = obj.GetType(); + let fields = type.GetFields(); + + if (!AreBaseTypeMatching(jsonObject, obj)) + { + return false; + } + + for (var field in fields) + { + if (AttributeChecker.ShouldIgnore(field)) + { + continue; + } + + if (!HasField(jsonObject, obj, field)) + { + return false; + } + } + return true; + } + + private static bool AreBaseTypeMatching(JSONObject jsonObject, Object obj) + { + let type = obj.GetType(); + let baseType = type.BaseType; + + if (type == baseType) + { + return true; + } + + let fields = baseType.GetFields(); + + for (var field in fields) + { + if (AttributeChecker.ShouldIgnore(field)) + { + continue; + } + + let fieldValue = field.GetValue(obj).Get().Get(); + + if (!HasField(jsonObject, obj, field)) + { + return false; + } + + if (!AreBaseTypeMatching(jsonObject, fieldValue)) + { + return false; + } + } + + return true; + } + + private static bool HasField(JSONObject jsonObj, Object obj, FieldInfo field) + { + let fieldName = scope String(field.Name); + let fieldVariant = field.GetValue(obj).Value; + let fieldVariantType = fieldVariant.VariantType; + + var hasField = false; + if (fieldVariantType.IsPrimitive) + { + switch (fieldVariantType) + { + case typeof(int): + hasField = jsonObj.Contains(fieldName); + case typeof(int8): + hasField = jsonObj.Contains(fieldName); + case typeof(int16): + hasField = jsonObj.Contains(fieldName); + case typeof(int32): + hasField = jsonObj.Contains(fieldName); + case typeof(int64): + hasField = jsonObj.Contains(fieldName); + case typeof(uint): + hasField = jsonObj.Contains(fieldName); + case typeof(uint8): + hasField = jsonObj.Contains(fieldName); + case typeof(uint16): + hasField = jsonObj.Contains(fieldName); + case typeof(uint32): + hasField = jsonObj.Contains(fieldName); + case typeof(uint64): + hasField = jsonObj.Contains(fieldName); + case typeof(char8): + hasField = jsonObj.Contains(fieldName); + case typeof(char16): + hasField = jsonObj.Contains(fieldName); + case typeof(char32): + hasField = jsonObj.Contains(fieldName); + case typeof(bool): + hasField = jsonObj.Contains(fieldName); + case typeof(float): + hasField = jsonObj.Contains(fieldName); + case typeof(double): + hasField = jsonObj.Contains(fieldName); + default: + return false; + } + } + else if (fieldVariantType.IsObject) + { + switch (fieldVariantType) + { + case typeof(String): + hasField = jsonObj.Contains(fieldName); + default: + let fieldValue = fieldVariant.Get(); + + if (TypeChecker.IsTypeList(fieldValue)) + { + hasField = jsonObj.Contains(fieldName); + } + else + { + hasField = jsonObj.Contains(fieldName); + } + } + } + + return hasField; + } + + static Result SetPrimitiveField(FieldInfo field, JSONObject jsonObj, Object obj) + { + let type = field.FieldType; + let key = scope String(field.Name); + + switch (type) + { + case typeof(int): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(int8): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(int16): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(int32): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(int64): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint8): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint16): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint32): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(uint64): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(char8): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(char16): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(char32): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(float): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(double): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(bool): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, val); + } + else + { + return .Err(.ERROR_PARSING); + } + case typeof(String): + if (jsonObj.Get(key) case .Ok(let val)) + { + field.SetValue(obj, new String(val)); + } + else + { + return .Err(.ERROR_PARSING); + } + default: + return .Err(.ERROR_PARSING); + } + + return .Ok; + } + + private static Result SetObjectField(FieldInfo field, JSONObject jsonObject, Object obj) + { + let type = field.FieldType; + let key = scope String(field.Name); + + if ((type.CreateObject() case .Ok(let fieldObject)) && + (jsonObject.Get(key) case .Ok(let val))) + { + if (val == null) + { + field.SetValue(obj, null); + return .Ok; + } + + Try!(DeserializeObject(val, fieldObject)); + field.SetValue(obj, fieldObject); + } + else + { + return .Err(.ERROR_PARSING); + } + + return .Ok; + } + + private static Result SetArrayField(FieldInfo field, JSONObject jsonObject, Object obj) + { + let type = field.FieldType; + let key = scope String(field.Name); + + if ((type.CreateObject() case .Ok(let fieldList)) && + (jsonObject.Get(key) case .Ok(let array))) + { + if (array == null) + { + field.SetValue(obj, null); + return .Ok; + } + + Try!(DeserializeArray(array, fieldList)); + field.SetValue(obj, fieldList); + } + else + { + return .Err(.ERROR_PARSING); + } + + return .Ok; + } + } +} diff --git a/Libs/JSON_Beef/lib/src/Serialization/JSONSerializer.bf b/Libs/JSON_Beef/lib/src/Serialization/JSONSerializer.bf new file mode 100644 index 0000000..da5d15e --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Serialization/JSONSerializer.bf @@ -0,0 +1,447 @@ +using System; +using System.Collections; +using System.Reflection; +using JSON_Beef.Types; +using JSON_Beef.Attributes; + +namespace JSON_Beef.Serialization +{ + public class JSONSerializer + { + public static Result Serialize(Object object) where T: JSONObject + { + if (object == null) + { + return .Err; + } + + let json = new JSONObject(); + let type = object.GetType(); + var fields = type.GetFields(); + + SerializeObjectBaseTypeInternal(object, json); + + for (var field in fields) + { + if (ShouldIgnore(field)) + { + continue; + } + + let res = SerializeObjectInternal(object, field, json); + + if (res == .Err) + { + return .Err; + } + } + + return .Ok(json); + } + + public static Result Serialize(ref Object object) where T: JSONArray + { + if (!IsList(object) || (object == null)) + { + return .Err; + } + + let jsonArray = new JSONArray(); + let list = (List*)&object; + + for (var item in *list) + { + if (item == null) + { + jsonArray.Add(null); + } + else if (IsList(item)) + { + let res = Serialize(ref item); + + if (res == .Err) + { + return .Err; + } + + jsonArray.Add(res.Value); + } + else + { + let itemType = item.GetType(); + + switch (itemType) + { + case typeof(String): + jsonArray.Add(item as String); + case typeof(int): + jsonArray.Add((int)item); + case typeof(int8): + jsonArray.Add((int8)item); + case typeof(int16): + jsonArray.Add((int16)item); + case typeof(int32): + jsonArray.Add((int32)item); + case typeof(int64): + jsonArray.Add((int64)item); + case typeof(uint): + jsonArray.Add((uint)item); + case typeof(uint8): + jsonArray.Add((uint8)item); + case typeof(uint16): + jsonArray.Add((uint16)item); + case typeof(uint32): + jsonArray.Add((uint32)item); + case typeof(uint64): + jsonArray.Add((uint64)item); + case typeof(char8): + jsonArray.Add((char8)item); + case typeof(char16): + jsonArray.Add((char16)item); + case typeof(char32): + jsonArray.Add((char32)item); + case typeof(float): + jsonArray.Add((float)item); + case typeof(double): + jsonArray.Add((float)item); + case typeof(bool): + jsonArray.Add((bool)item); + default: + let res = Serialize(item); + + if (res == .Err) + { + return .Err; + } + + jsonArray.Add(res.Value); + delete res.Value; + } + } + } + + return .Ok(jsonArray); + } + + public static Result Serialize(Object object) where T: String + { + let str = new String(); + + if (IsList(object)) + { + var obj = object; + let res = Serialize(ref obj); + + if (res == .Err) + { + delete str; + return .Err; + } + + res.Value.ToString(str); + delete res.Value; + } + else + { + let res = Serialize(object); + + if (res == .Err) + { + delete str; + return .Err; + } + + res.Value.ToString(str); + delete res.Value; + } + return .Ok(str); + } + + private static bool IsList(Object object) + { + let type = object.GetType(); + let typeName = scope String(); + type.GetName(typeName); + + return typeName.Equals("List") || typeName.Equals("JsonList"); + } + + private static bool ShouldIgnore(FieldInfo field) + { + let shouldIgnore = field.GetCustomAttribute(); + + return ((shouldIgnore == .Ok) || field.HasFieldFlag(.PrivateScope) || field.HasFieldFlag(.Private)); + } + + private static Result SerializeObjectInternal(Object object, FieldInfo field, JSONObject json) + { + let fieldName = scope String(field.Name); + let fieldVariant = field.GetValue(object).Get(); + let fieldVariantType = fieldVariant.VariantType; + + if (fieldVariantType.IsPrimitive) + { + switch (fieldVariantType) + { + case typeof(int): + json.Add(fieldName, fieldVariant.Get()); + case typeof(int8): + json.Add(fieldName, fieldVariant.Get()); + case typeof(int16): + json.Add(fieldName, fieldVariant.Get()); + case typeof(int32): + json.Add(fieldName, fieldVariant.Get()); + case typeof(int64): + json.Add(fieldName, fieldVariant.Get()); + case typeof(uint): + json.Add(fieldName, fieldVariant.Get()); + case typeof(uint8): + json.Add(fieldName, fieldVariant.Get()); + case typeof(uint16): + json.Add(fieldName, fieldVariant.Get()); + case typeof(uint32): + json.Add(fieldName, fieldVariant.Get()); + case typeof(uint64): + json.Add(fieldName, fieldVariant.Get()); + case typeof(char8): + json.Add(fieldName, fieldVariant.Get()); + case typeof(char16): + json.Add(fieldName, fieldVariant.Get()); + case typeof(char32): + json.Add(fieldName, fieldVariant.Get()); + case typeof(float): + json.Add(fieldName, fieldVariant.Get()); + case typeof(double): + json.Add(fieldName, fieldVariant.Get()); + case typeof(bool): + json.Add(fieldName, fieldVariant.Get()); + default: + return .Err; + } + } + else if (fieldVariantType.IsObject) + { + var fieldValue = fieldVariant.Get(); + + if (fieldValue == null) + { + json.Add(fieldName, null); + return .Ok; + } + + SerializeObjectBaseTypeInternal(fieldValue, json); + + if (IsList(fieldValue)) + { + let res = Serialize(ref fieldValue); + + if (res == .Err) + { + return .Err; + } + + json.Add(fieldName, res.Value); + delete res.Value; + } + else + { + switch (fieldVariantType) + { + case typeof(String): + json.Add(fieldName, (String)fieldValue); + default: + let res = Serialize(fieldValue); + + if (res == .Err) + { + delete json; + return .Err; + } + + json.Add(fieldName, res.Value); + delete res.Value; + } + } + } + + return .Ok; + } + + private static Result SerializeObjectBaseTypeInternal(Object object, JSONObject json) + { + let type = object.GetType(); + let baseType = type.BaseType; + + // It is not an error to have the same base type as the current type. + // It only tells that we arrived at the top of the inheritence chain. + // So I exit now to break any infinite recursion loop. + if (type == baseType) + { + return .Ok; + } + + let fields = baseType.GetFields(); + + for (var field in fields) + { + if (ShouldIgnore(field)) + { + continue; + } + + let fieldName = scope String(field.Name); + let fieldVariant = field.GetValue(object).Get(); + let fieldVariantType = fieldVariant.VariantType; + var fieldValue = fieldVariant.Get(); + + SerializeObjectBaseTypeInternal(fieldValue, json); + + if (fieldValue == null) + { + json.Add(fieldName, null); + } + else if (IsList(fieldValue)) + { + let res = Serialize(ref fieldValue); + + if (res == .Err) + { + return .Err; + } + + json.Add(fieldName, res.Value); + delete res.Value; + } + else + { + switch (fieldVariantType) + { + case typeof(String): + json.Add(fieldName, (String)fieldValue); + case typeof(int): + json.Add(fieldName, (int)fieldValue); + case typeof(int8): + json.Add(fieldName, (int8)fieldValue); + case typeof(int16): + json.Add(fieldName, (int16)fieldValue); + case typeof(int32): + json.Add(fieldName, (int32)fieldValue); + case typeof(int64): + json.Add(fieldName, (int64)fieldValue); + case typeof(uint): + json.Add(fieldName, (uint)fieldValue); + case typeof(uint8): + json.Add(fieldName, (uint8)fieldValue); + case typeof(uint16): + json.Add(fieldName, (uint16)fieldValue); + case typeof(uint32): + json.Add(fieldName, (uint32)fieldValue); + case typeof(uint64): + json.Add(fieldName, (uint64)fieldValue); + case typeof(char8): + json.Add(fieldName, (char8)fieldValue); + case typeof(char16): + json.Add(fieldName, (char16)fieldValue); + case typeof(char32): + json.Add(fieldName, (char32)fieldValue); + case typeof(float): + json.Add(fieldName, (float)fieldValue); + case typeof(double): + json.Add(fieldName, (double)fieldValue); + case typeof(bool): + json.Add(fieldName, (bool)fieldValue); + default: + let res = Serialize(fieldValue); + + if (res == .Err) + { + delete json; + return .Err; + } + + json.Add(fieldName, res.Value); + delete res.Value; + } + } + } + + return .Ok; + } + + private static Result SerializeArrayInternal(Object object, FieldInfo field, JSONArray json) + { + let fieldVariant = field.GetValue(object).Get(); + let fieldVariantType = fieldVariant.VariantType; + var fieldValue = fieldVariant.Get(); + + if (fieldValue == null) + { + json.Add(null); + } + else if (IsList(fieldValue)) + { + let res = Serialize(ref fieldValue); + + if (res == .Err) + { + return .Err; + } + + json.Add(res.Value); + delete res.Value; + } + else + { + switch (fieldVariantType) + { + case typeof(String): + json.Add((String)fieldValue); + case typeof(int): + json.Add((int)fieldValue); + case typeof(int8): + json.Add((int8)fieldValue); + case typeof(int16): + json.Add((int16)fieldValue); + case typeof(int32): + json.Add((int32)fieldValue); + case typeof(int64): + json.Add((int64)fieldValue); + case typeof(uint): + json.Add((uint)fieldValue); + case typeof(uint8): + json.Add((uint8)fieldValue); + case typeof(uint16): + json.Add((uint16)fieldValue); + case typeof(uint32): + json.Add((uint32)fieldValue); + case typeof(char8): + json.Add((char8)fieldValue); + case typeof(char16): + json.Add((char16)fieldValue); + case typeof(char32): + json.Add((char32)fieldValue); + case typeof(uint64): + json.Add((uint64)fieldValue); + case typeof(float): + json.Add((float)fieldValue); + case typeof(double): + json.Add((double)fieldValue); + case typeof(bool): + json.Add((bool)fieldValue); + default: + let res = Serialize(fieldValue); + + if (res == .Err) + { + delete json; + return .Err; + } + + json.Add(res.Value); + delete res.Value; + } + } + return .Ok; + } + } +} diff --git a/Libs/JSON_Beef/lib/src/Types/JSONArray.bf b/Libs/JSON_Beef/lib/src/Types/JSONArray.bf new file mode 100644 index 0000000..8ab097f --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Types/JSONArray.bf @@ -0,0 +1,197 @@ +using System; +using System.Collections; +using System.Reflection; +using JSON_Beef.Util; + +namespace JSON_Beef.Types +{ + public class JSONArray + { + private List list; + + public int Count + { + get + { + return list.Count; + } + } + + public this() + { + list = new List(); + } + + public this(JSONArray array) + { + list = new List(); + + for (int i = 0; i < array.Count; i++) + { + let value = array.GetVariant(i); + + switch (value.VariantType) + { + case typeof(JSONObject): + Add(value.Get()); + case typeof(JSONArray): + Add(value.Get()); + case typeof(String): + Add(value.Get()); + default: + if (value.Get() == null) + { + list.Add(Variant.Create(default(Object))); + } + } + } + } + + public ~this() + { + for (var item in list) + { + item.Dispose(); + } + + list.Clear(); + delete list; + } + + public void Add(Object val) + { + if (val == null) + { + list.Add(Variant.Create(default(T))); + return; + } + + let type = typeof(T); + + if (type.IsPrimitive || (type == typeof(bool))) + { + let str = scope String(); + val.ToString(str); + str.ToLower(); + Add(str); + return; + } + + switch (type) + { + case typeof(JSONObject): + Add((JSONObject)val); + case typeof(JSONArray): + Add((JSONArray)val); + case typeof(String): + Add((String)val); + } + } + + private void Add(String val) + { + let v = new String(val); + list.Add(Variant.Create(v, true)); + } + + private void Add(JSONObject val) + { + let v = new JSONObject(val); + list.Add(Variant.Create(v, true)); + } + + private void Add(JSONArray val) + { + let v = new JSONArray(val); + list.Add(Variant.Create(v, true)); + } + + public Result Get(int idx) + { + if (idx > list.Count) + { + return .Err(.INDEX_OUT_OF_BOUNDS); + } + + let value = list[idx]; + + let type = typeof(T); + + if ((value.VariantType == typeof(String)) && type.IsPrimitive) + { + if (type == typeof(bool)) + { + bool res = JSONUtil.ParseBool(value.Get()); + T outVal = default; + Internal.MemCpy(&outVal, &res, sizeof(bool)); + return .Ok(outVal); + } + else + { + var res = JSONUtil.ParseNumber(value.Get()); + T outVal = default; + Internal.MemCpy(&outVal, &res, type.Size); + return .Ok(outVal); + } + } + + if ((type == typeof(JSONObject)) || (type == typeof(JSONArray)) || (type == typeof(String))) + { + if (value.VariantType == typeof(T)) + { + T ret = value.Get(); + return .Ok(ret); + } + } + + if (value.Get() == null) + { + return default(T); + } + + return .Err(.INVALID_RETURN_TYPE); + } + + public override void ToString(String str) + { + var tempStr = scope String(); + + str.Clear(); + str.Append("["); + + for (int i = 0; i < list.Count; i++) + { + let variant = list[i]; + + switch (variant.VariantType) + { + case typeof(String): + tempStr.AppendF("\"{}\"", variant.Get()); + case typeof(JSONObject): + variant.Get().ToString(tempStr); + case typeof(JSONArray): + variant.Get().ToString(tempStr); + default: + tempStr.Set(String.Empty); + } + //str.Append(tempStr); + + str.Append(tempStr); + + if (i != (list.Count - 1)) + { + str.Append(","); + } + + tempStr.Clear(); + } + + str.Append("]"); + } + + public Variant GetVariant(int idx) + { + return list[idx]; + } + } +} diff --git a/Libs/JSON_Beef/lib/src/Types/JSONDocument.bf b/Libs/JSON_Beef/lib/src/Types/JSONDocument.bf new file mode 100644 index 0000000..b000d7e --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Types/JSONDocument.bf @@ -0,0 +1,849 @@ +using System; +using System.Collections; +using JSON_Beef.Util; + +namespace JSON_Beef.Types +{ + enum JSON_DOCUMENT_TYPE + { + OBJECT, + ARRAY, + UNKNOWN + } + + enum JSON_TYPES + { + LITERAL, + OBJECT, + ARRAY, + STRING, + INTEGER, + FLOAT + } + + enum JSON_LITERAL + { + NULL, + TRUE, + FALSE + } + + enum JSON_OBJECT_SEARCH_STATE + { + SEARCH_KEY, + SEARCH_VALUE + } + + enum JSON_ERRORS + { + INVALID_NUMBER_REPRESENTATION, + INVALID_RETURN_TYPE, + INDEX_OUT_OF_BOUNDS, + KEY_NOT_FOUND, + STRING_NOT_TERMINATED, + INVALID_LITERAL_VALUE, + INVALID_OBJECT, + INVALID_ARRAY, + INVALID_JSON_STRING, + UNKNOWN_ERROR, + INVALID_TYPE, + CANNOT_CONVERT_SIGNED_TO_UNSIGNED + } + + public class JSONDocument + { + private Dictionary escapedChar; + private String data; + + public this() + { + escapedChar = new Dictionary(); + escapedChar.Add('\\', '\\'); + escapedChar.Add('"', '"'); + escapedChar.Add('b', '\b'); + escapedChar.Add('f', '\f'); + escapedChar.Add('n', '\n'); + escapedChar.Add('r', '\r'); + escapedChar.Add('t', '\t'); + escapedChar.Add('/', '/'); + } + + public ~this() + { + delete escapedChar; + } + + public bool IsValidJson(String json) + { + return JSONValidator.IsValidJson(json); + } + + public JSON_DOCUMENT_TYPE GetJsonType(String json) + { + let token = json[0]; + + if (token == '{') + { + return JSON_DOCUMENT_TYPE.OBJECT; + } + else if (token == '[') + { + return JSON_DOCUMENT_TYPE.ARRAY; + } + else + { + return JSON_DOCUMENT_TYPE.UNKNOWN; + } + } + + public Result ParseArray(String json) + { + var array = new JSONArray(); + if (ParseArrayInternal(json, ref array) case .Err(let err)) + { + delete array; + return .Err(err); + } + return array; + } + + public Result ParseArray(String json, ref JSONArray array) + { + if (ParseArrayInternal(json, ref array) case .Err(let err)) + { + return .Err(err); + } + + return .Ok; + } + + public Result ParseObject(String json) + { + var object = new JSONObject(); + if (ParseObjectInternal(json, ref object) case .Err(let err)) + { + delete object; + return .Err(err); + } + return object; + } + + public Result ParseObject(String json, ref JSONObject object) + { + if (ParseObjectInternal(json, ref object) case .Err(let err)) + { + return .Err(err); + } + + return .Ok; + } + + private Result ParseString(String json, String outString) + { + int i; + outString.Clear(); + var escaped = false; + + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if ((c == '\\') && !escaped) + { + escaped = true; + } + else if (escapedChar.ContainsKey(c) && escaped) + { + outString.Append(escapedChar[c]); + escaped = false; + } + else if ((c == '"') && !escaped) + { + break; + } + else + { + if (escaped) + { + outString.Append('\\'); + } + outString.Append(c); + escaped = false; + } + } + + if (json[i] != '"') + { + return .Err(.STRING_NOT_TERMINATED); + } + + return .Ok(i); + } + + /*private Result ParseNumber(String json, ref int outInt, ref float outFloat, ref JSON_TYPES typeParsed) + { + var strNum = scope String(); + + typeParsed = JSON_TYPES.INTEGER; + + int i = 0; + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if (c == '.') + { + typeParsed = JSON_TYPES.FLOAT; + strNum.Append(c); + } + else if (!c.IsDigit && (c != '-') && (c != 'e') && (c != 'E') && (c != '+')) + { + break; + } + else + { + strNum.Append(c); + } + } + + if (typeParsed == JSON_TYPES.INTEGER) + { + let res = JSONUtil.ParseInt(strNum); + + switch (res) + { + case .Err(.INVALID_NUMBER_REPRESENTATION): + return .Err(.INVALID_NUMBER_REPRESENTATION); + default: + outInt = res.Get(); + } + } + else if (typeParsed == JSON_TYPES.FLOAT) + { + let res = JSONUtil.ParseFloat(strNum); + + switch (res) + { + case .Err(.INVALID_NUMBER_REPRESENTATION): + return .Err(.INVALID_NUMBER_REPRESENTATION); + default: + outFloat = res.Get(); + } + } + + // I always want the last parsed char to be a number + return .Ok(i - 1); + }*/ + + private Result ParseNumber(String json, String outStr) + { + if (!JSONValidator.IsValidNumber(json)) + { + return .Err(.INVALID_NUMBER_REPRESENTATION); + } + + var strNum = scope String(); + outStr.Clear(); + + int i = 0; + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if (c == '.') + { + strNum.Append(c); + } + else if (!c.IsDigit && (c != '-') && (c != 'e') && (c != 'E') && (c != '+')) + { + break; + } + else + { + strNum.Append(c); + } + } + + outStr.Set(strNum); + + // I always want the last parsed char to be a number + return .Ok(i - 1); + } + + /*private Result ParseLiteral(String json, ref JSON_LITERAL outLiteral) + { + var str = scope String(); + + int i = 0; + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if (!c.IsLetter) + { + break; + } + else + { + str.Append(c); + } + } + + if (str.Equals("true")) + { + outLiteral = .TRUE; + } + else if (str.Equals("false")) + { + outLiteral = .FALSE; + } + else if (str.Equals("null")) + { + outLiteral = .NULL; + } + else + { + return .Err(.INVALID_LITERAL_VALUE); + } + + // I always want the last parsed char to be a letter + return .Ok(i - 1); + }*/ + + private Result ParseLiteral(String json, String outStr) + { + if (!JSONValidator.IsValidLiteral(json)) + { + return .Err(.INVALID_LITERAL_VALUE); + } + + var str = scope String(); + outStr.Clear(); + + int i = 0; + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if (!c.IsLetter) + { + break; + } + else + { + str.Append(c); + } + } + + outStr.Set(str); + + // I always want the last parsed char to be a letter + return .Ok(i - 1); + } + + private Result ParseArrayInternal(String json, ref JSONArray array) + { + int i = 0; + + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if ((c == '[') && (i != 0)) + { + let str = scope String(&json[i]); + var outArr = scope JSONArray(); + let res = ParseArrayInternal(str, ref outArr); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + array.Add(outArr); + } + else if (c == ']') + { + break; + } + else if (c == '"') + { + // We do not want the first char in the string to parse to be taken as a + // closing string token. + i++; + let str = scope String(&json[i]); + var outStr = scope String(); + let res = ParseString(str, outStr); + + switch (res) + { + case .Err(let err): + return .Err(err); + case .Ok(let val): + i += val; + } + + array.Add(outStr); + } + else if ((c == '-') || (c.IsNumber)) + { + let str = scope String(&json[i]); + var outStr = scope String(); + let res = ParseNumber(str, outStr); + + switch (res) + { + case .Err(let err): + return .Err(err); + case .Ok(let val): + i += val; + } + + array.Add(outStr); + } + else if (c.IsLetter) + { + let str = scope String(&json[i]); + var outStr = scope String(); + let res = ParseLiteral(str, outStr); + + switch (res) + { + case .Err(let err): + return .Err(err); + case .Ok(let val): + i += val; + } + + if (outStr.Equals("null")) + { + array.Add(null); + } + else + { + array.Add(outStr); + } + } + else if (c == '{') + { + let str = scope String(&json[i]); + var outObject = scope JSONObject(); + + let res = ParseObjectInternal(str, ref outObject); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + array.Add(outObject); + } + } + + return .Ok(i); + } + + /*private Result ParseArray(String json, ref JSONArray array) + { + int i = 0; + JSON_TYPES typeParsed = JSON_TYPES.LITERAL; + + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if ((c == '[') && (i != 0)) + { + let str = scope String(&json[i]); + var outArr = scope JSONArray(); + let res = ParseArray(str, ref outArr); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + array.Add(outArr); + } + else if (c == ']') + { + break; + } + else if (c == '"') + { + // We do not want the first char in the string to parse to be taken as a + // closing string token. + i++; + let str = scope String(&json[i]); + var outStr = scope String(); + let res = ParseString(str, outStr); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + array.Add(outStr); + } + else if ((c == '-') || (c.IsNumber)) + { + let str = scope String(&json[i]); + int outInt = 0; + float outFloat = 0.f; + let res = ParseNumber(str, ref outInt, ref outFloat, ref typeParsed); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + if (typeParsed == JSON_TYPES.INTEGER) + { + array.Add(outInt); + } + else if (typeParsed == JSON_TYPES.FLOAT) + { + array.Add(outFloat); + } + } + else if (c.IsLetter) + { + let str = scope String(&json[i]); + JSON_LITERAL outLiteral = .NULL; + let res = ParseLiteral(str, ref outLiteral); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + typeParsed = .LITERAL; + + array.Add(outLiteral); + } + else if (c == '{') + { + let str = scope String(&json[i]); + var outObject = scope JSONObject(); + + let res = ParseObject(str, ref outObject); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + array.Add(outObject); + } + } + + return .Ok(i); + }*/ + + /*private Result ParseObject(String json, ref JSONObject object) + { + int i = 0; + var lookForKey = true; + var typeParsed = JSON_TYPES.LITERAL; + var key = scope String(); + + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if ((c == '{') && (!lookForKey)) + { + i++; + let str = scope String(&json[i]); + var outObject = scope JSONObject(); + + let res = ParseObject(str, ref outObject); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + object.Add(key, outObject); + } + else if (c == '}') + { + break; + } + else if (c == '"') + { + // We do not want the first char in the string to parse to be taken as a + // closing string token. + i++; + let str = scope String(&json[i]); + + if (lookForKey) + { + key = scope:: String(); + let res = ParseString(str, key); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + lookForKey = false; + } + else + { + var outStr = scope String(); + let res = ParseString(str, outStr); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + object.Add(key, outStr); + } + } + else if (c.IsDigit || (c == '-') && (!lookForKey)) + { + let str = scope String(&json[i]); + var outInt = 0; + var outFloat = 0.f; + let res = ParseNumber(str, ref outInt, ref outFloat, ref typeParsed); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + if (typeParsed == JSON_TYPES.INTEGER) + { + object.Add(key, outInt); + } + else if (typeParsed == JSON_TYPES.FLOAT) + { + object.Add(key, outFloat); + } + } + else if (c.IsLetter && (!lookForKey)) + { + let str = scope String(&json[i]); + var outLiteral = JSON_LITERAL.NULL; + + let res = ParseLiteral(str, ref outLiteral); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + object.Add(key, outLiteral); + } + else if (c == '[' && (!lookForKey)) + { + i++; + let str = scope String(&json[i]); + var outArr = scope JSONArray(); + + let res = ParseArray(str, ref outArr); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + object.Add(key, outArr); + } + else if (c == ',') + { + lookForKey = true; + } + /*else if (c == ':') + { + lookForKey = false; + }*/ + } + + return .Ok(i); + }*/ + + private Result ParseObjectInternal(String json, ref JSONObject object) + { + int i = 0; + var lookForKey = true; + //var typeParsed = JSON_TYPES.LITERAL; + var key = scope String(); + + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if ((c == '{') && (!lookForKey)) + { + i++; + let str = scope String(&json[i]); + var outObject = scope JSONObject(); + + let res = ParseObjectInternal(str, ref outObject); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + object.Add(key, outObject); + } + else if (c == '}') + { + break; + } + else if (c == '"') + { + // We do not want the first char in the string to parse to be taken as a + // closing string token. + i++; + let str = scope String(&json[i]); + + if (lookForKey) + { + key = scope:: String(); + let res = ParseString(str, key); + + switch (res) + { + case .Err(let err): + return .Err(err); + case .Ok(let val): + i += val; + } + + lookForKey = false; + } + else + { + var outStr = scope String(); + let res = ParseString(str, outStr); + + switch (res) + { + case .Err(let err): + return .Err(err); + case .Ok(let val): + i += val; + } + + object.Add(key, outStr); + } + } + else if (c.IsDigit || (c == '-') && (!lookForKey)) + { + let str = scope String(&json[i]); + var outStr = scope String(); + let res = ParseNumber(str, outStr); + + switch (res) + { + case .Err(let err): + return .Err(err); + case .Ok(let val): + i += val; + } + + object.Add(key, outStr); + } + else if (c.IsLetter && (!lookForKey)) + { + let str = scope String(&json[i]); + var outStr = scope String(); + + let res = ParseLiteral(str, outStr); + + switch (res) + { + case .Err(let err): + return .Err(err); + case .Ok(let val): + i += val; + } + + if (outStr.Equals("null")) + { + object.Add(key, null); + } + else + { + object.Add(key, outStr); + } + } + else if (c == '[' && (!lookForKey)) + { + //i++; + let str = scope String(&json[i]); + var outArr = scope JSONArray(); + + let res = ParseArrayInternal(str, ref outArr); + + switch (res) + { + case .Err(let err): + return .Err(err); + default: + i += res.Get(); + } + + object.Add(key, outArr); + } + else if (c == ',') + { + lookForKey = true; + } + /*else if (c == ':') + { + lookForKey = false; + }*/ + } + + return .Ok(i); + } + } +} diff --git a/Libs/JSON_Beef/lib/src/Types/JSONObject.bf b/Libs/JSON_Beef/lib/src/Types/JSONObject.bf new file mode 100644 index 0000000..59ae40d --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Types/JSONObject.bf @@ -0,0 +1,265 @@ +using System; +using System.Collections; +using JSON_Beef.Util; + +namespace JSON_Beef.Types +{ + public class JSONObject + { + private Dictionary dictionary; + + public this() + { + dictionary = new Dictionary(); + } + + public this(JSONObject obj) + { + dictionary = new Dictionary(); + + var keys = obj.dictionary.Keys; + + while (keys.MoveNext()) + { + let key = keys.Current; + let value = obj.GetVariant(key); + + switch (value.VariantType) + { + case typeof(JSONObject): + Add(key, value.Get()); + case typeof(JSONArray): + Add(key, value.Get()); + case typeof(String): + Add(key, value.Get()); + default: + if (value.Get() == null) + { + let k = new String(key); + dictionary.Add(k, Variant.Create(default(Object))); + } + } + } + } + + public ~this() + { + for (var item in dictionary) + { + if (item.value.HasValue) + { + item.value.Dispose(); + } + delete item.key; + } + + dictionary.Clear(); + + delete dictionary; + } + + public Result Get(String key) + { + if (dictionary.ContainsKey(key)) + { + let value = dictionary[key]; + let type = typeof(T); + + if (type.IsPrimitive && (value.VariantType == typeof(String))) + { + if (type == typeof(bool)) + { + bool res = JSONUtil.ParseBool(value.Get()); + T outVal = default; + Internal.MemCpy(&outVal, &res, sizeof(bool)); + return .Ok(outVal); + } + else + { + var res = JSONUtil.ParseNumber(value.Get()); + T outVal = default; + Internal.MemCpy(&outVal, &res, type.Size); + return .Ok(outVal); + } + } + + if ((typeof(T) == typeof(JSONObject)) || (typeof(T) == typeof(JSONArray)) || (typeof(T) == typeof(String))) + { + if (value.VariantType == typeof(T)) + { + T ret = value.Get(); + return .Ok(ret); + } + + return .Err(.INVALID_RETURN_TYPE); + } + + if (value.Get() == null) + { + return default(T); + } + } + + return .Err(.KEY_NOT_FOUND); + } + + public Result Get(String key, Type type) + { + if (dictionary.ContainsKey(key)) + { + let value = dictionary[key]; + + if (value.VariantType == type) + { + let ret = value.Get(); + return .Ok(ret); + } + + return .Err(.INVALID_TYPE); + } + + return .Err(.KEY_NOT_FOUND); + } + + public Variant GetVariant(String key) + { + return dictionary[key]; + } + + public void Add(String key, Object val) + { + if (val == null) + { + let k = new String(key); + dictionary.Add(k, Variant.Create(default(T))); + return; + } + + let type = typeof(T); + + if (type.IsPrimitive || (type == typeof(bool))) + { + let str = scope String(); + val.ToString(str); + str.ToLower(); + Add(key, str); + return; + } + + switch (type) + { + case typeof(JSONObject): + Add(key, (JSONObject)val); + case typeof(JSONArray): + Add(key, (JSONArray)val); + case typeof(String): + Add(key, (String)val); + case typeof(bool): + let str = scope String(); + bool b = (bool)val; + b.ToString(str); + Add(key, str); + } + } + + public bool Contains(String key) + { + if (!dictionary.ContainsKey(key)) + { + return false; + } + + let variant = GetVariant(key); + let type = typeof(T); + + if ((variant.VariantType == typeof(String)) && type.IsPrimitive) + { + if ((type == typeof(bool)) && JSONUtil.ParseBool(variant.Get()) case .Ok(let val)) + { + return true; + } + if (JSONUtil.ParseNumber(variant.Get()) case .Ok(let val)) + { + return true; + } + } + + if ((type == typeof(JSONObject)) || (type == typeof(JSONArray)) || (type == typeof(String))) + { + if (variant.VariantType == type) + { + return true; + } + } + + if (variant.Get() == null) + { + return true; + } + + return false; + } + + private void Add(String key, String val) + { + let k = new String(key); + let v = new String(val); + dictionary.Add(k, Variant.Create(v, true)); + } + + private void Add(String key, JSONObject val) + { + let k = new String(key); + let v = new JSONObject(val); + dictionary.Add(k, Variant.Create(v, true)); + } + + private void Add(String key, JSONArray val) + { + let k = new String(key); + let v = new JSONArray(val); + dictionary.Add(k, Variant.Create(v, true)); + } + + public override void ToString(String str) + { + var keys = dictionary.Keys; + var tempStr = scope String(); + + str.Clear(); + str.Append("{"); + + var canParse = keys.MoveNext(); + while (canParse) + { + let currentKey = keys.Current; + + let variant = dictionary[currentKey]; + + switch (variant.VariantType) + { + case typeof(String): + tempStr.AppendF("\"{}\"", variant.Get()); + case typeof(JSONObject): + variant.Get().ToString(tempStr); + case typeof(JSONArray): + variant.Get().ToString(tempStr); + default: + tempStr.Set(String.Empty); + } + //str.Append(tempStr); + + str.AppendF("\"{}\":{}", currentKey, tempStr); + + if (canParse = keys.MoveNext()) + { + str.Append(","); + } + + tempStr.Clear(); + } + + str.Append("}"); + } + } +} diff --git a/Libs/JSON_Beef/lib/src/Util/AttributeChecker.bf b/Libs/JSON_Beef/lib/src/Util/AttributeChecker.bf new file mode 100644 index 0000000..99df9df --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Util/AttributeChecker.bf @@ -0,0 +1,15 @@ +using System.Reflection; +using JSON_Beef.Attributes; + +namespace JSON_Beef.Util +{ + public static class AttributeChecker + { + public static bool ShouldIgnore(FieldInfo field) + { + let shouldIgnore = field.GetCustomAttribute(); + + return ((shouldIgnore == .Ok) || field.HasFieldFlag(.PrivateScope) || field.HasFieldFlag(.Private)); + } + } +} diff --git a/Libs/JSON_Beef/lib/src/Util/JSONUtil.bf b/Libs/JSON_Beef/lib/src/Util/JSONUtil.bf new file mode 100644 index 0000000..7552af1 --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Util/JSONUtil.bf @@ -0,0 +1,266 @@ +using System; +using JSON_Beef.Types; + +namespace JSON_Beef.Util +{ + public class JSONUtil + { + public static Result ParseNumber(String json) + { + if (!JSONValidator.IsValidNumber(json)) + { + return .Err(.INVALID_JSON_STRING); + } + + let type = typeof(T); + + if (!type.IsPrimitive) + { + return .Err(.INVALID_RETURN_TYPE); + } + + if (type.IsFloatingPoint) + { + return ParseFloatInternal(json); + } + + return ParseIntInternal(json); + } + + public static Result ParseBool(String json) + { + if (!JSONValidator.IsValidLiteral(json)) + { + return .Err(.INVALID_JSON_STRING); + } + + if (json.Equals("true")) + { + return .Ok(true); + } + else if (json.Equals("false")) + { + return .Ok(false); + } + else + { + return .Err(.INVALID_LITERAL_VALUE); + } + } + + [Obsolete("ParseFloat is deprecated. Use ParseNumber instead.", false)] + public static Result ParseFloat(String json) + { + return ParseFloatInternal(json); + } + + [Obsolete("ParseFloat is deprecated. Use ParseNumber instead.", false)] + public static Result ParseInt(String json) + { + return ParseIntInternal(json); + } + + private static Result ParseIntInternal(StringView json) + { + let idx = json.IndexOf('e'); + var expStartIdx = idx + 1; + + if (json.Contains('.')) + { + return .Err(.INVALID_NUMBER_REPRESENTATION); + } + + if (idx == -1) + { + return CastToRightInt(json); + } + + if ((json[idx + 1] == '-')) + { + return .Err(.INVALID_NUMBER_REPRESENTATION); + } + else if (json[idx + 1] == '+') + { + expStartIdx++; + } + + let numStr = scope String(json, 0, idx); + let expStr = StringView(json, expStartIdx, json.Length - expStartIdx); + + var exp = Int.Parse(expStr).Get(); + + for (var i = 0; i < exp; i++) + { + numStr.Append('0'); + } + + return CastToRightInt(numStr); + } + + private static Result CastToRightInt(StringView str) + { + let type = typeof(T); + T outNum = default; + + switch (type) + { + // Didn't find another way to cast when using reflection. + // Also, int8 and int16 do not provide a Parse method. + case typeof(int), typeof(int8), typeof(int16): + var num = int.Parse(str); + Internal.MemCpy(&outNum, &num, type.Size); + case typeof(int32): + var num = int32.Parse(str); + Internal.MemCpy(&outNum, &num, type.Size); + case typeof(int64): + var num = int64.Parse(str); + Internal.MemCpy(&outNum, &num, type.Size); + + // uint8/16 and char types do not provide a Parse method. + case typeof(uint), typeof(uint8), typeof(uint16), typeof(char8), typeof(char16), typeof(char32): + var num = uint.Parse(str); + Internal.MemCpy(&outNum, &num, type.Size); + case typeof(uint32): + var num = uint32.Parse(str); + Internal.MemCpy(&outNum, &num, type.Size); + case typeof(uint64): + var num = uint64.Parse(str); + Internal.MemCpy(&outNum, &num, type.Size); + default: + return .Err(.INVALID_TYPE); + } + + return .Ok(outNum); + } + + private static Result ParseFloatInternal(StringView json) + { + var str = scope String(json); + let isNeg = (str[0] == '-'); + + if (isNeg) + { + str.Remove(0); + } + + let idx = str.IndexOf('e'); + var pointIdx = str.IndexOf('.'); + var hasPoint = true; + var expStartIdx = idx + 1; + + if (idx == -1) + { + if (isNeg) + { + str.Insert(0, '-'); + } + + return CastToRightFloatingPoint(str); + } + + if (str[idx + 1] == '+') + { + expStartIdx++; + } + + let numStr = scope String(str, 0, idx); + let expStr = StringView(str, expStartIdx, str.Length - expStartIdx); + var exp = Int.Parse(expStr).Get(); + + if (pointIdx == -1) + { + pointIdx = numStr.Length; + hasPoint = false; + } + var newPointIdx = pointIdx + exp; + + if (hasPoint) + { + numStr.Replace('.', 'a'); + } + + if (newPointIdx == 0) + { + numStr.Insert(0, "0."); + } + else if (newPointIdx < 0) + { + var newNumStr = scope String(); + + while (newPointIdx < 0) + { + newNumStr.Append('0'); + newPointIdx++; + } + newNumStr.Insert(0, "0."); + numStr.Insert(0, newNumStr); + } + else if (newPointIdx > numStr.Length) + { + var zeroStr = scope String(); + var numberOfZero = (newPointIdx - numStr.Length) + ((hasPoint) ? (1): (0)); + + while (numberOfZero > 0) + { + zeroStr.Append('0'); + numberOfZero--; + } + numStr.Append(zeroStr); + } + else if (pointIdx != 0) + { + numStr.Insert(newPointIdx, "."); + } + + if (hasPoint) + { + numStr.Remove(numStr.IndexOf('a')); + } + + if (isNeg) + { + numStr.Insert(0, '-'); + } + + return CastToRightFloatingPoint(numStr); + } + + private static Result CastToRightFloatingPoint(StringView str) + { + let type = typeof(T); + T outNum = default; + + if (type == typeof(float)) + { + var res = Float.Parse(str); + Internal.MemCpy(&outNum, &res, type.Size); + } + else if (type == typeof(double)) + { + var res = Double.Parse(str); + Internal.MemCpy(&outNum, &res, type.Size); + } + else + { + return .Err(.INVALID_TYPE); + } + + return .Ok(outNum); + } + + public static JSON_LITERAL BoolToLiteral(bool b) + { + return (b) ? (JSON_LITERAL.TRUE) : (JSON_LITERAL.FALSE); + } + + public static Result LiteralToBool(JSON_LITERAL l) + { + if (l == .NULL) + { + return .Err(.INVALID_LITERAL_VALUE); + } + + return (l == .TRUE) ? (true) : (false); + } + } +} diff --git a/Libs/JSON_Beef/lib/src/Util/JSONValidator.bf b/Libs/JSON_Beef/lib/src/Util/JSONValidator.bf new file mode 100644 index 0000000..9e44c94 --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Util/JSONValidator.bf @@ -0,0 +1,442 @@ +using System; +using System.Collections; + +namespace JSON_Beef.Util +{ + public class JSONValidator + { + public static bool IsValidJson(String json) + { + let c = json[0]; + let str = scope String(&json[0]); + + if (c == '[') + { + return IsValidArray(str); + } + else if (c == '{') + { + return IsValidObject(str); + } + + return false; + } + + public static bool IsValidString(String json) + { + var isValid = true; + + ValidateString(json, ref isValid); + + return isValid; + } + + public static bool IsValidNumber(String json) + { + var isValid = true; + + ValidateNumber(json, ref isValid); + + return isValid; + } + + public static bool IsValidLiteral(String json) + { + var isValid = true; + + ValidateLiteral(json, ref isValid); + + return isValid; + } + + public static bool IsValidObject(String json) + { + var isValid = true; + + ValidateObject(json, ref isValid); + + return isValid; + } + + public static bool IsValidArray(String json) + { + var isValid = true; + + ValidateArray(json, ref isValid); + + return isValid; + } + + private static int ValidateString(String json, ref bool isValid) + { + int i; + var foundEndString = false; + + List escapedChar = scope List(); + escapedChar.Add('\\'); + escapedChar.Add('\"'); + escapedChar.Add('\b'); + escapedChar.Add('\f'); + escapedChar.Add('\n'); + escapedChar.Add('\r'); + escapedChar.Add('\t'); + + if (json[0] != '"') + { + isValid = false; + return 0; + } + + for (i = 1; i < json.Length; i++) + { + let c = json[i]; + + if (!IsPrintable(c) && !escapedChar.Contains(c)) + { + isValid = false; + } + else if (c == '"') + { + foundEndString = true; + } + + if (!isValid || foundEndString) + { + break; + } + } + + isValid = foundEndString; + + return i; + } + + private static bool IsPrintable(char8 c) + { + return (c >= (char8)21) && (c <= (char8)126); + } + + private static int ValidateNumber(String json, ref bool isValid) + { + int i = 0; + var dotCount = 0; + var plusCount = 0; + var minusCount = 0; + var eCount = 0; + var gotDigit = false; + + if (!json[i].IsNumber && (json[i] != '-')) + { + isValid = false; + return 0; + } + else if (json[i].IsNumber) + { + gotDigit = true; + } + + for (i = 1; i < json.Length; i++) + { + let c = json[i]; + let prevC = json[i - 1]; + + if (!c.IsNumber) + { + if ((c == ',') || (c.IsWhiteSpace) || (c == ']') || (c == '}')) + { + break; + } + else if (!IsValidSymbol(c, prevC)) + { + isValid = false; + } + + if (((c == '.') && (dotCount >= 1)) || + ((c == '-') && (minusCount >= 1)) || + ((c == '+') && (plusCount >= 1)) || + ((c == 'e') && (eCount >= 1)) || + ((c == 'E') && (eCount >= 1))) + { + isValid = false; + } + + dotCount = (c == '.') ? (dotCount + 1) : (dotCount); + minusCount = (c == '-') ? (minusCount + 1) : (minusCount); + plusCount = (c == '+') ? (plusCount + 1) : (plusCount); + eCount = ((c == 'e') || (c == 'E')) ? (eCount + 1) : (eCount); + } + else + { + gotDigit = true; + } + + if (!isValid) + { + break; + } + } + + if (!gotDigit) + { + isValid = false; + } + + return i - 1; + } + + private static bool IsValidSymbol(char8 c, char8 prevC) + { + var isValid = true; + var symbols = scope List(); + symbols.Add('e'); + symbols.Add('E'); + symbols.Add('.'); + symbols.Add('+'); + symbols.Add('-'); + + if (!symbols.Contains(c)) + { + isValid = false; + } + else + { + if (((c == 'e') || (c == 'E') || (c == '.')) && (!prevC.IsNumber)) + { + isValid = false; + } + else if (((c == '+') || (c == '-')) && ((prevC != 'e') && (prevC != 'E'))) + { + isValid = false; + } + } + + return isValid; + } + + private static int ValidateLiteral(String json, ref bool isValid) + { + int i = 0; + var str = scope String(); + + isValid = false; + + for (i = 0; i < json.Length; i++) + { + let c = json[i]; + + if (!c.IsLetter) + { + break; + } + + str.Append(c); + } + + if (str.Equals("true") || (str.Equals("false") || str.Equals("null"))) + { + isValid = true; + } + + return i - 1; + } + + private static int ValidateObject(String json, ref bool isValid) + { + int i; + var lookForKey = true; + var lookForValueSeparator = false; + var lookForKeySeparator = false; + var lookForValue = false; + var keyCount = 0; + var valueCount = 0; + + if (json[0] != '{') + { + isValid = false; + return 0; + } + + for (i = 1; i < json.Length; i++) + { + let c = json[i]; + + if (!c.IsWhiteSpace) + { + if (c == '}') + { + break; + } + + if ((c != '"') && lookForKey) + { + isValid = false; + } + + if ((c != ':') && lookForKeySeparator) + { + isValid = false; + } + else if ((c == ':') && lookForKeySeparator) + { + lookForKeySeparator = false; + lookForValue = true; + } + + if ((c != ',') && (c != '}') && lookForValueSeparator) + { + isValid = false; + } + else if ((c == ',') && lookForValueSeparator) + { + lookForValueSeparator = false; + lookForKey = true; + } + + if (c == '"') + { + let str = scope String(&json[i]); + i += ValidateString(str, ref isValid); + + if (lookForKey) + { + lookForKey = false; + lookForKeySeparator = true; + keyCount++; + } + else + { + lookForValueSeparator = true; + lookForValue = false; + valueCount++; + } + } + else if (c.IsLetter && lookForValue) + { + let str = scope String(&json[i]); + i += ValidateLiteral(str, ref isValid); + lookForValueSeparator = true; + lookForValue = false; + valueCount++; + } + else if ((c.IsNumber || (c == '-')) && lookForValue) + { + let str = scope String(&json[i]); + i += ValidateNumber(str, ref isValid); + lookForValueSeparator = true; + lookForValue = false; + valueCount++; + } + else if ((c == '[') && lookForValue) + { + let str = scope String(&json[i]); + i += ValidateArray(str, ref isValid); + lookForValueSeparator = true; + lookForValue = false; + valueCount++; + } + else if ((c == '{') && lookForValue) + { + let str = scope String(&json[i]); + i += ValidateObject(str, ref isValid); + lookForValueSeparator = true; + lookForValue = false; + valueCount++; + } + } + + if (!isValid) + { + break; + } + } + + isValid = (isValid) ? (keyCount == valueCount) : (false); + + return i; + } + + private static int ValidateArray(String json, ref bool isValid) + { + int i; + var foundEndArray = false; + var lookForValueSeparator = false; + var lastChar = ' '; + + if (json[0] != '[') + { + isValid = false; + return 0; + } + + for (i = 1; i < json.Length; i++) + { + let c = json[i]; + + if (c == '[') + { + let str = scope String(&json[i]); + i += ValidateArray(str, ref isValid); + lookForValueSeparator = true; + lastChar = ' '; + } + else if ((c == ']') && (lastChar != ',')) + { + foundEndArray = true; + } + else if ((c == ']') && (lastChar == ',')) + { + isValid = false; + } + else if (c == '{') + { + let str = scope String(&json[i]); + i += ValidateObject(str, ref isValid); + lookForValueSeparator = true; + lastChar = ' '; + } + else if (c.IsNumber || (c == '-')) + { + let str = scope String(&json[i]); + i += ValidateNumber(str, ref isValid); + lookForValueSeparator = true; + lastChar = ' '; + } + else if (c.IsLetter) + { + let str = scope String(&json[i]); + i += ValidateLiteral(str, ref isValid); + lookForValueSeparator = true; + lastChar = ' '; + } + else if (c == '"') + { + let str = scope String(&json[i]); + i += ValidateString(str, ref isValid); + lookForValueSeparator = true; + lastChar = ' '; + } + else if ((c != ',') && (!c.IsWhiteSpace) && lookForValueSeparator && !foundEndArray) + { + isValid = false; + } + else if ((c == ',') && lookForValueSeparator) + { + lookForValueSeparator = false; + lastChar = ','; + } + else if ((c == ',') && !lookForValueSeparator) + { + isValid = false; + } + + if (!isValid || foundEndArray) + { + return i; + } + } + + isValid = foundEndArray; + return i; + } + } +} diff --git a/Libs/JSON_Beef/lib/src/Util/TypeChecker.bf b/Libs/JSON_Beef/lib/src/Util/TypeChecker.bf new file mode 100644 index 0000000..505093d --- /dev/null +++ b/Libs/JSON_Beef/lib/src/Util/TypeChecker.bf @@ -0,0 +1,36 @@ +using System; +using System.Reflection; + +namespace JSON_Beef.Util +{ + public static class TypeChecker + { + public static bool IsTypeList(Type type) + { + let typeName = scope String(); + type.GetName(typeName); + + return typeName.Equals("List"); + } + + public static bool IsTypeList(Object object) + { + return IsTypeList(object.GetType()); + } + + public static bool IsUserObject(Type type) + { + if (type.IsObject && (typeof(String) != type)) + { + return true; + } + + return false; + } + + public static bool IsPrimitive(Type type) + { + return type.IsPrimitive || (typeof(String) == type); + } + } +} From ea0ed2f8f0bcbd814d20b70a2b7ec0e584bb6e4d Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 22 Aug 2020 17:02:17 +0200 Subject: [PATCH 10/50] Inspector almost done --- Editor/src/Editor.bf | 26 +- Editor/src/EditorGUI.bf | 319 ++++++++++---- Editor/src/EditorLayer.bf | 16 +- Editor/src/EditorWindow.bf | 8 +- Editor/src/Util.bf | 70 ++++ Editor/src/Windows/ConsoleWindow.bf | 122 +++--- Editor/src/Windows/InspectorWindow.bf | 183 ++++++++ Editor/src/Windows/TestWindow.bf | 6 +- Engine/src/Application.bf | 9 +- Engine/src/Color.bf | 44 ++ Engine/src/Console/CVar.bf | 142 ++++--- Engine/src/Console/CVarFlags.bf | 14 +- Engine/src/Console/CVarUtil.bf | 62 ++- Engine/src/Console/CommandHistory.bf | 64 --- Engine/src/Console/CommandsHistory.bf | 75 ++++ Engine/src/Console/ConsoleLineParser.bf | 28 +- Engine/src/Console/EnumUtils.bf | 3 - Engine/src/Console/ExampleUsage.bf | 62 --- Engine/src/Console/GameConsole.bf | 391 ++++++++++++++---- Engine/src/ECS/Components/BaseComponent.bf | 1 + .../src/ECS/Components/TransformComponent.bf | 6 +- Engine/src/ECS/Entity.bf | 12 +- Engine/src/ECS/Systems/BehaviorSystem.bf | 2 - Engine/src/ECS/Systems/Physics3dSystem.bf | 2 - Engine/src/ECS/Systems/Render3dSystem.bf | 2 - Engine/src/ECS/Systems/RenderTextSystem.bf | 2 - Engine/src/ECS/Systems/SoundSystem.bf | 2 - Engine/src/Window/Window.bf | 4 +- 28 files changed, 1218 insertions(+), 459 deletions(-) create mode 100644 Editor/src/Util.bf create mode 100644 Editor/src/Windows/InspectorWindow.bf create mode 100644 Engine/src/Color.bf delete mode 100644 Engine/src/Console/CommandHistory.bf create mode 100644 Engine/src/Console/CommandsHistory.bf delete mode 100644 Engine/src/Console/ExampleUsage.bf diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index b9a1516..7b10b41 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -3,6 +3,7 @@ using System.Collections; using System.IO; using SteelEngine; using SteelEngine.Window; +using SteelEngine.ECS; using SteelEditor.Windows; using JetFistGames.Toml; using imgui_beef; @@ -12,9 +13,10 @@ namespace SteelEditor public class Editor : Application { private EditorLayer _editorLayer; - private EditorConfig _config = new .(); + private Dictionary _entityNames = new .(); + public override void OnInit() { _editorLayer = new .(Window); @@ -23,6 +25,8 @@ namespace SteelEditor AddWindow(); AddWindow(); AddWindow(); + AddWindow(); + if (LoadConfig() case .Ok) { @@ -33,7 +37,7 @@ namespace SteelEditor ShowWindow(window); } - ShowWindow(); + ShowWindow(); } public override void OnCleanup() @@ -41,6 +45,24 @@ namespace SteelEditor SaveConfig(); delete _config; + + for (var value in _entityNames.Values) + delete value; + delete _entityNames; + } + + public static void GetEntityName(EntityId id, String buffer) + { + var editor = GetInstance(); + if (!editor._entityNames.ContainsKey(id)) + SetEntityName(id, "Entity"); + + buffer.Append(editor._entityNames[id]); + } + + public static void SetEntityName(EntityId id, StringView name) + { + GetInstance()._entityNames[id] = new .(name); } public static void ShowWindow() where T : EditorWindow diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 3d9cccc..ac6cff7 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -9,11 +9,12 @@ namespace SteelEditor { public static class EditorGUI { - public delegate void HistoryCallback(VerticalDirection direction); - - private static HistoryCallback _historyCallback = null; + private static InputCallback _inputCallback = .(.None); private static Dictionary _inputTextBuffers = new .() ~ DeleteDictionaryAndKeysAndItems!(_); - private static uint _popItemWidthCount = 0; + private static bool _popItemWidth = false; + private static bool _popItemColor = false; + private static bool _popItemID = false; + private static uint _treeCount = 0; // Text @@ -23,21 +24,34 @@ namespace SteelEditor CheckItem(); } - public static void Label(StringView label) + public static bool Label(StringView label) { if (label.StartsWith("##")) - return; + return false; + ImGui.Columns(2); ImGui.AlignTextToFramePadding(); Text(label); CheckItem(); - ImGui.SameLine(); + ImGui.NextColumn(); + ImGui.SameLine(30); + FillWidth(); + + return true; } public static void LabelText(StringView label, StringView fmt, params Object[] args) { - ImGui.LabelText(scope String()..AppendF(fmt, params args), label.Ptr); - CheckItem(); + Label(label); + Text(scope String()..AppendF(fmt, params args)); + CheckItem(false); + } + + public static void Tooltip(StringView fmt, params Object[] args) + { + ImGui.BeginTooltip(); + Text(fmt, params args); + ImGui.EndTooltip(); } // Input @@ -49,6 +63,30 @@ namespace SteelEditor return isClicked; } + public static void Button(StringView name, ref bool value) + { + value = Button(name); + } + + public static void ToggleButton(StringView name, ref bool value) + { + if (!value) + { + var color = ImGui.GetStyleColorVec4(.Button); + color.w = 0.2f; + ImGui.PushStyleColor(.Button, color); + } + + var isClicked = ImGui.Button(name.Ptr); + + if (!value) + ImGui.PopStyleColor(); + + CheckItem(); + if (isClicked) + value = !value; + } + public static bool Checkbox(StringView label, bool value) { bool isChecked = value; @@ -64,11 +102,15 @@ namespace SteelEditor CheckItem(); } - public static bool Input(StringView label, String buffer, StringView hint = "", uint maxSize = 256, HistoryCallback historyCallback = null) + public static InputCallback Input(StringView label, String buffer, StringView hint = "", uint maxSize = 256) { - Label(label); + bool hasLabel = Label(label); + if (!hasLabel) + ImGui.Columns(1); + + if (_inputCallback.[Friend]_type != .None) + _inputCallback = .(.None); - _historyCallback = historyCallback; var labelStr = scope String(label); if (!_inputTextBuffers.ContainsKey(labelStr)) @@ -77,112 +119,96 @@ namespace SteelEditor var inputTextBuffer = _inputTextBuffers[labelStr]; inputTextBuffer.ReAlloc(maxSize); - bool enterPressed = false; + bool isEnter = false; - ImGui.InputTextFlags flags = .EnterReturnsTrue | .CallbackHistory; + ImGui.InputTextFlags flags = .EnterReturnsTrue | .CallbackHistory | .CallbackCompletion; if (hint != "") - enterPressed = ImGui.InputTextWithHint(scope UniqueLabel(label, "Input"), hint.Ptr, inputTextBuffer.Ptr, maxSize, flags, => InputTextCallback); + isEnter = ImGui.InputTextWithHint(scope UniqueLabel(label, "Input"), hint.Ptr, inputTextBuffer.Ptr, maxSize, flags, => InputTextCallback); else - enterPressed = ImGui.InputText(scope UniqueLabel(label, "Input"), inputTextBuffer.Ptr, maxSize, flags, => InputTextCallback); - - CheckItem(); - buffer.Set(inputTextBuffer.View()); - _historyCallback = null; - - return enterPressed; - } + isEnter = ImGui.InputText(scope UniqueLabel(label, "Input"), inputTextBuffer.Ptr, maxSize, flags, => InputTextCallback); - private static int InputTextCallback(ImGui.InputTextCallbackData* data) - { - if (data.EventFlag == .CallbackHistory) + + if (!hasLabel) { - if (_historyCallback == null) - return 0; - - VerticalDirection dir = .Up; - if (data.EventKey == ImGui.Key.DownArrow) - dir = .Down; - _historyCallback(dir); + CheckItem(false); + } + else + { + CheckItem(); } - return 0; - } + var view = inputTextBuffer.View(); + buffer.Set(view); - public static int InputInt(StringView label, int value) - { - var input = value; - InputInt(label, ref input); - return input; + if (view != buffer) + _inputCallback = .(.OnChange); + + if (isEnter) + _inputCallback = .(.OnEnter); + + return _inputCallback; } - public static void InputInt(StringView label, ref int value) + private static int InputTextCallback(ImGui.InputTextCallbackData* data) { - Label(label); - ImGui.InputInt(scope UniqueLabel(label, "InputInt"), &value); - CheckItem(); + _inputCallback = .(data); + return 0; } - public static float InputFloat(StringView label, float value) + public static int Int(StringView label, int value) { var input = value; - InputFloat(label, ref input); + Int(label, ref input); return input; } - public static void InputFloat(StringView label, ref float value) + public static void Int(StringView label, ref int value) { Label(label); - ImGui.InputFloat(scope UniqueLabel(label, "InputFloat"), &value); + ImGui.DragInt(scope UniqueLabel(label, "InputInt"), &value); CheckItem(); } - public static double InputDouble(StringView label, double value) + public static float Float(StringView label, float value) { var input = value; - InputDouble(label, ref input); + Float(label, ref input); return input; } - public static void InputDouble(StringView label, ref double value) + public static void Float(StringView label, ref float value) { Label(label); - ImGui.InputDouble(scope UniqueLabel(label, "InputDouble"), &value); + ImGui.DragFloat(scope UniqueLabel(label, "InputFloat"), &value); CheckItem(); } - public static Vector2 InputVector2(StringView label, Vector2 value) + public static Vector2 Vector2(StringView label, Vector2 value) { var input = value; - InputVector2(label, ref input); + Vector2(label, ref input); return input; } - public static void InputVector2(StringView label, ref Vector2 value) + public static void Vector2(StringView label, ref Vector2 value) { Label(label); - ImGui.InputFloat2(scope UniqueLabel(label, "InputVector2"), value.data); + ImGui.DragFloat2(scope UniqueLabel(label, "Vector2"), value.data); CheckItem(); } - public static Vector3 InputVector3(StringView label, Vector3 value) + public static Vector3 Vector3(StringView label, Vector3 value) { var input = value; - InputVector3(label, ref input); + Vector3(label, ref input); return input; } - public static void InputVector3(StringView label, ref Vector3 value) - { - Label(label); - ImGui.InputFloat3(scope UniqueLabel(label, "InputVector3"), value.data); - CheckItem(); - } - - public static void SliderFloat(StringView label, ref float value, float minValue, float maxValue) + public static void Vector3(StringView label, ref Vector3 value) { Label(label); - ImGui.SliderFloat(scope UniqueLabel(label, "SliderFloat"), &value, minValue, maxValue); + ImGui.DragFloat3(scope UniqueLabel(label, "Vector3"), value.data); CheckItem(); } @@ -216,35 +242,107 @@ namespace SteelEditor ImGui.Separator(); } - public static void SameLine() + public static void SameLine(float offset = 0) + { + if (offset != 0) + ImGui.SameLine(offset); + else + ImGui.SameLine(); + } + + public static void AlignFromRight(float offset) + { + ImGui.SameLine(ImGui.GetWindowWidth() - offset); + } + + public static void ItemWidth(float width) + { + ImGui.PushItemWidth(width); + _popItemWidth = true; + } + + public static void FillWidth() => ItemWidth(-1); + + public static bool BeginTree(StringView label) + { + ImGui.Columns(1); + var isOpen = ImGui.CollapsingHeader(label.Ptr); + if (isOpen) + { + ImGui.Indent(); + _treeCount++; + } + else + { + CheckItem(false); + } + return isOpen; + } + + public static void EndTree() + { + if (_treeCount > 0) + { + CheckItem(false); + ImGui.Unindent(); + ImGui.Columns(2); + _treeCount--; + } + } + + public static void BeginScrollingRegion(StringView label, float height = 0) + { + ImGui.BeginChild(label.Ptr, .(0, height), false, .HorizontalScrollbar); + } + + public static void EndScrollingRegion() { - ImGui.SameLine(); + ImGui.EndChild(); } - public static void ItemWidth(float percent) + public static float GetHeightOfItems(uint numberOfItems) + { + return ImGui.GetStyle().ItemSpacing.y + ImGui.GetFrameHeightWithSpacing() * numberOfItems; + } + + // Style + + public static void TextColor(Color color) { - //let windowWidth = ImGui.GetWindowContentRegionWidth(); - //ImGui.PushItemWidth(windowWidth / 100 * percent); - ImGui.PushItemWidth(-50); - _popItemWidthCount++; + ImGui.PushStyleColor(.Text, color); + _popItemColor = true; } // Other - public static void Tooltip(StringView fmt, params Object[] args) + public static void ItemID(StringView id) { - ImGui.BeginTooltip(); - Text(fmt, params args); - ImGui.EndTooltip(); + ImGui.PushID(id.Ptr); + _popItemID = true; } - private static void CheckItem() + private static void CheckItem(bool nextColumn = true) { - if (_popItemWidthCount > 0) + if (_popItemWidth) { ImGui.PopItemWidth(); - _popItemWidthCount--; + _popItemWidth = false; + } + + if (_popItemColor) + { + ImGui.PopStyleColor(); + _popItemColor = false; + } + + if (_popItemID) + { + ImGui.PopID(); + _popItemID = false; } + + if (nextColumn) + ImGui.NextColumn(); } private class UniqueLabel @@ -289,6 +387,11 @@ namespace SteelEditor delete _buffer; } + public void Set(StringView str) + { + str.CopyTo(_buffer); + } + public void ReAlloc(uint size) { if (size == _size) @@ -318,5 +421,59 @@ namespace SteelEditor public char8* Ptr => &_buffer[0]; } + + public enum InputCallbackType + { + None, + OnHistory, + OnEnter, + OnCompletion, + OnChange + } + + public struct InputCallback + { + private InputCallbackType _type; + private VerticalDirection _historyDirection = .Up; + + public this(InputCallbackType type) + { + _type = type; + } + + public this(ImGui.InputTextCallbackData* data) + { + if (data.EventFlag == .CallbackHistory) + { + _type = .OnHistory; + if (data.EventKey == ImGui.Key.DownArrow) + _historyDirection = .Down; + } + else if (data.EventFlag == .EnterReturnsTrue) + { + _type = .OnEnter; + } + else if (data.EventFlag == .CallbackCompletion) + { + _type = .OnCompletion; + } + else + { + _type = .OnChange; + } + } + + public bool OnHistory(out VerticalDirection direction) + { + direction = _historyDirection; + if (_type == .OnHistory) + return true; + return false; + } + + public bool OnEnter => _type == .OnEnter; + public bool OnCompletion => _type == .OnCompletion; + public bool OnChange => _type == .OnChange; + } } } diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 1a5d982..08f3e3c 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -30,9 +30,10 @@ namespace SteelEditor var io = ref ImGui.GetIO(); io.IniFilename = _iniPath; - + var style = ref ImGui.GetStyle(); style.WindowMenuButtonPosition = .None; // This disables the collapse button on windows + style.WindowRounding = 0f; ImGui.StyleColorsClassic(&style); ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, true); @@ -151,10 +152,15 @@ namespace SteelEditor { if (!window.IsActive) { - Log.Trace("Showing window ({})", window.Title); - window.IsActive = true; - window.OnInit(); + + if (!window.[Friend]_isInitialized) + { + window.OnInit(); + window.[Friend]_isInitialized = true; + } + + window.OnShow(); window.IsClosed = false; } } @@ -174,8 +180,6 @@ namespace SteelEditor public void CloseWindow(EditorWindow window) { - Log.Trace("Closing window ({})", window.Title); - window.IsActive = false; window.OnClose(); window.IsClosed = true; diff --git a/Editor/src/EditorWindow.bf b/Editor/src/EditorWindow.bf index 3809e9a..446ac4a 100644 --- a/Editor/src/EditorWindow.bf +++ b/Editor/src/EditorWindow.bf @@ -1,10 +1,9 @@ using System; -using imgui_beef; using SteelEngine; +using imgui_beef; namespace SteelEditor { - public abstract class EditorWindow { // Pointer to fixed memory i.e. public override StringView Title => "MyEditorWindow"; @@ -13,12 +12,14 @@ namespace SteelEditor public bool IsActive = false; public bool IsClosed = true; + private bool _isInitialized = false; + public void Update() { if (!IsActive) return; - if (ImGui.Begin(Title.Ptr, &IsActive)) + if (ImGui.Begin(Title.Ptr, &IsActive, .None)) { OnRender(); ImGui.End(); @@ -26,6 +27,7 @@ namespace SteelEditor } public virtual void OnInit() {} + public virtual void OnShow() {} public virtual void OnRender() {} public virtual void OnClose() {} } diff --git a/Editor/src/Util.bf b/Editor/src/Util.bf new file mode 100644 index 0000000..2884674 --- /dev/null +++ b/Editor/src/Util.bf @@ -0,0 +1,70 @@ +using System.Collections; +using imgui_beef; + +namespace System +{ + extension Type + { + public void GetShortName(String buffer) + { + var fullName = scope String(); + GetFullName(fullName); + var parts = scope List(fullName.Split('.')); + buffer.Append(parts.Back); + } + } +} + +namespace System.Reflection +{ + extension FieldInfo + { + public void GetName(String buffer) + { + buffer.Append(GetName()); + } + + public StringView GetName() + { + if (Name.StartsWith("prop__")) + return .(Name, 6); + else + return Name; + } + } +} + +namespace SteelEngine +{ + extension Color + { + public static implicit operator Self(ImGui.Vec4 vec) + { + return .(vec.x, vec.y, vec.z, vec.w); + } + + public static implicit operator ImGui.Vec4(Self self) + { + return .(self.r, self.g, self.b, self.a); + } + } +} + +namespace SteelEngine.Math +{ + extension Vector4 + { + public static implicit operator ImGui.Vec4(Self self) where float : operator explicit T + { + return .((float) self.x, (float) self.y, (float) self.z, (float) self.w); + } + } + + extension Vector2 + { + public static implicit operator ImGui.Vec2(Self self) where float : operator explicit T + { + return .((float) self.x, (float) self.y); + } + } +} diff --git a/Editor/src/Windows/ConsoleWindow.bf b/Editor/src/Windows/ConsoleWindow.bf index 1ebd7a8..c26e7a0 100644 --- a/Editor/src/Windows/ConsoleWindow.bf +++ b/Editor/src/Windows/ConsoleWindow.bf @@ -13,109 +13,107 @@ namespace SteelEditor.Windows { public override StringView Title => "Console"; - public ImGui.Vec4 TraceColor = .(0.603f, 0.603f, 0.035f, 1f); - public ImGui.Vec4 WarningColor = .(0.93f, 0.82f, 0.01f, 1f); - public ImGui.Vec4 ErrorColor = .(0.952f, 0.2f, 0.011f, 1f); + public Color TraceColor = .(0.603f, 0.603f, 0.035f, 1f); + public Color WarningColor = .(0.93f, 0.82f, 0.01f, 1f); + public Color ErrorColor = .(0.952f, 0.2f, 0.011f, 1f); private String _commandBuffer = new .() ~ delete _; private List<(String str, LogLevel level)> _log = new .() ~ { ClearLog(); delete _log; }; private bool _scrollToBottom = false; - private LogLevel _minLogLevel = .Trace; - private ConsoleType _consoleType = .Log; private GameConsole _gameConsole = new .() ~ delete _; private int _commandStartIndex = 0; private int _commandIndex = 0; private int _newCommandIndex = 1; - private EditorGUI.HistoryCallback _historyCallback = new => OnCommandHistoryChange ~ delete _; + private bool _showErrors = true; + private bool _showWarnings = true; + private bool _showInfo = true; + private bool _showTrace = true; - private const float consoleComboWidth = 86; - private const float clearButtonOffset = 55; - private const float levelComboWidth = 100; + private const float CLEAR_BUTTON_OFFSET = 55; public override void OnInit() { Log.AddCallback(new (str, level) => _log.Add((new String(str), level))); + + _gameConsole.Initialize(); } public override void OnRender() { - ImGui.PushItemWidth(consoleComboWidth); - EditorGUI.Combo("Console:", ref _consoleType); - ImGui.PopItemWidth(); + EditorGUI.ToggleButton("Errors", ref _showErrors); - ImGui.SameLine(ImGui.GetWindowWidth() - clearButtonOffset); + EditorGUI.AlignFromRight(CLEAR_BUTTON_OFFSET); if (EditorGUI.Button("Clear")) - Clear(); + _gameConsole.Clear(); - ImGui.PushItemWidth(levelComboWidth); - EditorGUI.Combo("Level:", ref _minLogLevel); - ImGui.PopItemWidth(); + EditorGUI.ToggleButton("Warnings", ref _showWarnings); + EditorGUI.ToggleButton("Info", ref _showInfo); + EditorGUI.ToggleButton("Trace", ref _showTrace); - var footerSpacing = ImGui.GetStyle().ItemSpacing.y + ImGui.GetFrameHeightWithSpacing(); - ImGui.BeginChild("CommandScrollingRegion", .(0, -footerSpacing), false, .HorizontalScrollbar); + var footerSpacing = EditorGUI.GetHeightOfItems(1); + EditorGUI.BeginScrollingRegion("CommandScrollingRegion", -footerSpacing); - if (_consoleType == .Game) - { - for (int i = _commandStartIndex; i < _gameConsole.History.Count; i++) - ImGui.Text(scope String()..AppendF("> {}\n", StringView(_gameConsole.History.AtIndex(i)))); - } - else + for (var line in _gameConsole.[Friend]_lines) { - for (var message in _log) + if (!_showErrors && line.level == .Error || + !_showWarnings && line.level == .Warning || + !_showInfo && line.level == .Info || + !_showTrace && line.level == .Trace) + continue; + + bool hasColor = true; + Color color = .(); + + switch (line.level) { - if (message.level < _minLogLevel) - continue; - - bool hasColor = true; - ImGui.Vec4 color = .(); - - switch (message.level) - { - case .Trace: - color = TraceColor; - break; - case .Warning: - color = WarningColor; - break; - case .Error: - color = ErrorColor; - break; - default: - hasColor = false; - } - - ImGui.PushStyleColor(.Text, color); - ImGui.TextUnformatted(message.str.Ptr); - ImGui.PopStyleColor(); + case .Trace: + color = TraceColor; + break; + case .Warning: + color = WarningColor; + break; + case .Error: + color = ErrorColor; + break; + default: + hasColor = false; } + + if (hasColor) + EditorGUI.TextColor(color); + + EditorGUI.Text(line.message); } if (_scrollToBottom) ImGui.SetScrollHereY(1.0f); _scrollToBottom = false; - ImGui.EndChild(); + EditorGUI.EndScrollingRegion(); EditorGUI.Line(); - ImGui.PushItemWidth(-10); - if (EditorGUI.Input(scope String()..AppendF("##CommandInputBuffer_{}", _commandIndex), _commandBuffer, "", 256, _historyCallback) && !_commandBuffer.IsEmpty) + EditorGUI.FillWidth(); + var inputCallback = EditorGUI.Input(scope String()..AppendF("##CommandInputBuffer_{}", _commandIndex), _commandBuffer, "", 256); + if (inputCallback.OnEnter && !_commandBuffer.IsEmpty) { - _consoleType = .Game; - _gameConsole.History.Add(_commandBuffer); + _gameConsole.AddHistory(_commandBuffer); ImGui.SetKeyboardFocusHere(-1); _scrollToBottom = true; - _gameConsole.Execute(_commandBuffer); + _gameConsole.Enqueue(_commandBuffer); ClearCommandBuffer(); } - ImGui.PopItemWidth(); + else if (inputCallback.OnHistory(let direction)) + { + OnCommandHistory(direction); + } } - private void OnCommandHistoryChange(VerticalDirection dir) + private void OnCommandHistory(VerticalDirection dir) { if (dir == .Up && _commandIndex > _commandStartIndex) _commandIndex--; @@ -125,14 +123,6 @@ namespace SteelEditor.Windows ImGui.SetKeyboardFocusHere(-1); } - public void Clear() - { - if (_consoleType == .Log) - ClearLog(); - else - ClearCommands(); - } - public void ClearLog() { for (var log in _log) diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf new file mode 100644 index 0000000..f84a11d --- /dev/null +++ b/Editor/src/Windows/InspectorWindow.bf @@ -0,0 +1,183 @@ +using System; +using System.Collections; +using SteelEngine.ECS; +using SteelEngine.ECS.Components; +using SteelEngine; +using SteelEngine.Math; +using System.Reflection; +using imgui_beef; + +namespace SteelEditor.Windows +{ + class InspectorWindow : EditorWindow + { + public override StringView Title => "Inspector"; + + private Entity _entity = new Entity(); + private String _entityName = new .() ~ delete _; + + public override void OnShow() + { + _entity.AddComponent(new TransformComponent()); + } + + public override void OnRender() + { + if (_entity == null) + return; + + _entity.IsEnabled = EditorGUI.Checkbox("##EntityEnabled", _entity.IsEnabled); + + Editor.GetEntityName(_entity.Id, _entityName); + EditorGUI.SameLine(); + EditorGUI.Input("##EntityName", _entityName); + + EditorGUI.Line(); + + var componentsToRender = scope List(); + + for (var component in Application.Instance.[Friend]_components.Values) + if (component.Parent == _entity) + componentsToRender.Add(component); + + for (var component in componentsToRender) + { + var componentName = scope String(); + component.GetType().GetShortName(componentName); + if (componentName.EndsWith("Component")) + { + componentName.RemoveFromEnd(9); + componentName.[Friend]Realloc(componentName.AllocSize); + } + + EditorGUI.ItemID(scope String()..AppendF("{}", component)); + if (EditorGUI.BeginTree(componentName)) + { + RenderObject(component); + RenderObject(component); + EditorGUI.EndTree(); + } + } + } + + private void RenderObject(Object object, StringView name = "") => RenderObject(object, typeof(T), name); + private void RenderObject(Object object, StringView name = "") => RenderObject(object, object.GetType(), name); + + private void RenderObject(Object object, Type type, StringView preferredName = "") + { + var name = scope String(preferredName); + if (preferredName == "") + type.GetName(name); + + var fields = scope List(type.GetFields(.Instance | .Public)); + if (fields.IsEmpty) + { + RenderValue(name, object); + return; + } + + //ImGui.Columns(2); + RenderFields(fields, object); + } + + private void RenderValue(StringView name, Object object) + { + EditorGUI.LabelText(name, "{}", object); + } + + private void RenderFields(List fields, Object object) + { + ImGui.Columns(2); + + for (var field in fields) + { + if (field.FieldType.IsInteger) + { + //RenderInt(field, component); + continue; + } + + switch (field.FieldType) + { + case typeof(Vector3): + RenderField(=> EditorGUI.Vector3, field, object); + break; + case typeof(Vector2): + RenderField(=> EditorGUI.Vector2, field, object); + break; + case typeof(bool): + RenderField(=> EditorGUI.Checkbox, field, object); + break; + case typeof(Entity): + var variant = field.GetValue(object).Get(); + RenderValue(field.GetName(), variant.Get()); + variant.Dispose(); + break; + default: + var variant = field.GetValue(object).Get(); + if (variant.IsObject) + { + if (!EditorGUI.BeginTree(field.GetName())) + continue; + + RenderObject(variant.Get(), field.FieldType, field.GetName()); + EditorGUI.EndTree(); + } + variant.Dispose(); + } + } + } + + private void RenderField(function T(StringView label, T value) callback, FieldInfo field, Object component) + { + var variant = field.GetValue(component).Get(); + field.SetValue(component, callback(field.GetName(), variant.Get())); + variant.Dispose(); + } + + private void RenderInt(FieldInfo field, BaseComponent component) + { + var fieldName = field.GetName(); + Variant variant = ?; + + switch (field.FieldType) + { + case typeof(int): + variant = field.GetValue(component).Get(); + field.SetValue(component, (int) EditorGUI.Int(fieldName, variant.Get())); + case typeof(int8): + variant = field.GetValue(component).Get(); + field.SetValue(component, (int8) EditorGUI.Int(fieldName, variant.Get())); + case typeof(int16): + variant = field.GetValue(component).Get(); + field.SetValue(component, (int16) EditorGUI.Int(fieldName, variant.Get())); + case typeof(int32): + variant = field.GetValue(component).Get(); + field.SetValue(component, (int32) EditorGUI.Int(fieldName, variant.Get())); + case typeof(int64): + variant = field.GetValue(component).Get(); + field.SetValue(component, (int64) EditorGUI.Int(fieldName, variant.Get())); + + case typeof(uint): + variant = field.GetValue(component).Get(); + field.SetValue(component, (uint) EditorGUI.Int(fieldName, (int) variant.Get())); + case typeof(uint8): + variant = field.GetValue(component).Get(); + field.SetValue(component, (uint8) EditorGUI.Int(fieldName, variant.Get())); + case typeof(uint16): + variant = field.GetValue(component).Get(); + field.SetValue(component, (uint16) EditorGUI.Int(fieldName, variant.Get())); + case typeof(uint32): + variant = field.GetValue(component).Get(); + field.SetValue(component, (uint32) EditorGUI.Int(fieldName, variant.Get())); + case typeof(uint64): + variant = field.GetValueReference(component).Get(); + field.SetValue(component, (uint64) EditorGUI.Int(fieldName, (int) variant.Get())); + default: + return; + } + + variant.Dispose(); + } + } +} diff --git a/Editor/src/Windows/TestWindow.bf b/Editor/src/Windows/TestWindow.bf index 5b3c6e2..b5520e3 100644 --- a/Editor/src/Windows/TestWindow.bf +++ b/Editor/src/Windows/TestWindow.bf @@ -33,10 +33,10 @@ namespace SteelEditor.Windows EditorGUI.Input("Input with hint", _hintTextInput, "Enter text here"); - EditorGUI.InputInt("Int", ref _intInput); + EditorGUI.Int("Int", ref _intInput); - EditorGUI.InputVector2("Vector2", ref _vector2Input); - EditorGUI.InputVector3("Vector3", ref _vector3Input); + EditorGUI.Vector2("Vector2", ref _vector2Input); + EditorGUI.Vector3("Vector3", ref _vector3Input); EditorGUI.Combo("Combo", ref _comboItem); } diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index bafb070..d74b1fa 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -31,9 +31,8 @@ namespace SteelEngine public this() { - Log.Trace("Initiating application"); - Instance = this; + Log.AddCallback(new (str, level) => { ConsoleColor color; @@ -60,6 +59,8 @@ namespace SteelEngine Console.ForegroundColor = origin; }); + Log.Trace("Initializing application"); + _components = new Dictionary(); _componentsToDelete = new List(); _entitiesToRemoveFromStore = new List(); @@ -94,6 +95,8 @@ namespace SteelEngine for (let item in _components) delete item.value; + _components.Clear(); + for (let item in Entity.EntityStore) delete item.value; } @@ -126,7 +129,7 @@ namespace SteelEngine public Entity CreateEntity() { - return new Entity(this); + return new Entity(); } public void Run() diff --git a/Engine/src/Color.bf b/Engine/src/Color.bf new file mode 100644 index 0000000..f23c0a7 --- /dev/null +++ b/Engine/src/Color.bf @@ -0,0 +1,44 @@ +using SteelEngine.Math; + +namespace SteelEngine +{ + public struct Color + { + public float r, g, b, a; + + public this() : this(1, 1, 1, 1) {} + + + public this(float r, float g, float b) : this(r, g, b, 1) {} + + public this(float r, float g, float b, float a) + { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + public Color Black => .(0, 0, 0, 1); + public Color Blue => .(0, 0, 1, 1); + public Color Cyan => .(0, 1, 1, 1); + public Color Gray => .(0.5f, 0.5f, 0.5f, 1); + public Color Green => .(0, 1, 0, 1); + public Color Grey => Gray; + public Color Magenta => .(1, 0, 1, 1); + public Color Red => .(1, 0, 0, 1); + public Color Transparent => .(0, 0, 0, 0); + public Color White => .(1, 1, 1, 1); + public Color Yellow => .(1, 0.92f, 0.016f, 1); + + public static implicit operator Vector4(Self self) + { + return .(self.r, self.g, self.b, self.a); + } + + public static implicit operator Self(Vector4 vec) + { + return .(vec.x, vec.y, vec.z, vec.w); + } + } +} diff --git a/Engine/src/Console/CVar.bf b/Engine/src/Console/CVar.bf index 9782a29..13350f1 100644 --- a/Engine/src/Console/CVar.bf +++ b/Engine/src/Console/CVar.bf @@ -12,12 +12,20 @@ namespace SteelEngine.Console public StringView Help => _help; public CVarFlags Flags { get; protected set; } - public abstract int64 GetValueInt32(); + public bool HasFlags(CVarFlags flags) => Flags.HasFlag(flags); + public void AddFlags(CVarFlags flags) => Flags |= flags; + public void RemoveFlags(CVarFlags flags) => Flags &= ~flags; + + public abstract Type Type { get; } + + public abstract int32 GetValueInt32(); public abstract int64 GetValueInt64(); public abstract float GetValueFloat() ; - public abstract void GetValueString(String buffer) ; + public abstract StringView GetValueString(String buffer) ; + + public abstract Result Execute(StringView strArgs, Span args); - public abstract bool Execute(StringView line, Span args); + public virtual bool IsCommand => false; protected this(StringView name, StringView help, CVarFlags flags) { @@ -32,93 +40,119 @@ namespace SteelEngine.Console class ConsoleVar : CVar where T : var { protected T* _value; - protected OnCVarChange _onChange ~ delete _; - public override int64 GetValueInt32() { return CVarUtil.GetValueInt32(*_value); } + public ref T Value => *_value; + + public override Type Type => typeof(T); + + public override int32 GetValueInt32() { return CVarUtil.GetValueInt32(*_value); } public override int64 GetValueInt64() { return CVarUtil.GetValueInt64(*_value); } public override float GetValueFloat() { return CVarUtil.GetValueFloat(*_value); } - public override void GetValueString(String buffer) { (*_value).ToString(buffer); } + public override StringView GetValueString(String buffer) + { + let start = buffer.Length; + (*_value).ToString(buffer); + return .(buffer, start); + } - public override bool Execute(StringView line, Span args) + public override Result Execute(StringView strArgs, Span args) { - if (args.Length >= 1 && CVarUtil.TryParse(args[0], ref *_value)) - { - _onChange?.Invoke(this); - return true; + bool changed; + if (args.Length >= 1 && CVarUtil.TryParse(this, args, ref *_value, out changed)) + { + return changed; } - return false; + return .Err; + } + + public override void ToString(String strBuffer) + { + strBuffer.AppendF("{0} ", Name); + GetValueString(strBuffer); } - public this(StringView name, StringView help, T* val, CVarFlags flags, OnCVarChange onChange) : base(name, help, flags) + public this(StringView name, StringView help, T* val, CVarFlags flags) : base(name, help, flags) { _value = val; - _onChange = _onChange; } } - class EnumConsoleVar : CVar where TEnum: Enum + class EnumConsoleVar : ConsoleVar where TEnum: Enum { - protected TEnum* _value; - protected OnCVarChange _onChange ~ delete _; - - public override int64 GetValueInt32() { return (*_value); } + public override int32 GetValueInt32() { return (*_value); } public override int64 GetValueInt64() { return (*_value); } public override float GetValueFloat() { return (int)(*_value); } - public override void GetValueString(String buffer) { (*_value).ToString(buffer); } - - public override bool Execute(StringView line, Span args) - { - if (args.Length >= 1) - { - if (TEnum.Parse(args[0], true) case .Ok(let val)) - { - *_value = val; - _onChange?.Invoke(this); - return true; - } - if((int64.Parse(args[0]) case .Ok(var iVal)) && EnumUtils.HasValue(iVal)) - { - *_value = *(TEnum*)&iVal; - _onChange?.Invoke(this); - return true; - } - - } - return false; - } - public this(StringView name, StringView help, TEnum* val, CVarFlags flags, OnCVarChange onChange) : base(name, help, flags) + public this(StringView name, StringView help, TEnum* val, CVarFlags flags) : base(name, help, val, flags) { - _value = val; - _onChange = _onChange; + } } - public delegate bool OnCmdExecute(ConsoleCommand cmd, StringView line, Span args); + public delegate bool OnCmdExecute(CVar cmd, StringView line, Span args); + public delegate void OnCmdExecuteNoArgs(); + public delegate void OnCmdExecuteLineArgs(StringView line, Span args); - class ConsoleCommand : CVar + class ConsoleCommand : CVar where OnExecute : Delegate { - protected OnCmdExecute _onExecute ~ delete _; + protected OnExecute _onExecute ~ delete _; + + public override Type Type => typeof(OnExecute); - public override int64 GetValueInt32() => 0; + public override int32 GetValueInt32() => 0; public override int64 GetValueInt64() => 0; public override float GetValueFloat() => 0; - public override void GetValueString(String buffer) {} + public override StringView GetValueString(String buffer) => default; + + public override bool IsCommand => true; + + public override void ToString(String strBuffer) + { + strBuffer.AppendF("{0}", Name); + } - public override bool Execute(StringView line, Span args) + public this(StringView name, StringView help, OnExecute onExec, CVarFlags flags) : base(name, help, flags) + { + _onExecute = onExec; + } + } + + extension ConsoleCommand where OnExecute : OnCmdExecute + { + public override Result Execute(StringView strArgs, Span args) { if (_onExecute == null) - return false; + return .Err; - return _onExecute.Invoke(this, line, args); + return _onExecute(this, strArgs, args) ? .Ok(false) : .Err; } + } - public this(StringView name, StringView help, OnCmdExecute onExec, CVarFlags flags) : base(name, help, flags) + extension ConsoleCommand where OnExecute : OnCmdExecuteNoArgs + { + public override Result Execute(StringView strArgs, Span args) { - _onExecute = onExec; + if (_onExecute == null) + return .Err; + + _onExecute(); + return false; } } + + extension ConsoleCommand where OnExecute : OnCmdExecuteLineArgs + { + public override Result Execute(StringView strArgs, Span args) + { + if (_onExecute == null) + return .Err; + + _onExecute(strArgs, args); + return false; + } + } + } diff --git a/Engine/src/Console/CVarFlags.bf b/Engine/src/Console/CVarFlags.bf index 12b12eb..838f39c 100644 --- a/Engine/src/Console/CVarFlags.bf +++ b/Engine/src/Console/CVarFlags.bf @@ -3,15 +3,19 @@ namespace SteelEngine.Console enum CVarFlags { None = 0x0000, - // Can be executed only when sv.cheats is True + /// Can be executed only when cheats are enabled Cheat = 0x0001, - // Indicates that this CVar will change value on registration to match value in config file + /// Indicates that this CVar will change value on registration to match value in configuration file Config = 0x0002, - // This flag is set when CVar was present in config file + /// This flag is set when CVar was present in configuration file WasInConfig = 0x0004, - // CVar value was changed after config load + /// This flags is set when CVar value is changed after configuration file was loaded Changed = 0x0008, - // CVar won't show in console but can be changed through code + /// CVar won't show in console but its value can be changed through code Hidden = 0x0010, + /// OnChange callback will always be called even when value didn't change + AlwaysOnChange = 0x0020, + /// Disable value check for enum variables + Flags = 0x0040 } } diff --git a/Engine/src/Console/CVarUtil.bf b/Engine/src/Console/CVarUtil.bf index 93ebb34..2aaf544 100644 --- a/Engine/src/Console/CVarUtil.bf +++ b/Engine/src/Console/CVarUtil.bf @@ -4,59 +4,93 @@ namespace SteelEngine.Console { static class CVarUtil { - public static bool TryParse(StringView strval, ref bool result) + public static bool TryParse(CVar cvar, Span args, ref bool result, out bool didChange) { - switch(strval) + let currentVal = result; + switch (args[0]) { case "true", "True", "TRUE", "1": result = true; case "false", "False", "FALSE", "0": result = false; + default: + return false; } - - return false; + didChange = result != currentVal; + return true; } - public static bool TryParse(StringView strval, ref int32 result) + public static bool TryParse(CVar cvar, Span args, ref int32 result, out bool didChange) { - if (int32.Parse(strval) case .Ok(let val)) + let currentVal = result; + if (int32.Parse(args[0]) case .Ok(let val)) { result = val; + didChange = result != currentVal; return true; } + didChange = false; return false; } - public static bool TryParse(StringView strval, ref int64 result) + public static bool TryParse(CVar cvar, Span args, ref int64 result, out bool didChange) { - if (int64.Parse(strval) case .Ok(let val)) + let currentVal = result; + if (int64.Parse(args[0]) case .Ok(let val)) { result = val; + didChange = result != currentVal; return true; } + didChange = false; return false; } - public static bool TryParse(StringView strval, ref float result) + public static bool TryParse(CVar cvar, Span args, ref float result, out bool didChange) { - if (float.Parse(strval) case .Ok(let val)) + let currentVal = result; + if (float.Parse(args[0]) case .Ok(let val)) { result = val; + didChange = result != currentVal; return true; } + didChange = false; return false; } - public static bool TryParse(StringView strval, ref String result) + public static bool TryParse(CVar cvar, Span args, ref String result, out bool didChange) { + didChange = result != args[0]; result.Clear(); - result.Append(strval); + result.Append(args[0]); return true; } + public static bool TryParse(CVar cvar, Span args, ref TEnum result, out bool didChange) where TEnum : Enum + { + let currentVal = result; + + if (TEnum.Parse(args[0], true) case .Ok(let val)) + { + result = val; + didChange = result != currentVal; + return true; + } + if ((int64.Parse(args[0]) case .Ok(var iVal)) && (cvar.HasFlags(.Flags) || EnumUtils.HasValue(iVal))) + { + result = *(TEnum*)&iVal; + didChange = result != currentVal; + return true; + } + + didChange = false; + return false; + } + public static int32 GetValueInt32(bool* val) { return *val ? 1 : 0; @@ -83,7 +117,7 @@ namespace SteelEngine.Console { return res; } - return 0; + return (int32)(*val).GetHashCode(); } public static int32 GetValueInt64(bool* val) @@ -112,7 +146,7 @@ namespace SteelEngine.Console { return res; } - return 0; + return (*val).GetHashCode(); } public static int32 GetValueFloat(bool* val) diff --git a/Engine/src/Console/CommandHistory.bf b/Engine/src/Console/CommandHistory.bf deleted file mode 100644 index e59e9f4..0000000 --- a/Engine/src/Console/CommandHistory.bf +++ /dev/null @@ -1,64 +0,0 @@ -using System; - -namespace SteelEngine.Console -{ - class CommandHistory - { - private String[] _history ~ DeleteContainerAndItems!(_); - private int _addIndex; - private int _pos; - - public int Count => _addIndex; - - public this(int maxCount) - { - _history = new String[maxCount]; - } - - public void Add(StringView line) - { - if (_addIndex >= _history.Count) - { - delete _history[0]; - - int prev = 0; - int cur = 1; - for (; cur < _history.Count; cur++) - { - _history[prev] = _history[cur]; - prev++; - } - - _history[cur] = new .(line); - } - else - { - _history[_addIndex++] = new .(line); - } - } - - public StringView HistoryUp() - { - if (_pos >= _history.Count - 1) - return default; - - return AtIndex(++_pos); - } - - public StringView HistoryDown() - { - if (_pos <= 0) - return default; - - return AtIndex(--_pos); - } - - public StringView AtIndex(int index) - { - if (index < 0 || index >= Count) - return default; - - return _history[index]; - } - } -} diff --git a/Engine/src/Console/CommandsHistory.bf b/Engine/src/Console/CommandsHistory.bf new file mode 100644 index 0000000..853ab46 --- /dev/null +++ b/Engine/src/Console/CommandsHistory.bf @@ -0,0 +1,75 @@ +using System; + +namespace SteelEngine.Console +{ + class CommandsHistory + { + private String[] _history ~ DeleteContainerAndItems!(_); + private int _count = 0; + private int _addPos = 0; + + private int _historyPos = 0; + + public this(int maxCount) + { + _history = new String[maxCount]; + for (var item in ref _history) + item = new String(); + } + + public void Add(StringView line) + { + _addPos++; + _count++; + if (_addPos == _history.Count) + _addPos = 0; + + if (_count > _history.Count) + _count--; + + let item = _history[_addPos]; + item.Set(line); + } + + public StringView HistoryUp() + { + if (_historyPos < _count) + _historyPos++; + + return At(_historyPos); + } + + public StringView HistoryDown() + { + if (_historyPos > 0) + _historyPos--; + + return At(_historyPos); + } + + public StringView At(int index) + { + // index 0 = empty string + // index 1 = last addeded entry + // index >= _Count = first entry in history + + // @TODO(fusion) - revisit this code, have feeling this can be simplified + + if (index == 0) + return default; + + if (_count < _history.Count) + return _history[_addPos - index + 1]; + + if (index >= _count) + return _history[_addPos+1 % _count]; + + var i = (_addPos - index + 1) % _count; + if (i < 0) + return _history[_count + i]; + + return _history[i]; + + } + } +} diff --git a/Engine/src/Console/ConsoleLineParser.bf b/Engine/src/Console/ConsoleLineParser.bf index 92d6a6c..38d70ce 100644 --- a/Engine/src/Console/ConsoleLineParser.bf +++ b/Engine/src/Console/ConsoleLineParser.bf @@ -7,6 +7,7 @@ namespace SteelEngine.Console { const char8 SEPARATOR_CHAR = ';'; const char8 QUOTE_CHAR = '"'; + const char8 COMMENT_CHAR = '#'; static void SkipWhitespace(StringView input, ref int i) { @@ -24,7 +25,7 @@ namespace SteelEngine.Console let startPos = i; while (i < input.Length) { - if (input[i].IsWhiteSpace || input[i] == SEPARATOR_CHAR) + if (input[i].IsWhiteSpace || input[i] == SEPARATOR_CHAR || input[i] == COMMENT_CHAR) break; i++; @@ -39,6 +40,7 @@ namespace SteelEngine.Console static StringView? ParseQuotes(StringView input, ref int i) { // @TODO(fusion) - how to handle when quote is not in pair currently this is ignored + // @TODO(fusion) - escaped quotes keep the backslash char, they should be removed bool isPair = false; var startPos = i; @@ -80,7 +82,10 @@ namespace SteelEngine.Console { if (tokens.IsEmpty) start = i; - + + if (input[i] == COMMENT_CHAR) + break; + if (input[i] == SEPARATOR_CHAR && !tokens.IsEmpty) break; @@ -96,10 +101,25 @@ namespace SteelEngine.Console i++; } } + return !tokens.IsEmpty; + } - + // Sets output to contain all tokens and + // transforms tokens to be relative to output string + public static bool Tokenize(StringView input, ref int i, ref int start, List tokens, String output) + { + if (Tokenize(input, ref i, ref start, tokens)) + { + output.Set(StringView(input, start, i - start)); + for (var t in ref tokens) + { + let offset = (t.Ptr - input.Ptr) - start; + t = .(output, offset, t.Length); + } + return true; + } - return !tokens.IsEmpty; + return false; } } } diff --git a/Engine/src/Console/EnumUtils.bf b/Engine/src/Console/EnumUtils.bf index 31d7d59..0d0563d 100644 --- a/Engine/src/Console/EnumUtils.bf +++ b/Engine/src/Console/EnumUtils.bf @@ -5,19 +5,16 @@ namespace SteelEngine.Console { public static class EnumUtils where TEnum : Enum { - private static Dictionary _keys ~ delete _; private static HashSet _values ~ delete _; static this() { - _keys = new .(); _values = new .(); let type = typeof(TEnum); for (var field in type.GetFields()) { _values.Add(field.[Friend]mFieldData.[Friend]mData); - _keys.Add(field.[Friend]mFieldData.[Friend]mName, field.[Friend]mFieldData.[Friend]mData); } } diff --git a/Engine/src/Console/ExampleUsage.bf b/Engine/src/Console/ExampleUsage.bf deleted file mode 100644 index d6c6a39..0000000 --- a/Engine/src/Console/ExampleUsage.bf +++ /dev/null @@ -1,62 +0,0 @@ -using System; -namespace SteelEngine.Console -{ - class ExampleUsage - { - public static void Run() - { - GameConsole c = scope .(); - int32 x = 5; - int64 q = 6; - float f = 7; - String s = scope .("sad"); - CVarFlags flags = .Cheat; - - String buffer = scope .(); - let xv = c.RegisterCVar("sv.int32", "", ref x)..GetValueString(buffer); - let qv = c.RegisterCVar("sv.int64", "", ref q)..GetValueString(buffer); - let fv = c.RegisterCVar("sv.float", "", ref f)..GetValueString(buffer); - let sv = c.RegisterCVar("sv.string", "", ref s)..GetValueString(buffer); - let flv = c.RegisterCVar("sv.enum", "", ref flags)..GetValueString(buffer); - - c.Execute("sv.int32 16; sv.float 14.1;"); - c.Execute("sv.string \"wowo dsjakdas\"; sv.float 14.1;"); - c.Execute("sv.string \"\";dasd"); - c.Execute("echo halo you beautiful person; echo second command?;"); - - c.Enqueue("wait.seconds 1"); - - String line = scope .(); - - Time.[Friend]Initialize(); - - while(true) - { - Time.[Friend]Update(); - - line.Clear(); - Console.ReadLine(line); - if (line == "quit") - break; - c.Enqueue(line); - c.Update(); - } - - x = 10; - q = 50; - f = 14.1f; - //s = "dasdadas"; - - flags = .Config; - - StringView[1] asd = .("12"); - - buffer.Append(" "); - xv.GetValueString(buffer); - qv.GetValueString(buffer); - fv.GetValueString(buffer); - sv.GetValueString(buffer); - flv.GetValueString(buffer); - } - } -} diff --git a/Engine/src/Console/GameConsole.bf b/Engine/src/Console/GameConsole.bf index b58db33..8c8feb4 100644 --- a/Engine/src/Console/GameConsole.bf +++ b/Engine/src/Console/GameConsole.bf @@ -1,121 +1,277 @@ using System; using System.Collections; +using System.IO; +using SteelEngine.Console; -namespace SteelEngine.Console +namespace SteelEngine { class GameConsole { const int HISTORY_SIZE = 50; - private Dictionary _cvars = new Dictionary() ~ delete _; - private Queue _enqueuedCommands = new Queue() ~ delete _; + struct ConfigVarValue : IDisposable + { + public String line; + public StringView[] args; - public CommandHistory History = new CommandHistory(HISTORY_SIZE) ~ delete _; + public void Dispose() + { + delete line; + delete args; + } + } - protected bool _cvarCheatsEnabled = false; - protected float _cvarWaitTime = 0; - protected int _cvarWaitFrames = 0; + public struct LineEntry : IDisposable + { + public LogLevel level; + public String message; + + public void Dispose() + { + delete message; + } + } + + static Self _instance; + public static Self Instance => _instance; + + Dictionary _cvars = new Dictionary() ~ delete _; + Dictionary _cvarChangedCallbacks = new Dictionary() ~ delete _; + Dictionary _configVars = new Dictionary() ~ delete _; + Queue _enqueuedCommands = new Queue() ~ DeleteContainerAndItems!(_); + CommandsHistory _history = new CommandsHistory(HISTORY_SIZE) ~ delete _; + + int _maxLines = 1000; + List _lines = new List() ~ delete _; + + public CommandsHistory History => _history; + + bool _cvarCheatsEnabled = false; + float _cvarWaitTime = 0; + int _cvarWaitFrames = 0; - public LogLevel LogLevel { get; set; } + public LogLevel logLevel = .Trace; + + bool _opened = false; + public bool IsOpen = _opened; public this() { - RegisterCVar("sv.cheats", "Enable execution of commands with Cheat flag.", ref _cvarCheatsEnabled); - RegisterCVar("wait.frames", "Wait number of frames before continuing execution of commands.", ref _cvarWaitFrames); - RegisterCVar("wait.seconds", "Wait number of real time seconds before continuing execution of commands.", ref _cvarWaitTime); + _instance = this; + } + public ~this() + { + for (let cvar in _cvars.Values) + delete cvar; - RegisterCommand("echo", "", new (cmd, line, args) => - { - if (line.Length <= 4) - return false; + for (let cb in _cvarChangedCallbacks.Values) + delete cb; - let cmdNameLength = cmd.Name.Length + 1; - let str = StringView(line, cmdNameLength, line.Length - cmdNameLength); - if (!str.IsEmpty) - Log.Info(str); + for (let val in _configVars.Values) + val.Dispose(); - return true; - }); + Clear(); + } - RegisterCommand("help", "Show list of variables and commands", new (cmd, line, args) => + public void Initialize(Span configFiles) + { + for (var file in configFiles) { - StringView filter = default; - if(args.Length >= 1) + if (LoadConfigFile(file) case .Err(let err)) { - filter = args[0]; + Log.Error("Couldn't open configuration file {0} ({1})", file, err); } + } + + Initialize(); + } + + public void Initialize() + { + Log.AddCallback(new => OnLogCallback); + + RegisterVariable("console.loglevel", "Minimal level message need to be to be logged into console", ref logLevel, .Config); + RegisterVariable("sv.cheats", "Enable execution of commands with Cheat flag.", ref _cvarCheatsEnabled); + RegisterVariable("wait.frames", "Wait number of frames before continuing execution of commands.", ref _cvarWaitFrames); + RegisterVariable("wait.seconds", "Wait number of real time seconds before continuing execution of commands.", ref _cvarWaitTime); + + RegisterCommand("echo", "Print message", new (line, args) => + { + PrintInfo(line); + }); - for(let v in _cvars) + RegisterCommand("help", "Show list of variables and commands", new (line, args) => + { + StringView filter = args.Length > 0 ? args[0] : default; + + String buffer = scope .(); + + for (let cvar in _cvars.Values) { - Log.Info("{0} - {1}", v.key, v.value.Help); + if (!cvar.HasFlags(.Hidden) && (filter.IsEmpty || cvar.Name.Contains(filter))) + { + buffer.Append(" "); + buffer.Append(cvar.Name); + if (!cvar.Help.IsEmpty) + buffer.AppendF(" - {0}", cvar.Help); + buffer.Append("\n"); + } } - return true; + PrintInfo(buffer); + }); + + RegisterCommand("exec", "Execute file", new (line, args) => + { + if (ExecuteFile(args[0]) case .Err(let err)) + { + PrintErrorF("Couldn't execute file {0} ({1}).", args[0], err); + } + }); + + RegisterCommand("cls", "Clear console", new () => + { + Clear(); }); } - public ~this() + void OnLogCallback(StringView message, LogLevel logLevel) { - for (let cvar in _cvars.Values) - delete cvar; + if (logLevel < this.logLevel) + return; + + PrintLine(logLevel, message); + } + + public void Open() + { + _opened = true; + } + + public void Close() + { + _opened = false; } + public void Toggle() + { + _opened = !_opened; + } + + public void Clear() + { + for (let l in _lines) + l.Dispose(); + + _lines.Clear(); + } + + + protected void PrintLine(LogLevel logLevel, StringView message) + { + if (_lines.Count >= _maxLines) + { + _lines.PopFront().Dispose(); + } + + _lines.Add(LineEntry() { level = logLevel, message = new .(message) }); + } + + protected void PrintLineF(LogLevel logLevel, StringView format, params Object[] args) + { + String buffer = scope .(); + buffer.AppendF(format, params args); + PrintLine(logLevel, buffer); + } + + public void PrintInfo(StringView message) => PrintLine(.Info, message); + public void PrintInfoF(StringView format, params Object[] args) => PrintLineF(.Info, format, params args); + public void PrintWarning(StringView message) => PrintLine(.Warning, message); + public void PrintWarningF(StringView format, params Object[] args) => PrintLineF(.Warning, format, params args); + public void PrintError(StringView message) => PrintLine(.Warning, message); + public void PrintErrorF(StringView format, params Object[] args) => PrintLineF(.Warning, format, params args); + protected mixin CheckCVarRegistered(StringView name) { if (_cvars.TryGetValue(name, let cvar)) { - Log.Warning("CVar '{0}' already registered!", name); + Log.Warning("CVar {0} already registered!", name); return cvar; } } - public CVar RegisterCVar(StringView name, StringView help, ref bool varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + protected void LoadConfigVarValue(CVar cvar) { - CheckCVarRegistered!(name); - let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); + if (_configVars.GetAndRemove(cvar.Name) case .Ok(var val)) + { + if (cvar.Execute(val.value.line, val.value.args) case .Ok) + { + cvar.AddFlags(.WasInConfig); + } + else + { + Log.Error("Error occurred while setting configuration variable. Can't set value of {0} to {1}", cvar.Name, val.value.args[0]); + } + val.value.Dispose(); + } + } + + protected CVar RegisterCVar(CVar cvar, OnCVarChange onChange) + { + if (cvar.HasFlags(.Config)) + LoadConfigVarValue(cvar); + + if (onChange != null) + _cvarChangedCallbacks[cvar.Name] = onChange; + return _cvars[cvar.Name] = cvar; } - public CVar RegisterCVar(StringView name, StringView help, ref int32 varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + public CVar RegisterVariable(StringView name, StringView help, ref bool varRef, CVarFlags flags = .None, OnCVarChange onChange = null) { CheckCVarRegistered!(name); - let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); - return _cvars[cvar.Name] = cvar; + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); } - public CVar RegisterCVar(StringView name, StringView help, ref int64 varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + public CVar RegisterVariable(StringView name, StringView help, ref int32 varRef, CVarFlags flags = .None, OnCVarChange onChange = null) { CheckCVarRegistered!(name); - let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); - return _cvars[cvar.Name] = cvar; + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); } - public CVar RegisterCVar(StringView name, StringView help, ref float varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + public CVar RegisterVariable(StringView name, StringView help, ref int64 varRef, CVarFlags flags = .None, OnCVarChange onChange = null) { CheckCVarRegistered!(name); - let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); - return _cvars[cvar.Name] = cvar; + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); } - public CVar RegisterCVar(StringView name, StringView help, ref String varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + public CVar RegisterVariable(StringView name, StringView help, ref float varRef, CVarFlags flags = .None, OnCVarChange onChange = null) { CheckCVarRegistered!(name); - let cvar = new ConsoleVar(name, help, &varRef, flags, onChange); - return _cvars[cvar.Name] = cvar; + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); } - public CVar RegisterCVar(StringView name, StringView help, ref TEnum varRef, CVarFlags flags = .None, OnCVarChange onChange = null) where TEnum : Enum + public CVar RegisterVariable(StringView name, StringView help, ref String varRef, CVarFlags flags = .None, OnCVarChange onChange = null) { CheckCVarRegistered!(name); - let cvar = new EnumConsoleVar(name, help, &varRef, flags, onChange); - return _cvars[cvar.Name] = cvar; + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); + } + + public CVar RegisterVariable(StringView name, StringView help, ref TEnum varRef, CVarFlags flags = .None, OnCVarChange onChange = null) where TEnum : Enum + { + CheckCVarRegistered!(name); + return RegisterCVar(new EnumConsoleVar(name, help, &varRef, flags), onChange); } - public CVar RegisterCommand(StringView name, StringView help, OnCmdExecute onExecute, CVarFlags flags = .None) + public CVar RegisterCommand(StringView name, StringView help, OnCmdExecute onExecute, CVarFlags flags = .None) => RegisterCommand(name, help, onExecute, flags); + public CVar RegisterCommand(StringView name, StringView help, OnCmdExecuteNoArgs onExecute, CVarFlags flags = .None) => RegisterCommand(name, help, onExecute, flags); + public CVar RegisterCommand(StringView name, StringView help, OnCmdExecuteLineArgs onExecute, CVarFlags flags = .None) => RegisterCommand(name, help, onExecute, flags); + + protected CVar RegisterCommand(StringView name, StringView help, TDelegate onExecute, CVarFlags flags) where TDelegate : Delegate { CheckCVarRegistered!(name); - let cvar = new ConsoleCommand(name, help, onExecute , flags); + let cvar = new ConsoleCommand(name, help, onExecute, flags); return _cvars[cvar.Name] = cvar; } @@ -123,6 +279,10 @@ namespace SteelEngine.Console { if (_cvars.GetAndRemove(name) case .Ok(let val)) { + if ( _cvarChangedCallbacks.TryGetValue(name, let cb)) + delete cb; + + delete val.value; return true; } return false; @@ -147,7 +307,6 @@ namespace SteelEngine.Console while (ConsoleLineParser.Tokenize(cmdLine, ref i, ref start, tokens)) { - System.Diagnostics.Debug.Assert(!tokens.IsEmpty); StringView command = .(cmdLine, start, i - start); ExecuteLineTokens(command, .(tokens.Ptr, tokens.Count)); } @@ -156,35 +315,68 @@ namespace SteelEngine.Console protected void ExecuteLineTokens(StringView line, Span tokens) { let cmdName = tokens[0]; - if (_cvars.TryGetValue(cmdName, let cvar)) + if (_cvars.TryGetValue(cmdName, let cvar) && !cvar.HasFlags(.Hidden)) { + // If CVar is not command and there are no arguments specified just print its value + if (tokens.Length == 1 && !cvar.IsCommand) + { + String buffer = scope .(); + cvar.ToString(buffer); + PrintInfo(buffer); + + return; + } + + // If the command is entered with ? parameter show its description if (tokens.Length > 1 && tokens[1] == "?") { String buffer = scope .(); - cvar.GetValueString(buffer); - if (buffer.IsEmpty) - Log.Info("{0} - '{1}'", cvar.Name, cvar.Help); - else - Log.Info("{0} {1} - '{2}'", cvar.Name, buffer, cvar.Help); + buffer.AppendF("{0} ", cvar.Name); + let strVal = cvar.GetValueString(buffer); + if (!strVal.IsEmpty) + buffer.Append(' '); + + if (!cvar.Help.IsEmpty) + buffer.AppendF("- {0}", cvar.Help); + + PrintInfo(buffer); + return; + } + if (cvar.HasFlags(.Cheat) && !_cvarCheatsEnabled) + { + PrintErrorF("{0} can only be executed when cheats are enabled.", cvar.Name); return; } - - let result = cvar.Execute(line, .(tokens.Ptr+1, tokens.Length-1)); - if (!result) + + StringView strArgs = line; + if (tokens.Length > 1) + { + strArgs = .(line, tokens[1].Ptr - line.Ptr); + } + + let result = cvar.Execute(strArgs, .(tokens.Ptr+1, tokens.Length-1)); + if (result case .Ok(let changed)) { - Log.Error("Error occurred while executing '{0}'", cmdName); + if ((changed || cvar.HasFlags(.AlwaysOnChange)) && _cvarChangedCallbacks.TryGetValue(cvar.Name, let callback)) + { + callback(cvar); + } + } + else + { + PrintErrorF("Error occurred while executing {0}.", cmdName); } } else { - Log.Error("Couldn't find cvar named '{0}'", cmdName); + PrintErrorF("Couldn't find {0} in registered cvars.", cmdName); } } - protected void AddHistory(StringView cmdLine) + public void AddHistory(StringView cmdLine) { - History.Add(cmdLine); + _history.Add(cmdLine); } public void Enqueue(StringView cmdLine) @@ -200,9 +392,8 @@ namespace SteelEngine.Console public void Update() { - let dt = Time.DeltaTimeUnscaled; if (_cvarWaitTime > 0) { - _cvarWaitTime -= dt; + _cvarWaitTime -= Time.DeltaTimeUnscaled; return; } @@ -211,12 +402,74 @@ namespace SteelEngine.Console return; } - while(!(_cvarWaitTime > 0 || _cvarWaitFrames > 0) && _enqueuedCommands.Count > 0) + while (!(_cvarWaitTime > 0 || _cvarWaitFrames > 0) && _enqueuedCommands.Count > 0) { let line = _enqueuedCommands.Dequeue(); Execute(line); delete line; } } + + public Result ExecuteFile(StringView path) + { + StreamReader reader = scope .(); + if (reader.Open(path) case .Err(let err)) + return .Err(err); + + String buffer = scope .(); + while (reader.ReadLine(buffer) case .Ok) + { + EnqueueNoHistory(buffer); + } + + return .Ok; + } + + private Result LoadConfigFile(StringView path) + { + StreamReader reader = scope .(); + if (reader.Open(path) case .Err(let err)) + return .Err(err); + + String buffer = scope .(); + List tokens = scope .(); + + String line = new .(); + + while (reader.ReadLine(buffer) case .Ok) + { + int i = 0; + int start = 0; + + while (ConsoleLineParser.Tokenize(buffer, ref i, ref start, tokens, line)) + { + if (tokens.Count < 2) + continue; + + let name = tokens[0]; + if (_configVars.GetAndRemove(name) case .Ok(let val)) + { + val.value.Dispose(); + } + + StringView[] args = new StringView[tokens.Count-1]; + tokens.CopyTo(1, args, 0, tokens.Count-1); + _configVars.Add(name, ConfigVarValue() + { + line = line, + args = args + }); + line = new .(); + + } + + buffer.Clear(); + } + + delete line; + return .Ok; + } + + public IEnumerator GetCVars() => _cvars.Values; } } diff --git a/Engine/src/ECS/Components/BaseComponent.bf b/Engine/src/ECS/Components/BaseComponent.bf index ef098ba..4701a76 100644 --- a/Engine/src/ECS/Components/BaseComponent.bf +++ b/Engine/src/ECS/Components/BaseComponent.bf @@ -7,6 +7,7 @@ namespace SteelEngine.ECS.Components /// Abstract class defining all Components. /// A class derived from Component will be managed by an appropriate . /// + [Reflect] public abstract class BaseComponent { public this(bool isEnabled = true, Entity parent = null) diff --git a/Engine/src/ECS/Components/TransformComponent.bf b/Engine/src/ECS/Components/TransformComponent.bf index dc508bd..cf9215e 100644 --- a/Engine/src/ECS/Components/TransformComponent.bf +++ b/Engine/src/ECS/Components/TransformComponent.bf @@ -1,11 +1,13 @@ +using SteelEngine.Math; +using System; + namespace SteelEngine.ECS.Components { + [Reflect] public class TransformComponent : BaseComponent { - /* public Vector3 Position { get; set; } public Vector3 Rotation { get; set; } public Vector3 Scale { get; set; } - */ } } diff --git a/Engine/src/ECS/Entity.bf b/Engine/src/ECS/Entity.bf index 4d8014e..5aad511 100644 --- a/Engine/src/ECS/Entity.bf +++ b/Engine/src/ECS/Entity.bf @@ -7,11 +7,11 @@ namespace SteelEngine.ECS { typealias EntityId = uint64; + [Reflect] public class Entity { - public this(Application app) + public this() { - App = app; Id = GetNextId(); IsEnabled = true; @@ -23,7 +23,7 @@ namespace SteelEngine.ECS EntityStore = new Dictionary(); } - public Application App { get; private set; } + public virtual StringView Name => "Entity"; public static Dictionary EntityStore { get; private set; }; @@ -50,7 +50,7 @@ namespace SteelEngine.ECS return false; } component.Parent = this; - return App.[Friend]AddComponent(component); + return Application.Instance.[Friend]AddComponent(component); } /// @@ -65,7 +65,7 @@ namespace SteelEngine.ECS { return false; } - return App.[Friend]RemoveComponent(component); + return Application.Instance.[Friend]RemoveComponent(component); } private static EntityId _nextId = 0; @@ -77,7 +77,7 @@ namespace SteelEngine.ECS public ~this() { - App.[Friend]RemoveEntity(this); + Application.Instance.[Friend]RemoveEntity(this); } static ~this() diff --git a/Engine/src/ECS/Systems/BehaviorSystem.bf b/Engine/src/ECS/Systems/BehaviorSystem.bf index c72a85e..dff8314 100644 --- a/Engine/src/ECS/Systems/BehaviorSystem.bf +++ b/Engine/src/ECS/Systems/BehaviorSystem.bf @@ -6,8 +6,6 @@ namespace SteelEngine.ECS.Systems { public class BehaviorSystem : BaseSystem { - public this() : base() {} - protected override void RegisterComponentTypes() { _registeredTypes = new Type[]{ typeof(BehaviorComponent) }; diff --git a/Engine/src/ECS/Systems/Physics3dSystem.bf b/Engine/src/ECS/Systems/Physics3dSystem.bf index f9322ca..41b5602 100644 --- a/Engine/src/ECS/Systems/Physics3dSystem.bf +++ b/Engine/src/ECS/Systems/Physics3dSystem.bf @@ -6,8 +6,6 @@ namespace SteelEngine.ECS.Systems { public class Physics3dSystem : BaseSystem { - public this() : base() {} - protected override void RegisterComponentTypes() { _registeredTypes = new Type[]{ typeof(Physics3dComponent), typeof(TransformComponent) }; diff --git a/Engine/src/ECS/Systems/Render3dSystem.bf b/Engine/src/ECS/Systems/Render3dSystem.bf index f33f94c..6c39dbe 100644 --- a/Engine/src/ECS/Systems/Render3dSystem.bf +++ b/Engine/src/ECS/Systems/Render3dSystem.bf @@ -6,8 +6,6 @@ namespace SteelEngine.ECS.Systems { public class Render3DSystem : BaseSystem { - public this() : base() {} - protected override void RegisterComponentTypes() { _registeredTypes = new Type[]{ typeof(Drawable3dComponent), typeof(TransformComponent) }; diff --git a/Engine/src/ECS/Systems/RenderTextSystem.bf b/Engine/src/ECS/Systems/RenderTextSystem.bf index b1726a1..a061b00 100644 --- a/Engine/src/ECS/Systems/RenderTextSystem.bf +++ b/Engine/src/ECS/Systems/RenderTextSystem.bf @@ -6,8 +6,6 @@ namespace SteelEngine.ECS.Systems { public class RenderTextSystem : BaseSystem { - public this() : base() {} - protected override void RegisterComponentTypes() { _registeredTypes = new Type[]{ typeof(TextComponent), typeof(TransformComponent) }; diff --git a/Engine/src/ECS/Systems/SoundSystem.bf b/Engine/src/ECS/Systems/SoundSystem.bf index a3a2fa8..b24892a 100644 --- a/Engine/src/ECS/Systems/SoundSystem.bf +++ b/Engine/src/ECS/Systems/SoundSystem.bf @@ -6,8 +6,6 @@ namespace SteelEngine.ECS.Systems { public class SoundSystem : BaseSystem { - public this() : base() {} - protected override void RegisterComponentTypes() { _registeredTypes = new Type[]{ typeof(SoundComponent), typeof(TransformComponent) }; diff --git a/Engine/src/Window/Window.bf b/Engine/src/Window/Window.bf index bcfddef..66a174e 100644 --- a/Engine/src/Window/Window.bf +++ b/Engine/src/Window/Window.bf @@ -56,10 +56,10 @@ namespace SteelEngine.Window Log.Fatal("Could not initialize GLFW"); } - /*Glfw.WindowHint(GlfwWindow.Hint.ContextVersionMajor, 4); + Glfw.WindowHint(GlfwWindow.Hint.ContextVersionMajor, 4); Glfw.WindowHint(GlfwWindow.Hint.ContextVersionMinor, 6); Glfw.WindowHint(GlfwWindow.Hint.OpenGlProfile, .CoreProfile); - Glfw.WindowHint(GlfwWindow.Hint.OpenGlForwardCompat, Glfw.TRUE);*/ + Glfw.WindowHint(GlfwWindow.Hint.OpenGlForwardCompat, Glfw.TRUE); // TODO(Sheep): few other flags to set Glfw.WindowHint(GlfwWindow.Hint.Decorated, !cfg.Undecorated); From 530ad1a9d2621df13faefd5525e5bdd1ddf26eb7 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 22 Aug 2020 22:57:32 +0200 Subject: [PATCH 11/50] Editor now saves settings (Style + Open windows) --- BeefSpace.toml | 2 +- Editor/BeefProj.toml | 2 +- Editor/src/Editor.bf | 375 ++++++++++++++++++++---------- Editor/src/EditorConfig.bf | 13 -- Editor/src/EditorGUI.bf | 12 + Editor/src/EditorWindow.bf | 4 +- Editor/src/Program.bf | 7 - Editor/src/Windows/StyleWindow.bf | 5 +- Engine/src/Console/CVar.bf | 6 +- 9 files changed, 269 insertions(+), 157 deletions(-) delete mode 100644 Editor/src/EditorConfig.bf diff --git a/BeefSpace.toml b/BeefSpace.toml index 1097ddc..d6877e8 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}, BeefToml = {Path = "Libs/BeefToml/lib"}} +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}} Locked = ["glfw-beef", "imgui-impl-opengl3", "imgui-impl-glfw", "imgui-beef"] [Workspace] diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index 2defe0a..90a07e6 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", SteelEngine = "*", imgui-impl-opengl3 = "*", imgui-impl-glfw = "*", imgui-beef = "*", BeefToml = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", imgui-impl-opengl3 = "*", imgui-impl-glfw = "*", imgui-beef = "*"} [Project] Name = "SteelEditor" diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 7b10b41..7df6eab 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -5,7 +5,6 @@ using SteelEngine; using SteelEngine.Window; using SteelEngine.ECS; using SteelEditor.Windows; -using JetFistGames.Toml; using imgui_beef; namespace SteelEditor @@ -13,7 +12,6 @@ namespace SteelEditor public class Editor : Application { private EditorLayer _editorLayer; - private EditorConfig _config = new .(); private Dictionary _entityNames = new .(); @@ -26,26 +24,14 @@ namespace SteelEditor AddWindow(); AddWindow(); AddWindow(); - - - if (LoadConfig() case .Ok) - { - var style = ref ImGui.GetStyle(); - style = _config.Style; - for (var window in _config.Windows) - ShowWindow(window); - } - - ShowWindow(); + LoadConfig(); } public override void OnCleanup() { SaveConfig(); - delete _config; - for (var value in _entityNames.Values) delete value; delete _entityNames; @@ -90,162 +76,295 @@ namespace SteelEditor GetInstance()._editorLayer.CloseWindow(window); } - public static void UpdateConfig() - { - let editor = GetInstance(); - - var editorWindows = editor._editorLayer.[Friend]_editorWindows; - editorWindows.Clear(); - - for (var window in editorWindows) - editor._config.Windows.Add(window.Title); - - editor._config.Style = ImGui.GetStyle(); - } - public static void SaveConfig() { Log.Trace("Saving config"); - /*let serializeResult = JSONSerializer.Serialize(GetInstance()._config); + var editor = GetInstance(); + var config = new Dictionary(); - if (serializeResult case .Err) + var openWindows = new List(); + for (var window in editor._editorLayer.[Friend]_editorWindows) { - Log.Error("Could not serialize config"); - return; + if (window.IsActive) + openWindows.Add(window.Title); + } + config.Add("Windows", openWindows); + + var style = ImGui.GetStyle(); + + AddSetting(config, "Alpha", style.Alpha); + AddSetting(config, "WindowPadding", style.WindowPadding); + AddSetting(config, "WindowRounding", style.WindowRounding); + AddSetting(config, "WindowBorderSize", style.WindowBorderSize); + AddSetting(config, "WindowMinSize", style.WindowMinSize); + AddSetting(config, "WindowTitleAlign", style.WindowTitleAlign); + AddSetting(config, "WindowMenuButtonPosition", style.WindowMenuButtonPosition); + AddSetting(config, "ChildRounding", style.ChildRounding); + AddSetting(config, "ChildBorderSize", style.ChildBorderSize); + AddSetting(config, "PopupRounding", style.PopupRounding); + AddSetting(config, "PopupBorderSize", style.PopupBorderSize); + AddSetting(config, "FramePadding", style.FramePadding); + AddSetting(config, "FrameRounding", style.FrameRounding); + AddSetting(config, "ItemSpacing", style.ItemSpacing); + AddSetting(config, "ItemInnerSpacing", style.ItemInnerSpacing); + AddSetting(config, "TouchExtraPadding", style.TouchExtraPadding); + AddSetting(config, "IndentSpacing", style.IndentSpacing); + AddSetting(config, "ColumnsMinSpacing", style.ColumnsMinSpacing); + AddSetting(config, "ScrollbarSize", style.ScrollbarSize); + AddSetting(config, "ScrollbarRounding", style.ScrollbarRounding); + AddSetting(config, "GrabMinSize", style.GrabMinSize); + AddSetting(config, "GrabRounding", style.GrabRounding); + AddSetting(config, "TabRounding", style.TabRounding); + AddSetting(config, "TabBorderSize", style.TabBorderSize); + AddSetting(config, "ColorButtonPosition", style.ColorButtonPosition); + AddSetting(config, "ButtonTextAlign", style.ButtonTextAlign); + AddSetting(config, "SelectableTextAlign", style.SelectableTextAlign); + AddSetting(config, "DisplayWindowPadding", style.DisplayWindowPadding); + AddSetting(config, "DisplaySafeAreaPadding", style.DisplaySafeAreaPadding); + AddSetting(config, "MouseCursorScale", style.MouseCursorScale); + AddSetting(config, "AntiAliasedLines", style.AntiAliasedLines); + AddSetting(config, "AntiAliasedFill", style.AntiAliasedFill); + AddSetting(config, "CurveTessellationTol", style.CurveTessellationTol); + AddSetting(config, "CircleSegmentMaxError", style.CircleSegmentMaxError); + AddSettingType(config, "Colors", style.Colors); + + var serialized = new String(); + + for (var prop in config) + { + if (prop.value.GetType() == typeof(ImGui.Vec2)) + { + var vec = (ImGui.Vec2) prop.value; + serialized.AppendF("{} = [{}, {}]\n", prop.key, vec.x, vec.y); + } + else if (prop.value.GetType() == typeof(List)) + { + var list = (List) prop.value; + serialized.AppendF("{} = [", prop.key); + for (var str in list) + serialized.AppendF("{}, ", str); + if (serialized.EndsWith(", ")) + serialized.RemoveFromEnd(2); + serialized.[Friend]Realloc(serialized.AllocSize); + serialized.Append("]\n"); + } + else + { + serialized.AppendF("{} = {}\n", prop.key, prop.value); + } } - var serialized = serializeResult.Get(); + for (var value in config.Values) + delete value; + delete config; var configPath = scope String(); - SteelPath.GetEditorUserFile("Config.json", configPath); + SteelPath.GetEditorUserFile("Config.txt", configPath); if (File.WriteAllText(configPath, serialized) case .Err) Log.Error("Failed to save style"); - delete serialized;*/ + delete serialized; - TomlTableNode config = new .(); - - // Style + void AddSetting(Dictionary parent, StringView name, T value) where T : struct + { + parent[name] = new box value; + } - var style = ImGui.GetStyle(); - TomlTableNode styleTable = new .(); - config.AddChild("Style", styleTable); - - AddSetting(styleTable, "Alpha", style.Alpha); - AddSetting(styleTable, "WindowPadding", style.WindowPadding); - AddSetting(styleTable, "WindowRounding", style.WindowRounding); - AddSetting(styleTable, "WindowBorderSize", style.WindowBorderSize); - AddSetting(styleTable, "WindowMinSize", style.WindowMinSize); - AddSetting(styleTable, "WindowTitleAlign", style.WindowTitleAlign); - AddSetting(styleTable, "WindowMenuButtonPosition", style.WindowMenuButtonPosition); - AddSetting(styleTable, "ChildRounding", style.ChildRounding); - AddSetting(styleTable, "ChildBorderSize", style.ChildBorderSize); - AddSetting(styleTable, "PopupRounding", style.PopupRounding); - AddSetting(styleTable, "PopupBorderSize", style.PopupBorderSize); - AddSetting(styleTable, "FramePadding", style.FramePadding); - AddSetting(styleTable, "FrameRounding", style.FrameRounding); - AddSetting(styleTable, "ItemSpacing", style.ItemSpacing); - AddSetting(styleTable, "ItemInnerSpacing", style.ItemInnerSpacing); - AddSetting(styleTable, "TouchExtraPadding", style.TouchExtraPadding); - AddSetting(styleTable, "IndentSpacing", style.IndentSpacing); - AddSetting(styleTable, "ColumnsMinSpacing", style.ColumnsMinSpacing); - AddSetting(styleTable, "ScrollbarSize", style.ScrollbarSize); - AddSetting(styleTable, "ScrollbarRounding", style.ScrollbarRounding); - AddSetting(styleTable, "GrabMinSize", style.GrabMinSize); - AddSetting(styleTable, "GrabRounding", style.GrabRounding); - AddSetting(styleTable, "TabRounding", style.TabRounding); - AddSetting(styleTable, "TabBorderSize", style.TabBorderSize); - AddSetting(styleTable, "ColorButtonPosition", style.ColorButtonPosition); - AddSetting(styleTable, "ButtonTextAlign", style.ButtonTextAlign); - AddSetting(styleTable, "SelectableTextAlign", style.SelectableTextAlign); - AddSetting(styleTable, "DisplayWindowPadding", style.DisplayWindowPadding); - AddSetting(styleTable, "DisplaySafeAreaPadding", style.DisplaySafeAreaPadding); - AddSetting(styleTable, "MouseCursorScale", style.MouseCursorScale); - AddSetting(styleTable, "AntiAliasedLines", style.AntiAliasedLines); - AddSetting(styleTable, "AntiAliasedFill", style.AntiAliasedFill); - AddSetting(styleTable, "CurveTessellationTol", style.CurveTessellationTol); - AddSetting(styleTable, "CircleSegmentMaxError", style.CircleSegmentMaxError); - AddSetting(styleTable, "Colors", style.Colors); - - // Windows - - var windowsArray = new TomlArrayNode(); - config.AddChild("Windows", windowsArray); - - for (var window in GetInstance()._editorLayer.[Friend]_editorWindows) + void AddSettingType(Dictionary parent, StringView name, ImGui.Vec4[(.) ImGui.Col.COUNT] vecArray) { - if (window.IsActive) - windowsArray.AddChild(new TomlValueNode(.String, window.Title)); + var str = new String(); + str.Append('['); + for (var vec in vecArray) + str.AppendF("[{}, {}, {}, {}], ", vec.x, vec.y, vec.z, vec.w); + str.RemoveFromEnd(2); + str.[Friend]Realloc(str.AllocSize); + str.Append("]"); + parent[name] = str; } + } + public static void LoadConfig() + { var configPath = scope String(); - SteelPath.GetEditorUserFile("Config.toml", configPath); + SteelPath.GetEditorUserFile("Config.txt", configPath); + var serialized = new String(); + if (File.ReadAllText(configPath, serialized) case .Err) + return; - var serialized = scope String(); - TomlSerializer.Write(config, serialized); + var config = new Dictionary(); - if (File.WriteAllText(configPath, serialized) case .Err) - Log.Error("Failed to save style"); + for (var line in serialized.Split('\n')) + { + if (line.IsWhiteSpace) + continue; - delete config; + var lineEnumerator = line.GetEnumerator(); + + var key = new String(); + for (var char in lineEnumerator) + { + if (char == '=') + break; + key.Append(char); + } + + key.Trim(); + + for (var char in lineEnumerator) + if (!char.IsWhiteSpace) + break; + + if (key == "Colors") + NOP!(); - void AddSetting(TomlTableNode parent, StringView name, float value) + var value = ParseValue(ref lineEnumerator); + if (value != null) + config[key] = value; + else + delete key; + } + + var style = ref ImGui.GetStyle(); + style.Alpha = (float) config["Alpha"]; + style.WindowPadding = GetVec2(config, "WindowPadding"); + style.WindowRounding = (float) config["WindowRounding"]; + style.WindowBorderSize = (float) config["WindowBorderSize"]; + style.WindowMinSize = GetVec2(config, "WindowMinSize"); + style.WindowTitleAlign = GetVec2(config, "WindowTitleAlign"); + style.WindowMenuButtonPosition = Enum.Parse((String) config["WindowMenuButtonPosition"]); + style.ChildRounding = (float) config["ChildRounding"]; + style.ChildBorderSize = (float) config["ChildBorderSize"]; + style.PopupRounding = (float) config["PopupRounding"]; + style.PopupBorderSize = (float) config["PopupBorderSize"]; + style.FramePadding = GetVec2(config, "FramePadding"); + style.FrameRounding = (float) config["FrameRounding"]; + style.ItemSpacing = GetVec2(config, "ItemSpacing"); + style.ItemInnerSpacing = GetVec2(config, "ItemInnerSpacing"); + style.TouchExtraPadding = GetVec2(config, "TouchExtraPadding"); + style.IndentSpacing = (float) config["IndentSpacing"]; + style.ColumnsMinSpacing = (float) config["ColumnsMinSpacing"]; + style.ScrollbarSize = (float) config["ScrollbarSize"]; + style.ScrollbarRounding = (float) config["ScrollbarRounding"]; + style.GrabMinSize = (float) config["GrabMinSize"]; + style.GrabRounding = (float) config["GrabRounding"]; + style.TabRounding = (float) config["TabRounding"]; + style.TabBorderSize = (float) config["TabBorderSize"]; + style.ColorButtonPosition = Enum.Parse((String) config["ColorButtonPosition"]); + style.ButtonTextAlign = GetVec2(config, "ButtonTextAlign"); + style.SelectableTextAlign = GetVec2(config, "SelectableTextAlign"); + style.DisplayWindowPadding = GetVec2(config, "DisplayWindowPadding"); + style.DisplaySafeAreaPadding = GetVec2(config, "DisplaySafeAreaPadding"); + style.MouseCursorScale = (float) config["MouseCursorScale"]; + style.AntiAliasedLines = (bool) config["AntiAliasedLines"]; + style.AntiAliasedFill = (bool) config["AntiAliasedFill"]; + style.CurveTessellationTol = (float) config["CurveTessellationTol"]; + style.CircleSegmentMaxError = (float) config["CircleSegmentMaxError"]; + GetColors(config, ref style.Colors); + + var windows = (List) config["Windows"]; + for (var window in windows) + ShowWindow((String) window); + + for (var value in config.Values) + DeleteObject(value); + DeleteDictionaryAndKeys!(config); + delete serialized; + + void DeleteObject(Object object) { - parent.AddChild(name).SetFloat(value); + if (object.GetType() == typeof(List)) + { + for (var item in (List) object) + DeleteObject(item); + } + delete object; } - void AddSetting(TomlTableNode parent, StringView name, bool value) + ImGui.Vec2 GetVec2(Dictionary config, String name) { - parent.AddChild(name).SetBool(value); + var list = (List) config[name]; + if (list.Count != 2) + return .(); + return .((float) list[0], (float) list[1]); } - void AddSetting(TomlTableNode parent, StringView name, ImGui.Vec2 value) + void GetColors(Dictionary config, ref ImGui.Vec4[(.) ImGui.Col.COUNT] colors) { - var array = parent.AddChild(name); - array.AddChild().SetFloat(value.x); - array.AddChild().SetFloat(value.y); + var list = (List) config["Colors"]; + for (int i = 0; i < (.) ImGui.Col.COUNT; i++) + { + var subList = (List) list[i]; + var vec = ImGui.Vec4((float) subList[0], (float) subList[1], (float) subList[2], (float) subList[3]); + colors[i] = vec; + } } - void AddSetting(TomlTableNode parent, StringView name, ImGui.Dir value) + Object ParseValue(ref Span.Enumerator enumerator) { - parent.AddChild(name).SetInt((int) value); + if (enumerator.Current == '[') + return ParseArray(ref enumerator); + else if (enumerator.Current.IsDigit) + return ParseNumber(ref enumerator); + else if (enumerator.Current.IsLetter) + return ParseString(ref enumerator); + return null; } - void AddSetting(TomlTableNode parent, StringView name, ImGui.Vec4[(.) ImGui.Col.COUNT] value) + Object ParseArray(ref Span.Enumerator enumerator) { - var array = parent.AddChild(name); - for (var vec in value) + var array = new List(); + for (var char in enumerator) { - var subArray = array.AddChild(); - subArray.AddChild().SetFloat(vec.w); - subArray.AddChild().SetFloat(vec.x); - subArray.AddChild().SetFloat(vec.y); - subArray.AddChild().SetFloat(vec.z); - } + if (char == ']') + break; + if (char == ',' || char == ' ') + continue; + var value = ParseValue(ref enumerator); + if (value != null) + array.Add(value); + } + return array; } - } - - public static Result LoadConfig() - { - // Deserializing the file causes a Stack overflow. TODO(RogueMacro): Fix BeefToml and remove this return statement - return .Err; - var configPath = scope String(); - SteelPath.GetEditorUserFile("Config.toml", configPath); - - if (!File.Exists(configPath)) - return .Err; - - if (TomlSerializer.ReadFile(configPath, GetInstance()._config) case .Err(let err)) + Object ParseNumber(ref Span.Enumerator enumerator) { - Log.Error("Could not load config: {}", err); - err.Dispose(); - return .Err; + enumerator.[Friend]mIndex--; + var str = scope String(); + for (var char in enumerator) + { + if (!char.IsDigit && char != '.') + break; + str.Append(char); + } + enumerator.[Friend]mIndex--; + + return new box float.Parse(str).Get(); } - return .Ok; + Object ParseString(ref Span.Enumerator enumerator) + { + enumerator.[Friend]mIndex--; + var str = new String(); + for (var char in enumerator) + { + if (!char.IsLetter) + break; + str.Append(char); + } + enumerator.[Friend]mIndex--; + + bool val; + if (str == "True") + val = true; + else if (str == "False") + val = false; + else + return str; + delete str; + return new box val; + } } } } diff --git a/Editor/src/EditorConfig.bf b/Editor/src/EditorConfig.bf deleted file mode 100644 index 2c21753..0000000 --- a/Editor/src/EditorConfig.bf +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections; -using imgui_beef; - -namespace SteelEditor -{ - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public class EditorConfig - { - public List Windows = new .() ~ delete _; - public ImGui.Style Style; - } -} diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index ac6cff7..d00acce 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -16,6 +16,18 @@ namespace SteelEditor private static bool _popItemID = false; private static uint _treeCount = 0; + // Window + + public static bool BeginWindow(StringView name, ref bool isActive) + { + return ImGui.Begin(name.Ptr, &isActive); + } + + public static void EndWindow() + { + ImGui.End(); + } + // Text public static void Text(StringView fmt, params Object[] args) diff --git a/Editor/src/EditorWindow.bf b/Editor/src/EditorWindow.bf index 446ac4a..841286c 100644 --- a/Editor/src/EditorWindow.bf +++ b/Editor/src/EditorWindow.bf @@ -19,10 +19,10 @@ namespace SteelEditor if (!IsActive) return; - if (ImGui.Begin(Title.Ptr, &IsActive, .None)) + if (EditorGUI.BeginWindow(Title, ref IsActive)) { OnRender(); - ImGui.End(); + EditorGUI.EndWindow(); } } diff --git a/Editor/src/Program.bf b/Editor/src/Program.bf index 21303c4..28001ce 100644 --- a/Editor/src/Program.bf +++ b/Editor/src/Program.bf @@ -1,5 +1,4 @@ using System; -using JetFistGames.Toml; namespace SteelEditor { @@ -7,12 +6,6 @@ namespace SteelEditor { public static int Main(String[] args) { - /*var serialized = scope String(); - var style = imgui_beef.ImGui.Style(); - TomlSerializer.Write(style, serialized); - - Console.WriteLine(serialized);*/ - var editor = new Editor(); editor.Run(); delete editor; diff --git a/Editor/src/Windows/StyleWindow.bf b/Editor/src/Windows/StyleWindow.bf index be9da2b..d506a4a 100644 --- a/Editor/src/Windows/StyleWindow.bf +++ b/Editor/src/Windows/StyleWindow.bf @@ -9,10 +9,11 @@ namespace SteelEditor.Windows public override void OnRender() { - ImGui.ShowStyleEditor(); - + EditorGUI.AlignFromRight(60); if (EditorGUI.Button("Save")) Editor.SaveConfig(); + + ImGui.ShowStyleEditor(); } } } diff --git a/Engine/src/Console/CVar.bf b/Engine/src/Console/CVar.bf index 13350f1..75c8e37 100644 --- a/Engine/src/Console/CVar.bf +++ b/Engine/src/Console/CVar.bf @@ -79,10 +79,10 @@ namespace SteelEngine.Console } - class EnumConsoleVar : ConsoleVar where TEnum: Enum + class EnumConsoleVar : ConsoleVar where TEnum : Enum { - public override int32 GetValueInt32() { return (*_value); } - public override int64 GetValueInt64() { return (*_value); } + public override int32 GetValueInt32() { return (int32) (*_value); } + public override int64 GetValueInt64() { return (int32) (*_value); } public override float GetValueFloat() { return (int)(*_value); } From 5debceb857c8d38755af552e774f927f7f02613f Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 22 Aug 2020 23:00:53 +0200 Subject: [PATCH 12/50] Removed submodules --- .gitmodules | 9 --------- Libs/BeefToml | 1 - Libs/GLFW | 1 - 3 files changed, 11 deletions(-) delete mode 160000 Libs/BeefToml delete mode 160000 Libs/GLFW diff --git a/.gitmodules b/.gitmodules index a9a7d63..1597ddc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,3 @@ -[submodule "GLFW"] - path = Libs/GLFW - url = https://github.com/MineGame159/glfw-beef [submodule "ImGui"] path = Libs/ImGui url = https://github.com/qzole/imgui-beef -[submodule "BGFX"] - path = Libs/BGFX - url = https://github.com/ExoKomodo/Bgfx-bf -[submodule "BeefToml"] - path = Libs/BeefToml - url = https://github.com/killamaaki/Beef-Toml diff --git a/Libs/BeefToml b/Libs/BeefToml deleted file mode 160000 index 7958a14..0000000 --- a/Libs/BeefToml +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7958a149f21d7031f11549386a584a76f774ed65 diff --git a/Libs/GLFW b/Libs/GLFW deleted file mode 160000 index 90eb5de..0000000 --- a/Libs/GLFW +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 90eb5de79b7c482b2eeb1700459b8b03072e5d5f From aae42a949354de59d3d77d816abacc0bd55fdbc7 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 22 Aug 2020 23:02:44 +0200 Subject: [PATCH 13/50] Removed additional non-submodule libraries --- BeefSpace.toml | 2 +- Libs/BGFX | 1 - Libs/Beef-Extensions-Lib/.gitignore | 3 - Libs/Beef-Extensions-Lib/BeefProj.toml | 6 - Libs/Beef-Extensions-Lib/LICENSE | 21 - Libs/Beef-Extensions-Lib/README.md | 17 - .../src/System/IO/PathExtensions.bf | 15 - .../System/Reflection/FieldInfoExtensions.bf | 10 - Libs/JSON_Beef/.gitignore | 3 - Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml | 12 - .../JSON_Beef_Test/json/valid_array.json | 48 - .../JSON_Beef_Test/json/valid_object.json | 32 - Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf | 70 -- Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf | 556 ------------ .../JSON_Beef/JSON_Beef_Test/src/TestClass.bf | 12 - Libs/JSON_Beef/LICENSE | 21 - Libs/JSON_Beef/README.md | 138 --- Libs/JSON_Beef/lib/BeefProj.toml | 13 - .../lib/src/Attributes/JSONAttributes.bf | 9 - .../lib/src/Serialization/JSONDeserializer.bf | 702 --------------- .../lib/src/Serialization/JSONSerializer.bf | 447 --------- Libs/JSON_Beef/lib/src/Types/JSONArray.bf | 197 ---- Libs/JSON_Beef/lib/src/Types/JSONDocument.bf | 849 ------------------ Libs/JSON_Beef/lib/src/Types/JSONObject.bf | 265 ------ .../lib/src/Util/AttributeChecker.bf | 15 - Libs/JSON_Beef/lib/src/Util/JSONUtil.bf | 266 ------ Libs/JSON_Beef/lib/src/Util/JSONValidator.bf | 442 --------- Libs/JSON_Beef/lib/src/Util/TypeChecker.bf | 36 - 28 files changed, 1 insertion(+), 4207 deletions(-) delete mode 160000 Libs/BGFX delete mode 100644 Libs/Beef-Extensions-Lib/.gitignore delete mode 100644 Libs/Beef-Extensions-Lib/BeefProj.toml delete mode 100644 Libs/Beef-Extensions-Lib/LICENSE delete mode 100644 Libs/Beef-Extensions-Lib/README.md delete mode 100644 Libs/Beef-Extensions-Lib/src/System/IO/PathExtensions.bf delete mode 100644 Libs/Beef-Extensions-Lib/src/System/Reflection/FieldInfoExtensions.bf delete mode 100644 Libs/JSON_Beef/.gitignore delete mode 100644 Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml delete mode 100644 Libs/JSON_Beef/JSON_Beef_Test/json/valid_array.json delete mode 100644 Libs/JSON_Beef/JSON_Beef_Test/json/valid_object.json delete mode 100644 Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf delete mode 100644 Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf delete mode 100644 Libs/JSON_Beef/JSON_Beef_Test/src/TestClass.bf delete mode 100644 Libs/JSON_Beef/LICENSE delete mode 100644 Libs/JSON_Beef/README.md delete mode 100644 Libs/JSON_Beef/lib/BeefProj.toml delete mode 100644 Libs/JSON_Beef/lib/src/Attributes/JSONAttributes.bf delete mode 100644 Libs/JSON_Beef/lib/src/Serialization/JSONDeserializer.bf delete mode 100644 Libs/JSON_Beef/lib/src/Serialization/JSONSerializer.bf delete mode 100644 Libs/JSON_Beef/lib/src/Types/JSONArray.bf delete mode 100644 Libs/JSON_Beef/lib/src/Types/JSONDocument.bf delete mode 100644 Libs/JSON_Beef/lib/src/Types/JSONObject.bf delete mode 100644 Libs/JSON_Beef/lib/src/Util/AttributeChecker.bf delete mode 100644 Libs/JSON_Beef/lib/src/Util/JSONUtil.bf delete mode 100644 Libs/JSON_Beef/lib/src/Util/JSONValidator.bf delete mode 100644 Libs/JSON_Beef/lib/src/Util/TypeChecker.bf diff --git a/BeefSpace.toml b/BeefSpace.toml index d6877e8..76bbb6c 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}} +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}} Locked = ["glfw-beef", "imgui-impl-opengl3", "imgui-impl-glfw", "imgui-beef"] [Workspace] diff --git a/Libs/BGFX b/Libs/BGFX deleted file mode 160000 index 2147829..0000000 --- a/Libs/BGFX +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2147829d5acf6d9b2ab49eca76ede804cd3797d5 diff --git a/Libs/Beef-Extensions-Lib/.gitignore b/Libs/Beef-Extensions-Lib/.gitignore deleted file mode 100644 index 7a4bc7e..0000000 --- a/Libs/Beef-Extensions-Lib/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build -BeefSpace.toml -BeefSpace_User.toml \ No newline at end of file diff --git a/Libs/Beef-Extensions-Lib/BeefProj.toml b/Libs/Beef-Extensions-Lib/BeefProj.toml deleted file mode 100644 index 8cd54a4..0000000 --- a/Libs/Beef-Extensions-Lib/BeefProj.toml +++ /dev/null @@ -1,6 +0,0 @@ -FileVersion = 1 - -[Project] -Name = "BeefExtensionsLib" -TargetType = "BeefLib" -StartupObject = "BeefExtensionsLib.Program" diff --git a/Libs/Beef-Extensions-Lib/LICENSE b/Libs/Beef-Extensions-Lib/LICENSE deleted file mode 100644 index 507bc67..0000000 --- a/Libs/Beef-Extensions-Lib/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Jonathan Racaud - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Libs/Beef-Extensions-Lib/README.md b/Libs/Beef-Extensions-Lib/README.md deleted file mode 100644 index 06a485e..0000000 --- a/Libs/Beef-Extensions-Lib/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Beef-Extensions-Lib -A library consisting of useful extensions for the Beef core lib types. - -Thanks to Beef's extension mechanism it is easy to add method to already defined types such as String, Path, List or other from the Beef corelib. -The goal of this library is to regroup useful extensions that Beef programers might frequently use. - -# Contributing -Contributions are welcomed and here are some rules to follow when adding new extensions: - -1. Add the extension inside the folder that follows the type's namespace. - - For example, the String type's namespace is *System* so its extension should live under the System folder. The Path type is under System.IO -so its extension should be located in the folder System.IO. -2. Create new folders following the namespace of the type you are extending. -2. The extension's file must follow the following naming convention TypeExtensions.bf - - The *String* extensions are inside the **StringExtensions.bf** file, the *Path* extensions inside the **PathExtensions.bf** file. -3. One file per type's extension - - The *String* extensions lives in the **StringExtensions.bf** file only. diff --git a/Libs/Beef-Extensions-Lib/src/System/IO/PathExtensions.bf b/Libs/Beef-Extensions-Lib/src/System/IO/PathExtensions.bf deleted file mode 100644 index a877ddb..0000000 --- a/Libs/Beef-Extensions-Lib/src/System/IO/PathExtensions.bf +++ /dev/null @@ -1,15 +0,0 @@ -namespace System.IO -{ - extension Path - { - public static void Join(StringView pathA, StringView pathB, String outPath) - { - if (pathA.IsNull || pathB.IsNull || (outPath == null)) - { - return; - } - outPath.Clear(); - outPath.AppendF("{}{}{}", pathA, Path.DirectorySeparatorChar, pathB); - } - } -} diff --git a/Libs/Beef-Extensions-Lib/src/System/Reflection/FieldInfoExtensions.bf b/Libs/Beef-Extensions-Lib/src/System/Reflection/FieldInfoExtensions.bf deleted file mode 100644 index 0b42177..0000000 --- a/Libs/Beef-Extensions-Lib/src/System/Reflection/FieldInfoExtensions.bf +++ /dev/null @@ -1,10 +0,0 @@ -namespace System.Reflection -{ - extension FieldInfo - { - public bool HasFieldFlag(FieldFlags flag) - { - return (*mFieldData).mFlags == flag; - } - } -} diff --git a/Libs/JSON_Beef/.gitignore b/Libs/JSON_Beef/.gitignore deleted file mode 100644 index 6de4014..0000000 --- a/Libs/JSON_Beef/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build/ -BeefSpace.toml -BeefSpace_User.toml \ No newline at end of file diff --git a/Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml b/Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml deleted file mode 100644 index d06388e..0000000 --- a/Libs/JSON_Beef/JSON_Beef_Test/BeefProj.toml +++ /dev/null @@ -1,12 +0,0 @@ -FileVersion = 1 -Dependencies = {corlib = "*", JSON_Beef = "*", BeefExtensionsLib = "*"} - -[Project] -Name = "JSON_Beef_Test" -StartupObject = "JSON_Beef_Test.Program" - -[Configs.Debug.Win64] -PostBuildCmds = ["Execute(\"powershell.exe -Command Copy-Item -Recurse -Force $(ProjectDir)/json $(TargetDir)\")"] - -[Configs.Test.Win64] -PostBuildCmds = ["Execute(\"powershell.exe -Command Copy-Item -Recurse -Force $(ProjectDir)/json $(TargetDir)\")"] diff --git a/Libs/JSON_Beef/JSON_Beef_Test/json/valid_array.json b/Libs/JSON_Beef/JSON_Beef_Test/json/valid_array.json deleted file mode 100644 index 86e6551..0000000 --- a/Libs/JSON_Beef/JSON_Beef_Test/json/valid_array.json +++ /dev/null @@ -1,48 +0,0 @@ -[ - [ - 42, - -42, - 1.8, - -1.8, - 1.8e+5, - 1.8e-5, - 42e7, - -42e7, - true, - false, - null, - "a string" - ], - { - "a int": 42, - "a negative int": -42, - "a float": 1.8, - "a negative float": -1.8, - "a float scientific notation number": 1.8e+42, - "a float negative scientific notation number": 1.8e-42, - "an int scientific notation number": 42e7, - "an int negative scientific notation number": -42e7, - "true": true, - "false": false, - "null": null, - "a string": "a string", - "escaped char in string": "line 1 \n\tline 2 \r\n\tline 2", - "an array": [ - 42, - -42, - 1.8, - -1.8, - 1.8e+5, - 1.8e-3, - 42e7, - -42e7, - true, - false, - null, - "a string" - ], - "an object": { - "hello": true - } - } -] \ No newline at end of file diff --git a/Libs/JSON_Beef/JSON_Beef_Test/json/valid_object.json b/Libs/JSON_Beef/JSON_Beef_Test/json/valid_object.json deleted file mode 100644 index 62d5821..0000000 --- a/Libs/JSON_Beef/JSON_Beef_Test/json/valid_object.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "a int": 42, - "a negative int": -42, - "a float": 1.8, - "a negative float": -1.8, - "a float scientific notation number": 1.8e+7, - "a float negative scientific notation number": 1.8e-12, - "an int scientific notation number": 42e7, - "an int negative scientific notation number": -42e3, - "true": true, - "false": false, - "null": null, - "a string": "a string", - "escaped char in string": "line 1 \n\tline 2 \r\n\tline 2", - "an array": [ - 42, - -42, - 1.8, - -1.8, - 1.8e+5, - 1.8e-3, - 42e7, - -42e7, - true, - false, - null, - "a string" - ], - "an object": { - "hello": true - } -} diff --git a/Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf b/Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf deleted file mode 100644 index a99c978..0000000 --- a/Libs/JSON_Beef/JSON_Beef_Test/src/Author.bf +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections; -using JSON_Beef.Attributes; - -namespace JSON_Beef_Test -{ - [AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - [Reflect] - public class Person - { - public String FirstName; - public String LastName; - - [IgnoreSerialize] - public int Age; - } - - [AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - [Reflect] - public class Author: Person - { - public int Id; - public float Test; - public bool Known; - public List Books = new List() ~ DeleteContainerAndItems!(_); - public List Publishers = new List() ~ DeleteContainerAndItems!(_); - - public this(String firstName = "", String lastName = "", int age = 0) - { - FirstName = firstName; - LastName = lastName; - Age = age; - } - } - - [AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - [Reflect] - public class Book - { - public String Name; - - public this(String name = "Book") - { - Name = new String(name); - } - - public ~this() - { - if (Name != null) - { - delete Name; - } - } - - public void Test() - { - - } - - public static bool operator==(Book a, Book b) - { - return a.Name.Equals(b.Name); - } - - public static bool operator!=(Book a, Book b) - { - return !(a == b); - } - } -} diff --git a/Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf b/Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf deleted file mode 100644 index da5dc9f..0000000 --- a/Libs/JSON_Beef/JSON_Beef_Test/src/Program.bf +++ /dev/null @@ -1,556 +0,0 @@ -using System; -using System.Collections; -using System.IO; -using JSON_Beef.Serialization; -using JSON_Beef.Util; -using JSON_Beef.Types; - -namespace JSON_Beef_Test -{ - // Todo: - // Fix memory leaks from JSONDeserializer and this program class. - class Program - { - static void Main() - { - Console.WriteLine("Test suit for JSON Beef."); - - Console.WriteLine("Testing validation rules:"); - - TestStringsValidation(); - TestNumbersValidation(); - TestLiteralsValidation(); - TestArraysValidation(); - TestObjectsValidation(); - TestJsonFileValidation(); - TestJsonUtil(); - TestJsonParsing(); - TestJsonSerializing(); - TestJsonDeserializing(); - - Console.WriteLine("Press any [enter] to exit."); - Console.In.Read(); - } - - [Test] - static void TestStringsValidation() - { - Test.Assert(JSONValidator.IsValidString("\"\""), "String Validation Test #1 failed"); - Test.Assert(JSONValidator.IsValidString("\"abcdefghijklmnopqrstuvwxyz1234567890-!@#$%^&*()_+[]{};:'?.><,/\""), "String Validation Test #2 failed"); - Test.Assert(JSONValidator.IsValidString("\"\r\n\t\f\b\u{0063}\""), "String Validation Test #3 failed"); - Test.Assert(JSONValidator.IsValidString("\"\a\"") == false, "String Validation Test #4 failed"); - - Console.WriteLine("Strings validation tests passed"); - } - - [Test] - static void TestNumbersValidation() - { - Test.Assert(JSONValidator.IsValidNumber("42"), "Numbers Validation Test #1 failed"); - Test.Assert(JSONValidator.IsValidNumber("-42"), "Numbers Validation Test #2 failed"); - Test.Assert(JSONValidator.IsValidNumber("4242"), "Numbers Validation Test #3 failed"); - Test.Assert(JSONValidator.IsValidNumber("-42.42"), "Numbers Validation Test #4 failed"); - Test.Assert(JSONValidator.IsValidNumber("42e3"), "Numbers Validation Test #5 failed"); - Test.Assert(JSONValidator.IsValidNumber("42e+3"), "Numbers Validation Test #6 failed"); - Test.Assert(JSONValidator.IsValidNumber("42e-3"), "Numbers Validation Test #7 failed"); - Test.Assert(JSONValidator.IsValidNumber("-42e3"), "Numbers Validation Test #8 failed"); - Test.Assert(JSONValidator.IsValidNumber("-42e+3"), "Numbers Validation Test #9 failed"); - Test.Assert(JSONValidator.IsValidNumber("-42e-3"), "Numbers Validation Test #10 failed"); - Test.Assert(JSONValidator.IsValidNumber("4.2e+3"), "Numbers Validation Test #11 failed"); - Test.Assert(JSONValidator.IsValidNumber("-4.2e+3"), "Numbers Validation Test #12 failed"); - Test.Assert(JSONValidator.IsValidNumber("4.2e+3.3") == false, "Numbers Validation Test #13 failed"); - Test.Assert(JSONValidator.IsValidNumber("4.2.3") == false, "Numbers Validation Test #14 failed"); - Test.Assert(JSONValidator.IsValidNumber("4.2e-3.3") == false, "Numbers Validation Test #15 failed"); - Test.Assert(JSONValidator.IsValidNumber("4.2e3.3") == false, "Numbers Validation Test #16 failed"); - Test.Assert(JSONValidator.IsValidNumber("4.2+3.3") == false, "Numbers Validation Test #17 failed"); - Test.Assert(JSONValidator.IsValidNumber("4.2-3.3") == false, "Numbers Validation Test #18 failed"); - Test.Assert(JSONValidator.IsValidNumber("--4.2") == false, "Numbers Validation Test #19 failed"); - Test.Assert(JSONValidator.IsValidNumber(".43") == false, "Numbers Validation Test #20 failed"); - Test.Assert(JSONValidator.IsValidNumber("e43") == false, "Numbers Validation Test #21 failed"); - Test.Assert(JSONValidator.IsValidNumber("-e43") == false, "Numbers Validation Test #22 failed"); - Test.Assert(JSONValidator.IsValidNumber("+e43") == false, "Numbers Validation Test #23 failed"); - Test.Assert(JSONValidator.IsValidNumber("+") == false, "Numbers Validation Test #24 failed"); - Test.Assert(JSONValidator.IsValidNumber("-") == false, "Numbers Validation Test #25 failed"); - Test.Assert(JSONValidator.IsValidNumber("e43") == false, "Numbers Validation Test #26 failed"); - Test.Assert(JSONValidator.IsValidNumber("\r\n\t\f\b\u{0063}") == false, "Numbers Validation Test #27 failed"); - Test.Assert(JSONValidator.IsValidNumber("true") == false, "Numbers Validation Test #28 failed"); - - Console.WriteLine("Numbers validation tests passed"); - } - - [Test] - static void TestLiteralsValidation() - { - Test.Assert(JSONValidator.IsValidLiteral("true"), "Literals Validation Test #1 failed"); - Test.Assert(JSONValidator.IsValidLiteral("false"), "Literals Validation Test #2 failed"); - Test.Assert(JSONValidator.IsValidLiteral("null"), "Literals Validation Test #3 failed"); - Test.Assert(JSONValidator.IsValidLiteral("test") == false, "Literals Validation Test #4 failed"); - Test.Assert(JSONValidator.IsValidLiteral("42") == false, "Literals Validation Test #5 failed"); - Test.Assert(JSONValidator.IsValidLiteral("[]") == false, "Literals Validation Test #6 failed"); - Test.Assert(JSONValidator.IsValidLiteral("{}") == false, "Literals Validation Test #7 failed"); - - Console.WriteLine("Literals validation tests passed"); - } - - [Test] - static void TestArraysValidation() - { - Test.Assert(JSONValidator.IsValidArray("[]"), "Arrays Validation Test #1 failed"); - Test.Assert(JSONValidator.IsValidArray("[42,\"toto\", true]"), "Arrays Validation Test #2 failed"); - Test.Assert(JSONValidator.IsValidArray("[{}]"), "Arrays Validation Test #3 failed"); - Test.Assert(JSONValidator.IsValidArray("[[]]"), "Arrays Validation Test #4 failed"); - Test.Assert(JSONValidator.IsValidArray("[,,,,]") == false, "Arrays Validation Test #5 failed"); - Test.Assert(JSONValidator.IsValidArray("[,]") == false, "Arrays Validation Test #6 failed"); - Test.Assert(JSONValidator.IsValidArray("[42,]") == false, "Arrays Validation Test #7 failed"); - Test.Assert(JSONValidator.IsValidArray("[{}") == false, "Arrays Validation Test #8 failed"); - Test.Assert(JSONValidator.IsValidArray("[") == false, "Arrays Validation Test #9 failed"); - Test.Assert(JSONValidator.IsValidArray("[\"t") == false, "Arrays Validation Test #10 failed"); - - Console.WriteLine("Arrays validation tests passed"); - } - - [Test] - static void TestObjectsValidation() - { - Test.Assert(JSONValidator.IsValidObject("{}"), "Objects Validation Test #1 failed"); - Test.Assert(JSONValidator.IsValidObject("{\"key\":\"a string value\", \"another key\": 42}"), "Objects Validation Test #2 failed"); - Test.Assert(JSONValidator.IsValidObject("{\"key\":[], \"another key\": {}}"), "Objects Validation Test #3 failed"); - Test.Assert(JSONValidator.IsValidObject("{\"key\":\"a string value\", \"another key\":}") == false, "Objects Validation Test #4 failed"); - Test.Assert(JSONValidator.IsValidObject("{\"key\":\"a string value\", 'another key': 42") == false, "Objects Validation Test #5 failed"); - Test.Assert(JSONValidator.IsValidObject("{\"key\":\"a string value\", \"another key") == false, "Objects Validation Test #6 failed"); - - Console.WriteLine("Objects validation tests passed"); - } - - [Test] - static void TestJsonFileValidation() - { - var data = scope String(); - var gotData = GetValidArrayData(data); - - if (gotData) - { - Test.Assert(JSONValidator.IsValidJson(data), "Json file validation test #1 failed"); - } - else - { - Test.Assert(false, "Failed loading array data"); - } - - gotData = GetValidObjectData(data); - if (gotData) - { - Test.Assert(JSONValidator.IsValidJson(data), "Json file validation test #2 failed"); - } - else - { - Test.Assert(false, "Failed loading object data"); - } - - Console.WriteLine("Json file validation tests passed"); - } - - static bool GetValidArrayData(String outData) - { - outData.Clear(); - var exePath = scope String(); - Environment.GetExecutableFilePath(exePath); - - var dir = scope String(); - Path.GetDirectoryPath(exePath, dir); - - var file = scope String(); - Path.Join(dir, "json\\valid_array.json", file); - - let sr = scope StreamReader(); - let isOpened = sr.Open(file); - - switch (isOpened) - { - case .Err(.NotFile), .Err(.NotFound), .Err(.SharingViolation), .Err(.Unknown): - sr.Dispose(); - return false; - default: - sr.ReadToEnd(outData); - sr.Dispose(); - return true; - } - } - - static bool GetValidObjectData(String outData) - { - outData.Clear(); - var exePath = scope String(); - Environment.GetExecutableFilePath(exePath); - - var dir = scope String(); - Path.GetDirectoryPath(exePath, dir); - - var file = scope String(); - Path.Join(dir, "json\\valid_object.json", file); - - let sr = scope StreamReader(); - let isOpened = sr.Open(file); - - switch (isOpened) - { - case .Err(.NotFile), .Err(.NotFound), .Err(.SharingViolation), .Err(.Unknown): - sr.Dispose(); - return false; - default: - sr.ReadToEnd(outData); - sr.Dispose(); - return true; - } - } - - [Test] - static void TestJsonUtil() - { - Test.Assert(JSONUtil.ParseNumber("42") == (uint)42, "JSONUtil test #1 failed"); - Test.Assert(JSONUtil.ParseNumber("42e5") == (uint64)4200000, "JSONUtil test #2 failed"); - Test.Assert(JSONUtil.ParseNumber("-42e3") == -42000, "JSONUtil test #3 failed"); - - var res = JSONUtil.ParseNumber("4.2"); - Test.Assert(ValidError(ref res), "JSONUtil test #4 failed"); - - res = JSONUtil.ParseNumber("42e-3"); - Test.Assert(ValidError(ref res), "JSONUtil test #5 failed"); - - Test.Assert(JSONUtil.ParseNumber("42").Value.Equals(42f), "JSONUtil test #6 failed"); - Test.Assert(JSONUtil.ParseNumber("-42").Value.Equals(-42f), "JSONUtil test #7 failed"); - Test.Assert(JSONUtil.ParseNumber("4.2").Value.Equals(4.2f), "JSONUtil test #8 failed"); - Test.Assert(JSONUtil.ParseNumber("-4.2").Value.Equals(-4.2f), "JSONUtil test #9 failed"); - Test.Assert(JSONUtil.ParseNumber("42e3").Value.Equals(42000f), "JSONUtil test #10 failed"); - Test.Assert(JSONUtil.ParseNumber("-42e3").Value.Equals(-42000f), "JSONUtil test #11 failed"); - Test.Assert(JSONUtil.ParseNumber("4.2e3").Value.Equals(4200f), "JSONUtil test #12 failed"); - Test.Assert(JSONUtil.ParseNumber("-4.2e3").Value.Equals(-4200f), "JSONUtil test #13 failed"); - Test.Assert(JSONUtil.ParseNumber("4.2e-3").Value.Equals(0.0042f), "JSONUtil test #14 failed"); - Test.Assert(JSONUtil.ParseNumber("-4.2e-3").Value.Equals(-0.0042f), "JSONUtil test #15 failed"); - - Test.Assert(JSONUtil.ParseNumber("42").Value.Equals(42), "JSONUtil test #6 failed"); - Test.Assert(JSONUtil.ParseNumber("-42").Value.Equals(-42), "JSONUtil test #7 failed"); - Test.Assert(JSONUtil.ParseNumber("4.2").Value.Equals(4.2), "JSONUtil test #8 failed"); - Test.Assert(JSONUtil.ParseNumber("-4.2").Value.Equals(-4.2), "JSONUtil test #9 failed"); - Test.Assert(JSONUtil.ParseNumber("42e3").Value.Equals(42000), "JSONUtil test #10 failed"); - Test.Assert(JSONUtil.ParseNumber("-42e3").Value.Equals(-42000), "JSONUtil test #11 failed"); - Test.Assert(JSONUtil.ParseNumber("4.2e3").Value.Equals(4200), "JSONUtil test #12 failed"); - Test.Assert(JSONUtil.ParseNumber("-4.2e3").Value.Equals(-4200), "JSONUtil test #13 failed"); - Test.Assert(JSONUtil.ParseNumber("4.2e-3").Value.Equals(0.0042), "JSONUtil test #14 failed"); - Test.Assert(JSONUtil.ParseNumber("-4.2e-3").Value.Equals(-0.0042), "JSONUtil test #15 failed"); - - Test.Assert(JSONUtil.ParseBool("true") == true, "JSONUtil test #16 failed"); - Test.Assert(JSONUtil.ParseBool("false") == false, "JSONUtil test #16 failed"); - Test.Assert(JSONUtil.ParseBool("null") == .Err(.INVALID_LITERAL_VALUE), "JSONUtil test #16 failed"); - - Console.WriteLine("JSONUtil tests passed"); - } - - static bool ValidError(ref Result res) - { - switch (res) - { - case .Err(.INVALID_NUMBER_REPRESENTATION): - return true; - default: - return false; - } - } - - static void TestJsonParsing() - { - var data = scope String(); - var gotData = GetValidArrayData(data); - - if (gotData) - { - let doc = scope JSONDocument(); - if (JSONValidator.IsValidJson(data) && (doc.GetJsonType(data) == .ARRAY)) - { - let array = doc.ParseArray(data); - ValidateArrayFile(array); - delete array.Get(); - } - } - - gotData = GetValidObjectData(data); - - if (gotData) - { - let doc = scope JSONDocument(); - if (JSONValidator.IsValidJson(data) && (doc.GetJsonType(data) == .OBJECT)) - { - let object = doc.ParseObject(data); - ValidateObject(object); - delete object.Get(); - } - } - - Console.WriteLine("JSON Parsing tests passed"); - } - - static void ValidateArrayFile(JSONArray array) - { - ValidateFirstArray(array); - ValidateObject(array); - } - - static void ValidateFirstArray(JSONArray array) - { - var arr = array.Get(0); - Test.Assert(IsValidType(ref arr), "JSON Parsing failed: Invalid type first value in array"); - let v = arr.Get(); - - Test.Assert(v.Count == 12, "JSON Parsing failed: invalid count in first array"); - Test.Assert(IsValidTypeAndValue(v, 0, 42), "JSON Parsing failed: array invalid type or value #1"); - Test.Assert(IsValidTypeAndValue(v, 1, -42), "JSON Parsing failed: array invalid type or value #2"); - Test.Assert(IsValidTypeAndValue(v, 2, 1.8f), "JSON Parsing failed: array invalid type or value #3"); - Test.Assert(IsValidTypeAndValue(v, 3, -1.8f), "JSON Parsing failed: array invalid type or value #4"); - Test.Assert(IsValidTypeAndValue(v, 4, 1.8e5f), "JSON Parsing failed: array invalid type or value #5"); - Test.Assert(IsValidTypeAndValue(v, 5, 1.8e-5f), "JSON Parsing failed: array invalid type or value #6"); - Test.Assert(IsValidTypeAndValue(v, 6, 420000000), "JSON Parsing failed: array invalid type or value #7"); - Test.Assert(IsValidTypeAndValue(v, 7, -420000000), "JSON Parsing failed: array invalid type or value #8"); - Test.Assert(IsValidTypeAndValue(v, 8, true), "JSON Parsing failed: array invalid type or value #9"); - Test.Assert(IsValidTypeAndValue(v, 9, false), "JSON Parsing failed: array invalid type or value #10"); - Test.Assert(IsValidTypeAndValue(v, 10, null), "JSON Parsing failed: array invalid type or value #11"); - Test.Assert(IsValidTypeAndValue(v, 11, "a string"), "JSON Parsing failed: array invalid type or value #12"); - } - - static void ValidateObject(JSONArray array) - { - var obj = array.Get(1); - Test.Assert(IsValidType(ref obj), "JSON Parsing failed: Invalid type second value in array"); - let v = obj.Get(); - - Test.Assert(IsValidTypeAndValue(v, "a int", 42), "JSON Parsing failed: object invalid type or value #1"); - Test.Assert(IsValidTypeAndValue(v, "a negative int", -42), "JSON Parsing failed: object invalid type or value #2"); - Test.Assert(IsValidTypeAndValue(v, "a float", 1.8f), "JSON Parsing failed: object invalid type or value #3"); - Test.Assert(IsValidTypeAndValue(v, "a negative float", -1.8f), "JSON Parsing failed: object invalid type or value #4"); - Test.Assert(IsValidTypeAndValue(v, "a float scientific notation number", 1.8e42f), "JSON Parsing failed: object invalid type or value #5"); - Test.Assert(IsValidTypeAndValue(v, "a float negative scientific notation number", 1.8e-42f), "JSON Parsing failed: object invalid type or value #6"); - Test.Assert(IsValidTypeAndValue(v, "an int scientific notation number", 420000000), "JSON Parsing failed: object invalid type or value #7"); - Test.Assert(IsValidTypeAndValue(v, "an int negative scientific notation number", -420000000), "JSON Parsing failed: object invalid type or value #8"); - Test.Assert(IsValidTypeAndValue(v, "true", true), "JSON Parsing failed: object invalid type or value #9"); - Test.Assert(IsValidTypeAndValue(v, "false", false), "JSON Parsing failed: object invalid type or value #10"); - Test.Assert(IsValidTypeAndValue(v, "null", null), "JSON Parsing failed: object invalid type or value #11"); - Test.Assert(IsValidTypeAndValue(v, "a string", "a string"), "JSON Parsing failed: object invalid type or value #12"); - Test.Assert(IsValidTypeAndValue(v, "escaped char in string", "line 1 \n\tline 2 \r\n\tline 2"), "JSON Parsing failed: object invalid type or value #13"); - - var arr = v.Get("an array"); - Test.Assert(IsValidType(ref arr), "JSON Parsing failed: object invalid type or value #14"); - ValidateArray(arr); - - var anotherObj = v.Get("an object"); - Test.Assert(IsValidType(ref anotherObj), "JSON Parsing failed: object invalid type or value #15"); - Test.Assert(IsValidTypeAndValue(anotherObj, "hello", true), "JSON Parsing failed: object invalid type or value #16"); - } - - static void ValidateObject(JSONObject v) - { - Test.Assert(IsValidTypeAndValue(v, "a int", 42), "JSON Parsing failed: object invalid type or value #1"); - Test.Assert(IsValidTypeAndValue(v, "a negative int", -42), "JSON Parsing failed: object invalid type or value #2"); - Test.Assert(IsValidTypeAndValue(v, "a float", 1.8f), "JSON Parsing failed: object invalid type or value #3"); - Test.Assert(IsValidTypeAndValue(v, "a negative float", -1.8f), "JSON Parsing failed: object invalid type or value #4"); - Test.Assert(IsValidTypeAndValue(v, "a float scientific notation number", 1.8e7f), "JSON Parsing failed: object invalid type or value #5"); - Test.Assert(IsValidTypeAndValue(v, "a float negative scientific notation number", 1.8e-12f), "JSON Parsing failed: object invalid type or value #6"); - Test.Assert(IsValidTypeAndValue(v, "an int scientific notation number", 420000000), "JSON Parsing failed: object invalid type or value #7"); - Test.Assert(IsValidTypeAndValue(v, "an int negative scientific notation number", -42000), "JSON Parsing failed: object invalid type or value #8"); - Test.Assert(IsValidTypeAndValue(v, "true", true), "JSON Parsing failed: object invalid type or value #9"); - Test.Assert(IsValidTypeAndValue(v, "false", false), "JSON Parsing failed: object invalid type or value #10"); - Test.Assert(IsValidTypeAndValue(v, "null", null), "JSON Parsing failed: object invalid type or value #11"); - Test.Assert(IsValidTypeAndValue(v, "a string", "a string"), "JSON Parsing failed: object invalid type or value #12"); - Test.Assert(IsValidTypeAndValue(v, "escaped char in string", "line 1 \n\tline 2 \r\n\tline 2"), "JSON Parsing failed: object invalid type or value #13"); - - var arr = v.Get("an array"); - Test.Assert(IsValidType(ref arr), "JSON Parsing failed: object invalid type or value #14"); - ValidateArray(arr); - - var anotherObj = v.Get("an object"); - Test.Assert(IsValidType(ref anotherObj), "JSON Parsing failed: object invalid type or value #15"); - Test.Assert(IsValidTypeAndValue(anotherObj, "hello", true), "JSON Parsing failed: object invalid type or value #16"); - } - - static void ValidateArray(JSONArray v) - { - Test.Assert(v.Count == 12, "JSON Parsing failed: invalid count in array"); - Test.Assert(IsValidTypeAndValue(v, 0, 42), "JSON Parsing failed: array invalid type or value #17"); - Test.Assert(IsValidTypeAndValue(v, 1, -42), "JSON Parsing failed: array invalid type or value #18"); - Test.Assert(IsValidTypeAndValue(v, 2, 1.8f), "JSON Parsing failed: array invalid type or value #19"); - Test.Assert(IsValidTypeAndValue(v, 3, -1.8f), "JSON Parsing failed: array invalid type or value #20"); - Test.Assert(IsValidTypeAndValue(v, 4, 1.8e5f), "JSON Parsing failed: array invalid type or value #21"); - Test.Assert(IsValidTypeAndValue(v, 5, 1.8e-3f), "JSON Parsing failed: array invalid type or value #22"); - Test.Assert(IsValidTypeAndValue(v, 6, 420000000), "JSON Parsing failed: array invalid type or value #23"); - Test.Assert(IsValidTypeAndValue(v, 7, -420000000), "JSON Parsing failed: array invalid type or value #24"); - Test.Assert(IsValidTypeAndValue(v, 8, true), "JSON Parsing failed: array invalid type or value #25"); - Test.Assert(IsValidTypeAndValue(v, 9, false), "JSON Parsing failed: array invalid type or value #26"); - Test.Assert(IsValidTypeAndValue(v, 10, null), "JSON Parsing failed: array invalid type or value #27"); - Test.Assert(IsValidTypeAndValue(v, 11, "a string"), "JSON Parsing failed: array invalid type or value #28"); - } - - static bool IsValidType(ref Result res) - { - switch (res) - { - case .Err(.INDEX_OUT_OF_BOUNDS), .Err(.INVALID_RETURN_TYPE): - return false; - default: - return true; - } - } - - static bool IsValidTypeAndValue(JSONArray a, int idx, T value) - { - var v = a.Get(idx); - - var isValidType = IsValidType(ref v); - var isValidValue = (v.Get() == value); - - return (isValidType && isValidValue); - } - - static bool IsValidTypeAndValue(JSONObject o, String key, T value) - { - var v = o.Get(key); - - var isValidType = IsValidType(ref v); - var isValidValue = (v.Get() == value); - - return (isValidType && isValidValue); - } - - [Test] - static void TestJsonSerializing() - { - let author = scope Author("Jonathan", "Racaud", 25); - author.Id = 1; - author.Test = 25.4f; - author.Known = false; - author.Publishers.Add(new String("GoldenBooks")); - author.Publishers.Add(new String("AncientBooks")); - author.Publishers.Add(new String("NewBooks")); - author.Books.Add(new Book("The Art of War")); - author.Books.Add(new Book("Flowers for Algernon")); - author.Books.Add(new Book("Another book")); - - //let finalStr = "{\"FirstName\":\"Jonathan\",\"LastName\":\"Racaud\",\"Id\":1,\"Test\":25.4,\"Books\":[{\"Name\":\"The Art of War\"},{\"Name\":\"Flowers for Algernon\"},{\"Name\":\"Another book\"}],\"Publishers\":[\"GoldenBooks\",\"AncientBooks\",\"NewBooks\"]}"; - - let resObj = JSONSerializer.Serialize(author); - - if (resObj != .Err) - { - let json = resObj.Value; - let str = scope String(); - - json.ToString(str); - - let deserializedAuthor = scope Author(); - let res = JSONDeserializer.Deserialize(str, deserializedAuthor); - - switch (res) - { - case .Err(let err): - Test.Assert(false, "JSON Serializing failed #1"); - case .Ok(let val): - Test.Assert(ObjectsMatch(author, deserializedAuthor), "JSON Serializing failed #2"); - } - - delete json; - } - - /// Need to find a way to reliably test serializing works when serializing to String. - /// Especially because of the float that can have representation different than the set value. - /*let resStr = JSONSerializer.Serialize(author); - - if (resStr != .Err) - { - Test.Assert(resStr.Value.Equals(finalStr), "JSON Serializing failed #1"); - delete resStr.Value; - }*/ - - Console.WriteLine("JSONSerializing tests passed"); - } - - [Test] - static void TestJsonDeserializing() - { - let json = "{\"Id\": 256, \"Test\": 4.2, \"Known\": false, \"FirstName\":\"Jonathan\",\"LastName\":\"Racaud\",\"Books\":[{\"Name\":\"The Art of War\"},{\"Name\":\"Flowers for Algernon\"},{\"Name\":\"Another book\"}],\"Publishers\":[\"GoldenBooks\",\"AncientBooks\",\"NewBooks\"]}"; - let author = scope Author("Jonathan", "Racaud", 25); - author.Id = 256; - author.Test = 4.2f; - author.Known = false; - author.Publishers.Add(new String("GoldenBooks")); - author.Publishers.Add(new String("AncientBooks")); - author.Publishers.Add(new String("NewBooks")); - author.Books.Add(new Book("The Art of War")); - author.Books.Add(new Book("Flowers for Algernon")); - author.Books.Add(new Book("Another book")); - - let deserializedAuthor = scope Author(); - var res = JSONDeserializer.Deserialize(json, deserializedAuthor); - - switch (res) - { - case .Err(let err): - Test.Assert(false, "JSON Deserializing failed #1"); - case .Ok: - Test.Assert(ObjectsMatch(author, deserializedAuthor), "JSON Deserializing failed #1"); - } - - let deserializedTest = scope TestClass(); - let jsonTest = "{\"MultipleList\": [[\"1\", \"2\"], [\"3\", \"4\"], [\"5\", \"6\"]]}"; - res = JSONDeserializer.Deserialize(jsonTest, deserializedTest); - - switch (res) - { - case .Err(let err): - Test.Assert(false, "JSON Deserializing failed #2"); - case .Ok: - Test.Assert(deserializedTest.MultipleList.Count == 3, "JSON Deserializing failed #2"); - } - - Console.WriteLine("JSONDeserializing tests passed"); - } - - static bool ObjectsMatch(Author a, Author b) - { - if ((a.FirstName != b.FirstName) || - ((a.LastName != b.LastName)) || - (a.Publishers.Count != b.Publishers.Count) || - (a.Books.Count != b.Books.Count) || - (a.Id != b.Id) || - !a.Test.Equals(b.Test) || - (a.Known != b.Known)) - { - return false; - } - - var missingBooks = a.Books.Count; - for (int i = 0; i < a.Books.Count; i++) - { - for (int j = 0; j < b.Books.Count; j++) - { - if (b.Books[j] == a.Books[i]) - { - missingBooks--; - break; - } - } - } - - var missingPublishers = a.Publishers.Count; - for (int i = 0; i < a.Publishers.Count; i++) - { - for (int j = 0; j < b.Publishers.Count; j++) - { - if (b.Publishers[j] == a.Publishers[i]) - { - missingPublishers--; - break; - } - } - } - - return ((missingBooks == 0) && (missingPublishers == 0)); - } - } -} diff --git a/Libs/JSON_Beef/JSON_Beef_Test/src/TestClass.bf b/Libs/JSON_Beef/JSON_Beef_Test/src/TestClass.bf deleted file mode 100644 index f76440a..0000000 --- a/Libs/JSON_Beef/JSON_Beef_Test/src/TestClass.bf +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections; - -namespace JSON_Beef_Test -{ - [AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - [Reflect] - public class TestClass - { - public List> MultipleList = new List>(); - } -} diff --git a/Libs/JSON_Beef/LICENSE b/Libs/JSON_Beef/LICENSE deleted file mode 100644 index 507bc67..0000000 --- a/Libs/JSON_Beef/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Jonathan Racaud - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Libs/JSON_Beef/README.md b/Libs/JSON_Beef/README.md deleted file mode 100644 index 161dafc..0000000 --- a/Libs/JSON_Beef/README.md +++ /dev/null @@ -1,138 +0,0 @@ -# JSON_Beef -A JSON parser library made in the Beef programming language. - -Still a work in progress. - -Todo: -- JSON String parsing: - - Handle unescaped characters in strings as error. - - Parse UTF-8 characters e.g.: u0063. -- Object deserialization: - - Create and add to a List object through reflection. - -## Project organization -This repository consist of two distinct folders: -- JSON_Beef_Test: A program to test the objects and methods from the JSON_Beef lib. -- lib: The JSON_Beef library. - -The JSON_Beef library depends on the Beef Extensions Library that can be found here: [Beef Extensions Library](https://github.com/Jonathan-Racaud/Beef-Extensions-Lib). - -## How to use JSON Beef - -**Adding JSON_Beef to your project:** -1. Clone the Beef Extensions Library in the location of your choice. -2. Clone the JSON_Beef library in the location of your choice. -3. In Beef IDE, right click on Workspace->Add existing project. -4. Select the BeefProj.toml file ffrom the JSON_Beef project. -5. Repeat step 3 and 4 for the Beef Extensions Library. -6. Open your project's properties. -7. Go to General->Dependencies -8. Tick JSON_Beef (you can also tick Beef Extensions Library, but it should be added as dependencies automatically when building). -9. You can now start using the library. - - -**Using the library:** -JSON_Beef consists of several objects to manipulate JSON data: -- JSONDocument: Used to validate and parse a JSON String into either a **JSONObject** or a **JSONArray** -- JSONObject: Class representing a JSON Object. -- JSONArray: Class representing a JSON Array. -- JSONValidator: Class implementing the JSON specification validation rules. -- JSONUtil: Utility class for working with certain aspect of the JSON specification. -- JSONSerializer: Class serializing an Object into either a **JSONObject** a **JSONArray** or **String** object. -- JSONDeserializer: Class deserializing a JSON String into an Object of the specified type **(Work in progress)** -- JsonList: Class inheriting from List to allow Deserialization of JSON Lists into a List like class. This class does not provided more methods than a List. Its only use is for being able to find the *Add* method through reflection. - -**Validating a JSON String:** -```c# -JSONValidator.IsValidJson(jsonString); -``` - -**Parsing a JSON String into a JSONArray:** -```c# -let doc = scope JSONDocument(); -if (JSONValidator.IsValidJson(data) && (doc.GetJsonType(data) == .ARRAY)) -{ - let array = doc.ParseArray(data); - - // Work with the JSONArray object. - - // You are responsible for the deletion of the JSONArray. - delete array.Get(); -} -``` - -**Parsing a JSON String into a JSON Object:** -```c# -let doc = scope JSONDocument(); -if (JSONValidator.IsValidJson(data) && (doc.GetJsonType(data) == .OBJECT)) -{ - let array = doc.ParseObject(data); - - // Work with the JSONAObject object. - - // You are responsible for the deletion of the JSONObject. - delete array.Get(); -} -``` - -**Serializing a user defined class:** -Serializing a user defined class uses reflection so in order for it to work, you must declare your class like so: -```c# -[AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] // Allows for the type to be created via reflection (used by the Deserializer). -[Reflect] // Allows for the type's fields to be discoverable via reflection in order to serialize them. -public class CustomClass -{ - // public fields will be automatically serialized. - public String Name; - - // This attributes allows for ignoring fields. - [IgnoreSerialize] - public String IgnoredField; - - // Private fields are ignored. - private int mRandomId; -} -``` - -You can then use the JSONSerializer class like so: -```c# -let jsonObject = JSONSerializer.Serialize(object); -let jsonArray = JSONSerializer.Serialize(object); -let str = JSONSerializer.Serialize(object); -``` - -**Deserializing a user defined class (Work in progress):** -In order to deserialize a user defined type, it must be marked with the following attributes: -```c# -[AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] // Allows for the type to be created via reflection (used by the Deserializer). -[Reflect] // Allows for the type's fields to be discoverable via reflection in order to serialize them. -``` - -Now you can deserialize a JSON string into your CustomClass using JSONDeserializer: -```c# -let customClass = JSONDeserializer.Deserialize(json); -``` - -Due to a limitation with the Beef language that do not provide by default reflection for the List type nor a way to add it without modifying the language (from my knowledge), you need to use the JsonList type which is a thin wrapper around the List type providing the necessary reflection capabilities for the Deserialization to work with Lists. - -In the future, if the language allows reflection for its List type, then the JsonList class shall be removed. - -For more examples about how to use the library you can look at the JSON_Beef_Test project. - -## Important notes -- The JSON_Beef library can only serialize ```List``` or ```JsonList``` types into JSONArray and only deserialize a JSON array into a ```JsonList```. -- Because the ```List``` type does not provides its method through reflection, the JSONDeserializer cannot successfully deserialize a JSON Array into its corresponding field of type ```List```. While waiting for a better way of doing it, the ```JsonList``` has been added. See the issue [Working with lists](https://github.com/Jonathan-Racaud/JSON_Beef/issues/2) for more information. -- When deserializing into a user defined type, the keys inside the JSON object string representation must match the field's name as declared (case sensitive): - -```c# -public class Person -{ - public String FirstName; -} - -let wrongJson = "{\"Firstname\": \"Jonathan\"}"; -let person = JSONDeserialize(wrongJson); // Will not yield expected results because the type Person doesn't have a field named: Firstname. - -let rightJson = "{\"FirstName\": \"Jonathan\"}"; -let person = JSONDeserialize(rightJson); // the person object will successfully be serialized. -``` diff --git a/Libs/JSON_Beef/lib/BeefProj.toml b/Libs/JSON_Beef/lib/BeefProj.toml deleted file mode 100644 index 8fa0a51..0000000 --- a/Libs/JSON_Beef/lib/BeefProj.toml +++ /dev/null @@ -1,13 +0,0 @@ -FileVersion = 1 -Dependencies = {corlib = "*", corlib = "*", BeefExtensionsLib = "*"} - -[Project] -Name = "JSON_Beef" - -[[Project.DistinctOptions]] -Filter = "System.Collections.List<*>" -ReflectAlwaysInclude = "IncludeAll" -ReflectStaticMethods = true -ReflectNonStaticMethods = true -ReflectConstructors = true -ReflectMethodFilter = "__BfCtor; Add" diff --git a/Libs/JSON_Beef/lib/src/Attributes/JSONAttributes.bf b/Libs/JSON_Beef/lib/src/Attributes/JSONAttributes.bf deleted file mode 100644 index a6c89ae..0000000 --- a/Libs/JSON_Beef/lib/src/Attributes/JSONAttributes.bf +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace JSON_Beef.Attributes -{ - [AttributeUsage(.Field | .Property, .ReflectAttribute, ReflectUser=.All)] - public struct IgnoreSerializeAttribute: Attribute - { - } -} diff --git a/Libs/JSON_Beef/lib/src/Serialization/JSONDeserializer.bf b/Libs/JSON_Beef/lib/src/Serialization/JSONDeserializer.bf deleted file mode 100644 index f06ef59..0000000 --- a/Libs/JSON_Beef/lib/src/Serialization/JSONDeserializer.bf +++ /dev/null @@ -1,702 +0,0 @@ -using System; -using System.Collections; -using System.Reflection; -using JSON_Beef.Types; -using JSON_Beef.Util; - -namespace JSON_Beef.Serialization -{ - public static class JSONDeserializer - { - public enum DESERIALIZE_ERRORS - { - JSON_NOT_MATCHING_OBJECT, - ERROR_PARSING, - CANNOT_ASSIGN_VALUE, - FIELD_NOT_FOUND, - INVALID_FIELD_TYPE, - INVALID_JSON, - OBJECT_IS_NULL, - CANNOT_ASSIGN_LIST_TO_OBJECT - } - - public static Result Deserialize(String jsonString, T object) - { - if (!JSONValidator.IsValidJson(jsonString)) - { - return .Err(.INVALID_JSON); - } - - if (object == null) - { - return .Err(.OBJECT_IS_NULL); - } - - let doc = scope JSONDocument(); - - switch (doc.GetJsonType(jsonString)) - { - case .OBJECT: - var jsonObject = scope JSONObject(); - doc.ParseObject(jsonString, ref jsonObject); - - if (!AreTypeMatching(jsonObject, object)) - { - return .Err(.JSON_NOT_MATCHING_OBJECT); - } - - return DeserializeObject(jsonObject, object); - case .ARRAY: - var jsonArray = scope JSONArray(); - doc.ParseArray(jsonString, ref jsonArray); - - return DeserializeArray(jsonArray, object); - case .UNKNOWN: - return .Err(.INVALID_JSON); - } - } - - // The object corresponds to the jsonObject - // e.g.: jsonArray => {"Key": "Value"} -- object => CustomObject - private static Result DeserializeObject(JSONObject jsonObject, Object object) - { - if (object == null) - { - return .Err(.ERROR_PARSING); - } - - Try!(DeserializeBaseObject(jsonObject, object)); - - let type = object.GetType() as TypeInstance; - let fields = type.GetFields(); - - for (var field in fields) - { - if (AttributeChecker.ShouldIgnore(field)) - { - continue; - } - - if (TypeChecker.IsTypeList(field.FieldType)) - { - Try!(SetArrayField(field, jsonObject, object)); - } - else if (TypeChecker.IsUserObject(field.FieldType)) - { - Try!(SetObjectField(field, jsonObject, object)); - } - else if (TypeChecker.IsPrimitive(field.FieldType)) - { - Try!(SetPrimitiveField(field, jsonObject, object)); - } - else - { - return .Err(.ERROR_PARSING); - } - } - - return .Ok; - } - - private static Result DeserializeBaseObject(JSONObject jsonObject, Object obj) - { - let type = obj.GetType(); - let baseType = type.BaseType; - - if (baseType == type) - { - return .Ok; - } - - let fields = baseType.GetFields(); - - for (var field in fields) - { - if (AttributeChecker.ShouldIgnore(field)) - { - continue; - } - - if (TypeChecker.IsTypeList(field.FieldType)) - { - Try!(SetArrayField(field, jsonObject, obj)); - } - else if (TypeChecker.IsUserObject(field.FieldType)) - { - Try!(SetObjectField(field, jsonObject, obj)); - } - else if (TypeChecker.IsPrimitive(field.FieldType)) - { - Try!(SetPrimitiveField(field, jsonObject, obj)); - } - else - { - return .Err(.ERROR_PARSING); - } - } - return .Ok; - } - - // The object corresponds to the jsonArray - // e.g.: jsonArray => [["1", "2", "3"], ["1", "2"]] -- object => List> - // e.g.: jsonArray => ["1", "2", "3"] -- object => List - // e.g.: jsonArray => [{"Key": "Value"}] -- object => List - private static Result DeserializeArray(JSONArray jsonArray, Object object) - { - if (!TypeChecker.IsTypeList(object)) - { - return .Err(.CANNOT_ASSIGN_LIST_TO_OBJECT); - } - - let type = object.GetType() as SpecializedGenericType; - let addMethod = Try!(type.GetMethod("Add")); - let paramType = type.GetGenericArg(0) as TypeInstance; - - for (int i = 0; i < jsonArray.Count; i++) - { - // Calls recursively for handling List> - if (TypeChecker.IsTypeList(paramType) && (paramType.CreateObject() case .Ok(let innerList))) - { - let innerJsonArray = Try!(jsonArray.Get(i)); - - Try!(DeserializeArray(innerJsonArray, innerList)); - - if (addMethod.Invoke(object, innerList) case .Err) - { - return .Err(.CANNOT_ASSIGN_VALUE); - } - continue; - } - - if (TypeChecker.IsUserObject(paramType) && (paramType.CreateObject() case .Ok(let innerObject))) - { - let jsonObject = Try!(jsonArray.Get(i)); - - Try!(DeserializeObject(jsonObject, innerObject)); - - if (addMethod.Invoke(object, innerObject) case .Err) - { - return .Err(.CANNOT_ASSIGN_VALUE); - } - continue; - } - - if (TypeChecker.IsPrimitive(paramType)) - { - Try!(AddPrimitiveToArray(paramType, jsonArray, i, object, addMethod)); - } - } - - return .Ok; - } - - private static Result AddPrimitiveToArray(Type type, JSONArray jsonArray, int i, Object obj, MethodInfo addMethod) - { - switch (type) - { - case typeof(int): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(int8): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(int16): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(int32): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(int64): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint8): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint16): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint32): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint64): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(char8): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(char16): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(char32): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(float): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(double): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(bool): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(String): - if (jsonArray.Get(i) case .Ok(let val)) - { - addMethod.Invoke(obj, new String(val)); - } - else - { - return .Err(.ERROR_PARSING); - } - } - - return .Ok; - } - - private static bool AreTypeMatching(JSONObject jsonObject, Object obj) - { - let type = obj.GetType(); - let fields = type.GetFields(); - - if (!AreBaseTypeMatching(jsonObject, obj)) - { - return false; - } - - for (var field in fields) - { - if (AttributeChecker.ShouldIgnore(field)) - { - continue; - } - - if (!HasField(jsonObject, obj, field)) - { - return false; - } - } - return true; - } - - private static bool AreBaseTypeMatching(JSONObject jsonObject, Object obj) - { - let type = obj.GetType(); - let baseType = type.BaseType; - - if (type == baseType) - { - return true; - } - - let fields = baseType.GetFields(); - - for (var field in fields) - { - if (AttributeChecker.ShouldIgnore(field)) - { - continue; - } - - let fieldValue = field.GetValue(obj).Get().Get(); - - if (!HasField(jsonObject, obj, field)) - { - return false; - } - - if (!AreBaseTypeMatching(jsonObject, fieldValue)) - { - return false; - } - } - - return true; - } - - private static bool HasField(JSONObject jsonObj, Object obj, FieldInfo field) - { - let fieldName = scope String(field.Name); - let fieldVariant = field.GetValue(obj).Value; - let fieldVariantType = fieldVariant.VariantType; - - var hasField = false; - if (fieldVariantType.IsPrimitive) - { - switch (fieldVariantType) - { - case typeof(int): - hasField = jsonObj.Contains(fieldName); - case typeof(int8): - hasField = jsonObj.Contains(fieldName); - case typeof(int16): - hasField = jsonObj.Contains(fieldName); - case typeof(int32): - hasField = jsonObj.Contains(fieldName); - case typeof(int64): - hasField = jsonObj.Contains(fieldName); - case typeof(uint): - hasField = jsonObj.Contains(fieldName); - case typeof(uint8): - hasField = jsonObj.Contains(fieldName); - case typeof(uint16): - hasField = jsonObj.Contains(fieldName); - case typeof(uint32): - hasField = jsonObj.Contains(fieldName); - case typeof(uint64): - hasField = jsonObj.Contains(fieldName); - case typeof(char8): - hasField = jsonObj.Contains(fieldName); - case typeof(char16): - hasField = jsonObj.Contains(fieldName); - case typeof(char32): - hasField = jsonObj.Contains(fieldName); - case typeof(bool): - hasField = jsonObj.Contains(fieldName); - case typeof(float): - hasField = jsonObj.Contains(fieldName); - case typeof(double): - hasField = jsonObj.Contains(fieldName); - default: - return false; - } - } - else if (fieldVariantType.IsObject) - { - switch (fieldVariantType) - { - case typeof(String): - hasField = jsonObj.Contains(fieldName); - default: - let fieldValue = fieldVariant.Get(); - - if (TypeChecker.IsTypeList(fieldValue)) - { - hasField = jsonObj.Contains(fieldName); - } - else - { - hasField = jsonObj.Contains(fieldName); - } - } - } - - return hasField; - } - - static Result SetPrimitiveField(FieldInfo field, JSONObject jsonObj, Object obj) - { - let type = field.FieldType; - let key = scope String(field.Name); - - switch (type) - { - case typeof(int): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(int8): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(int16): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(int32): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(int64): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint8): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint16): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint32): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(uint64): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(char8): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(char16): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(char32): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(float): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(double): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(bool): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, val); - } - else - { - return .Err(.ERROR_PARSING); - } - case typeof(String): - if (jsonObj.Get(key) case .Ok(let val)) - { - field.SetValue(obj, new String(val)); - } - else - { - return .Err(.ERROR_PARSING); - } - default: - return .Err(.ERROR_PARSING); - } - - return .Ok; - } - - private static Result SetObjectField(FieldInfo field, JSONObject jsonObject, Object obj) - { - let type = field.FieldType; - let key = scope String(field.Name); - - if ((type.CreateObject() case .Ok(let fieldObject)) && - (jsonObject.Get(key) case .Ok(let val))) - { - if (val == null) - { - field.SetValue(obj, null); - return .Ok; - } - - Try!(DeserializeObject(val, fieldObject)); - field.SetValue(obj, fieldObject); - } - else - { - return .Err(.ERROR_PARSING); - } - - return .Ok; - } - - private static Result SetArrayField(FieldInfo field, JSONObject jsonObject, Object obj) - { - let type = field.FieldType; - let key = scope String(field.Name); - - if ((type.CreateObject() case .Ok(let fieldList)) && - (jsonObject.Get(key) case .Ok(let array))) - { - if (array == null) - { - field.SetValue(obj, null); - return .Ok; - } - - Try!(DeserializeArray(array, fieldList)); - field.SetValue(obj, fieldList); - } - else - { - return .Err(.ERROR_PARSING); - } - - return .Ok; - } - } -} diff --git a/Libs/JSON_Beef/lib/src/Serialization/JSONSerializer.bf b/Libs/JSON_Beef/lib/src/Serialization/JSONSerializer.bf deleted file mode 100644 index da5d15e..0000000 --- a/Libs/JSON_Beef/lib/src/Serialization/JSONSerializer.bf +++ /dev/null @@ -1,447 +0,0 @@ -using System; -using System.Collections; -using System.Reflection; -using JSON_Beef.Types; -using JSON_Beef.Attributes; - -namespace JSON_Beef.Serialization -{ - public class JSONSerializer - { - public static Result Serialize(Object object) where T: JSONObject - { - if (object == null) - { - return .Err; - } - - let json = new JSONObject(); - let type = object.GetType(); - var fields = type.GetFields(); - - SerializeObjectBaseTypeInternal(object, json); - - for (var field in fields) - { - if (ShouldIgnore(field)) - { - continue; - } - - let res = SerializeObjectInternal(object, field, json); - - if (res == .Err) - { - return .Err; - } - } - - return .Ok(json); - } - - public static Result Serialize(ref Object object) where T: JSONArray - { - if (!IsList(object) || (object == null)) - { - return .Err; - } - - let jsonArray = new JSONArray(); - let list = (List*)&object; - - for (var item in *list) - { - if (item == null) - { - jsonArray.Add(null); - } - else if (IsList(item)) - { - let res = Serialize(ref item); - - if (res == .Err) - { - return .Err; - } - - jsonArray.Add(res.Value); - } - else - { - let itemType = item.GetType(); - - switch (itemType) - { - case typeof(String): - jsonArray.Add(item as String); - case typeof(int): - jsonArray.Add((int)item); - case typeof(int8): - jsonArray.Add((int8)item); - case typeof(int16): - jsonArray.Add((int16)item); - case typeof(int32): - jsonArray.Add((int32)item); - case typeof(int64): - jsonArray.Add((int64)item); - case typeof(uint): - jsonArray.Add((uint)item); - case typeof(uint8): - jsonArray.Add((uint8)item); - case typeof(uint16): - jsonArray.Add((uint16)item); - case typeof(uint32): - jsonArray.Add((uint32)item); - case typeof(uint64): - jsonArray.Add((uint64)item); - case typeof(char8): - jsonArray.Add((char8)item); - case typeof(char16): - jsonArray.Add((char16)item); - case typeof(char32): - jsonArray.Add((char32)item); - case typeof(float): - jsonArray.Add((float)item); - case typeof(double): - jsonArray.Add((float)item); - case typeof(bool): - jsonArray.Add((bool)item); - default: - let res = Serialize(item); - - if (res == .Err) - { - return .Err; - } - - jsonArray.Add(res.Value); - delete res.Value; - } - } - } - - return .Ok(jsonArray); - } - - public static Result Serialize(Object object) where T: String - { - let str = new String(); - - if (IsList(object)) - { - var obj = object; - let res = Serialize(ref obj); - - if (res == .Err) - { - delete str; - return .Err; - } - - res.Value.ToString(str); - delete res.Value; - } - else - { - let res = Serialize(object); - - if (res == .Err) - { - delete str; - return .Err; - } - - res.Value.ToString(str); - delete res.Value; - } - return .Ok(str); - } - - private static bool IsList(Object object) - { - let type = object.GetType(); - let typeName = scope String(); - type.GetName(typeName); - - return typeName.Equals("List") || typeName.Equals("JsonList"); - } - - private static bool ShouldIgnore(FieldInfo field) - { - let shouldIgnore = field.GetCustomAttribute(); - - return ((shouldIgnore == .Ok) || field.HasFieldFlag(.PrivateScope) || field.HasFieldFlag(.Private)); - } - - private static Result SerializeObjectInternal(Object object, FieldInfo field, JSONObject json) - { - let fieldName = scope String(field.Name); - let fieldVariant = field.GetValue(object).Get(); - let fieldVariantType = fieldVariant.VariantType; - - if (fieldVariantType.IsPrimitive) - { - switch (fieldVariantType) - { - case typeof(int): - json.Add(fieldName, fieldVariant.Get()); - case typeof(int8): - json.Add(fieldName, fieldVariant.Get()); - case typeof(int16): - json.Add(fieldName, fieldVariant.Get()); - case typeof(int32): - json.Add(fieldName, fieldVariant.Get()); - case typeof(int64): - json.Add(fieldName, fieldVariant.Get()); - case typeof(uint): - json.Add(fieldName, fieldVariant.Get()); - case typeof(uint8): - json.Add(fieldName, fieldVariant.Get()); - case typeof(uint16): - json.Add(fieldName, fieldVariant.Get()); - case typeof(uint32): - json.Add(fieldName, fieldVariant.Get()); - case typeof(uint64): - json.Add(fieldName, fieldVariant.Get()); - case typeof(char8): - json.Add(fieldName, fieldVariant.Get()); - case typeof(char16): - json.Add(fieldName, fieldVariant.Get()); - case typeof(char32): - json.Add(fieldName, fieldVariant.Get()); - case typeof(float): - json.Add(fieldName, fieldVariant.Get()); - case typeof(double): - json.Add(fieldName, fieldVariant.Get()); - case typeof(bool): - json.Add(fieldName, fieldVariant.Get()); - default: - return .Err; - } - } - else if (fieldVariantType.IsObject) - { - var fieldValue = fieldVariant.Get(); - - if (fieldValue == null) - { - json.Add(fieldName, null); - return .Ok; - } - - SerializeObjectBaseTypeInternal(fieldValue, json); - - if (IsList(fieldValue)) - { - let res = Serialize(ref fieldValue); - - if (res == .Err) - { - return .Err; - } - - json.Add(fieldName, res.Value); - delete res.Value; - } - else - { - switch (fieldVariantType) - { - case typeof(String): - json.Add(fieldName, (String)fieldValue); - default: - let res = Serialize(fieldValue); - - if (res == .Err) - { - delete json; - return .Err; - } - - json.Add(fieldName, res.Value); - delete res.Value; - } - } - } - - return .Ok; - } - - private static Result SerializeObjectBaseTypeInternal(Object object, JSONObject json) - { - let type = object.GetType(); - let baseType = type.BaseType; - - // It is not an error to have the same base type as the current type. - // It only tells that we arrived at the top of the inheritence chain. - // So I exit now to break any infinite recursion loop. - if (type == baseType) - { - return .Ok; - } - - let fields = baseType.GetFields(); - - for (var field in fields) - { - if (ShouldIgnore(field)) - { - continue; - } - - let fieldName = scope String(field.Name); - let fieldVariant = field.GetValue(object).Get(); - let fieldVariantType = fieldVariant.VariantType; - var fieldValue = fieldVariant.Get(); - - SerializeObjectBaseTypeInternal(fieldValue, json); - - if (fieldValue == null) - { - json.Add(fieldName, null); - } - else if (IsList(fieldValue)) - { - let res = Serialize(ref fieldValue); - - if (res == .Err) - { - return .Err; - } - - json.Add(fieldName, res.Value); - delete res.Value; - } - else - { - switch (fieldVariantType) - { - case typeof(String): - json.Add(fieldName, (String)fieldValue); - case typeof(int): - json.Add(fieldName, (int)fieldValue); - case typeof(int8): - json.Add(fieldName, (int8)fieldValue); - case typeof(int16): - json.Add(fieldName, (int16)fieldValue); - case typeof(int32): - json.Add(fieldName, (int32)fieldValue); - case typeof(int64): - json.Add(fieldName, (int64)fieldValue); - case typeof(uint): - json.Add(fieldName, (uint)fieldValue); - case typeof(uint8): - json.Add(fieldName, (uint8)fieldValue); - case typeof(uint16): - json.Add(fieldName, (uint16)fieldValue); - case typeof(uint32): - json.Add(fieldName, (uint32)fieldValue); - case typeof(uint64): - json.Add(fieldName, (uint64)fieldValue); - case typeof(char8): - json.Add(fieldName, (char8)fieldValue); - case typeof(char16): - json.Add(fieldName, (char16)fieldValue); - case typeof(char32): - json.Add(fieldName, (char32)fieldValue); - case typeof(float): - json.Add(fieldName, (float)fieldValue); - case typeof(double): - json.Add(fieldName, (double)fieldValue); - case typeof(bool): - json.Add(fieldName, (bool)fieldValue); - default: - let res = Serialize(fieldValue); - - if (res == .Err) - { - delete json; - return .Err; - } - - json.Add(fieldName, res.Value); - delete res.Value; - } - } - } - - return .Ok; - } - - private static Result SerializeArrayInternal(Object object, FieldInfo field, JSONArray json) - { - let fieldVariant = field.GetValue(object).Get(); - let fieldVariantType = fieldVariant.VariantType; - var fieldValue = fieldVariant.Get(); - - if (fieldValue == null) - { - json.Add(null); - } - else if (IsList(fieldValue)) - { - let res = Serialize(ref fieldValue); - - if (res == .Err) - { - return .Err; - } - - json.Add(res.Value); - delete res.Value; - } - else - { - switch (fieldVariantType) - { - case typeof(String): - json.Add((String)fieldValue); - case typeof(int): - json.Add((int)fieldValue); - case typeof(int8): - json.Add((int8)fieldValue); - case typeof(int16): - json.Add((int16)fieldValue); - case typeof(int32): - json.Add((int32)fieldValue); - case typeof(int64): - json.Add((int64)fieldValue); - case typeof(uint): - json.Add((uint)fieldValue); - case typeof(uint8): - json.Add((uint8)fieldValue); - case typeof(uint16): - json.Add((uint16)fieldValue); - case typeof(uint32): - json.Add((uint32)fieldValue); - case typeof(char8): - json.Add((char8)fieldValue); - case typeof(char16): - json.Add((char16)fieldValue); - case typeof(char32): - json.Add((char32)fieldValue); - case typeof(uint64): - json.Add((uint64)fieldValue); - case typeof(float): - json.Add((float)fieldValue); - case typeof(double): - json.Add((double)fieldValue); - case typeof(bool): - json.Add((bool)fieldValue); - default: - let res = Serialize(fieldValue); - - if (res == .Err) - { - delete json; - return .Err; - } - - json.Add(res.Value); - delete res.Value; - } - } - return .Ok; - } - } -} diff --git a/Libs/JSON_Beef/lib/src/Types/JSONArray.bf b/Libs/JSON_Beef/lib/src/Types/JSONArray.bf deleted file mode 100644 index 8ab097f..0000000 --- a/Libs/JSON_Beef/lib/src/Types/JSONArray.bf +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Collections; -using System.Reflection; -using JSON_Beef.Util; - -namespace JSON_Beef.Types -{ - public class JSONArray - { - private List list; - - public int Count - { - get - { - return list.Count; - } - } - - public this() - { - list = new List(); - } - - public this(JSONArray array) - { - list = new List(); - - for (int i = 0; i < array.Count; i++) - { - let value = array.GetVariant(i); - - switch (value.VariantType) - { - case typeof(JSONObject): - Add(value.Get()); - case typeof(JSONArray): - Add(value.Get()); - case typeof(String): - Add(value.Get()); - default: - if (value.Get() == null) - { - list.Add(Variant.Create(default(Object))); - } - } - } - } - - public ~this() - { - for (var item in list) - { - item.Dispose(); - } - - list.Clear(); - delete list; - } - - public void Add(Object val) - { - if (val == null) - { - list.Add(Variant.Create(default(T))); - return; - } - - let type = typeof(T); - - if (type.IsPrimitive || (type == typeof(bool))) - { - let str = scope String(); - val.ToString(str); - str.ToLower(); - Add(str); - return; - } - - switch (type) - { - case typeof(JSONObject): - Add((JSONObject)val); - case typeof(JSONArray): - Add((JSONArray)val); - case typeof(String): - Add((String)val); - } - } - - private void Add(String val) - { - let v = new String(val); - list.Add(Variant.Create(v, true)); - } - - private void Add(JSONObject val) - { - let v = new JSONObject(val); - list.Add(Variant.Create(v, true)); - } - - private void Add(JSONArray val) - { - let v = new JSONArray(val); - list.Add(Variant.Create(v, true)); - } - - public Result Get(int idx) - { - if (idx > list.Count) - { - return .Err(.INDEX_OUT_OF_BOUNDS); - } - - let value = list[idx]; - - let type = typeof(T); - - if ((value.VariantType == typeof(String)) && type.IsPrimitive) - { - if (type == typeof(bool)) - { - bool res = JSONUtil.ParseBool(value.Get()); - T outVal = default; - Internal.MemCpy(&outVal, &res, sizeof(bool)); - return .Ok(outVal); - } - else - { - var res = JSONUtil.ParseNumber(value.Get()); - T outVal = default; - Internal.MemCpy(&outVal, &res, type.Size); - return .Ok(outVal); - } - } - - if ((type == typeof(JSONObject)) || (type == typeof(JSONArray)) || (type == typeof(String))) - { - if (value.VariantType == typeof(T)) - { - T ret = value.Get(); - return .Ok(ret); - } - } - - if (value.Get() == null) - { - return default(T); - } - - return .Err(.INVALID_RETURN_TYPE); - } - - public override void ToString(String str) - { - var tempStr = scope String(); - - str.Clear(); - str.Append("["); - - for (int i = 0; i < list.Count; i++) - { - let variant = list[i]; - - switch (variant.VariantType) - { - case typeof(String): - tempStr.AppendF("\"{}\"", variant.Get()); - case typeof(JSONObject): - variant.Get().ToString(tempStr); - case typeof(JSONArray): - variant.Get().ToString(tempStr); - default: - tempStr.Set(String.Empty); - } - //str.Append(tempStr); - - str.Append(tempStr); - - if (i != (list.Count - 1)) - { - str.Append(","); - } - - tempStr.Clear(); - } - - str.Append("]"); - } - - public Variant GetVariant(int idx) - { - return list[idx]; - } - } -} diff --git a/Libs/JSON_Beef/lib/src/Types/JSONDocument.bf b/Libs/JSON_Beef/lib/src/Types/JSONDocument.bf deleted file mode 100644 index b000d7e..0000000 --- a/Libs/JSON_Beef/lib/src/Types/JSONDocument.bf +++ /dev/null @@ -1,849 +0,0 @@ -using System; -using System.Collections; -using JSON_Beef.Util; - -namespace JSON_Beef.Types -{ - enum JSON_DOCUMENT_TYPE - { - OBJECT, - ARRAY, - UNKNOWN - } - - enum JSON_TYPES - { - LITERAL, - OBJECT, - ARRAY, - STRING, - INTEGER, - FLOAT - } - - enum JSON_LITERAL - { - NULL, - TRUE, - FALSE - } - - enum JSON_OBJECT_SEARCH_STATE - { - SEARCH_KEY, - SEARCH_VALUE - } - - enum JSON_ERRORS - { - INVALID_NUMBER_REPRESENTATION, - INVALID_RETURN_TYPE, - INDEX_OUT_OF_BOUNDS, - KEY_NOT_FOUND, - STRING_NOT_TERMINATED, - INVALID_LITERAL_VALUE, - INVALID_OBJECT, - INVALID_ARRAY, - INVALID_JSON_STRING, - UNKNOWN_ERROR, - INVALID_TYPE, - CANNOT_CONVERT_SIGNED_TO_UNSIGNED - } - - public class JSONDocument - { - private Dictionary escapedChar; - private String data; - - public this() - { - escapedChar = new Dictionary(); - escapedChar.Add('\\', '\\'); - escapedChar.Add('"', '"'); - escapedChar.Add('b', '\b'); - escapedChar.Add('f', '\f'); - escapedChar.Add('n', '\n'); - escapedChar.Add('r', '\r'); - escapedChar.Add('t', '\t'); - escapedChar.Add('/', '/'); - } - - public ~this() - { - delete escapedChar; - } - - public bool IsValidJson(String json) - { - return JSONValidator.IsValidJson(json); - } - - public JSON_DOCUMENT_TYPE GetJsonType(String json) - { - let token = json[0]; - - if (token == '{') - { - return JSON_DOCUMENT_TYPE.OBJECT; - } - else if (token == '[') - { - return JSON_DOCUMENT_TYPE.ARRAY; - } - else - { - return JSON_DOCUMENT_TYPE.UNKNOWN; - } - } - - public Result ParseArray(String json) - { - var array = new JSONArray(); - if (ParseArrayInternal(json, ref array) case .Err(let err)) - { - delete array; - return .Err(err); - } - return array; - } - - public Result ParseArray(String json, ref JSONArray array) - { - if (ParseArrayInternal(json, ref array) case .Err(let err)) - { - return .Err(err); - } - - return .Ok; - } - - public Result ParseObject(String json) - { - var object = new JSONObject(); - if (ParseObjectInternal(json, ref object) case .Err(let err)) - { - delete object; - return .Err(err); - } - return object; - } - - public Result ParseObject(String json, ref JSONObject object) - { - if (ParseObjectInternal(json, ref object) case .Err(let err)) - { - return .Err(err); - } - - return .Ok; - } - - private Result ParseString(String json, String outString) - { - int i; - outString.Clear(); - var escaped = false; - - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if ((c == '\\') && !escaped) - { - escaped = true; - } - else if (escapedChar.ContainsKey(c) && escaped) - { - outString.Append(escapedChar[c]); - escaped = false; - } - else if ((c == '"') && !escaped) - { - break; - } - else - { - if (escaped) - { - outString.Append('\\'); - } - outString.Append(c); - escaped = false; - } - } - - if (json[i] != '"') - { - return .Err(.STRING_NOT_TERMINATED); - } - - return .Ok(i); - } - - /*private Result ParseNumber(String json, ref int outInt, ref float outFloat, ref JSON_TYPES typeParsed) - { - var strNum = scope String(); - - typeParsed = JSON_TYPES.INTEGER; - - int i = 0; - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if (c == '.') - { - typeParsed = JSON_TYPES.FLOAT; - strNum.Append(c); - } - else if (!c.IsDigit && (c != '-') && (c != 'e') && (c != 'E') && (c != '+')) - { - break; - } - else - { - strNum.Append(c); - } - } - - if (typeParsed == JSON_TYPES.INTEGER) - { - let res = JSONUtil.ParseInt(strNum); - - switch (res) - { - case .Err(.INVALID_NUMBER_REPRESENTATION): - return .Err(.INVALID_NUMBER_REPRESENTATION); - default: - outInt = res.Get(); - } - } - else if (typeParsed == JSON_TYPES.FLOAT) - { - let res = JSONUtil.ParseFloat(strNum); - - switch (res) - { - case .Err(.INVALID_NUMBER_REPRESENTATION): - return .Err(.INVALID_NUMBER_REPRESENTATION); - default: - outFloat = res.Get(); - } - } - - // I always want the last parsed char to be a number - return .Ok(i - 1); - }*/ - - private Result ParseNumber(String json, String outStr) - { - if (!JSONValidator.IsValidNumber(json)) - { - return .Err(.INVALID_NUMBER_REPRESENTATION); - } - - var strNum = scope String(); - outStr.Clear(); - - int i = 0; - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if (c == '.') - { - strNum.Append(c); - } - else if (!c.IsDigit && (c != '-') && (c != 'e') && (c != 'E') && (c != '+')) - { - break; - } - else - { - strNum.Append(c); - } - } - - outStr.Set(strNum); - - // I always want the last parsed char to be a number - return .Ok(i - 1); - } - - /*private Result ParseLiteral(String json, ref JSON_LITERAL outLiteral) - { - var str = scope String(); - - int i = 0; - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if (!c.IsLetter) - { - break; - } - else - { - str.Append(c); - } - } - - if (str.Equals("true")) - { - outLiteral = .TRUE; - } - else if (str.Equals("false")) - { - outLiteral = .FALSE; - } - else if (str.Equals("null")) - { - outLiteral = .NULL; - } - else - { - return .Err(.INVALID_LITERAL_VALUE); - } - - // I always want the last parsed char to be a letter - return .Ok(i - 1); - }*/ - - private Result ParseLiteral(String json, String outStr) - { - if (!JSONValidator.IsValidLiteral(json)) - { - return .Err(.INVALID_LITERAL_VALUE); - } - - var str = scope String(); - outStr.Clear(); - - int i = 0; - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if (!c.IsLetter) - { - break; - } - else - { - str.Append(c); - } - } - - outStr.Set(str); - - // I always want the last parsed char to be a letter - return .Ok(i - 1); - } - - private Result ParseArrayInternal(String json, ref JSONArray array) - { - int i = 0; - - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if ((c == '[') && (i != 0)) - { - let str = scope String(&json[i]); - var outArr = scope JSONArray(); - let res = ParseArrayInternal(str, ref outArr); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - array.Add(outArr); - } - else if (c == ']') - { - break; - } - else if (c == '"') - { - // We do not want the first char in the string to parse to be taken as a - // closing string token. - i++; - let str = scope String(&json[i]); - var outStr = scope String(); - let res = ParseString(str, outStr); - - switch (res) - { - case .Err(let err): - return .Err(err); - case .Ok(let val): - i += val; - } - - array.Add(outStr); - } - else if ((c == '-') || (c.IsNumber)) - { - let str = scope String(&json[i]); - var outStr = scope String(); - let res = ParseNumber(str, outStr); - - switch (res) - { - case .Err(let err): - return .Err(err); - case .Ok(let val): - i += val; - } - - array.Add(outStr); - } - else if (c.IsLetter) - { - let str = scope String(&json[i]); - var outStr = scope String(); - let res = ParseLiteral(str, outStr); - - switch (res) - { - case .Err(let err): - return .Err(err); - case .Ok(let val): - i += val; - } - - if (outStr.Equals("null")) - { - array.Add(null); - } - else - { - array.Add(outStr); - } - } - else if (c == '{') - { - let str = scope String(&json[i]); - var outObject = scope JSONObject(); - - let res = ParseObjectInternal(str, ref outObject); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - array.Add(outObject); - } - } - - return .Ok(i); - } - - /*private Result ParseArray(String json, ref JSONArray array) - { - int i = 0; - JSON_TYPES typeParsed = JSON_TYPES.LITERAL; - - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if ((c == '[') && (i != 0)) - { - let str = scope String(&json[i]); - var outArr = scope JSONArray(); - let res = ParseArray(str, ref outArr); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - array.Add(outArr); - } - else if (c == ']') - { - break; - } - else if (c == '"') - { - // We do not want the first char in the string to parse to be taken as a - // closing string token. - i++; - let str = scope String(&json[i]); - var outStr = scope String(); - let res = ParseString(str, outStr); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - array.Add(outStr); - } - else if ((c == '-') || (c.IsNumber)) - { - let str = scope String(&json[i]); - int outInt = 0; - float outFloat = 0.f; - let res = ParseNumber(str, ref outInt, ref outFloat, ref typeParsed); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - if (typeParsed == JSON_TYPES.INTEGER) - { - array.Add(outInt); - } - else if (typeParsed == JSON_TYPES.FLOAT) - { - array.Add(outFloat); - } - } - else if (c.IsLetter) - { - let str = scope String(&json[i]); - JSON_LITERAL outLiteral = .NULL; - let res = ParseLiteral(str, ref outLiteral); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - typeParsed = .LITERAL; - - array.Add(outLiteral); - } - else if (c == '{') - { - let str = scope String(&json[i]); - var outObject = scope JSONObject(); - - let res = ParseObject(str, ref outObject); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - array.Add(outObject); - } - } - - return .Ok(i); - }*/ - - /*private Result ParseObject(String json, ref JSONObject object) - { - int i = 0; - var lookForKey = true; - var typeParsed = JSON_TYPES.LITERAL; - var key = scope String(); - - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if ((c == '{') && (!lookForKey)) - { - i++; - let str = scope String(&json[i]); - var outObject = scope JSONObject(); - - let res = ParseObject(str, ref outObject); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - object.Add(key, outObject); - } - else if (c == '}') - { - break; - } - else if (c == '"') - { - // We do not want the first char in the string to parse to be taken as a - // closing string token. - i++; - let str = scope String(&json[i]); - - if (lookForKey) - { - key = scope:: String(); - let res = ParseString(str, key); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - lookForKey = false; - } - else - { - var outStr = scope String(); - let res = ParseString(str, outStr); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - object.Add(key, outStr); - } - } - else if (c.IsDigit || (c == '-') && (!lookForKey)) - { - let str = scope String(&json[i]); - var outInt = 0; - var outFloat = 0.f; - let res = ParseNumber(str, ref outInt, ref outFloat, ref typeParsed); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - if (typeParsed == JSON_TYPES.INTEGER) - { - object.Add(key, outInt); - } - else if (typeParsed == JSON_TYPES.FLOAT) - { - object.Add(key, outFloat); - } - } - else if (c.IsLetter && (!lookForKey)) - { - let str = scope String(&json[i]); - var outLiteral = JSON_LITERAL.NULL; - - let res = ParseLiteral(str, ref outLiteral); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - object.Add(key, outLiteral); - } - else if (c == '[' && (!lookForKey)) - { - i++; - let str = scope String(&json[i]); - var outArr = scope JSONArray(); - - let res = ParseArray(str, ref outArr); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - object.Add(key, outArr); - } - else if (c == ',') - { - lookForKey = true; - } - /*else if (c == ':') - { - lookForKey = false; - }*/ - } - - return .Ok(i); - }*/ - - private Result ParseObjectInternal(String json, ref JSONObject object) - { - int i = 0; - var lookForKey = true; - //var typeParsed = JSON_TYPES.LITERAL; - var key = scope String(); - - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if ((c == '{') && (!lookForKey)) - { - i++; - let str = scope String(&json[i]); - var outObject = scope JSONObject(); - - let res = ParseObjectInternal(str, ref outObject); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - object.Add(key, outObject); - } - else if (c == '}') - { - break; - } - else if (c == '"') - { - // We do not want the first char in the string to parse to be taken as a - // closing string token. - i++; - let str = scope String(&json[i]); - - if (lookForKey) - { - key = scope:: String(); - let res = ParseString(str, key); - - switch (res) - { - case .Err(let err): - return .Err(err); - case .Ok(let val): - i += val; - } - - lookForKey = false; - } - else - { - var outStr = scope String(); - let res = ParseString(str, outStr); - - switch (res) - { - case .Err(let err): - return .Err(err); - case .Ok(let val): - i += val; - } - - object.Add(key, outStr); - } - } - else if (c.IsDigit || (c == '-') && (!lookForKey)) - { - let str = scope String(&json[i]); - var outStr = scope String(); - let res = ParseNumber(str, outStr); - - switch (res) - { - case .Err(let err): - return .Err(err); - case .Ok(let val): - i += val; - } - - object.Add(key, outStr); - } - else if (c.IsLetter && (!lookForKey)) - { - let str = scope String(&json[i]); - var outStr = scope String(); - - let res = ParseLiteral(str, outStr); - - switch (res) - { - case .Err(let err): - return .Err(err); - case .Ok(let val): - i += val; - } - - if (outStr.Equals("null")) - { - object.Add(key, null); - } - else - { - object.Add(key, outStr); - } - } - else if (c == '[' && (!lookForKey)) - { - //i++; - let str = scope String(&json[i]); - var outArr = scope JSONArray(); - - let res = ParseArrayInternal(str, ref outArr); - - switch (res) - { - case .Err(let err): - return .Err(err); - default: - i += res.Get(); - } - - object.Add(key, outArr); - } - else if (c == ',') - { - lookForKey = true; - } - /*else if (c == ':') - { - lookForKey = false; - }*/ - } - - return .Ok(i); - } - } -} diff --git a/Libs/JSON_Beef/lib/src/Types/JSONObject.bf b/Libs/JSON_Beef/lib/src/Types/JSONObject.bf deleted file mode 100644 index 59ae40d..0000000 --- a/Libs/JSON_Beef/lib/src/Types/JSONObject.bf +++ /dev/null @@ -1,265 +0,0 @@ -using System; -using System.Collections; -using JSON_Beef.Util; - -namespace JSON_Beef.Types -{ - public class JSONObject - { - private Dictionary dictionary; - - public this() - { - dictionary = new Dictionary(); - } - - public this(JSONObject obj) - { - dictionary = new Dictionary(); - - var keys = obj.dictionary.Keys; - - while (keys.MoveNext()) - { - let key = keys.Current; - let value = obj.GetVariant(key); - - switch (value.VariantType) - { - case typeof(JSONObject): - Add(key, value.Get()); - case typeof(JSONArray): - Add(key, value.Get()); - case typeof(String): - Add(key, value.Get()); - default: - if (value.Get() == null) - { - let k = new String(key); - dictionary.Add(k, Variant.Create(default(Object))); - } - } - } - } - - public ~this() - { - for (var item in dictionary) - { - if (item.value.HasValue) - { - item.value.Dispose(); - } - delete item.key; - } - - dictionary.Clear(); - - delete dictionary; - } - - public Result Get(String key) - { - if (dictionary.ContainsKey(key)) - { - let value = dictionary[key]; - let type = typeof(T); - - if (type.IsPrimitive && (value.VariantType == typeof(String))) - { - if (type == typeof(bool)) - { - bool res = JSONUtil.ParseBool(value.Get()); - T outVal = default; - Internal.MemCpy(&outVal, &res, sizeof(bool)); - return .Ok(outVal); - } - else - { - var res = JSONUtil.ParseNumber(value.Get()); - T outVal = default; - Internal.MemCpy(&outVal, &res, type.Size); - return .Ok(outVal); - } - } - - if ((typeof(T) == typeof(JSONObject)) || (typeof(T) == typeof(JSONArray)) || (typeof(T) == typeof(String))) - { - if (value.VariantType == typeof(T)) - { - T ret = value.Get(); - return .Ok(ret); - } - - return .Err(.INVALID_RETURN_TYPE); - } - - if (value.Get() == null) - { - return default(T); - } - } - - return .Err(.KEY_NOT_FOUND); - } - - public Result Get(String key, Type type) - { - if (dictionary.ContainsKey(key)) - { - let value = dictionary[key]; - - if (value.VariantType == type) - { - let ret = value.Get(); - return .Ok(ret); - } - - return .Err(.INVALID_TYPE); - } - - return .Err(.KEY_NOT_FOUND); - } - - public Variant GetVariant(String key) - { - return dictionary[key]; - } - - public void Add(String key, Object val) - { - if (val == null) - { - let k = new String(key); - dictionary.Add(k, Variant.Create(default(T))); - return; - } - - let type = typeof(T); - - if (type.IsPrimitive || (type == typeof(bool))) - { - let str = scope String(); - val.ToString(str); - str.ToLower(); - Add(key, str); - return; - } - - switch (type) - { - case typeof(JSONObject): - Add(key, (JSONObject)val); - case typeof(JSONArray): - Add(key, (JSONArray)val); - case typeof(String): - Add(key, (String)val); - case typeof(bool): - let str = scope String(); - bool b = (bool)val; - b.ToString(str); - Add(key, str); - } - } - - public bool Contains(String key) - { - if (!dictionary.ContainsKey(key)) - { - return false; - } - - let variant = GetVariant(key); - let type = typeof(T); - - if ((variant.VariantType == typeof(String)) && type.IsPrimitive) - { - if ((type == typeof(bool)) && JSONUtil.ParseBool(variant.Get()) case .Ok(let val)) - { - return true; - } - if (JSONUtil.ParseNumber(variant.Get()) case .Ok(let val)) - { - return true; - } - } - - if ((type == typeof(JSONObject)) || (type == typeof(JSONArray)) || (type == typeof(String))) - { - if (variant.VariantType == type) - { - return true; - } - } - - if (variant.Get() == null) - { - return true; - } - - return false; - } - - private void Add(String key, String val) - { - let k = new String(key); - let v = new String(val); - dictionary.Add(k, Variant.Create(v, true)); - } - - private void Add(String key, JSONObject val) - { - let k = new String(key); - let v = new JSONObject(val); - dictionary.Add(k, Variant.Create(v, true)); - } - - private void Add(String key, JSONArray val) - { - let k = new String(key); - let v = new JSONArray(val); - dictionary.Add(k, Variant.Create(v, true)); - } - - public override void ToString(String str) - { - var keys = dictionary.Keys; - var tempStr = scope String(); - - str.Clear(); - str.Append("{"); - - var canParse = keys.MoveNext(); - while (canParse) - { - let currentKey = keys.Current; - - let variant = dictionary[currentKey]; - - switch (variant.VariantType) - { - case typeof(String): - tempStr.AppendF("\"{}\"", variant.Get()); - case typeof(JSONObject): - variant.Get().ToString(tempStr); - case typeof(JSONArray): - variant.Get().ToString(tempStr); - default: - tempStr.Set(String.Empty); - } - //str.Append(tempStr); - - str.AppendF("\"{}\":{}", currentKey, tempStr); - - if (canParse = keys.MoveNext()) - { - str.Append(","); - } - - tempStr.Clear(); - } - - str.Append("}"); - } - } -} diff --git a/Libs/JSON_Beef/lib/src/Util/AttributeChecker.bf b/Libs/JSON_Beef/lib/src/Util/AttributeChecker.bf deleted file mode 100644 index 99df9df..0000000 --- a/Libs/JSON_Beef/lib/src/Util/AttributeChecker.bf +++ /dev/null @@ -1,15 +0,0 @@ -using System.Reflection; -using JSON_Beef.Attributes; - -namespace JSON_Beef.Util -{ - public static class AttributeChecker - { - public static bool ShouldIgnore(FieldInfo field) - { - let shouldIgnore = field.GetCustomAttribute(); - - return ((shouldIgnore == .Ok) || field.HasFieldFlag(.PrivateScope) || field.HasFieldFlag(.Private)); - } - } -} diff --git a/Libs/JSON_Beef/lib/src/Util/JSONUtil.bf b/Libs/JSON_Beef/lib/src/Util/JSONUtil.bf deleted file mode 100644 index 7552af1..0000000 --- a/Libs/JSON_Beef/lib/src/Util/JSONUtil.bf +++ /dev/null @@ -1,266 +0,0 @@ -using System; -using JSON_Beef.Types; - -namespace JSON_Beef.Util -{ - public class JSONUtil - { - public static Result ParseNumber(String json) - { - if (!JSONValidator.IsValidNumber(json)) - { - return .Err(.INVALID_JSON_STRING); - } - - let type = typeof(T); - - if (!type.IsPrimitive) - { - return .Err(.INVALID_RETURN_TYPE); - } - - if (type.IsFloatingPoint) - { - return ParseFloatInternal(json); - } - - return ParseIntInternal(json); - } - - public static Result ParseBool(String json) - { - if (!JSONValidator.IsValidLiteral(json)) - { - return .Err(.INVALID_JSON_STRING); - } - - if (json.Equals("true")) - { - return .Ok(true); - } - else if (json.Equals("false")) - { - return .Ok(false); - } - else - { - return .Err(.INVALID_LITERAL_VALUE); - } - } - - [Obsolete("ParseFloat is deprecated. Use ParseNumber instead.", false)] - public static Result ParseFloat(String json) - { - return ParseFloatInternal(json); - } - - [Obsolete("ParseFloat is deprecated. Use ParseNumber instead.", false)] - public static Result ParseInt(String json) - { - return ParseIntInternal(json); - } - - private static Result ParseIntInternal(StringView json) - { - let idx = json.IndexOf('e'); - var expStartIdx = idx + 1; - - if (json.Contains('.')) - { - return .Err(.INVALID_NUMBER_REPRESENTATION); - } - - if (idx == -1) - { - return CastToRightInt(json); - } - - if ((json[idx + 1] == '-')) - { - return .Err(.INVALID_NUMBER_REPRESENTATION); - } - else if (json[idx + 1] == '+') - { - expStartIdx++; - } - - let numStr = scope String(json, 0, idx); - let expStr = StringView(json, expStartIdx, json.Length - expStartIdx); - - var exp = Int.Parse(expStr).Get(); - - for (var i = 0; i < exp; i++) - { - numStr.Append('0'); - } - - return CastToRightInt(numStr); - } - - private static Result CastToRightInt(StringView str) - { - let type = typeof(T); - T outNum = default; - - switch (type) - { - // Didn't find another way to cast when using reflection. - // Also, int8 and int16 do not provide a Parse method. - case typeof(int), typeof(int8), typeof(int16): - var num = int.Parse(str); - Internal.MemCpy(&outNum, &num, type.Size); - case typeof(int32): - var num = int32.Parse(str); - Internal.MemCpy(&outNum, &num, type.Size); - case typeof(int64): - var num = int64.Parse(str); - Internal.MemCpy(&outNum, &num, type.Size); - - // uint8/16 and char types do not provide a Parse method. - case typeof(uint), typeof(uint8), typeof(uint16), typeof(char8), typeof(char16), typeof(char32): - var num = uint.Parse(str); - Internal.MemCpy(&outNum, &num, type.Size); - case typeof(uint32): - var num = uint32.Parse(str); - Internal.MemCpy(&outNum, &num, type.Size); - case typeof(uint64): - var num = uint64.Parse(str); - Internal.MemCpy(&outNum, &num, type.Size); - default: - return .Err(.INVALID_TYPE); - } - - return .Ok(outNum); - } - - private static Result ParseFloatInternal(StringView json) - { - var str = scope String(json); - let isNeg = (str[0] == '-'); - - if (isNeg) - { - str.Remove(0); - } - - let idx = str.IndexOf('e'); - var pointIdx = str.IndexOf('.'); - var hasPoint = true; - var expStartIdx = idx + 1; - - if (idx == -1) - { - if (isNeg) - { - str.Insert(0, '-'); - } - - return CastToRightFloatingPoint(str); - } - - if (str[idx + 1] == '+') - { - expStartIdx++; - } - - let numStr = scope String(str, 0, idx); - let expStr = StringView(str, expStartIdx, str.Length - expStartIdx); - var exp = Int.Parse(expStr).Get(); - - if (pointIdx == -1) - { - pointIdx = numStr.Length; - hasPoint = false; - } - var newPointIdx = pointIdx + exp; - - if (hasPoint) - { - numStr.Replace('.', 'a'); - } - - if (newPointIdx == 0) - { - numStr.Insert(0, "0."); - } - else if (newPointIdx < 0) - { - var newNumStr = scope String(); - - while (newPointIdx < 0) - { - newNumStr.Append('0'); - newPointIdx++; - } - newNumStr.Insert(0, "0."); - numStr.Insert(0, newNumStr); - } - else if (newPointIdx > numStr.Length) - { - var zeroStr = scope String(); - var numberOfZero = (newPointIdx - numStr.Length) + ((hasPoint) ? (1): (0)); - - while (numberOfZero > 0) - { - zeroStr.Append('0'); - numberOfZero--; - } - numStr.Append(zeroStr); - } - else if (pointIdx != 0) - { - numStr.Insert(newPointIdx, "."); - } - - if (hasPoint) - { - numStr.Remove(numStr.IndexOf('a')); - } - - if (isNeg) - { - numStr.Insert(0, '-'); - } - - return CastToRightFloatingPoint(numStr); - } - - private static Result CastToRightFloatingPoint(StringView str) - { - let type = typeof(T); - T outNum = default; - - if (type == typeof(float)) - { - var res = Float.Parse(str); - Internal.MemCpy(&outNum, &res, type.Size); - } - else if (type == typeof(double)) - { - var res = Double.Parse(str); - Internal.MemCpy(&outNum, &res, type.Size); - } - else - { - return .Err(.INVALID_TYPE); - } - - return .Ok(outNum); - } - - public static JSON_LITERAL BoolToLiteral(bool b) - { - return (b) ? (JSON_LITERAL.TRUE) : (JSON_LITERAL.FALSE); - } - - public static Result LiteralToBool(JSON_LITERAL l) - { - if (l == .NULL) - { - return .Err(.INVALID_LITERAL_VALUE); - } - - return (l == .TRUE) ? (true) : (false); - } - } -} diff --git a/Libs/JSON_Beef/lib/src/Util/JSONValidator.bf b/Libs/JSON_Beef/lib/src/Util/JSONValidator.bf deleted file mode 100644 index 9e44c94..0000000 --- a/Libs/JSON_Beef/lib/src/Util/JSONValidator.bf +++ /dev/null @@ -1,442 +0,0 @@ -using System; -using System.Collections; - -namespace JSON_Beef.Util -{ - public class JSONValidator - { - public static bool IsValidJson(String json) - { - let c = json[0]; - let str = scope String(&json[0]); - - if (c == '[') - { - return IsValidArray(str); - } - else if (c == '{') - { - return IsValidObject(str); - } - - return false; - } - - public static bool IsValidString(String json) - { - var isValid = true; - - ValidateString(json, ref isValid); - - return isValid; - } - - public static bool IsValidNumber(String json) - { - var isValid = true; - - ValidateNumber(json, ref isValid); - - return isValid; - } - - public static bool IsValidLiteral(String json) - { - var isValid = true; - - ValidateLiteral(json, ref isValid); - - return isValid; - } - - public static bool IsValidObject(String json) - { - var isValid = true; - - ValidateObject(json, ref isValid); - - return isValid; - } - - public static bool IsValidArray(String json) - { - var isValid = true; - - ValidateArray(json, ref isValid); - - return isValid; - } - - private static int ValidateString(String json, ref bool isValid) - { - int i; - var foundEndString = false; - - List escapedChar = scope List(); - escapedChar.Add('\\'); - escapedChar.Add('\"'); - escapedChar.Add('\b'); - escapedChar.Add('\f'); - escapedChar.Add('\n'); - escapedChar.Add('\r'); - escapedChar.Add('\t'); - - if (json[0] != '"') - { - isValid = false; - return 0; - } - - for (i = 1; i < json.Length; i++) - { - let c = json[i]; - - if (!IsPrintable(c) && !escapedChar.Contains(c)) - { - isValid = false; - } - else if (c == '"') - { - foundEndString = true; - } - - if (!isValid || foundEndString) - { - break; - } - } - - isValid = foundEndString; - - return i; - } - - private static bool IsPrintable(char8 c) - { - return (c >= (char8)21) && (c <= (char8)126); - } - - private static int ValidateNumber(String json, ref bool isValid) - { - int i = 0; - var dotCount = 0; - var plusCount = 0; - var minusCount = 0; - var eCount = 0; - var gotDigit = false; - - if (!json[i].IsNumber && (json[i] != '-')) - { - isValid = false; - return 0; - } - else if (json[i].IsNumber) - { - gotDigit = true; - } - - for (i = 1; i < json.Length; i++) - { - let c = json[i]; - let prevC = json[i - 1]; - - if (!c.IsNumber) - { - if ((c == ',') || (c.IsWhiteSpace) || (c == ']') || (c == '}')) - { - break; - } - else if (!IsValidSymbol(c, prevC)) - { - isValid = false; - } - - if (((c == '.') && (dotCount >= 1)) || - ((c == '-') && (minusCount >= 1)) || - ((c == '+') && (plusCount >= 1)) || - ((c == 'e') && (eCount >= 1)) || - ((c == 'E') && (eCount >= 1))) - { - isValid = false; - } - - dotCount = (c == '.') ? (dotCount + 1) : (dotCount); - minusCount = (c == '-') ? (minusCount + 1) : (minusCount); - plusCount = (c == '+') ? (plusCount + 1) : (plusCount); - eCount = ((c == 'e') || (c == 'E')) ? (eCount + 1) : (eCount); - } - else - { - gotDigit = true; - } - - if (!isValid) - { - break; - } - } - - if (!gotDigit) - { - isValid = false; - } - - return i - 1; - } - - private static bool IsValidSymbol(char8 c, char8 prevC) - { - var isValid = true; - var symbols = scope List(); - symbols.Add('e'); - symbols.Add('E'); - symbols.Add('.'); - symbols.Add('+'); - symbols.Add('-'); - - if (!symbols.Contains(c)) - { - isValid = false; - } - else - { - if (((c == 'e') || (c == 'E') || (c == '.')) && (!prevC.IsNumber)) - { - isValid = false; - } - else if (((c == '+') || (c == '-')) && ((prevC != 'e') && (prevC != 'E'))) - { - isValid = false; - } - } - - return isValid; - } - - private static int ValidateLiteral(String json, ref bool isValid) - { - int i = 0; - var str = scope String(); - - isValid = false; - - for (i = 0; i < json.Length; i++) - { - let c = json[i]; - - if (!c.IsLetter) - { - break; - } - - str.Append(c); - } - - if (str.Equals("true") || (str.Equals("false") || str.Equals("null"))) - { - isValid = true; - } - - return i - 1; - } - - private static int ValidateObject(String json, ref bool isValid) - { - int i; - var lookForKey = true; - var lookForValueSeparator = false; - var lookForKeySeparator = false; - var lookForValue = false; - var keyCount = 0; - var valueCount = 0; - - if (json[0] != '{') - { - isValid = false; - return 0; - } - - for (i = 1; i < json.Length; i++) - { - let c = json[i]; - - if (!c.IsWhiteSpace) - { - if (c == '}') - { - break; - } - - if ((c != '"') && lookForKey) - { - isValid = false; - } - - if ((c != ':') && lookForKeySeparator) - { - isValid = false; - } - else if ((c == ':') && lookForKeySeparator) - { - lookForKeySeparator = false; - lookForValue = true; - } - - if ((c != ',') && (c != '}') && lookForValueSeparator) - { - isValid = false; - } - else if ((c == ',') && lookForValueSeparator) - { - lookForValueSeparator = false; - lookForKey = true; - } - - if (c == '"') - { - let str = scope String(&json[i]); - i += ValidateString(str, ref isValid); - - if (lookForKey) - { - lookForKey = false; - lookForKeySeparator = true; - keyCount++; - } - else - { - lookForValueSeparator = true; - lookForValue = false; - valueCount++; - } - } - else if (c.IsLetter && lookForValue) - { - let str = scope String(&json[i]); - i += ValidateLiteral(str, ref isValid); - lookForValueSeparator = true; - lookForValue = false; - valueCount++; - } - else if ((c.IsNumber || (c == '-')) && lookForValue) - { - let str = scope String(&json[i]); - i += ValidateNumber(str, ref isValid); - lookForValueSeparator = true; - lookForValue = false; - valueCount++; - } - else if ((c == '[') && lookForValue) - { - let str = scope String(&json[i]); - i += ValidateArray(str, ref isValid); - lookForValueSeparator = true; - lookForValue = false; - valueCount++; - } - else if ((c == '{') && lookForValue) - { - let str = scope String(&json[i]); - i += ValidateObject(str, ref isValid); - lookForValueSeparator = true; - lookForValue = false; - valueCount++; - } - } - - if (!isValid) - { - break; - } - } - - isValid = (isValid) ? (keyCount == valueCount) : (false); - - return i; - } - - private static int ValidateArray(String json, ref bool isValid) - { - int i; - var foundEndArray = false; - var lookForValueSeparator = false; - var lastChar = ' '; - - if (json[0] != '[') - { - isValid = false; - return 0; - } - - for (i = 1; i < json.Length; i++) - { - let c = json[i]; - - if (c == '[') - { - let str = scope String(&json[i]); - i += ValidateArray(str, ref isValid); - lookForValueSeparator = true; - lastChar = ' '; - } - else if ((c == ']') && (lastChar != ',')) - { - foundEndArray = true; - } - else if ((c == ']') && (lastChar == ',')) - { - isValid = false; - } - else if (c == '{') - { - let str = scope String(&json[i]); - i += ValidateObject(str, ref isValid); - lookForValueSeparator = true; - lastChar = ' '; - } - else if (c.IsNumber || (c == '-')) - { - let str = scope String(&json[i]); - i += ValidateNumber(str, ref isValid); - lookForValueSeparator = true; - lastChar = ' '; - } - else if (c.IsLetter) - { - let str = scope String(&json[i]); - i += ValidateLiteral(str, ref isValid); - lookForValueSeparator = true; - lastChar = ' '; - } - else if (c == '"') - { - let str = scope String(&json[i]); - i += ValidateString(str, ref isValid); - lookForValueSeparator = true; - lastChar = ' '; - } - else if ((c != ',') && (!c.IsWhiteSpace) && lookForValueSeparator && !foundEndArray) - { - isValid = false; - } - else if ((c == ',') && lookForValueSeparator) - { - lookForValueSeparator = false; - lastChar = ','; - } - else if ((c == ',') && !lookForValueSeparator) - { - isValid = false; - } - - if (!isValid || foundEndArray) - { - return i; - } - } - - isValid = foundEndArray; - return i; - } - } -} diff --git a/Libs/JSON_Beef/lib/src/Util/TypeChecker.bf b/Libs/JSON_Beef/lib/src/Util/TypeChecker.bf deleted file mode 100644 index 505093d..0000000 --- a/Libs/JSON_Beef/lib/src/Util/TypeChecker.bf +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; - -namespace JSON_Beef.Util -{ - public static class TypeChecker - { - public static bool IsTypeList(Type type) - { - let typeName = scope String(); - type.GetName(typeName); - - return typeName.Equals("List"); - } - - public static bool IsTypeList(Object object) - { - return IsTypeList(object.GetType()); - } - - public static bool IsUserObject(Type type) - { - if (type.IsObject && (typeof(String) != type)) - { - return true; - } - - return false; - } - - public static bool IsPrimitive(Type type) - { - return type.IsPrimitive || (typeof(String) == type); - } - } -} From 9f217e9b384418fa19cca15e3b301e31cec7b519 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sat, 22 Aug 2020 23:32:12 +0200 Subject: [PATCH 14/50] Add GLFW as submodule + Fixed style number parsing bug --- .gitmodules | 3 +++ Editor/src/Editor.bf | 11 +++++++++-- Editor/src/EditorLayer.bf | 4 +++- Editor/src/Windows/StyleWindow.bf | 10 +++++++++- Libs/GLFW | 1 + 5 files changed, 25 insertions(+), 4 deletions(-) create mode 160000 Libs/GLFW diff --git a/.gitmodules b/.gitmodules index 1597ddc..0bca8d7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "ImGui"] path = Libs/ImGui url = https://github.com/qzole/imgui-beef +[submodule "GLFW"] + path = Libs/GLFW + url = https://github.com/MineGame159/glfw-beef diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 7df6eab..666f805 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -334,13 +334,14 @@ namespace SteelEditor var str = scope String(); for (var char in enumerator) { - if (!char.IsDigit && char != '.') + if ((char == ']' || char == ',' || char.IsWhiteSpace) && char != '.') break; str.Append(char); } + enumerator.[Friend]mIndex--; - return new box float.Parse(str).Get(); + return new box (float) double.Parse(str).Get(); } Object ParseString(ref Span.Enumerator enumerator) @@ -366,5 +367,11 @@ namespace SteelEditor return new box val; } } + + public static void ResetStyle() + { + var style = ref ImGui.GetStyle(); + style = GetInstance()._editorLayer.[Friend]_originalStyle; + } } } diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 08f3e3c..151ce72 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -12,10 +12,10 @@ namespace SteelEditor { private Window _window; private List _editorWindows = new .(); - private bool _showDemoWindow = false; private String _iniPath = new .() ~ delete _; + private ImGui.Style _originalStyle; public this(Window window) : base("EditorLayer") { @@ -36,6 +36,8 @@ namespace SteelEditor style.WindowRounding = 0f; ImGui.StyleColorsClassic(&style); + _originalStyle = style; + ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, true); ImGuiImplOpengl3.Init(=> Glfw.GetProcAddress); diff --git a/Editor/src/Windows/StyleWindow.bf b/Editor/src/Windows/StyleWindow.bf index d506a4a..a88f8c1 100644 --- a/Editor/src/Windows/StyleWindow.bf +++ b/Editor/src/Windows/StyleWindow.bf @@ -9,7 +9,15 @@ namespace SteelEditor.Windows public override void OnRender() { - EditorGUI.AlignFromRight(60); + EditorGUI.AlignFromRight(170); + if (EditorGUI.Button("Reset")) + Editor.ResetStyle(); + + EditorGUI.SameLine(); + if (EditorGUI.Button("Reload")) + Editor.LoadConfig(); + + EditorGUI.SameLine(); if (EditorGUI.Button("Save")) Editor.SaveConfig(); diff --git a/Libs/GLFW b/Libs/GLFW new file mode 160000 index 0000000..90eb5de --- /dev/null +++ b/Libs/GLFW @@ -0,0 +1 @@ +Subproject commit 90eb5de79b7c482b2eeb1700459b8b03072e5d5f From 5b32d9be340b896ae2b1b6ae291d8d6fb6f0a7fd Mon Sep 17 00:00:00 2001 From: Fusion Date: Thu, 13 Aug 2020 19:59:45 +0200 Subject: [PATCH 15/50] GameConsole implementation --- Engine/src/Application.bf | 7 +- Engine/src/Console/CVar.bf | 158 ++++++++ Engine/src/Console/CVarFlags.bf | 21 ++ Engine/src/Console/CVarUtil.bf | 190 ++++++++++ Engine/src/Console/CommandsHistory.bf | 113 ++++++ Engine/src/Console/ConsoleLineParser.bf | 125 ++++++ Engine/src/Console/EnumUtils.bf | 26 ++ Engine/src/Console/GameConsole.bf | 482 ++++++++++++++++++++++++ Engine/src/Log.bf | 10 + 9 files changed, 1130 insertions(+), 2 deletions(-) create mode 100644 Engine/src/Console/CVar.bf create mode 100644 Engine/src/Console/CVarFlags.bf create mode 100644 Engine/src/Console/CVarUtil.bf create mode 100644 Engine/src/Console/CommandsHistory.bf create mode 100644 Engine/src/Console/ConsoleLineParser.bf create mode 100644 Engine/src/Console/EnumUtils.bf create mode 100644 Engine/src/Console/GameConsole.bf diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 7fe7ee9..67f920d 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -1,11 +1,12 @@ using System; +using System.Collections; using SteelEngine.Window; using SteelEngine.Events; using SteelEngine.Input; using SteelEngine.ECS; using SteelEngine.ECS.Systems; using SteelEngine.ECS.Components; -using System.Collections; +using SteelEngine.Console; namespace SteelEngine { @@ -21,7 +22,7 @@ namespace SteelEngine private List _componentsToDelete ~ delete _; private List _entitiesToRemoveFromStore ~ delete _; private GLFWInputManager _inputManager = new GLFWInputManager() ~ delete _; - + private GameConsole _gameConsole = new GameConsole() ~ delete _; public this() { @@ -101,6 +102,8 @@ namespace SteelEngine { Log.AddHandle(Console.Out); + _gameConsole.Initialize(scope String[]("config.cfg")); + _components = new Dictionary(); _componentsToDelete = new List(); _entitiesToRemoveFromStore = new List(); diff --git a/Engine/src/Console/CVar.bf b/Engine/src/Console/CVar.bf new file mode 100644 index 0000000..13350f1 --- /dev/null +++ b/Engine/src/Console/CVar.bf @@ -0,0 +1,158 @@ +using System; +using System.Collections; + +namespace SteelEngine.Console +{ + abstract class CVar + { + protected String _name ~ delete _; + protected String _help ~ delete _; + + public StringView Name => _name; + public StringView Help => _help; + public CVarFlags Flags { get; protected set; } + + public bool HasFlags(CVarFlags flags) => Flags.HasFlag(flags); + public void AddFlags(CVarFlags flags) => Flags |= flags; + public void RemoveFlags(CVarFlags flags) => Flags &= ~flags; + + public abstract Type Type { get; } + + public abstract int32 GetValueInt32(); + public abstract int64 GetValueInt64(); + public abstract float GetValueFloat() ; + public abstract StringView GetValueString(String buffer) ; + + public abstract Result Execute(StringView strArgs, Span args); + + public virtual bool IsCommand => false; + + protected this(StringView name, StringView help, CVarFlags flags) + { + _name = new .(name); + _help = new .(help); + Flags = flags; + } + } + + public delegate void OnCVarChange(CVar cvar); + + class ConsoleVar : CVar where T : var + { + protected T* _value; + + public ref T Value => *_value; + + public override Type Type => typeof(T); + + public override int32 GetValueInt32() { return CVarUtil.GetValueInt32(*_value); } + public override int64 GetValueInt64() { return CVarUtil.GetValueInt64(*_value); } + public override float GetValueFloat() { return CVarUtil.GetValueFloat(*_value); } + public override StringView GetValueString(String buffer) + { + let start = buffer.Length; + (*_value).ToString(buffer); + return .(buffer, start); + } + + public override Result Execute(StringView strArgs, Span args) + { + bool changed; + if (args.Length >= 1 && CVarUtil.TryParse(this, args, ref *_value, out changed)) + { + return changed; + } + + return .Err; + } + + public override void ToString(String strBuffer) + { + strBuffer.AppendF("{0} ", Name); + GetValueString(strBuffer); + } + + public this(StringView name, StringView help, T* val, CVarFlags flags) : base(name, help, flags) + { + _value = val; + } + } + + + class EnumConsoleVar : ConsoleVar where TEnum: Enum + { + public override int32 GetValueInt32() { return (*_value); } + public override int64 GetValueInt64() { return (*_value); } + public override float GetValueFloat() { return (int)(*_value); } + + + public this(StringView name, StringView help, TEnum* val, CVarFlags flags) : base(name, help, val, flags) + { + + } + } + + public delegate bool OnCmdExecute(CVar cmd, StringView line, Span args); + public delegate void OnCmdExecuteNoArgs(); + public delegate void OnCmdExecuteLineArgs(StringView line, Span args); + + class ConsoleCommand : CVar where OnExecute : Delegate + { + protected OnExecute _onExecute ~ delete _; + + public override Type Type => typeof(OnExecute); + + public override int32 GetValueInt32() => 0; + public override int64 GetValueInt64() => 0; + public override float GetValueFloat() => 0; + public override StringView GetValueString(String buffer) => default; + + public override bool IsCommand => true; + + public override void ToString(String strBuffer) + { + strBuffer.AppendF("{0}", Name); + } + + public this(StringView name, StringView help, OnExecute onExec, CVarFlags flags) : base(name, help, flags) + { + _onExecute = onExec; + } + } + + extension ConsoleCommand where OnExecute : OnCmdExecute + { + public override Result Execute(StringView strArgs, Span args) + { + if (_onExecute == null) + return .Err; + + return _onExecute(this, strArgs, args) ? .Ok(false) : .Err; + } + } + + extension ConsoleCommand where OnExecute : OnCmdExecuteNoArgs + { + public override Result Execute(StringView strArgs, Span args) + { + if (_onExecute == null) + return .Err; + + _onExecute(); + return false; + } + } + + extension ConsoleCommand where OnExecute : OnCmdExecuteLineArgs + { + public override Result Execute(StringView strArgs, Span args) + { + if (_onExecute == null) + return .Err; + + _onExecute(strArgs, args); + return false; + } + } + +} diff --git a/Engine/src/Console/CVarFlags.bf b/Engine/src/Console/CVarFlags.bf new file mode 100644 index 0000000..838f39c --- /dev/null +++ b/Engine/src/Console/CVarFlags.bf @@ -0,0 +1,21 @@ +namespace SteelEngine.Console +{ + enum CVarFlags + { + None = 0x0000, + /// Can be executed only when cheats are enabled + Cheat = 0x0001, + /// Indicates that this CVar will change value on registration to match value in configuration file + Config = 0x0002, + /// This flag is set when CVar was present in configuration file + WasInConfig = 0x0004, + /// This flags is set when CVar value is changed after configuration file was loaded + Changed = 0x0008, + /// CVar won't show in console but its value can be changed through code + Hidden = 0x0010, + /// OnChange callback will always be called even when value didn't change + AlwaysOnChange = 0x0020, + /// Disable value check for enum variables + Flags = 0x0040 + } +} diff --git a/Engine/src/Console/CVarUtil.bf b/Engine/src/Console/CVarUtil.bf new file mode 100644 index 0000000..5a34ecf --- /dev/null +++ b/Engine/src/Console/CVarUtil.bf @@ -0,0 +1,190 @@ +using System; + +namespace SteelEngine.Console +{ + static class CVarUtil + { + public static bool TryParse(CVar cvar, Span args, ref bool result, out bool didChange) + { + let currentVal = result; + String lowercase = scope String(args[0])..ToLower(); + + switch (lowercase) + { + case "true", "1": + result = true; + case "false", "0": + result = false; + default: + switch (int.Parse(lowercase)) + { + case .Err: + return false; + case .Ok(let val): + result = val != 0; + } + } + didChange = result != currentVal; + return true; + } + + public static bool TryParse(CVar cvar, Span args, ref int32 result, out bool didChange) + { + let currentVal = result; + if (int32.Parse(args[0]) case .Ok(let val)) + { + result = val; + didChange = result != currentVal; + return true; + } + + didChange = false; + return false; + } + + public static bool TryParse(CVar cvar, Span args, ref int64 result, out bool didChange) + { + let currentVal = result; + if (int64.Parse(args[0]) case .Ok(let val)) + { + result = val; + didChange = result != currentVal; + return true; + } + + didChange = false; + return false; + } + + public static bool TryParse(CVar cvar, Span args, ref float result, out bool didChange) + { + let currentVal = result; + if (float.Parse(args[0]) case .Ok(let val)) + { + result = val; + didChange = result != currentVal; + return true; + } + + didChange = false; + return false; + } + + public static bool TryParse(CVar cvar, Span args, ref String result, out bool didChange) + { + didChange = result != args[0]; + result.Clear(); + result.Append(args[0]); + return true; + } + + public static bool TryParse(CVar cvar, Span args, ref TEnum result, out bool didChange) where TEnum : Enum + { + let currentVal = result; + + if (TEnum.Parse(args[0], true) case .Ok(let val)) + { + result = val; + didChange = result != currentVal; + return true; + } + if ((int64.Parse(args[0]) case .Ok(var iVal)) && (cvar.HasFlags(.Flags) || EnumUtils.HasValue(iVal))) + { + result = *(TEnum*)&iVal; + didChange = result != currentVal; + return true; + } + + didChange = false; + return false; + } + + public static int32 GetValueInt32(bool* val) + { + return *val ? 1 : 0; + } + + public static int32 GetValueInt32(int32* val) + { + return *val; + } + + public static int32 GetValueInt32(int64* val) + { + return (int32)*val; + } + + public static int32 GetValueInt32(float* val) + { + return (int32)*val; + } + + public static int32 GetValueInt32(String* val) + { + if (int32.Parse(*val) case .Ok(let res)) + { + return res; + } + return (int32)(*val).GetHashCode(); + } + + public static int32 GetValueInt64(bool* val) + { + return *val ? 1 : 0; + } + + public static int64 GetValueInt64(int32* val) + { + return (int64)*val; + } + + public static int64 GetValueInt64(int64* val) + { + return *val; + } + + public static int64 GetValueInt64(float* val) + { + return (int64)*val; + } + + public static int64 GetValueInt64(String* val) + { + if (int64.Parse(*val) case .Ok(let res)) + { + return res; + } + return (*val).GetHashCode(); + } + + public static int32 GetValueFloat(bool* val) + { + return *val ? 1 : 0; + } + + public static float GetValueFloat(int32* val) + { + return (float)*val; + } + + public static float GetValueFloat(int64* val) + { + return (float)*val; + } + + public static float GetValueFloat(float* val) + { + return *val; + } + + public static float GetValueFloat(String* val) + { + if (float.Parse(*val) case .Ok(let res)) + { + return res; + } + return 0; + } + + } +} diff --git a/Engine/src/Console/CommandsHistory.bf b/Engine/src/Console/CommandsHistory.bf new file mode 100644 index 0000000..f4b7142 --- /dev/null +++ b/Engine/src/Console/CommandsHistory.bf @@ -0,0 +1,113 @@ +using System; + +namespace SteelEngine.Console +{ + class CommandsHistory + { + private String[] _history ~ DeleteContainerAndItems!(_); + private int _count = 0; + private int _addPos = 0; + + private int _historyPos = 0; + + public this(int maxCount) + { + _history = new String[maxCount]; + for (var item in ref _history) + item = new String(); + } + + public void Resize(int newSize) + { + if (newSize <= 0 && newSize != _history.Count) + return; + + _historyPos = 0; + + String[] newHistory = new String[newSize]; + + let count = Math.Min(newHistory.Count, _count); + int i; + for (i = 0; i < count; i++) + { + newHistory[i] = StringAt(i+1); + } + + // Delete elements that did not fit into new history + for (i = i+1; i <= _count; i++) + delete StringAt(i); + + // Allocate elements that were not copied from old history + for (i = _history.Count; i < newHistory.Count; i++) + newHistory[i] = new String(); + + _count = Math.Min(_history.Count, newHistory.Count); + _addPos = _count - 1; + + delete _history; + _history = newHistory; + } + + public void Add(StringView line) + { + _historyPos = 0; + + // Don't add line if it is same as last entry + if(At(1).Equals(line)) + return; + + _addPos++; + _count++; + if (_addPos == _history.Count) + _addPos = 0; + + if (_count > _history.Count) + _count--; + + let item = _history[_addPos]; + item.Set(line); + } + + public StringView HistoryUp() + { + if (_historyPos < _count) + _historyPos++; + + return At(_historyPos); + } + + public StringView HistoryDown() + { + if (_historyPos > 0) + _historyPos--; + + return At(_historyPos); + } + + protected String StringAt(int index) + { + // index 0 = empty string + // index 1 = last added entry + // index >= _Count = first entry in history + + // @TODO(fusion) - revisit this code, have feeling this can be simplified + + if (index == 0) + return default; + + if (_count < _history.Count) + return _history[_addPos - index + 1]; + + if (index >= _count) + return _history[(_addPos+1) % _count]; + + var i = (_addPos - index + 1) % _count; + if (i < 0) + return _history[_count + i]; + + return _history[i]; + } + + public StringView At(int index) => StringAt(index); + } +} diff --git a/Engine/src/Console/ConsoleLineParser.bf b/Engine/src/Console/ConsoleLineParser.bf new file mode 100644 index 0000000..38d70ce --- /dev/null +++ b/Engine/src/Console/ConsoleLineParser.bf @@ -0,0 +1,125 @@ +using System; +using System.Collections; + +namespace SteelEngine.Console +{ + class ConsoleLineParser + { + const char8 SEPARATOR_CHAR = ';'; + const char8 QUOTE_CHAR = '"'; + const char8 COMMENT_CHAR = '#'; + + static void SkipWhitespace(StringView input, ref int i) + { + while (i < input.Length) + { + if (!input[i].IsWhiteSpace) + break; + + i++; + } + } + + static StringView? ParseNormal(StringView input, ref int i) + { + let startPos = i; + while (i < input.Length) + { + if (input[i].IsWhiteSpace || input[i] == SEPARATOR_CHAR || input[i] == COMMENT_CHAR) + break; + + i++; + } + + if (startPos < i) + return .(input, startPos, i - startPos); + + return default; + } + + static StringView? ParseQuotes(StringView input, ref int i) + { + // @TODO(fusion) - how to handle when quote is not in pair currently this is ignored + // @TODO(fusion) - escaped quotes keep the backslash char, they should be removed + + bool isPair = false; + var startPos = i; + + while (i < input.Length) + { + i++; + + if (input[i] == QUOTE_CHAR && input[i-1] != '\\') + { + isPair = true; + i++; + break; + } + } + + if (startPos < i) + { + if (isPair) + { + startPos++; + return .(input, startPos, i - 1 - startPos); + } + + return .(input, startPos, i - startPos); + } + + return default; + } + + public static bool Tokenize(StringView input, ref int i, ref int start, List tokens) + { + tokens.Clear(); + + while (i < input.Length) + { + SkipWhitespace(input, ref i); + if (i < input.Length) + { + if (tokens.IsEmpty) + start = i; + + if (input[i] == COMMENT_CHAR) + break; + + if (input[i] == SEPARATOR_CHAR && !tokens.IsEmpty) + break; + + StringView? token; + if (input[i] == '"') + token = ParseQuotes(input, ref i); + else + token = ParseNormal(input, ref i); + + if (token.HasValue) + tokens.Add(token.Value); + else + i++; + } + } + return !tokens.IsEmpty; + } + + // Sets output to contain all tokens and + // transforms tokens to be relative to output string + public static bool Tokenize(StringView input, ref int i, ref int start, List tokens, String output) + { + if (Tokenize(input, ref i, ref start, tokens)) + { + output.Set(StringView(input, start, i - start)); + for (var t in ref tokens) + { + let offset = (t.Ptr - input.Ptr) - start; + t = .(output, offset, t.Length); + } + return true; + } + + return false; + } + } +} diff --git a/Engine/src/Console/EnumUtils.bf b/Engine/src/Console/EnumUtils.bf new file mode 100644 index 0000000..0d0563d --- /dev/null +++ b/Engine/src/Console/EnumUtils.bf @@ -0,0 +1,26 @@ +using System; +using System.Collections; + +namespace SteelEngine.Console +{ + public static class EnumUtils where TEnum : Enum + { + private static HashSet _values ~ delete _; + + static this() + { + _values = new .(); + + let type = typeof(TEnum); + for (var field in type.GetFields()) + { + _values.Add(field.[Friend]mFieldData.[Friend]mData); + } + } + + public static bool HasValue(int iVal) + { + return _values.Contains(iVal); + } + } +} diff --git a/Engine/src/Console/GameConsole.bf b/Engine/src/Console/GameConsole.bf new file mode 100644 index 0000000..e6a2618 --- /dev/null +++ b/Engine/src/Console/GameConsole.bf @@ -0,0 +1,482 @@ +using System; +using System.Collections; +using System.IO; +using SteelEngine.Console; + +namespace SteelEngine +{ + class GameConsole + { + struct ConfigVarValue : IDisposable + { + public String line; + public StringView[] args; + + public void Dispose() + { + delete line; + delete args; + } + } + + public struct LineEntry : IDisposable + { + public LogLevel level; + public String message; + + public void Dispose() + { + delete message; + } + } + + static Self _instance; + public static Self Instance => _instance; + + Dictionary _cvars = new Dictionary() ~ delete _; + Dictionary _cvarChangedCallbacks = new Dictionary() ~ delete _; + Dictionary _configVars = new Dictionary() ~ delete _; + Queue _enqueuedCommands = new Queue() ~ delete _; + CommandsHistory _history ~ delete _; + int32 _historySize = 50; + + int _maxLines = 1000; + List _lines = new List() ~ delete _; + + public CommandsHistory History => _history; + + bool _cvarCheatsEnabled = false; + float _cvarWaitTime = 0; + int _cvarWaitFrames = 0; + + public LogLevel logLevel = .Info; + + LogCallback _logCallback = new => OnLogCallback ~ delete _; + + bool _opened = false; + public bool IsOpen = _opened; + + public this() + { + _instance = this; + } + + public ~this() + { + Log.RemoveCallback(_logCallback); + + for (let cvar in _cvars.Values) + delete cvar; + + for (let cb in _cvarChangedCallbacks.Values) + delete cb; + + for (let line in _lines) + line.Dispose(); + + for (let val in _configVars.Values) + val.Dispose(); + } + + public void Initialize(Span configFiles) + { + Log.AddCallback(_logCallback); + + for (var file in configFiles) + { + if (LoadConfigFile(file) case .Err(let err)) + { + Log.Error("Couldn't open configuration file {0} ({1})", file, err); + } + } + + RegisterVariable("console.historysize", "Size of commands history.", ref _historySize, .Config, new (cvar) => { _historySize = Math.Max(1, _historySize); History.Resize(_historySize); } ); + _history = new CommandsHistory(_historySize); + + RegisterVariable("console.loglevel", "Minimal level message need to be to be logged into console", ref logLevel, .Config); + RegisterVariable("sv.cheats", "Enable execution of commands with Cheat flag.", ref _cvarCheatsEnabled); + RegisterVariable("wait.frames", "Wait number of frames before continuing execution of commands.", ref _cvarWaitFrames); + RegisterVariable("wait.seconds", "Wait number of real time seconds before continuing execution of commands.", ref _cvarWaitTime); + + RegisterCommand("echo", "Print message", new (line, args) => + { + PrintInfo(line); + }); + + RegisterCommand("help", "Show list of variables and commands", new (line, args) => + { + StringView filter = args.Length > 0 ? args[0] : default; + + String buffer = scope .(); + + for (let cvar in _cvars.Values) + { + if (!cvar.HasFlags(.Hidden) && (filter.IsEmpty || cvar.Name.Contains(filter))) + { + buffer.Append(" "); + buffer.Append(cvar.Name); + if (!cvar.Help.IsEmpty) + buffer.AppendF(" - {0}", cvar.Help); + buffer.Append("\n"); + } + } + + PrintInfo(buffer); + }); + + RegisterCommand("exec", "Execute file", new (line, args) => + { + if (args.Length > 0 && ExecuteFile(args[0]) case .Err(let err)) + { + PrintErrorF("Couldn't execute file {0} ({1}).", args[0], err); + } + }); + + RegisterCommand("cls", "Clear console", new () => + { + Clear(); + }); + } + + void OnLogCallback(LogLevel logLevel, StringView message) + { + if (logLevel < logLevel) + return; + + PrintLine(logLevel, message); + } + + public void Open() + { + _opened = true; + } + + public void Close() + { + _opened = false; + } + + public void Toggle() + { + _opened = !_opened; + } + + public void Clear() + { + for (let l in _lines) + l.Dispose(); + + _lines.Clear(); + } + + + protected void PrintLine(LogLevel logLevel, StringView message) + { + LineEntry entry = LineEntry() { level = logLevel }; + if (_lines.Count < _maxLines) + { + entry.message = new String(message); + } + else + { + entry.message = _lines.PopFront().message..Set(message); + } + + _lines.Add(entry); + } + + protected void PrintLineF(LogLevel logLevel, StringView format, params Object[] args) + { + String buffer = scope .(); + buffer.AppendF(format, params args); + PrintLine(logLevel, buffer); + } + + public void PrintInfo(StringView message) => PrintLine(.Info, message); + public void PrintInfoF(StringView format, params Object[] args) => PrintLineF(.Info, format, params args); + public void PrintWarning(StringView message) => PrintLine(.Warning, message); + public void PrintWarningF(StringView format, params Object[] args) => PrintLineF(.Warning, format, params args); + public void PrintError(StringView message) => PrintLine(.Warning, message); + public void PrintErrorF(StringView format, params Object[] args) => PrintLineF(.Warning, format, params args); + + protected mixin CheckCVarRegistered(StringView name) + { + if (_cvars.TryGetValue(name, let cvar)) + { + Log.Warning("CVar {0} already registered!", name); + return cvar; + } + } + + protected void LoadConfigVarValue(CVar cvar) + { + if (_configVars.GetAndRemove(cvar.Name) case .Ok(var val)) + { + if (cvar.Execute(val.value.line, val.value.args) case .Ok) + { + cvar.AddFlags(.WasInConfig); + } + else + { + Log.Error("Error occurred while setting configuration variable. Can't set value of {0} to {1}", cvar.Name, val.value.args[0]); + } + val.value.Dispose(); + } + } + + protected CVar RegisterCVar(CVar cvar, OnCVarChange onChange) + { + if (cvar.HasFlags(.Config)) + LoadConfigVarValue(cvar); + + if (onChange != null) + _cvarChangedCallbacks[cvar.Name] = onChange; + + return _cvars[cvar.Name] = cvar; + } + + public CVar RegisterVariable(StringView name, StringView help, ref bool varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); + } + + public CVar RegisterVariable(StringView name, StringView help, ref int32 varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); + } + + public CVar RegisterVariable(StringView name, StringView help, ref int64 varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); + } + + public CVar RegisterVariable(StringView name, StringView help, ref float varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); + } + + public CVar RegisterVariable(StringView name, StringView help, ref String varRef, CVarFlags flags = .None, OnCVarChange onChange = null) + { + CheckCVarRegistered!(name); + return RegisterCVar(new ConsoleVar(name, help, &varRef, flags), onChange); + } + + public CVar RegisterVariable(StringView name, StringView help, ref TEnum varRef, CVarFlags flags = .None, OnCVarChange onChange = null) where TEnum : Enum + { + CheckCVarRegistered!(name); + return RegisterCVar(new EnumConsoleVar(name, help, &varRef, flags), onChange); + } + + public CVar RegisterCommand(StringView name, StringView help, OnCmdExecute onExecute, CVarFlags flags = .None) => RegisterCommand(name, help, onExecute, flags); + public CVar RegisterCommand(StringView name, StringView help, OnCmdExecuteNoArgs onExecute, CVarFlags flags = .None) => RegisterCommand(name, help, onExecute, flags); + public CVar RegisterCommand(StringView name, StringView help, OnCmdExecuteLineArgs onExecute, CVarFlags flags = .None) => RegisterCommand(name, help, onExecute, flags); + + protected CVar RegisterCommand(StringView name, StringView help, TDelegate onExecute, CVarFlags flags) where TDelegate : Delegate + { + CheckCVarRegistered!(name); + let cvar = new ConsoleCommand(name, help, onExecute, flags); + return _cvars[cvar.Name] = cvar; + } + + public bool UnregisterCVar(StringView name) + { + if (_cvars.GetAndRemove(name) case .Ok(let val)) + { + if ( _cvarChangedCallbacks.TryGetValue(name, let cb)) + delete cb; + + delete val.value; + return true; + } + return false; + } + + public bool UnregisterCVar(CVar cvar) + { + return UnregisterCVar(cvar.Name); + } + + public CVar GetCVar(StringView name) + { + return _cvars.GetValueOrDefault(name); + } + + public void Execute(StringView cmdLine) + { + int i, start; + start = i = 0; + + List tokens = scope .(); + + while (ConsoleLineParser.Tokenize(cmdLine, ref i, ref start, tokens)) + { + StringView command = .(cmdLine, start, i - start); + ExecuteLineTokens(command, .(tokens.Ptr, tokens.Count)); + } + } + + protected void ExecuteLineTokens(StringView line, Span tokens) + { + let cmdName = tokens[0]; + if (_cvars.TryGetValue(cmdName, let cvar) && !cvar.HasFlags(.Hidden)) + { + // If CVar is not command and there are no arguments specified just print its value + if (tokens.Length == 1 && !cvar.IsCommand) + { + String buffer = scope .(); + cvar.ToString(buffer); + PrintInfo(buffer); + + return; + } + + // If the command is entered with ? parameter show its description + if (tokens.Length > 1 && tokens[1] == "?") + { + String buffer = scope .(); + buffer.AppendF("{0} ", cvar.Name); + let strVal = cvar.GetValueString(buffer); + if (!strVal.IsEmpty) + buffer.Append(' '); + + if (!cvar.Help.IsEmpty) + buffer.AppendF("- {0}", cvar.Help); + + PrintInfo(buffer); + return; + } + + if (cvar.HasFlags(.Cheat) && !_cvarCheatsEnabled) + { + PrintErrorF("{0} can only be executed when cheats are enabled.", cvar.Name); + return; + } + + StringView strArgs = line; + if (tokens.Length > 1) + { + strArgs = .(line, tokens[1].Ptr - line.Ptr); + } + + let result = cvar.Execute(strArgs, .(tokens.Ptr+1, tokens.Length-1)); + if (result case .Ok(let changed)) + { + if ((changed || cvar.HasFlags(.AlwaysOnChange)) && _cvarChangedCallbacks.TryGetValue(cvar.Name, let callback)) + { + callback(cvar); + } + } + else + { + PrintErrorF("Error occurred while executing {0}.", cmdName); + } + } + else + { + PrintErrorF("Couldn't find {0} in registered cvars.", cmdName); + } + } + + protected void AddHistory(StringView cmdLine) + { + _history.Add(cmdLine); + } + + public void Enqueue(StringView cmdLine) + { + AddHistory(cmdLine); + EnqueueNoHistory(cmdLine); + } + + public void EnqueueNoHistory(StringView cmdLine) + { + _enqueuedCommands.Enqueue(new .(cmdLine)); + } + + public void Update() + { + if (_cvarWaitTime > 0) { + _cvarWaitTime -= Time.DeltaTimeUnscaled; + return; + } + + if (_cvarWaitFrames > 0) { + _cvarWaitFrames--; + return; + } + + while (!(_cvarWaitTime > 0 || _cvarWaitFrames > 0) && _enqueuedCommands.Count > 0) + { + let line = _enqueuedCommands.Dequeue(); + Execute(line); + delete line; + } + } + + public Result ExecuteFile(StringView path) + { + StreamReader reader = scope .(); + if (reader.Open(path) case .Err(let err)) + return .Err(err); + + String buffer = scope .(); + while (reader.ReadLine(buffer) case .Ok) + { + EnqueueNoHistory(buffer); + } + + return .Ok; + } + + private Result LoadConfigFile(StringView path) + { + StreamReader reader = scope .(); + if (reader.Open(path) case .Err(let err)) + return .Err(err); + + String buffer = scope .(); + List tokens = scope .(); + + String line = new .(); + + while (reader.ReadLine(buffer) case .Ok) + { + int i = 0; + int start = 0; + + while (ConsoleLineParser.Tokenize(buffer, ref i, ref start, tokens, line)) + { + if (tokens.Count < 2) + continue; + + let name = tokens[0]; + if (_configVars.GetAndRemove(name) case .Ok(let val)) + { + val.value.Dispose(); + } + + StringView[] args = new StringView[tokens.Count-1]; + tokens.CopyTo(1, args, 0, tokens.Count-1); + _configVars.Add(name, ConfigVarValue() + { + line = line, + args = args + }); + line = new .(); + + } + + buffer.Clear(); + } + + delete line; + return .Ok; + } + + public IEnumerator GetCVars() => _cvars.Values; + } +} diff --git a/Engine/src/Log.bf b/Engine/src/Log.bf index 24c78f6..87bf330 100644 --- a/Engine/src/Log.bf +++ b/Engine/src/Log.bf @@ -5,13 +5,20 @@ using System.Diagnostics; namespace SteelEngine { + public delegate void LogCallback(LogLevel level, StringView message); + public static class Log { public static LogLevel LogLevel = .Trace; private static List _handles = new .() ~ delete _; + private static List _callbacks = new .() ~ delete _; public static void AddHandle(StreamWriter handle) => _handles.Add(handle); + public static bool RemoveHandle(StreamWriter handle) => _handles.Remove(handle); + + public static void AddCallback(LogCallback cb) => _callbacks.Add(cb); + public static bool RemoveCallback(LogCallback cb) => _callbacks.Remove(cb); public static void Trace(StringView format, params Object[] args) => Print(.Trace, format, params args); public static void Info(StringView format, params Object[] args) => Print(.Info, format, params args); @@ -56,6 +63,9 @@ namespace SteelEngine for (var handle in _handles) handle.WriteLine(line); + for (var cb in _callbacks) + cb(level, message); + Console.ForegroundColor = origin; // Set color back to original } } From 9d945c80e7de857c825c3ae221f23326c931cb2a Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sun, 23 Aug 2020 16:12:26 +0200 Subject: [PATCH 16/50] GameConsole changes + Fixed ConsoleWindow + Removed column separator --- Editor/src/Editor.bf | 5 ++++- Editor/src/EditorGUI.bf | 8 +++++-- Editor/src/EditorLayer.bf | 9 ++------ Editor/src/Windows/ConsoleWindow.bf | 33 ++++++++++------------------- Engine/src/Application.bf | 2 ++ Engine/src/Console/GameConsole.bf | 13 +----------- Engine/src/SteelPath.bf | 5 +++++ 7 files changed, 31 insertions(+), 44 deletions(-) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 666f805..28aa1ac 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -160,7 +160,7 @@ namespace SteelEditor delete config; var configPath = scope String(); - SteelPath.GetEditorUserFile("Config.txt", configPath); + SteelPath.GetEditorUserFile("Config.txt", configPath, true); if (File.WriteAllText(configPath, serialized) case .Err) Log.Error("Failed to save style"); @@ -191,7 +191,10 @@ namespace SteelEditor SteelPath.GetEditorUserFile("Config.txt", configPath); var serialized = new String(); if (File.ReadAllText(configPath, serialized) case .Err) + { + delete serialized; return; + } var config = new Dictionary(); diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index d00acce..3ffcbae 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -41,11 +41,13 @@ namespace SteelEditor if (label.StartsWith("##")) return false; + ImGui.Columns(2); ImGui.AlignTextToFramePadding(); + Text(label); - CheckItem(); - ImGui.NextColumn(); + CheckItem(false); + ImGui.SameLine(30); FillWidth(); @@ -251,7 +253,9 @@ namespace SteelEditor public static void Line() { + ImGui.PopStyleColor(); ImGui.Separator(); + ImGui.PushStyleColor(.Separator, ImGui.Vec4(0, 0, 0, 0)); } public static void SameLine(float offset = 0) diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 151ce72..52ddaff 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -35,6 +35,7 @@ namespace SteelEditor style.WindowMenuButtonPosition = .None; // This disables the collapse button on windows style.WindowRounding = 0f; ImGui.StyleColorsClassic(&style); + ImGui.PushStyleColor(.Separator, ImGui.Vec4(0, 0, 0, 0)); _originalStyle = style; @@ -81,7 +82,7 @@ namespace SteelEditor ImGui.EndMenu(); } - if (ImGui.BeginMenu("Window")) + if (ImGui.BeginMenu("View")) { for (var window in _editorWindows) { @@ -89,18 +90,12 @@ namespace SteelEditor ShowWindow(window); } - if (ImGui.MenuItem("Demo")) - _showDemoWindow = true; - ImGui.EndMenu(); } ImGui.EndMainMenuBar(); } - if (_showDemoWindow) - ImGui.ShowDemoWindow(&_showDemoWindow); - // Update ImGui windows for (var window in _editorWindows) { diff --git a/Editor/src/Windows/ConsoleWindow.bf b/Editor/src/Windows/ConsoleWindow.bf index b6a669b..2ab750b 100644 --- a/Editor/src/Windows/ConsoleWindow.bf +++ b/Editor/src/Windows/ConsoleWindow.bf @@ -13,19 +13,18 @@ namespace SteelEditor.Windows { public override StringView Title => "Console"; - public Color TraceColor = .(0.603f, 0.603f, 0.035f, 1f); + public Color TraceColor = .(0.45f, 0.45f, 0.45f, 1f); public Color WarningColor = .(0.93f, 0.82f, 0.01f, 1f); public Color ErrorColor = .(0.952f, 0.2f, 0.011f, 1f); private String _commandBuffer = new .() ~ delete _; - private List<(String str, LogLevel level)> _log = new .() ~ { ClearLog(); delete _log; }; private bool _scrollToBottom = false; - private GameConsole _gameConsole = new .() ~ delete _; private int _commandStartIndex = 0; private int _commandIndex = 0; private int _newCommandIndex = 1; + private int _lastLogCount = 0; private bool _showErrors = true; private bool _showWarnings = true; @@ -34,20 +33,13 @@ namespace SteelEditor.Windows private const float CLEAR_BUTTON_OFFSET = 55; - public override void OnInit() - { - Log.AddCallback(new (str, level) => _log.Add((new String(str), level))); - - _gameConsole.Initialize(scope List()); - } - public override void OnRender() { EditorGUI.ToggleButton("Errors", ref _showErrors); EditorGUI.AlignFromRight(CLEAR_BUTTON_OFFSET); if (EditorGUI.Button("Clear")) - _gameConsole.Clear(); + GameConsole.Instance.Clear(); EditorGUI.ToggleButton("Warnings", ref _showWarnings); EditorGUI.ToggleButton("Info", ref _showInfo); @@ -56,7 +48,7 @@ namespace SteelEditor.Windows var footerSpacing = EditorGUI.GetHeightOfItems(1); EditorGUI.BeginScrollingRegion("CommandScrollingRegion", -footerSpacing); - for (var line in _gameConsole.[Friend]_lines) + for (var line in GameConsole.Instance.[Friend]_lines) { if (!_showErrors && line.level == .Error || !_showWarnings && line.level == .Warning || @@ -88,6 +80,12 @@ namespace SteelEditor.Windows EditorGUI.Text(line.message); } + if (_lastLogCount != GameConsole.Instance.[Friend]_lines.Count) + { + _lastLogCount = GameConsole.Instance.[Friend]_lines.Count; + _scrollToBottom = true; + } + if (_scrollToBottom) ImGui.SetScrollHereY(1.0f); _scrollToBottom = false; @@ -99,12 +97,10 @@ namespace SteelEditor.Windows var inputCallback = EditorGUI.Input(scope String()..AppendF("##CommandInputBuffer_{}", _commandIndex), _commandBuffer, "", 256); if (inputCallback.OnEnter && !_commandBuffer.IsEmpty) { - _gameConsole.[Friend]AddHistory(_commandBuffer); - ImGui.SetKeyboardFocusHere(-1); _scrollToBottom = true; - _gameConsole.Enqueue(_commandBuffer); + GameConsole.Instance.Enqueue(_commandBuffer); ClearCommandBuffer(); } else if (inputCallback.OnHistory(let direction)) @@ -123,13 +119,6 @@ namespace SteelEditor.Windows ImGui.SetKeyboardFocusHere(-1); } - public void ClearLog() - { - for (var log in _log) - delete log.str; - _log.Clear(); - } - public void ClearCommands() { _commandStartIndex = _newCommandIndex; diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 60b4e84..7f047c3 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -231,6 +231,8 @@ namespace SteelEngine for (var layer in _layerStack) layer.OnUpdate(); + _gameConsole.Update(); + OnUpdate(); } diff --git a/Engine/src/Console/GameConsole.bf b/Engine/src/Console/GameConsole.bf index 52d84a7..708de89 100644 --- a/Engine/src/Console/GameConsole.bf +++ b/Engine/src/Console/GameConsole.bf @@ -51,8 +51,6 @@ namespace SteelEngine public LogLevel logLevel = .Info; - LogCallback _logCallback = new => OnLogCallback ~ delete _; - bool _opened = false; public bool IsOpen = _opened; @@ -80,8 +78,7 @@ namespace SteelEngine { Log.AddCallback(new (str, level) => { - if (level >= logLevel) - PrintLine(logLevel, str); + PrintLine(level, str); }); for (var file in configFiles) @@ -140,14 +137,6 @@ namespace SteelEngine }); } - void OnLogCallback(LogLevel logLevel, StringView message) - { - if (logLevel < logLevel) - return; - - PrintLine(logLevel, message); - } - public void Open() { _opened = true; diff --git a/Engine/src/SteelPath.bf b/Engine/src/SteelPath.bf index fb40a98..491043e 100644 --- a/Engine/src/SteelPath.bf +++ b/Engine/src/SteelPath.bf @@ -34,6 +34,11 @@ namespace SteelEngine { Path.InternalCombine(target, UserDirectory, relativePath); + var dir = scope String(); + Path.GetDirectoryPath(target, dir); + if (create && !Directory.Exists(dir)) + Directory.CreateDirectory(dir); + if (create && !File.Exists(target)) { if (File.WriteAllText(target, "") case .Err(let err)) From 0a35ee6f002cccbf242af71fdc67262e05396d90 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sun, 23 Aug 2020 17:51:03 +0200 Subject: [PATCH 17/50] Fixed EditorGUI.InputText to keep existing buffer --- Editor/src/Editor.bf | 6 ++- Editor/src/EditorGUI.bf | 58 +++++++++++++++++---------- Editor/src/Windows/InspectorWindow.bf | 25 ++++++++---- 3 files changed, 59 insertions(+), 30 deletions(-) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 28aa1ac..35777c0 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -48,7 +48,11 @@ namespace SteelEditor public static void SetEntityName(EntityId id, StringView name) { - GetInstance()._entityNames[id] = new .(name); + var editor = GetInstance(); + if (!editor._entityNames.ContainsKey(id)) + editor._entityNames[id] = new .(name); + else + editor._entityNames[id].Set(name); } public static void ShowWindow() where T : EditorWindow diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 3ffcbae..a085938 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -14,7 +14,7 @@ namespace SteelEditor private static bool _popItemWidth = false; private static bool _popItemColor = false; private static bool _popItemID = false; - private static uint _treeCount = 0; + private static uint _collapsableHeaderCount = 0; // Window @@ -41,14 +41,13 @@ namespace SteelEditor if (label.StartsWith("##")) return false; - ImGui.Columns(2); ImGui.AlignTextToFramePadding(); Text(label); CheckItem(false); - ImGui.SameLine(30); + ImGui.SameLine(22); FillWidth(); return true; @@ -116,7 +115,7 @@ namespace SteelEditor CheckItem(); } - public static InputCallback Input(StringView label, String buffer, StringView hint = "", uint maxSize = 256) + public static InputCallback Input(StringView label, String buffer, StringView hint = "", int maxSize = 256) { bool hasLabel = Label(label); if (!hasLabel) @@ -131,29 +130,26 @@ namespace SteelEditor _inputTextBuffers[new String(label)] = new .(); var inputTextBuffer = _inputTextBuffers[labelStr]; - inputTextBuffer.ReAlloc(maxSize); + if (inputTextBuffer.Size != (uint) maxSize) + inputTextBuffer.ReAlloc((uint) maxSize); + + inputTextBuffer.Set(buffer); bool isEnter = false; ImGui.InputTextFlags flags = .EnterReturnsTrue | .CallbackHistory | .CallbackCompletion; if (hint != "") - isEnter = ImGui.InputTextWithHint(scope UniqueLabel(label, "Input"), hint.Ptr, inputTextBuffer.Ptr, maxSize, flags, => InputTextCallback); + isEnter = ImGui.InputTextWithHint(scope UniqueLabel(label, "Input"), hint.Ptr, inputTextBuffer.Ptr, (uint) maxSize, flags, => InputTextCallback); else - isEnter = ImGui.InputText(scope UniqueLabel(label, "Input"), inputTextBuffer.Ptr, maxSize, flags, => InputTextCallback); - + isEnter = ImGui.InputText(scope UniqueLabel(label, "Input"), inputTextBuffer.Ptr, (uint) maxSize, flags, => InputTextCallback); if (!hasLabel) - { CheckItem(false); - } else - { CheckItem(); - } var view = inputTextBuffer.View(); - buffer.Set(view); if (view != buffer) _inputCallback = .(.OnChange); @@ -161,6 +157,8 @@ namespace SteelEditor if (isEnter) _inputCallback = .(.OnEnter); + buffer.Set(view); + return _inputCallback; } @@ -279,14 +277,14 @@ namespace SteelEditor public static void FillWidth() => ItemWidth(-1); - public static bool BeginTree(StringView label) + public static bool BeginCollapsableHeader(StringView label) { ImGui.Columns(1); var isOpen = ImGui.CollapsingHeader(label.Ptr); if (isOpen) { ImGui.Indent(); - _treeCount++; + _collapsableHeaderCount++; } else { @@ -295,17 +293,27 @@ namespace SteelEditor return isOpen; } - public static void EndTree() + public static void EndCollapsableHeader() { - if (_treeCount > 0) + if (_collapsableHeaderCount > 0) { CheckItem(false); ImGui.Unindent(); ImGui.Columns(2); - _treeCount--; + _collapsableHeaderCount--; } } + public static bool BeginTree(StringView label) + { + return ImGui.TreeNode(label.Ptr); + } + + public static void EndTree() + { + ImGui.TreePop(); + } + public static void BeginScrollingRegion(StringView label, float height = 0) { ImGui.BeginChild(label.Ptr, .(0, height), false, .HorizontalScrollbar); @@ -390,7 +398,8 @@ namespace SteelEditor private class InputTextBuffer { private char8[] _buffer = null; - private uint _size = 0; + + public uint Size = 0; public this(uint size = 1) { @@ -405,15 +414,20 @@ namespace SteelEditor public void Set(StringView str) { - str.CopyTo(_buffer); + if (str.Length > (int) Size) + return; + for (int i = 0; i < str.Length; i++) + _buffer[i] = str[i]; + for (int i = str.Length; i < (int) Size; i++) + _buffer[i] = '\0'; } public void ReAlloc(uint size) { - if (size == _size) + if (size == Size) return; - _size = size; + Size = size; if (_buffer != null) { diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index 6411209..3650d95 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -15,11 +15,22 @@ namespace SteelEditor.Windows private Entity _entity = new Entity(); private String _entityName = new .() ~ delete _; - public override void OnShow() + public void UpdateEntityName() + { + _entityName.Clear(); + Editor.GetEntityName(_entity.Id, _entityName); + } + + public override void OnInit() { _entity.AddComponent(new TransformComponent()); } + public override void OnShow() + { + UpdateEntityName(); + } + public override void OnRender() { if (_entity == null) @@ -27,9 +38,9 @@ namespace SteelEditor.Windows _entity.IsEnabled = EditorGUI.Checkbox("##EntityEnabled", _entity.IsEnabled); - Editor.GetEntityName(_entity.Id, _entityName); EditorGUI.SameLine(); - EditorGUI.Input("##EntityName", _entityName); + if (EditorGUI.Input("##EntityName", _entityName).OnChange) + Editor.SetEntityName(_entity.Id, _entityName); EditorGUI.Line(); @@ -50,11 +61,11 @@ namespace SteelEditor.Windows } EditorGUI.ItemID(scope String()..AppendF("{}", component)); - if (EditorGUI.BeginTree(componentName)) + if (EditorGUI.BeginCollapsableHeader(componentName)) { RenderObject(component); RenderObject(component); - EditorGUI.EndTree(); + EditorGUI.EndCollapsableHeader(); } } } @@ -116,11 +127,11 @@ namespace SteelEditor.Windows var variant = field.GetValue(object).Get(); if (variant.IsObject) { - if (!EditorGUI.BeginTree(field.GetName())) + if (!EditorGUI.BeginCollapsableHeader(field.GetName())) continue; RenderObject(variant.Get(), field.FieldType, field.GetName()); - EditorGUI.EndTree(); + EditorGUI.EndCollapsableHeader(); } variant.Dispose(); } From 1d85b5b57118a7ecbabfb1c9427b177e48d8709b Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sun, 23 Aug 2020 18:30:39 +0200 Subject: [PATCH 18/50] Added HierarchyWindow --- Editor/src/Editor.bf | 6 +++++ Editor/src/EditorGUI.bf | 9 +++++++- Editor/src/EditorLayer.bf | 10 ++++++++- Editor/src/Windows/HierarchyWindow.bf | 32 +++++++++++++++++++++++++++ Editor/src/Windows/InspectorWindow.bf | 20 +++++------------ Engine/src/Color.bf | 22 +++++++++--------- Engine/src/ECS/Entity.bf | 2 -- 7 files changed, 72 insertions(+), 29 deletions(-) create mode 100644 Editor/src/Windows/HierarchyWindow.bf diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 35777c0..4b055ee 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -24,6 +24,7 @@ namespace SteelEditor AddWindow(); AddWindow(); AddWindow(); + AddWindow(); LoadConfig(); } @@ -55,6 +56,11 @@ namespace SteelEditor editor._entityNames[id].Set(name); } + public static T GetWindow() where T : EditorWindow + { + return GetInstance()._editorLayer.GetWindow(); + } + public static void ShowWindow() where T : EditorWindow { GetInstance()._editorLayer.ShowWindow(); diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index a085938..99a3889 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -20,7 +20,7 @@ namespace SteelEditor public static bool BeginWindow(StringView name, ref bool isActive) { - return ImGui.Begin(name.Ptr, &isActive); + return ImGui.Begin(name.Ptr, &isActive, .NoScrollbar); } public static void EndWindow() @@ -36,6 +36,13 @@ namespace SteelEditor CheckItem(); } + public static bool Selectable(StringView text, bool selected = false) + { + var isSelected = ImGui.Selectable(text.Ptr, selected); + CheckItem(); + return isSelected; + } + public static bool Label(StringView label) { if (label.StartsWith("##")) diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 52ddaff..52ad829 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -93,6 +93,14 @@ namespace SteelEditor ImGui.EndMenu(); } + if (ImGui.BeginMenu("Create")) + { + if (ImGui.MenuItem("Entity")) + Application.Instance.CreateEntity(); + + ImGui.EndMenu(); + } + ImGui.EndMainMenuBar(); } @@ -186,7 +194,7 @@ namespace SteelEditor { for (var window in _editorWindows) if (typeof(T) == window.GetType()) - return window; + return (T) window; return null; } diff --git a/Editor/src/Windows/HierarchyWindow.bf b/Editor/src/Windows/HierarchyWindow.bf new file mode 100644 index 0000000..3f28fca --- /dev/null +++ b/Editor/src/Windows/HierarchyWindow.bf @@ -0,0 +1,32 @@ +using System; +using SteelEngine; +using SteelEngine.ECS; + +namespace SteelEditor.Windows +{ + public class HierarchyWindow : EditorWindow + { + public override StringView Title => "Hierarchy"; + + private Entity _currentEntity = null; + + public override void OnRender() + { + for (var entity in Entity.EntityStore.Values) + { + var entityName = scope String(); + Editor.GetEntityName(entity.Id, entityName); + + if (!entity.IsEnabled) + EditorGUI.TextColor(Color.Gray); + + EditorGUI.ItemID(scope String()..AppendF("{}", entity.Id)); + if (EditorGUI.Selectable(entityName, _currentEntity != null && _currentEntity == entity)) + { + InspectorWindow.SetCurrentEntity(entity); + _currentEntity = entity; + } + } + } + } +} diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index 3650d95..cb9ce8f 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -12,23 +12,12 @@ namespace SteelEditor.Windows { public override StringView Title => "Inspector"; - private Entity _entity = new Entity(); + private Entity _entity = null; private String _entityName = new .() ~ delete _; - public void UpdateEntityName() + public static void SetCurrentEntity(Entity entity) { - _entityName.Clear(); - Editor.GetEntityName(_entity.Id, _entityName); - } - - public override void OnInit() - { - _entity.AddComponent(new TransformComponent()); - } - - public override void OnShow() - { - UpdateEntityName(); + Editor.GetWindow()._entity = entity; } public override void OnRender() @@ -38,6 +27,9 @@ namespace SteelEditor.Windows _entity.IsEnabled = EditorGUI.Checkbox("##EntityEnabled", _entity.IsEnabled); + _entityName.Clear(); + Editor.GetEntityName(_entity.Id, _entityName); + EditorGUI.SameLine(); if (EditorGUI.Input("##EntityName", _entityName).OnChange) Editor.SetEntityName(_entity.Id, _entityName); diff --git a/Engine/src/Color.bf b/Engine/src/Color.bf index f23c0a7..dd74f61 100644 --- a/Engine/src/Color.bf +++ b/Engine/src/Color.bf @@ -19,17 +19,17 @@ namespace SteelEngine this.a = a; } - public Color Black => .(0, 0, 0, 1); - public Color Blue => .(0, 0, 1, 1); - public Color Cyan => .(0, 1, 1, 1); - public Color Gray => .(0.5f, 0.5f, 0.5f, 1); - public Color Green => .(0, 1, 0, 1); - public Color Grey => Gray; - public Color Magenta => .(1, 0, 1, 1); - public Color Red => .(1, 0, 0, 1); - public Color Transparent => .(0, 0, 0, 0); - public Color White => .(1, 1, 1, 1); - public Color Yellow => .(1, 0.92f, 0.016f, 1); + public static Color Black => .(0, 0, 0, 1); + public static Color Blue => .(0, 0, 1, 1); + public static Color Cyan => .(0, 1, 1, 1); + public static Color Gray => .(0.5f, 0.5f, 0.5f, 1); + public static Color Green => .(0, 1, 0, 1); + public static Color Grey => Gray; + public static Color Magenta => .(1, 0, 1, 1); + public static Color Red => .(1, 0, 0, 1); + public static Color Transparent => .(0, 0, 0, 0); + public static Color White => .(1, 1, 1, 1); + public static Color Yellow => .(1, 0.92f, 0.016f, 1); public static implicit operator Vector4(Self self) { diff --git a/Engine/src/ECS/Entity.bf b/Engine/src/ECS/Entity.bf index 5aad511..7c8efbb 100644 --- a/Engine/src/ECS/Entity.bf +++ b/Engine/src/ECS/Entity.bf @@ -23,8 +23,6 @@ namespace SteelEngine.ECS EntityStore = new Dictionary(); } - public virtual StringView Name => "Entity"; - public static Dictionary EntityStore { get; private set; }; /// From cbbf1c495b433aadd1005d13b36e02eae3c3c282 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Sun, 23 Aug 2020 20:25:58 +0200 Subject: [PATCH 19/50] Inspector now supports addition of components --- Editor/src/EditorGUI.bf | 25 +++++-- Editor/src/Windows/InspectorWindow.bf | 75 +++++++++++++++++-- Engine/src/ECS/Components/BaseComponent.bf | 2 +- .../src/ECS/Components/BehaviorComponent.bf | 3 + .../src/ECS/Components/Drawable3dComponent.bf | 3 + .../src/ECS/Components/Physics2dComponent.bf | 3 + .../src/ECS/Components/Physics3dComponent.bf | 3 + Engine/src/ECS/Components/SoundComponent.bf | 3 + Engine/src/ECS/Components/SpriteComponent.bf | 3 + Engine/src/ECS/Components/TextComponent.bf | 3 + .../src/ECS/Components/TransformComponent.bf | 4 +- Engine/src/ECS/Systems/BehaviorSystem.bf | 2 +- 12 files changed, 114 insertions(+), 15 deletions(-) diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 99a3889..90c3ebe 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -76,16 +76,16 @@ namespace SteelEditor // Input - public static bool Button(StringView name) + public static bool Button(StringView name, Vector2 size = default) { - var isClicked = ImGui.Button(name.Ptr); + var isClicked = ImGui.Button(name.Ptr, size); CheckItem(); return isClicked; } - public static void Button(StringView name, ref bool value) + public static void Button(StringView name, ref bool value, Vector2 size = default) { - value = Button(name); + value = Button(name, size); } public static void ToggleButton(StringView name, ref bool value) @@ -276,6 +276,11 @@ namespace SteelEditor ImGui.SameLine(ImGui.GetWindowWidth() - offset); } + public static void AlignMiddle(float itemWidth) + { + ImGui.SetCursorPosX((ImGui.GetWindowWidth() - itemWidth) / 2); + } + public static void ItemWidth(float width) { ImGui.PushItemWidth(width); @@ -287,7 +292,7 @@ namespace SteelEditor public static bool BeginCollapsableHeader(StringView label) { ImGui.Columns(1); - var isOpen = ImGui.CollapsingHeader(label.Ptr); + var isOpen = ImGui.CollapsingHeader(label.Ptr, .AllowItemOverlap); if (isOpen) { ImGui.Indent(); @@ -336,6 +341,16 @@ namespace SteelEditor return ImGui.GetStyle().ItemSpacing.y + ImGui.GetFrameHeightWithSpacing() * numberOfItems; } + public static void RemoveColumns() + { + ImGui.Columns(1); + } + + public static void NewLine() + { + ImGui.NewLine(); + } + // Style public static void TextColor(Color color) diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index cb9ce8f..b171ac5 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -14,6 +14,7 @@ namespace SteelEditor.Windows private Entity _entity = null; private String _entityName = new .() ~ delete _; + private bool _showAddComponentPopup = false; public static void SetCurrentEntity(Entity entity) { @@ -53,13 +54,72 @@ namespace SteelEditor.Windows } EditorGUI.ItemID(scope String()..AppendF("{}", component)); - if (EditorGUI.BeginCollapsableHeader(componentName)) + var isOpen = EditorGUI.BeginCollapsableHeader(componentName); + + EditorGUI.AlignFromRight(20); + if (EditorGUI.Selectable("X")) + { + _entity.RemoveComponent(component); + continue; + } + + if (isOpen) { RenderObject(component); - RenderObject(component); EditorGUI.EndCollapsableHeader(); } } + + EditorGUI.RemoveColumns(); + EditorGUI.NewLine(); + EditorGUI.AlignMiddle(130); + if (EditorGUI.Button("Add Component", .(130, 20))) + _showAddComponentPopup = true; + + if (_showAddComponentPopup) + ShowAddComponentPopup(); + } + + private void ShowAddComponentPopup() + { + Type componentType = null; + + if (EditorGUI.BeginWindow("Add Component", ref _showAddComponentPopup)) + { + for (var type in Type.Types) + { + if (type.IsSubtypeOf(typeof(BaseComponent))) + { + var typeName = scope String(); + type.GetShortName(typeName); + if (typeName == "BaseComponent" || typeName == "BehaviourComponent") + continue; + + if (EditorGUI.Selectable(typeName)) + { + componentType = type; + _showAddComponentPopup = false; + break; + } + } + } + + EditorGUI.EndWindow(); + } + + if (componentType != null) + { + var createResult = componentType.CreateObject(); + if (createResult case .Err) + { + var typeName = scope String(); + componentType.GetName(typeName); + Log.Error("Failed create component ({})", typeName); + return; + } + + _entity.AddComponent((BaseComponent) createResult.Get()); + } } private void RenderObject(Object object, StringView name = "") => RenderObject(object, typeof(T), name); @@ -74,16 +134,19 @@ namespace SteelEditor.Windows var fields = scope List(type.GetFields(.Instance | .Public)); if (fields.IsEmpty) { - RenderValue(name, object); + if (!type.IsSubtypeOf(typeof(BaseComponent))) + RenderValue(name, object); return; } - //ImGui.Columns(2); RenderFields(fields, object); } private void RenderValue(StringView name, Object object) { + if (object.GetType().IsSubtypeOf(typeof(Entity))) + return; + EditorGUI.LabelText(name, "{}", object); } @@ -98,7 +161,7 @@ namespace SteelEditor.Windows //RenderInt(field, component); continue; } - + switch (field.FieldType) { case typeof(Vector3): @@ -120,7 +183,7 @@ namespace SteelEditor.Windows if (variant.IsObject) { if (!EditorGUI.BeginCollapsableHeader(field.GetName())) - continue; + break; RenderObject(variant.Get(), field.FieldType, field.GetName()); EditorGUI.EndCollapsableHeader(); diff --git a/Engine/src/ECS/Components/BaseComponent.bf b/Engine/src/ECS/Components/BaseComponent.bf index 4701a76..86e5946 100644 --- a/Engine/src/ECS/Components/BaseComponent.bf +++ b/Engine/src/ECS/Components/BaseComponent.bf @@ -7,7 +7,7 @@ namespace SteelEngine.ECS.Components /// Abstract class defining all Components. /// A class derived from Component will be managed by an appropriate . /// - [Reflect] + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public abstract class BaseComponent { public this(bool isEnabled = true, Entity parent = null) diff --git a/Engine/src/ECS/Components/BehaviorComponent.bf b/Engine/src/ECS/Components/BehaviorComponent.bf index 02f84be..465eef3 100644 --- a/Engine/src/ECS/Components/BehaviorComponent.bf +++ b/Engine/src/ECS/Components/BehaviorComponent.bf @@ -1,5 +1,8 @@ +using System; + namespace SteelEngine.ECS.Components { + [Reflect] public abstract class BehaviorComponent : BaseComponent { protected abstract void Update(float delta); diff --git a/Engine/src/ECS/Components/Drawable3dComponent.bf b/Engine/src/ECS/Components/Drawable3dComponent.bf index 763008d..a852d6c 100644 --- a/Engine/src/ECS/Components/Drawable3dComponent.bf +++ b/Engine/src/ECS/Components/Drawable3dComponent.bf @@ -1,5 +1,8 @@ +using System; + namespace SteelEngine.ECS.Components { + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public class Drawable3dComponent : BaseComponent { } diff --git a/Engine/src/ECS/Components/Physics2dComponent.bf b/Engine/src/ECS/Components/Physics2dComponent.bf index 1e60582..f680055 100644 --- a/Engine/src/ECS/Components/Physics2dComponent.bf +++ b/Engine/src/ECS/Components/Physics2dComponent.bf @@ -1,5 +1,8 @@ +using System; + namespace SteelEngine.ECS.Components { + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public class Physics2dComponent : BaseComponent { } diff --git a/Engine/src/ECS/Components/Physics3dComponent.bf b/Engine/src/ECS/Components/Physics3dComponent.bf index aba18d3..4ea0c0c 100644 --- a/Engine/src/ECS/Components/Physics3dComponent.bf +++ b/Engine/src/ECS/Components/Physics3dComponent.bf @@ -1,5 +1,8 @@ +using System; + namespace SteelEngine.ECS.Components { + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public class Physics3dComponent : BaseComponent { } diff --git a/Engine/src/ECS/Components/SoundComponent.bf b/Engine/src/ECS/Components/SoundComponent.bf index 57cdc6d..924e419 100644 --- a/Engine/src/ECS/Components/SoundComponent.bf +++ b/Engine/src/ECS/Components/SoundComponent.bf @@ -1,5 +1,8 @@ +using System; + namespace SteelEngine.ECS.Components { + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public class SoundComponent : BaseComponent { } diff --git a/Engine/src/ECS/Components/SpriteComponent.bf b/Engine/src/ECS/Components/SpriteComponent.bf index e642e60..c382072 100644 --- a/Engine/src/ECS/Components/SpriteComponent.bf +++ b/Engine/src/ECS/Components/SpriteComponent.bf @@ -1,5 +1,8 @@ +using System; + namespace SteelEngine.ECS.Components { + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public class SpriteComponent : BaseComponent { } diff --git a/Engine/src/ECS/Components/TextComponent.bf b/Engine/src/ECS/Components/TextComponent.bf index 1f963d6..cc1b546 100644 --- a/Engine/src/ECS/Components/TextComponent.bf +++ b/Engine/src/ECS/Components/TextComponent.bf @@ -1,5 +1,8 @@ +using System; + namespace SteelEngine.ECS.Components { + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public class TextComponent : BaseComponent { } diff --git a/Engine/src/ECS/Components/TransformComponent.bf b/Engine/src/ECS/Components/TransformComponent.bf index cf9215e..4056a45 100644 --- a/Engine/src/ECS/Components/TransformComponent.bf +++ b/Engine/src/ECS/Components/TransformComponent.bf @@ -1,9 +1,9 @@ -using SteelEngine.Math; +using SteelEngine; using System; namespace SteelEngine.ECS.Components { - [Reflect] + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public class TransformComponent : BaseComponent { public Vector3 Position { get; set; } diff --git a/Engine/src/ECS/Systems/BehaviorSystem.bf b/Engine/src/ECS/Systems/BehaviorSystem.bf index dff8314..44ae3bc 100644 --- a/Engine/src/ECS/Systems/BehaviorSystem.bf +++ b/Engine/src/ECS/Systems/BehaviorSystem.bf @@ -25,7 +25,7 @@ namespace SteelEngine.ECS.Systems { continue; } - (component as BehaviorComponent).[Friend]Update(delta); + ((BehaviorComponent) component).[Friend]Update(delta); } } } From 68d52a2fa1e29138dc665525ae6d221d566080cf Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Tue, 25 Aug 2020 20:27:13 +0200 Subject: [PATCH 20/50] Fixed merge error again --- Engine/src/Application.bf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 3a86d29..67648d8 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -177,7 +177,7 @@ namespace SteelEngine for (var layer in _layerStack) layer.OnUpdate(); - _window.Update(); + Window.Update(); Update(); Draw(); From 218286cbbf349a0afa03e5b3b9dc55f2aeb93298 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Tue, 25 Aug 2020 20:40:16 +0200 Subject: [PATCH 21/50] Fixed LayerStack --- Editor/src/Editor.bf | 49 ++ Editor/src/EditorLayer.bf | 113 +++- Engine/src/Application.bf | 10 +- Engine/src/ECS/Components/BaseComponent.bf | 100 +-- .../src/ECS/Components/BehaviorComponent.bf | 20 +- .../src/ECS/Components/Drawable3dComponent.bf | 18 +- .../src/ECS/Components/Physics2dComponent.bf | 18 +- .../src/ECS/Components/Physics3dComponent.bf | 18 +- Engine/src/ECS/Components/SoundComponent.bf | 18 +- Engine/src/ECS/Components/SpriteComponent.bf | 18 +- Engine/src/ECS/Components/TextComponent.bf | 18 +- .../src/ECS/Components/TransformComponent.bf | 26 +- Engine/src/ECS/Entity.bf | 172 ++--- Engine/src/ECS/Systems/BaseSystem.bf | 640 +++++++++--------- Engine/src/ECS/Systems/BehaviorSystem.bf | 64 +- Engine/src/ECS/Systems/Physics2dSystem.bf | 28 +- Engine/src/ECS/Systems/Physics3dSystem.bf | 28 +- Engine/src/ECS/Systems/Render3dSystem.bf | 28 +- Engine/src/ECS/Systems/RenderSpriteSystem.bf | 28 +- Engine/src/ECS/Systems/RenderTextSystem.bf | 28 +- Engine/src/ECS/Systems/SoundSystem.bf | 28 +- Engine/src/LayerStack.bf | 24 +- Libs/BGFX | 1 - 23 files changed, 802 insertions(+), 693 deletions(-) delete mode 160000 Libs/BGFX diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 4b055ee..7a8ca28 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -14,6 +14,8 @@ namespace SteelEditor private EditorLayer _editorLayer; private Dictionary _entityNames = new .(); + private List _recentProjects = new .() ~ DeleteContainerAndItems!(_); + private String _currentProject = new .() ~ delete _; public override void OnInit() { @@ -27,6 +29,9 @@ namespace SteelEditor AddWindow(); LoadConfig(); + LoadCache(); + + UpdateTitle(); } public override void OnCleanup() @@ -56,6 +61,50 @@ namespace SteelEditor editor._entityNames[id].Set(name); } + public static void OpenCurrentProject(StringView path) + { + Log.Trace("Opening project: {}", path); + SetCurrentProject(path); + } + + public static void CloseProject() + { + Log.Trace("Closing project"); + SetCurrentProject(""); + } + + public static void SetCurrentProject(StringView path) + { + GetInstance()._currentProject.Set(path); + UpdateTitle(); + } + + public static void UpdateTitle() + { + var editor = GetInstance(); + if (editor._currentProject.IsEmpty) + editor.Window.SetTitle("Steel Editor"); + else + editor.Window.SetTitle(scope String()..AppendF("Steel Editor - {}", editor._currentProject)); + } + + private void LoadCache() + { + var cachePath = scope String(); + SteelPath.GetEditorUserFile("Cache.txt", cachePath); + + var reader = scope StreamReader(); + if (reader.Open(cachePath) case .Err) + return; + + var line = scope String(); + while (reader.ReadLine(line) case .Ok) + { + _recentProjects.Add(new String(line)); + line.Clear(); + } + } + public static T GetWindow() where T : EditorWindow { return GetInstance()._editorLayer.GetWindow(); diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 52ad829..c161daa 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -5,6 +5,7 @@ using SteelEngine.Events; using SteelEngine.Window; using imgui_beef; using glfw_beef; +using System.IO; namespace SteelEditor { @@ -70,56 +71,102 @@ namespace SteelEditor ImGuiImplGlfw.NewFrame(); ImGui.NewFrame(); + ShowMainMenuBar(); + + // Update ImGui windows + for (var window in _editorWindows) + { + if (!window.IsActive && !window.IsClosed) + CloseWindow(window); + else + window.Update(); + } + + // Background color + ImGuiImplOpengl3GL.glClearColor(0.45f, 0.55f, 0.6f, 1); + ImGuiImplOpengl3GL.glClear(ImGuiImplOpengl3GL.GL_COLOR_BUFFER_BIT); + + // ImGui rendering + ImGui.Render(); + ImGuiImplOpengl3.RenderDrawData(ImGui.GetDrawData()); + } + + private void ShowMainMenuBar() + { if (ImGui.BeginMainMenuBar()) { - if (ImGui.BeginMenu("File")) - { - ImGui.EndMenu(); - } + ShowFileMenu(); + ShowEditMenu(); + ShowViewMenu(); + ShowCreateMenu(); + + ImGui.EndMainMenuBar(); + } + } + + private void ShowFileMenu() + { + if (ImGui.BeginMenu("File")) + { + ImGui.MenuItem("New"); + ImGui.MenuItem("Open"); - if (ImGui.BeginMenu("Edit")) + if (ImGui.BeginMenu("Open Recent")) { + ShowRecentProjects(); ImGui.EndMenu(); } - if (ImGui.BeginMenu("View")) - { - for (var window in _editorWindows) - { - if (ImGui.MenuItem(window.Title.Ptr)) - ShowWindow(window); - } + if (ImGui.MenuItem("Close Project")) + Editor.CloseProject(); - ImGui.EndMenu(); - } + if (ImGui.MenuItem("Exit")) + Application.Exit(); - if (ImGui.BeginMenu("Create")) - { - if (ImGui.MenuItem("Entity")) - Application.Instance.CreateEntity(); + ImGui.EndMenu(); + } + } - ImGui.EndMenu(); - } + private void ShowRecentProjects() + { + for (var project in Application.GetInstance().[Friend]_recentProjects) + { + if (ImGui.MenuItem(project)) + Editor.OpenCurrentProject(project); + } + } - ImGui.EndMainMenuBar(); + private void ShowEditMenu() + { + if (ImGui.BeginMenu("Edit")) + { + ImGui.EndMenu(); } + } - // Update ImGui windows - for (var window in _editorWindows) + private void ShowViewMenu() + { + if (ImGui.BeginMenu("View")) { - if (!window.IsActive && !window.IsClosed) - CloseWindow(window); - else - window.Update(); + for (var window in _editorWindows) + { + if (ImGui.MenuItem(window.Title.Ptr)) + ShowWindow(window); + } + + ImGui.EndMenu(); } + } - // Background color - ImGuiImplOpengl3GL.glClearColor(0.45f, 0.55f, 0.60f, 1.00f); - ImGuiImplOpengl3GL.glClear(ImGuiImplOpengl3GL.GL_COLOR_BUFFER_BIT); + private void ShowCreateMenu() + { + if (ImGui.BeginMenu("Create")) + { + if (ImGui.MenuItem("Entity")) + Application.Instance.CreateEntity(); - // ImGui rendering - ImGui.Render(); - ImGuiImplOpengl3.RenderDrawData(ImGui.GetDrawData()); + ImGui.EndMenu(); + } } public void ShowWindow() where T : EditorWindow diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 67648d8..97fe0ad 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -89,9 +89,8 @@ namespace SteelEngine Dispose(); } - public void Dispose() + public virtual void Dispose() { - OnCleanup(); delete _layerStack; Window.Destroy(); @@ -182,6 +181,8 @@ namespace SteelEngine Update(); Draw(); } + + OnCleanup(); } // Gets called right after the window is created @@ -367,5 +368,10 @@ namespace SteelEngine _entitiesToRemoveFromStore.Add(entity.Id); return true; } + + public static void Exit(int exitCode = 0) + { + Environment.Exit(exitCode); + } } } diff --git a/Engine/src/ECS/Components/BaseComponent.bf b/Engine/src/ECS/Components/BaseComponent.bf index 86e5946..1ddd28b 100644 --- a/Engine/src/ECS/Components/BaseComponent.bf +++ b/Engine/src/ECS/Components/BaseComponent.bf @@ -1,50 +1,50 @@ -using System; - -namespace SteelEngine.ECS.Components -{ - typealias ComponentId = uint64; - /// - /// Abstract class defining all Components. - /// A class derived from Component will be managed by an appropriate . - /// - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public abstract class BaseComponent - { - public this(bool isEnabled = true, Entity parent = null) - { - Id = GetNextId(); - IsEnabled = isEnabled; - Parent = parent; - } - - /// - /// Unique identifier for the Component. - /// - public ComponentId Id { get; private set; } - - /// - /// Enabled Components are managed by their corresponding , otherwise the Component is ignored. - /// - public bool IsEnabled { get; set; } - - /// - /// Uninitialized Components are initialized by their corresponding , - /// otherwise the Component is initialized on the next , , or methods. - /// - public bool IsInitialized { get; private set; } - - /// - /// Each Component belongs to a and maintains a reference to the parent . - /// - public Entity Parent { get; set; } - - public bool IsQueuedForDeletion { get; private set; } - - private static ComponentId _nextId = 0; - - private static ComponentId GetNextId() - { - return _nextId++; - } - } -} +using System; + +namespace SteelEngine.ECS.Components +{ + typealias ComponentId = uint64; + /// + /// Abstract class defining all Components. + /// A class derived from Component will be managed by an appropriate . + /// + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public abstract class BaseComponent + { + public this(bool isEnabled = true, Entity parent = null) + { + Id = GetNextId(); + IsEnabled = isEnabled; + Parent = parent; + } + + /// + /// Unique identifier for the Component. + /// + public ComponentId Id { get; private set; } + + /// + /// Enabled Components are managed by their corresponding , otherwise the Component is ignored. + /// + public bool IsEnabled { get; set; } + + /// + /// Uninitialized Components are initialized by their corresponding , + /// otherwise the Component is initialized on the next , , or methods. + /// + public bool IsInitialized { get; private set; } + + /// + /// Each Component belongs to a and maintains a reference to the parent . + /// + public Entity Parent { get; set; } + + public bool IsQueuedForDeletion { get; private set; } + + private static ComponentId _nextId = 0; + + private static ComponentId GetNextId() + { + return _nextId++; + } + } +} diff --git a/Engine/src/ECS/Components/BehaviorComponent.bf b/Engine/src/ECS/Components/BehaviorComponent.bf index 465eef3..d7b8272 100644 --- a/Engine/src/ECS/Components/BehaviorComponent.bf +++ b/Engine/src/ECS/Components/BehaviorComponent.bf @@ -1,10 +1,10 @@ -using System; - -namespace SteelEngine.ECS.Components -{ - [Reflect] - public abstract class BehaviorComponent : BaseComponent - { - protected abstract void Update(float delta); - } -} +using System; + +namespace SteelEngine.ECS.Components +{ + [Reflect] + public abstract class BehaviorComponent : BaseComponent + { + protected abstract void Update(float delta); + } +} diff --git a/Engine/src/ECS/Components/Drawable3dComponent.bf b/Engine/src/ECS/Components/Drawable3dComponent.bf index a852d6c..af892e1 100644 --- a/Engine/src/ECS/Components/Drawable3dComponent.bf +++ b/Engine/src/ECS/Components/Drawable3dComponent.bf @@ -1,9 +1,9 @@ -using System; - -namespace SteelEngine.ECS.Components -{ - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public class Drawable3dComponent : BaseComponent - { - } -} +using System; + +namespace SteelEngine.ECS.Components +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class Drawable3dComponent : BaseComponent + { + } +} diff --git a/Engine/src/ECS/Components/Physics2dComponent.bf b/Engine/src/ECS/Components/Physics2dComponent.bf index f680055..4cae854 100644 --- a/Engine/src/ECS/Components/Physics2dComponent.bf +++ b/Engine/src/ECS/Components/Physics2dComponent.bf @@ -1,9 +1,9 @@ -using System; - -namespace SteelEngine.ECS.Components -{ - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public class Physics2dComponent : BaseComponent - { - } -} +using System; + +namespace SteelEngine.ECS.Components +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class Physics2dComponent : BaseComponent + { + } +} diff --git a/Engine/src/ECS/Components/Physics3dComponent.bf b/Engine/src/ECS/Components/Physics3dComponent.bf index 4ea0c0c..20623b3 100644 --- a/Engine/src/ECS/Components/Physics3dComponent.bf +++ b/Engine/src/ECS/Components/Physics3dComponent.bf @@ -1,9 +1,9 @@ -using System; - -namespace SteelEngine.ECS.Components -{ - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public class Physics3dComponent : BaseComponent - { - } -} +using System; + +namespace SteelEngine.ECS.Components +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class Physics3dComponent : BaseComponent + { + } +} diff --git a/Engine/src/ECS/Components/SoundComponent.bf b/Engine/src/ECS/Components/SoundComponent.bf index 924e419..cd62864 100644 --- a/Engine/src/ECS/Components/SoundComponent.bf +++ b/Engine/src/ECS/Components/SoundComponent.bf @@ -1,9 +1,9 @@ -using System; - -namespace SteelEngine.ECS.Components -{ - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public class SoundComponent : BaseComponent - { - } -} +using System; + +namespace SteelEngine.ECS.Components +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class SoundComponent : BaseComponent + { + } +} diff --git a/Engine/src/ECS/Components/SpriteComponent.bf b/Engine/src/ECS/Components/SpriteComponent.bf index c382072..77b45fb 100644 --- a/Engine/src/ECS/Components/SpriteComponent.bf +++ b/Engine/src/ECS/Components/SpriteComponent.bf @@ -1,9 +1,9 @@ -using System; - -namespace SteelEngine.ECS.Components -{ - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public class SpriteComponent : BaseComponent - { - } -} +using System; + +namespace SteelEngine.ECS.Components +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class SpriteComponent : BaseComponent + { + } +} diff --git a/Engine/src/ECS/Components/TextComponent.bf b/Engine/src/ECS/Components/TextComponent.bf index cc1b546..1b4d83d 100644 --- a/Engine/src/ECS/Components/TextComponent.bf +++ b/Engine/src/ECS/Components/TextComponent.bf @@ -1,9 +1,9 @@ -using System; - -namespace SteelEngine.ECS.Components -{ - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public class TextComponent : BaseComponent - { - } -} +using System; + +namespace SteelEngine.ECS.Components +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class TextComponent : BaseComponent + { + } +} diff --git a/Engine/src/ECS/Components/TransformComponent.bf b/Engine/src/ECS/Components/TransformComponent.bf index 4056a45..e62884b 100644 --- a/Engine/src/ECS/Components/TransformComponent.bf +++ b/Engine/src/ECS/Components/TransformComponent.bf @@ -1,13 +1,13 @@ -using SteelEngine; -using System; - -namespace SteelEngine.ECS.Components -{ - [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] - public class TransformComponent : BaseComponent - { - public Vector3 Position { get; set; } - public Vector3 Rotation { get; set; } - public Vector3 Scale { get; set; } - } -} +using SteelEngine; +using System; + +namespace SteelEngine.ECS.Components +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class TransformComponent : BaseComponent + { + public Vector3 Position { get; set; } + public Vector3 Rotation { get; set; } + public Vector3 Scale { get; set; } + } +} diff --git a/Engine/src/ECS/Entity.bf b/Engine/src/ECS/Entity.bf index 7c8efbb..9fc3223 100644 --- a/Engine/src/ECS/Entity.bf +++ b/Engine/src/ECS/Entity.bf @@ -1,86 +1,86 @@ -using System; -using System.Collections; -using SteelEngine.ECS.Components; -using SteelEngine.ECS.Systems; - -namespace SteelEngine.ECS -{ - typealias EntityId = uint64; - - [Reflect] - public class Entity - { - public this() - { - Id = GetNextId(); - IsEnabled = true; - - Entity.EntityStore[Id] = this; - } - - static this() - { - EntityStore = new Dictionary(); - } - - public static Dictionary EntityStore { get; private set; }; - - /// - /// Unique identifier for the Entity. - /// - public EntityId Id { get; private set; } - - /// - /// Whether or not the Entity and all child Components should be drawn or updated. - /// - public bool IsEnabled { get; set; } - - #region Member Methods - /// - /// Adds a to the relevant . will also remove the from any Entity and it was attached to before. - /// - /// to add. - public bool AddComponent(BaseComponent component) - { - let parent = component.Parent; - if (parent != null && (parent.Id == Id || !parent.RemoveComponent(component))) - { - return false; - } - component.Parent = this; - return Application.Instance.[Friend]AddComponent(component); - } - - /// - /// Removes an individual . - /// - /// to remove. - /// Whether or not the was removed. Will return false if the is not registered to this Entity. - public bool RemoveComponent(BaseComponent component) - { - let parent = component?.Parent; - if (parent == null || parent.Id != Id) - { - return false; - } - return Application.Instance.[Friend]RemoveComponent(component); - } - - private static EntityId _nextId = 0; - - private static EntityId GetNextId() - { - return _nextId++; - } - - public ~this() - { - Application.Instance.[Friend]RemoveEntity(this); - } - - static ~this() - { - delete EntityStore; - } - } -} +using System; +using System.Collections; +using SteelEngine.ECS.Components; +using SteelEngine.ECS.Systems; + +namespace SteelEngine.ECS +{ + typealias EntityId = uint64; + + [Reflect] + public class Entity + { + public this() + { + Id = GetNextId(); + IsEnabled = true; + + Entity.EntityStore[Id] = this; + } + + static this() + { + EntityStore = new Dictionary(); + } + + public static Dictionary EntityStore { get; private set; }; + + /// + /// Unique identifier for the Entity. + /// + public EntityId Id { get; private set; } + + /// + /// Whether or not the Entity and all child Components should be drawn or updated. + /// + public bool IsEnabled { get; set; } + + #region Member Methods + /// + /// Adds a to the relevant . will also remove the from any Entity and it was attached to before. + /// + /// to add. + public bool AddComponent(BaseComponent component) + { + let parent = component.Parent; + if (parent != null && (parent.Id == Id || !parent.RemoveComponent(component))) + { + return false; + } + component.Parent = this; + return Application.Instance.[Friend]AddComponent(component); + } + + /// + /// Removes an individual . + /// + /// to remove. + /// Whether or not the was removed. Will return false if the is not registered to this Entity. + public bool RemoveComponent(BaseComponent component) + { + let parent = component?.Parent; + if (parent == null || parent.Id != Id) + { + return false; + } + return Application.Instance.[Friend]RemoveComponent(component); + } + + private static EntityId _nextId = 0; + + private static EntityId GetNextId() + { + return _nextId++; + } + + public ~this() + { + Application.Instance.[Friend]RemoveEntity(this); + } + + static ~this() + { + delete EntityStore; + } + } +} diff --git a/Engine/src/ECS/Systems/BaseSystem.bf b/Engine/src/ECS/Systems/BaseSystem.bf index 7acd85a..359eb6a 100644 --- a/Engine/src/ECS/Systems/BaseSystem.bf +++ b/Engine/src/ECS/Systems/BaseSystem.bf @@ -1,320 +1,320 @@ -using System.Collections; -using SteelEngine.ECS.Components; -using System; - -namespace SteelEngine.ECS.Systems -{ - /// - /// Defines the abstract classes for all classes. - /// - public abstract class BaseSystem - { - protected this() - { - IsEnabled = true; - EntityToComponents = new Dictionary>(); - _uninitializedComponents = new Queue(); - _entityRegistrationChecks = new List(); - - RegisterComponentTypes(); - } - - /// - /// All tracked components. - /// - public Dictionary> EntityToComponents ~ delete _; - - /// - /// Whether or not the System has called . - /// - public bool IsEnabled { get; set; } - - /// - /// Whether or not the System has called . - /// - public bool IsInitialized { get; protected set; } - - /// - /// Entities that need registration checks. - /// - protected List _entityRegistrationChecks ~ delete _; - - /// - /// Tracks all potentially uninitialized objects. - /// All objects will be initialized in the , , or methods. - /// - protected Queue _uninitializedComponents ~ delete _; - - /// - /// Tracks all potentially uninitialized objects. - /// All objects will be initialized in the , , or methods. - /// - protected Type[] _registeredTypes ~ delete _; - - /// - /// Adds a to relevant . If the is not initialized, it will be queued for initialization. - /// - /// to add. - /// Whether or not the was added to this BehaviorSystem's . Returns false if the already existed. - protected virtual bool AddComponent(BaseComponent component) - { - let parent = component.Parent; - List entityComponents = ?; - if (parent == null) - { - return false; - } - bool isNewEntity = false; - if (!EntityToComponents.TryGetValue(parent.Id, out entityComponents)) - { - isNewEntity = true; - entityComponents = new List(); - } - for (let entityComponent in entityComponents) - { - if (component.Id == entityComponent.Id) - { - return false; - } - } - if (!CanBeRegistered(component)) - { - if (isNewEntity) - { - delete entityComponents; - } - return false; - } - - if (!component.IsInitialized) - { - _uninitializedComponents.Enqueue(component); - } - if (isNewEntity) - { - EntityToComponents[parent.Id] = entityComponents; - } - entityComponents.Add(component); - component.[Friend]IsQueuedForDeletion = false; - _entityRegistrationChecks.Add(parent.Id); - return true; - } - - protected bool CanBeRegistered(BaseComponent component) - { - for (let type in _registeredTypes) - { - if (CanBeRegisteredAsType(component, type)) - { - return true; - } - } - return false; - } - - protected bool CanBeRegisteredAsType(BaseComponent component, Type type) - { - let componentType = component.GetType(); - if (componentType.TypeId == type.TypeId || componentType.IsSubtypeOf(type)) - { - return true; - } - return false; - } - - protected void ClearEmptyEntities() - { - let entitiesToRemove = new List(); - defer delete entitiesToRemove; - - for (let item in EntityToComponents) - { - if (item.value == null || item.value.Count == 0) - { - entitiesToRemove.Add(item.key); - } - } - for (let entity in entitiesToRemove) - { - List components = ?; - if (EntityToComponents.TryGetValue(entity, out components)) - { - delete components; - EntityToComponents.Remove(entity); - } - } - } - - protected virtual void Draw() - { - if (!IsEnabled) - { - return; - } - InitializeComponents(); - - for (let item in EntityToComponents) - { - Draw(item.key, item.value); - } - } - - protected virtual void Draw(EntityId entityId, List components) - { - - } - - protected List GetComponentsOfEntity(Entity entity) - { - List entityComponents = ?; - EntityToComponents.TryGetValue(entity.Id, out entityComponents); - return entityComponents; - } - - protected virtual Result Initialize() - { - if (!IsEnabled || IsInitialized) - { - return .Err(.AlreadyInitialized); - } - if (InitializeComponents() == .Err) - { - return .Err(.Unknown); - } - IsInitialized = true; - return .Ok; - } - - protected virtual Result Initialize(BaseComponent component) - { - component.[Friend]IsInitialized = true; - return .Ok; - } - - protected Result InitializeComponents() - { - while (_uninitializedComponents.Count != 0) - { - let component = _uninitializedComponents.Dequeue(); - if (!component.IsInitialized) - { - if (Initialize(component) == .Err) - { - return .Err; - } - } - } - return .Ok; - } - - protected virtual void PostUpdate() - { - ClearEmptyEntities(); - } - - protected virtual void PreUpdate() - { - while (_entityRegistrationChecks.Count > 0) - { - let entity = _entityRegistrationChecks.PopBack(); - RefreshEntityRegistration(entity); - } - - ClearEmptyEntities(); - } - - protected bool RefreshEntityRegistration(EntityId entityId) - { - List components = ?; - if (!EntityToComponents.TryGetValue(entityId, out components)) - { - return false; - } - - let componentsToRemove = new List(); - defer delete componentsToRemove; - var valid = true; - // Check if every required Component is present - for (let type in _registeredTypes) - { - // Check all components for the registered type - bool found = false; - for (let component in components) - { - if (CanBeRegisteredAsType(component, type)) - { - found = true; - break; - } - } - if (found) - { - continue; - } - // Registered type is not present. This invalidates all components that are registered to this entity. - for (let component in components) - { - componentsToRemove.Add(component); - } - valid = false; - } - for (let component in componentsToRemove) - { - RemoveComponent(component); - } - - return valid; - } - - protected abstract void RegisterComponentTypes(); - - protected virtual bool RemoveComponent(BaseComponent component) - { - let parent = component.Parent; - List components = ?; - if (parent == null || !EntityToComponents.TryGetValue(parent.Id, out components)) - { - return false; - } - if (components.Remove(component)) - { - _entityRegistrationChecks.Add(parent.Id); - return true; - } - return false; - } - - protected virtual void Update(float delta) - { - if (!IsEnabled) - { - return; - } - InitializeComponents(); - - for (let item in EntityToComponents) - { - Update(item.key, item.value, delta); - } - } - - protected virtual void Update(EntityId entityId, List components, float delta) - { - - } - - public ~this() - { - for (let item in EntityToComponents) - { - delete item.value; - } - } - } - - public enum InitializationError - { - AlreadyInitialized, - Unknown, - } -} +using System.Collections; +using SteelEngine.ECS.Components; +using System; + +namespace SteelEngine.ECS.Systems +{ + /// + /// Defines the abstract classes for all classes. + /// + public abstract class BaseSystem + { + protected this() + { + IsEnabled = true; + EntityToComponents = new Dictionary>(); + _uninitializedComponents = new Queue(); + _entityRegistrationChecks = new List(); + + RegisterComponentTypes(); + } + + /// + /// All tracked components. + /// + public Dictionary> EntityToComponents ~ delete _; + + /// + /// Whether or not the System has called . + /// + public bool IsEnabled { get; set; } + + /// + /// Whether or not the System has called . + /// + public bool IsInitialized { get; protected set; } + + /// + /// Entities that need registration checks. + /// + protected List _entityRegistrationChecks ~ delete _; + + /// + /// Tracks all potentially uninitialized objects. + /// All objects will be initialized in the , , or methods. + /// + protected Queue _uninitializedComponents ~ delete _; + + /// + /// Tracks all potentially uninitialized objects. + /// All objects will be initialized in the , , or methods. + /// + protected Type[] _registeredTypes ~ delete _; + + /// + /// Adds a to relevant . If the is not initialized, it will be queued for initialization. + /// + /// to add. + /// Whether or not the was added to this BehaviorSystem's . Returns false if the already existed. + protected virtual bool AddComponent(BaseComponent component) + { + let parent = component.Parent; + List entityComponents = ?; + if (parent == null) + { + return false; + } + bool isNewEntity = false; + if (!EntityToComponents.TryGetValue(parent.Id, out entityComponents)) + { + isNewEntity = true; + entityComponents = new List(); + } + for (let entityComponent in entityComponents) + { + if (component.Id == entityComponent.Id) + { + return false; + } + } + if (!CanBeRegistered(component)) + { + if (isNewEntity) + { + delete entityComponents; + } + return false; + } + + if (!component.IsInitialized) + { + _uninitializedComponents.Enqueue(component); + } + if (isNewEntity) + { + EntityToComponents[parent.Id] = entityComponents; + } + entityComponents.Add(component); + component.[Friend]IsQueuedForDeletion = false; + _entityRegistrationChecks.Add(parent.Id); + return true; + } + + protected bool CanBeRegistered(BaseComponent component) + { + for (let type in _registeredTypes) + { + if (CanBeRegisteredAsType(component, type)) + { + return true; + } + } + return false; + } + + protected bool CanBeRegisteredAsType(BaseComponent component, Type type) + { + let componentType = component.GetType(); + if (componentType.TypeId == type.TypeId || componentType.IsSubtypeOf(type)) + { + return true; + } + return false; + } + + protected void ClearEmptyEntities() + { + let entitiesToRemove = new List(); + defer delete entitiesToRemove; + + for (let item in EntityToComponents) + { + if (item.value == null || item.value.Count == 0) + { + entitiesToRemove.Add(item.key); + } + } + for (let entity in entitiesToRemove) + { + List components = ?; + if (EntityToComponents.TryGetValue(entity, out components)) + { + delete components; + EntityToComponents.Remove(entity); + } + } + } + + protected virtual void Draw() + { + if (!IsEnabled) + { + return; + } + InitializeComponents(); + + for (let item in EntityToComponents) + { + Draw(item.key, item.value); + } + } + + protected virtual void Draw(EntityId entityId, List components) + { + + } + + protected List GetComponentsOfEntity(Entity entity) + { + List entityComponents = ?; + EntityToComponents.TryGetValue(entity.Id, out entityComponents); + return entityComponents; + } + + protected virtual Result Initialize() + { + if (!IsEnabled || IsInitialized) + { + return .Err(.AlreadyInitialized); + } + if (InitializeComponents() == .Err) + { + return .Err(.Unknown); + } + IsInitialized = true; + return .Ok; + } + + protected virtual Result Initialize(BaseComponent component) + { + component.[Friend]IsInitialized = true; + return .Ok; + } + + protected Result InitializeComponents() + { + while (_uninitializedComponents.Count != 0) + { + let component = _uninitializedComponents.Dequeue(); + if (!component.IsInitialized) + { + if (Initialize(component) == .Err) + { + return .Err; + } + } + } + return .Ok; + } + + protected virtual void PostUpdate() + { + ClearEmptyEntities(); + } + + protected virtual void PreUpdate() + { + while (_entityRegistrationChecks.Count > 0) + { + let entity = _entityRegistrationChecks.PopBack(); + RefreshEntityRegistration(entity); + } + + ClearEmptyEntities(); + } + + protected bool RefreshEntityRegistration(EntityId entityId) + { + List components = ?; + if (!EntityToComponents.TryGetValue(entityId, out components)) + { + return false; + } + + let componentsToRemove = new List(); + defer delete componentsToRemove; + var valid = true; + // Check if every required Component is present + for (let type in _registeredTypes) + { + // Check all components for the registered type + bool found = false; + for (let component in components) + { + if (CanBeRegisteredAsType(component, type)) + { + found = true; + break; + } + } + if (found) + { + continue; + } + // Registered type is not present. This invalidates all components that are registered to this entity. + for (let component in components) + { + componentsToRemove.Add(component); + } + valid = false; + } + for (let component in componentsToRemove) + { + RemoveComponent(component); + } + + return valid; + } + + protected abstract void RegisterComponentTypes(); + + protected virtual bool RemoveComponent(BaseComponent component) + { + let parent = component.Parent; + List components = ?; + if (parent == null || !EntityToComponents.TryGetValue(parent.Id, out components)) + { + return false; + } + if (components.Remove(component)) + { + _entityRegistrationChecks.Add(parent.Id); + return true; + } + return false; + } + + protected virtual void Update(float delta) + { + if (!IsEnabled) + { + return; + } + InitializeComponents(); + + for (let item in EntityToComponents) + { + Update(item.key, item.value, delta); + } + } + + protected virtual void Update(EntityId entityId, List components, float delta) + { + + } + + public ~this() + { + for (let item in EntityToComponents) + { + delete item.value; + } + } + } + + public enum InitializationError + { + AlreadyInitialized, + Unknown, + } +} diff --git a/Engine/src/ECS/Systems/BehaviorSystem.bf b/Engine/src/ECS/Systems/BehaviorSystem.bf index 44ae3bc..a00589b 100644 --- a/Engine/src/ECS/Systems/BehaviorSystem.bf +++ b/Engine/src/ECS/Systems/BehaviorSystem.bf @@ -1,32 +1,32 @@ -using SteelEngine.ECS.Components; -using System.Collections; -using System; - -namespace SteelEngine.ECS.Systems -{ - public class BehaviorSystem : BaseSystem - { - protected override void RegisterComponentTypes() - { - _registeredTypes = new Type[]{ typeof(BehaviorComponent) }; - } - - protected override void Update(EntityId entityId, List components, float delta) - { - Entity entity = ?; - if (!Entity.EntityStore.TryGetValue(entityId, out entity) || !entity.IsEnabled) - { - return; - } - - for (let component in components) - { - if (!component.IsEnabled) - { - continue; - } - ((BehaviorComponent) component).[Friend]Update(delta); - } - } - } -} +using SteelEngine.ECS.Components; +using System.Collections; +using System; + +namespace SteelEngine.ECS.Systems +{ + public class BehaviorSystem : BaseSystem + { + protected override void RegisterComponentTypes() + { + _registeredTypes = new Type[]{ typeof(BehaviorComponent) }; + } + + protected override void Update(EntityId entityId, List components, float delta) + { + Entity entity = ?; + if (!Entity.EntityStore.TryGetValue(entityId, out entity) || !entity.IsEnabled) + { + return; + } + + for (let component in components) + { + if (!component.IsEnabled) + { + continue; + } + ((BehaviorComponent) component).[Friend]Update(delta); + } + } + } +} diff --git a/Engine/src/ECS/Systems/Physics2dSystem.bf b/Engine/src/ECS/Systems/Physics2dSystem.bf index d303cff..0a813fe 100644 --- a/Engine/src/ECS/Systems/Physics2dSystem.bf +++ b/Engine/src/ECS/Systems/Physics2dSystem.bf @@ -1,14 +1,14 @@ -using SteelEngine.ECS.Components; -using System.Collections; -using System; - -namespace SteelEngine.ECS.Systems -{ - public class Physics2dSystem : BaseSystem - { - protected override void RegisterComponentTypes() - { - _registeredTypes = new Type[]{ typeof(Physics2dComponent), typeof(TransformComponent) }; - } - } -} +using SteelEngine.ECS.Components; +using System.Collections; +using System; + +namespace SteelEngine.ECS.Systems +{ + public class Physics2dSystem : BaseSystem + { + protected override void RegisterComponentTypes() + { + _registeredTypes = new Type[]{ typeof(Physics2dComponent), typeof(TransformComponent) }; + } + } +} diff --git a/Engine/src/ECS/Systems/Physics3dSystem.bf b/Engine/src/ECS/Systems/Physics3dSystem.bf index 41b5602..8ebfa06 100644 --- a/Engine/src/ECS/Systems/Physics3dSystem.bf +++ b/Engine/src/ECS/Systems/Physics3dSystem.bf @@ -1,14 +1,14 @@ -using SteelEngine.ECS.Components; -using System.Collections; -using System; - -namespace SteelEngine.ECS.Systems -{ - public class Physics3dSystem : BaseSystem - { - protected override void RegisterComponentTypes() - { - _registeredTypes = new Type[]{ typeof(Physics3dComponent), typeof(TransformComponent) }; - } - } -} +using SteelEngine.ECS.Components; +using System.Collections; +using System; + +namespace SteelEngine.ECS.Systems +{ + public class Physics3dSystem : BaseSystem + { + protected override void RegisterComponentTypes() + { + _registeredTypes = new Type[]{ typeof(Physics3dComponent), typeof(TransformComponent) }; + } + } +} diff --git a/Engine/src/ECS/Systems/Render3dSystem.bf b/Engine/src/ECS/Systems/Render3dSystem.bf index 6c39dbe..f55c7db 100644 --- a/Engine/src/ECS/Systems/Render3dSystem.bf +++ b/Engine/src/ECS/Systems/Render3dSystem.bf @@ -1,14 +1,14 @@ -using SteelEngine.ECS.Components; -using System.Collections; -using System; - -namespace SteelEngine.ECS.Systems -{ - public class Render3DSystem : BaseSystem - { - protected override void RegisterComponentTypes() - { - _registeredTypes = new Type[]{ typeof(Drawable3dComponent), typeof(TransformComponent) }; - } - } -} +using SteelEngine.ECS.Components; +using System.Collections; +using System; + +namespace SteelEngine.ECS.Systems +{ + public class Render3DSystem : BaseSystem + { + protected override void RegisterComponentTypes() + { + _registeredTypes = new Type[]{ typeof(Drawable3dComponent), typeof(TransformComponent) }; + } + } +} diff --git a/Engine/src/ECS/Systems/RenderSpriteSystem.bf b/Engine/src/ECS/Systems/RenderSpriteSystem.bf index 329cba3..26b524f 100644 --- a/Engine/src/ECS/Systems/RenderSpriteSystem.bf +++ b/Engine/src/ECS/Systems/RenderSpriteSystem.bf @@ -1,14 +1,14 @@ -using SteelEngine.ECS.Components; -using System.Collections; -using System; - -namespace SteelEngine.ECS.Systems -{ - public class RenderSpriteSystem : BaseSystem - { - protected override void RegisterComponentTypes() - { - _registeredTypes = new Type[]{ typeof(SpriteComponent), typeof(TransformComponent) }; - } - } -} +using SteelEngine.ECS.Components; +using System.Collections; +using System; + +namespace SteelEngine.ECS.Systems +{ + public class RenderSpriteSystem : BaseSystem + { + protected override void RegisterComponentTypes() + { + _registeredTypes = new Type[]{ typeof(SpriteComponent), typeof(TransformComponent) }; + } + } +} diff --git a/Engine/src/ECS/Systems/RenderTextSystem.bf b/Engine/src/ECS/Systems/RenderTextSystem.bf index a061b00..d130df6 100644 --- a/Engine/src/ECS/Systems/RenderTextSystem.bf +++ b/Engine/src/ECS/Systems/RenderTextSystem.bf @@ -1,14 +1,14 @@ -using SteelEngine.ECS.Components; -using System.Collections; -using System; - -namespace SteelEngine.ECS.Systems -{ - public class RenderTextSystem : BaseSystem - { - protected override void RegisterComponentTypes() - { - _registeredTypes = new Type[]{ typeof(TextComponent), typeof(TransformComponent) }; - } - } -} +using SteelEngine.ECS.Components; +using System.Collections; +using System; + +namespace SteelEngine.ECS.Systems +{ + public class RenderTextSystem : BaseSystem + { + protected override void RegisterComponentTypes() + { + _registeredTypes = new Type[]{ typeof(TextComponent), typeof(TransformComponent) }; + } + } +} diff --git a/Engine/src/ECS/Systems/SoundSystem.bf b/Engine/src/ECS/Systems/SoundSystem.bf index b24892a..ce68ccf 100644 --- a/Engine/src/ECS/Systems/SoundSystem.bf +++ b/Engine/src/ECS/Systems/SoundSystem.bf @@ -1,14 +1,14 @@ -using SteelEngine.ECS.Components; -using System.Collections; -using System; - -namespace SteelEngine.ECS.Systems -{ - public class SoundSystem : BaseSystem - { - protected override void RegisterComponentTypes() - { - _registeredTypes = new Type[]{ typeof(SoundComponent), typeof(TransformComponent) }; - } - } -} +using SteelEngine.ECS.Components; +using System.Collections; +using System; + +namespace SteelEngine.ECS.Systems +{ + public class SoundSystem : BaseSystem + { + protected override void RegisterComponentTypes() + { + _registeredTypes = new Type[]{ typeof(SoundComponent), typeof(TransformComponent) }; + } + } +} diff --git a/Engine/src/LayerStack.bf b/Engine/src/LayerStack.bf index 573cdcf..4a87772 100644 --- a/Engine/src/LayerStack.bf +++ b/Engine/src/LayerStack.bf @@ -18,30 +18,38 @@ namespace SteelEngine public ~this() { if (AutoDeleteLayers) + { + for (var layer in _layers) + layer.OnDetach(); + ClearAndDeleteItems(_layers); + } + delete _layers; } public void PushLayer(Layer layer) { _layers.Insert(_layerInsert++, layer); + layer.OnAttach(); } public void PushOverlay(Layer overlay) { _layers.Add(overlay); + overlay.OnAttach(); } public void PopLayer() { _layerInsert--; - _layers.RemoveAt(_layerInsert); + _layers.GetAndRemove(_layers[_layerInsert]).Get().OnDetach(); } public void PopOverlay() { if (_layers.Count > _layerInsert) - _layers.PopBack(); + _layers.PopBack().OnDetach(); } public void RemoveLayer(StringView debugName) @@ -50,7 +58,7 @@ namespace SteelEngine { if (_layers[i].[Friend]_debugName == debugName) { - _layers.RemoveAt(i); + _layers.GetAndRemove(_layers[i]).Get().OnDetach(); _layerInsert--; break; } @@ -63,7 +71,7 @@ namespace SteelEngine { if (_layers[i].[Friend]_debugName == debugName) { - _layers.RemoveAt(i); + _layers.GetAndRemove(_layers[i]).Get().OnDetach(); break; } } @@ -75,7 +83,7 @@ namespace SteelEngine { if (typeof(T) == _layers[i].GetType()) { - _layers.RemoveAt(i); + _layers.GetAndRemove(_layers[i]).Get().OnDetach(); return; } } @@ -87,7 +95,7 @@ namespace SteelEngine { if (typeof(T) == _layers[i].GetType()) { - _layers.RemoveAt(i); + _layers.GetAndRemove(_layers[i]).Get().OnDetach(); break; } } @@ -99,7 +107,7 @@ namespace SteelEngine { if (_layers[i] == layer) { - _layers.RemoveAt(i); + _layers.GetAndRemove(_layers[i]).Get().OnDetach(); return; } } @@ -111,7 +119,7 @@ namespace SteelEngine { if (_layers[i] == layer) { - _layers.RemoveAt(i); + _layers.GetAndRemove(_layers[i]).Get().OnDetach(); return; } } diff --git a/Libs/BGFX b/Libs/BGFX deleted file mode 160000 index 2147829..0000000 --- a/Libs/BGFX +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2147829d5acf6d9b2ab49eca76ede804cd3797d5 From 103cdf24ab01df8ed09ffe1b50ecb1eae16b81be Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Thu, 3 Sep 2020 15:43:40 +0200 Subject: [PATCH 22/50] Project serialization stuff --- .gitmodules | 6 + BeefSpace.toml | 4 +- Editor/BeefProj.toml | 2 +- Editor/SteelProj.json | 1 + Editor/src/Editor.bf | 179 +++++++++++++++--- Editor/src/EditorGUI.bf | 26 ++- Editor/src/EditorLayer.bf | 64 +++++-- Editor/src/EditorProject.bf | 32 ++++ Editor/src/Serialization/EditorCache.bf | 74 ++++++++ .../src/Serialization/SerializableEntity.bf | 26 +++ Editor/src/SteelPath.bf | 17 +- Editor/src/Util.bf | 8 + Editor/src/Windows/InspectorWindow.bf | 12 +- Editor/src/Windows/NewProjectWindow.bf | 75 ++++++++ Editor/src/Windows/PropertiesWindow.bf | 17 ++ Engine/BeefProj.toml | 24 +++ Engine/src/Application.bf | 62 +++--- Engine/src/ECS/Entity.bf | 2 +- Engine/src/ECS/Systems/BehaviorSystem.bf | 2 +- Engine/src/ECS/Systems/Physics2dSystem.bf | 2 +- Engine/src/ECS/Systems/Physics3dSystem.bf | 2 +- Engine/src/ECS/Systems/Render3dSystem.bf | 2 +- Engine/src/ECS/Systems/RenderSpriteSystem.bf | 2 +- Engine/src/ECS/Systems/RenderTextSystem.bf | 2 +- Engine/src/ECS/Systems/SoundSystem.bf | 2 +- Engine/src/SteelPath.bf | 42 ++-- Examples/EditorDemo/BeefProj.toml | 5 + Examples/EditorDemo/BeefSpace.toml | 5 + Examples/EditorDemo/SteelProj.json | 7 + Libs/BGFX | 1 + Libs/Beef-Extensions-Lib | 1 + Libs/JSON_Beef | 1 + 32 files changed, 597 insertions(+), 110 deletions(-) create mode 100644 Editor/SteelProj.json create mode 100644 Editor/src/EditorProject.bf create mode 100644 Editor/src/Serialization/EditorCache.bf create mode 100644 Editor/src/Serialization/SerializableEntity.bf create mode 100644 Editor/src/Windows/NewProjectWindow.bf create mode 100644 Editor/src/Windows/PropertiesWindow.bf create mode 100644 Examples/EditorDemo/BeefProj.toml create mode 100644 Examples/EditorDemo/BeefSpace.toml create mode 100644 Examples/EditorDemo/SteelProj.json create mode 160000 Libs/BGFX create mode 160000 Libs/Beef-Extensions-Lib create mode 160000 Libs/JSON_Beef diff --git a/.gitmodules b/.gitmodules index 1da32fc..2aa2585 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,9 @@ [submodule "BGFX"] path = Libs/BGFX url = https://github.com/ExoKomodo/Bgfx-bf +[submodule "JSON_Beef"] + path = Libs/JSON_Beef + url = https://github.com/Jonathan-Racaud/JSON_Beef +[submodule "Beef-Extensions-Lib"] + path = Libs/Beef-Extensions-Lib + url = https://github.com/Jonathan-Racaud/Beef-Extensions-Lib diff --git a/BeefSpace.toml b/BeefSpace.toml index 76bbb6c..9be4786 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,6 +1,6 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}} -Locked = ["glfw-beef", "imgui-impl-opengl3", "imgui-impl-glfw", "imgui-beef"] +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}} +Locked = ["glfw-beef", "imgui-impl-opengl3", "imgui-impl-glfw", "imgui-beef", "BeefExtensionsLib", "JSON_Beef"] [Workspace] StartupProject = "SteelEditor" diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index 90a07e6..724a2e0 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", SteelEngine = "*", imgui-impl-opengl3 = "*", imgui-impl-glfw = "*", imgui-beef = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", imgui-impl-opengl3 = "*", imgui-impl-glfw = "*", imgui-beef = "*", BeefExtensionsLib = "*", JSON_Beef = "*"} [Project] Name = "SteelEditor" diff --git a/Editor/SteelProj.json b/Editor/SteelProj.json new file mode 100644 index 0000000..ff06631 --- /dev/null +++ b/Editor/SteelProj.json @@ -0,0 +1 @@ +{"Name":"Untitled","Entities":[]} \ No newline at end of file diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 7a8ca28..b723e26 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -5,7 +5,9 @@ using SteelEngine; using SteelEngine.Window; using SteelEngine.ECS; using SteelEditor.Windows; +using SteelEditor.Serialization; using imgui_beef; +using JSON_Beef.Serialization; namespace SteelEditor { @@ -14,8 +16,10 @@ namespace SteelEditor private EditorLayer _editorLayer; private Dictionary _entityNames = new .(); - private List _recentProjects = new .() ~ DeleteContainerAndItems!(_); - private String _currentProject = new .() ~ delete _; + private EditorCache _cache = new .(true) ~ delete _; + private bool _wantsSave = false; + + public EditorProject CurrentProject = EditorProject.UntitledProject() ~ delete _; public override void OnInit() { @@ -37,12 +41,19 @@ namespace SteelEditor public override void OnCleanup() { SaveConfig(); + SaveCache(); for (var value in _entityNames.Values) delete value; delete _entityNames; } + public static void InvalidateSave() + { + GetInstance()._wantsSave = true; + UpdateTitle(); + } + public static void GetEntityName(EntityId id, String buffer) { var editor = GetInstance(); @@ -61,47 +72,167 @@ namespace SteelEditor editor._entityNames[id].Set(name); } - public static void OpenCurrentProject(StringView path) + public static void OpenProject(StringView path) { - Log.Trace("Opening project: {}", path); - SetCurrentProject(path); + Log.Info("Opening project: {}", path); + + var filePath = scope String(); + Path.InternalCombine(filePath, scope String(path), "SteelProj.json"); + + if (!File.Exists(filePath)) + { + Log.Error("Could not open project ({}): Not a Steel project", path); + return; + } + + var json = new String(); + defer delete json; + + if (File.ReadAllText(filePath, json) case .Err(let err)) + { + Log.Error("Could not open project ({}): {}", path, err); + return; + } + + var editor = GetInstance(); + delete editor.CurrentProject; + editor.CurrentProject = new .(); + + for (var entity in Entity.EntityStore.Values) + delete entity; + Entity.EntityStore.Clear(); + + if (JSONDeserializer.Deserialize(json, editor.CurrentProject) case .Err(let err)) + { + Log.Error("Could not open project ({}): {}", path, err); + return; + } + + for (var serializableEntity in editor.CurrentProject.Entities) + serializableEntity.MakeEntity(); + + editor.CurrentProject.Path = new .(path); + UpdateTitle(); + + editor._cache.AddRecentProject(path); + + InspectorWindow.SetCurrentEntity(null); } public static void CloseProject() { - Log.Trace("Closing project"); - SetCurrentProject(""); - } + Log.Info("Closing project"); - public static void SetCurrentProject(StringView path) - { - GetInstance()._currentProject.Set(path); + var editor = GetInstance(); + delete editor.CurrentProject; + editor.CurrentProject = EditorProject.UntitledProject(); UpdateTitle(); } public static void UpdateTitle() { var editor = GetInstance(); - if (editor._currentProject.IsEmpty) - editor.Window.SetTitle("Steel Editor"); + var title = scope String(); + + if (editor.CurrentProject.Path.IsEmpty) + title.AppendF("Steel Editor - {}", editor.CurrentProject.Name); else - editor.Window.SetTitle(scope String()..AppendF("Steel Editor - {}", editor._currentProject)); + title.AppendF("Steel Editor - {}", editor.CurrentProject.Path); + + if (editor._wantsSave) + title.Append('*'); + + editor.Window.SetTitle(title); } - private void LoadCache() + public static void Save() { + Log.Trace("Saving project"); + + var editor = GetInstance(); + + editor.CurrentProject.Entities.Clear(); + for (var entity in Entity.EntityStore.Values) + { + var entityName = scope String(); + GetEntityName(entity.Id, entityName); + editor.CurrentProject.Entities.Add(new .(entityName, entity)); + } + + var result = JSONSerializer.Serialize(editor.CurrentProject); + if (result case .Err) + { + Log.Error("Could not save project: Serialization error"); + return; + } + + var json = result.Get(); + defer delete json; + + var projectFilePath = scope String(); + Path.InternalCombine(projectFilePath, editor.CurrentProject.Path, "SteelProj.json"); + + if (File.WriteAllText(projectFilePath, json) case .Err) + Log.Error("Could not save cache: File error"); + + editor._wantsSave = false; + UpdateTitle(); + + SaveCache(); + } + + public static void SaveCache() + { + Log.Trace("Saving cache"); + + var editor = GetInstance(); + editor._cache.Update(editor); + editor._cache.MakeSerializable(); + + var result = JSONSerializer.Serialize(editor._cache); + if (result case .Err) + { + Log.Error("Could not save cache: Serialization error"); + return; + } + + var json = result.Get(); + defer delete json; + var cachePath = scope String(); - SteelPath.GetEditorUserFile("Cache.txt", cachePath); + SteelPath.GetEditorUserPath(cachePath, "Cache.json"); + + if (File.WriteAllText(cachePath, json) case .Err) + Log.Error("Could not save cache: File error"); + } + + private static void LoadCache() + { + Log.Trace("Loading cache"); - var reader = scope StreamReader(); - if (reader.Open(cachePath) case .Err) + var cachePath = scope String(); + SteelPath.GetEditorUserPath(cachePath, "Cache.json"); + + var json = new String(); + defer delete json; + + if (File.ReadAllText(cachePath, json) case .Err(let err)) + { + Log.Error("Could not load cache: {}", err); return; + } + + var editor = GetInstance(); + + if (editor._cache != null) + delete editor._cache; + editor._cache = new .(); - var line = scope String(); - while (reader.ReadLine(line) case .Ok) + if (JSONDeserializer.Deserialize(json, editor._cache) case .Err(let err)) { - _recentProjects.Add(new String(line)); - line.Clear(); + Log.Error("Could not load cache: {}", err); + delete editor._cache; + editor._cache = new .(true); } } @@ -219,7 +350,7 @@ namespace SteelEditor delete config; var configPath = scope String(); - SteelPath.GetEditorUserFile("Config.txt", configPath, true); + SteelPath.GetEditorUserPath(configPath, "Config.txt"); if (File.WriteAllText(configPath, serialized) case .Err) Log.Error("Failed to save style"); @@ -247,7 +378,7 @@ namespace SteelEditor public static void LoadConfig() { var configPath = scope String(); - SteelPath.GetEditorUserFile("Config.txt", configPath); + SteelPath.GetEditorUserPath(configPath, "Config.txt"); var serialized = new String(); if (File.ReadAllText(configPath, serialized) case .Err) { diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 90c3ebe..88edb4c 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -11,9 +11,12 @@ namespace SteelEditor { private static InputCallback _inputCallback = .(.None); private static Dictionary _inputTextBuffers = new .() ~ DeleteDictionaryAndKeysAndItems!(_); + private static bool _popItemWidth = false; private static bool _popItemColor = false; private static bool _popItemID = false; + private static bool _useColumns = true; + private static uint _collapsableHeaderCount = 0; // Window @@ -26,6 +29,7 @@ namespace SteelEditor public static void EndWindow() { ImGui.End(); + AddColumns(); } // Text @@ -43,18 +47,20 @@ namespace SteelEditor return isSelected; } - public static bool Label(StringView label) + public static bool Label(StringView label, bool newLine = false) { if (label.StartsWith("##")) return false; - ImGui.Columns(2); + if (_useColumns) + ImGui.Columns(2); ImGui.AlignTextToFramePadding(); Text(label); CheckItem(false); - ImGui.SameLine(22); + if (!newLine) + SameLine(); FillWidth(); return true; @@ -122,9 +128,9 @@ namespace SteelEditor CheckItem(); } - public static InputCallback Input(StringView label, String buffer, StringView hint = "", int maxSize = 256) + public static InputCallback Input(StringView label, String buffer, StringView hint = "", int maxSize = 256, bool readOnly = false, bool newLine = false) { - bool hasLabel = Label(label); + bool hasLabel = Label(label, newLine); if (!hasLabel) ImGui.Columns(1); @@ -145,6 +151,8 @@ namespace SteelEditor bool isEnter = false; ImGui.InputTextFlags flags = .EnterReturnsTrue | .CallbackHistory | .CallbackCompletion; + if (readOnly) + flags |= .ReadOnly; if (hint != "") isEnter = ImGui.InputTextWithHint(scope UniqueLabel(label, "Input"), hint.Ptr, inputTextBuffer.Ptr, (uint) maxSize, flags, => InputTextCallback); @@ -344,6 +352,12 @@ namespace SteelEditor public static void RemoveColumns() { ImGui.Columns(1); + _useColumns = false; + } + + public static void AddColumns() + { + _useColumns = true; } public static void NewLine() @@ -387,7 +401,7 @@ namespace SteelEditor _popItemID = false; } - if (nextColumn) + if (nextColumn && _useColumns) ImGui.NextColumn(); } diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index c161daa..ced395e 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -1,11 +1,12 @@ using System; using System.Collections; +using System.IO; using SteelEngine; using SteelEngine.Events; using SteelEngine.Window; +using SteelEditor.Windows; using imgui_beef; using glfw_beef; -using System.IO; namespace SteelEditor { @@ -15,7 +16,7 @@ namespace SteelEditor private List _editorWindows = new .(); private bool _showDemoWindow = false; - private String _iniPath = new .() ~ delete _; + private String _imguiIniPath = new .() ~ delete _; private ImGui.Style _originalStyle; public this(Window window) : base("EditorLayer") @@ -27,10 +28,10 @@ namespace SteelEditor { ImGui.CreateContext(); - SteelPath.GetEditorUserFile("imgui.ini", _iniPath); + SteelPath.GetEditorUserPath(_imguiIniPath, "imgui.ini"); var io = ref ImGui.GetIO(); - io.IniFilename = _iniPath; + io.IniFilename = _imguiIniPath; var style = ref ImGui.GetStyle(); style.WindowMenuButtonPosition = .None; // This disables the collapse button on windows @@ -45,6 +46,8 @@ namespace SteelEditor Log.Trace("OpenGL version: {}", ImGuiImplOpengl3.[Friend]g_GlVersion); Log.Trace("GLSL version: {}", ImGuiImplOpengl3.[Friend]g_GlslVersionString); + + Editor.AddWindow(); } public override void OnDetach() @@ -65,7 +68,7 @@ namespace SteelEditor public override void OnUpdate() { var io = ref ImGui.GetIO(); - var app = Application.Instance; + var app = Editor.Instance; io.DisplaySize = ImGui.Vec2(app.Window.GetSize.x, app.Window.GetSize.y); ImGuiImplOpengl3.NewFrame(); ImGuiImplGlfw.NewFrame(); @@ -76,10 +79,13 @@ namespace SteelEditor // Update ImGui windows for (var window in _editorWindows) { - if (!window.IsActive && !window.IsClosed) - CloseWindow(window); - else + if (window.IsClosed) + continue; + + if (window.IsActive) window.Update(); + else + CloseWindow(window); } // Background color @@ -108,8 +114,11 @@ namespace SteelEditor { if (ImGui.BeginMenu("File")) { - ImGui.MenuItem("New"); - ImGui.MenuItem("Open"); + if (ImGui.MenuItem("New")) + NewProject(); + + if (ImGui.MenuItem("Open")) + OpenProject(); if (ImGui.BeginMenu("Open Recent")) { @@ -117,6 +126,9 @@ namespace SteelEditor ImGui.EndMenu(); } + if (ImGui.MenuItem("Save", "CTRL+S")) + Editor.Save(); + if (ImGui.MenuItem("Close Project")) Editor.CloseProject(); @@ -127,12 +139,21 @@ namespace SteelEditor } } + private void NewProject() + { + Editor.ShowWindow(); + } + private void ShowRecentProjects() { - for (var project in Application.GetInstance().[Friend]_recentProjects) + var cache = Application.GetInstance().[Friend]_cache; + if (cache.RecentProjects == null) + return; + + for (var projectPath in cache.RecentProjects) { - if (ImGui.MenuItem(project)) - Editor.OpenCurrentProject(project); + if (ImGui.MenuItem(projectPath)) + Editor.OpenProject(projectPath); } } @@ -163,12 +184,29 @@ namespace SteelEditor if (ImGui.BeginMenu("Create")) { if (ImGui.MenuItem("Entity")) + { Application.Instance.CreateEntity(); + Editor.InvalidateSave(); + } ImGui.EndMenu(); } } + private void OpenProject() + { + var dialog = scope FolderBrowserDialog(); + if (dialog.ShowDialog() case .Ok(let val)) + { + if (val == .OK) + Editor.OpenProject(dialog.SelectedPath); + } + else + { + Log.Error("Could not show folder browser dialog"); + } + } + public void ShowWindow() where T : EditorWindow { for (var window in _editorWindows) diff --git a/Editor/src/EditorProject.bf b/Editor/src/EditorProject.bf new file mode 100644 index 0000000..6d53c47 --- /dev/null +++ b/Editor/src/EditorProject.bf @@ -0,0 +1,32 @@ +using System; +using System.Collections; +using SteelEngine.ECS; +using SteelEditor.Serialization; +using JSON_Beef.Attributes; + +namespace SteelEditor +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class EditorProject + { + public String Name ~ delete _; + public List Entities ~ DeleteContainerAndItems!(_); + + [IgnoreSerialize] + public String Path ~ delete _; + + public this() {} + + public this(StringView name, StringView path) + { + Name = new .(name); + Path = new .(path); + Entities = new .(); + } + + public static Self UntitledProject() + { + return new .("Untitled", ""); + } + } +} diff --git a/Editor/src/Serialization/EditorCache.bf b/Editor/src/Serialization/EditorCache.bf new file mode 100644 index 0000000..ae1a519 --- /dev/null +++ b/Editor/src/Serialization/EditorCache.bf @@ -0,0 +1,74 @@ +using System; +using System.Collections; +using JSON_Beef.Attributes; +using imgui_beef; + +namespace SteelEditor.Serialization +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class EditorCache + { + [IgnoreSerialize] + private int MaxRecentProjects = 5; + + public List RecentProjects = null; + public List Windows = null; + [IgnoreSerialize] // Temporary until structs can be serialized + public ImGui.Style Style; + + public this(bool initDefault = false) + { + if (!initDefault) + return; + + RecentProjects = new .(); + Windows = new .(); + } + + public ~this() + { + if (RecentProjects != null) + DeleteContainerAndItems!(RecentProjects); + + if (Windows != null) + DeleteContainerAndItems!(Windows); + } + + public void Update(Editor editor) + { + DeleteAndClearItems!(Windows); + + for (var window in editor._editorLayer.[Friend]_editorWindows) + { + if (window.IsActive) + Windows.Add(new String(window.Title)); + } + + Style = ImGui.GetStyle(); + } + + public void AddRecentProject(StringView path) + { + if (RecentProjects.Count >= MaxRecentProjects) + RecentProjects.PopFront(); + + var pathString = new String(path); + if (RecentProjects.Contains(pathString)) + delete RecentProjects.GetAndRemove(pathString).Get(); + + RecentProjects.Add(pathString); + } + + public void MakeSerializable() + { + if (RecentProjects == null) + RecentProjects = new .(); + + if (Windows == null) + Windows = new .(); + + for (var path in RecentProjects) + path.MakeSerializable(); + } + } +} diff --git a/Editor/src/Serialization/SerializableEntity.bf b/Editor/src/Serialization/SerializableEntity.bf new file mode 100644 index 0000000..ba88056 --- /dev/null +++ b/Editor/src/Serialization/SerializableEntity.bf @@ -0,0 +1,26 @@ +using System; +using SteelEngine.ECS; + +namespace SteelEditor.Serialization +{ + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + public class SerializableEntity + { + public String Name ~ delete _; + public bool IsEnabled; + + public this(StringView name, Entity entity) + { + Name = new .(name); + IsEnabled = entity.IsEnabled; + } + + public void MakeEntity() + { + var entity = new Entity(); + entity.IsEnabled = IsEnabled; + + Editor.SetEntityName(entity.Id, Name); + } + } +} diff --git a/Editor/src/SteelPath.bf b/Editor/src/SteelPath.bf index 4bd3b5c..17b2a04 100644 --- a/Editor/src/SteelPath.bf +++ b/Editor/src/SteelPath.bf @@ -5,18 +5,13 @@ namespace SteelEngine { extension SteelPath { - public static void GetEditorUserFolder(String relativePath, String target, bool create = false) + public static void GetEditorUserPath(String target, params String[] components) { - var path = scope String(); - Path.InternalCombine(path, "Editor", relativePath); - GetUserFolder(path, target, create); - } - - public static void GetEditorUserFile(String relativePath, String target, bool create = false) - { - var path = scope String(); - Path.InternalCombine(path, "Editor", relativePath); - GetUserFile(path, target, create); + var newComponents = new String[components.Count + 1]; + newComponents[0] = "Editor"; + components.CopyTo(newComponents, 0, 1, components.Count); + GetUserPath(target, params newComponents); + delete newComponents; } } } diff --git a/Editor/src/Util.bf b/Editor/src/Util.bf index 2aaa85d..a385f61 100644 --- a/Editor/src/Util.bf +++ b/Editor/src/Util.bf @@ -13,6 +13,14 @@ namespace System buffer.Append(parts.Back); } } + + extension String + { + public void MakeSerializable() + { + Replace("\\", "\\\\"); + } + } } namespace System.Reflection diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index b171ac5..22c8f2a 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -32,14 +32,24 @@ namespace SteelEditor.Windows Editor.GetEntityName(_entity.Id, _entityName); EditorGUI.SameLine(); + EditorGUI.ItemWidth(-25); if (EditorGUI.Input("##EntityName", _entityName).OnChange) Editor.SetEntityName(_entity.Id, _entityName); + EditorGUI.AlignFromRight(25); + if (EditorGUI.Button("X")) + { + Application.Instance.[Friend]RemoveEntity(_entity); + SetCurrentEntity(null); + Editor.InvalidateSave(); + return; + } + EditorGUI.Line(); var componentsToRender = scope List(); - for (var component in Application.Instance.[Friend]_components.Values) + for (var component in Editor.Instance.[Friend]_components.Values) if (component.Parent == _entity) componentsToRender.Add(component); diff --git a/Editor/src/Windows/NewProjectWindow.bf b/Editor/src/Windows/NewProjectWindow.bf new file mode 100644 index 0000000..f692288 --- /dev/null +++ b/Editor/src/Windows/NewProjectWindow.bf @@ -0,0 +1,75 @@ +using System; +using System.IO; +using SteelEngine; + +namespace SteelEditor.Windows +{ + public class NewProjectWindow : EditorWindow + { + public override StringView Title => "New Project"; + + private String _projectName = new .() ~ delete _; + private String _projectPath = new .() ~ delete _; + + private const int BROWSE_BUTTON_OFFSET = 59; + private const int PATH_WIDTH = -60; + private const int CREATE_BUTTON_WIDTH = 65; + private const int CREATE_BUTTON_HEIGHT = 20; + + public override void OnShow() + { + _projectName.Clear(); + _projectPath.Clear(); + } + + public override void OnRender() + { + EditorGUI.RemoveColumns(); + + EditorGUI.Label("Name", true); + EditorGUI.Input("##NewProjectName", _projectName, "", 256, false); + + EditorGUI.Label("Path", true); + + EditorGUI.ItemWidth(PATH_WIDTH); + EditorGUI.Input("##NewProjectPath", _projectPath, "", 256, true); + + EditorGUI.SameLine(); + EditorGUI.AlignFromRight(BROWSE_BUTTON_OFFSET); + if (EditorGUI.Button("Browse")) + { + var dialog = scope FolderBrowserDialog(); + var dialogResult = dialog.ShowDialog(); + + if (dialogResult case .Err) + Log.Error("Could not show folder browser dialog"); + + if (dialogResult.Get() == .OK) + { + _projectPath.Set(dialog.SelectedPath); + if (_projectName.IsEmpty) + { + var _projectDirName = scope String(); + Path.GetFileName(_projectPath, _projectDirName); + _projectName.Set(_projectDirName); + } + } + } + + EditorGUI.NewLine(); + EditorGUI.AlignMiddle(65); + if (EditorGUI.Button("Create", .(CREATE_BUTTON_WIDTH, CREATE_BUTTON_HEIGHT))) + { + CreateProject(); + IsActive = false; + } + } + + private void CreateProject() + { + Log.Info("Creating project '{}' at '{}'", _projectName, _projectPath); + + + } + } +} diff --git a/Editor/src/Windows/PropertiesWindow.bf b/Editor/src/Windows/PropertiesWindow.bf new file mode 100644 index 0000000..3232df6 --- /dev/null +++ b/Editor/src/Windows/PropertiesWindow.bf @@ -0,0 +1,17 @@ +using System; +using SteelEngine; + +namespace SteelEditor.Windows +{ + public class PropertiesWindow : EditorWindow + { + private String _title = new .() ~ delete _; + public override StringView Title => _title; + + public override void OnShow() + { + _title.Clear(); + _title.AppendF("Properties - {}", Application.GetInstance().CurrentProject.Name); + } + } +} diff --git a/Engine/BeefProj.toml b/Engine/BeefProj.toml index 83609bc..1a6e4bb 100644 --- a/Engine/BeefProj.toml +++ b/Engine/BeefProj.toml @@ -3,3 +3,27 @@ Dependencies = {corlib = "*", glfw-beef = "*", corlib = "*"} [Project] Name = "SteelEngine" + +[Configs.Debug.Win32] +PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS", "DEBUG"] + +[Configs.Debug.Win64] +PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS", "DEBUG"] + +[Configs.Release.Win32] +PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS", "RELEASE"] + +[Configs.Release.Win64] +PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS", "RELEASE"] + +[Configs.Paranoid.Win32] +PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS", "PARANOID"] + +[Configs.Paranoid.Win64] +PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS", "PARANOID"] + +[Configs.Test.Win32] +PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS"] + +[Configs.Test.Win64] +PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS"] diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 97fe0ad..7a7a738 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.IO; using SteelEngine.Window; using SteelEngine.Events; using SteelEngine.Input; @@ -13,7 +14,7 @@ namespace SteelEngine { public abstract class Application : IDisposable { - public static Application Instance = null; + public static Application Instance; private bool _isRunning = false; @@ -84,28 +85,6 @@ namespace SteelEngine CreateSystem(); } - public ~this() - { - Dispose(); - } - - public virtual void Dispose() - { - delete _layerStack; - - Window.Destroy(); - delete Window; - - // Order of deletion is important. Deleting from lowest to highest abstraction is safe. - for (let item in _components) - delete item.value; - - _components.Clear(); - - for (let item in Entity.EntityStore) - delete item.value; - } - /// /// Creates a new . This operation is expensive, as it runs through all entities and registers viable ones to the new system. /// Systems should be added as close to the start of the as possible to avoid slowdowns. @@ -160,6 +139,7 @@ namespace SteelEngine Time.[Friend]Initialize(); _inputManager.Initialize(); + for (let system in _systems) { switch (system.[Friend]Initialize()) @@ -259,6 +239,20 @@ namespace SteelEngine return (T) Instance; } + struct PosColorVertex + { + public this(float x, float y, float z, uint32 abgr) + { + this.x = x; + this.y = y; + this.z = z; + this.abgr = abgr; + } + + float x, y, z; + uint32 abgr; + } + private void Draw() { for (let system in _systems) @@ -373,5 +367,27 @@ namespace SteelEngine { Environment.Exit(exitCode); } + + public ~this() + { + Dispose(); + } + + public virtual void Dispose() + { + delete _layerStack; + + Window.Destroy(); + delete Window; + + // Order of deletion is important. Deleting from lowest to highest abstraction is safe. + for (let item in _components) + delete item.value; + + _components.Clear(); + + for (let item in Entity.EntityStore) + delete item.value; + } } } diff --git a/Engine/src/ECS/Entity.bf b/Engine/src/ECS/Entity.bf index 9fc3223..5185214 100644 --- a/Engine/src/ECS/Entity.bf +++ b/Engine/src/ECS/Entity.bf @@ -7,7 +7,7 @@ namespace SteelEngine.ECS { typealias EntityId = uint64; - [Reflect] + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] public class Entity { public this() diff --git a/Engine/src/ECS/Systems/BehaviorSystem.bf b/Engine/src/ECS/Systems/BehaviorSystem.bf index a00589b..cec88d6 100644 --- a/Engine/src/ECS/Systems/BehaviorSystem.bf +++ b/Engine/src/ECS/Systems/BehaviorSystem.bf @@ -8,7 +8,7 @@ namespace SteelEngine.ECS.Systems { protected override void RegisterComponentTypes() { - _registeredTypes = new Type[]{ typeof(BehaviorComponent) }; + _registeredTypes = new Type[]( typeof(BehaviorComponent) ); } protected override void Update(EntityId entityId, List components, float delta) diff --git a/Engine/src/ECS/Systems/Physics2dSystem.bf b/Engine/src/ECS/Systems/Physics2dSystem.bf index 0a813fe..4fa41ae 100644 --- a/Engine/src/ECS/Systems/Physics2dSystem.bf +++ b/Engine/src/ECS/Systems/Physics2dSystem.bf @@ -8,7 +8,7 @@ namespace SteelEngine.ECS.Systems { protected override void RegisterComponentTypes() { - _registeredTypes = new Type[]{ typeof(Physics2dComponent), typeof(TransformComponent) }; + _registeredTypes = new Type[]( typeof(Physics2dComponent), typeof(TransformComponent) ); } } } diff --git a/Engine/src/ECS/Systems/Physics3dSystem.bf b/Engine/src/ECS/Systems/Physics3dSystem.bf index 8ebfa06..dd9e3f5 100644 --- a/Engine/src/ECS/Systems/Physics3dSystem.bf +++ b/Engine/src/ECS/Systems/Physics3dSystem.bf @@ -8,7 +8,7 @@ namespace SteelEngine.ECS.Systems { protected override void RegisterComponentTypes() { - _registeredTypes = new Type[]{ typeof(Physics3dComponent), typeof(TransformComponent) }; + _registeredTypes = new Type[]( typeof(Physics3dComponent), typeof(TransformComponent) ); } } } diff --git a/Engine/src/ECS/Systems/Render3dSystem.bf b/Engine/src/ECS/Systems/Render3dSystem.bf index f55c7db..c608804 100644 --- a/Engine/src/ECS/Systems/Render3dSystem.bf +++ b/Engine/src/ECS/Systems/Render3dSystem.bf @@ -8,7 +8,7 @@ namespace SteelEngine.ECS.Systems { protected override void RegisterComponentTypes() { - _registeredTypes = new Type[]{ typeof(Drawable3dComponent), typeof(TransformComponent) }; + _registeredTypes = new Type[]( typeof(Drawable3dComponent), typeof(TransformComponent) ); } } } diff --git a/Engine/src/ECS/Systems/RenderSpriteSystem.bf b/Engine/src/ECS/Systems/RenderSpriteSystem.bf index 26b524f..55839e1 100644 --- a/Engine/src/ECS/Systems/RenderSpriteSystem.bf +++ b/Engine/src/ECS/Systems/RenderSpriteSystem.bf @@ -8,7 +8,7 @@ namespace SteelEngine.ECS.Systems { protected override void RegisterComponentTypes() { - _registeredTypes = new Type[]{ typeof(SpriteComponent), typeof(TransformComponent) }; + _registeredTypes = new Type[]( typeof(SpriteComponent), typeof(TransformComponent) ); } } } diff --git a/Engine/src/ECS/Systems/RenderTextSystem.bf b/Engine/src/ECS/Systems/RenderTextSystem.bf index d130df6..08e1fae 100644 --- a/Engine/src/ECS/Systems/RenderTextSystem.bf +++ b/Engine/src/ECS/Systems/RenderTextSystem.bf @@ -8,7 +8,7 @@ namespace SteelEngine.ECS.Systems { protected override void RegisterComponentTypes() { - _registeredTypes = new Type[]{ typeof(TextComponent), typeof(TransformComponent) }; + _registeredTypes = new Type[]( typeof(TextComponent), typeof(TransformComponent) ); } } } diff --git a/Engine/src/ECS/Systems/SoundSystem.bf b/Engine/src/ECS/Systems/SoundSystem.bf index ce68ccf..6823559 100644 --- a/Engine/src/ECS/Systems/SoundSystem.bf +++ b/Engine/src/ECS/Systems/SoundSystem.bf @@ -8,7 +8,7 @@ namespace SteelEngine.ECS.Systems { protected override void RegisterComponentTypes() { - _registeredTypes = new Type[]{ typeof(SoundComponent), typeof(TransformComponent) }; + _registeredTypes = new Type[]( typeof(SoundComponent), typeof(TransformComponent) ); } } } diff --git a/Engine/src/SteelPath.bf b/Engine/src/SteelPath.bf index 491043e..13d190a 100644 --- a/Engine/src/SteelPath.bf +++ b/Engine/src/SteelPath.bf @@ -7,6 +7,7 @@ namespace SteelEngine public static class SteelPath { public static String UserDirectory = new .() ~ delete _; + public static String ContentDirectory = new .() ~ delete _; public static this() { @@ -17,33 +18,32 @@ namespace SteelEngine Path.InternalCombine(UserDirectory, envVars["APPDATA"], "Steel"); DeleteDictionaryAndKeysAndItems!(envVars); + +#if DEBUG + Directory.GetCurrentDirectory(ContentDirectory); +#else + var executablePath = scope String(); + Environment.GetExecutableFilePath(executablePath); + if (Path.GetDirectoryPath(executablePath, ContentDirectory) case .Err) + Log.Fatal("Invalid executable path: '{}'", executablePath); +#endif } - public static void GetUserFolder(String relativePath, String target, bool create = false) + public static void GetUserPath(String target, params String[] components) { - Path.InternalCombine(target, UserDirectory, relativePath); - - if (create && !Directory.Exists(target)) - { - if (Directory.CreateDirectory(target) case .Err(let err)) - Log.Error("Failed to create user directory: {}", err); - } + String[] newComponents = new String[components.Count + 1]; + newComponents[0] = UserDirectory; + components.CopyTo(newComponents, 0, 1, components.Count); + Path.InternalCombine(target, params newComponents); + delete newComponents; } - public static void GetUserFile(String relativePath, String target, bool create = false) + public static void GetGamePath(String target, params String[] components) { - Path.InternalCombine(target, UserDirectory, relativePath); - - var dir = scope String(); - Path.GetDirectoryPath(target, dir); - if (create && !Directory.Exists(dir)) - Directory.CreateDirectory(dir); - - if (create && !File.Exists(target)) - { - if (File.WriteAllText(target, "") case .Err(let err)) - Log.Error("Failed to create user directory: {}", err); - } + String[] newComponents = new String[components.Count + 1]; + newComponents[0] = UserDirectory; + components.CopyTo(newComponents, 0, 1, components.Count); + Path.InternalCombine(target, params newComponents); } } } diff --git a/Examples/EditorDemo/BeefProj.toml b/Examples/EditorDemo/BeefProj.toml new file mode 100644 index 0000000..4d502ea --- /dev/null +++ b/Examples/EditorDemo/BeefProj.toml @@ -0,0 +1,5 @@ +FileVersion = 1 + +[Project] +Name = "EditorDemo" +StartupObject = "EditorDemo.Program" diff --git a/Examples/EditorDemo/BeefSpace.toml b/Examples/EditorDemo/BeefSpace.toml new file mode 100644 index 0000000..6b83822 --- /dev/null +++ b/Examples/EditorDemo/BeefSpace.toml @@ -0,0 +1,5 @@ +FileVersion = 1 +Projects = {EditorDemo = {Path = "."}, SteelEngine = {Path = "../../Engine"}, glfw-beef = {Path = "../../Libs/GLFW"}} + +[Workspace] +StartupProject = "EditorDemo" diff --git a/Examples/EditorDemo/SteelProj.json b/Examples/EditorDemo/SteelProj.json new file mode 100644 index 0000000..a78345a --- /dev/null +++ b/Examples/EditorDemo/SteelProj.json @@ -0,0 +1,7 @@ +{ + "Name": "EditorDemo", + "Entities": [ + { "Name": "Entity1", "IsEnabled": true }, + { "Name": "Entity2", "IsEnabled": false } + ] +} diff --git a/Libs/BGFX b/Libs/BGFX new file mode 160000 index 0000000..2147829 --- /dev/null +++ b/Libs/BGFX @@ -0,0 +1 @@ +Subproject commit 2147829d5acf6d9b2ab49eca76ede804cd3797d5 diff --git a/Libs/Beef-Extensions-Lib b/Libs/Beef-Extensions-Lib new file mode 160000 index 0000000..7bdcadb --- /dev/null +++ b/Libs/Beef-Extensions-Lib @@ -0,0 +1 @@ +Subproject commit 7bdcadbab3e976b967731ffcac5c016e80f5a1ad diff --git a/Libs/JSON_Beef b/Libs/JSON_Beef new file mode 160000 index 0000000..e2d0b5b --- /dev/null +++ b/Libs/JSON_Beef @@ -0,0 +1 @@ +Subproject commit e2d0b5bbbadb4984443c29be914e52bfc0f1a567 From 46fd4b634d5e332817a10adeef203aaee5953cf9 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Fri, 4 Sep 2020 22:15:46 +0200 Subject: [PATCH 23/50] Added New Project functionality --- Editor/BeefProj.toml | 1 + Editor/src/Program.bf | 1 + Editor/src/SteelPath.bf | 10 +++ Editor/src/Util.bf | 89 ++++++++++++++++++++++++ Editor/src/Windows/NewProjectWindow.bf | 72 +++++++++++++++++++ Samples/NewProject/BeefProj.toml | 5 ++ Samples/NewProject/BeefSpace.toml | 5 ++ Samples/NewProject/SteelProj.json | 4 ++ Samples/NewProject/src/$(ProjectName).bf | 25 +++++++ Samples/NewProject/src/Program.bf | 16 +++++ 10 files changed, 228 insertions(+) create mode 100644 Samples/NewProject/BeefProj.toml create mode 100644 Samples/NewProject/BeefSpace.toml create mode 100644 Samples/NewProject/SteelProj.json create mode 100644 Samples/NewProject/src/$(ProjectName).bf create mode 100644 Samples/NewProject/src/Program.bf diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index 724a2e0..c90e68d 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -7,3 +7,4 @@ StartupObject = "SteelEditor.Program" [Configs.Debug.Win64] BeefLibType = "DynamicDebug" +DebugWorkingDirectory = "$(WorkspaceDir)" diff --git a/Editor/src/Program.bf b/Editor/src/Program.bf index 28001ce..ffc096a 100644 --- a/Editor/src/Program.bf +++ b/Editor/src/Program.bf @@ -1,4 +1,5 @@ using System; +using System.IO; namespace SteelEditor { diff --git a/Editor/src/SteelPath.bf b/Editor/src/SteelPath.bf index 17b2a04..06f8e09 100644 --- a/Editor/src/SteelPath.bf +++ b/Editor/src/SteelPath.bf @@ -13,5 +13,15 @@ namespace SteelEngine GetUserPath(target, params newComponents); delete newComponents; } + + public static void GetEditorSamplePath(String target, params String[] components) + { + var newComponents = new String[components.Count + 2]; + newComponents[0] = ContentDirectory; + newComponents[1] = "Samples"; + components.CopyTo(newComponents, 0, 2, components.Count); + Path.InternalCombine(target, params newComponents); + delete newComponents; + } } } diff --git a/Editor/src/Util.bf b/Editor/src/Util.bf index a385f61..66efc12 100644 --- a/Editor/src/Util.bf +++ b/Editor/src/Util.bf @@ -42,6 +42,95 @@ namespace System.Reflection } } +namespace System.IO +{ + extension Directory + { + public static void Copy(StringView from, StringView to) + { + if (!Directory.Exists(from)) + { + SteelEngine.Log.Error("Tried to copy non-existing directory: {}", from); + return; + } + + if (!Directory.Exists(to)) + Directory.CreateDirectory(to); + + var toStr = new String(to); + + var filePath = new String(); + var fileName = new String(); + var newFilePath = new String(); + for (var file in Directory.EnumerateFiles(from)) + { + file.GetFilePath(filePath); + file.GetFileName(fileName); + + Path.InternalCombine(newFilePath, toStr, fileName); + + File.Copy(filePath, newFilePath); + + filePath.Clear(); + fileName.Clear(); + newFilePath.Clear(); + } + + delete filePath; + delete fileName; + delete newFilePath; + + var dirPath = new String(); + var dirName = new String(); + var newDirPath = new String(); + + for (var directory in Directory.EnumerateDirectories(from)) + { + directory.GetFilePath(dirPath); + directory.GetFileName(dirName); + Path.InternalCombine(newDirPath, toStr, dirName); + + Copy(dirPath, newDirPath); + + dirPath.Clear(); + dirName.Clear(); + newDirPath.Clear(); + } + + delete dirPath; + delete dirName; + delete newDirPath; + delete toStr; + } + + public static List GetFilesRecursively(StringView path) + { + var fileList = new List(); + GetFilesRecursively(scope String(path), fileList); + return fileList; + } + + private static void GetFilesRecursively(String path, List fileList) + { + for (var file in Directory.EnumerateFiles(path)) + { + var filePath = new String(); + file.GetFilePath(filePath); + fileList.Add(filePath); + } + + var dirs = Directory.EnumerateDirectories(path); + path.Clear(); + for (var dir in dirs) + { + dir.GetFilePath(path); + GetFilesRecursively(path, fileList); + path.Clear(); + } + } + } +} + namespace SteelEngine { extension Color diff --git a/Editor/src/Windows/NewProjectWindow.bf b/Editor/src/Windows/NewProjectWindow.bf index f692288..bcb3c2f 100644 --- a/Editor/src/Windows/NewProjectWindow.bf +++ b/Editor/src/Windows/NewProjectWindow.bf @@ -69,7 +69,79 @@ namespace SteelEditor.Windows { Log.Info("Creating project '{}' at '{}'", _projectName, _projectPath); +#if DEBUG + var samplePath = scope String(); + SteelPath.GetEditorSamplePath(samplePath, "NewProject"); + Directory.Copy(samplePath, _projectPath); +#else + #error Not Implemented: Get Editor installation path +#endif + ReplaceMacros(scope String(_projectPath)); + Editor.OpenProject(_projectPath); + } + + private void ReplaceMacros(String path) + { + for (var file in Directory.EnumerateFiles(path)) + { + var filePath = scope String(); + file.GetFilePath(filePath); + ReplaceMacrosInFile(filePath); + + var fileName = scope String(); + file.GetFileName(fileName); + if (ReplaceMacrosInString(fileName)) + { + var newFilePath = scope String(); + Path.InternalCombine(newFilePath, path, fileName); + File.Move(filePath, newFilePath); + } + } + + for (var dir in Directory.EnumerateDirectories(path)) + { + path.Clear(); + dir.GetFilePath(path); + ReplaceMacros(path); + + var fileName = scope String(); + Path.GetFileName(path, fileName); + + if (ReplaceMacrosInString(fileName)) + { + while (path.EndsWith(Path.DirectorySeparatorChar) | path.EndsWith(Path.AltDirectorySeparatorChar)) + path.RemoveFromEnd(1); + + var parentDirPath = scope String(); + Path.GetDirectoryPath(path, parentDirPath); + + var newFilePath = scope String(); + Path.InternalCombine(newFilePath, parentDirPath, fileName); + File.Move(path, newFilePath); + } + } + } + + private void ReplaceMacrosInFile(StringView path) + { + var fileContent = new String(); + File.ReadAllText(path, fileContent); + + if (ReplaceMacrosInString(fileContent)) + File.WriteAllText(path, fileContent); + + delete fileContent; + } + + private bool ReplaceMacrosInString(String string) + { + var prevString = new String(string); + defer delete prevString; + + string.Replace("$(ProjectName)", _projectName); + + return string != prevString; } } } diff --git a/Samples/NewProject/BeefProj.toml b/Samples/NewProject/BeefProj.toml new file mode 100644 index 0000000..f30a41f --- /dev/null +++ b/Samples/NewProject/BeefProj.toml @@ -0,0 +1,5 @@ +FileVersion = 1 + +[Project] +Name = "$(ProjectName)" +StartupObject = "$(ProjectName).Program" diff --git a/Samples/NewProject/BeefSpace.toml b/Samples/NewProject/BeefSpace.toml new file mode 100644 index 0000000..3d622b1 --- /dev/null +++ b/Samples/NewProject/BeefSpace.toml @@ -0,0 +1,5 @@ +FileVersion = 1 +Projects = {$(ProjectName) = {Path = "."}, SteelEngine = {Path = "../../Engine"}, glfw-beef = {Path = "../../Libs/GLFW"}} + +[Workspace] +StartupProject = "$(ProjectName)" diff --git a/Samples/NewProject/SteelProj.json b/Samples/NewProject/SteelProj.json new file mode 100644 index 0000000..831e654 --- /dev/null +++ b/Samples/NewProject/SteelProj.json @@ -0,0 +1,4 @@ +{ + "Name": "$(ProjectName)", + "Entities": [] +} diff --git a/Samples/NewProject/src/$(ProjectName).bf b/Samples/NewProject/src/$(ProjectName).bf new file mode 100644 index 0000000..797dba0 --- /dev/null +++ b/Samples/NewProject/src/$(ProjectName).bf @@ -0,0 +1,25 @@ +using SteelEngine; + +namespace SteelEditor +{ + public class $(ProjectName) : Application + { + // Gets called when the application is run + public override void OnInit() + { + + } + + // Gets called every frame + protected override void OnUpdate() + { + + } + + // Gets called when the application exits + public override void OnCleanup() + { + + } + } +} diff --git a/Samples/NewProject/src/Program.bf b/Samples/NewProject/src/Program.bf new file mode 100644 index 0000000..af8532f --- /dev/null +++ b/Samples/NewProject/src/Program.bf @@ -0,0 +1,16 @@ +using System; + +namespace $(ProjectName) +{ + class Program + { + public static int Main(String[] args) + { + var app = new $(ProjectName); + app.Run(); + delete app; + + return 0; + } + } +} \ No newline at end of file From cef484eb6abbc7f13d279bd3985fcd442fb454a6 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 14 Sep 2020 14:20:39 +0200 Subject: [PATCH 24/50] Content window --- Editor/src/Editor.bf | 27 +++++---- Editor/src/EditorGUI.bf | 13 +++++ Editor/src/EditorLayer.bf | 14 ++--- Editor/src/SteelPath.bf | 9 +++ Editor/src/Windows/ContentWindow.bf | 58 +++++++++++++++++++ Engine/src/Color.bf | 2 + Engine/src/SteelPath.bf | 5 ++ Examples/EditorDemo/Content/File1.txt | 0 Examples/EditorDemo/Content/File2.txt | 0 .../EditorDemo/Content/SubFolder/File3.txt | 0 10 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 Editor/src/Windows/ContentWindow.bf create mode 100644 Examples/EditorDemo/Content/File1.txt create mode 100644 Examples/EditorDemo/Content/File2.txt create mode 100644 Examples/EditorDemo/Content/SubFolder/File3.txt diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index b723e26..d1edc71 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -26,11 +26,12 @@ namespace SteelEditor _editorLayer = new .(Window); PushOverlay(_editorLayer); - AddWindow(); - AddWindow(); - AddWindow(); - AddWindow(); - AddWindow(); + Registerindow(); + Registerindow(); + Registerindow(); + Registerindow(); + Registerindow(); + Registerindow(); LoadConfig(); LoadCache(); @@ -117,6 +118,8 @@ namespace SteelEditor editor._cache.AddRecentProject(path); InspectorWindow.SetCurrentEntity(null); + + SteelPath.SetContentDirectory(); } public static void CloseProject() @@ -246,19 +249,19 @@ namespace SteelEditor GetInstance()._editorLayer.ShowWindow(); } - public static void ShowWindow(StringView windowName) + public static void RegisterWindow(StringView windowName) { - GetInstance()._editorLayer.ShowWindow(windowName); + GetInstance()._editorLayer.RegisterWindow(windowName); } - public static void ShowWindow(EditorWindow window) + public static void RegisterWindow(EditorWindow window) { - GetInstance()._editorLayer.ShowWindow(window); + GetInstance()._editorLayer.RegisterWindow(window); } - public static void AddWindow() where T : EditorWindow + public static void Registerindow() where T : EditorWindow { - GetInstance()._editorLayer.AddWindow(); + GetInstance()._editorLayer.RegisterWindow(); } public static void CloseWindow(EditorWindow window) @@ -458,7 +461,7 @@ namespace SteelEditor var windows = (List) config["Windows"]; for (var window in windows) - ShowWindow((String) window); + RegisterWindow((String) window); for (var value in config.Values) DeleteObject(value); diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 88edb4c..fb1b53b 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -16,6 +16,7 @@ namespace SteelEditor private static bool _popItemColor = false; private static bool _popItemID = false; private static bool _useColumns = true; + private static bool _visibleSeparator = false; private static uint _collapsableHeaderCount = 0; @@ -373,6 +374,18 @@ namespace SteelEditor _popItemColor = true; } + public static void VisibleSeparator() + { + ImGui.PopStyleColor(); + _visibleSeparator = true; + } + + public static void InvisibleSeparator() + { + ImGui.PushStyleColor(.Separator, Color.Transparent.Normalized); + _visibleSeparator = false; + } + // Other public static void ItemID(StringView id) diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index ced395e..c2789e7 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -47,7 +47,7 @@ namespace SteelEditor Log.Trace("OpenGL version: {}", ImGuiImplOpengl3.[Friend]g_GlVersion); Log.Trace("GLSL version: {}", ImGuiImplOpengl3.[Friend]g_GlslVersionString); - Editor.AddWindow(); + Editor.Registerindow(); } public override void OnDetach() @@ -172,7 +172,7 @@ namespace SteelEditor for (var window in _editorWindows) { if (ImGui.MenuItem(window.Title.Ptr)) - ShowWindow(window); + RegisterWindow(window); } ImGui.EndMenu(); @@ -213,7 +213,7 @@ namespace SteelEditor { if (window.GetType() == typeof(T)) { - ShowWindow(window); + RegisterWindow(window); return; } } @@ -226,19 +226,19 @@ namespace SteelEditor Log.Error("{} does not exist in application", typeName); } - public void ShowWindow(StringView windowName) + public void RegisterWindow(StringView windowName) { for (var window in _editorWindows) { if (window.Title == windowName) { - ShowWindow(window); + RegisterWindow(window); break; } } } - public void ShowWindow(EditorWindow window) + public void RegisterWindow(EditorWindow window) { if (!window.IsActive) { @@ -255,7 +255,7 @@ namespace SteelEditor } } - public void AddWindow() where T : EditorWindow + public void RegisterWindow() where T : EditorWindow { _editorWindows.Add(new T()); } diff --git a/Editor/src/SteelPath.bf b/Editor/src/SteelPath.bf index 06f8e09..d39eb01 100644 --- a/Editor/src/SteelPath.bf +++ b/Editor/src/SteelPath.bf @@ -1,5 +1,6 @@ using System; using System.IO; +using SteelEditor; namespace SteelEngine { @@ -23,5 +24,13 @@ namespace SteelEngine Path.InternalCombine(target, params newComponents); delete newComponents; } + + public static void SetContentDirectory() + { + ContentDirectory.Clear(); + var projectPath = Application.GetInstance().CurrentProject.Path; + if (!projectPath.IsEmpty) + Path.InternalCombine(ContentDirectory, projectPath, "Content"); + } } } diff --git a/Editor/src/Windows/ContentWindow.bf b/Editor/src/Windows/ContentWindow.bf new file mode 100644 index 0000000..1e16318 --- /dev/null +++ b/Editor/src/Windows/ContentWindow.bf @@ -0,0 +1,58 @@ +using System; +using System.IO; +using SteelEngine; +using imgui_beef; + +namespace SteelEditor.Windows +{ + public class ContentWindow : EditorWindow + { + public override StringView Title => "Content"; + + private String _dirPathBuffer = new .() ~ delete _; + private String _dirNameBuffer = new .() ~ delete _; + + public override void OnRender() + { + ImGui.BeginChild("##TreeView", .(ImGui.GetContentRegionAvail().x / 4f, ImGui.GetContentRegionAvail().y), true); + if (!SteelPath.ContentDirectory.IsEmpty) + { + _dirPathBuffer.Set(SteelPath.ContentDirectory); + ShowTree(); + } + ImGui.EndChild(); + + EditorGUI.SameLine(); + + ImGui.BeginChild("##DirectoryView", .(ImGui.GetContentRegionAvail().x, ImGui.GetContentRegionAvail().y), true); + + + ImGui.EndChild(); + } + + private void ShowTree() + { + for (var file in Directory.EnumerateFiles(_dirPathBuffer)) + { + var fileName = scope String(); + file.GetFileName(fileName); + EditorGUI.Selectable(fileName); + } + + for (var subDir in Directory.EnumerateDirectories(_dirPathBuffer)) + { + _dirPathBuffer.Clear(); + subDir.GetFilePath(_dirPathBuffer); + + _dirNameBuffer.Clear(); + subDir.GetFileName(_dirNameBuffer); + + if (EditorGUI.BeginTree(_dirNameBuffer)) + { + ShowTree(); + EditorGUI.EndTree(); + } + } + } + } +} diff --git a/Engine/src/Color.bf b/Engine/src/Color.bf index dd74f61..10e0819 100644 --- a/Engine/src/Color.bf +++ b/Engine/src/Color.bf @@ -19,6 +19,8 @@ namespace SteelEngine this.a = a; } + public Color Normalized => .(r / 255, b / 255, g / 255, a / 255); + public static Color Black => .(0, 0, 0, 1); public static Color Blue => .(0, 0, 1, 1); public static Color Cyan => .(0, 1, 1, 1); diff --git a/Engine/src/SteelPath.bf b/Engine/src/SteelPath.bf index 13d190a..82f8db4 100644 --- a/Engine/src/SteelPath.bf +++ b/Engine/src/SteelPath.bf @@ -18,6 +18,11 @@ namespace SteelEngine Path.InternalCombine(UserDirectory, envVars["APPDATA"], "Steel"); DeleteDictionaryAndKeysAndItems!(envVars); + } + + public static void SetContentDirectory() + { + ContentDirectory.Clear(); #if DEBUG Directory.GetCurrentDirectory(ContentDirectory); diff --git a/Examples/EditorDemo/Content/File1.txt b/Examples/EditorDemo/Content/File1.txt new file mode 100644 index 0000000..e69de29 diff --git a/Examples/EditorDemo/Content/File2.txt b/Examples/EditorDemo/Content/File2.txt new file mode 100644 index 0000000..e69de29 diff --git a/Examples/EditorDemo/Content/SubFolder/File3.txt b/Examples/EditorDemo/Content/SubFolder/File3.txt new file mode 100644 index 0000000..e69de29 From 18ff6fcc6b2bc9b20ef9cd1640d9a06adb75833b Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Wed, 7 Oct 2020 17:28:39 +0200 Subject: [PATCH 25/50] Inspector File View + Docking --- .gitignore | 1 + .gitmodules | 2 +- BeefSpace.toml | 4 +- Editor/BeefProj.toml | 2 +- .../Samples}/NewProject/BeefProj.toml | 0 .../Samples}/NewProject/BeefSpace.toml | 0 .../Samples}/NewProject/SteelProj.json | 0 .../Samples}/NewProject/src/$(ProjectName).bf | 0 .../Samples}/NewProject/src/Program.bf | 0 Editor/SteelProj.json | 1 - Editor/Themes/Default.txt | 35 ++++ Editor/src/Editor.bf | 150 +++++++++++------- Editor/src/EditorGUI.bf | 57 ++++++- Editor/src/EditorLayer.bf | 59 +++++-- Editor/src/EditorWindow.bf | 8 +- Editor/src/Serialization/EditorCache.bf | 2 +- Editor/src/SteelPath.bf | 12 +- Editor/src/Util.bf | 2 +- Editor/src/Windows/ConsoleWindow.bf | 46 ++---- Editor/src/Windows/ContentWindow.bf | 29 ++-- Editor/src/Windows/InspectorWindow.bf | 50 +++++- Editor/src/Windows/NewProjectWindow.bf | 4 - Editor/src/Windows/StyleWindow.bf | 53 ++++++- Engine/BeefProj.toml | 3 +- Engine/src/Application.bf | 2 +- Engine/src/Console/CVarUtil.bf | 1 + Engine/src/SteelPath.bf | 16 +- Examples/EditorDemo/Content/File1.txt | 1 + Examples/EditorDemo/Content/File2.txt | 1 + .../EditorDemo/Content/SubFolder/File3.txt | 1 + 30 files changed, 401 insertions(+), 141 deletions(-) rename {Samples => Editor/Samples}/NewProject/BeefProj.toml (100%) rename {Samples => Editor/Samples}/NewProject/BeefSpace.toml (100%) rename {Samples => Editor/Samples}/NewProject/SteelProj.json (100%) rename {Samples => Editor/Samples}/NewProject/src/$(ProjectName).bf (100%) rename {Samples => Editor/Samples}/NewProject/src/Program.bf (100%) delete mode 100644 Editor/SteelProj.json create mode 100644 Editor/Themes/Default.txt diff --git a/.gitignore b/.gitignore index 6bc8098..70cb920 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Directories build/ +recovery/ # Files BeefSpace_User.toml diff --git a/.gitmodules b/.gitmodules index 2aa2585..2dc95de 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "ImGui"] path = Libs/ImGui - url = https://github.com/qzole/imgui-beef + url = https://github.com/RogueMacro/imgui-beef [submodule "GLFW"] path = Libs/GLFW url = https://github.com/MineGame159/glfw-beef diff --git a/BeefSpace.toml b/BeefSpace.toml index 9be4786..26edcf0 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,6 +1,6 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, glfw-beef = {Path = "Libs/GLFW"}, imgui-impl-opengl3 = {Path = "Libs/imgui/imgui-impl-opengl3"}, imgui-impl-glfw = {Path = "Libs/imgui/imgui-impl-glfw"}, imgui-beef = {Path = "Libs/imgui/imgui-beef"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}} -Locked = ["glfw-beef", "imgui-impl-opengl3", "imgui-impl-glfw", "imgui-beef", "BeefExtensionsLib", "JSON_Beef"] +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}, imgui-beef = {Path = "../imgui-beef/ImGui"}, ImGui = {Path = "Libs/ImGui/ImGui"}, ImGuiImplGlfw = {Path = "Libs/ImGui/ImGuiImplGlfw"}, ImGuiImplOpenGL3 = {Path = "Libs/ImGui/ImGuiImplOpenGL3"}} +Locked = ["glfw-beef", "BeefExtensionsLib", "JSON_Beef", "ImGui", "ImGuiImplGlfw", "ImGuiImplOpenGL3"] [Workspace] StartupProject = "SteelEditor" diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index c90e68d..41f4e9b 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", SteelEngine = "*", imgui-impl-opengl3 = "*", imgui-impl-glfw = "*", imgui-beef = "*", BeefExtensionsLib = "*", JSON_Beef = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", BeefExtensionsLib = "*", JSON_Beef = "*", ImGui = "*", ImGuiImplGlfw = "*", ImGuiImplOpenGL3 = "*"} [Project] Name = "SteelEditor" diff --git a/Samples/NewProject/BeefProj.toml b/Editor/Samples/NewProject/BeefProj.toml similarity index 100% rename from Samples/NewProject/BeefProj.toml rename to Editor/Samples/NewProject/BeefProj.toml diff --git a/Samples/NewProject/BeefSpace.toml b/Editor/Samples/NewProject/BeefSpace.toml similarity index 100% rename from Samples/NewProject/BeefSpace.toml rename to Editor/Samples/NewProject/BeefSpace.toml diff --git a/Samples/NewProject/SteelProj.json b/Editor/Samples/NewProject/SteelProj.json similarity index 100% rename from Samples/NewProject/SteelProj.json rename to Editor/Samples/NewProject/SteelProj.json diff --git a/Samples/NewProject/src/$(ProjectName).bf b/Editor/Samples/NewProject/src/$(ProjectName).bf similarity index 100% rename from Samples/NewProject/src/$(ProjectName).bf rename to Editor/Samples/NewProject/src/$(ProjectName).bf diff --git a/Samples/NewProject/src/Program.bf b/Editor/Samples/NewProject/src/Program.bf similarity index 100% rename from Samples/NewProject/src/Program.bf rename to Editor/Samples/NewProject/src/Program.bf diff --git a/Editor/SteelProj.json b/Editor/SteelProj.json deleted file mode 100644 index ff06631..0000000 --- a/Editor/SteelProj.json +++ /dev/null @@ -1 +0,0 @@ -{"Name":"Untitled","Entities":[]} \ No newline at end of file diff --git a/Editor/Themes/Default.txt b/Editor/Themes/Default.txt new file mode 100644 index 0000000..483d6ce --- /dev/null +++ b/Editor/Themes/Default.txt @@ -0,0 +1,35 @@ +Alpha = 1 +WindowPadding = [8, 8] +WindowRounding = 0 +WindowBorderSize = 0 +WindowMinSize = [32, 32] +WindowTitleAlign = [0, 0.5] +WindowMenuButtonPosition = None +ChildRounding = 0 +ChildBorderSize = 1 +PopupRounding = 0 +PopupBorderSize = 0 +FramePadding = [4, 3] +FrameRounding = 0 +ItemSpacing = [8, 4] +ItemInnerSpacing = [4, 4] +TouchExtraPadding = [0, 0] +IndentSpacing = 21 +ColumnsMinSpacing = 6 +ScrollbarSize = 14 +ScrollbarRounding = 0 +GrabMinSize = 10 +GrabRounding = 0 +TabRounding = 0 +TabBorderSize = 0 +ColorButtonPosition = Right +ButtonTextAlign = [0.5, 0.5] +SelectableTextAlign = [0, 0] +DisplayWindowPadding = [19, 19] +DisplaySafeAreaPadding = [3, 3] +MouseCursorScale = 1 +AntiAliasedLines = True +AntiAliasedFill = True +CurveTessellationTol = 1.25 +CircleSegmentMaxError = 1.60000002 +Colors = [[0.899999976, 0.899999976, 0.899999976, 1], [0.600000024, 0.600000024, 0.600000024, 1], [0.0705882385, 0.0823529437, 0.0980392173, 1], [0, 0, 0, 0], [0.109999999, 0.109999999, 0.140000001, 0.920000017], [0.5, 0.5, 0.5, 0.5], [0, 0, 0, 0], [0.430000007, 0.430000007, 0.430000007, 0.389999986], [0.469999999, 0.469999999, 0.689999998, 0.400000006], [0.419999987, 0.409999996, 0.639999986, 0.689999998], [0.132840857, 0.157223493, 0.18784529, 1], [0.109803922, 0.129411772, 0.152941182, 1], [0.400000006, 0.400000006, 0.800000012, 0.200000003], [0.124446772, 0.138211429, 0.149171293, 0.800000012], [0.200000003, 0.25, 0.300000012, 0.600000024], [0.400000006, 0.400000006, 0.800000012, 0.300000012], [0.400000006, 0.400000006, 0.800000012, 0.400000006], [0.409999996, 0.389999986, 0.800000012, 0.600000024], [0.899999976, 0.899999976, 0.899999976, 0.5], [1, 1, 1, 0.300000012], [0.409999996, 0.389999986, 0.800000012, 0.600000024], [0.196078435, 0.200000003, 0.203921571, 1], [0.300753921, 0.312140822, 0.325966835, 1], [0.392967284, 0.407308578, 0.453038692, 1], [0.400000006, 0.400000006, 0.899999976, 0.449999988], [0.449999988, 0.449999988, 0.899999976, 0.800000012], [0.529999971, 0.529999971, 0.870000005, 0.800000012], [0, 0, 0, 0], [0.600000024, 0.600000024, 0.699999988, 1], [0.699999988, 0.699999988, 0.899999976, 1], [1, 1, 1, 0.159999996], [0.779999971, 0.819999993, 1, 0.600000024], [0.779999971, 0.819999993, 1, 0.899999976], [0.176470593, 0.192156866, 0.20784314, 1], [0.449999988, 0.449999988, 0.899999976, 0.800000012], [0.270588249, 0.282352954, 0.298039228, 1], [0.176470593, 0.192156866, 0.20784314, 1], [0.270588249, 0.282352954, 0.298039228, 1], [0.400000006, 0.400000006, 0.899999976, 0.314999998], [0.200000003, 0.200000003, 0.200000003, 1], [1, 1, 1, 1], [0.899999976, 0.699999988, 0, 1], [0.899999976, 0.699999988, 0, 1], [1, 0.600000024, 0, 1], [0, 0, 1, 0.349999994], [1, 1, 0, 0.899999976], [0.449999988, 0.449999988, 0.899999976, 0.800000012], [1, 1, 1, 0.699999988], [0.800000012, 0.800000012, 0.800000012, 0.200000003], [0.200000003, 0.200000003, 0.200000003, 0.349999994]] \ No newline at end of file diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index d1edc71..bb038cd 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -6,7 +6,7 @@ using SteelEngine.Window; using SteelEngine.ECS; using SteelEditor.Windows; using SteelEditor.Serialization; -using imgui_beef; +using ImGui; using JSON_Beef.Serialization; namespace SteelEditor @@ -21,6 +21,8 @@ namespace SteelEditor public EditorProject CurrentProject = EditorProject.UntitledProject() ~ delete _; + private String _currentTheme = new .() ~ delete _; + public override void OnInit() { _editorLayer = new .(Window); @@ -37,6 +39,8 @@ namespace SteelEditor LoadCache(); UpdateTitle(); + + Log.Trace("Editor Resource Path: {}", SteelPath.EngineInstallationPath); } public override void OnCleanup() @@ -55,6 +59,19 @@ namespace SteelEditor UpdateTitle(); } + public static void SetTheme(StringView themeName) + { + String fileName = scope .(themeName)..Append(".txt"); + String _themePath = scope .(); + SteelPath.GetEditorResourcePath(_themePath, "Themes", fileName); + + String theme = new .(); + defer delete theme; + + File.ReadAllText(_themePath, theme); + LoadStyle(theme); + } + public static void GetEntityName(EntityId id, String buffer) { var editor = GetInstance(); @@ -73,9 +90,15 @@ namespace SteelEditor editor._entityNames[id].Set(name); } + public static void Refresh() + { + for (var window in GetInstance()._editorLayer.[Friend]_editorWindows) + window.OnShow(); + } + public static void OpenProject(StringView path) { - Log.Info("Opening project: {}", path); + GameConsole.Instance.Clear(); var filePath = scope String(); Path.InternalCombine(filePath, scope String(path), "SteelProj.json"); @@ -118,8 +141,8 @@ namespace SteelEditor editor._cache.AddRecentProject(path); InspectorWindow.SetCurrentEntity(null); - SteelPath.SetContentDirectory(); + Refresh(); } public static void CloseProject() @@ -383,45 +406,29 @@ namespace SteelEditor var configPath = scope String(); SteelPath.GetEditorUserPath(configPath, "Config.txt"); var serialized = new String(); + defer delete serialized; if (File.ReadAllText(configPath, serialized) case .Err) - { - delete serialized; return; - } - var config = new Dictionary(); + ParseConfig(serialized, var config); + LoadStyle(config); - for (var line in serialized.Split('\n')) - { - if (line.IsWhiteSpace) - continue; - - var lineEnumerator = line.GetEnumerator(); - - var key = new String(); - for (var char in lineEnumerator) - { - if (char == '=') - break; - key.Append(char); - } - - key.Trim(); + var windows = (List) config["Windows"]; + for (var window in windows) + RegisterWindow((String) window); - for (var char in lineEnumerator) - if (!char.IsWhiteSpace) - break; + DeleteConfig!(config); + } - if (key == "Colors") - NOP!(); + public static void LoadStyle(StringView str) + { + ParseConfig(str, var config); + LoadStyle(config); + DeleteConfig!(config); + } - var value = ParseValue(ref lineEnumerator); - if (value != null) - config[key] = value; - else - delete key; - } - + private static void LoadStyle(Dictionary config) + { var style = ref ImGui.GetStyle(); style.Alpha = (float) config["Alpha"]; style.WindowPadding = GetVec2(config, "WindowPadding"); @@ -459,25 +466,6 @@ namespace SteelEditor style.CircleSegmentMaxError = (float) config["CircleSegmentMaxError"]; GetColors(config, ref style.Colors); - var windows = (List) config["Windows"]; - for (var window in windows) - RegisterWindow((String) window); - - for (var value in config.Values) - DeleteObject(value); - DeleteDictionaryAndKeys!(config); - delete serialized; - - void DeleteObject(Object object) - { - if (object.GetType() == typeof(List)) - { - for (var item in (List) object) - DeleteObject(item); - } - delete object; - } - ImGui.Vec2 GetVec2(Dictionary config, String name) { var list = (List) config[name]; @@ -496,6 +484,42 @@ namespace SteelEditor colors[i] = vec; } } + } + + private static void ParseConfig(StringView str, out Dictionary config) + { + config = new Dictionary(); + + for (var line in str.Split('\n')) + { + if (line.IsWhiteSpace) + continue; + + var lineEnumerator = line.GetEnumerator(); + + var key = new String(); + for (var char in lineEnumerator) + { + if (char == '=') + break; + key.Append(char); + } + + key.Trim(); + + for (var char in lineEnumerator) + if (!char.IsWhiteSpace) + break; + + if (key == "Colors") + NOP!(); + + var value = ParseValue(ref lineEnumerator); + if (value != null) + config[key] = value; + else + delete key; + } Object ParseValue(ref Span.Enumerator enumerator) { @@ -521,6 +545,7 @@ namespace SteelEditor if (value != null) array.Add(value); } + return array; } @@ -564,6 +589,23 @@ namespace SteelEditor } } + private static mixin DeleteConfig(Dictionary config) + { + for (var value in config.Values) + DeleteObject(value); + DeleteDictionaryAndKeys!(config); + + void DeleteObject(Object object) + { + if (object.GetType() == typeof(List)) + { + for (var item in (List) object) + DeleteObject(item); + } + delete object; + } + } + public static void ResetStyle() { var style = ref ImGui.GetStyle(); diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index fb1b53b..672b1a9 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -1,6 +1,6 @@ using System; using System.Collections; -using imgui_beef; +using ImGui; using SteelEngine; using SteelEngine.Math; using SteelEngine.Input; @@ -12,6 +12,7 @@ namespace SteelEditor private static InputCallback _inputCallback = .(.None); private static Dictionary _inputTextBuffers = new .() ~ DeleteDictionaryAndKeysAndItems!(_); + private static bool _isWindow = false; private static bool _popItemWidth = false; private static bool _popItemColor = false; private static bool _popItemID = false; @@ -24,13 +25,15 @@ namespace SteelEditor public static bool BeginWindow(StringView name, ref bool isActive) { + _isWindow = isActive; return ImGui.Begin(name.Ptr, &isActive, .NoScrollbar); } public static void EndWindow() { + _isWindow = false; ImGui.End(); - AddColumns(); + RemoveColumns(); } // Text @@ -100,7 +103,7 @@ namespace SteelEditor if (!value) { var color = ImGui.GetStyleColorVec4(.Button); - color.w = 0.2f; + color.w = 0.4f; ImGui.PushStyleColor(.Button, color); } @@ -178,6 +181,34 @@ namespace SteelEditor return _inputCallback; } + public static void InputMultiline(StringView label, String buffer, int maxSize = 256, bool readOnly = false, Vector2 size = default) + { + bool hasLabel = Label(label); + if (!hasLabel) + EditorGUI.RemoveColumns(); + + var labelStr = scope String(label); + + if (!_inputTextBuffers.ContainsKey(labelStr)) + _inputTextBuffers[new String(label)] = new .(); + + var inputTextBuffer = _inputTextBuffers[labelStr]; + if (inputTextBuffer.Size != (uint) maxSize) + inputTextBuffer.ReAlloc((uint) maxSize); + + inputTextBuffer.Set(buffer); + + ImGui.InputTextFlags flags = readOnly ? .ReadOnly : .None; + ImGui.InputTextMultiline(scope UniqueLabel(label, "InputMultiline"), inputTextBuffer.Ptr, (uint) maxSize, .(size.x, size.y), flags); + + if (!hasLabel) + CheckItem(false); + else + CheckItem(); + + buffer.Set(inputTextBuffer.View()); + } + private static int InputTextCallback(ImGui.InputTextCallbackData* data) { _inputCallback = .(data); @@ -194,7 +225,7 @@ namespace SteelEditor public static void Int(StringView label, ref int value) { Label(label); - ImGui.DragInt(scope UniqueLabel(label, "InputInt"), &value); + ImGui.DragInt(scope UniqueLabel(label, "InputInt"), (int32*) &value); CheckItem(); } @@ -257,12 +288,25 @@ namespace SteelEditor int tmp = (.) currentItem; - let result = ImGui.Combo(scope UniqueLabel(label, "Combo"), &tmp, str); + let result = ImGui.Combo(scope UniqueLabel(label, "Combo"), (int32*) &tmp, str); CheckItem(); currentItem = (.) tmp; return result; } + public static bool Combo(StringView label, Span items, ref int32 currentItem) + { + Label(label); + + var str = scope String(); + for (var item in items) + str.AppendF("{}\0", item); + + let result = ImGui.Combo(scope UniqueLabel(label, "Combo"), (int32*) ¤tItem, str); + CheckItem(); + return result; + } + // Layout public static void Line() @@ -396,6 +440,9 @@ namespace SteelEditor private static void CheckItem(bool nextColumn = true) { + if (!_isWindow) + Log.Error("CheckItem() called without a window!"); + if (_popItemWidth) { ImGui.PopItemWidth(); diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index c2789e7..b927063 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -5,7 +5,7 @@ using SteelEngine; using SteelEngine.Events; using SteelEngine.Window; using SteelEditor.Windows; -using imgui_beef; +using ImGui; using glfw_beef; namespace SteelEditor @@ -14,7 +14,6 @@ namespace SteelEditor { private Window _window; private List _editorWindows = new .(); - private bool _showDemoWindow = false; private String _imguiIniPath = new .() ~ delete _; private ImGui.Style _originalStyle; @@ -26,12 +25,17 @@ namespace SteelEditor public override void OnAttach() { + if (!ImGui.CHECKVERSION()) + Log.Fatal("There is a problem with ImGui"); + ImGui.CreateContext(); - + SteelPath.GetEditorUserPath(_imguiIniPath, "imgui.ini"); var io = ref ImGui.GetIO(); io.IniFilename = _imguiIniPath; + io.ConfigFlags |= .DockingEnable | .ViewportsEnable; + io.ConfigViewportsNoDecoration = false; var style = ref ImGui.GetStyle(); style.WindowMenuButtonPosition = .None; // This disables the collapse button on windows @@ -42,10 +46,7 @@ namespace SteelEditor _originalStyle = style; ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, true); - ImGuiImplOpengl3.Init(=> Glfw.GetProcAddress); - - Log.Trace("OpenGL version: {}", ImGuiImplOpengl3.[Friend]g_GlVersion); - Log.Trace("GLSL version: {}", ImGuiImplOpengl3.[Friend]g_GlslVersionString); + ImGuiImplOpenGL3.Init(); Editor.Registerindow(); } @@ -60,7 +61,7 @@ namespace SteelEditor delete _editorWindows; - ImGuiImplOpengl3.Shutdown(); + ImGuiImplOpenGL3.Shutdown(); ImGuiImplGlfw.Shutdown(); ImGui.DestroyContext(); } @@ -70,11 +71,12 @@ namespace SteelEditor var io = ref ImGui.GetIO(); var app = Editor.Instance; io.DisplaySize = ImGui.Vec2(app.Window.GetSize.x, app.Window.GetSize.y); - ImGuiImplOpengl3.NewFrame(); + ImGuiImplOpenGL3.NewFrame(); ImGuiImplGlfw.NewFrame(); ImGui.NewFrame(); ShowMainMenuBar(); + ShowDockspace(); // Update ImGui windows for (var window in _editorWindows) @@ -89,12 +91,39 @@ namespace SteelEditor } // Background color - ImGuiImplOpengl3GL.glClearColor(0.45f, 0.55f, 0.6f, 1); - ImGuiImplOpengl3GL.glClear(ImGuiImplOpengl3GL.GL_COLOR_BUFFER_BIT); + // ImGuiImplOpenGL3.glClearColor(0.45f, 0.55f, 0.6f, 1); + // ImGuiImplOpenGL3.glClear(ImGuiImplOpenGL3.GL_COLOR_BUFFER_BIT); - // ImGui rendering + // Rendering ImGui.Render(); - ImGuiImplOpengl3.RenderDrawData(ImGui.GetDrawData()); + ImGuiImplOpenGL3.RenderDrawData(&ImGui.GetDrawData()); + + if (io.ConfigFlags.HasFlag(.ViewportsEnable)) + { + GlfwWindow* glfwContextBackup = Glfw.GetCurrentContext(); + ImGui.UpdatePlatformWindows(); + ImGui.RenderPlatformWindowsDefault(); + Glfw.MakeContextCurrent(glfwContextBackup); + } + } + + private void ShowDockspace() + { + var viewport = ImGui.GetMainViewport(); + ImGui.SetNextWindowPos(viewport.Pos); + ImGui.SetNextWindowSize(viewport.Size); + ImGui.SetNextWindowViewport(viewport.ID); + + ImGui.PushStyleVar(.WindowPadding, .(0, 0)); + ImGui.PushStyleVar(.WindowRounding, 0.0f); + ImGui.PushStyleVar(.WindowBorderSize, 0.0f); + ImGui.WindowFlags windowFlags = .MenuBar | .NoDocking | .NoTitleBar | .NoResize | .NoMove | .NoBringToFrontOnFocus | .NoNavFocus; + ImGui.Begin("EditorMainDockspaceWindow", null, windowFlags); + ImGui.PopStyleVar(3); + + ImGui.ID dockspaceId = ImGui.GetID("EditorMainDockspace"); + ImGui.DockSpace(dockspaceId); + ImGui.End(); } private void ShowMainMenuBar() @@ -175,6 +204,10 @@ namespace SteelEditor RegisterWindow(window); } + EditorGUI.Line(); + if (ImGui.MenuItem("Refresh")) + Editor.Refresh(); + ImGui.EndMenu(); } } diff --git a/Editor/src/EditorWindow.bf b/Editor/src/EditorWindow.bf index 841286c..e882177 100644 --- a/Editor/src/EditorWindow.bf +++ b/Editor/src/EditorWindow.bf @@ -1,12 +1,11 @@ using System; using SteelEngine; -using imgui_beef; +using ImGui; namespace SteelEditor { public abstract class EditorWindow { - // Pointer to fixed memory i.e. public override StringView Title => "MyEditorWindow"; public abstract StringView Title { get; } public bool IsActive = false; @@ -20,10 +19,9 @@ namespace SteelEditor return; if (EditorGUI.BeginWindow(Title, ref IsActive)) - { OnRender(); - EditorGUI.EndWindow(); - } + + EditorGUI.EndWindow(); } public virtual void OnInit() {} diff --git a/Editor/src/Serialization/EditorCache.bf b/Editor/src/Serialization/EditorCache.bf index ae1a519..9b1af2d 100644 --- a/Editor/src/Serialization/EditorCache.bf +++ b/Editor/src/Serialization/EditorCache.bf @@ -1,7 +1,7 @@ using System; using System.Collections; using JSON_Beef.Attributes; -using imgui_beef; +using ImGui; namespace SteelEditor.Serialization { diff --git a/Editor/src/SteelPath.bf b/Editor/src/SteelPath.bf index d39eb01..bb7b94a 100644 --- a/Editor/src/SteelPath.bf +++ b/Editor/src/SteelPath.bf @@ -18,13 +18,23 @@ namespace SteelEngine public static void GetEditorSamplePath(String target, params String[] components) { var newComponents = new String[components.Count + 2]; - newComponents[0] = ContentDirectory; + newComponents[0] = EngineInstallationPath; newComponents[1] = "Samples"; components.CopyTo(newComponents, 0, 2, components.Count); Path.InternalCombine(target, params newComponents); delete newComponents; } + public static void GetEditorResourcePath(String target, params String[] components) + { + var newComponents = new String[components.Count + 2]; + newComponents[0] = EngineInstallationPath; + newComponents[1] = "Editor"; + components.CopyTo(newComponents, 0, 2, components.Count); + Path.InternalCombine(target, params newComponents); + delete newComponents; + } + public static void SetContentDirectory() { ContentDirectory.Clear(); diff --git a/Editor/src/Util.bf b/Editor/src/Util.bf index 66efc12..2d700f7 100644 --- a/Editor/src/Util.bf +++ b/Editor/src/Util.bf @@ -1,5 +1,5 @@ using System.Collections; -using imgui_beef; +using ImGui; namespace System { diff --git a/Editor/src/Windows/ConsoleWindow.bf b/Editor/src/Windows/ConsoleWindow.bf index 2ab750b..3330fa0 100644 --- a/Editor/src/Windows/ConsoleWindow.bf +++ b/Editor/src/Windows/ConsoleWindow.bf @@ -5,7 +5,7 @@ using SteelEngine; using SteelEngine.Math; using SteelEngine.Console; using SteelEditor; -using imgui_beef; +using ImGui; namespace SteelEditor.Windows { @@ -36,14 +36,18 @@ namespace SteelEditor.Windows public override void OnRender() { EditorGUI.ToggleButton("Errors", ref _showErrors); + EditorGUI.SameLine(); + EditorGUI.ToggleButton("Warnings", ref _showWarnings); + EditorGUI.SameLine(); + EditorGUI.ToggleButton("Info", ref _showInfo); + EditorGUI.SameLine(); + EditorGUI.ToggleButton("Trace", ref _showTrace); EditorGUI.AlignFromRight(CLEAR_BUTTON_OFFSET); if (EditorGUI.Button("Clear")) GameConsole.Instance.Clear(); - EditorGUI.ToggleButton("Warnings", ref _showWarnings); - EditorGUI.ToggleButton("Info", ref _showInfo); - EditorGUI.ToggleButton("Trace", ref _showTrace); + EditorGUI.Line(); var footerSpacing = EditorGUI.GetHeightOfItems(1); EditorGUI.BeginScrollingRegion("CommandScrollingRegion", -footerSpacing); @@ -94,14 +98,15 @@ namespace SteelEditor.Windows EditorGUI.Line(); EditorGUI.FillWidth(); - var inputCallback = EditorGUI.Input(scope String()..AppendF("##CommandInputBuffer_{}", _commandIndex), _commandBuffer, "", 256); + + var inputCallback = EditorGUI.Input("##CommandInputBuffer", _commandBuffer, "", 256); if (inputCallback.OnEnter && !_commandBuffer.IsEmpty) { ImGui.SetKeyboardFocusHere(-1); _scrollToBottom = true; GameConsole.Instance.Enqueue(_commandBuffer); - ClearCommandBuffer(); + _commandBuffer.Clear(); } else if (inputCallback.OnHistory(let direction)) { @@ -111,30 +116,13 @@ namespace SteelEditor.Windows private void OnCommandHistory(VerticalDirection dir) { - if (dir == .Up && _commandIndex > _commandStartIndex) - _commandIndex--; - else if (_commandIndex < _newCommandIndex) - _commandIndex++; - + if (dir == .Up) + _commandBuffer.Set(GameConsole.Instance.History.HistoryUp()); + else + _commandBuffer.Set(GameConsole.Instance.History.HistoryDown()); + ImGui.SetKeyboardFocusHere(-1); - } - - public void ClearCommands() - { - _commandStartIndex = _newCommandIndex; - _commandIndex = _commandStartIndex; - } - - public void ClearCommandBuffer() - { - _commandIndex = _newCommandIndex; - _newCommandIndex++; - } - - private enum ConsoleType - { - Log, - Game + ImGui.SetActiveID(0, &ImGui.GetCurrentWindow()); } } } diff --git a/Editor/src/Windows/ContentWindow.bf b/Editor/src/Windows/ContentWindow.bf index 1e16318..73808b2 100644 --- a/Editor/src/Windows/ContentWindow.bf +++ b/Editor/src/Windows/ContentWindow.bf @@ -1,7 +1,7 @@ using System; using System.IO; using SteelEngine; -using imgui_beef; +using ImGui; namespace SteelEditor.Windows { @@ -9,24 +9,30 @@ namespace SteelEditor.Windows { public override StringView Title => "Content"; + private String _localContentPath = new .() ~ delete _; private String _dirPathBuffer = new .() ~ delete _; private String _dirNameBuffer = new .() ~ delete _; + public override void OnShow() + { + _dirPathBuffer.Set(SteelPath.ContentDirectory); + _localContentPath.Set("Content / "); + } + public override void OnRender() { - ImGui.BeginChild("##TreeView", .(ImGui.GetContentRegionAvail().x / 4f, ImGui.GetContentRegionAvail().y), true); + if (SteelPath.ContentDirectory.IsEmpty) + return; + + _dirPathBuffer.Set(SteelPath.ContentDirectory); + EditorGUI.Text(_localContentPath); + ImGui.BeginChild("##ContentTreeView", .(ImGui.GetContentRegionAvail().x / 4f, ImGui.GetContentRegionAvail().y), true); if (!SteelPath.ContentDirectory.IsEmpty) - { - _dirPathBuffer.Set(SteelPath.ContentDirectory); ShowTree(); - } ImGui.EndChild(); EditorGUI.SameLine(); - ImGui.BeginChild("##DirectoryView", .(ImGui.GetContentRegionAvail().x, ImGui.GetContentRegionAvail().y), true); - - ImGui.EndChild(); } @@ -36,7 +42,12 @@ namespace SteelEditor.Windows { var fileName = scope String(); file.GetFileName(fileName); - EditorGUI.Selectable(fileName); + if (EditorGUI.Selectable(fileName)) + { + var filePath = scope String(); + file.GetFilePath(filePath); + InspectorWindow.ViewFile(filePath); + } } for (var subDir in Directory.EnumerateDirectories(_dirPathBuffer)) diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index 22c8f2a..75e007d 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -4,7 +4,8 @@ using SteelEngine.ECS; using SteelEngine.ECS.Components; using SteelEngine; using System.Reflection; -using imgui_beef; +using ImGui; +using System.IO; namespace SteelEditor.Windows { @@ -16,13 +17,51 @@ namespace SteelEditor.Windows private String _entityName = new .() ~ delete _; private bool _showAddComponentPopup = false; + private bool _isFileView = false; + private String _filePath = null ~ if (_ != null) delete _; + private String _fileBuffer = null ~ if (_ != null) delete _; + public static void SetCurrentEntity(Entity entity) { - Editor.GetWindow()._entity = entity; + var inspector = Editor.GetWindow(); + inspector._entity = entity; + if (inspector._isFileView) + inspector.ClearFileView(); + } + + public static void ViewFile(StringView filePath) + { + var inspector = Editor.GetWindow(); + inspector._isFileView = true; + + if (inspector._fileBuffer == null) + inspector._fileBuffer = new .(); + + if (!inspector._fileBuffer.IsEmpty) + inspector._fileBuffer.Clear(); + + if (inspector._filePath == null) + inspector._filePath = new .(filePath); + else + inspector._filePath.Set(filePath); + + File.ReadAllText(filePath, inspector._fileBuffer); + } + + private void ClearFileView() + { + _isFileView = false; + _fileBuffer.Clear(); } public override void OnRender() { + if (_isFileView) + { + ShowFileView(); + return; + } + if (_entity == null) return; @@ -46,6 +85,7 @@ namespace SteelEditor.Windows } EditorGUI.Line(); + EditorGUI.AddColumns(); var componentsToRender = scope List(); @@ -90,6 +130,12 @@ namespace SteelEditor.Windows ShowAddComponentPopup(); } + private void ShowFileView() + { + EditorGUI.Text(_filePath); + EditorGUI.InputMultiline("##FileView", _fileBuffer, 1024, true); + } + private void ShowAddComponentPopup() { Type componentType = null; diff --git a/Editor/src/Windows/NewProjectWindow.bf b/Editor/src/Windows/NewProjectWindow.bf index bcb3c2f..99f7e4c 100644 --- a/Editor/src/Windows/NewProjectWindow.bf +++ b/Editor/src/Windows/NewProjectWindow.bf @@ -69,13 +69,9 @@ namespace SteelEditor.Windows { Log.Info("Creating project '{}' at '{}'", _projectName, _projectPath); -#if DEBUG var samplePath = scope String(); SteelPath.GetEditorSamplePath(samplePath, "NewProject"); Directory.Copy(samplePath, _projectPath); -#else - #error Not Implemented: Get Editor installation path -#endif ReplaceMacros(scope String(_projectPath)); Editor.OpenProject(_projectPath); diff --git a/Editor/src/Windows/StyleWindow.bf b/Editor/src/Windows/StyleWindow.bf index a88f8c1..ab58e1d 100644 --- a/Editor/src/Windows/StyleWindow.bf +++ b/Editor/src/Windows/StyleWindow.bf @@ -1,5 +1,8 @@ using System; -using imgui_beef; +using System.Collections; +using System.IO; +using SteelEngine; +using ImGui; namespace SteelEditor.Windows { @@ -7,21 +10,57 @@ namespace SteelEditor.Windows { public override StringView Title => "Style"; + private int32 _currentTheme = -1; + private List _themes = new .() ~ DeleteContainerAndItems!(_); + + public override void OnShow() + { + LoadThemes(); + } + public override void OnRender() { - EditorGUI.AlignFromRight(170); - if (EditorGUI.Button("Reset")) - Editor.ResetStyle(); + EditorGUI.RemoveColumns(); + if (EditorGUI.Button("Save")) + Editor.SaveConfig(); EditorGUI.SameLine(); if (EditorGUI.Button("Reload")) Editor.LoadConfig(); EditorGUI.SameLine(); - if (EditorGUI.Button("Save")) - Editor.SaveConfig(); + if (EditorGUI.Button("Reset")) + { + Editor.ResetStyle(); + _currentTheme = -1; + } + + if (EditorGUI.Combo("Theme:", _themes, ref _currentTheme)) + Editor.SetTheme(_themes[_currentTheme]); + + if (EditorGUI.BeginCollapsableHeader("Style")) + { + ImGui.ShowStyleEditor(); + EditorGUI.EndCollapsableHeader(); + } + } + + private void LoadThemes() + { + DeleteAndClearItems!(_themes); + + String _themesPath = scope .(); + SteelPath.GetEditorResourcePath(_themesPath, "Themes"); + + for (var themeFile in Directory.EnumerateFiles(_themesPath)) + { + String fileName = scope .(); + String themeName = new .(); - ImGui.ShowStyleEditor(); + themeFile.GetFileName(fileName); + Path.GetFileNameWithoutExtension(fileName, themeName); + _themes.Add(themeName); + } } } } diff --git a/Engine/BeefProj.toml b/Engine/BeefProj.toml index 1a6e4bb..80bc1cd 100644 --- a/Engine/BeefProj.toml +++ b/Engine/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", glfw-beef = "*", corlib = "*"} +Dependencies = {corlib = "*", corlib = "*", glfw-beef = "*"} [Project] Name = "SteelEngine" @@ -8,6 +8,7 @@ Name = "SteelEngine" PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS", "DEBUG"] [Configs.Debug.Win64] +CLibType = "DynamicDebug" PreprocessorMacros = ["STEEL_PLATFORM_WINDOWS", "DEBUG"] [Configs.Release.Win32] diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 7a7a738..f029a08 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -127,7 +127,7 @@ namespace SteelEngine false, // Undecorated true, // Resizable false, // VSync - false, // Maximized + true, // Maximized false // Invisible ); diff --git a/Engine/src/Console/CVarUtil.bf b/Engine/src/Console/CVarUtil.bf index 7867a56..bce9536 100644 --- a/Engine/src/Console/CVarUtil.bf +++ b/Engine/src/Console/CVarUtil.bf @@ -20,6 +20,7 @@ namespace SteelEngine.Console switch (int.Parse(lowercase)) { case .Err: + didChange = false; return false; case .Ok(let val): result = val != 0; diff --git a/Engine/src/SteelPath.bf b/Engine/src/SteelPath.bf index 82f8db4..c735c53 100644 --- a/Engine/src/SteelPath.bf +++ b/Engine/src/SteelPath.bf @@ -8,6 +8,7 @@ namespace SteelEngine { public static String UserDirectory = new .() ~ delete _; public static String ContentDirectory = new .() ~ delete _; + public static String EngineInstallationPath = new .() ~ delete _; public static this() { @@ -18,20 +19,29 @@ namespace SteelEngine Path.InternalCombine(UserDirectory, envVars["APPDATA"], "Steel"); DeleteDictionaryAndKeysAndItems!(envVars); + +#if DEBUG + Directory.GetCurrentDirectory(EngineInstallationPath); +#else + var executablePath = scope String(); + Environment.GetExecutableFilePath(executablePath); + Path.GetDirectoryPath(executablePath, EngineInstallationPath); +#endif } public static void SetContentDirectory() { - ContentDirectory.Clear(); + /*ContentDirectory.Clear(); #if DEBUG Directory.GetCurrentDirectory(ContentDirectory); #else var executablePath = scope String(); Environment.GetExecutableFilePath(executablePath); - if (Path.GetDirectoryPath(executablePath, ContentDirectory) case .Err) - Log.Fatal("Invalid executable path: '{}'", executablePath); + Path.GetDirectoryPath(executablePath, ContentDirectory); #endif + + Log.Trace("Content Directory: {}", ContentDirectory);*/ } public static void GetUserPath(String target, params String[] components) diff --git a/Examples/EditorDemo/Content/File1.txt b/Examples/EditorDemo/Content/File1.txt index e69de29..d2bb323 100644 --- a/Examples/EditorDemo/Content/File1.txt +++ b/Examples/EditorDemo/Content/File1.txt @@ -0,0 +1 @@ +YES \ No newline at end of file diff --git a/Examples/EditorDemo/Content/File2.txt b/Examples/EditorDemo/Content/File2.txt index e69de29..ba28208 100644 --- a/Examples/EditorDemo/Content/File2.txt +++ b/Examples/EditorDemo/Content/File2.txt @@ -0,0 +1 @@ +NO \ No newline at end of file diff --git a/Examples/EditorDemo/Content/SubFolder/File3.txt b/Examples/EditorDemo/Content/SubFolder/File3.txt index e69de29..d5219d4 100644 --- a/Examples/EditorDemo/Content/SubFolder/File3.txt +++ b/Examples/EditorDemo/Content/SubFolder/File3.txt @@ -0,0 +1 @@ +MAYBE \ No newline at end of file From 30b449a37c6b35fae3ae30a08c274104b1014f8f Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Wed, 7 Oct 2020 23:09:53 +0200 Subject: [PATCH 26/50] Removed ImGui --- .gitmodules | 3 --- Libs/ImGui | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 2dc95de..d7cd2fc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "ImGui"] - path = Libs/ImGui - url = https://github.com/RogueMacro/imgui-beef [submodule "GLFW"] path = Libs/GLFW url = https://github.com/MineGame159/glfw-beef diff --git a/Libs/ImGui b/Libs/ImGui index cdc410f..ef2019a 160000 --- a/Libs/ImGui +++ b/Libs/ImGui @@ -1 +1 @@ -Subproject commit cdc410faf55b854d84fe6cb50a856f9f65190acc +Subproject commit ef2019a36ad3b889267e00d67d188b42ad37c9b7 From 4144c1b3b25fcea4dd74e3a29f1fa6252b76f181 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Wed, 7 Oct 2020 23:15:54 +0200 Subject: [PATCH 27/50] Removed again --- Libs/ImGui | 1 - 1 file changed, 1 deletion(-) delete mode 160000 Libs/ImGui diff --git a/Libs/ImGui b/Libs/ImGui deleted file mode 160000 index ef2019a..0000000 --- a/Libs/ImGui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ef2019a36ad3b889267e00d67d188b42ad37c9b7 From f572fe234a8fc6ea5fff50a5346bf7ab47e1a9fe Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Wed, 7 Oct 2020 23:16:44 +0200 Subject: [PATCH 28/50] Added ImGui --- .gitmodules | 3 +++ Libs/ImGui | 1 + 2 files changed, 4 insertions(+) create mode 160000 Libs/ImGui diff --git a/.gitmodules b/.gitmodules index d7cd2fc..7fcc68a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "Beef-Extensions-Lib"] path = Libs/Beef-Extensions-Lib url = https://github.com/Jonathan-Racaud/Beef-Extensions-Lib +[submodule "ImGui"] + path = Libs/ImGui + url = https://github.com/RogueMacro/imgui-beef diff --git a/Libs/ImGui b/Libs/ImGui new file mode 160000 index 0000000..ef2019a --- /dev/null +++ b/Libs/ImGui @@ -0,0 +1 @@ +Subproject commit ef2019a36ad3b889267e00d67d188b42ad37c9b7 From 5327ea0369ccbeb4317c703f78f5892f82e5bda4 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Wed, 7 Oct 2020 23:17:55 +0200 Subject: [PATCH 29/50] Fixed Debug window showing in Editor --- BeefSpace.toml | 4 ++-- Editor/BeefProj.toml | 2 +- Editor/src/EditorGUI.bf | 8 +------- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/BeefSpace.toml b/BeefSpace.toml index 26edcf0..3895f8e 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,6 +1,6 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}, imgui-beef = {Path = "../imgui-beef/ImGui"}, ImGui = {Path = "Libs/ImGui/ImGui"}, ImGuiImplGlfw = {Path = "Libs/ImGui/ImGuiImplGlfw"}, ImGuiImplOpenGL3 = {Path = "Libs/ImGui/ImGuiImplOpenGL3"}} -Locked = ["glfw-beef", "BeefExtensionsLib", "JSON_Beef", "ImGui", "ImGuiImplGlfw", "ImGuiImplOpenGL3"] +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}, ImGuiImplGlfw = {Path = "Libs/ImGui/ImGuiImplGlfw"}, ImGuiImplOpenGL3 = {Path = "Libs/ImGui/ImGuiImplOpenGL3"}, glfw-beef = {Path = "Libs/GLFW"}, ImGui = {Path = "Libs/ImGui/ImGui"}} +Locked = ["BeefExtensionsLib", "JSON_Beef", "ImGuiImplGlfw", "ImGuiImplOpenGL3", "glfw-beef", "ImGui"] [Workspace] StartupProject = "SteelEditor" diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index 41f4e9b..58fb6bf 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", SteelEngine = "*", BeefExtensionsLib = "*", JSON_Beef = "*", ImGui = "*", ImGuiImplGlfw = "*", ImGuiImplOpenGL3 = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", BeefExtensionsLib = "*", JSON_Beef = "*", ImGuiImplGlfw = "*", ImGuiImplOpenGL3 = "*", ImGui = "*"} [Project] Name = "SteelEditor" diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 672b1a9..7c56bfc 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -12,7 +12,6 @@ namespace SteelEditor private static InputCallback _inputCallback = .(.None); private static Dictionary _inputTextBuffers = new .() ~ DeleteDictionaryAndKeysAndItems!(_); - private static bool _isWindow = false; private static bool _popItemWidth = false; private static bool _popItemColor = false; private static bool _popItemID = false; @@ -25,15 +24,13 @@ namespace SteelEditor public static bool BeginWindow(StringView name, ref bool isActive) { - _isWindow = isActive; return ImGui.Begin(name.Ptr, &isActive, .NoScrollbar); } public static void EndWindow() { - _isWindow = false; - ImGui.End(); RemoveColumns(); + ImGui.End(); } // Text @@ -440,9 +437,6 @@ namespace SteelEditor private static void CheckItem(bool nextColumn = true) { - if (!_isWindow) - Log.Error("CheckItem() called without a window!"); - if (_popItemWidth) { ImGui.PopItemWidth(); From 3c80fab02d381b107e728265bdaba1506626d50f Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 19 Oct 2020 14:14:30 +0200 Subject: [PATCH 30/50] File View in Inspector --- Editor/src/EditorGUI.bf | 28 +++++++++++++++++++++++++++ Editor/src/Windows/InspectorWindow.bf | 11 +++++++++-- Examples/EditorDemo/Content/File1.txt | 2 +- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 7c56bfc..7605b74 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -18,6 +18,7 @@ namespace SteelEditor private static bool _useColumns = true; private static bool _visibleSeparator = false; + private static uint _popItemFlag = 0; private static uint _collapsableHeaderCount = 0; // Window @@ -427,6 +428,12 @@ namespace SteelEditor _visibleSeparator = false; } + public static void DisableItem() + { + _popItemFlag++; + ImGui.PushItemFlag(.Disabled, true); + } + // Other public static void ItemID(StringView id) @@ -455,10 +462,31 @@ namespace SteelEditor _popItemID = false; } + if (_popItemFlag > 0) + { + ImGui.PopItemFlag(); + _popItemFlag--; + } + if (nextColumn && _useColumns) ImGui.NextColumn(); } + public static Vector2 GetWindowSize() + { + return .(ImGui.GetContentRegionAvail().x, ImGui.GetContentRegionAvail().y); + } + + public static float GetWindowWidth() + { + return ImGui.GetContentRegionAvail().x; + } + + public static float GetWindowHeight() + { + return ImGui.GetContentRegionAvail().y; + } + private class UniqueLabel { public String ID ~ delete _; diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index 75e007d..e135574 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -132,8 +132,15 @@ namespace SteelEditor.Windows private void ShowFileView() { - EditorGUI.Text(_filePath); - EditorGUI.InputMultiline("##FileView", _fileBuffer, 1024, true); + EditorGUI.ItemWidth(EditorGUI.GetWindowWidth() - 23); + EditorGUI.Input("##FilePath", _filePath, "", 256, true); + + EditorGUI.SameLine(); + if (EditorGUI.Button("R")) + ViewFile(_filePath); + + EditorGUI.DisableItem(); + EditorGUI.InputMultiline("##FileView", _fileBuffer, 1024, true, EditorGUI.GetWindowSize()); } private void ShowAddComponentPopup() diff --git a/Examples/EditorDemo/Content/File1.txt b/Examples/EditorDemo/Content/File1.txt index d2bb323..1e1de9f 100644 --- a/Examples/EditorDemo/Content/File1.txt +++ b/Examples/EditorDemo/Content/File1.txt @@ -1 +1 @@ -YES \ No newline at end of file +FILE 1 \ No newline at end of file From 89363b1a0a44e4161a082cda9c99f2668c6b87a1 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 14:11:39 +0100 Subject: [PATCH 31/50] Fixed Pop/Remove Layer Memory leak --- Engine/src/LayerStack.bf | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Engine/src/LayerStack.bf b/Engine/src/LayerStack.bf index 4a87772..1df2e15 100644 --- a/Engine/src/LayerStack.bf +++ b/Engine/src/LayerStack.bf @@ -58,7 +58,7 @@ namespace SteelEngine { if (_layers[i].[Friend]_debugName == debugName) { - _layers.GetAndRemove(_layers[i]).Get().OnDetach(); + RemoveAt(i); _layerInsert--; break; } @@ -71,7 +71,7 @@ namespace SteelEngine { if (_layers[i].[Friend]_debugName == debugName) { - _layers.GetAndRemove(_layers[i]).Get().OnDetach(); + RemoveAt(i); break; } } @@ -83,7 +83,8 @@ namespace SteelEngine { if (typeof(T) == _layers[i].GetType()) { - _layers.GetAndRemove(_layers[i]).Get().OnDetach(); + RemoveAt(i); + _layerInsert--; return; } } @@ -95,7 +96,7 @@ namespace SteelEngine { if (typeof(T) == _layers[i].GetType()) { - _layers.GetAndRemove(_layers[i]).Get().OnDetach(); + RemoveAt(i); break; } } @@ -107,7 +108,8 @@ namespace SteelEngine { if (_layers[i] == layer) { - _layers.GetAndRemove(_layers[i]).Get().OnDetach(); + RemoveAt(i); + _layerInsert--; return; } } @@ -119,12 +121,19 @@ namespace SteelEngine { if (_layers[i] == layer) { - _layers.GetAndRemove(_layers[i]).Get().OnDetach(); + RemoveAt(i); return; } } } + private void RemoveAt(int index) + { + var layer = _layers.GetAndRemove(_layers[index]).Get(); + layer.OnDetach(); + delete layer; + } + public List.Enumerator GetEnumerator() { return _layers.GetEnumerator(); From f028204c12d874ebc2422edbb66e7449a3cac171 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 14:20:12 +0100 Subject: [PATCH 32/50] Inspector Add Component rework --- Editor/src/Editor.bf | 15 ++++++++------- Editor/src/EditorLayer.bf | 2 +- Editor/src/Windows/InspectorWindow.bf | 11 +++++------ Editor/src/Windows/PropertiesWindow.bf | 9 +-------- 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index bb038cd..7245b79 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -28,12 +28,13 @@ namespace SteelEditor _editorLayer = new .(Window); PushOverlay(_editorLayer); - Registerindow(); - Registerindow(); - Registerindow(); - Registerindow(); - Registerindow(); - Registerindow(); + RegisterWindow(); + RegisterWindow(); + RegisterWindow(); + RegisterWindow(); + RegisterWindow(); + RegisterWindow(); + RegisterWindow(); LoadConfig(); LoadCache(); @@ -282,7 +283,7 @@ namespace SteelEditor GetInstance()._editorLayer.RegisterWindow(window); } - public static void Registerindow() where T : EditorWindow + public static void RegisterWindow() where T : EditorWindow { GetInstance()._editorLayer.RegisterWindow(); } diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index b927063..c2714cb 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -48,7 +48,7 @@ namespace SteelEditor ImGuiImplGlfw.InitForOpenGL(_window.GetHandle, true); ImGuiImplOpenGL3.Init(); - Editor.Registerindow(); + Editor.RegisterWindow(); } public override void OnDetach() diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index e135574..f768879 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -124,10 +124,9 @@ namespace SteelEditor.Windows EditorGUI.NewLine(); EditorGUI.AlignMiddle(130); if (EditorGUI.Button("Add Component", .(130, 20))) - _showAddComponentPopup = true; + ImGui.OpenPopup("Add Component"); - if (_showAddComponentPopup) - ShowAddComponentPopup(); + ShowAddComponentPopup(); } private void ShowFileView() @@ -147,7 +146,7 @@ namespace SteelEditor.Windows { Type componentType = null; - if (EditorGUI.BeginWindow("Add Component", ref _showAddComponentPopup)) + if (ImGui.BeginPopup("Add Component")) { for (var type in Type.Types) { @@ -158,7 +157,7 @@ namespace SteelEditor.Windows if (typeName == "BaseComponent" || typeName == "BehaviourComponent") continue; - if (EditorGUI.Selectable(typeName)) + if (ImGui.MenuItem(typeName)) { componentType = type; _showAddComponentPopup = false; @@ -167,7 +166,7 @@ namespace SteelEditor.Windows } } - EditorGUI.EndWindow(); + ImGui.EndPopup(); } if (componentType != null) diff --git a/Editor/src/Windows/PropertiesWindow.bf b/Editor/src/Windows/PropertiesWindow.bf index 3232df6..e5c22dc 100644 --- a/Editor/src/Windows/PropertiesWindow.bf +++ b/Editor/src/Windows/PropertiesWindow.bf @@ -5,13 +5,6 @@ namespace SteelEditor.Windows { public class PropertiesWindow : EditorWindow { - private String _title = new .() ~ delete _; - public override StringView Title => _title; - - public override void OnShow() - { - _title.Clear(); - _title.AppendF("Properties - {}", Application.GetInstance().CurrentProject.Name); - } + public override StringView Title => "Properties"; } } From baba23653dfc340214fad7d6f5d6cf5b2964703c Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 14:20:33 +0100 Subject: [PATCH 33/50] Hierarchy features --- Editor/src/Windows/HierarchyWindow.bf | 33 +++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Editor/src/Windows/HierarchyWindow.bf b/Editor/src/Windows/HierarchyWindow.bf index 3f28fca..b49221f 100644 --- a/Editor/src/Windows/HierarchyWindow.bf +++ b/Editor/src/Windows/HierarchyWindow.bf @@ -1,6 +1,7 @@ using System; using SteelEngine; using SteelEngine.ECS; +using ImGui; namespace SteelEditor.Windows { @@ -26,6 +27,38 @@ namespace SteelEditor.Windows InspectorWindow.SetCurrentEntity(entity); _currentEntity = entity; } + + if (ImGui.BeginPopupContextItem()) + { + ShowEntityPopupMenu(); + ImGui.EndPopup(); + } + } + + if (ImGui.BeginPopupContextWindow()) + { + ShowHierarchyPopupMenu(); + ImGui.EndPopup(); + } + } + + private void ShowHierarchyPopupMenu() + { + if (ImGui.BeginMenu("Create")) + { + if (ImGui.MenuItem("Empty Entity")) + Application.Instance.CreateEntity(); + + ImGui.EndMenu(); + } + } + + private void ShowEntityPopupMenu() + { + if (ImGui.MenuItem("Delete")) + { + InspectorWindow.SetCurrentEntity(null); + delete _currentEntity; } } } From d211e2c2d2224bfe2072d3689b5ea2d52a7c28a0 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 14:23:14 +0100 Subject: [PATCH 34/50] Moved usable util methods from Editor to Engine --- Editor/src/Util.bf | 131 --------------------------------------------- 1 file changed, 131 deletions(-) diff --git a/Editor/src/Util.bf b/Editor/src/Util.bf index 2d700f7..054aeb8 100644 --- a/Editor/src/Util.bf +++ b/Editor/src/Util.bf @@ -1,136 +1,5 @@ -using System.Collections; using ImGui; -namespace System -{ - extension Type - { - public void GetShortName(String buffer) - { - var fullName = scope String(); - GetFullName(fullName); - var parts = scope List(fullName.Split('.')); - buffer.Append(parts.Back); - } - } - - extension String - { - public void MakeSerializable() - { - Replace("\\", "\\\\"); - } - } -} - -namespace System.Reflection -{ - extension FieldInfo - { - public void GetName(String buffer) - { - buffer.Append(GetName()); - } - - public StringView GetName() - { - if (Name.StartsWith("prop__")) - return .(Name, 6); - else - return Name; - } - } -} - -namespace System.IO -{ - extension Directory - { - public static void Copy(StringView from, StringView to) - { - if (!Directory.Exists(from)) - { - SteelEngine.Log.Error("Tried to copy non-existing directory: {}", from); - return; - } - - if (!Directory.Exists(to)) - Directory.CreateDirectory(to); - - var toStr = new String(to); - - var filePath = new String(); - var fileName = new String(); - var newFilePath = new String(); - for (var file in Directory.EnumerateFiles(from)) - { - file.GetFilePath(filePath); - file.GetFileName(fileName); - - Path.InternalCombine(newFilePath, toStr, fileName); - - File.Copy(filePath, newFilePath); - - filePath.Clear(); - fileName.Clear(); - newFilePath.Clear(); - } - - delete filePath; - delete fileName; - delete newFilePath; - - var dirPath = new String(); - var dirName = new String(); - var newDirPath = new String(); - - for (var directory in Directory.EnumerateDirectories(from)) - { - directory.GetFilePath(dirPath); - directory.GetFileName(dirName); - Path.InternalCombine(newDirPath, toStr, dirName); - - Copy(dirPath, newDirPath); - - dirPath.Clear(); - dirName.Clear(); - newDirPath.Clear(); - } - - delete dirPath; - delete dirName; - delete newDirPath; - delete toStr; - } - - public static List GetFilesRecursively(StringView path) - { - var fileList = new List(); - GetFilesRecursively(scope String(path), fileList); - return fileList; - } - - private static void GetFilesRecursively(String path, List fileList) - { - for (var file in Directory.EnumerateFiles(path)) - { - var filePath = new String(); - file.GetFilePath(filePath); - fileList.Add(filePath); - } - - var dirs = Directory.EnumerateDirectories(path); - path.Clear(); - for (var dir in dirs) - { - dir.GetFilePath(path); - GetFilesRecursively(path, fileList); - path.Clear(); - } - } - } -} - namespace SteelEngine { extension Color From 1182f56a4ff0ed264b7aba54c4bf3ddad9afed04 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 14:41:33 +0100 Subject: [PATCH 35/50] Code refactoring --- Editor/src/Editor.bf | 3 --- Editor/src/EditorLayer.bf | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 7245b79..8fff8e7 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -512,9 +512,6 @@ namespace SteelEditor if (!char.IsWhiteSpace) break; - if (key == "Colors") - NOP!(); - var value = ParseValue(ref lineEnumerator); if (value != null) config[key] = value; diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index c2714cb..af02df9 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -101,8 +101,12 @@ namespace SteelEditor if (io.ConfigFlags.HasFlag(.ViewportsEnable)) { GlfwWindow* glfwContextBackup = Glfw.GetCurrentContext(); +#if BF_PLATFORM_WINDOWS ImGui.UpdatePlatformWindows(); ImGui.RenderPlatformWindowsDefault(); +#else + #error Only windows is supported for ImGui +#endif Glfw.MakeContextCurrent(glfwContextBackup); } } From 2fb489567d364fbb85af49c56876035f95dfba58 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 14:42:53 +0100 Subject: [PATCH 36/50] More refactoring --- Editor/src/EditorProject.bf | 1 + Editor/src/Windows/InspectorWindow.bf | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Editor/src/EditorProject.bf b/Editor/src/EditorProject.bf index 6d53c47..40b710e 100644 --- a/Editor/src/EditorProject.bf +++ b/Editor/src/EditorProject.bf @@ -24,6 +24,7 @@ namespace SteelEditor Entities = new .(); } + [NoDiscard] public static Self UntitledProject() { return new .("Untitled", ""); diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index f768879..f0a8b9b 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -18,8 +18,8 @@ namespace SteelEditor.Windows private bool _showAddComponentPopup = false; private bool _isFileView = false; - private String _filePath = null ~ if (_ != null) delete _; - private String _fileBuffer = null ~ if (_ != null) delete _; + private String _filePath = null ~ delete _; + private String _fileBuffer = null ~ delete _; public static void SetCurrentEntity(Entity entity) { From 3e0daf1848ba6560921b9b42885ee46afbcdddaf Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 14:47:45 +0100 Subject: [PATCH 37/50] Fixed SerializableEntity memory leak when saving --- Editor/src/Editor.bf | 2 +- Editor/src/Windows/InspectorWindow.bf | 2 +- Engine/src/Application.bf | 14 --- Engine/src/Util.bf | 131 ++++++++++++++++++++++++++ Examples/EditorDemo/SteelProj.json | 8 +- 5 files changed, 134 insertions(+), 23 deletions(-) create mode 100644 Engine/src/Util.bf diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 8fff8e7..15d24ff 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -178,7 +178,7 @@ namespace SteelEditor var editor = GetInstance(); - editor.CurrentProject.Entities.Clear(); + DeleteAndClearItems!(editor.CurrentProject.Entities); for (var entity in Entity.EntityStore.Values) { var entityName = scope String(); diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index f0a8b9b..35f19f4 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -298,7 +298,7 @@ namespace SteelEditor.Windows variant = field.GetValue(component).Get(); field.SetValue(component, (uint32) EditorGUI.Int(fieldName, variant.Get())); case typeof(uint64): - variant = field.GetValueReference(component).Get(); + variant = field.GetValue(component).Get(); field.SetValue(component, (uint64) EditorGUI.Int(fieldName, (int) variant.Get())); default: return; diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index f029a08..688af0a 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -239,20 +239,6 @@ namespace SteelEngine return (T) Instance; } - struct PosColorVertex - { - public this(float x, float y, float z, uint32 abgr) - { - this.x = x; - this.y = y; - this.z = z; - this.abgr = abgr; - } - - float x, y, z; - uint32 abgr; - } - private void Draw() { for (let system in _systems) diff --git a/Engine/src/Util.bf b/Engine/src/Util.bf new file mode 100644 index 0000000..4992f8e --- /dev/null +++ b/Engine/src/Util.bf @@ -0,0 +1,131 @@ +using System.Collections; + +namespace System +{ + extension Type + { + public void GetShortName(String buffer) + { + var fullName = scope String(); + GetFullName(fullName); + var parts = scope List(fullName.Split('.')); + buffer.Append(parts.Back); + } + } + + extension String + { + public void MakeSerializable() + { + Replace("\\", "\\\\"); + } + } +} + +namespace System.Reflection +{ + extension FieldInfo + { + public void GetName(String buffer) + { + buffer.Append(GetName()); + } + + public StringView GetName() + { + if (Name.StartsWith("prop__")) + return .(Name, 6); + else + return Name; + } + } +} + +namespace System.IO +{ + extension Directory + { + public static void Copy(StringView from, StringView to) + { + if (!Directory.Exists(from)) + { + SteelEngine.Log.Error("Tried to copy non-existing directory: {}", from); + return; + } + + if (!Directory.Exists(to)) + Directory.CreateDirectory(to); + + var toStr = new String(to); + + var filePath = new String(); + var fileName = new String(); + var newFilePath = new String(); + for (var file in Directory.EnumerateFiles(from)) + { + file.GetFilePath(filePath); + file.GetFileName(fileName); + + Path.InternalCombine(newFilePath, toStr, fileName); + + File.Copy(filePath, newFilePath); + + filePath.Clear(); + fileName.Clear(); + newFilePath.Clear(); + } + + delete filePath; + delete fileName; + delete newFilePath; + + var dirPath = new String(); + var dirName = new String(); + var newDirPath = new String(); + + for (var directory in Directory.EnumerateDirectories(from)) + { + directory.GetFilePath(dirPath); + directory.GetFileName(dirName); + Path.InternalCombine(newDirPath, toStr, dirName); + + Copy(dirPath, newDirPath); + + dirPath.Clear(); + dirName.Clear(); + newDirPath.Clear(); + } + + delete dirPath; + delete dirName; + delete newDirPath; + delete toStr; + } + + public static List GetFilesRecursively(StringView path) + { + var fileList = new List(); + GetFilesRecursively(scope String(path), fileList); + return fileList; + } + + private static void GetFilesRecursively(String path, List fileList) + { + for (var file in Directory.EnumerateFiles(path)) + { + var filePath = new String(); + file.GetFilePath(filePath); + fileList.Add(filePath); + } + + var dirs = Directory.EnumerateDirectories(path); + path.Clear(); + for (var dir in dirs) + { + dir.GetFilePath(path); + GetFilesRecursively(path, fileList); + path.Clear(); + } + } + } +} \ No newline at end of file diff --git a/Examples/EditorDemo/SteelProj.json b/Examples/EditorDemo/SteelProj.json index a78345a..94102cd 100644 --- a/Examples/EditorDemo/SteelProj.json +++ b/Examples/EditorDemo/SteelProj.json @@ -1,7 +1 @@ -{ - "Name": "EditorDemo", - "Entities": [ - { "Name": "Entity1", "IsEnabled": true }, - { "Name": "Entity2", "IsEnabled": false } - ] -} +{"Name":"EditorDemo","Entities":[{"Name":"Entity1","IsEnabled":true},{"Name":"Entity2","IsEnabled":false}]} \ No newline at end of file From 9a1483d1b89eaa3200bc7b02a4e91c557d83a1fa Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 15:15:16 +0100 Subject: [PATCH 38/50] Fixed crash when cache is empty --- Editor/src/Editor.bf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 15d24ff..af5ba8a 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -249,6 +249,9 @@ namespace SteelEditor return; } + if (json.IsEmpty) + return; + var editor = GetInstance(); if (editor._cache != null) From 55ec3596d38291922fab7907d6ff536bff99aad9 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 15:16:07 +0100 Subject: [PATCH 39/50] Removed open windows from cache (Not needed with docking enabled) --- Editor/src/Serialization/EditorCache.bf | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/Editor/src/Serialization/EditorCache.bf b/Editor/src/Serialization/EditorCache.bf index 9b1af2d..ab92e13 100644 --- a/Editor/src/Serialization/EditorCache.bf +++ b/Editor/src/Serialization/EditorCache.bf @@ -12,7 +12,7 @@ namespace SteelEditor.Serialization private int MaxRecentProjects = 5; public List RecentProjects = null; - public List Windows = null; + [IgnoreSerialize] // Temporary until structs can be serialized public ImGui.Style Style; @@ -22,28 +22,16 @@ namespace SteelEditor.Serialization return; RecentProjects = new .(); - Windows = new .(); } public ~this() { if (RecentProjects != null) DeleteContainerAndItems!(RecentProjects); - - if (Windows != null) - DeleteContainerAndItems!(Windows); } public void Update(Editor editor) { - DeleteAndClearItems!(Windows); - - for (var window in editor._editorLayer.[Friend]_editorWindows) - { - if (window.IsActive) - Windows.Add(new String(window.Title)); - } - Style = ImGui.GetStyle(); } @@ -64,9 +52,6 @@ namespace SteelEditor.Serialization if (RecentProjects == null) RecentProjects = new .(); - if (Windows == null) - Windows = new .(); - for (var path in RecentProjects) path.MakeSerializable(); } From 949942d2718fa37b1b7b527aa5f4f0518a74cbe1 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 16:18:43 +0100 Subject: [PATCH 40/50] Switched from Open Folder to Open File when opening project --- Editor/src/Editor.bf | 11 +++++------ Editor/src/EditorLayer.bf | 6 ++++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index af5ba8a..2ce257e 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -101,10 +101,7 @@ namespace SteelEditor { GameConsole.Instance.Clear(); - var filePath = scope String(); - Path.InternalCombine(filePath, scope String(path), "SteelProj.json"); - - if (!File.Exists(filePath)) + if (!File.Exists(path)) { Log.Error("Could not open project ({}): Not a Steel project", path); return; @@ -113,7 +110,7 @@ namespace SteelEditor var json = new String(); defer delete json; - if (File.ReadAllText(filePath, json) case .Err(let err)) + if (File.ReadAllText(path, json) case .Err(let err)) { Log.Error("Could not open project ({}): {}", path, err); return; @@ -136,7 +133,9 @@ namespace SteelEditor for (var serializableEntity in editor.CurrentProject.Entities) serializableEntity.MakeEntity(); - editor.CurrentProject.Path = new .(path); + var dirPath = new String(); + Path.GetDirectoryPath(path, dirPath); + editor.CurrentProject.Path = dirPath; UpdateTitle(); editor._cache.AddRecentProject(path); diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index af02df9..3fa4403 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -232,11 +232,13 @@ namespace SteelEditor private void OpenProject() { - var dialog = scope FolderBrowserDialog(); + var dialog = scope OpenFileDialog(); + dialog.SetFilter("Steel Project (SteelProj.json)|SteelProj.json"); + if (dialog.ShowDialog() case .Ok(let val)) { if (val == .OK) - Editor.OpenProject(dialog.SelectedPath); + Editor.OpenProject(dialog.FileNames[0]); } else { From f2049c601dc7f8c1e7353d2da6fb7bf2ac843761 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 16:29:48 +0100 Subject: [PATCH 41/50] Fixed Recent project showing file instead of folder --- Editor/src/Editor.bf | 16 +++++++++++----- Editor/src/EditorLayer.bf | 3 +++ Editor/src/Serialization/EditorCache.bf | 10 +++++----- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 2ce257e..b3aea30 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -103,7 +103,7 @@ namespace SteelEditor if (!File.Exists(path)) { - Log.Error("Could not open project ({}): Not a Steel project", path); + Log.Error("Could not open project ({}): File deleted", path); return; } @@ -138,7 +138,7 @@ namespace SteelEditor editor.CurrentProject.Path = dirPath; UpdateTitle(); - editor._cache.AddRecentProject(path); + editor._cache.AddRecentProject(dirPath); InspectorWindow.SetCurrentEntity(null); SteelPath.SetContentDirectory(); @@ -212,7 +212,7 @@ namespace SteelEditor Log.Trace("Saving cache"); var editor = GetInstance(); - editor._cache.Update(editor); + editor._cache.Update(); editor._cache.MakeSerializable(); var result = JSONSerializer.Serialize(editor._cache); @@ -253,8 +253,7 @@ namespace SteelEditor var editor = GetInstance(); - if (editor._cache != null) - delete editor._cache; + delete editor._cache; editor._cache = new .(); if (JSONDeserializer.Deserialize(json, editor._cache) case .Err(let err)) @@ -265,6 +264,13 @@ namespace SteelEditor } } + public static void ClearCache() + { + var editor = GetInstance(); + delete editor._cache; + editor._cache = new .(true); + } + public static T GetWindow() where T : EditorWindow { return GetInstance()._editorLayer.GetWindow(); diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 3fa4403..75fb8b2 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -194,6 +194,9 @@ namespace SteelEditor { if (ImGui.BeginMenu("Edit")) { + if (ImGui.MenuItem("Clear Cache")) + Editor.ClearCache(); + ImGui.EndMenu(); } } diff --git a/Editor/src/Serialization/EditorCache.bf b/Editor/src/Serialization/EditorCache.bf index ab92e13..c61c142 100644 --- a/Editor/src/Serialization/EditorCache.bf +++ b/Editor/src/Serialization/EditorCache.bf @@ -9,16 +9,16 @@ namespace SteelEditor.Serialization public class EditorCache { [IgnoreSerialize] - private int MaxRecentProjects = 5; + private const int MAX_RECENT_PROJECTS = 5; public List RecentProjects = null; [IgnoreSerialize] // Temporary until structs can be serialized public ImGui.Style Style; - public this(bool initDefault = false) + public this(bool init = false) { - if (!initDefault) + if (!init) return; RecentProjects = new .(); @@ -30,14 +30,14 @@ namespace SteelEditor.Serialization DeleteContainerAndItems!(RecentProjects); } - public void Update(Editor editor) + public void Update() { Style = ImGui.GetStyle(); } public void AddRecentProject(StringView path) { - if (RecentProjects.Count >= MaxRecentProjects) + if (RecentProjects.Count >= MAX_RECENT_PROJECTS) RecentProjects.PopFront(); var pathString = new String(path); From 59586d67276bd9683a405ce7613f820f896a3c99 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 16:33:46 +0100 Subject: [PATCH 42/50] Fixed bug when opening recent/new project --- Editor/src/EditorLayer.bf | 6 +++++- Editor/src/Windows/NewProjectWindow.bf | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 75fb8b2..1c98d1c 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -186,7 +186,11 @@ namespace SteelEditor for (var projectPath in cache.RecentProjects) { if (ImGui.MenuItem(projectPath)) - Editor.OpenProject(projectPath); + { + var projectFilePath = scope String(); + Path.InternalCombine(projectFilePath, projectPath, "SteelProj.json"); + Editor.OpenProject(projectFilePath); + } } } diff --git a/Editor/src/Windows/NewProjectWindow.bf b/Editor/src/Windows/NewProjectWindow.bf index 99f7e4c..baab579 100644 --- a/Editor/src/Windows/NewProjectWindow.bf +++ b/Editor/src/Windows/NewProjectWindow.bf @@ -73,8 +73,9 @@ namespace SteelEditor.Windows SteelPath.GetEditorSamplePath(samplePath, "NewProject"); Directory.Copy(samplePath, _projectPath); - ReplaceMacros(scope String(_projectPath)); - Editor.OpenProject(_projectPath); + var projectPath = scope String(); + Path.InternalCombine(projectPath, _projectPath, "SteelProj.json"); + Editor.OpenProject(projectPath); } private void ReplaceMacros(String path) From 6626fdc0e0731cec8c22172ecee983a0483a0f55 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 21:48:49 +0100 Subject: [PATCH 43/50] Inspector can now show ints, floats and strings --- Editor/src/Windows/InspectorWindow.bf | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index 35f19f4..1fb4f72 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -220,7 +220,7 @@ namespace SteelEditor.Windows { if (field.FieldType.IsInteger) { - //RenderInt(field, component); + RenderInt(field, object); continue; } @@ -235,6 +235,14 @@ namespace SteelEditor.Windows case typeof(bool): RenderField(=> EditorGUI.Checkbox, field, object); break; + case typeof(float): + RenderField(=> EditorGUI.Float, field, object); + break; + case typeof(String): + var variant = field.GetValue(object).Get(); + EditorGUI.Input(field.GetName(), variant.Get()); + variant.Dispose(); + break; case typeof(Entity): var variant = field.GetValue(object).Get(); RenderValue(field.GetName(), variant.Get()); @@ -257,12 +265,14 @@ namespace SteelEditor.Windows private void RenderField(function T(StringView label, T value) callback, FieldInfo field, Object component) { + if (field.GetName() == "Scale") + NOP!(); var variant = field.GetValue(component).Get(); field.SetValue(component, callback(field.GetName(), variant.Get())); variant.Dispose(); } - private void RenderInt(FieldInfo field, BaseComponent component) + private void RenderInt(FieldInfo field, Object component) { var fieldName = field.GetName(); Variant variant = ?; From ef5acc93805fda2741499d22dacf9ee507d0942c Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Mon, 26 Oct 2020 21:56:09 +0100 Subject: [PATCH 44/50] Fixed properties in inspector not resizing with column --- Editor/src/EditorGUI.bf | 4 ++-- Editor/src/Windows/InspectorWindow.bf | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 7605b74..3f7c910 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -49,7 +49,7 @@ namespace SteelEditor return isSelected; } - public static bool Label(StringView label, bool newLine = false) + public static bool Label(StringView label, bool sameLine = false) { if (label.StartsWith("##")) return false; @@ -61,7 +61,7 @@ namespace SteelEditor Text(label); CheckItem(false); - if (!newLine) + if (sameLine) SameLine(); FillWidth(); diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/Windows/InspectorWindow.bf index 1fb4f72..6977b83 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/Windows/InspectorWindow.bf @@ -214,8 +214,6 @@ namespace SteelEditor.Windows private void RenderFields(List fields, Object object) { - ImGui.Columns(2); - for (var field in fields) { if (field.FieldType.IsInteger) @@ -265,8 +263,6 @@ namespace SteelEditor.Windows private void RenderField(function T(StringView label, T value) callback, FieldInfo field, Object component) { - if (field.GetName() == "Scale") - NOP!(); var variant = field.GetValue(component).Get(); field.SetValue(component, callback(field.GetName(), variant.Get())); variant.Dispose(); From cd03e29aef0f1f23fbc26b157b178133f45cd3c8 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Tue, 27 Oct 2020 13:57:49 +0100 Subject: [PATCH 45/50] LayerStack better memory management --- Editor/src/Editor.bf | 4 +- Editor/src/EditorLayer.bf | 8 +-- Editor/src/Serialization/EditorCache.bf | 2 +- Engine/src/Application.bf | 18 +++++-- Engine/src/Layer.bf | 10 ++-- Engine/src/LayerStack.bf | 66 ++++++++++--------------- Engine/src/Util.bf | 4 +- 7 files changed, 54 insertions(+), 58 deletions(-) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index b3aea30..9090d5d 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -13,7 +13,7 @@ namespace SteelEditor { public class Editor : Application { - private EditorLayer _editorLayer; + private EditorLayer _editorLayer ~ delete _; private Dictionary _entityNames = new .(); private EditorCache _cache = new .(true) ~ delete _; @@ -26,7 +26,7 @@ namespace SteelEditor public override void OnInit() { _editorLayer = new .(Window); - PushOverlay(_editorLayer); + PushLayer(_editorLayer); RegisterWindow(); RegisterWindow(); diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 1c98d1c..2d3a642 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -23,10 +23,10 @@ namespace SteelEditor _window = window; } - public override void OnAttach() + protected override void OnAttach() { if (!ImGui.CHECKVERSION()) - Log.Fatal("There is a problem with ImGui"); + Log.Fatal("ImGui versions do not match"); ImGui.CreateContext(); @@ -51,7 +51,7 @@ namespace SteelEditor Editor.RegisterWindow(); } - public override void OnDetach() + protected override void OnDetach() { for (var editorWindow in _editorWindows) { @@ -66,7 +66,7 @@ namespace SteelEditor ImGui.DestroyContext(); } - public override void OnUpdate() + protected override void OnUpdate() { var io = ref ImGui.GetIO(); var app = Editor.Instance; diff --git a/Editor/src/Serialization/EditorCache.bf b/Editor/src/Serialization/EditorCache.bf index c61c142..27fbb7c 100644 --- a/Editor/src/Serialization/EditorCache.bf +++ b/Editor/src/Serialization/EditorCache.bf @@ -53,7 +53,7 @@ namespace SteelEditor.Serialization RecentProjects = new .(); for (var path in RecentProjects) - path.MakeSerializable(); + path.MakePath(); } } } diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 688af0a..2d6f921 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -154,7 +154,7 @@ namespace SteelEngine while (_isRunning) { for (var layer in _layerStack) - layer.OnUpdate(); + layer.[Friend]OnUpdate(); Window.Update(); @@ -179,7 +179,7 @@ namespace SteelEngine for (var layer in _layerStack) { - layer.OnEvent(event); + layer.[Friend]OnEvent(event); if (event.IsHandled) return; } @@ -189,7 +189,7 @@ namespace SteelEngine private void OnGlfwError(Glfw.Error error) { - Log.Error("(GLFW) {}", error); + Log.Error("[GLFW] {}", error); } private bool OnWindowClose(WindowCloseEvent event) @@ -217,18 +217,28 @@ namespace SteelEngine } for (var layer in _layerStack) - layer.OnUpdate(); + layer.[Friend]OnUpdate(); _gameConsole.Update(); OnUpdate(); } + public void PushLayer() where T : Layer + { + _layerStack.PushLayer(); + } + public void PushLayer(Layer layer) { _layerStack.PushLayer(layer); } + public void PushOverlay() where T : Layer + { + _layerStack.PushOverlay(); + } + public void PushOverlay(Layer layer) { _layerStack.PushOverlay(layer); diff --git a/Engine/src/Layer.bf b/Engine/src/Layer.bf index ca45c42..27da1ed 100644 --- a/Engine/src/Layer.bf +++ b/Engine/src/Layer.bf @@ -5,6 +5,8 @@ namespace SteelEngine { public class Layer { + public bool DeleteOnDetach = false; + protected String _debugName ~ delete _; public this(StringView name = "Layer") @@ -12,9 +14,9 @@ namespace SteelEngine _debugName = new String(name); } - public virtual void OnAttach() {}; - public virtual void OnDetach() {}; - public virtual void OnUpdate() {}; - public virtual void OnEvent(Event event) {}; + protected virtual void OnAttach() {}; + protected virtual void OnDetach() {}; + protected virtual void OnUpdate() {}; + protected virtual void OnEvent(Event event) {}; } } diff --git a/Engine/src/LayerStack.bf b/Engine/src/LayerStack.bf index 1df2e15..aa12617 100644 --- a/Engine/src/LayerStack.bf +++ b/Engine/src/LayerStack.bf @@ -5,51 +5,60 @@ namespace SteelEngine { public class LayerStack : IEnumerable { - public bool AutoDeleteLayers; - private List _layers = new .(); private int _layerInsert = 0; - public this(bool autoDeleteLayers = true) - { - AutoDeleteLayers = autoDeleteLayers; - } - public ~this() { - if (AutoDeleteLayers) + for (var layer in _layers) { - for (var layer in _layers) - layer.OnDetach(); + layer.[Friend]OnDetach(); - ClearAndDeleteItems(_layers); + if (layer.DeleteOnDetach) + delete layer; } delete _layers; } + public void PushLayer() where T : Layer + { + var layer = new T(); + layer.DeleteOnDetach = true; + _layers.Insert(_layerInsert++, layer); + layer.[Friend]OnAttach(); + } + + public void PushOverlay() where T : Layer + { + var overlay = new T(); + overlay.DeleteOnDetach = true; + _layers.Add(overlay); + overlay.[Friend]OnAttach(); + } + public void PushLayer(Layer layer) { _layers.Insert(_layerInsert++, layer); - layer.OnAttach(); + layer.[Friend]OnAttach(); } public void PushOverlay(Layer overlay) { _layers.Add(overlay); - overlay.OnAttach(); + overlay.[Friend]OnAttach(); } public void PopLayer() { _layerInsert--; - _layers.GetAndRemove(_layers[_layerInsert]).Get().OnDetach(); + _layers.GetAndRemove(_layers[_layerInsert]).Get().[Friend]OnDetach(); } public void PopOverlay() { if (_layers.Count > _layerInsert) - _layers.PopBack().OnDetach(); + _layers.PopBack().[Friend]OnDetach(); } public void RemoveLayer(StringView debugName) @@ -101,36 +110,11 @@ namespace SteelEngine } } } - - public void RemoveLayer(Layer layer) - { - for (int i = 0; i < _layerInsert; i++) - { - if (_layers[i] == layer) - { - RemoveAt(i); - _layerInsert--; - return; - } - } - } - - public void RemoveOverlay(Layer layer) - { - for (int i = _layerInsert; i < _layers.Count; i++) - { - if (_layers[i] == layer) - { - RemoveAt(i); - return; - } - } - } private void RemoveAt(int index) { var layer = _layers.GetAndRemove(_layers[index]).Get(); - layer.OnDetach(); + layer.[Friend]OnDetach(); delete layer; } diff --git a/Engine/src/Util.bf b/Engine/src/Util.bf index 4992f8e..3ec5bd7 100644 --- a/Engine/src/Util.bf +++ b/Engine/src/Util.bf @@ -15,9 +15,9 @@ namespace System extension String { - public void MakeSerializable() + public void MakePath() { - Replace("\\", "\\\\"); + Replace("\\", "/"); } } } From 90a96bb4738128c7cd2599ab8b1239be0e1e133e Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Tue, 27 Oct 2020 14:55:24 +0100 Subject: [PATCH 46/50] LayerStack memory management improvements --- Editor/src/Editor.bf | 4 +++- Editor/src/EditorLayer.bf | 18 ++++++++---------- Engine/src/Application.bf | 2 ++ Engine/src/LayerStack.bf | 18 +++++++++--------- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 9090d5d..c184560 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -13,7 +13,7 @@ namespace SteelEditor { public class Editor : Application { - private EditorLayer _editorLayer ~ delete _; + private EditorLayer _editorLayer; private Dictionary _entityNames = new .(); private EditorCache _cache = new .(true) ~ delete _; @@ -52,6 +52,8 @@ namespace SteelEditor for (var value in _entityNames.Values) delete value; delete _entityNames; + + delete _editorLayer; } public static void InvalidateSave() diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 2d3a642..3ad7f94 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -13,7 +13,7 @@ namespace SteelEditor public class EditorLayer : Layer { private Window _window; - private List _editorWindows = new .(); + private List _editorWindows = new .() ~ DeleteContainerAndItems!(_); private String _imguiIniPath = new .() ~ delete _; private ImGui.Style _originalStyle; @@ -23,6 +23,13 @@ namespace SteelEditor _window = window; } + public ~this() + { + ImGuiImplOpenGL3.Shutdown(); + ImGuiImplGlfw.Shutdown(); + ImGui.DestroyContext(); + } + protected override void OnAttach() { if (!ImGui.CHECKVERSION()) @@ -54,16 +61,7 @@ namespace SteelEditor protected override void OnDetach() { for (var editorWindow in _editorWindows) - { CloseWindow(editorWindow); - delete editorWindow; - } - - delete _editorWindows; - - ImGuiImplOpenGL3.Shutdown(); - ImGuiImplGlfw.Shutdown(); - ImGui.DestroyContext(); } protected override void OnUpdate() diff --git a/Engine/src/Application.bf b/Engine/src/Application.bf index 2d6f921..2840933 100644 --- a/Engine/src/Application.bf +++ b/Engine/src/Application.bf @@ -162,6 +162,8 @@ namespace SteelEngine Draw(); } + _layerStack.Clear(); + OnCleanup(); } diff --git a/Engine/src/LayerStack.bf b/Engine/src/LayerStack.bf index aa12617..f3c86ff 100644 --- a/Engine/src/LayerStack.bf +++ b/Engine/src/LayerStack.bf @@ -10,14 +10,7 @@ namespace SteelEngine public ~this() { - for (var layer in _layers) - { - layer.[Friend]OnDetach(); - - if (layer.DeleteOnDetach) - delete layer; - } - + Clear(); delete _layers; } @@ -115,7 +108,14 @@ namespace SteelEngine { var layer = _layers.GetAndRemove(_layers[index]).Get(); layer.[Friend]OnDetach(); - delete layer; + if (layer.DeleteOnDetach) + delete layer; + } + + public void Clear() + { + for (int i = _layers.Count - 1; i >= 0; i--) + RemoveAt(i); } public List.Enumerator GetEnumerator() From 8bead2f48f4968a148c17cd4ac85a602b3f81b3a Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Wed, 28 Oct 2020 22:03:30 +0100 Subject: [PATCH 47/50] Added MsgPack --- .gitmodules | 3 +++ BeefSpace.toml | 4 ++-- Libs/MsgPack | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) create mode 160000 Libs/MsgPack diff --git a/.gitmodules b/.gitmodules index 7fcc68a..b5b2a1b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "ImGui"] path = Libs/ImGui url = https://github.com/RogueMacro/imgui-beef +[submodule "MsgPack"] + path = Libs/MsgPack + url = https://github.com/NicEastvillage/MsgPackBf diff --git a/BeefSpace.toml b/BeefSpace.toml index 3895f8e..c451215 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,6 +1,6 @@ FileVersion = 1 -Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}, ImGuiImplGlfw = {Path = "Libs/ImGui/ImGuiImplGlfw"}, ImGuiImplOpenGL3 = {Path = "Libs/ImGui/ImGuiImplOpenGL3"}, glfw-beef = {Path = "Libs/GLFW"}, ImGui = {Path = "Libs/ImGui/ImGui"}} -Locked = ["BeefExtensionsLib", "JSON_Beef", "ImGuiImplGlfw", "ImGuiImplOpenGL3", "glfw-beef", "ImGui"] +Projects = {SteelEngine = {Path = "Engine"}, SteelEditor = {Path = "Editor"}, BeefExtensionsLib = {Path = "Libs/Beef-Extensions-Lib"}, JSON_Beef = {Path = "Libs/JSON_Beef/lib"}, ImGuiImplGlfw = {Path = "Libs/ImGui/ImGuiImplGlfw"}, ImGuiImplOpenGL3 = {Path = "Libs/ImGui/ImGuiImplOpenGL3"}, glfw-beef = {Path = "Libs/GLFW"}, ImGui = {Path = "Libs/ImGui/ImGui"}, MsgPackBf = {Path = "Libs/MsgPack/lib"}} +Locked = ["BeefExtensionsLib", "JSON_Beef", "ImGuiImplGlfw", "ImGuiImplOpenGL3", "glfw-beef", "ImGui", "MsgPackBf"] [Workspace] StartupProject = "SteelEditor" diff --git a/Libs/MsgPack b/Libs/MsgPack new file mode 160000 index 0000000..4c0b930 --- /dev/null +++ b/Libs/MsgPack @@ -0,0 +1 @@ +Subproject commit 4c0b930dbe0b945cf2d6468b9772f7cdf96abece From a994f6dd310f27238168232ec367ba2c04368ed5 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Thu, 29 Oct 2020 15:12:52 +0100 Subject: [PATCH 48/50] Fixed open windows cache bug --- Editor/BeefProj.toml | 2 +- Editor/src/Editor.bf | 31 +++++++++++++++++++------ Editor/src/EditorLayer.bf | 10 ++++---- Editor/src/Serialization/EditorCache.bf | 17 ++++++++++++++ 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index 58fb6bf..bdaa667 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", SteelEngine = "*", BeefExtensionsLib = "*", JSON_Beef = "*", ImGuiImplGlfw = "*", ImGuiImplOpenGL3 = "*", ImGui = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", BeefExtensionsLib = "*", JSON_Beef = "*", ImGuiImplGlfw = "*", ImGuiImplOpenGL3 = "*", ImGui = "*", MsgPackBf = "*"} [Project] Name = "SteelEditor" diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index c184560..3bceeec 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -8,6 +8,7 @@ using SteelEditor.Windows; using SteelEditor.Serialization; using ImGui; using JSON_Beef.Serialization; +using MsgPackBf; namespace SteelEditor { @@ -283,14 +284,14 @@ namespace SteelEditor GetInstance()._editorLayer.ShowWindow(); } - public static void RegisterWindow(StringView windowName) + public static void ShowWindow(StringView windowName) { - GetInstance()._editorLayer.RegisterWindow(windowName); + GetInstance()._editorLayer.ShowWindow(windowName); } - public static void RegisterWindow(EditorWindow window) + public static void ShowWindow(EditorWindow window) { - GetInstance()._editorLayer.RegisterWindow(window); + GetInstance()._editorLayer.ShowWindow(window); } public static void RegisterWindow() where T : EditorWindow @@ -320,7 +321,23 @@ namespace SteelEditor var style = ImGui.GetStyle(); - AddSetting(config, "Alpha", style.Alpha); + uint8[] buffer = scope uint8[32]; + MsgPacker packer = scope MsgPacker(buffer); + + packer.WriteMapHeader(2); + packer.Write("compact"); + packer.Write(true); + packer.Write("schema"); + packer.Write(0); + + Console.WriteLine("BUFFER: "); + for (uint8 bin in buffer) + Console.WriteLine(bin); + + delete config; + delete openWindows; + + /*AddSetting(config, "Alpha", style.Alpha); AddSetting(config, "WindowPadding", style.WindowPadding); AddSetting(config, "WindowRounding", style.WindowRounding); AddSetting(config, "WindowBorderSize", style.WindowBorderSize); @@ -409,7 +426,7 @@ namespace SteelEditor str.[Friend]Realloc(str.AllocSize); str.Append("]"); parent[name] = str; - } + }*/ } public static void LoadConfig() @@ -426,7 +443,7 @@ namespace SteelEditor var windows = (List) config["Windows"]; for (var window in windows) - RegisterWindow((String) window); + ShowWindow((String) window); DeleteConfig!(config); } diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 3ad7f94..8390d62 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -210,7 +210,7 @@ namespace SteelEditor for (var window in _editorWindows) { if (ImGui.MenuItem(window.Title.Ptr)) - RegisterWindow(window); + ShowWindow(window); } EditorGUI.Line(); @@ -257,7 +257,7 @@ namespace SteelEditor { if (window.GetType() == typeof(T)) { - RegisterWindow(window); + ShowWindow(window); return; } } @@ -270,19 +270,19 @@ namespace SteelEditor Log.Error("{} does not exist in application", typeName); } - public void RegisterWindow(StringView windowName) + public void ShowWindow(StringView windowName) { for (var window in _editorWindows) { if (window.Title == windowName) { - RegisterWindow(window); + ShowWindow(window); break; } } } - public void RegisterWindow(EditorWindow window) + public void ShowWindow(EditorWindow window) { if (!window.IsActive) { diff --git a/Editor/src/Serialization/EditorCache.bf b/Editor/src/Serialization/EditorCache.bf index 27fbb7c..6524a3a 100644 --- a/Editor/src/Serialization/EditorCache.bf +++ b/Editor/src/Serialization/EditorCache.bf @@ -2,6 +2,7 @@ using System; using System.Collections; using JSON_Beef.Attributes; using ImGui; +using SteelEngine; namespace SteelEditor.Serialization { @@ -12,6 +13,7 @@ namespace SteelEditor.Serialization private const int MAX_RECENT_PROJECTS = 5; public List RecentProjects = null; + public List Windows = null; [IgnoreSerialize] // Temporary until structs can be serialized public ImGui.Style Style; @@ -22,21 +24,36 @@ namespace SteelEditor.Serialization return; RecentProjects = new .(); + Windows = new .(); } public ~this() { if (RecentProjects != null) DeleteContainerAndItems!(RecentProjects); + + if (Windows != null) + DeleteContainerAndItems!(Windows); } public void Update() { + DeleteAndClearItems!(Windows); + + for (var window in Application.GetInstance().[Friend]_editorLayer.[Friend]_editorWindows) + { + if (window.IsActive) + Windows.Add(new String(window.Title)); + } + Style = ImGui.GetStyle(); } public void AddRecentProject(StringView path) { + + if (Windows == null) + Windows = new .(); if (RecentProjects.Count >= MAX_RECENT_PROJECTS) RecentProjects.PopFront(); From 5ad6ab11e0e8440b7e3771ccee5a4500b29c42f2 Mon Sep 17 00:00:00 2001 From: RogueMacro Date: Fri, 11 Dec 2020 14:46:00 +0100 Subject: [PATCH 49/50] Some stuff --- Editor/BeefProj.toml | 4 +- Editor/src/Editor.bf | 126 ++++++- Editor/src/EditorGUI.bf | 2 +- Editor/src/EditorLayer.bf | 2 +- .../src/Serialization/SerializationError.bf | 10 + Editor/src/Serialization/Serializer.bf | 335 ++++++++++++++++++ Editor/src/SteelPath.bf | 19 +- Editor/src/{Windows => UI}/ConsoleWindow.bf | 2 +- Editor/src/{Windows => UI}/ContentWindow.bf | 2 +- Editor/src/UI/ExtensionsWindow.bf | 44 +++ Editor/src/{Windows => UI}/HierarchyWindow.bf | 2 +- Editor/src/{Windows => UI}/InspectorWindow.bf | 8 +- .../src/{Windows => UI}/NewProjectWindow.bf | 2 +- .../src/{Windows => UI}/PropertiesWindow.bf | 2 +- Editor/src/{Windows => UI}/StyleWindow.bf | 2 +- Editor/src/{Windows => UI}/TestWindow.bf | 2 +- Editor/src/Util.bf | 3 - Engine/src/SteelPath.bf | 13 +- Extensions/ExampleExtension.dll | Bin 0 -> 4475904 bytes 19 files changed, 546 insertions(+), 34 deletions(-) create mode 100644 Editor/src/Serialization/SerializationError.bf create mode 100644 Editor/src/Serialization/Serializer.bf rename Editor/src/{Windows => UI}/ConsoleWindow.bf (99%) rename Editor/src/{Windows => UI}/ContentWindow.bf (98%) create mode 100644 Editor/src/UI/ExtensionsWindow.bf rename Editor/src/{Windows => UI}/HierarchyWindow.bf (97%) rename Editor/src/{Windows => UI}/InspectorWindow.bf (99%) rename Editor/src/{Windows => UI}/NewProjectWindow.bf (99%) rename Editor/src/{Windows => UI}/PropertiesWindow.bf (82%) rename Editor/src/{Windows => UI}/StyleWindow.bf (97%) rename Editor/src/{Windows => UI}/TestWindow.bf (97%) create mode 100644 Extensions/ExampleExtension.dll diff --git a/Editor/BeefProj.toml b/Editor/BeefProj.toml index bdaa667..ff2e1f2 100644 --- a/Editor/BeefProj.toml +++ b/Editor/BeefProj.toml @@ -1,5 +1,5 @@ FileVersion = 1 -Dependencies = {corlib = "*", SteelEngine = "*", BeefExtensionsLib = "*", JSON_Beef = "*", ImGuiImplGlfw = "*", ImGuiImplOpenGL3 = "*", ImGui = "*", MsgPackBf = "*"} +Dependencies = {corlib = "*", SteelEngine = "*", BeefExtensionsLib = "*", ImGuiImplGlfw = "*", ImGuiImplOpenGL3 = "*", ImGui = "*", MsgPackBf = "*", JSON_Beef = "*"} [Project] Name = "SteelEditor" @@ -7,4 +7,4 @@ StartupObject = "SteelEditor.Program" [Configs.Debug.Win64] BeefLibType = "DynamicDebug" -DebugWorkingDirectory = "$(WorkspaceDir)" +DebugWorkingDirectory = "$(ProjectDir)\\.." diff --git a/Editor/src/Editor.bf b/Editor/src/Editor.bf index 3bceeec..ae486da 100644 --- a/Editor/src/Editor.bf +++ b/Editor/src/Editor.bf @@ -4,7 +4,7 @@ using System.IO; using SteelEngine; using SteelEngine.Window; using SteelEngine.ECS; -using SteelEditor.Windows; +using SteelEditor.UI; using SteelEditor.Serialization; using ImGui; using JSON_Beef.Serialization; @@ -24,6 +24,34 @@ namespace SteelEditor private String _currentTheme = new .() ~ delete _; + [Serializable] + class TestData + { + int Number = 42; + String Textt = "Lorum Ipsum"; + TestDataProp Prop = new TestDataProp() ~ delete _; + TestDataPropStruct Prop2 = TestDataPropStruct(); + } + + [Serializable] + class TestDataProp + { + int Prop1 = 1; + int Prop2 = 2; + } + + [AttributeUsage(.Class | .Struct, ReflectUser=.AllMembers | .DynamicBoxing)] + struct SerializableAttribute : Attribute + { + } + + [Serializable] + struct TestDataPropStruct + { + int Prop3 = 3; + int Prop4 = 4; + } + public override void OnInit() { _editorLayer = new .(Window); @@ -42,7 +70,95 @@ namespace SteelEditor UpdateTitle(); - Log.Trace("Editor Resource Path: {}", SteelPath.EngineInstallationPath); + Log.Trace("Editor Resource Path: {}", SteelPath.EditorInstallationPath); + + //Extensions.Load(); + + /*var buffer = new uint8[256]; + var packer = scope MsgPacker(buffer); + int totalSize = 0; + packer.WriteMapHeader(1); + totalSize = GetAndPrintSize("Map header"); + packer.Write("Prop12"); + totalSize = GetAndPrintSize("Key"); + int i = 5423543267; + packer.Write(i); + + totalSize = GetAndPrintSize("int"); + + Log.Info("Total size: {}", totalSize); + PrintBuffer(); + delete buffer; + + void PrintBuffer() + { + for (int i = 0; i < GetBufferSize(); i++) + Console.Write($"{buffer[i]} "); + Console.WriteLine(); + } + + int GetAndPrintSize(StringView sizeOfWhat) + { + var size = GetBufferSize(); + Log.Info($"{sizeOfWhat} size: {size - totalSize}"); + return size; + } + + int GetBufferSize() + { + int i = 0; + for (i = buffer.Count - 1; i > 0; i--) + { + if (buffer[i] != 0) + break; + } + + return i + 1; + }*/ + + TestOutputSizeEstimate(); + var testBuffer = new:Serializer.AllocateBuffer! uint[2]; + + var data = scope TestData(); + var serialized = new uint8[Serializer.GetOutputSize(data)]; + Serializer.Serialize(data, serialized); + Console.Write("Serialized: ["); + for (uint8 bin in serialized) + Console.Write("{}, ", bin); + Console.WriteLine("]"); + var unpacker = scope MsgUnpacker(serialized); + //var propCount = unpacker.ReadMapHeader().Get(); + //Log.Info("Properties Count: {}", propCount); + + delete serialized; + } + + private void TestOutputSizeEstimate() + { + Log.Info("-------------------------------"); + Log.Info("- Output size estimation test -"); + Log.Info("-------------------------------"); + + var data = scope TestData(); + int outputSize = Serializer.GetOutputSize(data); + Log.Info("Estimated output size: {}", outputSize); + + var buffer = new uint8[256]; + Serializer.Serialize(data, buffer); + + var actualSize = Serializer.[Friend]GetBufferSize(buffer); + + Log.Info("Actual size: {}", actualSize); + + Console.WriteLine(); + Console.Write("Buffer: ["); + for (uint8 bin in buffer) + Console.Write("{}, ", bin); + Console.WriteLine("]"); + + + Log.Info("-------------------------------"); + delete buffer; } public override void OnCleanup() @@ -321,6 +437,8 @@ namespace SteelEditor var style = ImGui.GetStyle(); + + uint8[] buffer = scope uint8[32]; MsgPacker packer = scope MsgPacker(buffer); @@ -330,9 +448,9 @@ namespace SteelEditor packer.Write("schema"); packer.Write(0); - Console.WriteLine("BUFFER: "); + Console.Write("BUFFER: "); for (uint8 bin in buffer) - Console.WriteLine(bin); + Console.Write("{} ", bin); delete config; delete openWindows; diff --git a/Editor/src/EditorGUI.bf b/Editor/src/EditorGUI.bf index 3f7c910..d54e7e6 100644 --- a/Editor/src/EditorGUI.bf +++ b/Editor/src/EditorGUI.bf @@ -125,7 +125,7 @@ namespace SteelEditor public static void Checkbox(StringView label, ref bool value) { - Label(label); + Label(label, true); ImGui.Checkbox(scope UniqueLabel(label, "Checkbox"), &value); CheckItem(); } diff --git a/Editor/src/EditorLayer.bf b/Editor/src/EditorLayer.bf index 8390d62..aab6941 100644 --- a/Editor/src/EditorLayer.bf +++ b/Editor/src/EditorLayer.bf @@ -4,7 +4,7 @@ using System.IO; using SteelEngine; using SteelEngine.Events; using SteelEngine.Window; -using SteelEditor.Windows; +using SteelEditor.UI; using ImGui; using glfw_beef; diff --git a/Editor/src/Serialization/SerializationError.bf b/Editor/src/Serialization/SerializationError.bf new file mode 100644 index 0000000..e31b05f --- /dev/null +++ b/Editor/src/Serialization/SerializationError.bf @@ -0,0 +1,10 @@ +namespace SteelEditor.Serialization +{ + public enum SerializationError + { + NotImplemented, + VariantError, + Unknown, + FieldValError + } +} diff --git a/Editor/src/Serialization/Serializer.bf b/Editor/src/Serialization/Serializer.bf new file mode 100644 index 0000000..cf864be --- /dev/null +++ b/Editor/src/Serialization/Serializer.bf @@ -0,0 +1,335 @@ +using System; +using System.Collections; +using System.IO; +using System.Reflection; +using SteelEngine; +using MsgPackBf; + +namespace SteelEditor.Serialization +{ + public static class Serializer + { + public static uint8[] AllocateBuffer(Object data) + { + return new uint8[GetOutputSize(data)]; + } + + public static int GetOutputSize(Object object) + { + int size = 1; + + if ((object as List) != null) + { + for (var item in (object as List)) + size += GetOutputSize(item); + return size; + } + else if ((object as Dictionary) != null) + { + for (var item in (object as Dictionary)) + size += GetOutputSize(item.key) + GetOutputSize(item.value); + return size; + } + + if (object is String) + { + Log.Trace("Detected String: {}", ((String) object).Length + 1); + return ((String) object).Length + 1; + } + else if (object is StringView) + { + Log.Trace("Detected String: {}", ((StringView) object).Length + 1); + return ((StringView) object).Length + 1; + } + + var fields = object.GetType().GetFields(); + for (var field in fields) + { + var valueResult = field.GetValue(object); + + if (valueResult case .Err) + return 0; + + var valueVariant = valueResult.Get(); + + var prevNameSize = size; + var name = field.GetName(); + size += name.Length + 1; + Log.Trace("Detected field name: {}", size - prevNameSize); + if (field.FieldType.IsPrimitive) + { + var prevSize = size; + size += GetPrimitiveSize(valueVariant); + Log.Trace("Detected primitive: {}", size - prevSize); + } + else if (field.FieldType.IsStruct) + { + var prevSize = size; + var fieldObject = valueVariant.GetBoxed().Get(); + size += GetOutputSize(fieldObject); + delete fieldObject; + Log.Trace("Length increased after struct: {}", size - prevSize); + } + else + { + var prevSize = size; + size += GetOutputSize(valueVariant.Get()); + Log.Trace("Length increased after object: {}", size - prevSize); + } + + valueVariant.Dispose(); + } + + Log.Trace("Detected object: {}", size); + + return size; + } + + private static int GetBufferSize(Span buffer) + { + int i = 0; + bool isEmpty = true; + for (i = buffer.Length - 1; i >= 0; i--) + { + if (buffer[i] != 0) + { + isEmpty = false; + break; + } + } + + return i + 1; + } + + private static int GetNumberSize(T num) where bool : operator T < int + { + if (num < 0x10000) + { + if (num < 0x100) + return 1; + else + return 2; + } + else + { + if (num < 0x100000000L) + return 4; + else + return 8; + } + } + + private static int GetNumberSize(uint num) + { + if (num < 0x10000) + { + if (num < 0x100) + return 1; + else + return 2; + } + else + { + if (num < 0x100000000L) + return 4; + else + return 8; + } + } + + private static int GetPrimitiveSize(Variant variant) + { + switch (variant.VariantType) + { + case typeof(int): + return GetNumberSize(variant.Get()); + case typeof(int8): + return GetNumberSize(variant.Get()); + case typeof(int16): + return GetNumberSize(variant.Get()); + case typeof(int32): + return GetNumberSize(variant.Get()); + case typeof(int64): + return GetNumberSize(variant.Get()); + case typeof(uint): + return GetNumberSize(variant.Get()); + case typeof(uint8): + return GetNumberSize(variant.Get()); + case typeof(uint16): + return GetNumberSize(variant.Get()); + case typeof(uint32): + return GetNumberSize(variant.Get()); + case typeof(uint64): + return GetNumberSize((uint) variant.Get()); + case typeof(bool): + return 1; + case typeof(float): + return GetNumberSize(variant.Get()); + case typeof(double): + return GetNumberSize(variant.Get()); + default: + return 0; + } + } + + public static Result Serialize(Object object, Stream output) + { + return .Err(.NotImplemented); + } + + public static Result Serialize(Object object, uint8[] output) + { + return WriteObject(scope MsgPacker(output), object); + } + + private static Result WriteObject(MsgPacker packer, Object object) + { + if (object.GetType().IsPrimitive) + return WritePrimitive(packer, Variant.CreateFromBoxed(object)); + else if ((object as List) != null) + return WriteList(packer, (List) object); + else if ((object as Dictionary) != null) + return WriteMap(packer, (Dictionary) object); + + if (object is String) + { + Log.Trace("Write string: {}", (object as String).Length + 1); + packer.Write((String) object); + return .Ok; + } + else if (object is StringView) + { + Log.Trace("Write string: {}", ((StringView)object).Length + 1); + packer.Write((StringView) object); + return .Ok; + } + + // User defined class + var fields = object.GetType().GetFields(); + var prevSize = GetBufferSize(packer.[Friend]mBuffer); + uint32 fieldCount = 0; + for (var field in fields) + fieldCount++; + packer.WriteMapHeader(fieldCount); + + fields.Reset(); + for (var field in fields) + { + var valueResult = field.GetValue(object); + + if (valueResult case .Err) + return .Err(.FieldValError); + + var valueVariant = valueResult.Get(); + + var prevNameSize = GetBufferSize(packer.[Friend]mBuffer); + var name = field.GetName(); + packer.Write(name); + var newNameSize = GetBufferSize(packer.[Friend]mBuffer); + Log.Trace("Write field name: {}", newNameSize - prevNameSize); + if (field.FieldType.IsPrimitive) + { + var _prevSize = GetBufferSize(packer.[Friend]mBuffer); + WritePrimitive(packer, valueVariant); + var newSize = GetBufferSize(packer.[Friend]mBuffer); + Log.Trace("Write primitive: {}", newSize - _prevSize); + } + else if (field.FieldType.IsStruct) + { + var _prevSize = GetBufferSize(packer.[Friend]mBuffer); + var fieldObject = valueVariant.GetBoxed().Get(); + WriteObject(packer, fieldObject); + delete fieldObject; + var newSize = GetBufferSize(packer.[Friend]mBuffer); + Log.Trace("Length increased after write struct: {}", newSize - _prevSize); + } + else + { + var _prevSize = GetBufferSize(packer.[Friend]mBuffer); + WriteObject(packer, valueVariant.Get()); + var newSize = GetBufferSize(packer.[Friend]mBuffer); + Log.Trace("Length increased after write object: {}", newSize - _prevSize); + } + + valueVariant.Dispose(); + } + + var newSize = GetBufferSize(packer.[Friend]mBuffer); + var gap = newSize - prevSize; + Log.Trace("Write object: {}", gap); + + return .Ok; + } + + private static Result WriteList(MsgPacker packer, List list) + { + packer.WriteArrayHeader((uint32) list.Count); + for (var item in list) + Try!(WriteObject(packer, item)); + + return .Ok; + } + + private static Result WriteMap(MsgPacker packer, Dictionary dict) + { + packer.WriteMapHeader((uint32) dict.Count); + for (var item in dict) + { + Try!(WriteObject(packer, item.key)); + Try!(WriteObject(packer, item.value)); + } + + return .Ok; + } + + private static Result WritePrimitive(MsgPacker packer, Variant value) + { + switch (value.VariantType) + { + case typeof(int): + packer.Write(value.Get()); + break; + case typeof(int8): + packer.Write(value.Get()); + break; + case typeof(int16): + packer.Write(value.Get()); + break; + case typeof(int32): + packer.Write(value.Get()); + break; + case typeof(int64): + packer.Write(value.Get()); + break; + case typeof(uint): + packer.Write(value.Get()); + break; + case typeof(uint8): + packer.Write(value.Get()); + break; + case typeof(uint16): + packer.Write(value.Get()); + break; + case typeof(uint32): + packer.Write(value.Get()); + break; + case typeof(uint64): + packer.Write(value.Get()); + break; + case typeof(bool): + packer.Write(value.Get()); + break; + case typeof(float): + packer.Write(value.Get()); + break; + case typeof(double): + packer.Write(value.Get()); + break; + default: + return .Err(.Unknown); + } + + return .Ok; + } + } +} diff --git a/Editor/src/SteelPath.bf b/Editor/src/SteelPath.bf index bb7b94a..55c6009 100644 --- a/Editor/src/SteelPath.bf +++ b/Editor/src/SteelPath.bf @@ -6,6 +6,19 @@ namespace SteelEngine { extension SteelPath { + public static String EditorInstallationPath = new .() ~ delete _; + + public static this() + { +#if DEBUG + Directory.GetCurrentDirectory(EditorInstallationPath); +#else + var executablePath = scope String(); + Environment.GetExecutableFilePath(executablePath); + Path.GetDirectoryPath(executablePath, EngineInstallationPath); +#endif + } + public static void GetEditorUserPath(String target, params String[] components) { var newComponents = new String[components.Count + 1]; @@ -18,7 +31,7 @@ namespace SteelEngine public static void GetEditorSamplePath(String target, params String[] components) { var newComponents = new String[components.Count + 2]; - newComponents[0] = EngineInstallationPath; + newComponents[0] = EditorInstallationPath; newComponents[1] = "Samples"; components.CopyTo(newComponents, 0, 2, components.Count); Path.InternalCombine(target, params newComponents); @@ -28,14 +41,14 @@ namespace SteelEngine public static void GetEditorResourcePath(String target, params String[] components) { var newComponents = new String[components.Count + 2]; - newComponents[0] = EngineInstallationPath; + newComponents[0] = EditorInstallationPath; newComponents[1] = "Editor"; components.CopyTo(newComponents, 0, 2, components.Count); Path.InternalCombine(target, params newComponents); delete newComponents; } - public static void SetContentDirectory() + public static new void SetContentDirectory() { ContentDirectory.Clear(); var projectPath = Application.GetInstance().CurrentProject.Path; diff --git a/Editor/src/Windows/ConsoleWindow.bf b/Editor/src/UI/ConsoleWindow.bf similarity index 99% rename from Editor/src/Windows/ConsoleWindow.bf rename to Editor/src/UI/ConsoleWindow.bf index 3330fa0..8dac0ee 100644 --- a/Editor/src/Windows/ConsoleWindow.bf +++ b/Editor/src/UI/ConsoleWindow.bf @@ -7,7 +7,7 @@ using SteelEngine.Console; using SteelEditor; using ImGui; -namespace SteelEditor.Windows +namespace SteelEditor.UI { public class ConsoleWindow : EditorWindow { diff --git a/Editor/src/Windows/ContentWindow.bf b/Editor/src/UI/ContentWindow.bf similarity index 98% rename from Editor/src/Windows/ContentWindow.bf rename to Editor/src/UI/ContentWindow.bf index 73808b2..cba38d2 100644 --- a/Editor/src/Windows/ContentWindow.bf +++ b/Editor/src/UI/ContentWindow.bf @@ -3,7 +3,7 @@ using System.IO; using SteelEngine; using ImGui; -namespace SteelEditor.Windows +namespace SteelEditor.UI { public class ContentWindow : EditorWindow { diff --git a/Editor/src/UI/ExtensionsWindow.bf b/Editor/src/UI/ExtensionsWindow.bf new file mode 100644 index 0000000..a4c62a1 --- /dev/null +++ b/Editor/src/UI/ExtensionsWindow.bf @@ -0,0 +1,44 @@ +/*using System; +using System.IO; +using SteelEngine; +using SteelEditor.Extensions; +using ImGui; + +namespace SteelEditor.UI +{ + public class ExtensionsWindow : EditorWindow + { + public override StringView Title => "Extensions"; + + private String _searchBuffer = new .() ~ delete _; + + public override void OnRender() + { + EditorGUI.FillWidth(); + EditorGUI.Input("##ExtensionsSearch", _searchBuffer, "Search..."); + + for (var name in Extensions.[Friend]_extensionNames) + { + if (name.StartsWith(_searchBuffer)) + { + var bgColor = ImGui.GetStyleColorVec4(.WindowBg); + const float colorDecrease = 0.015f; + bgColor.x = (bgColor.x - colorDecrease) >= 0f ? bgColor.x - colorDecrease : 0; + bgColor.y = (bgColor.y - colorDecrease) >= 0f ? bgColor.y - colorDecrease : 0; + bgColor.z = (bgColor.z - colorDecrease) >= 0f ? bgColor.z - colorDecrease : 0; + ImGui.PushStyleColor(.ChildBg, bgColor); + ImGui.BeginChild(scope String()..AppendF("##{}_Frame", name), .(0, 20), false, .NoScrollbar); + + ImGui.Indent(10); + EditorGUI.Label(name); + EditorGUI.AlignFromRight(20); + EditorGUI.Checkbox(scope String()..AppendF("##{}_Checkbox", name), true); + ImGui.Unindent(); + + ImGui.EndChild(); + ImGui.PopStyleColor(); + } + } + } + } +}*/ diff --git a/Editor/src/Windows/HierarchyWindow.bf b/Editor/src/UI/HierarchyWindow.bf similarity index 97% rename from Editor/src/Windows/HierarchyWindow.bf rename to Editor/src/UI/HierarchyWindow.bf index b49221f..8cd17a1 100644 --- a/Editor/src/Windows/HierarchyWindow.bf +++ b/Editor/src/UI/HierarchyWindow.bf @@ -3,7 +3,7 @@ using SteelEngine; using SteelEngine.ECS; using ImGui; -namespace SteelEditor.Windows +namespace SteelEditor.UI { public class HierarchyWindow : EditorWindow { diff --git a/Editor/src/Windows/InspectorWindow.bf b/Editor/src/UI/InspectorWindow.bf similarity index 99% rename from Editor/src/Windows/InspectorWindow.bf rename to Editor/src/UI/InspectorWindow.bf index 6977b83..5fd4f60 100644 --- a/Editor/src/Windows/InspectorWindow.bf +++ b/Editor/src/UI/InspectorWindow.bf @@ -1,13 +1,13 @@ using System; using System.Collections; +using System.IO; +using System.Reflection; +using SteelEngine; using SteelEngine.ECS; using SteelEngine.ECS.Components; -using SteelEngine; -using System.Reflection; using ImGui; -using System.IO; -namespace SteelEditor.Windows +namespace SteelEditor.UI { class InspectorWindow : EditorWindow { diff --git a/Editor/src/Windows/NewProjectWindow.bf b/Editor/src/UI/NewProjectWindow.bf similarity index 99% rename from Editor/src/Windows/NewProjectWindow.bf rename to Editor/src/UI/NewProjectWindow.bf index baab579..c3eec82 100644 --- a/Editor/src/Windows/NewProjectWindow.bf +++ b/Editor/src/UI/NewProjectWindow.bf @@ -2,7 +2,7 @@ using System; using System.IO; using SteelEngine; -namespace SteelEditor.Windows +namespace SteelEditor.UI { public class NewProjectWindow : EditorWindow { diff --git a/Editor/src/Windows/PropertiesWindow.bf b/Editor/src/UI/PropertiesWindow.bf similarity index 82% rename from Editor/src/Windows/PropertiesWindow.bf rename to Editor/src/UI/PropertiesWindow.bf index e5c22dc..36ed159 100644 --- a/Editor/src/Windows/PropertiesWindow.bf +++ b/Editor/src/UI/PropertiesWindow.bf @@ -1,7 +1,7 @@ using System; using SteelEngine; -namespace SteelEditor.Windows +namespace SteelEditor.UI { public class PropertiesWindow : EditorWindow { diff --git a/Editor/src/Windows/StyleWindow.bf b/Editor/src/UI/StyleWindow.bf similarity index 97% rename from Editor/src/Windows/StyleWindow.bf rename to Editor/src/UI/StyleWindow.bf index ab58e1d..3d68b4b 100644 --- a/Editor/src/Windows/StyleWindow.bf +++ b/Editor/src/UI/StyleWindow.bf @@ -4,7 +4,7 @@ using System.IO; using SteelEngine; using ImGui; -namespace SteelEditor.Windows +namespace SteelEditor.UI { public class StyleWindow : EditorWindow { diff --git a/Editor/src/Windows/TestWindow.bf b/Editor/src/UI/TestWindow.bf similarity index 97% rename from Editor/src/Windows/TestWindow.bf rename to Editor/src/UI/TestWindow.bf index f30f244..4334a07 100644 --- a/Editor/src/Windows/TestWindow.bf +++ b/Editor/src/UI/TestWindow.bf @@ -2,7 +2,7 @@ using System; using System.Collections; using SteelEngine; -namespace SteelEditor.Windows +namespace SteelEditor.UI { public class TestWindow : EditorWindow { diff --git a/Editor/src/Util.bf b/Editor/src/Util.bf index 054aeb8..fb35b50 100644 --- a/Editor/src/Util.bf +++ b/Editor/src/Util.bf @@ -14,10 +14,7 @@ namespace SteelEngine return .(self.r, self.g, self.b, self.a); } } -} -namespace SteelEngine -{ extension Vector4 { public static implicit operator ImGui.Vec4(Self self) where float : operator explicit T diff --git a/Engine/src/SteelPath.bf b/Engine/src/SteelPath.bf index c735c53..1b14685 100644 --- a/Engine/src/SteelPath.bf +++ b/Engine/src/SteelPath.bf @@ -8,7 +8,6 @@ namespace SteelEngine { public static String UserDirectory = new .() ~ delete _; public static String ContentDirectory = new .() ~ delete _; - public static String EngineInstallationPath = new .() ~ delete _; public static this() { @@ -19,14 +18,6 @@ namespace SteelEngine Path.InternalCombine(UserDirectory, envVars["APPDATA"], "Steel"); DeleteDictionaryAndKeysAndItems!(envVars); - -#if DEBUG - Directory.GetCurrentDirectory(EngineInstallationPath); -#else - var executablePath = scope String(); - Environment.GetExecutableFilePath(executablePath); - Path.GetDirectoryPath(executablePath, EngineInstallationPath); -#endif } public static void SetContentDirectory() @@ -60,5 +51,9 @@ namespace SteelEngine components.CopyTo(newComponents, 0, 1, components.Count); Path.InternalCombine(target, params newComponents); } + + [CLink] + private static extern void LoadLibraryA(char8* lpLibFileName); + public static void LoadDLL(StringView path) => LoadLibraryA(path.Ptr); } } diff --git a/Extensions/ExampleExtension.dll b/Extensions/ExampleExtension.dll new file mode 100644 index 0000000000000000000000000000000000000000..175f8e4df5369a98b1c30a719b74fb11805cf975 GIT binary patch literal 4475904 zcmd>nd3;nw)^-OH2nZxDQDo6pdoUoyqj#Lk)$8zOyc*Yn|6?=OwsuB%Y{t6QL~-9}T>|%m)8A-4S=_a)hl#tcwJ+Sq&fCzM0{4;g*0v^# z`$p@*aIG;LS`UOfHe*9;C%F5kZrIsxpe|?G;Eg-)%HJsbcjd1a_w36qE~E@$jq|cy zu1jv};<~QaqZfo}TU;%%k@ZKA(u_)?{X!Jx9P`GaOv;la&-}st7h(_9NqL`3*+OO~tg8<(r$(^0N* zVOo@1@YyI=D#B?^qg-jx`6M6Xs!xn!Y~vkLd}(PhXpjB^ohdSPH+qCw-7Z(bkm;9P zSbU+&HD*`}_>OV8hQr+f-l)F}nAH%?=4#A=)#aV)a{UBh(%?q@fvWf{1kqcP4HiM<09Ult%|Lf0N zzByHO{w~3#KJT9B@|LeoT_vP$LwdN>+Y|Bl;95M=&)UzWnwE5Tsqg=V$2AM_xOFKW z$2^FLslUP(zX867_Q#{}P&`H-hR64LaW1v(Z+Ljl#^dN)6J6@N`FQxxL(p|T9_RD1 zgpd6v;&CM(Yxp>F5+1YoSW4!%=^HW`j{qNE@Nwz|c-+Is&wS(+;IZF@csxSih4g*I zv@g(ic0L|Y@sW5D9vAcR3Ll659gpJ=>EcokJOI&7x&*IJ7&EUTm;W6+rJn93;r6P#O#2UnoxvQ&7z5j1SEd382 zAHRp-#6E~PWd?#jcEe-9fq0Ba!J~2sk_~$fzTf)caoCe6qxgCFmi6ipRYl)V11af6 z@Vc%+6)j@YJ_q6PbrK#&%)w(?Ulh^31%+*%jmJHw^atQyAiM2nAmYNG;9LI=9-mWF zdn&TJ`7Ze09uMC;eNln=2lKHBj~{yC@&3c8=meUk4b#=rp4XPwA1M8 zHUW=I_;{7UJ~Y4*J{rjK(LsRwURu}MOA-9#LHG`S7>_UC2KvwcfJdhsuuNt>9RFVg z7t&Y!2p+Xh;PKTc)Z9sxNV|C{_?puI(>Ko`qTpv*Qg6^kUXS4AJ@Kg9ACJG%oN}ju zZ_M*ZwuEMvdL64Uib}w-;RuzqBdB2Y2Nc!d94*btG4{t_~L}zVYSVj z5y-J>BjnD-hnN4FP~4~d*Y3qBbANpk35$Eq{WUcSZft_`&56h|an-umKPUh0<-Z=( zCXFe(bFqi{qon;=(m^aKy{9fIlWyCRQgyDGL2t6!egX{5bYmSz@JGvEWXkW|YY*ig zJ7V|cpOZ5oXMD~$@44OyIp=!kZZ5;%>$A3btsio%mR##IpY^1tNodb`6kM3j%+MWf&cq>@h4TlvRt8)@$jyx@RXWCyzJDn>2d3P_B^5FTC2VG9iHnXqm63Q ziDZRxzdfeOzehV2SZ z9_W+VvPX^MtI*M)r3CBR9plAX@>;qm3bLnn|0g)6P6nrzKfsF)hlIa*%(9 z@HlA-5vFD=-v>UC59%F4K5L%Ht!kHG90L=H>aBMXKnzR62*o~Vo`|h}Ss&*LZ8?ZS zB^(k)6n%*+bUYq)6`q5U#O0vLpg|LTEb`f?vYr++(eD~G8R4LLH!>%h3y>ettbq&2 znNekh=PrbZ$Cj>ep{t^6r(D@Z<3X|-ev-yg0^hwQSh`r6!Lq@mt=DPO+&V4Es^!G~ zERDsWv?k%G@Ptz&A{QdboQWi5qoKS&K0rj7)pZzih$M-s@*RyN%TmkMX(TDMdJ2Ki zBL^~rg#Mk4ZDIs*g+}5r1@-?N*rKsy*kJh|c!_1^V!`rR1hr){!oe~Z*%M3jfP!Ti zbB5f^X$sJrjWE%yVs;2u(zR0#OVEgrtiDRuXiDJ0HwDcFh(Ja_putJ9LK z9!FZ1$8uO+nebG2!f6&EOgx!4@uYmj^IY-)Ps*(ZU`QvPB&zgH8c&v{E?=whq}XZ_ z0-*^9FoT4WuMD1;KDk2acmU2kaPiMEPErh@XTnQBOEsWpA*camgahb~{WYLP$dblc z2p4iQBdCWdkU)~k%n)|dwNo~B){u~_?i!)tl)%{y0%tlRkW|tpnzSyR_I3j&$?ANh zMQJPsx%U>13Qssi2EqiBITK9EMlip_OBKPS%<6p%Xati))%=zQlVz#?Z)h+nv`R)G z)D6l4%;YaR>NuOstD1u*DF)3?q{xlxs3l^apCYKyWQ2p}zcI(5dFDehqM1jDAvtp* zeqPa_!h^9}!i(wJDRVk$JV{okpP=!SK&Op@XFVd26ufAnCT*2YJKEq$vf7VnQJ$28 z@)ik?lcoV-BFempsK^II=a3JGQf_rK<`YDeM0NL@8c~*}*4Ar8DYkkAfzS&W@PX)( zox?dSwHb3_h>u$h(JWirwkX*LIAQ>|h z;aw^QONI@WkHbqWZ_rpifuP2c5e}9sduS|^As4Ysgv+6UIdN#{BJyJhVs;3Z(X~@< z->K0gS)G5JMpFU@qrV55HHbh`@S?|K8l)}IY0vGW(IiX`;c?O|K$v(k zZ{kV$i04`41D=#y-TRcrlSK8@dW|PbQ=hKZcv5Wj76PHQ`!R!r1DZM*ioD?BpVQPy zF@TPNmw+zTfS!(^29yyFpw}RO8fOdgA)s5}LT+XR^|($$NZiZ};ofxZl&s%0oFuCr zf7NhGV9o0SXBr~HaJo#|7A#yLZK8pbWYv%+LlKKX?#bjtY2g&<2op@^OfV@M!Tg#z z0ZhuQ&U{jXNunxPr@>@d>b6xHObV_12!v*LX9fx5w;AJ%9@m?Ygntg0q!=(iftO%j z{1_Ns_I!$<29psEm>%R$Fq@DM!EA&JxtS5v+k_C+TguE3UQE|c`DMEXlVtVkPz|O8 zZm1V9>k$zKv&N*Y(rI7nt!$^EnM_s%m}^Ms|XRvd<2PP9$h=-sb4jcB&(7k8c7MHp_4}| zFGNHb$#j!8O{cx4mqwCgbt2NDG!}!>yuyJ|#-u2MOC*^yk)&)y@^HojNy@BVz&aF> zBvHNox<-;^sqM8INeZpLMIiJw=1M^Fk&g_LF@0t~utj6Zu)(qqyu>p2Z^5!Jf*MOk zI9UFZGdW<1IjLZ|2rm0D=EOei5rm0mOJ}$UZ=q|aT(C`}NwPY6utrk?|9wr+Ok{Z` zZKFxspwk|;pGK2p)jUY|nJkCpDdB+ynl#DChj=n?;z{|4=c|kdo|IcnU8M0OQO&5= zc(OG0#H$)limmQPAaoZ7HQ+gUYX{AIDY*FOG;>l6piAH-puasOfWCmB29yyFpeJ+C z1fVs@hsIe27jiQrs5cKG!db=45U!+arzB(To(4g(YCKlMDS_M3&%-zuAR-KBkx5&q z({Adn;UrnzhqNe-#US@G;lR|)q*w%(U@~WdN!bYIxr_&xlv(w`aw%mYQ4Lz7!DLx# z@+%rl3a$QzKxiy_Pk?#i&j!pXkTK-L10v^vi+>K7q!=*IgqL9c@UVb+7J?c~MmS(@ zVeJFVGUVe6Ti}6`mo>Bt*9X^o| zVCtb>!~!A#CQ+?@O#{sG)Ne0qfT@t$fOrwD3*8Q}nY3#AMcdy0r|;SWTYnNXpnbWy}&xIYlxRG>TcXN@i+)zE?c z5d(Bn!|@nF81c!9I1>SM>p=;lTLVAytb!X(lX9RjU`DDBQ={@kb7ukw6HeHGFwtc( zM7NOW&LNZK^AxGcSh*#%q^P3R8d?^n9(qYbOKns&0-=90m7Q?uyfpoy#Mx|U28dW; znhhrkR|XBPGnop8TZE1XgZ(T7HLi?sa2YWV)vMX>A~O)(J`kIbA=5QdBeDa~n|{!h z!8mm$@)m9ri-{1)tvehOt}cU)ITv^*doReDm@_G7GFJa{&UIF&@eyb4X6d`F_pv%%b_&;( zz19Zx)AOvX7F{D=t7}><>cHDtRVe~C<&4}>l2}(87wUx)Gs{MKm@dbP_oUTkF6~EH zA#54k9BUm?HNoez(Jf?ISl(m6df8J3H$1>(c`otVHXj&GeFRiM0?-A}^BvH0E@%sS`DVx(i}*jDYm0aoNl}8}Hvust{D>$q=lJYP zJgHgMl`wv**prcE&Gh()5V~2PCqoT@V8Ak+Sf-*v)Wi$ISRRsVtu{H{-@}0;zPYx! zH?%%F+gg)jy_*T3>uW{lqnr14XwQL0jmuZ(dE2Oq?;bhh`TfIt4!(oT-Mkp0`>fBr z)(1J(7GGeVXOZZ#Rvj}-7n__}7w<{PtjqG?8^yCU^YWdp5}|f6)cK^^FN*=8eGQne zJ1p9h`u0fO*-2pPr)0$2F=LWHq3t~>fy}a5E^Xm&(|F!^#RcPO$*yQEJ~XqeH7=EkE@BP$4(<3n75 z&sxRGn9LHNS&#RNah?lcv6EHqr);&bMfRH?;zJ$nt|xIozeXIIlWFR(%mUULz7wK3 zZBX4&XeaYY;2wJ&1f+*1EeVGu@_wq~hvGbz&M@yDwBpX7>IspqvHWZQ# zQO|yoh}x2((^&M0D2+uQgIt^UkE*HW_@w=k_G9oX}l&Ok7qgwitlF!1>52Eh0 z)}RXxcUun#mEG1B0r_DMDHx%jh7(tE0ES=^Dz&Kp#k`W8T_s2?h*4^LbE2!NDvY&v z*jq%n>dpj|zD3m7=_>A%V|9TR12nYJT6~pj{RFODYe(5gZLMq7&C5{VBU_T}X(*3X z5kw~gdr7MJ6$NH$up~zcQwkcGph63>hv;P>xRU(%HU<%1mUx*yAS}}dx^~K@8r`Du z5mfgbZl(_mY{NH2Y9}$5O8}D(liCYcOUm(zp{}9TFFuC+w>GM~TR8jn}%vEU?e>WPwXPg7(5Z8K7ksBF}92bp?@X@~nsE z$dhr%Q_>FF%)vmWR5Lk$snF|@m<#o0Zg$GrZ}iaZMo`^;mb!&f(fCOfyu&0|R3Do}%V!%mV3wFm87&4}S-UZUHRgc}Ri<2;_Ef0`z{X#X;UCsRrb?BNMJOkNSL-QLIh+LQ$Qb!-UR`g0-0zE z8SMS%MC>4;M(hA}*2WH4pvp!k!`TSltQkB3L9qi?i%JIC&4rAVU>t*&(gOP8EghXf z@flP=dLqD(N)vbITI*s zvs8}|yRV$q)uGbut*x+A_UyG#(t81WcFZFu=1h*B)P#HXGDsQe*_{sj(I?n}H-)=p z-R0_;VI@+qZy)((NjDZ0dK|@sJ5JrvJJX;d>F&*Jve=W)iB72(5Err9^Wd2YSEfE_ z)qIOP7IS=PT8Ql=ArEpUSd%Acuo6N&4P_PPFLRSCRze#u~d?2PFXB831pr+W2*%EA%WVEbB6p^DL9|sWCZwRbN>thRHJLG~}G4 z>%?p7qy*XKAX~30MYheDLu^nfCeHyuEp2R`W7G;vZGXDWXOR=C_yP<$pZ>=ccKgP5R{@3jj&p@}@0n zNndp4$2Rf36usncod3Lj3|j4a_29w%#eHLaSGccv1KFwG^6XUIm*U-XJl>+#tIO6h z_GcFOkC!>IY|5;AEzarW)~N}>1U*N)4@Qnj9oC4ptvnu_^|>RzFWw))?w<}12M0AD zsz*-qK6dp7d^u5}Nl43eyIpg>|E}g7ra5Qtnlt#G=Io|9cdUvC)3)><4Ckk4b0~e8 zBX(QP^NgGr4ar&g$u2ee>U~|hr8)n-YtFlkM%dEJJU8u{GtS64LUW$IYmF{5ob2?G z=hBaNDQAO`^KihkbCq<={E6`QVs(AFMes&f5u{ z9mU(S6>A}zGr<<`u=Q>p6qDP_8p-B9G1Tu2l}jJ9tC~xrjdteEVzk8UVB*BwSI%bTW{l$gTfbwchT&J4a*nSFE)TF_H(c69}_kM`P^dNIYo zf|V>+;q}owX_XfX3DWK-M3xg2VYD_!Rupor@4a?)qfpnXlo#0?pJLEwEpHNPwRUV0 z)yWNQ`hv#~k-mU^vYQi_KyDiPgVnELRq&1j5QPqeG_~|~F8U#0t?&l?4a~V*95va1=Pa@J^GpB2irc1~HAjFf9t-kBPy_}pQwRbJb_n0W;Ji|E)XXIp#&vq@Ba zS+McXc#_eY-uwjp;e-pos>eZ}Z8M-HxF0^gS_i*G^zsJ~!b?ZcPcmQMu@_VpTCQee zC||w+WLL>wbBDdoS1r5xJ_IRj1N!4&^?ZbaHfie0rbN9q;R+2$Qq5gvxJN$AwK%&9 zL7(NvfQLM)CDP6!{0H+Ud|>CGmJy*G zDogP7-tuj(;(=u+%6oAjH&w;$FV%zH!Esol1O;!>?C?|7|C0N2?z~ogfyqi)I#c+p z>TMJ|ij>n8Tw?NIn;sAPjEF@;-_D(&PX3NBn%NT&mtHpO zTuw={CuCN}d(0Zm(BSxUgW!AbW9pZiFPMxU$AWJKAi?qDgSq3>Fs$`R0$^gZvehS# z6Q7Oh*$prgd!YhNFPva%jfE4mfj?mReWB`ZEq^qIG%kThM#04gb!7Q(tc2y?lN4q7 zuhi|m<)5{>Bg>y~#_lXXKj>Kg5iHnPdr!PXhy8Q9(7%_Ke=fT3KW_Q&VxL@$I&?@@-wjqY}b}wkD20LTmA?5h97JBhp&)HSv$+`+G|&q|6@;M`QN|*_iXudu-ey= z9K4md!X3o zhx9)B94?@5P+g!S=3eNv3OSbs*~Qqfnlr?aXhWZ8^UBi?A!79M6_axAjK zD8TLd0h`N)=$2o470towLA*6d$Ee3v(a<$XMuY+uR_>?cHpzXK&9Za((W06WDs6?6 zDq!a`Nnm~+96d&CP=ma>rS$Nw@srNKDm@&(xD->ikz3@9!1_&?!i?OKR1uH-L*IZ2 z{M=E+zwoy-n*?;nQjA?4-mbOgGq#TKZY{swtd;G;xR8zY_vzeA%XeTY-e*-alN@WM z&#q2oc7bYnZwc6oP_i%JUjPRf*U+(3Z29nIlT%IDPe2nsOY>R6Cm-6X)0vwstU%{5 zrkIFbfWhj+;SJhCXu+}%KxT<*!2MVv*pSR(62^qp-wAa?U*J*a?++$Nb%q?(`yxcM z<0QCjc|U~s9nnuRv<|C&Ju{D}o)xTSCYeF1?t%}hw{XQbU{`6?x!O|czgcU3`xY)1 z*<@4`yNl++hS3lVL1D`ZHe^*+Co?b23B|V}OLZ}}>jkTSfj4Lip|w#IXL)KcK7NGW zNfO29zisLr-JvVA85&Pn&RJ{?ipR(mYA|$Gl9Hsh9W*<>~N|sg4 zT&847y*I)OVChsulCI zZ88IZ4NP+pw%7%$H^LjVg|L$!?a+J}Ip{tBunAjSQS(_ZNFzw9h$8@BL+>^IdNA=X zV)rCC2-G1&1SVtJT(*1-LV^IvQ3%|?{38ee0A`}~Uj!fYUjPUC7ij(S;RO8SwEA~y z^~tC%NEG#j4Q&q$masv2=)RPB*)}<$`~6HX1v}z`)epcMw1v<~>(262+P%=d5uYoe zd)o6x_vl7n1+Ez7NpO_^Cqh*I@AxiOw)_@^M0t{ay} zS1X@EwFCZit$mHwo}B8!uA;s0S$^TOgikm6GUjI6WQF=um}2VVRDUYGL0br&-<7Io ziR!QSK>hb+RV!g&LkE3cKDc7kC&5vF0zy>(u8*nyxd@5+BuA+~n*~Ix&rG!X>F`1Q zG&oQ{O{<@()pu+4@78@DIn_m7M1A42{K9AX$*0x#GB?{ME7Tvt6orpb{h{y%Z6Uiw`=vuybwghX|cqf{?v<`LD= z=P?uA=Ox1j)f3@B_1;?bWH^=nB(3=ay3Zq{DohZ~h0XGlEhucd&vP>`+a@Oz@4^IE zW4m3jx+}avTL}AYl6q%(>cko-{+TQ}CA_(zgFY`FTv4hs=&0TaA*#MeRPT(Cs7`W} z>XpnsqB{FL=3@Fhg%1l*z6lPLcWLGM&VW8|D;)HB4{Ea~r@A~|v==_hFMO8ph5Nh~ z=4abv1^}Nh&9p}ez^CvAZ6S1jTL560D*Y}1(4_ajmj0)GpVtT`{zdvc5*!5HMTiIt z#wtbG^7jxD1W1lT;3noDK>z?S6W!-6g%A2Kh6DZihJrr72~NQO5uQ;0A+0_c)fJsZ zePOeN%@Q`<=hZVW+a@P;|2Gp%#~1Bj_0#YMZ6WlM6FxS}Q={&L?pQ|Nl?BX4*I-W zI(Ev#T6=P;t2&AH!e?ndOZar7uL2L$Co9yyjw!Ci=DlF`_3#F5AtcFh9GfMoldGZr zm$HPLuzspH5V(K8d>==0%&>UnUW z`cjkx)fdC5^gpdNfBZ8U>dC0CjT6m<%@Vetu<1r$$h>TuoKT#5GSv+aQ*mz84BA3C zSWeB@EKgrqQRt3*}ScK=}nI3(D8PL8HGD4(k2MPeglisuGuIFMOEUlFt&paHG#)ezr|! z05E`QW?+w8u=;3tgSHS-HcF#snQHXy0H7JuLjchE4P*G*k#FcTJl6Q#VB%lI?n!VE zI1C{oFiQ|P93eq~CzqPh z+7G#C9!q$v?3uc`Co>n!Z{a}et;kH3KSZs6ffw^z5)PLmJ~m5Ixwk>n&j7UqovX9Id}ah*~GS$$IB@Skao~D6Q{h{t>OQX;-qvib4aEqjigu zizTY;LhRVh#-6m4+9s)Ma;U&g>Wg@b@yXejfXUBIuFzDnu&e9HclU$TbPc>gTL{O? z;TxOztBY@iru%74*FI?sJff*=#`P}+V?6)#_|5Y3{_Z-dEElOab<3n8jG z6idiu%jY2^YLXnK<{QEleosXo#!Pe{Rsn^Y3NNOoBwQl93vK4EZo36)^5z=An@%U-Pm@qe z#nZB;MWV`OQJD47KOHBa9p+Rrm;33sQJ@43W8WvD8QtKBSOo(PT!%3az%@|ppL=h0 ztA{5FuB$ME@nR}UW>~v~Y=%^K9RKckXKd}ivGj50_I@Y~J7cSpnYP?d$Ib6z5JB>> zbqqeDPoc~fzL*94iQobQmoT8%7AbFoI%vKumbr9fi%@l>Z8ssLYS2;mtoii&0`r&B zvF0lss?{MO1~iK`Ux)!=!4eNS(JM(-^ROPu)wD5f=xgz=jV0hVYie%w?5|=F?(k}| z+pH$L)dPsB!dgzOPM=6w8`PuF3DY=)Fpa}gjeZ^9HhVz~nu6N6w5#my(V-O#^>FH? zxeK=IVt*39gDgZG*2K8hl{1MuNWJIl%@$k@4qvw+OJn>DdX9Vu#f~~@?$}ZHgV*Y% zKEgSAD&56feu|6RDiY&D$0oxPqP9IRbEEBf?Vg`aNAV5aivwD2y{O7e zDTu18#EK?VDv*-y)2^K`ZlW9rDDLI86I=`B+(q$>=8M9~plL+^;t|H=?$D=`{+nMW}b^%}|IT62)*Gvp9j!)%PSPMIE4<~%un zyA0WzvNVBZl=SgJlvIksXm#dRnu@0AuP{CKbSiB{8p*1D0Rb;}B7CT9j?bW4RW6xIzFrz5zX531es5eF5(LQyXQM%X0E zsH|XZ7P!(urqwcJ2BSmY5*=c4nX1p=FB|;qP=7Q^-a!y&^sFh>1@&lyE$>c1n7HfIolS_BV$tCJH z!RW_~)bvW|H=Roic0%x9=Je5C)m#fyTZY$^h*gr{=og7rOMle*kz#5N>b22MalnDF zO>p7-#Jud3CZil<)gs^on`9JJqh>82v*s90%{ELy81~OhR1KDWLp6GVqUJ%P*=I<+ z$M&YcggX_Hm$dD99ugeQBGKxTAGBtq?6SSpLl|mSOJS)YGqY0?WTu17f|PZ=K&0bL zdut>+bYnbqn`df`*{GLqf^IMCwTI_k{ylw3BT8R}EF!v*;OG{KR-KG)r0i0+MaYS| zEr3hi_<{}H27an-lF{mW$wg^d*ckeMt?- z)Qr*8Y{kV0!y=i9>O#%BB$6ZH{+E7FU$PV>EL%YdjAkS_nnj|OZ;RH96s=i@eMuq2 zp>73m*_SL~c6Q1&#wHo9P6SBoOBjbtbYD`680tq3>Nm{j$Bfi~3g|ZgT>|u*^1$!u zOBSIFJ?Sy}k>KbTiB?yBr}ZPn)Li?%#0z1lT?Sk@4>K=2Ywjre;h` z%~A^xMy)Xub?01YcBg)sKXbm(>}@0t$(As%aenB`xDGQjE}y4#*In7aW-5f>ZrYf_a87;rsxt-KQ?G+I$?LQ>j8lz3WeWDLUKeRyEg(}HMpK&uFVfn` z+fscQw5g}S*vI#RvBCA!=2^LCzysf7zwxb%{3 zRAH3r300uUC8jMkf<`?UM?H!!)B-ZOa#0V?J)nnL@_Y2iU-nIu9{G+QIzpY*tZOA- z>w!feOf$^!NAA5}M6sa70=RPKdmQwbWekjwDjP`1aq)48#|sn_Ko7=IkJ`yv4`!g! z=RgnLvJw{DW2|c_>thO&?WR7wF?x6%J#>V+`5Uc=cNcn8GJog+AhjM@(Bt{_W?-Uh zvw(!?ktKT6Fah*nLh5mZ(SsSNqS?@+h#b2SIel4T6!hti$T~u83TctkjS00MP76^2 zO{f4a4li=Cr&GNanNjKuD2-kFSmu#Qc_{^g$c&@NpBj;wTrHmkk$F&rFJ97yF}u%W z%r79~Wz!44ylm3Lm(2{gc$LhDLp6o>f#v#TvkTwBn{R9z{W78>)}!AvM^0*=OEuWS zixq>l_HyZ}N-(t;-u&jnnGf0h29Np{cwviW=+Z6N(w{;JE72mb(VAxnz5&?HecBM; z0nryY8nViH54Ink9OeQ9P7X)!>*wa{30RIO@?zg5u7EAy&UJ<{SZCmEfE}$f%(w*W z3};Cdws4{9xhA6ab$DawT2(#+uh20Ej-7KK1xOJ-MQlyvN%)DLV|?%x(svwv$Iw?m z-*NO6=HdjJB}WP_Q2e&!wSAroR97I${oXhti$k5<*o8MxYM8<*lybzl80WE$J%A5p~EXPqqk822o6e z>l#i@jmRmyMa`AXW9IM4-psr_hvzxj&)bw!zN1Y+@f{WP^H=>`q1Dt#8$i0s!kH4N zk|wI8QI%9=ogrwyHY9ox_rFV1&y`*OnFTz>X>(p1BjFbwhiav#?hfrT6n zqLHMEeWdE>$M5Kh2673GBAKH#IHH} z+{j6m+40R=bg|W~6eRw^TV%Z0R2`OlgGwvms+_+;Qi>B^wwteMooQ~ey$ITI=7^JM zz7wBfWJz~9haEZvS9ErKT&TJhZ0H@r9h3e1A`q|~j%UFCFrHXyCl5rZk(hN7a|cOw zHJR}}fDFn%7j0nqQh2#eT7}Jb?4y?)u6vz?&Z^}<{K#+Z{{TAj{LQFV2-sSvJ?0b1ta0^M|Kbae<7Iz z!klaU3Y_|mMv`mz~+1Q zv0{mFp}$M+^I2jn-<{wypM@;Q^fu+GUeK1S2wb!l4AsR)I$g%f&scTR5Z3Cs!&>zm zXdxx5-3GQspWXB3>@?KD3b~*f!L)xKZ-Pk`d`E1)4kjsZV0#2=6_qbK8`z3ZGH*U| z03&KyTf#Eg>kYGLL{1W^zWh{diiEIoD*(98dZWsPf}ztOBSd-avEdO>Lf{Xr!^4qA zrr2$yIWjB_my@CvzGa_BM4CvXI#)|Wf|-C}O#lr`i-vD`jhthkuVG~dZ1$9B92ILg z`?MLSa+~-GO=5^*z^}+^5?a+-NbFX6K%iqj>cnd?2c3*1Z|Hbll#a4ewK7J>#T_6X z(Xke+Q48QU!x0@Lk?Pt{1aT6yj+kL%!v}JXXt@+(LG;CR?39JCiFzceX#fb@KEPb* z=Nlw66K1Pgi?&gXzyT5%1=FevrbDv|EO|q-jfhN%CZ^7;~W8;ci0GF*Q z5zQiz>h6z4GZM6BQ@HpY@MANvqgxFGgKkxHaQ=OT=tiQt4ZvVi2f2}G5lGNZ*s)(o z#KY}l_lkB*t>#_>?H<8`H?+HZp3_V^sJE)!X}6f#VXe!o63FSFh<1@k_0mV89SK@H zC>QY0i`K1_N@2S$9XsWJS~n8a5lVG+WnQGR5i{4ED!BAP`a)n^}yW+Zgn>hh^jz@JCK^@&>u9o~4F5VvQ(VdkjZ( zj6|y6J`f#A=vc>e2n8L}C^&YVGZ#DM7O9gmLEu>%W5jkDRt^yQJBr4nUEEr-iapoorzkp!)y^en*HX??vZ zY`~vP$4)t;PO6YZbr94G`pI1BPXz&*2{X=e7|lilJc!7&DuJ3ElPI+}|6!;0K1bPY zdX|FSX;wzfR^Xvm=xl}~nlT`e>eTn8_DIm0nVw}b@{aVHEwBRUwuO$Ja+~Y zLC->N^el;5J7Kq~wRjuVTC5X7JEm4gV+Tjbhb{rOIknPhf3o5zE9{XmIIjck`k7HL zw=`-cJXfzh9)MjknyfBwq*A$NqDX{1RR#1%oyK5KwSwl zCQ2d>Zno9hFs(Z8N@z11OWx3C;6qMby$3Wy%kXeUfsEa0QxvuOor@P=e6^-Fnyl`7 zPqZm=S{LdfJzAfoR0N|M9o&Df^&wH!2oidWdqB2_K_g+esZ)tANLT)mn~jWk)k@vdlO)>5S{4UN{PM(b0h^=W-Uk7Sgu z9#{nZWUe&3x%7rG%$P--jcWBBgkA67dhv2-^9kmg(B_((9Bn$NANTIGDTrF?&Mk=4 zk0z@f?}#=9G41EDXnjhxK1Eueq0fsxB&rr5f%Zdgw4X|lP(Q+s9gRk#@!H~;T77*P zH0q%>dUSzfaUHautAA{e#k;Qm{!4~Z%j z`dEH4x0dWnaL4-dZTdYlMIKuB5@y3O0BLQ#;5?G;BLrt?uJYiLH&}%s@4K+RH55MALgKD zOocx8$H={9cXFpit$^c*dAJ|bWVPunkvmPxEv^1L=g#}@hp<}0Xdq!FbiRvwA z9Q2d9Qg6w#{laWjYjHNJow^p7R;|Lfg^&_C!*8ukq_>9n*4hX!-&*P7t+fG8FlNWy zli1YHx7J}kt5sG8kIK{{a(CM}NRq?LBoW}-CTU|plOyTPH-=xR1LIR;Grb*|dad!P zIwyQ`7wJZ?S;hH_P(N%8gZB13t^<0*`w3YOLiR)?ri)qGSmPyZIWyi?iLlgp>REcnv4d zcJnq9xgL>gTs-00g0?JcT;_x;eklq|2TG{;`G-=1FrPu(YOqD9)!LCGC2Hy|SUoAP zbw^foHgTYcoM-(W@7Fb~S39M-0;@JJy-9=8BpsvPuaxx{;gXlsCYDm}r{gxsamj&R zu^~}ia#JLQ{J_;lb=~z4GaxU-`aCOc4#qnyZQ^fSG_m!05>()R*UD;6E%JdWEoD)7 zU8G~%3z+$<$O>CO>BmOUdOFtpMLN^~ry0xAJXKo>KP_U}bjh$r81}W{B$oMDXxBp?-D0CCgmnf<2wAfktq8?Svt-McoqXsN?D9FZe#*! zdc(okj*KbJasQESjd5!G1{wSr1BNuR+j2Sr0x^3EbiNjdnW%4Yn@q^11?r^h&MaLK zp2YU>oD?gNizVoT5twUec^=a8FiKqkdGxgx`aK5HkPc~>H>DY-rD@^dFp<(s*ZVyt z-e|tg&OO#0XT2Od!xwmJrA;MP>P46loZt&J<}t z#u^zJZ9mBng&9+n|7vWQTxC#{30joOuqZ)_avem`gI0_vb7#efvVbK7s%zj>W?v6U zw(C|!x>~&sR-Ao(rOfvs2Z@k_xl)d;0fB^R)zS+f#|CuXFyXwg91%#&7#ZEdpNf^E z44FWVQaDor*~JiK`f~yaBh*L;GR4X+hVfRB(e{%JQJ67Bc~gtRIP#j z5lEVl0turt!h?r3WzjqT+ajBguJon8h@Kp(>raLNXPnE5XwR4N3)*?~e>Ngf%|!H^MW z5{)QFS`6w_6n!WPn>|E%d`4SH8rqA}>BbmQ+$;ed44lgBsgUHI$93ldg1Y|=TFKN( zIm!V!$V`Nd9P@7$Iha=6HVJYpV!WL&HY`WPO6uFov7t@Bf~1h61#J>m!i_J!MIwlc zxu-x7Sji=@l4LTXQ(;j!nr=iXffWD}CRbf4N`J=N32SaQwG*+D+V-N{A1g`|GJzAiI4*)7%9ipupAsXWF%VJUXHm@ zRfE;^S|$znm%`zD#Y9Mw{)FyKn0*{1;d{kIzE^Mx3TY$>*3peLLv#f(2lf5=kOtSt zP@40u*Ms(KxiR3H{4G|P1x%?gx8O@b9)x+~F%gC_s<>Xi6!09Ce=#T!Mv`DI zV}#js6LP>zi|m&`nC4k1cv1U;C(e#B&@yI*?gLI`_E{))_(Ca`boJXB8t7S-{wi{z z?|_5aV6Lo(pR>+q@FN*THwTzt^#6i~Y{#1I_H@3ePEzJVs88lw1k} zSs(@?N``SO9uj_q$yk=kXuU#|5qVeCWVL8DOUuo01m?FhW=Ns;htOjFpbWJ`u~9ap-V{+g7Gw<~=eSGsxCN>`H+BR1GP z3s!?08`EO5eHz)~9S=8@kCI;#0LT<}XL;N5ZxY6~Z+WTe7p-)7GgQ<~V4ovKuA8HY z@;maW<#=nc7q(#V(5I|;^A;~Fk3MDP{HAf_;FTfmF)Tlg&3h@aon|O^+Vp`{Ue9trvR=I}YNu!K`^LyMJ} zn49!M-a)z68@{9$YICiITx&({Q7d!(wIvDJxaTiEv#vG{hgqCsWZ~rNu)#v#;42$S z%*E_J`!5yta2IYy9|u9$ca|XN8`)Gc(YdeHryfOZWMSKtFAMvJhGhjO;@Z^8iP&TZ z+Az|5q>UggFI=^(*M%c+8~Vky!~@GlKF>HcCa%A$c{<8DzI{3A%5x;&1t)saW%C#F z%wV3*=C5?pjw3B%_AKXQryMNju$)hDVw<<#cCR}t21Z{WqITja}ATNG8T!Qt*u zJ%=wl;d3o*dr20M^EpVuvKe5}`69`~2#F*US#~~)CWA;aQ6wQpv?LD=k4Qq!h$JUd zl2f!KnO6yJNfq_rh{mJ}VYMMuW5NJ2Ia4I5K}aN-KupdgCS(vvCWs{Dh?b&m7XHS%#`v^BlQ$gONDxxP-jM$+<081$>PP=7}Rwrw)qBj6K)iR z>m^>iI;y}z^~^BcZed$D&7yUI--^`adP*n9Bj%tTn@}bZH{Z4yH7LfBBNb+a2ey1ka+pcqhT*SGm>F#i?I;dwDS_5u3>3u~AWe*fr7UXH#_ zRlLY=IP26?MZErewHK>bWGENMt$*JDYw{$LZS=IRDETMzvm|o3e}n3IZC7mi9$d`( zr#oX>isfdoZ4QOrdYdtXqve z`J>}}*eP7Ty|pAKocX~f1!lv8`MW$D)C{Dkk{`&BYYo-d8LZ9l3w0@#!?%S-T!tFr zeUxG0>~rFn`n2g(<=B$=oYpl}zCcNVH!um;rmQlWeh5utzR6@P7jQYT!yat?b{D`` zS370G75FGKV5z)6Vb+zKr^a4Q9T6$tVhT0Pblg}Z%h!AR!G~*`eOQ23$#;sXrU$Sa13+J{#xtS61OZkKAK%801a7G2jg_k4eX2IS8urr5NvqBq1h) zF`wUpo-*jqfj?O7m3SSIhsFjQ;0q*v*rBxq79h7HMhaZvyErcyWdP#uvxj{FTdwnV z4sWSQL$b`RtK*7~z=w_k1oW2|RL+HUEAg@`S*c&oM-AZ}nB1*Yy zRknQLu~XrPA|&ya1(T1Bnhrh3iIvGK$>!DpEI75Wm%+-GbT%pLE|Ys(NL1BJP$9N0 z{$*DI*$A^DbGe_68`w+GFkXCVG-H!6YUyYF1=5qC6|GyD2H_Z1g~uRGtGs?UzZt^> z6@Pd{RBRyQ@sA7=3E*s ztuYVAk3UiD$#$gki=jkPF(VULUh_ z3)M)726>9S7B5QQs5bIGbhGyM%Qe(iFKjl$-`pb{`j|2H!bMd40<5v{XM^NNgY=j0 zKRj5KW7LW1Pq(}v{b`%Qs{0f@SiScjJy^Le->bpu&Z!*?Rs}HEy&kOIngIBs2PGM- zUc{cgjs~j-h5ma6t93{bJy^}hCvP<5GBL2oUe7GlQAdMS^%c7vtcI|Ei{3zRJ3BwU zfuPM`^%&3d&3FdU9G^H?%?}SdziY7CdLfZv7Gk)+XRvxykJB9tRwv*TNQZ;fzi#`# zAFOi6vjOdLuu6T<8LXO$q$lrquxdh0@6BL!_{Gj(rJj~vwuL=WPuTKa4OUAgM>94d zZCLtU4^}T7g*3Ywtg;t4gVk@?27^wiQ98A@gVk?mu=1nE{WgPDtxnwWU{x!L^e#U`{=FHj9zA_GgO&X^*(Ho;bNz^_u*hSt;J4xbuxPTTb_`f9+ReAuX^^Pu-Wh&6Q@0V`-9`=k0_=_R=mjU zL*I_sLq2A9GCxYy{XOX0a;=Z}<672QDCo1^)bAvi!mab+77RD0mIf7DrbOy1nTO~W z81=IonNHH&Skv+2TG@UGTM%9|*hEbxCCZffJYZ$)8;_JiG-McKs!O%)+q53ClTV zdobd@?;~-1)0WE%($s~86qdgXZOMcJ296{Z7b$WKgNi8w_$L^{0C0o zMvJMhPe6PaOI$J?B_w|Qa=bngi|(4o+DBJnr~~A~N6E2uTo%~{cw!gDkQla6hOMW= zhMpa4UF*6ez{6igPbE}szPXldOPQWfwr%!x&Zk{+q~iBpt% z@&yW=?q+DeK3~5)-Lp`?Jgu5&UY@eCDLp&Q&BN06cyy%e)ar4J+L2MV^ZXLrcDhj= z-`d(5YzVGwJ{YtcHSJmq4MOWQthO?HC^Y{DJF-^2?CGWBIGxc7riVRXz-?#J9L# zC*zw38h?r1ts`zj1b<-HZAKnhuH2}e?Ai%S7N>H_qHbk2$Dn(nDOkGPs4Al=$C7eg zG-WU;mpGIlW)&M%w;r9ulJSlIi{_KdwqIJ@y=;4SaYEVlAteW71UIP0n{hmROI)!q z^ex+dEaL{3B%^-7i)VImJlEy;YkWI6tgZMLt9`v1ife>3f@`E5>DPC;1;%>;tuTz4 zw#2!c3ptn3zr~45XxGS`9@Wmf8Tf)`ym^k7FFl6pcDyZ`$Yfg_FJA!o2WqW&#LF?4 zf1q+|!9VY?R;ZFa?0=bcb?%rJa4&4QEdBiA{V@5$+#vK3R&rluxtJ1Ro{_1S<8Y6u zUaee-Wv%)odoj37HoTT(tr~}HvV!TEWv%BY$xl1P#GZgy+0|%a-DC#d2e^j?ZOyF8 z_(lpAbGrFXl;zf9)Mzc*qW(G3qaQUxsJ?!|3*m6_I>GbdDg-!~yOM}E^ zLS1j?7Wq9>Ac>M$q)J5J5t@rlsL+2>Nm6Fn&Oyc9*iu4Qgo(XKEJ*~)A^Clkvep|r z0IDYzbOBTWN-t1(K&>56G!Fra#t{qDPIOB$*U&)q1_OX%0suvJh)W{WN){)VOKmOZ z0I2!}0#rJXNLQQB74^}FavGaR)^c$O6jtJ7MV(~z$ytU|{|JZ%%Eg$UyC78zP%IKx zNdc(w7_T#f8`ZhEw1NX-cc3=7129~F7clYxM!p&iWZHqjRv}=pO~iunJ$oeQ(hfz7 z4#;vgz#u!oAQ50RiGzbhIR9}rzO}_aQ=@=M zI~dpv2n@CG#KQ0m`m87zmVyB=Facm7J76FYFf0}ayTk01Fa8D?p1WUQz}oFtA9q7G@qg6>%_w zBa{4JfEKGi%`t$R_%X#*qtJ-k>0g5+qJI@UZS;RAM*m7MKz}BH{$z)6Btri(adI(S zrF@Y`{pXARRM4#&F`h#Jx9E>G=<@7RiGb#K7aU)z-j)?hFyMTxR6TyI^9By8F^zy_ zs1IPu&3VvvP_dg;e=(-p9Ec9g-1=HvanH=)Y8jT$RWuJI7djM1bkp7Upk{mq1hEHx zBbI#e;N!}I{tI?Niz@CSYvKuBYYnz>d0W?nhGKe}RXG3zyv`T09x!k@cWGgQVTStf z1PYA~KO*=8#tm6O1||(>aUBRB=hVIT0T}VEwC}m9s|0RCyOPx~yPYCPrx&zPz!M=+t~@c%MgR@LdkWdC6SkXkF9% zXe2^UQtzL|yO-9hTmGu=R?65#{M9Dj-6nqa#X9|2I-Ur}RbknpRX!|ocGsId6J8M9 zm;*#EXX5d-Rc*%q^3CWt43N3QzQ`T+zuaM4aTgONv_oU9{6I9YV4@n0lSfqdh!{M! z!uq(<9v-A|*=ua-cff$u2|9Ig7v>*VCFA&RP*1XtX`9hJ$;cFLpW9mL^9<(rUQ9at zSwUA8Zm1eUy1EnFvPp!%N&Yo3?Xqoyiu*~_ElyNP_p)u1Ft^$^t0X~g|0DzM2OFa9 z{uy&(oxViOxNO^yk}lXf8#ilE*|x#-?u?stMA^1u>HRHk*1=`lE~U3MZq|Nf+ppVgv}+D*F|N5YzP@9HN#|gX5kj5M+M@HZvxR^~B!%24S2nW5q7>7?KwFv(deW3& zcip4~J&%zeZyQ5dIZ~h)gzP(wZb=m z+Q%Fk9B;kjUEp}x*YOWcnKKe}BH6>XW)Evc+A=4{QsXr>uiuX5;In60`i&8@yA6Z- zp67;{;EJ){bYvrT6ewJQuK74Mh1 zwGK0Oc8$GtqLWH`2`v#?W!9~UtE$rULB$7|T$u>nXLO=LOavMdVMe?#Pv0Hb{iV6^U7z)re11~4}m02mVhFtS535}{siab&VT zJO_Zq-zk7)0Fexps%Ie?8n9%t;>TIw5U>mYhCM}c7*h4g7Qm3qP9&SmSLjormdIq^ zfd=KXV3mRnF?1Rxb_SUsKDx1Q=&7v^^V!`%G=THw@HGE2;MEQy7s?Qb*wkYoI^>=h zh_-+M5HSHDB0EGR5eg}BWSYOf7Z81Rhd`vK`3ZW)Vy5{`WG$B+7=$Q1%_mv?GFl)) zGWlMmA!=ky&utw;#DdiiXe^<_Fu&E1;Kgt^kQ_)0$FGdTYVy?t;L{Eg_H+UX`?*+1 z;_r@uq!tW-gb4r%*#QZOP++MzGTGlb29RvHT_Dku{U7j^1_EHrW;0t%)^c$ONqDkP zvijmQ!x^v_kxi_IKGni)0D96FV>K*TeTwD~>W-??kl+=N%||z+AK;5=NG{rNc;Y`A z__Tv$0g?zLHSokj@;$o`r{}2x10Y!-jy~G1H)a5mN)VwRC;rXZfaImy1QI>*|1?Jw zH530bvX=Yl5R&l3pJDZ8rs2eWIf4haZ+yFpCd4AuTQK~nS!-mdy`M&9)opd5pTZ}6 zc1XSxbwAaqxf9oG%%P2}N&wFpZ6#RR&uGW#$yj7jFfTF{L$}YBDZcS-ds44qrK#1o zLT#DWZtkYnu+mgLXk4@cCuhDJ!V!AYn5;U7{wWTU_&ljG^dr^A4(W;Ng%0UG z)B_#TyQ`Z!r1w-;cS!H1&W+GVa$!xcoa!%k&$S?ZK=ai_Vy_ zpb;W6F%aC@$$_AFe?YM42Ms|2wxc#>n?{DC*g?m@;=$oTqRFrG}t z1$)6bij3Fq1>;CEp1Bu{)2|$gyIS^wao{vC?nvIV)-?}-@$J1}oU;XtkM9LzuM>~Q zU66ahIEjq;d%@^C35-Mcg7FM8cG(NYv1I%>Y0vQFkny>_VDysFYR@RU(z!#OXCpa8 z`KSU+^<~&RWPY%fS?q2$w6MmS_n(N)Yx_j_3om>Gk&T|T1-_Jh? zbBmdtQ{zhdq5YqN{$LcA2u_a6wKkcPG}(bZ%^1$VV;jY52FtzeB%JK6%;x#bkyub! zEu1Ie%uR2!Vf3)(<{qpaabx{%RR|o%Pn9@<_{UYKIq(mtkoxDTu=%h1tin6!jed76 zymI27RtsnCy9x*Fl?nr64QU)yn35UzQ!ME}Y5QCa>__)p4Q+I2PXF_CNZEHCg6PBc ztV5dy{SWByCsjk~(0#6kHRua}w+g-YT?L%}>-qU`oZyqr^_?O6tjJDW*t=&%&~Zn1 zu8T$_x_->WwHf=;z2eTjp6-Y$$L+f+!~TdWCqb1T_Ei(Kj;=y2)@f1VD5_Fac@-Ty#6y!9v6!|Z(@Hmb0n>37@GW&5r}xO3{Z?<%ZM`~xcF zLxn$SHh$&4TT=JEQlZTp>f7Oe-W+P<;C&vqvEuUkEy)iZ_HGX4>_)`IQ+X*`0?@ZWhhwXiQ@_!2Fr9+ zdLg{#R)+y0uR_^|NG-00rnBdqaW>x|y& zo|_@>`A(j5zm+^YN`M_3NN^bw3`B{q4P=QeCH>lF&81v0W`Ge3=-i>f#rq*c^s-{A z+IE9pR!mjyRZP7C)uNfoydCu=7cf`<)< zSzrTZbWg-Xv3AeUvG@Y?Dn!P|CLe4jk4w>cSl!RUg06*+E#p8!*Hj~?gF(dh>5jXm z43*?**O1Y1;0NY(*Yy2yyK2a3YSU3|8#4MZ*^G~_X(B!cbXqCZ7mC=mN0vIG* zs{&CQR>KWcK2pJm-o?e$_<-TG&=;C@3%$r89cxHE@wFnpxGOfwKF?Z=^a4+QqmwW` zLE@{4Htu&CpxbalcEuMZ`|;xMl5X(I4G$&FMMf#MMT^UPcF(H(p)Q=z;jYLX*!_TS zU1vryP0>u&1c#}UFb#}i%G6BXe&8^57N+Ruh&oz1F#jUMopG zD(ip>_g+LAfEj%x@1~r1bRJt~{{_Dzx&c{qg1ZqejJ*!4kM{|Y3y`5Ae0kSd;8!Q* zhxpd2U(iwT!wplfL#pm@*GH!&QBoflm3p<;zC*6Zp_yES2(NXArxu)E%UqjNfMqk} zn^Y0vUd^aJ@jaz0{rYxEh7aWI1dF)udhL0hr;(cqt;bi*aNz4nFmL`GE@F5L&DLIa ztzfAl|7Dn@$%Z6-NtG|qn^yzzL$5E8pBS3hMwVl>Ec)W+cJe%&8ZD2-{QrY1APFf0 zyu)c=R`5R0EeznMxWT;IX&|ral4x8YH#n z!xWRzF6NN|?TblM*Bllp2DjP3y5tVQ{6w>pRJJJUb~n*8gw4h~ceS)@IrG5F3*@(N zrFX!*5sf|4vGVJm^bt4Sjt0$NB>*8a$nHY!Y1F^b2^QT`Hy~-a8$eRG^aYP);m$#% zbIZ*+y>kPH`mFrK+`xH>$R(8>nBHv3i@L&xE%dJrGE*;FR4O+-p^>@i+9^qY;q+*p zkkxzFaE4?8+c}m+CD6a=RNo zK?rALCS%uwmKAJb%_j@nJYiQ02kBi&eauLO-=$2~pN8*JIEjGsVQB6Td+vt`V^G57 zRp|dX?j%+8lpB3^bV{oDK>Io;RXmE#c{2Xtgu{-6q>8_xjp=*!aT%Hm0I zF41Y!Se=GmwS;MqA4|miY6WJVhJ}B-<(K@p!VX~4C?i57lER_ko+1!-3Loyq6&sX> zezo8n_P&j3T4Dme_3A2o8{b3)qg0Clz`vNPWS~`*j|swcDiil^QI(Iwi>hR(>VXC) zE6*ed3dng96>&&k&HD^iZ(pk`LOdS3(fSfPZ2 zGQq7AsF(egSnp$PsFVVXYgIw-%m}lb0}y6Mi{R>h%%E&MdbobYVherR@<9I&Y{N+c z1yM3tWPEYDCWFE1nQ6L~#4{b5YvgexCcF5Id{{w4!W3eQAj)U^2l#$AGeg~dM!aZb z)vQ~de)T{eiv@E9&2C}`>^8>J@dKH}k3z$!JevxrwzJyqe@Uh@ur$*p< zDj4Atc)w6u=+baY#8iP!1R`< zh=nN=57?MrGh=LyZWsouBdpSkXLGVNObsINPa39#4Rfy~v=LbiQ^bbBjr+U2R5xbB zocEn>7*R=1%+(FUOx2rvxW1`ZCmfHqI1{bH$}AGB8LL0l#i3W3SL@0Y&&-J|?|l8p zedCq%%+sk*CZA*))shUbT5^QMty2$wCM`Jxv1jiNx~x z4eY8#D{H>a2iy1Xp^@tU+sS&=|I>%KEJCv0L)jW9gL_GqhnbrhUw)*?qE|ipYfYAT z4#5;avcxlwqcq5pR3IypsqOiQgFXW+vJREFbt?H&A*&a>Ad8`DYClaDp)IoLbjYGF znk@P$m53tijgvH4Yd^5adKhJEq{%#zrN|IwMz21a_32gb|4Nf3o}{BS>kA+#+0F!D zeSSS;6A1uC0{u9cnsnRHTL>LZHv=rX-;%g>>V8c(ABF?n3{}&y7-Mr1+Lbo17Qbv# z!G^xzi?rEu<8_xIgsR7ef?xs;uv~iTm=>NK_Q*x_m>K;~(Tzy2`f94CRynX@yqS_-rTers< z+pYHaH>5`4#Iyq;qlhewDB7%7y#P{Z{3ogc+guUV55+35r4F0I;9(95Go$zE%&A^A zypNo$DnlV3#Xwu*Z&}@V$4=29)!c+?8I`Bu7Xe=87ch!CAEm>hR#uJrJ`_y9%Az*z zHk2h(fE3k-T}XDc)I>iRX{P?;en>lSn?kwCc8bN`Ivq>7swwGh!B#8;>?ICtUZuch z)<72%m&R>bT)p}$8VUlyG_wVjZW(%nej{Ws9uogFOfTwC{S>{Lj)2_iW-K;+hAhDY zxSRba7zpRK*o|Pm;1!8@|1fR~R84;Mce(Rgf^%}qS`vc2@tYXzhu@^&5d0 zOWr84gUu9}E6(+HIK3`%u|mUWJYT-o}=rP7TfB&Vrt*5pA~5Cl4UWi&hfU zbe(z#az-ZcAPKdfM1Zo=XXd3Bp7b_1PuQM0TA@+f8A?pLffdB!+zOQ+RffWQ@3x9Zhk%uY6{D z%&X{6OhP@zz1HwYghi)9{mjgaNp(XTsisP*4QkqVU~!1@(Cx$+9xo-XwA6Fgw<(=^ zWpC1{V6a%{P})-iE8%&6kwAL(q3k z3e_gExpmtX`HXGUT7{{7sOQoe4_afaccdCEVc0CZ5kK9*E*g3MpE?)&fuG}Hhds=H8n!6)2iKFn203N=pT96J8jMf&y zYR4LRN(bIaM}ILmD3;I|1L@$GE;1{m>ZG`uo~yNdj0Y%Vn3&9i&x%D}|p zbU#d724LdS+=w;1BNc<;)D3FH5xnu0o?p2j4Mi+*+-w*P{_+)=k{0sGu)xp-q>)!17Lr0q87u zZ{rrKPH8p}($vr8;*PZVGVa^P`Pf`S*ejWf<*xmn;y@jKvbgPpivVh$^aV_lUgW8f zFSrLjPA^*_>qK7k;)=-3vSkm!l~8(8wFFgG+zxN3;%)}QwlNt7Rmi|V)#3To3mK7L zc}YqbCap~(QFo5UWRTR1#bFm~(!{$ci0~T+sk=8}Fz$oeBTecomKL^I=}tQetK;Sr z6vB!;Ix6yO7?WyTj7ZG@m*RTgpCdk8wc7(OfN|hBM(Ea?j8K5h8t&T_a=Q`F0%gc~ zj@v)bntsFO()77#+g$b4q0*YU z`U22Yf|kpJvmQoU_v{#~K03&PgndSW;aPD(Ebn4r!SN^HM%^+{{hC==?mL)61UQRn z%H_#a4>(G^7GMrDhyZ#37-0%rfrA%Jp>tl)3qCT%3z-P zhF2~;2*06OLCY)nAzxtBm+OS|t99KiNDMLr!?W1@;5M1~GOB+BP-)>Yaag;j%N>JDPDAL&o{K z9*lEXTQQ!7mX;bBY*=CH?;H(qpONl|;chgz`!r06yfZ4Yf{|Eg;XbCYQr&QimCk9+ zN{?p%seS$Ob9BhoLk#khS!O02v9rv*B{A$Y9RM6=q9K=9}r5LDLiV?z6zXD4!MHEXhSItt^m8Qm{xq;JnZ=bbT>rjV* zXtDkvH5^Arv1~;=j5!<(r`d{?rpC(@FAbzd!`(OpTmtkGc}7&^iH!V!g^@)JE^Kas zCvIpOe+cT&zPoxqI&v$1;);qx)AzAMQ{b`~UTOjqS1kDWvDJ*f#!DTKQQg5uy)P0z z!u|!8SM>w(<6O;6->=fZ6B-7V;F^C|TLlZxc|7?<_3Io-1 z#llD8{&Nwd<>su)5VxIhF+d}%Vw&`VRkjGa1r!vJRrKSW6(UE#ZPv17k0U~sDh#Tu zxEsHr3LZg3Emat(mnw{iELE67eTrEkeyPH&+0H%JfdhJ@>PVAnJ`W|wqL1!L=;vXq z;C0MA9=R5S^^9|~hnx4~|EW)_kHI!ziW@)I;n@V(t(f4QB3VrEUdId?u|I+| z>l$1P#QT@s*wd-?)oVQ4hpw|^od6*a_qW-tE)IU>20QZJp(7+I`;6yN*1A3-R0$Yc z{1Zo~gN?APZGSn2f51snUA&{Ms%O zUjsSJn(#uMEl*J)o*9*Z!ay$E&({+0_5;mOP|!5@vuGYfnz@B|hVx{_;a0OSBi$DtTxp^%nnL{>L`O+z#6h!^7Ti zB_|;oR)I<01!e4pMl+v=myK=?{QSdyHrsJ#InJdR@-2WRjx*hHrZ~<@FpC9S<~UuB zvsuUUoLB5>m=(py31e#!KW4`7yT}~PKy}F&8C%6&#<@KL>?3e_1wS54w&FES0ql>% z<$$@2ZaGVS7dPMa1j)%};wY=*Zb>tT^3H%LCW)wSqgo11*1PeMNL{v!znI9rN9psb zL$D#0Ht*kXLu?w8Y%V)M?2i29R1_kz9m@e8?8sTWvQ}c<#;%pF;V9*7$vjL@B?<6s zJ;5;?GY~UUrhH^aKG}^q?$isA)ZUR_%mqqhN6x_*wZxAHb6nJpoI%QuK}M%EQwV8R zC^RJJMt;nUt{Y^UW1wm{Uz$SPFZmfQ5(0Iixb1{n0IGW@_T%(mlGCUcY$Q%}*UR*N zT)eU$-;4;EL3;v%Oh66O&C-fuYgp>j{M5!L|)3sG(>7Xpv|3b z5g#_?tipIsxRFe1Z^>UcunityUlJZ*Pm1M%sT@%q9#{+j@BkBl2MCT*G7vnlNItSP zzcL9taB`9GKrR|NS6$dunl)FibM7T*c?CZnMq68R`jrm@8yEn|%o_M<9w=?zZgfxx z0<$@3df-6+f;blvxjieDa$JsKc^s&rqK51nZXuyV@Xnuvn@8(hAM8sFBV9q#XAfPR2>H1VMKoAMJbJg(TTBEVIpvjY}#QIsj)YM%?cla z(Ft<-F*6cD7FdmeYTdcg3B=um<$?p8Ltq%m#K(hDi`PnY-;ba#f;AfuRu9qpeTUS3 z!~s(KqzI|>mMt5EU)eFx!5u>d!z(LjEhbcP90MIv8K_BR1W66UbiAan>5SX0y?7$FSKpwy-VC=!3DT6`NI}6vAd@ zaKy6NIu2|Oo6Q6O*o+ClW&}s2Fc3^JT|QzZXf@P*)PhmMW_lC)yqTkP*&A16IAs8f_{Ae3rV6$I|Dv^Fr`($PTaVXP`XATkIET)0n6dw;T zi`N2lF@p%82M`f9qX%rJ^Ibq;1=;NUuZ7L%g|HOA!e(@6He&?XjM56oO&N?zu|{DA zYBpnpu-R|GW=s;rW>N@YGfS9p#K9uWV7O|0PqW+M4nN^33Y*m+m5*mNrm~|i11D-$ z%OSvXZO@aW>P4^fr&Z3wI2U-9XJoTfp%=I(#c0 zb0LZF7#G5^JT|2;hR2!!03Krk@EE~Soebo_BcDPvX~q@bgU3$t36GJ9JZhYt);(a8a;i%N`rK>M6JcXh7Y6{@{9IRlk3yHMVOl}`OxbXX+UjjB|qM!T?8GPrXW;ebWSXINX(e3u8(jnk6xGu##(oo0zq zhEt3ZJ~B{sjrT;vp9-E4(b9=l{HY?l;(Hag6&D=8`(eO7`ay{IVsuxsQAs{C^;JLm zhf)bvKuxT8`YT-h8I=e z68z90Vc(&WgrnIY_O{p}xIt8ZAdE%j_GPQsMz^S!;L(Z2BrBODwNpu!GRd~1 zJCnQ)he`4}m1I7X9Mq{KbD89APiM%#fk_s3D#@Qcu&GtrsU$^x zk>u=7C3yz7$y8dWlKlP=Bzfnk&XC{h3y}YpP9>SZBsX*_N#2)8a!#j`oXRBWok}u* zN!~rOGvs@i+^M ztAlW3I|w(hgK)_mgnOrV$Li(j4#LgvAl#%5!VT*nT+a@|?KrGM^x_6yuw}4I_39W} zfKMa1>M-`n1b@E6;FlA;y2Ieb1iz%i;O7&3V28m+5&Xx@j#lJ31h4Nf_%MP$)M4;x zJ+U~S-eK?~4+VH$hr#c;7vMcQ4DR^=i`b8Pb+l%FMewIP41U3f0I%pU_-KM(*kSN| zg7@n%_?ZN6KD48xo=Wgn+XL6v+V^G`_@K8bh}|zUiEBYyr;VxI^kLVZ%M#i3+xDA; zu0Mr@^q-G}H@5CK3HjiGPPf8iAN*{saN7QpFgK$kB*fW+8wL`7F1x_@Z`to=Sk@sU z*>N;%+Wzy=@Z;wFreW7lv6B63(9kiPcKbB+U9$fqocdEpaP2<{vklzZL9eepL{b#Gu&|%wm4~c7yE$`xK?ftXT9I*@h zkNv0Nwho!hj-#R9dp{oyJ@=o6mC%yvbUVE8Gq%Iz{hu~keu}B=^M6JfUfut85Y^qz zKGX5>JNwN`wr%4R_Me2AP=4w(E6oB4Ka*|anm6}*-hPJqu={L0yvc{FJb9s7=y<_&W5DZEqc%ci1x7PGju{1B@Gs(# zx=#!$9QQT!aPZ8|H(L1tR!szf?o>JI06}1zU|`x@riFcGoU}o0;Ipsz;AZ)%siKQ< zxsRF{ux+=GD!v|SV{KP)zqe2aKlW{_ilL3{RPkG{>pDQ7RB><)sy9aE11G{%`FM-w zN}d2heZz>wu2UgwyQP8Js==(N8Z1(oU1_@prYmA=u$Z+_qzzs`|Et{^%vGDa5J7Ye z`j|G?uE9rat%Egq7mdUG8VI9n@ZRUCu*ExDZSY`h z4c_J6R}DT4{iD6q;21&Behp4U@-}NwYh#V)wHsWxDU&{kdu*TUn>K#qKfJ5;$=mJK ziv@N2rf*z{PS{Zy`G6=+=g%Y?LF>F2|WH$EWROn=O|>>}<20 zY;}aX#>zH3o_s!X+6MV}P8=g8xFhr*RQZfHNzIC>@+>D$9if^J*Q8qZk{nXs-PLBE zkt)9cd4eJ5t||k$RI;R99ZW5kV`_<4_&CS5y(;BRS5tTBL)*w3^mezh4QBrULhVyxX*(&NPJb9=hGL@G}McLlY!x6epN^5synsq7>7P>GLx3;})r;ga(PKu5wo0;e16R*Y?0u$Xdwbdp>SkM>s}nJq!tUK7 z5NR2+rjuhSKx*JrU%ZYjm9d5fx9Nw{Y>e&g6XMG96cl(k4_())ECXZ8Vi5Nk*Xy!~ z=PRsizDYZHo_8Lz(T2e3l)?nO)73<~Bon;Tr5Ivi8`r`Y>*4g_HJlq)mtN5->wiF_ z$*zWg_ga-MbwF1$)?=_qHBIuv*UGF|?R?E5dx96HtwHkyZ;6<=wv1{2XV;0C3fnTK zy%9T>wvB1uy+?`>W8&JU+&@Ngf@y2X2}ZR+)kWs>6}^{)4s~eDX$g5hXH52 zG3^|6(GQWFV75zg%8eM)UVn3Y#UHUi{gcv#_gKor_b~2VEKhc=>5Yf@bCT1VTw4L`*=I&^M#+4q# zedf*Sc>4jyIQ30bKDuqB`OLe#TL7c-ft>w=o&Ze7|4VrJLGO0U|04VxKotBmDZkQ+ z7dZGO9pVYc^h`&1!V#Y7d?qYc@{5kUSo|5oU*#%mz67hThhh}8Jp(pyt>q+G#00SG z$*+gSmH-=iFtN!bkx@I)W}TM7YRw^BXo0r~3m)?cjFV=n<(GU# zX&#L#g+Zc4lEGcxK?Fkm@A{+W4*Jy-pOK>ZUgoOiJjStoqq-5_#?w&YsM;(<@Gqun z8E94Qad477&i+KIwjaExT81hwxPX*3bLvE?oA@;|jt%La!C>`84_zzbIT*${q7x`4 zK+oXU!=51lXbgdVX1N264IC3L#?&Y6!mpX};-7R*3|8eF{$`N+%L#6D6jU%g&?7QkH2l3;41cp?R9Yj(;HsCjS@x(7kPkp+T1g}i zVCrNh^sva4Qpd36Zu!gT2T4;ce+j>4hI&`C1%uU+gLUPJ=jy*od(A|IuoQ4}bwJ!@ zlGet>YZxd!Gl;eWe>s8B_}d=T>_NXWKhf;L+*QdVgqZJLM9+@{QG@WXQPpD`(WSef z*J4$68DbF=Wk{MK7Ps(S5OPb}=fW+Q!V7L;sM^WJ2>K51M}yFomAdWdRcq2Uq2dX{ zU>Ivg06|?A6M#$j^^i*>0QD@;cf1k{?IASAD}IqR%cf467pWy-B$(s`qL1jTEdg<2z%=vA{0(iJV9t&8<) zS3IM{gI>c_psbSLXv!F1Pbd<%PJM{Wi!g0}8@!o;LR*y4=}<;rG-dR+ zrtF?KHDzXnMcGv-UgN`nC1u4-V`glt)s)ez9!}Mii6>+&8w3!<6fprh3BMk85(z+~ z3iPkZ=ZE%cZrs~RvASa1ozHc|_Ci=YG zYNCfQe`&MOyxQpV!Io5R^!jY&ZcTF&3a0L74*;3;kYGe2=@3boX#qC(?HL5ZXrRwZGYL!I7QZT^(y>3knc1tDsdSGAg&_@;o5LxIV_e% zCwp%fYYpbXk&KnQn0Z_UV^F@itD4}}_XoAfGTiyJYz*5M6lYp%er@Y~ddz`9wosb7 zx+kQ%4|JnccRPi(FMWVM6L0I>g1s*Tu-7@T$3pA}*v$BgqCRshnG)wA{~VM7>OOxG~FN*J5ZSWE-~Z?QTFGmZ!jE&yw>ElP~Bh(pU1 ztH)$EYSu-t9<}qa#+JYo08wI3I>GCu3%k+@-hp&^>B6}Ky>J!T1VBbxukw))Er>hG zK4eqGYa?nJf9Yj1t_(PE71S^S$ zNj^|IiDz%t*yV(BjGR&GgA3TshH-uJ*;M`h;DuY+Z_%if+kX%f8vPjcudA#v8X zLEV7B@O|W#Q-I$&kjS^6Zq=n)@D`atA9Aov*$mE9mwl)U>tSJG>jisxGJ3W$o29V* zS=hnt73kY8Z4~Ge1csjx_5}_*PrfA^F$&L|pGN~hbYU;sid)-vzZ;0+t-@DIj!vrd zR<`6z+DLVQgl$yg?*p}SSCxV5As@M%oQ8)j*W;nWl{lu_k)@`bi}AC3Rn|&|)W{F- zLtA$utHFa``_f)s=_^;RwE08>(fR>%Zo+1w`RO690wcK$Ql=mOwWlSJRO@fqj!B@h z<`Z*VA>uMPA-cdGFTcJuvN#`Ea4k*EnVNN0<5AA5fkvkk^4f!hvZv zqc0t#;&eJlMG+mOVhSCk;ubnc#R57=#S?UpijU|Z6}#ym6$f(#4l1V1il$;uef4fw-U2Lx8M;@_=&cS;ZgAs(7U2%bB`^>-bY6g-M?y~}rZ3uesSeL2?5 ze1p;u;de{|v^#Bo7!B2<($#A_ECwJuXk2;Kus5+jDmJC}_(slCcNf|b>aP^j7|EXEw{R^y-})x;Kj z|C83mU<Ha~D`PIZB0i>;F}dkVMa9GtS<7uQjHGHG#`ZLaoVqAMi zPW^&)d&aeFgd4mp6iRk5OV*PmgCSQb*}qfT;RlRiGTJ<__Y&CoCj^h=Ab1!Xxo7$A zD}(4xlh~cEYP(D@KE|hb?J<#Z1Xfh#UV4;|Jv-2Wl5i+n#YiF=de+!K?5)s}@Ys={Q+}H7~-GI>(R6N!yqE-*9 zN3_=pG3D?2Q_9~p(g>$m<4V`|lS7>H!kkapp>Miz!#Wt9T%QrTBd>h1+ z|DaBn-yV|>;+T8|EC1cSRK9SKag|dVtMtM_&rOLB*Bo@rR3|*X^wIMz_@`&5%Wsbs z(kJV1utE|(-wO$xR&u^_N@UkR!?Rk2>n^-7Dm$Pgg^uqGL^-v2DW&im9KA;%YilNUV~&u}2n@Sq^NkNmvq2e$(!b=jU3P{C*V`ZkHq`|4z(z zG*-;QRJF&s_I&sKezs2xSFW^HCr`GQt6c?eM&%mQUwY=Tzq}X~ZP$ce09cC|8_&AE zHeO8op)&r);_ZXaaL6bX*JWR=cv{pHrAg4OI5;Xiw(PO|gayM;E*OTjS0a0?zmS|Y znT^?n6K-tzBkOOD^*-Z*O!dz5@!Z9s$ZuFf(Fu@L*^?7QJJ_+wg2Hc{ok{I&Pa(9p zjTNY0HD;MWiV+N_jUtF1(9v1gk?(Nmboe#4oRO{)!!KK{8K9uOQN(WN1>ZWQcFGbN zUvG|zcFGc4-+Nmx9?kxX`aYQZot~`kOIhDWdu(iXp37S0Ytx??JdW!_ARbD@R}%3g zBEE`f_hrD@d;s$83rZ*R%YLsPO0-v&)|x?9ZZO;<=I~ zn#4uZRb2E*(LuuUc1cL$22Qrw0)sRQtg(B?UM6~3C|(xTcXTsb3&o;V5!OO66crIo zhaN4W$8WTUr}ORMEO|Yo{u+ytFZMzSmy89in?sh2?xQ{dN5cueWz z>c8*))PG;rKi};k2@M=L+982U!`AalLmtD|L`^Jq{Zm3Qti5?8W^m(t5F9Iv$84MSFopvxJ?Rn4RGBQPpM@udl zyJw!{3N24iXRJzgL9zh|fy?Fz7gV3^7cb%88cF&o(x9BLSV>z};+0aIgdio;BT+Wq zu7otUre>%6$`6LaeDXmd_eFGs+~@NXJNUOIsNb7ybKi2wqeB(_N_Dr_i0J-G|YAigstv-Jfns#N*EMinUq4^0QoN6}O{9 z#2o1L7uHMt_F^2dto@Q1HuH@3iO<=zcwUxo&*BGXr&|1<53{8>dN`E_TsdlKV=~W4 zPD?1ARueEM@%hth0A4Qd(#9N!1cAHNfyhJqdZwyRa?`818r88;*o;@DyeqOnns^pV+4zc>p{b zm%T!T#ygm&3kSbi$R{CihR5}dkIXE`fO7KNRG9V;XpnB<`Cl$Wav7`qNPueRM+Ju)=y4*_BEam{)H*a zSJ@V0MY|LQ->SA?LuMW5@W9$5W-W&@*EE@2t7|ZrTYC}kfyxWga6Zf<=dOo#b2S#2W%&|WXmm; zjF}JhM;)zK1v^+*>(#Y?=F#>lm>Vzhl@}Cw@|F^l&m338*e@Pp>cciHBq3hLe@2-N;fG4p&|l8Uf#lmSw#f`&UL>g{sGWJ6w&xDbuC; znO~`)XR#$}tA+}YQF}F1cBx%M|9mB?hWumYGN0Y5K#wPjctVBC5xSbLUL03VgPW{s zy2hK$SJKUl^Z&?d+MtdMvzj)jkq@&XR->BG;RqM+`Pl(jaPWMZ1W86xscpP0WU7Y@I_N3{h1_%Sn-+54h>xqZOhs*Qz+@b=pFFwzLuetV_D4eX*5|l?D}l>DPe$M&3|x*t zoENSVPUYBIex}-n?1RHl-uL0M4>eO?hey>nas*5b!L2Vv8L2POEq0hwpCZUV2vUCL z{cvk6cfu9HGLImY8p}+$Z7kQ&t+8A|kgGM8NpNc{m%tUlaxOv6)>zJl+s1M#-5SdP zf*dPYFydFckAWYbKK#feVrHbkJ@{4iB`yk~_hMxzlY_oQQoXgZ&sST4;!Zx-D+5IQ zRK(>&ht@Bs>nDk7I&?B6i=FNz@F$d>5^_II2M${2!i>)`LlNHcY6`}q3+LM>5| z@_XPH{JrP^{vWo);Qs<%2mkwwG*fdn;D%k><$n_ps>s2=1%AQ5kq+R0nkby|KMJpd z{~kt~sYU1G22KSwX-|4P_U+~{X2k>7*6b}AN;dStz$4E1^_UXax;V%G$ zs&Vl9;1~SE=>UE&Q8@TB;C1kKWu%$fd}q7m|8X<$XFK>^L`(kp4iUuv4!%+NH^A%Q ze}$1|YS~#Qv{(LT0HGRSD%h%@rSJ>>r|1CwyNJRme+9e_{u>!-rY?Q7-S(XZ2sPco zKOKI-KZOq94-kce|4eut{DT;2rY=4W7bDwl-(vxx(jEL+@C*K<=m7p?qHys4=dEb` zpTP(Gm0R2GU+)4!EwPVXce=O3FZegp0sJo!g@gY|c%AY;#7HxB`nGoQF93upa`4{^ zzu>=v4&V)s*%4FcW^ke;pmbKb9yQ`~~nj_)lY`nOf7_Zuw6D zgqrT)&xT*{_oD;&yAy?j|Hn6?@&6k>;9tC`-TwOtAXK`8U%@Z<-=_okR}qDS{~36l z@;}Z<)PF&{^|KHVY6(mNTJ^ICe!+ha9l$?}C>;FL;C1j{&Pee8sCMy>1B5Da@E5}` z_|KyQ_=gaMga24~9sIo*X{P30)Gq#1K&Ykg8vmdfd3JqaLT^`UI+hej5Jg4y|i8YvjL&99sFhR3;rAF0R9O? z;ovWX*TFxWk!I?a_VJ$r2-UDXQa?HH3;scL0Dn)SaPYg~b?|@py5O%|+wS=G1t8RP z2Y(a%g8wr*fPXzvIQW;r>)?Nik>Jmp+O3~Q0in_z{EOii{14Fq{PT#y!CwlmgMSJm zf&cM#=l4qip_Wi1S&t7T@C*L&bO8S_qHyq^0I!4pC`MxaW3)TJX8=MKIruZ-7yM~- z0ROkI#o+%0UI+hXMq>P#-!A?QfKW{^sb!VF0e->1h7RC=f+(EwFND{@e+MJYRP|V! z^%E<98iN&ScJV4wpR#g<+O{UykS_>O^PS zdc*bVDQLoDQ00t5|y6{i}+`_0=LZ;ogVieyQPmpV|U z=d83+CddTwTJveNbc3s^AOX9}zrA-7Hw%wp4~ROHL!21GWjD~l{eY1=t^w_FAL;>{ zsq^VJ=_YTXLdtjK(xwEYN^AW*O~Tu~P-E4lF+!>bic0AcB#$T`66NxVig9>PTWkx+ zPMW4jZLt%tzv;^i71mvbj5~OV!<5?#?-9S{PWl74x;C(g8Okg8 zL6yh@Wj5dw)zN@*g}``5KBj){ysDxBnWG~A+DEeDg#q;&$;t+35&-vZiXW;fpur4j ztd8SFb+e8suIY!Z@q+bm8aki=R;BQE7PG=LohU?AMJ?PuW10SZSA%N-K0MI}iBCFi z>3=x6pyK1SiW4Ec@Ku%0q~c~bUOT{9a`_6J)~)spU9c1g=C})C7^J@sXLq(_ruKbQ z%z*7alQJLcO?bT13gAMc31wIU7alY9RTWatbcG37+wZrrt>8zPdiGA{1CP8zzZlSX zppPF9qamA_iAtqkEv~X4@!~7Nj0%4A_BU@ScZH!9XCg<2s(XS$^}TTW%9ruek~VJ; zB|2XTf6EGA)i|GBhUZxZ1AdCa z5Z<~hGgua%lw}+)8Po=>hnLGM%A`D16m6|VF-lMj22mn+oFTnrYU|a+Z_1^d6A+6R z+oZe6TWum0n&1~{8AK{O-8Zb~XgfOOo<@hybYHdt=LA*m^Wcpp^aV@UeA{&(_0lb< zb}f3WQv;4A9UO_O+(#po9xAlFCLMk)Bk2lPL`JfE9fp-7iNr|#5^h^Y@*&+?MzWb8 z2?UXm2k6v`ZyoM3>TFR+l%S#G<6F$I7%i*lpuFUNHa#EI8{^05X+5hqcgJGkogKIg zp#_kIgIfylW_kIKiD_mpNQHgIJ8LQ)0TBOc3J34>mG8k#v$gQ~=C+jKGyBSbITD6u zY9m8O1qV6~9T>I?A)PxRP_;}La4CNWGpWVSc##=CFgH61o-;3#xWe4QuftwFg?@a= z`K$0~pLt#ahK(GIG>a=>CH(?493t@ma{(?^EobkpQ)fvE1~dh#W>5D?ZpR5m3MOwweNMuTy3=?^wT1dv_0?@YmDSvK42%hwlkUE4IQ2nb{1xL}IK~rA&o|fPx z{)r*sdl^(%GM|aTv+qM9zAnKafzh?FNS)1T!sG~3;47OwHlef!hMT;qWUmw|q45rs zrFz_01EAMKiBpUz)fm!n4pjIWKP@~R>C}w>^sd2P+RJ94_h_H-QDYy_CKRMd zk)SJ_+eSv+nbFG~BkGo->7plm8S&jxj44F9K$hdPQJAgsg)G*;Ha<54>$KCB|7cI3aSyf_PJeq*3M{zBTb%xc#eq$HQk&B%E zK2MX8tA2|rVn(@YQKcp$S6Yu`hjAR78xvkpou|TB#fI2*$MAWMfe38(A zF%o^X7ej9Xte86rc(c?acM53<`tXj6Xp(d>rgzrDWp|)Fur=A4=6S2!Zk|6i*v(US z+g_XJ<~i*)&xX-4&2#5Q-8@}ES)_Tk*Elpd&2u;UA!)h)cA+7k3VQ)P*Ee@h89uYe1k4dJQ`ia&3f2_n;S`3aQ*ksHHGgp^E-VRf ziD_O%cQ)p%muMbBURU209!->p&q8y3dkd^Gp{qQwkzEBrRRtbBXH`pz0%a>#W? zW`KazXZwIX2Xhv?FmraT^!I|?}qQic`^+dUfm-XkF_hJ?0F_TH47+_L0^j!&n!M#XfQixx&!vA&%JS&sg-Vsdxk7{KFFH z3(Y^9;j{S%OQ2Z(`5gx?y#x~e!4l}1rA!cM6)b_4Frdn;#Rp5EI)2P&bYNjI*l8MV zLSPFOFdD<-edf7b0-+KzR?or`=sc-e_^~30EP;kf3I-@-xCj^>wm^om%Bp&ja~5)< z&tfeO1^>pSY)osXkVfOjfUy~r`peHiPk}*Nmw)a}DP{Q1o>FL>o#Jn)jb8BG#qlkQ z+J4BKz|quVzgJ~){RdKI(Pv^oRy7U-VPOtvoeL`w0RvvF>PYWpxMq;zYgulAV3^OS zzZql~Suu~26N>2<0 zjOj5w@z!UYnEl!)mF?H>phNq z_u27Xs8!W3p|odpzV|rVMb8TrB=9FOAv`OR2!r!j@3FF%A0jD^O~AY6p#tbq0X#v2 z7v@#3qO21A%>D99&Ia234|oD1Z`@YnFaJK_mOfgcCSbbH8YOyuA*?CO?BdyVtSrlu zOBE8^b2vO=Zw4466@a_<^)$K`bcbrYgp*+CmD*%JfVl9@5@Gq! z<1_E_-i~Ni-rrtMc8PsU2Ea1k1n*>c6+=V$zOmA?EJjv?7Z^pK#+T^6pUkALRlWM>YU*0mtG99Y9V0bn-kH#~nhB^?P@|g3 zs7rrKMXOJ3bwVmw=|V884|AFB4Q%MAs?=M%a&Ex}A1w<1(OB3Few|Q%fr2%5aD~Pj zd1Ys4)7C2j6N_;Yu&Ji7;`OxKZo6CFbU*CqA+d}WUX2v2BpNpi8rTX zQ(IFwaa&;Mmf2@o96AwDRZx)o*DW9$;+3+T;lZQh;_ivW9UpYJ6if>LxqS8{SK95o zQXQbOT^l9yO)Qv%8P(_OUjU0Zg}K1(Q-8*;jG4sL?-UM!tY7T1kfNB-_+l}aG3!QF z^jhU#1rU+_AlQm#_?0(nd{_WLtquE4tiq`iXv1KV@u4M(2)pUV7+9-bP)aEs ztjYgA%qpWn$wOJ8hGXK!cX}8~r%GwJ+ zsXNp)A^aPF-U6!(XG7N7U^5LQ!r0_AFr!r1iU5mbmE}wb9u*zW$R@C%jvNGAAJ13^ zNk|OIF!ts`AEaDoXsA$EEaYpDDc5>a*f8d!(r>gijR~+fdZ|cp*|Ti%1v((4$ChrQ zNG{&Pbs%se7%^h*xkjV}jW9i=Ia&+=pO4L1bOJONhC&4;L_b#Uu&T2idV8}jlC1}Z z#rJT|CFA3k(Pr{tHTl)qFgiIQ*d4!vf?e=?M(F@OAr)f41P!bG1E3SivAYEucxQvu za3LL)jE~9 zc%&mww9FoVgkB9QVO*poII_^#P&i<{zvWdwB+M1Hw+x9QpwM`;aKIas=4b*$9Nd)j4Q1~r#+a}&MuE8q z+z;(#ur2D#KM}ThU^Rc1yYU0ig4VFRB-j{N-}146E*x4n<50FH&Qigc&$CX{?3WM6 z^^J4Q{JP8$TPl<5ky1CcWVLLp zSO&>Xk%!3EeZja?`K&Am-=H{*JW&^sg!z=lvGbtcGBw%Mkkrb8J*3XddPeP;J}Q6Ff{jGcc6@Vz!Lk$I>S z&<5nwguJ#RkY^Jzzax;@gzViB$U~O^vgsv@^1YRF;8TDMbp-Nr=Kf$uAXA8QMn@nI zBBZY)kW$VgI|BLZCxP?Z7dt?E4s&1IKIGNw($VI9N%tfBf*MGuTlNKYH=&C61(i;y zliP=K_;C+uP3Z{aB;tJUg}7QdAhn@Ku1jz897EwE(6=ViLgRyg@r1Wl285@zK}1e2 z6*OL1XzbyNc@EcUZJv8vI}PU^`N-8e_b8^gTtD7agvU;}F~WYSPBmgf%E___OR}h! zQA(&Oz`naylyPePLqoF?`R>NMfut=Xs(T(;P`xE@=Stj4%PZU6w-f@L+Jx}A;j`hp ztTfHnQtLp52MWlsI>g_y^6augtHsW0He2P30!cisV#;DX9S7Y8z0o2#?2RmLRLgU0zAc>gDFJW6`R+w%g~){~|C$hnUmX5^ z47p#;i0WYj3g)%o2y_7&FAv8-8y?ihL1#dMz^UhCh`L&W$J6d+R-ixR9Dyoqm_&Ag zV@z3kC`~v=9;gi&S&;q4YI&@D`NFP%+y`; zvRrB->k89SHreai3jhfA%FeHvnSQRB%w3R<#k$D!;XRjKtXY9>!g8WzP2)nI*2=QN zUY|i?&gC^07g$=4@p1DC%`q`S_^og7+rEh-u&~$y{+x`uvsJ<%3tR!V2n<~jSyEuZ ztNGygXUPYn%(1nZ;J4%b#*cFCtgl`zQcjaD4UTt%;L$1&8&x91T2_Yd@Eh;Qu|edi zq;+aLFveT$d!1qBtFj?!yo@UW-{ty3r=`f25-^|&14+kL?6^joJ@LfNO5e~GzZr;c zz${LX`EN9pk+SiB(&Pb6zO+|xl(EHE@ityEF;<4%VH)v67AfRl3wc%Q(7)=7D>2fC z_3JBMotsS+!|`;3?eSuhTAX70E}}2p^5xz^pAA{Ll0J_W z_v>c*vb3*k-idkeWoutUkBRih9;j2Z@sVYKzJ;DARb5k(9me zY?te%d_a)O+#^P~idK$%Hs48ZuR)8 z(gRhwDK#tes%fp!9+8S7C*r)P2$7_hiz-}yhIRy3OIhVy0;eY6qw=dD;Ns2&lCufu zl^AJoNC21Iyre59VvQBmeHcT0fvSthK3Kt0Cg~J9>Hw%!`N#2OnsQ5hI=$2fQK5Pk zLoS58bX!6uIjyEH%$kB6G76Mta8BpL)kMN@Sb*^3ssCW+GN%D1pTTPiatW&Yb^v!2 z17<-!PdG6L)+Qvo%4g@gO0Di_6y&$m1tww(kLY!3NB=Ia&`7ABJOl)QOH8Yn4_8fK zVnKc(Zt)E*$e{w?uHZ4zhcYtY^H7GHWa`P_M6r-Z?S-ho!YrJ*q@slILSE3=X0iI~ zVkJUL><@aA5Ld78st;HqU+SCla!S`{SO3mJn{o0c)~xhV{TJgA5h^x6Cq7aR}v zi$BU(3hL~CU44kyRRi)Vvu()-pP)lPW9j z!FNqX4SxBT_N)Y)E&*w#*_AjStreV-+Ce550_OO{K-B^wn{0HQTqQT|eQD3>uQ@Eq zhKHz{K!xVT$$=`tlxHMDn-pQt;==Fg;tqDViq_Z_S+`D%%p@`F;3XorTbbM>5|!q` zi3vrPpJCh*)vUw)MzS}%_62IlL7a#sLN4E%3nt;_dXxy;Z_M+S0VI(2+yde&yn0(U zRzaB}$Tp`Fw|5jpVihyt4y3&@{fKkTo_G-sSj$&ra>+b&0b6a(0fEyOvdw}gPIwYD^I4-Gr6eQGe$UCJNC2V2pZWgruQ6 zzv_Cd*oH`9tmr}`#PQjmsnU3-S|^2$A^6D$^!x)UYzyDeHEHFixZA4c1iOu@6Dupk z9>4rnRvgN7X)lWpwuW0~9f>MEc1~shdPkSi&T!A)VfI~c3GECw_**_~d@^~T__IGmZvRH=)$1G$o&f+wswhME4VVvoN6{v!+@$U6mCXEFxtS z5HESO0}}-JFNgV56{YyrxS;om`i9B#u}`kj^c~bDeKEZ^d*9S8L6)Fyv3wRT!bej#`mYXkMgYk+7-;wq)q>eLmG_D)^)PE1e1fca3&Tr(?MD8d{CAS%7C+A77D1dO$UHcI320{ z!j|JviLHrCu{yNhNJR0o_TFxpSWQjEiB(CU>e6CO(}Rm0nlOA20r0qfN`qZm41$V4 z&~;?P;i#;DfiP(H0D`Cm5?o;7Yom;w4M-g|gmBqNZR9+R zAq_K*3RKZd#<*Nilv7nWgeOp%u$7OKu=C6buR(HMbx8Q|yrlu;i{fS7uh-}JsGfV= zfWp>SvS@q}#|x4{#bVZgxuBPP^ki|O7n6l)GDzj+cXfp*rIDdsT|X4i<;yq_!PGGd zOqb6nPVrSO)J_;%3IHe!`I5}KkOhPfYLVHvu>{YqhPq%6_h=oH;W!H`|I1~`Nu6A< zS=?@N{rV_9)VVuqNtdmPYRkmesY7xQJTz3AEvL1RYv6@BK&qE7;872r&5>kxNg%h~ zDX>J}xLgV@z>5gH68?bkh?gEp#Ms{*`46mb94;?Lrp=oN!03p1y{!nhgOR;U4aM+N zjYr_%_8FFnMDY?-EnXvGzl%Hol3(rf=Hr6bpt70XV}dF8^#=38Gr#er9j_ss_a;sK z?xZN8^RdaDmy<;5Am9{XI*A)l2;x2ldRWu9l8c=vC_&~!OM%+!d{ASVm9T^f!MhvP z*8wE_8xq#YN!ffUqZ$pOc$U;ZfUI??1%prBY+(S?^BD$USON^;Yhqt+9&wm{X!AV1 zeJQ)e>n(-+ZkW6Xod=~E?=ht(W5Bw&07k7~_6mD0{8+`zR)<=di{@f=D1vOAY^EQV1uhcT3X_VrQe=wJbLzxrfQ`A#tHe0H7Q~)VFj?qV?I5mdr9s^%CJ7 z)Ug7_BuW6SmkIN$bJ36Tz5N1dFXy6Cl~igoDi!1Gd1HsT&Nho9Z{T?|1ZF>`!}Edw)akXn)#s z+B=EfVR;tph4h_hr}WY1v3+OI*TeP=q%S!%B85*h=Qw<04~_9-oQeJJqr8`q)=}{r?_s zGj@COrG3#KpZ@ z>!4McaRae4elR^o{a#F-#$;(oo?kt|+Y9F%NPfUxlJ9%GjvsI0{rk(m@%Z+)KB&>t zTk7v(RHLrGsH#I1b#GKgcKhtBejIwc5^YzW z8l`a|(5pjDDZH~k>yv$zFM7Vu%CDA{Om*v(Om#y+HC8g%)g6Pf_ay;GgDE}sQeeD9%b_JhD&qT+uj!pOtj+Uvuh_vgxgf6M<<(_`N%{SBjCvX?4~ zIKw{z4y(%nt<~iKAe~Uoa#>C6d*J;{R!$pz?HoL$+yCA6F_v?? zn7o($(Z2RilZhZv5aeJG;E0REv)CcGdpH|W4U@TjJbp6z%*m56c4Twd9fV=`M0?zP z<`|5d3x98qn>9cb*+E9e-R|Mzm=7}vdx)$rP#kTem_Za5M^MCdHS}E;*S!~dWqo%* zI{^Q6{c8+r47J^@Anm!=^6(bm7ME+rRNM28%k`T}{N>nsr!pvCSSc}l0TNu02*XLQ zOZe9Os!Xt0Limiy1?GLOEC{jEo?Ey4gKjV43YhD_tq8r}<<+4FZp}B|*6=W^1Gud^ zE!2EzFu=Yuh-SbrOdUyTcifC4Kx*CF4?WX>f~6GhH(v84ZMN0H>ebqzxG89S1j7wb zBVQFTOA=AmY~&L%8c(o|Avw0=N7Pj%tnTa@?Fd9JU>;9xS9MNd#3?3Npt{-Bd98Lpig}hXV zAnS6EmvM!TAV4tJDxCoMdTtUSptcXdCx<|eqdw2s!q&#iTV$pDv^ShEzpA3D_0H?DH6u>neD zsAjE7o25n-vx%R z_&N!o2tyA;_q4TAVd$QcaGGPFC6*i>e?b}5_zqSMY9q%a&*C_bcRBK_CwYfdyjm)X zn>d~eLAH&{j6;eri49b@t;P@lhc9VMxE6Wj*ykqkLmzUHp$}Tf?6XjEt%KSc%pIZ| zV+26ZTNnb-t?-m^i&DKkXj}UE=fjv+JIyFV#9StcooZ%r+_Rtq$6mnX>Z z0qs1i7%5U4C~`7NjIt)*mQa=KjgG{Tx2^#UJ|yq91gb};2w|F#w7)k&xf7KN6iYcG zH6fptT0kWeBY`9vD0r?y|HlFHnv3NCc@aKp)B8L?22AY6qK)?Wzq_7{V~RHN$Jm{^ z;1*nmc(sb^L#e-_dzp3@(EX37@JF?K9K-LU+f2QJ?&JkL15Z7g?&iDTHd1%ZhP#w7 zQVH5Z3cE^fHC74kM1WcfZs`7)KU15S;D-fTF%|*t=MZ3lfGZ(A&^BXIA0ptu8A-1E zYV>KuV9$@0Yd>{6a)w2Le$ZKGccuO{1_G$1vx9OQ$ougLxWNUQp(~`OfPJbPs(B#@ z^Avfec&Gb8V22WQ4VpaUzJs1M?mT=_zycxnc(`JX{&^4%(trOnlpCg2f?RM&5!LJq z|CES&pr^_`1j%Ad1!n406H;*_Q4LThZZ{5E5bXJX& zy@(pQ&`O6IuTxK!CP{8tNVV-|n5cDc!7u;TxOZAEoIR!i;hNlJ&Li+`AfV-g`5UW6 zL+tL{=j_k)o*PBLWmYR2CE2XYx+c0%&|91tUQK4U|R z&~R9Zh$%@fXitSPt?&tS4TKA6#yM%$tl%I7#Cc5m?D{UQMzR$+@XVbzfjD`I;|sVf zPBvf%8G!k>qV6~Xd4LH1M#mJr-FmKW&O zSe_!t2LvfU^RIAgEPsM4g5@rPEY(;l;kL2NqFZCRo*)lsEJNVdSO&lq!Ez))W@s!u z;I^@Jp<845{ahPG(^iT7wtG8lCU zK8gW<}oCA;Xn*QI#n+9SW8pw5VhiWhuc?~jWOw1 zm9Zc^{f5Sbd-^-PYVs4XUK7D;oHNA1_!BVojbN%i2e0?oWwUQec&r5ztLgx%5|otF z^t16j?N9|lJrqeST6xhYmimoq)m%_NT&&+!-IxyaxOK`+h9;WpzHCu@`VN=E1RdU| zve5C7s#tXOsubva#(S3HOZm;2uHa$XW9!0<$zv9S_L8Ac)rMw@u8{w>`uK(3 zSRLA5>f@LCz=ZQ(J3jtz=YI(KhOTW(@z9#@_7(rXo&I0S|I7IG%lP%n`2F9yzW-(X z`(^z5pB(?9))P@qhYKB-UVuaaML8WP$JN38=wMnP(Pt}J#x~;{vE!zm6e$XhIJ9hO z==7dEe)}-FpO!-=%lo?XNfWtQF^6`6qC)4p32-Ei=?Es zs>(c(-CK9usKoHd2T8oZmp1Prh|L1VXCgv`4eI1J3=3FP(sJoZ(+-C=#t!>cjy$74 zuFDy?E~f=`W=7R1y4WqBxN#v;zuw_D3S8MRin75nhpd|`V7Lk>F9tPr{+60rl$iPr zz6h$zh|09?NG>>$M-ubAyhO>fr(AmOwLCdA`a2zGli!@4g(SQK`7(;CU9h(5S~JgE z23Qa)>Jr5Ot-DBr7OOuH6pfCvC|-udRYP3mweB^-Go8U69th_I0F}!lmho(vZOv}U zV!W!!gD8>O4^xlmLJ?v5s#EneN9W@GVta z0E*|XS_D*a+9lc&l9Avm-~OGi3illkCWuZJIMe<2@Z^ZxH3WTvQD(r^vnC>W1^c3V`OUEi)La>u zcuue}x*s*+faxiu7?u957%tcWWg>JdBe0Nf?&)nS)GBm@A1r+ViMnOT^`s0wn zE~Ds(xgWa9TrTKGC58`!ah?Dai~K_yW~br`Wd6ZDX|ZcX`16%$uY*A>RkLt>>QU#s z#nU&qSQ>`s;Igz2m!)Cd6Iuv75V!6~KlE#A{7HJi=0w$BjLMfscTYc!aKJ3yHQwpa zY>28to?oB}(}znHR-J_^eBvw~yshykt=2V^kK+sf&=og0^-h}rNc1+KQSU(}x)F&m zU@(z%rhMbVxJ0Qs(PKK%940y&iD0eR;wS_5CAOixGTB}*Y5sPe&fm7sJGOUEC~K@% zFX7rdNVX0XsI`Q~*-Mj2L!!x~snBFQ(WPRWY{uaIXtJ6&I@)AArncE+ohp10)EHt5 zf5N^Ce`hqm-5Jeqn>KZ{@Pq8a-`O*c-#S(PJ_p2>-%&a6nWy}9%s`hh;)uE1rR(r; zcQ7Zzi8wwRx?*-eOoHe^OZSO^8%)piFJjr;+0nM^BZO<>e=Sqc6~-ig=tZ zs&-eFasqRnD25uo*eokfr=tiVr27A`cO~FWRBOA?A{DCyDH;~FYLqId z^|orEhz(6)LK8$mDFTWH5iH(|*eXgZOX-z#sJHqf?)#2cue*R=EiKSO5y~Q~3vyAX z)CEux5y=03=ggU8lC(|I1PZOsBhyTBmN|3Ici!{8-;&Kouf(#J85gOd>9w_ij$zDr zpD|QbJM0pQe45;siJICzkQ#A)1C&o`ywC2Z0t)%cC&a+?FQ2v= zOA({!C(M8-<@A@DCZwKgXdXSWB8Yk9UMF*Jt!Ey2z3ETa1p21Cjq~%SgIX`2wQE2g zOi@C5&X>?Dzw1Sl2VbrZ^a)cPK2I3b^Ih#DuOBg_G=>il_C(+Vt;-h#+~uNM^j!|B zzi-2Y%5#6w$*&!Yz2C*GM1HywwGt)i57058`=+Q={{hcI$gp39!tjcI! zz|zK3()9m4(6{r%&Ge{R9b94u^}Nd)dfs!YLw?@xMhE`9LskX)ybH$G|Ge+$XPSyv zI{ly<>r`DZVjAIV_ z6IdGK4D=-+CylorC!-zKuKO-C@k?MERhChS#%ojSV5b4k-C@-#_5B6*Je`mY!J~E2 zPE((UMykQ_e4D=Y{gp@iuq3WwX5E7kwGRC$w-(-qVU5EovAV8hgL*Q4!p@KEqtC#q z!xGeZyzDif-S7A4^ryPs_j7dmb9Q9rzwb<_XZ>yQ+V3Lpe(2Q5PK$8yx`f=tE@pWS zVlZRrXvwl8SYU#CF%y@}5})D=A!96Cp9heCP|8^jM7Z4!cOQuGBpmV{IEAvRtx|@J zp}iIU3Ur$+ei6|%?OD2qzj02s<*Y`uNEoXk93$L1kvYO9uVJv$&LiZe+j)ds2_O@u zOB6uJv%d;O{?@t)3s0O?xh)9mEvqrT(nit6)#{JUELywUcjmJQ+!pX z|B5|rlDxGfW(-L&MDSn1(0`LsYy{Dx7AB%AG>- zt(0f3f;}_-klGeILx4=RP!HJ=a zJj?Em#T!xsyn zVNkA~h5J4`}M}VB%0?dTAT^JB7Wwxp;qO@we>N=EYGsWta?7>C*J#)yl#v+hbbPm}l<5 zo#~nKF0Pu$l)tdZqY}(=`Qzq4{<6sHGUdIhS_w)MyW{H&Ip&F?vW|0QOf&5Zqs_6| zp0h1(P@mr2^0IwyXQbwKi_J@CA?eS;QZktrPQk3iA}p>=!sX-_aZyhD4>>RR7M_#e z?Zn#Q_`T3?$-_i@8M38YOzj;sAT%;G^?CWiX}zQFzl{HFk*6i{zxcmw7CJWBbJoQT zlt&w4EY4Bt_pYqob=P_RRL)4~lVQrch~MKQ2s3S_@l?xX%D+RMgaKQQ0Xtxk_o}@_ zt0rE|m0{9y!(dUUEjxP~e7eJL*yK?Lt7A37Qpp3H!woS$KN~P7*AVOHZoc6}?Ji!` z#(~a$P)Q>K7wkdB7ffNzY|=?(J((L^>Ye3$rqfV<99O54BO?L1do+cca@BnR8(y-_Yb_ z*qx<{8c=LA#ws87C9T3{wmfZ+j0ppsJq!b8n#h4}Ix;gtCOlV)0B)jPNc+O(IF0^tklLVVis)Q~pN#=C2Gn?o+eV)-J~CsK|82|C4GiuUo)twaL@e zC$u^5QYVDXnWNrw-o?{6bQ8mYw`XPfh3MTeMJ}~kxOAwOMp|$)cyW*e@-Xlv)yigg z?Wq+xYAnU8Ss=!0c>#}-2@$BeWw7~K4M7JqimeES)0G+I>Jn87cPee|(bOkxGc}RGr{`p@P@;~P zDt#67lkbdr_`a$>MA1W!D6Tt!BZ`B=eGx_Nd>x`-dcIH)1$zQzK8*@`jm?`Ls3A;Y zQ87iPiYW%^frBTe7@+@3%mP1{qNH9-fuRyxGq!N1#beN7Dls%a{?rZ>3PTm})CNxh z8fOiT5`-%DBikM%Gf+j$95^uAi+1K`aJ;a}IK*LzMS#`HyfgWorPxY04wmDhlpV|4 zvB;MI7)v#P!3)Hrmb!%=0E5kK9^jD!pL$?M#<0d=#=HLs9A+S}Az;S-vA!^ajW8r7 z+{7S$%*;ntb5z}RGo81|N0q`+!fQwkB$7m0PRgX3iYO}vOxScBT#p050ylneI{pER z;8RvBuh+E;4z|#oqPNuCsxDco6ZoJhvu+Jo;A@4??`+S-im1#@)H0#G8 z41)Kn@TGb?6H7aBQAWJthA(WI(ni14IM|tQjIF)V4PVT}1Th3-&8aYE%K2^MYi}X( z=?B52@E*w-Isl^xxm9fz^;eTg4k}--?PXRuu7gslv;&%9$PT-i*=gxuFwY#g#c#w*4tg688!ob;f&Q$MlX-xOl(~*24`47@-@e~N5wM_f5`+#4lc@>FL>Y? zp*dh>NL7)LnY==&R=dmhds0;p&CVK zZ)n9kLP6ukJBxN44ZI_N>>uxJ+r-4yZ@4J8J>80T1S&Zu@yQ0`iczlfuFvnEAZ2|dINn= z{IpH~RrvAKfpy`=PrKg;KYqFAZGe21Tv@t74{8VKNV$HM|#_OY+qk*5CulvVO zTb3~~xEB}YR=E{F9n<(}HX=^*2Vj1;5of$M+!;>%^vvh2_^AQ>WQA!Hvv45W0_A#@ zwt`UxJ|g6DCXzs&$*piC*$gY3wZv8rk%t>$TGC!UuRbs!7ih{qIr@g4WRc97- zUl2^1us0>+nI+>?xl0FK5`r`qF1*(ib^nm$GX5^o%n1cu#cR1n zH42>t^8hl7`;vcAX=XN{;)97^lK8;FM3%ZOuo$8Y#$M=6)n4c=)n4dry-|=SdU`|u zRrt}n+Y7M*Jwmk?>U>G#=xM-%fupAcW-pY8 zoX$aMpUh{qMDzq7a7*#Oc^CpRG}8>76R={`>>6Zxc4ws?MX5&3nes+&bLRtMOD7wY zZ-lw?0$O7%YN=|+0%MGX%s#mtjCptY+~)==8<|~3`g3TwxQ1+0%=^mQH8xtMo*3gyQ8v1~0eTkbs)n=yU8x24PX$4>FFP0>|+NIJN|`DKdK56eZMa zQ`8S;Z+ec+XogLZ5i?9Rkgmt3h}t>BsM!=HkWCRxmwauC5$53JXvC(d|3W53PRB)ASbui}*f03r9v(aEb&EZq8&f*z z^-bj9)syL)7U}d&)|R%$*U0$XBq-1p6U-t!K2%=ydZoFIo|eMOtx1&O!x~!SAcLH}$jI9e>tp1-PW2@) zDD&t0S9yK^E|aS+T$CwO-RR7t>H%}|4TjoLZeZr|-9S0t5LbI^J*cb^3-4{P@XqfR zXK@M_HgZvG)WX{bl=*j2YskVI4Lc`wbK7I99(Ni@o2I&`{VT&cyjz?O0mIkI2n%o3 zX-UPfbTb2XZiYfkf8LtALwpVu0`(Y)5; zj<(m@DF2|WZGeW}t3w85r#E8g&HdJxp|_!aL+{t$V!~qvh<{zCpgK}f2E?%di=DWJfra~{KET# z-NK`igWSSbQvo_I9)EsX0vzfTzE{yshQkVClc{Q95z)uj4>XJl->2SkPx1ig_sgHF z_`kdF{2s}oK7_?y@87D&!JDeb!P|Pb0?+xqK>w8(Uq2p}$@O|zs*8dohZ?pam+ASH zSN5KuF4>?1H>@Z0Z7|r=s`5HB=mJlp!F}Sq0ypqq!LM>lkbxWabZva4CQS==r7lnM zU8%-u$CIQ;Xw@>YtRgSgni)7mp8%-$Ngo@>XXvfZ{UWt zud;n@7cR<}JKUhyqs}ZR9QtancY|V8TWNP3u;*+tlD0Cw_V#*kv8JsQz}Hjl#~dpM zf~tb+qtIps6uTh<+5H%z;Q)bkuI%8G|8sJ4(bq9>{@KofJO%hRWc|)vtr6rZz z9yMy4dceNm<>k8)ow=zVuSWe=s*FiR=XB4-ib0#6iXc?t8xIY6MsFfY6H5V-5g3bC zZ-$zaLJ&A8=8zFOb@=yI0j-t_9+f4H3(_}r>*empITF697hbELTyE5#T!!G};^CXx zN9UVLu{C&f1;%`w_Tvd&+GB5z)K~l*RE}AX)JvemRp+#4c#Y2W9aQxE{Q0U1IPCoV zZc%aLa816Zw`?}`DwiBJEF8K{Nv-*!4$_^A+(v*NxTMJ^n*Y4y27AyD*N6AKNct}- zINr;L$~&Lm z`8;8;JUliQ`UV8kMWnOk%D>l~AXxKdT9gf55UhD^-P;~fHavq^t5c$$^V_zLjibVq zcLt6MId5Kb{&9>78)m!Jc`$aZ9v}uwb-$_YbSjv0Q{8uS0q1d_sBS(>tn%;@NLds5yA{N+P=KlC)ij|*^7&T#nPM`|)4wmYja{3!6DDw-)Q9jA>$VY}aI9&ESd z1i9_=Ku4eLPPtgy0wWqhL$KYmttv`!=uyfrj#32M-QN?XBzU3}F=H=6Lh^=*?&tkO zm1C3W&h@WTJ*6I~l5V94MKGl!V={yvLSQasyov%+N%e(bZn%fzU1rfby;0#-1cgi( z0=p7}&Dq_@sE{HTi9J!LW4a~?t*w9mi|uCzp_LQ%gY1yxV?Q`a?Tlah!EmCUMNjHb zkIo;X0sBT92_--qzx@jkIxSwzp_4h*7dl-`@gc$koo*xY8PI70T>+hL*OSqn(CJqF zS7Ms@QI$~^4FAxnVf-K& zCL0F*L{)jD^b>KPMM6K3=IRzDC{7X6G=Ugc_)HY1+Aaxt@ppYVF8Cu&;Nlv*(+JggDjkcM(u!sv;>o^#WVEQ7b92+QO}v5hA?DBAWIUJyPg|5RsL-2INX+arsY61? zqO<&chgXZ4L8O$MZaC!wv7PrO54(=DzXO+sSlLCK>@UN77h6Iq|Unpux#;!d?+ zy3K~{L`Y2J=WE-k2Ji2kBEq;U1LLbc3!Y;J>n495dagO@=jZ5(&y@a|eov1;pD6=0 zeV)NSk2Yn~2UZ9vK*rJsRstW88ASa#K1_!9_EbttNrCRO?app=9cy=DF!9F({DE=9 z&+v!QQasu;HFM4l33Ve%E%JUb8Xk_2c(azyrrIYD!RP`N4{d|w08|{RYa?A#MV?SN zi1R$5a2L;J6%Vz{$xc9)=Q8wP8pSf~++-bNz0rEp@e^V{ASGURT2vnCfr2Fw%Q1jn zQ?D8;JC|1W1OC4AMcQ1lnn#@0d>CaFuClsPP^IJ61^d| z_8y3d()y;76MvhMoBZ!;e-KW|FM) zqxCSY;)E#n&6HTbnmueB!($N=9*YQ>im^74Wfx16w*#92Nc1D_Si7Q=kc^QHU6QCe z)^@$9K`5U{jemPEbkQ(F(!NKKrPp!w7$l20vMcYS?o z6UmQOjni+UzmH~|{+;`@_vC366{xDOBuG^sI53t>1!g`hcXX2SpI8pGafhW*@xKXR z$(khOQ=w$hNTw9lyh1ysd&6eU-xYjnZ)RA<++EwLKsgDNDt2KJc46LB9CbdBFkHZvHM*hqI)Y( zfZ_oq*;})BLL#w7auoLA)=kwgbsruZ=b5C?IG~Sjl0x<~10^Xe_pokaxd*vdLp@ea z?dlpw?W2bVj@r3nX}1&np!Vx9GlXJtEORB=YnH22tiA)g8yl*BzzB_oO5Q*72NE(C zc@3A`X8BKw)gZG_4e|lG(!3bo3&p%V4Z&wN50K-ZEn3%c?*E}SA@8Tby$!tnHaJw; z&Wh_;lOEj>6p?_MDx@EVaA8igff4GeapGUOEY! zYzzL9fKYAN5x%GIkV>=%%&A73GVS=PU0oj_Ts8lk$Ab=#ho5Dry_IZ=QMg|lNnTE6 zgk-x6V749P*jRTuoZ|t!`cDsa0p4OMj31p|O63O5qhdDbPNM$OS&~;ow>TfK2spC# zp?sEC`N?Ow_-=+q*W;oL?B|03S%b~N?Wxwy zQ!(q^DrTLk2d18w^)CHa4Pe$3K$`~Dy7HFs0<`9h2Nb(lNr8TOJcjGy;9=`}q}GmO z4w_w592+;@4{W8M*$l|7y(LK4I%Ip}u=Toufx}jwTl@bGVlE$lWcPS^?|8GHT$Mcu zjEn~w$pSmzsXYr8jgXR5gDHTfNUr@CCD-nocZ1LE@jxSeWAn^@&`9sUGc=Nki?R@D zMSQYr{}ner174aPY6-)uh+5~R8Aqzrm|A2CYFHOmpO+>wY!5dg!?v)(56DaN$uK~Y zt#LR`r~pKT8gSBd2P)w#1as1i;X|qclC4--&Rh?NOq@i>huD zXGCdwt~kTK7@cCJ(6(RYg~y1cMCW$f{GrFcI1cGt=`h6N`;cGksq3Krr=@e z0<=&MB54FrA>OZ>kqoESY3VIGsK``K0pi7Fvp8OyyT%tU-pgV@gpL=RSA5?tDr7xP zg{)omxYSdD)mi^lcp>Y!4DU^(xj@zjKW`ke{+<#nWOdX930X6LY=x{M1t`TNNj5hJ z$Z8tJAnTR5C~qgULe^s>SlPb*-qNNOvWie<%^9*@wCl)1)`E6Thpff@S|Mw-QZHon zVmT$DuWUT1m|nx9v79r$4`QRN2cF)p_9Bw-^t^0ecv`Q&ua`w$=2VVPe_ZN|Pq&<) zV>g4=XGQ{_dQzq{!9bCcbQWEqBrT$=UP;=q@IXOshr$EXJ?@7WZvLL?y#X{AxOrAZ z<8brxUcti6dH=)ndeNo&_2Z=>y?bX6tEdHNNS9vT9N^{$LmAv$jf-N&k-T&4KHyePP!cwmpX-NHtnH%|a z5F2nkF!t0V0Ap`N9zr#iNdxh8z3}VHcX0gLd$BKm?Rt>zg{)uI4@EHfY0o45CV=Vr zbOkU?)ayGvRiWqVziI%RhLCMxoYK2F zAWFwThA8uKQGPk;SV5GJhr^Dq8E0Dv(zD>SO-B}|jNjXIoO0I%EefY>!B(sqZg_eW z1gaL>8-%r;F1Wt(hz!>ZFkoye!7Zf=?pcb_Fau+-C@|xL>Vv_&L#@{#qKg6c zi8i@blDASsm%;*MNM1gc9Z<^cCy z|Iw=$~2W~JwfOU(Z1EO1YJNZEAhxCdSnWfLytTISMkXFQD?p(MjV>} zrlfN!k}aqY*if}+l5N&h5*m~B6()IAC^?a#J&_sX( zDM_l4UdkemggevvDd$p6+0@CQqB`jBn^a81MMW$J64;8m;C$C%fSQVonL4ZLdj z&cnjZyXup@sKw4YH2n;2%qNNQ>n0^+< zxVL%X>2xeC>2e8om6t9+1>GTT1xrFd%Eb7h0tsV=5g?aRdVK5kfHEA?49AjzLE^W7 z4u$z9LsYK2f6=^uHF<=EyS$Ez@^9>W<{AA=1TY8%tm0kUZIusl2xoKrY%R%jNhR?` z7<>$7xzWt#ta%{?dyq;_zTnQDQHtx8ZU9jzwpx*|bh$E}e>V&%>HQ`ZvCGQ8s`!vNxg6<6+Ef|78{#R!U^A=VLqg@mbWi0`Mu!s#S@{zXX= zX_(e1&(IrWIB<=I<^sWi=Km6Yh6A~_vLU8bc>ysEd9j(xi_HY_<}x5gJ39d}E-M~> ziDU(~y2ss;XisL*zK(N$0fzCc*)55d`>9z$ja2h?t>#o#GkjIi`ppI%U(`qkbwe!KS%O0=7 z{p_oO%54O10nF1@P63z@LHjs*lYl^9(<)416Gp6`?seE3J-Y0H zurML28N%||^EebDaX*2-xYgwS7WJ7j_NWW&Rj~e%6gLkPF~WFwr_iKnbPeqmrFejbCra48Xf`Rr^ZWSCt^0; zrr zfx}jLi73{I9%3qQb-72G;jD~MHk?XFtv=9wIS0j-mYQ8lYtP1NDHVfW|91SuL=607 zJdHZ=2QL!?U()Zt=q&E5gCDQ_{aYIRgPF-I+~a1)xSfIdq;(%hY;?ceB9FjRmrps3 zx{m{s%`}NWLtFJ3He<&heioivzAqM$v;O#t1i{crG4p)WZ zvFr(eM=S6IBOqYKQ?S_4DgtKH#O648+}{(UhR88hh$m`7ve7kGmtjV}sb^Gf+d5-< zajxln-cow;MneC!n1Xem^7?^!Z$cYDubL1CdL_ZePD6W$9T^nH~4 z6w00d*`l}OO94fpa53u#)1J1YIJyeJI91zS9K#(<(yitOr zpP(##1mL?Q*EE5iF`M6$mz)rV=NwDVi9^dIQ?|bm&BBP*n2R%`GUmi|s>6F*t^9_d zX8flt$f;G{fN_C(d2-ztcblooP}b%oro0N%WN-?4e4bB=Ra~v~Je5Bw-uN2zVfV56poUq3`f#FU+I{zl3=fPk+M+!$O_j+$PrZ$w zZ{P0Do_fWZcz{(ojXm|3ywEgW=zS{mCi*bD zvk|K$suZfz+Yp^HtyS!_7dgnkjj0>gRx!&FJSKyTP~=csUP5ain-qXR?88kG zNlxsqSb9W_d7|2?M`)`b4E;1x)%PKkCPDQ%usFWEWsbq>s;HCE3&d)4Pph$ZlE6=y zo}<1d?~~GgEw}@d+8Vt?Q~V*6El$u=(Uou1u28f5@W8r4JwsPmzE0=?_+Eb{>k5uJ zMt4^ZOVI~x=ul>HOqyj5Ogxs?J;*!6W+!R4&MG`0<#sDPU?sbo;gpvVs;=wksy7IS z7EGeAhUvf3STv0JR&0sl4K9}__n7%T@ZNOEaTtpPN3K11)_hi}RVvz-*M1>X5m9xq zQb|l6{s1KJih^kQFEN&mO-veD=2%QUmDKhmkgJ&L!%~bp`lY7zL|tZ5vc~q3 zY}sFMp?g8_UKYov(zJX78H4tfwZZesm347s22&|jmeI)$L#3_{5i=Nb0P7zQT0wHH zaDSV-V{rymewxRWbWDv`crP?+ZR;+VO4>a?=5JB*&>k~)M9qkbDq4rT36kR)BXGYB z3(A^Sli#-P6dQD_b|h~om0aa@KhQ2XoOWBblt>0i@&O!T)NOMdEpn;y$DN^-|LN-Go*VWnT37W zN}_cknMTK5KA@`urCR!4oL}QSs%zp5MC@W7CfWX}> zQ2>^4HUXSekqUr;9M53~nd;M5i8tGkH#^6OW_#(HXzR6HbRa>AMh7t9G)4(( z2hb7L0d?HP6oaaVq-}JCkS9xk7JHayeoKqV?$|;I(T-iOrx0hDP|@qv4>UhX+$!U6 zvSuqqT}o|68l|Fbd2IQ0=RfBEvc`I0I$Lq*i)q8>K?R9^Z4uTZ`vE@d;+X7LmkY>( z8fdDpqe7b5(l&c-7tq{8T|n@=PDFD4+o zhoA<2E2MV4ALp%6QGP&waBDS1_u8Hn0F4Px}Rx zu)0go!;=<9hC%@+YPA}N#f0bIT#&5Y!Kuc8We1%L|B1NT>8G|{6@yFSE>sfXP_9*C z$C@+{_NE6z{u_dX;4nd@FSE+f@x+~^>|aGkUtVEmn@MOBJA+$QUm=@~t}4XXu;XM> zv?5;*lVWKCFQEy%qV8KUfkQ1pL>$g$#qqH&tFgFT6B=eiG2G0s`bnu&gk6Fy{$hY6 z&aSwFiDUmF6pHz1Pu_`*xZ{KW$KD-c&(T2#oA5WxEUHFA zK6Lf?tnQN4%1PKB7#D}8?EGsWI%B|imz6T@8fK^ zyG?Ekz{nQfTl_db7JaOJ5>HbysEtM5&cCpvIgAC9JpNV_9#O@1$5MU8pS`DI9jN2# zs(lN|l`ia2?EKHagarhCio+XBKW-`FF?^VE zd^4TmKCUJ4gG>1-Y~%mSfX(#l8^s<@QjgY@72@p@-UvMs|BL^t3OTEblnzO4*s;#O zLX&W=EKR0q>tsvXFr(H3dTpTWvUoSrcsEiyp&KL64R(m&4WTCf2U`xRCd0coq~B-`OnF0NaoOxR3m``Q`Yc; zydzZH>{>}-^wX*f`rs=uB*;kBYa?nd&?4iDRg1u}w&<@jisQOv%!%t@buFo@R`-Gn z?(!HZ_bJXj<>&4vIN^878==YZJLTQ%B^zc!C98kss06r{lo@nDvlOq)EUvM4{BVo4 zZ?~Pq-swDCls`sA1IM2)wdpSvy4p-{2e4Xqf_WjN zN7VB2RkY7Nva%Zx>nf?pb^n?C)k+?MvQi~}At<#2F-YUl48y9Rn*_Z-Mcv0Y1f!@+ zuk%sVRg~gCsRYLsNw=!;9jOP*~sbejPp~C|^ zMtL29ux`{*V0)A@7h_zEjh^Jo23p#}Tl(*bY-moSmbQ!(Epc@+ zX{fZS@pI2zm1%8YA;I_93JDJ?<~L0M93B0urR z-(Z}T9og*AXM>3-KM>f7a`Ha=;24;j!F$L7G1Dh^N1!dCYTO@{tKw%{y^3#4VC}I) zniZM`)K`wFr?+$7Wvn}&J|QEatrwKG`$=~Q?ccR~sWEU+boT#oIaf+~X$nvkM9EAr zmL88yf(aXrDiBt-XU|@Ui}L*lF60xXXo1;0j-tS(s)`#zSRQ~W>@^D*wz7!#CIr5u zBB9cbZ|znkJp(;#-{S(6!M({`95WcF7*1!Bk`^J0*M)A74I3s?Lwv{HVkQ?`5Z^KN zx?sfUG0AuAnd8fMobz^we8Xca@a46QJ+;br$h^=}D)cG}xu06kciisz;Hs2nO3r4_cg*~RZ!OyPn@U2P zTP6djDo390*qq;N_zpYkO4Im``#NyGV;Wuk^BwovVIEy#?nCp@#B~8~X?|`a_aq}HJX0Vsg%6GK#9r97+JFfab(*}~d zuBGxFsqbSL1c4C%-w})7i=Vgh9dKMFl>p;Aetx%=?|_jDw+aXw-|^ZDIN(Ks@34e34-s)o*V?TFfHHxi6?`A`DKDAVvE?SB>-*G)}_Fpt9ca(+5cicNIWWHnLFYK{@!8j{> zuVRP3V~p=Oi0BhUo&?W#Z2g%%`~Tsh?CZ~k{L$w-5|Dopj}s){vEw-=7k&5+;*Y}M z-?5oFAAoWy<7-cBf}Z{zS2}z})^Fnysdnf5+T@ZZQfnNcHbv zI(hJ$VCZ>YxDAopzk{1sHbei8JeVJQ`FDK#j32(^S;jq#4Zy#{DrZJzIb+sx|Bjug zObiKZtLpRbxP!In#dlEA!1xZU9Agq~ey&VL!NB;A84LXI9fAmjZj*>m|E>>xJzO6^ zjFO+ni{(Tu1V#ne8wefVG(6B4U`f{<9-mkG!Q2oRMDn86DzqC!uhkQjGZK*^um zVbjHYK6WbymUwU=4Nw76;en{UOQB--G)yfkPz`5^V;@}DuT1rSxPok8H-dn_*r$Mp zA>iOX@vxI5v#@~uCDy|ngqv^i=fMW7_m}9&zm@#>OXOr2V{w>J`okgKgX-4B`8qlj z!Xx8U3Spg5SQx`YVTc?LTaqK}GSPu`1r)+&cUOeVgk6sL%jRs{W#UheFyt3;fUf>2 zg#G%jjv$3_V|$WuRUx}f^l~pGG1cN>1hHEA;R$aJVYzDA>Wd7ZH^F}4<1?|y;lm+Z z2K%i$F7@UR&hqh@I9c_Xs3DgLMej0^&ScjC*bAvU(G;?%<1P~e+>bLv?!BFVQe7tA zgv*3gW-b#+O7=2f0&cAjHvyxi7@iH5IoYvwUEw*ANS+fyu}xnk(pPxy^u`@1zQedN zV>ws^Q59h&6z=|uzDx! z>mX`&SBht|yaR4Rfps83xf31m7BIiJHeP|98s`FnX4itPd2+Dy1MK*`vK!IX4 z!8=eK{r)j`W49$L(1@L)FdSsyx~YW1eZCG9Deif%n}9<~VwS|HkCSkY6=I$^P=!Zyw|%zC1wa1HF# z%RBwH9}Ko(Jk_CmLuL7;21Pqmb zZ-}nE$5XbU$Cq6ogb821Or*HIA#^SaWCJh!Eduj~_|IlGHnG%Fb)smg$?O0I4*jGU zufo%VG1;0oL@ICgPMWeyU-MxHBxee}63rabzc<7vhmIW}ITffk#KKMNvDadpl?^@F z2`(gdV0?tUA$s}qhA1L$2z51cmxwJ0MM0uDc#7bojcfoWUiJ_?vb0!7dSEaV*6KPEHS>|gJ!@Ny!J+f z_=10tTP4oOz~tfQ3kHAAL}$esNWt-E=tXC}d_fmpXf+kO6ouTPQ^yy~f*T)#Y4~s) zc!PY0M~rjALEh&Y2G2d?0IC6(o>|5EdO9_`xQA!6yaPUbK^t_SkzunkMVrB=QG zQEq|=2nB^~IQfj`&KG<*TT_{lBSK5(3tlb6a0uOheGUoUe8ChH5@lNX0(Ml$;btD3 zFSvGAD_;;k-vpu7|72E#_yPwi4$U_qf_%Z{%h*2qk4o&b*LD&6EK}}<&KE42t_i;& z`GQxMvhF-b-KmHth;sD!g6_O8zb!{!u3&v>$$UZTKZUwN#}|w(VtTGn_=1ni*}Klg zMcH&Jz3Y(qg6x@*;tPs91*6ppD_`*B5;i^?Dlk4h9}XK|uACj^GZYH3wmXR%ooi0j1BPfm>J4T9oY%) zSmX;{FW^e2;Q4|FK4k-tj*If*DKr4hi7#08dB}XhIdI@_S$siCTriULnB)u2p6<&R z+=6={@dYL-*f?MC=Ka2W!OyrCl7GS5C>R)Dkc)h=KJk@&$7vIc;TI&kVCCHzK;5|&-8q`}E+qZgQ_G>+ zc#MtjL}~`N&1~r22v@$&#^-KKLuJLiO=TBY4pr45;ny`0BN*nq#yb5iz0{ZX3waU= zg5gZw(mm8tU#+Ex6AZ7u${uh#UXGGHHAI48<=;Xk7<%&d)2aQ8KWNn;M^*^w85~E_ zAz_w}LxOZG*HQ&fFr5Didja3Pi~$(1kBjBz z^_b)rp8vZqzpw-MLgE)*qJoX{3m36A_5KKd=WPb>kC23df$EA z%6lTjFFZ7nwB!-u7v?_21Z}%#Av0h5Q7>rgh3!wW zzK(nb%^s}tY?gPx$9o|f9cbkjf=(9=r-IgKN2E>zgIQxnutCaJ7Y2S||1eF(*2*vJ zQfjZoa0sp-P=4Wk6cS}x`2}BoVcs>Z{6hHog->se5WjFMDsFb(3sdK@efFLC*k|YM z6#Hxw`GvoRXu>Z@exdgNSa)_%ciN#lN0VO|!~1eM_2u6GaYYuw(NQXDjzI`Bg_cqJ zXhu5F|AlA{KBD!*t`A^7p3bC8sCulg(rqaieK2UJs2HWSowvo zO4<0FhH0owyg8iw!WSP!j9*CPou2tHI&Il5u7?fRQSQXW!_{FWiEAA@K_)D%d!`@a7ml{tLJln*Ra{ z2F5SM4h|!~@P{LO{K6wnCNSQb3xV+tG8+fPFO21d9;ZV2C?v++n_n2hI@*%>g)=j_ z@{6eRZq$Q6KztDR&6SOb?6EaiUpcl0D@(X_yvO;fDq0T7e z7PLBkA!bB)`Gpz0**}ZW>{IJKo8=ww;TH<8r;%&*U#JK!J##C+Fs03^2=EJ!rD-a* zR(@fZ;_Qpz5L`i^{K9Y)5@lNX1z&z4rB5rr5Pp84|1~&@MZ|w$Xfxy&jQMPPzvh1I zvni{@KHEfo;mON2;TI&o;GD*~GmE zg&o6~RxA{L;puzX_+F2TvSyY_{zNwMo7p7JPqXP>ozfdrhjn9XehRTW7aPkWu zJsUB8q3Ryi>9eWRJ1d1e;g~(V{KAdArH^R(+^4k^aem>4yV(OKP_uUp3Xxyv&^Ba# z;Wpm>3``ECa5+1~9gFhTy+|f`Rc1-&3=48OtVz$OaTW zq{372S%3azKk<3k_&-x4bmkC#4kkgLVc)E4-^vP?#(Zhv8QfH z{KBUfa>?C%_=PTYU6I6KaEayU=U*<~MO|r{|3de6+<&15UH$tnbkl$3xy+E2c#p_z zyj-5#W9IifSJh#gyr$GD?~&4e&1aQbrJ{X#?H3|vd{iBh;Kk%oLLzy;V=={rlF!&Ag3&meIiC|A%5Xe66cZP7gpskL7Vw^$V}y9y`Zg^UwD)k8cK!ULm{`I)$t3n2ZonlNZ`#r zeg~TEr)!pXz=vOmMh9B?g;xIsxxykhHCuBS{1;Ns)l_V){K78ff^#q&f-4A=U-<3p zR(?S}PWa8%ydj~LUkE?H@UD?1uNm_TEH(A?-{}_yx%? zT)?|?&Ukbu6WuwQ{KC_>u%Wq|hGx;bT#?m+{THl4xuN41ZjqQ)EEIm>%A48v?i-8o z9r+H8Z^-<@*0UnTFZ6gj7#&zx`GqquFj7gE>oE3Y@Tov>+}-5 zTV?itggoJxJ-qzF;Tu^?BdDcrT1ye<7arivmeH*3d`XD>!h+gEu8t?+EG$(>ve^(! z!shn8{RC?N+_%^v?pWj(5_@nhRq*kVP8h@9`)8vu0O!2P#d7oUU$9IHm0x(67G)t) zeYco=%}W;qBU_J2e&L}^Uw&a7?uEoJ%%g&h^9yINHue0%jl9j^`Go`&42)lR`?4_d z3$I)rK7QegY$h;%9tDB1=QSoV8_&P+951wm3Vnh?V%)v?g+uJATN1x;*W`&;DvTmp{|FNB|8cq=tR{K9ppxY_Xw*;#C#eaMb|Hup)f&o+@? z*w#)HenIjJD+aUflv8)Udx9X!(eq!plK15_>dQ#hmzM0m&;j_$4ZWn~byA7Vl&bu# zAJdA3!Y_O!v3ETm7v;~#=v{}*FWlEYQv5>MqrvFF!pblFcMuz&eO8Q*)fi5G;f_lh z#mb@b3$eV@H&drgj|zFhCr)_zg=Yq`;rWB6&*J%_rHJzjJ$bWZsoD2V3z1(Kyf$Qh z;nhs`*ku@JrQ#8Gh&vYfg(}3f2+e=t6$=}Hn{ZLe=g|N(C;x?=!$Rd3_FlmxX$#^P zCOjOBY&|CVg*~KxF3B}bkV=M|vT4hlp!^NG^N{$3-%y!QzeFdMS>+7~<}0~|POck6 zx)^yQ-;xVhn|glXQ!1Ko3Z7q>fr5eY3zsuWpe#K83)V353wh~GU_6)sf$>l&lbDV3 z3+cSjy;Nv43W;&|<`8h}3h%X4Lc;rYwfo`4=KYOLR)ikj?ig+|+M~Y^pRMvzi=5rVJoA6# zCTDf5m*kbDwzRePpQrtTN?6?`C<%pCUZsRJzw^XB7!J{5p#BRfC?v|X@(aHFLi}#p z?jZb1CAnfoDp7{;DK^XI9y7ONmdwC>iAgT2i^dBrCB^nhs_2v*1~E0ASq3plmrFCN zsFX9KN8ON+E3C{gpb{01S7!8}52fk*D%<2HSPKtE<#rRz=?+K|brVxntPJTU>*xyU zdPWE%t17ux)A0$ZQI;b0x+K>~MeFjk8VbKqki^FKa$Ji0ufF0tFMSfudVp@d8FAVI>UVy6?2H=)_E|!~*|HACF zQ2B*ffCp^mM8<#NYpA3Uz6OzN_+;h(T4+sX7;SQv!S1NZa;B{1_ib`?W>T4i8Jj?8 zORly;jZLbRggO;=@!yH!grllZyvjZIA(I-Bt#S7SBU_t4zc3B4Mr`tSx2}JJGBeSa zUns}Dkobk!RIqXXg_BvEdVXODZ!>s)!GMB+@e9kT*^uHRIZq|v4!MXBE;e~NCY6u)QZM)RhVyyhrR~bYQT{pWAU#kvB;tal4f$*3kg@ zg%o>onQGd}EIrE#&U9OP4w2)^tc8C@<+Y>pOJA$2tZqGyMVI=NIYVE@mbQ`?X-`Eq zB$s&|oYY`B4&(|$#dN}1kAo7wt1V*ZKqLRVaGEjd{+?xao(w@A{a}+igjE8!|8eL}QcdhbTC_UsG z47RlOQ!b%uv#HvlHvEI_)M84fO;l{BqfLp6@H|nREm})4;wD+;C3wfcqVT@E$sHCAn+H3)C%aU+MMsCU z{RO>*7|Sq-sTRMVrsg&0HJN4TjKSx95etE^y;L~O5S7=qZm3jp*@m&bo5C`@@?7Lt zhGnr)ILLfKD(xi25*;CyA&fh*LuqK8hyzgHMX>^RI;4fEB9zGxvW%+ z$3{*NW%`0~Wo(-}`W%iEzffWoxtag+K&xhXWWOj7PHNO7+O-IN?s60?kS ztLoRB2HPF0L~YenZ^x)#!)1SB5QN&_>aduwV{9%+)9&C9VgT*8S=j=bCk_{OY4Z1TENl=z9p(kidBmc&&npP-N^69Dg^UmI2G z+E_v}d_~>YVr|G~qpQm1D6`8|_M#O~UTZEsL*$r-3sHmvoUY{fDwowL$>khLVV5`K zX^bp*A@p&Iv#koFF&EVh&{y+qF5YiX-igqN9Uq*JN0wyh;kjxZhDsA8xr$FH6$Yw@ z4KMIVEhZ@QH?=(W;olKwABOgb5c}{)_h!gG+}DlmzwhD+M_#1lYO{}_a&A3GHoJPb0r+b?9Vssua|f;9Hy`Q5N}Mct{n^M_^FKe zm42%~7xL{iTkw3tAnmds)^be=I7xDw$yH|w)rT&6(r;%nomnXCgX?tmt{38>be}-u z8#4Rw)W%4$54*+(qamxTbGhn1rL(p)ifjv{8!IYG@t;&;HrOxSW^)>C&g@ui_t=7U zCZ*L(iAi1oj(ABMc6K)}`Uu;Ct)$&Ir?K%dVj3zrKZKKgID=kV!x%bL_TfU_=|Uqq zJ#f5`Cwxm|QibRNY{G*}V#+a22%b~H*m7crBu5R~TOHT9_t*r?N!kj*qw_H`FWSO~ zr>qMbp03o=m$!ZT%-hpvez8l95cg>%DxP7n7 zWh;p}gf|xj-cqhob|K6}XzW8(XEp#caZz?6_iFRwUEy%y2^yXlsYxCzH@_hM+HeG%BhXJ@368{iG1smrdN{rN| zo_|=4dm;HZl%il@{KFGJwhNJe@ROe*`e&*vJp98W9ht~@>r{x0cWz=bvvK}mEHCsp z70O2;G49^{!wo-CM+4*^e7S_~?qlfS!hU5c`EUj4f;NJDxY&n$(1)ggK_ZbAjCt5} zgqVjjS8&_ce)m=uHhA3IB${@ft*j#fs5VJld3MnUft`*LAtYln4@0(}2@gNS%=# ziw92!{ewe?b+mO1KV+oSkq)dKVDx%A$0aHcV3Z@qJoN6s1ntXlkeSjAdO=$+^YF)s ztkBz3s51(=1+9*G*x4z(%)<=c?4Kv0*{4Q&HtR-aI{yX-I^Z$xHs~@F={UzH96Rg@ z6R@o|Vwa;Uglu18ktJAwe@mwvyJL%8USDcYD+kNVRgiSxiC(XMz-c{^9n=#K@`HM! zs+Mmv(kK;e%VY9D-8Fa-)>y9!n`|{?mBgqtUdoI#-e4Z~4LlnH=m z(9h~Bn$;@F@U2)3UL-@nC7LJ0kn&l}V;Cau-*9Fej$)DUZ&-FxGh`TyZQ1sIO$_$g zlxxL4+eC)p$xk%l7bL^rY{R-Ui@NjjH3U(Po`1ukDAt#a(dbK8)|ZwXKj}i?D>wAg z{2Q({0Ct7u-|)2SVwQgZ7iH1a^sYl@82Wx1DTZP0kYIFRVfAk)ILyZ9Lrg>E#5Lh$ z82<5n}~!z>?$VGd$mgvKz8|BJnVvv5&nWzhiO$PI&+uZX^oqKUU+ zK0jnl3mXvFSHhr0b^nA-i#(tn?@x<3*$Qh8N%hq%?fBMiVRgjJLCA)e*?3UZ%K{jlU+A#m5Uju$i4b0X;fHplC1;F7xvC^D_hvMlgw5wTB7X%-UH$14p}37uZs&ubi7m_XyMh6yFe&GxZ4CQ~uG*n*yFr56tHLD}WFHHE3b$SWjtup&E zAy3>e3qJQ@@?bc;leIL0TI!~?6mfpx0p4sG&Dzc%gvc)}_(#b6LVMnR0=0i`3OmFd zi~K_33tUSTLjLFfvG@Mj4h+CK$y_WqAAZ5I7n%XiaI6yl1;#Io%fX^-QT)Q@q+n$0 zG087DCPMw}m7k&S?Eskhrm<1EZR-#+Xp$-0`z*=>TG<>hi_eV8a>lH!L)@#?$~;uY zf6CmR>&wsZ%LHmu@4v8|iiVP(Apr#g;}@npd&m`9{3JjA3mXsMX3ZNFHG9P1nqa* zAT#G&pcl0D@(Wk+Lc6KZFcfkNS{=VI@RoLnZ?e>f6T#%*-r_87mv0t^NxvI}0 z!SW09P)L-?Y%>Xgny}L#@B|A22p_Oey%Dq^NyoVVLhggD{6hHog(phdM2255qvB?l zpCNlK+h-qIk9{`xY_ZQakzd#*Yr-!`eqluo>rOd!=eq=gC`ZqK;Y!|@)2J^aSzlVR z|HAFR2<3*3Uw9aS3?P<6iIDWwYWA+@IkI3pMxSXlXm|9;NK zXWtr(kM)^w@(X=_r@Y0QkF`In9BPE5Sl;QIsne!2ggoJxok^9j@e9waV#D(XO`pX* zL`xCp7kct$$5ONJJryFqFnC1B{KBi%?6J!*&Pqjhc8EI``GqRPv#>q0^YeY@A<6=Y{U2LZeYgjJr3# zFyVRXXiMT34o~NjyZP`7*QGZbeqrTRP4{2GKEU{eI=cGj7i#ri9S{7%h@GnSUFiJ6 zy%>C)MbwOCBI}xGW`=J641r%DYJqVKN*pzCB>08fUyP9dLQjlx#Q24{B}~v3RX}DY zcG3&ldijM-Wvoys75dfSDQI>4Ldv({Vk@!9lx-DA=}FQO5asCc3txT2hUUY?=*yq&xgx9O`Y){fMkqIQ{K8)36%CPJDEN?#@8!5CkDox} z8#2GpEiY31!qj%b=)l6tFO2zsjn8~cL#4JTocu!fuOh}Ty!JlpbQ|jQ(ikC6BEc{8 z=Pf--)8_`QrHJzjmG7|!jG|_T%?^=Y*wsH|eqj)Ae=H`4;)rI4xMPuDn1GlTq45g? z-(@er^$rH$mbP3hHy{6n*-Jv@7v9~LkzeRON)vuT@(U;O?zDXo-8m24Ihy=J z!Lw{=uBV}S{1@s=OZH#5utq31bo|1#YnWCn6#s=Yo?+v=@o9{2pPy-bL*^G2kB$_- z(Br4`qlU;aRZa@LWMH9jFs6MVw!_jW_!o&DvjcLgW{U z&kvbj_~8lm*iqDeG#(q;vSX27h#kqbR9=w}kS+l!d}XJLyH_jg(Jwf|9(#mtW|xGDLo194h03-(Y;C z&#I_RJ-;xYiiQ#&X*Vhhj9+-=dO!XPJPbO5nIH|yUP;a}sQpKT6HKgX<)wJ!Orgvr zHYok&8fD*| zqTAKV;?Dd@5fN*R`mhhN`ocq^)XZZ~UHd2=;K!YfJ@uDu*-$;n3vHl6AEA)vQ-AL9 z;L79xoixOY!nT9!qM?kFgF&nzXWl?(TLxl3EWCNv-=x$u9L5C?KWnFF4O# zfL4|qw_h=W+GmF;mfxDf>8!%WQMgpwPjoYHMt>%E9K(z}1omoWCBmfeyS#49Cg(sS z|GRLSF$&pNc^P?#n6n7%$iL6wMt(}l5Wa^sAEreU4`k-X7aovu zI~E?W=5{DNFxZP@!TmvWU-G!GNeCod+A7I=#JgKAPwp}EdmbJAFcw~^Ro)||{hH5M z8>>{bFR%SVgqn(~iq?GIWY38#$`(^k<)T;;@>L|X z5-r8JgDjtzcW|1JSco3)CEz`md%5Sb=w&?Q#cE~a(k2ru3r}v0V7d9uCJ`)I)IfwB zIEI`Ug$PJr(7u_Zbj4t(+Whbah`N3mRUDxJQCa_DLU`#zkf*nOqZh*U5-g|jLTjkd z-%!XsKXe33mnGpPSe|{5_0>qte*Cp(v%CX71k1cK?Ufu00iraKAoe2fh3IEf!K(M- zI9K_J(FRy+y-r0WYUOrW0V1)=hph54YxL53_N;L})z^4cZykg1JU0PR0QBfKFuT0n zDj!s*M*X{DTb~v@9)N9Atp4Vn{JXyAM;<+kJk&TNm3DIoVY6&TGQA*^U)22Ra*1?$ zY$SIVq`23dZt@Q)iCIRQg8Fqy{BB66-LXpAKuy1SjFLOmh_$ZqF;<5Kv7yp77o-V> z#tIp4Ku*KW;)b}|>8G|{6=Gxtm&EN-dS_xdv|k`_oB@EB=_NJ+(_3X^`dL?s5`0f9Ah00iFMD1d;r+|qUzT;VMqbwbkWsuI!w zO7h)6(l{!2HER+wNCv1q?@p8x-8mQCIhqX6v?4Y%!)a(9{et=e1sL`nTl8u^1O)2L zu9bGjR(o1?K_7f2hGrO~QT2{)&#nIY% zhpjDs-a!%GLrG0>iy+`?QreO(y$+m*%nmppDf^;S0VS1Clo{v~)1{Jj4`R!vzf&2j zqIANxKF1*128r`F}F`;^|YG>Xt4#u0bBjH706x+X+UYTrpAb5g^2`;#y^lz-H) zb8kqT)Y^S63bD_$zx$(d)f{&9a}k)tn!NPZyKrbfy`A$eV_h!^pP+QL^Rf<@ ztM{O>l9)pTN|V=7eC^!+T%V`u5VaKEjd4=fPG>LRBwUogui+a-^WmgQAJlVFf#vIX z7hr`A?~Rm-(`!4zIZV>dVP$4HT|I}{9GmU(dL$uSVofX0yOpmo_evut{!9!eh97a-vtE& zdd_Hzk*O zi49fX?ZLtTVKteBc`JoWZ520bK$dU|x~p_#=u(e%NwAN#$t&&2+dLm1rZUJKtL`38e6ZT*x>2oz@%92#oFKN178HrzwXVhbfO9&JiQvXrPOrQPqwsE#KM zF0rgL3JO6UX&55M18fXK-%qPF1fe6tt zZ-VF2=$LLJBjoS${Cg1Rk)mTh$zw9}vZ;`no0sVYZM}5N1H4c=6?zec+=5m|$IN>t zymX9#H|x9y&Gyzc%RAsh$8<&qTK!#G{awOAiG;!5CGjFn;dhKuB7=w*5-dhjDUq(d zF&v_@K>b~I_G*|C36;AzUh;J;y|Cr69ZMt5cC3CQLTpDKDsFcEF0b9eFu}L~z&^Y5 zzhZlDBHPg`Q4@YavK?J{cTSy*?p%iM98I>PWD*;i@ia8Af5Mem2}hCbIJ)`32mePX zH+0;>l((2xEEIp2i*nfbet$d0*ZMJyZ^+!j$_paJEu<_CMh6yFf0vUnFvtf!5Yte3 zyl*(Ug{vQq7`Ko;k#+hVyjvv~XKs$x`M=@i7Ji<AsG|-T0W}I@G?WAa zynz`A8Z}@cOB7Ko=q3tMBnC9eV=%kA_TJaBYZq8oLxLm_q^f|ritY2_prWpH$@f3! z-uLFc%p{pKh^zd5WL~@d-gD1A|5FO~+iX747weFP0CC!R1vlGC|Hjs zJ$&Jl*BV1xf0Ova>CcAZ3pe0dlkkQ9l(1oZ;or|tnRa|(Kb|$o-lYr)Bf}RuxLXik zC`)TOeBs?mOfWvZ90cR@SD0cpj4zbRL@OxK3rJ-2du@E78&~xAVE-WI13*1n(0q##m5cd3!}z23tzaH3OEq> z!a3=!gfAQq_kXR1FI;>H6WR|Zf@V&C(N1XV#1~GIiMCLpVMr7tv^IPp;jxy*7hbxU z>v}R3yXpmNv9bao_`;o!QqTPnucIQ+i6GmLl`46KPyZtxcw zip58uI~t2G%tIn0&G0|sfs0|nG ztH=Wq3GGONWl?95{us(V`gREu5Yq#j2b<#-SNh^X(%Zl(vMz^ET|8WugKJH3aPfte z4;#V_8@}+i7%XfbF1MCyE3`bjsM4X z!vI^4CNERilSsMNMP|e7XNn%cK+RPu-oK=&_`)mqF(v&S;R|ygYz%GvP2vkL-xG>2 z{Dfys!WUkngbm{hgSbpPzA#6Y*#!FqB#aDScpvsyO^erY&f#QF2_5jDtEpd;S`J^h zd=wLmIX)1Kg8P|bHjFPM%S2aFA}Bw&vI1|>}uU~t*L(l9{ z@P%Wp!!dt7o*t*=j!V?~t@k2+u_txytagFU+^Ld3IEe*KjUz(QiS>x3`&e8rD<*luvtvf+#>-B3@Crvj) z?b$dZG|@@Z-TM+9Mi%h$q7@I^E+;Ph-GZv|cFW$d;LMB7LP4Smw?X0ca~Q3GIC=El z?8E2>m;n0p|G?6uRKpo3cIz&jVQRne>cWt$`*O3~iN5F$jC+s1EJM%kkzVj6DY$uZ zH^9Y4sW)}qoSxmTp2B^OyzcT%Ef>OYyB&zeR5ezH^lV$p>Yshwx4uQfzLHi#44y#7ZO$U$ z$U##6G6ehV8Gd7*Z6;!H-%gYGH4-tneIQq7E>-7=1;nBpJj7scD%a)x!Kh0&uFL-f zV(`$2Rrt zy+UM6YBjiEMGDvW1gi1ZMFugE1Jbf^!9-coBAPoh&5~LjE)ZvN1COU-^WvHa7j&#> zGF&i4mS2FGA?DrAC%7iT1(Oe?Il}x9bA)2JsAw8oaK!)~02h8l;ce6bZ3!-TYIrDI z5TQN7q++I{t%Vm9wY~ToS@Rl0S=&Bd(34F*wvbfBh`;ft+e7h!$MLL5c)?|quwlI5 zyW6NtJ6>?AEVJ==!FFU88D6j&HdeLqf>6Jw^~cUAIfEDX6K7&^KYc4xw|YeTDt5;C zGSNaxbUhLoU1W=$aa0$JUm`wx8~Z=uic*mzT!4^I6_$Z>IR^+?=cIh3i#U0Pm%>HE zv6IVm>;#A0Uj1tKG;DkJI3XWPb(Dus=eEAtAJtw`&`?{I8>TB|qQ@!Gd?d2A)fzG5 zWv*rz7{e-BuG<3@xx}o6;7sHkYXu7_oPkIcah2(be8{UPC7F@cp;6iFgYTc|uz=iZ z+77;P`SWcC-}vac=HnYF;F61K8`rirbFZ`|5!e4`khUkl$D z0DR+@3u@yVt`L0VFazHxC4l3b1^^Bw9*qPzR=sQ<65!A)F{9*ScS=T4c3j}7Pa3kl1cYpgeAVVYL(?+hH3)wzSIqK+Akr;xq)cXAwqm0z1;8)6E3>Md-wKK z(IxJESWzcibcw$p+c423N=|3dpcZj-2{FqM_t@|jCmw_2YYN`d=XjoaU%4>cBN6|44&2)so;ihTM%#Qh>n2=sEiZPKlf~JXI+|JsBn1vF>8(U8lnpuyf(xr zq)cX<8W^NrKy$#rTh8^EN2$6Z*EKcV`S|0w#;;&tMgDaLZIe}LS-j>iQX#vDZvdv|3(Z7jpB79infZ0{$hS8Ci6X> z8JNsKn&R2es0-K4qY(zm963bWw2xfi1rOp#JxG}aaT*HWEr%~KHCT@n(Ua?8$7v?Z zdN58iK+|U##)V<*MGE#!o+^e5~;p8B7L?1Ar7-?}anj zG$c#&pLx~T-VS{P8HCP-X-FANLk3gmEhv|2i29?ug$U2Mt$P^|r7Wg7zbmf?eR7y2?2Q`TO+l6eK0v zr%#BZiyZlhGAgO;fc?pzg}^RQ%}NuG{jv||2KIWCMv?I#;@3#TPZ&!kFcxRv1i&vT z2K)l?KYxQ|Cchzw#)(Q#F>si=P?%HzI{}cGQT_y0U`rC+u5DQ)<_KBzf&>(OTCJj2J7q-_8iPt8!YFCc{q-8^!2{=@ z>Sq=UVr7IeH#ts1HwK!Mo~V(z2@%#RGC5HQ5#oB=!-hw?lil1;?PO?gpcC(8Vb*SB zamj6)TZUEDf;Pgy=*J->kevL5WzNuv(Ii1>x6;(EHC(Df~RY9wZDZr=L zQaoVs_3~05a>E_Ak`Cf7BrY{-M+AB= z&hglX6V3e>yc=?mW1DP@Epy{ZkUEQZz(X+OMe_<7U`OW+5mC)htRNo5m@#0F=%ABc zvdh=+D{cOc_=R^f|4Z&HbUK&Aj|KP?6%Lv`ES+R*sD?j`slyWKjKH2Rgn0M&2ef@x zH`9FI=e*@$-NgZh}=paXoAW3f@@tZ=1hh(Kt*%^K#l=Izt4&TQ@Zsn44Qvr zREEAqzQ{<;O^o*!<7x1I_9@1|L7_2sS!e;rpa2tetF$B>BCqwz8W0th5Ba99Q;RxX zUzT38OwH)AI9)>$?~M)5`vcpSxN zkHssavp5Jm0^!a+TRlM#c#S3~3#Sm!5rN=6*am(6m<}F)r^CHeYmgnPHJxY60Vz^(9 z$D|Z_AA~?;@=zT-a5Mmu6_L0E(rrFa&A^7-z=2AhY3SS@6IY?9tDw(da=?1Yoz{i5 zMcW;GL9KuSP+;vVA(@UAy*Ui zl(t!xRu;|ubQG2L$$3U;tqzxYWU;r>wEbX12wXC303>Hl~A>l!Ub$UbvuHpV7bd+ z?UiLxvT7ddO#fsJ1#5pQiW`3^e#Fvo)OeCMfeasXXJ_9y!=P!A##31jHiV}U$7?qj zRXWNd}!&JGs5ZSG%!AZe%=d`X^Lvg{P_M z&3KxHRU!$yT)(hq(sa{V1Xxrws#`uLr&pM-7@?1U~5RKK1xrB8(QLxgW!RR6JyS9ZvomoHOm5J47AmC zG-(~E?ddnRR2&?r?cy8jhuXBMHFP#fWdI*ivEzo9 z0Olx~7!lO=DfS97OZtp{!$WQVvA;547K$F?9&{mt$%Pu5KAIw^w5$lM;u&b zgQHk2M&{JU+x{I!aweIUI`Fow`9ZwRx}O_}+ejd8)35AP3voMLB5pPOle!Ct+i`3j zFmPY>b;Z7^b0#uD-N3u9}^S&B5 zo-u@OlQSTFOPQR3190GIU~MPE6%xNB)jfWh#4l0lOx~=Cu+?eo)E=Y2XI~r{s015e zM-NE8M}S=#jv6%oRMUy1e3a$2>0HgZ#&afaH|F#RY53^ujk`VH=EtUU{3v-4>Vf&N&X z(E0SOn!X<(9+n_*Jl4b`ABS7pvw+{Rabcvo#J~~qbn(|6mEa0_EFxgjv~#I{=W_S8M`9*d9^tO zxyTE{f`8aQtHnSC{v`zg3q$x5IvV|IfacBaW5Rzx%?H!6wlU*NvVs`kTDdAs3~(t# z0ihV+LOhip5+*oXseDr@i~)u%B@3mPKw!BgbvPh!g+hT0AQ12s%VXjg3?wGn6v&ir zodnV(^TUE`At3PKZOjdB{2tuk5_GwlzX=2mmX9P=TCVCFgao}%>GSsa&{MOLst&pj z)UBK`LDBsglcqHi4~&zwiuwVya-&vt;(-cMla(u1m6H|r=8jGzngL0>V+@cADI=$| zE1k8Q1qNOj;7%J#oi;y}T+w)&0|t^ZuF=U=TJ&m-DP2N$9J)K8)=*}UCvK7u)By(8 zx5j*7K|x+)n-nM*W{rXTT0|!d3r>RQy$P`3@Ck+t(FO~y&&H9WX|Ukdt=#{Q<444v zL(`)cEO=;xu;9XHTNW0qC3bFqcI0B`3q*+6x#`H@YQbI89y3%-SlklGpjUU4WGZdT zv~{ft4t9~1zv^35{*)Ah7+FY?2@aClK}lib(qH4X0mnj1eBKjM`$sqqpHJoKQ$ft&sdWpt^zvda1o!nq4D zA3(={grHO|5@Y9s)(zRo&JB@z<3TH}@0B8cO+Ac7Z2M6mW3gyIpJ zzsWPT!s#jQ-_BD!tDQQ+u;*#gu}Sji>%i|($S2xIlj;Ej$yN{9L?N3frA;lh8tVcB zYnjvK_X|>Gmk9>H4Y+?pn)ci83qmPQX36aUK6jg<{cCs z)Q<+rf+9czv*O}L>757-L~-IDJ(ONAo!;6XEHv=m`{jPn7SO<7CPan?di8^9csGWt z*-D0YWw31{G;k^XhDQV6vA;59>R7I=j0T?88fYM7`i?Prh6B6GYO#Avv(dnh#|P0s zX(GzvO^fwiUU_XSu+i3cr)7n=zGI*P!WV)CbHG)Z*cf@}V}*C|LJ$_bB1rFQ!Gf8j z+)A4J+47TGuwXVF_cI9>Oc58nZQ_Ce=~x*bCVA4#PBTsMlCAKdLipr25SlWwm(wsx z_&1DBtD%GgKIRSNpZ~#LaBd&_22v+V7$p-ep+v_ZQLsZpP(ttMmPH9~`-tmX^9hQ6 zytlpRI#I&PQPhJ64ki37Qj}0b?5FU?c%h<1QV(hnCA4pLOS`JguF)u=v5iNH5@Kr| zrDx$>r~|qm6)d*VSe8+6Bq*V+&<_&oX{!~>YLT9O@wj?Qs~06S8rYNheW5c3^%`o`eR0{shfcbpb6>z3)(BSV0Br?(rkGk3d4N8MQ%fwXB zpwtM|if55#$YsC>TLv0T3xx)48bco%!gRvt`z#MagAzgYI-O$U9i|9f%7yH(pi-BK z5Ehh6q9L%(PTKy@X`hsl!GcXGsr=}ON&@R)g9Tg77BCzvXy^)&@F5M7N6S=#9L7MI zTgDdf6aViA7L@ZP$VE53qxN8kp=SQke0;*Fd9(d5~122#@JdJ92!*R`q z1Y5v9Fr2K{IHl#(4GDhIC`j;;Q4rS@viu`{4&{<79w>ql)`GM-|U<+R%@>K*8RKjU3+* ztcq5_ZV#ZJF{U^M|Dj?UDJVE+CHMY4m_p+I?ku-x5-7O-K!Sqz*g(N2ilh)&9ibWl z3Kp#3#-D>9@z7D!__ksrSg|Pt6pRcHd%6MSEUD0j8I7_hLWA%P(50D^+Ye;Ey* zE^H6j+MwX-UIc~0ZBA>L4j%sw?;`gv#fC5_-oA^}2?}m|n-e`niQ~BVd1)mPd^Z#UK#Z-D(<7-O)1%>)I1xz;3RjRXb1 ze3h&7300>inz(1o201a1le}P`y9W&vOqVt6PBpv)HEgDx;BN&K%x)Se*m-~-68Fugub^*EFR+14 zK}kTy>p!@q1E}oc zTWsUhBv7#HIn4(JuatGV6;nve-%s8X5a_I0xyJYDOA)rMR+w|RKh7H_hevwCXCG1r z5fof_wUh)m9u&O#MIMlz_z^|FQsdhSDEN=Jte{|Ic;FYwOkKm{fpBc!68=IjlGcF@ z`U@Rh+`s#{1zJUVdI%fmVx}xq4;dwx;B z?irN`=P@c(sSF>(Nuvrd6hs8@sFoS->n+OiIzdC@B;7P3o363aHCW1S9 zHyaXMbbJsJv?+lqBSCT)`sTXYpkTxfLti@?^fdy9p-^~BFWH?@V(6Sc9JCC~36i;5 zmVtFR44njrp%e>IqceV*^cecWZKh=)h3RQokD>2SBU=mh>-_}p6i++_qCeti`%Y0O z?Dxy#oai5vs0$JWyD-ES@UW9w7WTVY7X9;+DEjW7>_yiJ`xW=19;{a@v_)aR9g)I* z5qk`UQG$%@q`Eqs7tK|0*lFL@{*HFDNUtfdAMe)@S**!D6oo5Wz%zoyHU*sGf*Z62 ztX=58d)Cud8#q-*%&bQB>|g3Dts&U2={?&$SnPr8*{9qQ_H3K=7)mBQCQ9eY&43vm zq8Dcx7@QgWujw8`|CJ5S&B)K!pvTY!_}ut9GLNBvriYh&&SrrbMJ;C*=nX{xo8mF_ ztqV=Tc{miXaUMe@ty7}>Iy{EfrgZNdZ=a(Pqkve8jVtM%$V#e>0{+i>3|)Hu?+OLP zd|)yl2B0t*UHVRWju!3N@<5uB1QoZy2sF~?`1~xsr$hV772qJ zw4#7b_ZTY9HECKS!N3pi;aaVsTK)75@ziyIfd|K9=vlIQPO9E{s9rOXz!vrxDye^P zjkTD^&_6W|3EXj_Aw;wxfrTgFNYONpp>O_;r^ht>hz(!U^r(ddHtaF<;;fcM0&5AL zKmV!`g6H#E5(#|ZF7BK6??&I8bh!;-Y9bPtQDQLP>m$1;soc%bw!1{{pzNK)uPEpcuNIac@TW$AjF3jGNWpA=r+ zle-i+Z~ouEtRj~Y zF)(u)^|C9VG{Ay|P;#Iqxm8GB#TJfaL{5%!lx+g}dSQoU`|J?{ul_6?;bjymQPcAb zl_KTeY%4*2Z%gY3ON>BMueo4b5j_0L4kLSY>a%R*1AzP+gqrf{?<3MgsW10SZ}b+t zG&-{?-HfBEI@6c>Mf}3&IWP59xQslx8?b^uev(jK9x zU%O)%ZOb9F4Y4q;Hhi(!dvr8<6rt&cJ4P4BtP5b=R*PlGOn$@&pGSXRd2bC|5-c-C z__$0v!ncr;DufSZUS{-d*fL|>Mw#!4OeC~mdKARYgE$`ur)xMV*H=;m^(0X`HVmd0 zB7GvIbNzFsw%aYC|89*&*ZE^h{JgH8D8;&d`aew6>Ot}fWuo(CqJ@;`dL%Ns2%!S> zWdwuzJ8c&;r&*x8pvVfdl&ojWb!Lt4hnZh3K0Taj0Vnecrt8P~&@wV-I)xxIkq{)Z zMmoIOJuRfID$L=-3%IRs-hpZ_`J|z?enK*Qf9#bq(c_e8J`!2m`ktk^M_8L{$OA8? zakJqP?1a_s#}r*rEkqaDYD^UapImw!b)X7*Zg|D6<-im`WLfFlvx!QP-#2e++3fD> zR!?`1Iy<2(KUP7GWr2VRHfPi9$sWDJ6J4ehZs0!|9%JgiY4Dy#BQELCN+KVws{D*LtQJ#Z6=)f2PVTMWc$d0?Te5W9RX+!K>`9GM7q zFWlqF>sqkqc;#C31iSxGt0|$&{>nNDTiLbf#P&RGIm!&-SSL~Bc=qWn{Z|{yL9JV@ zpNjLLqW8`26I@}&R7=3#vRZUYRH6ewErCu1%PkK^?Wx7lP=B)%RYbWd^Azrix-m}E zt3)w6U)BZWbcWNBPuds$*!)|85N7r$_`)&Q;h4W3PhA=X-R`%Z02EK^T7(oljQo1| z{GHa8YBlA7Z)CJpc1;Irmc}$_4`4vGb>6@L;1-HSG&I9=zjQc*2 zAYXf^Xebm369%DSRalnY;6R3ay)mhwRm63{q(lF1kfw2` zcEgU+S^%Htb|$Lj#h{OuZ?qHDIsv`}ndm)Al#E2dE~0JKpRiq4{P?ad3+_F18`t$n zDt7UQ)?#G^=mZYubVdbS;?V@^xdR96oxe{;9Z6DDDr$V9M#0bE(m!ytq>J*e1=vFv zK()RqXfrVATV1;W_ECzmhuuIeo(fPpL|Fr?2IA%gZeia*Hs!~H0#lNTz{kNP;O^F0 z3H91q$<|V`a!OWiDXERu&xkGv?xJuT_z#31M!!%jP-bd>z}ADnbm)#!Z9X>Et-EM* zAa>XC#;XehdEtQ`lA$*ZqS}^08?r(V}zu` ztleZhFn)~?bchM`F6!z)$f9q>b+B@;g(c~Tj)!J!#K{Ar=0)&1r1*|fAP^m5&{d0b zkjTi@Zd0bBksG~ z>6JCuzF1fwUz*X^M(Z&UKg3j(28!exthyEow07n#yw6@+fPHq{8e^ZORb7R7=E3qk zE7&A?CI6}o*i%zwtYhdVZ%05ToF^BZZLZ)(;w4Yd;p#j>)hS;s$1|+)RIl*0B9V7*|nB#)EbWnF%ri@FTpx=V@!#G8>Fh(b%5nrH zstLsVQa8+Lzl08EfoS5fvBePelhxChm9EzOkVY{@()?ZD`>)#}Il_B)cf)c7oznay zf20E+`1ijcTe?nRO?Em;=Mexh0)f6Ut8YJ(ea zOuc0DtR*MEqTvf@4j674r#u}I4nx^v!&j1BFdXJCj0Lcn>?!kO`mG2=FJBs!zW56o z4S($To4LlXU|>c5N`tn^sxXCzRy+saXOoJ&JXptGg1--jt_vn=U{8C;S^C3Q4Q zY9js;T>BtYsAp~H#bt(Tn=XrenWk*aC^;l9qpOK?>Q6&r%61^?@L~~4Q3p$1NHqCC zj2&+Q*)$fo;#jl-kQYmcvh>AJ$EOb7HJzK?h00G@K})7-23H$f31;a-f(pncy?r2) zgkS?tqu@BaWz|4j@wJPk^8mH_B^y(_snxEOsX<}<#Wiz7-5&W+LFTuO;W$S?-c*fzAvVNS}kH2xpkP2M<~ zKnSu2B5shfMyxVcFkrG2P?9V|kFW_A)K3P9hv4F|8!etr(895;hSu@fPIYHt`lH zC16L|62v~Hh|@cU;w?Aenc;Y`0lX!>WVmBkQA`(!xAdokK_`oK;Vu8}KxNwTmi>4Z zA>NW+65}??d{2}iVPtsAjnq`Vj1OZFqhKPWggFLCO-d%QVeppjdAzv$(c&I}0GXg} z4dX3e|CtjVONpY8$mpVB&fz5rZ%Gz$Tsu0y8#9!kBP-SAbryoRTxH-b86|8MMg4(R z$_C1rUI*R+g;4_2>cm@4mDL`3BdR^BqM^1byk++d+}1NFQCB1iwiQ-*mgeeQP1RgQ zWTg<)5HJ&?fF?7Mwze9JwOZs^@D|nZvpL7+;4MQ_5*&@hTh@XNmM1#dP|O=U-r_cd z;GuX6F{$FQzH*;2H)IQI4#rl%eh8Dy>qc)7Ri`;C0ghG!TXt>hCc&1&6AWP_u#FKV z2}frX9bmBK8mO*8wxl!@Z0Q|b zUUHt5B&5*Msk(h_tfjKCSj#c!drUWGRV-Lb@w(m-V=c~bSPLy{P2YpS!)n{SEQqzF z2AeaYq_5&y71lBj$EoxZ##&Al9Y-*%S>sU#t^}@OYIxZ+P{a0b+ev7h=*k;1(RGw){lBdwRH7@%@+|#CbjzYELu9dwu0ydG z*@~5;5=2+H0xod^DsUjtmCKrju0*L>TtB)ZX@8^86(mV)0=j}^&c>rF2fu!eMOOm6 za~%M5#Tyn~>1V(lY`%l@SEBL2_%+ZKpent^Q9ZE_n{U`cht6eoRK=&iD*=^`VynA; zKqahl3HoDLB>3 zma?NQx9S*E2+JZvhENVW@%I9ufW20m@Mo`q}0T;EQDfY{MmjLj4i!p zS)fr6%CM3cCk~QvtpK6?bUAPQeWqYDJ?sr*4`%_Rf>2H~Cg3oqypn&_E(-_+!tmrM zKqtv!w#!_zjf767%4%Fj)wun2;y-YRkOkTO&eac{j3|kT%P5KgKc^VNpg0nO&+0~wjKB^)yHN_b>s+MgSVj0|dL2xgefLBz>`$>b=O=rzS(U6))Q&6Sfd zny0)9o4VRG@X z9yG)FC~OEn8WPc6@=9YwbRz-^{0NHZnht&(hPDIz7>Ri;?mr_O_~8t$mj=O)5@>)B zfPYyq9n(INmCH}Xos3N1N-FOMKjGl8MRjFuOKnc)J{VO1Y+Pk$0)NY=Y{_G!3Y(QsL&7*y2AY26~0V zKC*wJ!YU=~al)}u9MyQ(!y((g_)@gJ$3G=`Ptu|dZq0)I9Z0xi#I<4Ij#ZK29q0av zcnUOKE+x3ey5+S9-q8l_OA=lT5>tp-l}EY%Df^Ofdt-n-!#gG%(|r4q-WM@N8%C>o1WbG)!aIJM zz==+!L|u@`=pvha$&ew$G}MQ85cPtYmBBAaJTt_;WanVYClb5^W;FHU9fM`HFT4cR zp72~lZB=;3p)%1>O4JjHtZlX0mu%!}HiUPe$>H&iF!m+$ImhPU9S6z2;3%Q$1UIDzgsOjBUJLcb^_ zJI)9rPmFV#vao{WjSd<>nxxjmc4*i$Uv34=$Kdz}b)c8p zD0aN9SV`4`2nbieC6ZBr1BrnAVP69M{ex%!(pUuKw`pGz-wE4uLr6$%`;w13)(?lU zX}j$R)wb+Qx}*LUSmY1;l2s(Ekz{YGvWgz7XABxw=*k|m?L zYwjF_x_k)Bq80>6+O~bkpKbOfH#W+?3#vU?=g_*|-S*Lw}xCab~}E{L%-)4t>m zS(2c+^ZY$VNzKMs8nQ1*l*NvtVxR05g0VzqUy{1shOv-YUTq0`UG^pSj^GY{88bt? zb~hg=n}o3(Wc!lEF;WQDc%bE;;oJe4_z|!EO>Plw$G+r)tT2EJc|bvY^nb$rP^~x# z#}w@8fWtR=Md7#j>eU$AR}eG+idgC;yLJdWJ&7I&jmeEp-l3kFaZWHd5ccS>nv~Zu z`Eh}Err`{TLsG@6RV=K4ZVz-%mG7miToB3YWj0#?2~ic!=2P;`0bk?kO$)6?CWKF+D-Zu06eA9?k4>H1K2O_}LjW@WlQ&Q^2kl=`kLhY6D-eeq@ZOEtaEvvW5( z4ub&Ak6>arp%|_Y4VHt%n@fHEVKE-KG=fd_Qmgkcm#hsGVUVoU<3BgXP&B7rC-Wtj z=#N>!qrb>kUJsp6FG`=tHQAK?}_Z;$|Wc=tuldK~#Tu%?y3(nsvXeg2}6iFD0 zT^NcaH5BQ6jlD$LDRO0WxZANip^16N6cW}}K~qsHu0_;}ajzyh^busrH5Wc<%HWeG zn;g36<$9($FZRIttQ5M?KxO-q;u?OusaxQz<`nQ3ZeR2=?r?1<;MsCAOGmVHHtuqb z(mR!jX>WIPc%brBMU$LtWTnc4)qH}EF!OiBFI>Q#SxXykm)w*JXZCf(FCG>4uG_ zyp{%I7?;m!iTHBY(Y#czsO@^Sw-1cSJH3aj93EtjGDJQyhX62q4x7oXpEZY-$ietD zc$7_otAw?q{hd(ha^XgX@VKH7JmVv+c%~EeGiEF~55$Z`JwiCSA7Y?78cy|0$KUzXNMrqgHk&Cn||iqpu%#Bf%|sxeqSa=9Az zwYlT^lJzS;N9NW}smG|Xjvj0oqsE*u_Dv_0-Y?m|mozFOr1x2cOz-^zLGN>%txE3? zFWfVn_QvqUo}c3FN3e~w?3{lP`vXPnyDg4{*uT}Ic8H>uCiaDk+90w2`j=KD_C?6N zMTz}c$nXzhPmI!Uo7n$ZvlDxmu@mELkG}>+na>rVosS)Ar=86{Ptb`(>^P5WL8prb z%73C&%D*w<@}Fvz@^_pYY5SjPmGWe0yao|h4==19eKbz>MZilPkY?|NZ92UOhVwwerxZt%^SO>YuX0S_LYDd&*FKgQExPTPoiFp2W}LN}p*kOs?D&4E82_zGlY1~{E%1q?XD&5mPxRt@&7+0MWXwo>b; znOEO{nxf`Ltp=l3_J<##^o!jtlzFwRKc@Qn3ZV!p){yON67Mokxx?A(SES%3e(Heq}f_ zw<|5`&PEudwnNJcAHah&?OqoZ;Zzu0NXB_$b2>XYPG{FuOEPIG_&dk{^C-;=yQDMVNuO>yR z%iJ!*BRG5W9U^=nhXhs)5i93LL$C(XjKkjH4{t|@=e;01JefM&1(7Iqc(S!d6P&@y z!M2q}V4mWeUFy=O_i+2rp%iT{78j?O&o6P{HpQo3LXQWj$C@7defxn954ut|6v|#w zqy!)6wCb_Gd)s$15=i1{5BpPTPjjADuuXQpa+j$2?{d%Oey$eNxC<8Wy_k>L4wq?B z@$9l}Dm<#U*Mi<{JQomg^U|)b{Qi3NCwZ26^%vYAd6*T| zq8(Z{uPpD-^yP;{ZG}xF9QhK!Fm}n6BwdwzIjHoz~))mC(dx_7PzdlcXb{17>67^kb>@_h1 z9qO@*Dm7X@z99JcP?1)>w+2Nr_4dFp#ayFu-RbEX_>}P=x!vg(@U=H9h7c)lc!xuDvfxR;hVQ+_GH(jV!qk&CtyY#|vp#nBj4 zcrNr@5S)mZhG-m_UvVtg&wc&A)BGb)iS54B?{7KR12+QE%hQ)|EifbYc=cVdW;Xpn z7iGCmLxeM$f49CL<0!!`CK2WgS>0C#j>gsOLwx@0P$8fHCRFI}KFrpgV5rp|XiN$O z9$^Jo!ZZE{I^*>X&F+l4#z}78_HoJzH%?Hj+G{9BvZFo7sA!=y%hJ ze{?7Seft=F;Lm`6Jzx@gPH2bimfY17eP2%WeFf3?$xPp`1$|%a(^q+Ru9J~il*R}- z%VYZ9YE(Q1gw`NWAhgAyPLfET`b+T8Q-eVp3B`BA95TXRSo|WMH z;7eRfT|TG%J9GvnU*hlpy|W&^>%k!3C8bfVHud+eZhjv%rgB$=V>NtJH$vqj<_O{_ z^zJON^XU`f=pxBrLD(J&`ZC0V+>J`t&wbq0DDERONYBV}_67G#7$zTrX)$Tr~a0AEUipb*)OdfBpDcyPlrjk$p(ByzKgU6!q6!PG= z?78=7tXi{W?A^6dW9FG!?)3V5L?b|sI{l?(lw`y44+5gu#*D&($uY|)3K_GsmTB4l zI)y1-)qD!mygnk0`yds*u?vj%GV zXP)TIN(U19h|tv>?Z3EtLMiP<(LYJuKqwgkQyJ~g!}E-iBQuJQ&}!BM-U$q&Ju7wB z>{NX0iT=^lq=Z)Jhok&?MUzUe*E98JL|VA`jKnZi_D%iLiE5vah>9HREk4?-UkW08 zQ5;qOpMfk@edHQaeM!Odj;55gn?Sju87C%|^2T(m+?Fmyu9bm*DwzlewF`q6L1O$c zHVq3R$&xE6zRHD4Ep*Gs_8JmW>HHpGUnuH?c#4NoJjGt568kU85BdIN&zDgRV#>w0 z5K%(}n=A(Yji8{>DWV@;NEb(P6+uFx_;*d$pG8Lcp&}Z%mQtD1Q__+#Wgz;i(rWH0 z!+Ys(cX|0mB&pjM*G`GUCda=~2O-Y$CurXB1gyV?4W4L_zp+oDhdE6T@_R2kNe% zhJ>ZZZ8n+U&=3#Zol%6ak8om^=Jpf{$E;%!fYE(RA_Rj^j!bq8)nn$uu6uX-o*KmU z)M~bDJq70)S!H;`8hQ&E@J%D!us;%%GXuX!YiJ zdb82`W}JG{p5FZ1`sPCQ=DQAf^Mv)yCF;!vdQ)tDldIk=rZ?AF-(0EQJVI~Ix4yYf zy_rvMQmt?D)tjmG=6LIy2h^K!^rpS_&134#S@h;RbAF*mpHXj)p*I_>Z(dYyqUp_I z>zh~Ao2`f9%_G(~i`APo^oF=Mv#;M#Z(hfnz_sS%D)snbdVHbzc%6EDJ3US_AAh7C zPou{tn~$U69))JbczS%eToLhaj0P_9p}7B=Xotmr70D{ouxK-Y0Q6;DaKsprh)cWV zXh#M}BUVe$TLJh+2Ft-Z8UZy4dc&T5Mt;I5LiXLElTz3-_jXH z-<<*Ez=;9U{PWz8;+^kw#F~Xj9A)TGq#lky$^N?(z6f>PQh{&Cuh8@iXdE!ysLzwH z(T-`jhGC%tmsgXBd^+Jc1p0`R-i1loTZ~OmREb$0{Q?wlIJGxhbQwqJfs7}d<<6ld zWD7@TG@}e&t?(^35h_RC$)E)zqwwcKXb`+hG-0Ibl(AG{A`TZK+^92foR2mE85P&Z zJHdmTMd{YbbQU^Qr6sq`ff0D0_e^d$3XV z2rhe|SB2xH!$42Ep~}p^30dzn%l?W&0RW5kAXYK)OEqViD#M~ML}064V_*v8OqSIS`!YCJi<<5 zhgZ%sk}%npIPsl6x`+4#T?&2g{5X8I70wjZUb4ic-oGW^8~Wf%6P%{qqxgbC-{D*| zMSXu||N1+Tbi01+K|(ZuT%?#HwJdHoH| z^fjV_U}t~VH}2^LbgDf6DD{Rs#jO#CGbYU?$CRSp*m+=upyHlTV@na4sc?(a62>Oz zoG#hg`cF{~wVpQoKZk7u!7=)Nt=|f&WFDvn8bKYNWNQhQ2ej8^bJl2uyV0E8d9Gk{ z{>vzF*Kh8Y&55OufYGH~b3@~utDIc8D>*pAb7#0u4&Je<(AtcWq3*diyHCtJ1b^KK z8BtEb1=o}BVp1jI_t-y2VgKCPf%ebcN6`M+byphgp9v*if9J*L(EhnjtN9`jLGnaS zerURx{N}L9ITqGj46e1)xlM5)PtZzNuw9(e0eV;KJJ>zALLL@wNelf98+ypYH1xRj zAuj@$?o?oIBw#tv`gLI{5WG0LoX840o#f9Hl*d1z{9iX>XrMdai}*g~|AO3&nXTx} ziYnmyGIYiFrP75gg|+}%j@SSs6C`W$ldeCC9u$Yb+dP87`t+|og}*xTdV2I2H)w8PCj>NgD*vKo3plZs~HH^yr5qmwEKn zUcj>;9X3TYIwDy zU$~c1aIJo)s&p!%vHeggz{J1t3UwEv^2oZ;$;zA$s(`-A*EOT1Xh6j(Ah#Eowp<0< z79j_2!cSV^%p^ztNz3Q4>w4i_eD9rFnLNhtc1&L4m^(QgbnaMj_B&EB zAz?Ch5%sL6de$zGHaWd;mb(YB6leOts!%BL13#5cng-x!50j*F(Lr+CY&{#);u} z+<0^c#zX^{vkITU4|Sq z9h?h3Q3hYe)8X_~AC{Khrwqo1{no?Nf4ms70x8iO)Npa%3EZssc~9cbtM4Q?jX78@ z-OqF5Bd{zPFGJHx38uW%pAT1tA{5(OfztEW6j)dh877NNluJ{oPl;!Oy3jD z)xBCgjjSxIJOztg+>2-6f6|Qp1RKkt{u1YCj9m-A;(=UL| z2+c?7u#1?yWJ&{8iRZ7O8FH!8-wM)4(%XtB`iWCvFUzUWTqoiagu~2QAk)@4W_Q!jD2WR-guRer{NrxpH-a(2YeyEFJqmWF8yYftcF(Wv81Q0c`ArMnwC zfWr|p3dsTB(87Up9b`1>oBx%CitiCrJiPx(P#lIVFr^B zetG%HlwssM@eE$(TbVTl8s%aX6=A;8+ARxWtw4xe6MQjGn~V2EuVr!P}@19R1RWSh%RS-M>bmp=-pm zU9qCoR8)EE=VA9;Es{|owxd8g#FP1ujc5xCj>yd8gD81nhq z>hm@9`6&5$;Y_b1Z;+Ye0QJcW=5o_Vd&Lg8iLO%^R?7cCAT$Gdk-Kgh*0$v!Z;*-k zZ$^4J3$ha{l?;{GemJ>E7M)Q&I%Fw}RT7|{$0AhrOt_ofH+^OdX|=c(e)=(@#vBTn zv{ihD+3m=Ku2mFqKo~I`=#W3}R~~FsY(Pp+sZXV0sTa~LO-$p7i6&~Yi9?Jg4xuIvL=&;0lE&rZ z=rh2yh|_46 zLZEqOr|^~(gf~SPyuc_7puy#4rkI8yE3pL* zhgTa3D)L8uR1kTW zwCgPXEJ7-nC@c8muQ1lBM7K~oP=hM*?R?A$R25WUm$iW!>1ZJ6|cCBCHh{>)@eKSL`#$B}n}!7r{BW2tl!9?_zaYe%H> zvkI?&N>VAABDp+;v*|EW#kIzc;?aE$F(wU0oB%DLe2*=Yb{ba0PZP-t_#m4?0tB$Y zIAvn8;m&%R-E>pvX?7)^@#oWkL{5*hCwL}Ig8T3+a2xT$i}YxWQoe&LYHi*$&ePt! zNqELR=FfD6>5)NUlAOlRs1Fmvr05tX#jiI~VJ~yFzKdCat+^bLb7)yh^E1#TH~htjJ^9q^T{I>SIQP{Q z-vp(gm|rLb5vs9?V*i_Dx%iD&-wS{RUVhrFmtfgX8v_gFg+3R%wKkeM2@2TGRQMD^nffbon@` zw&_a2wj4<9dH(#2?)2>I>ktD^tE;zv>V@8}`m>rb;0orsvnhF@{B>dLYmXd=J>ch< zRCk|<%!=nY6{)Ud3CwrxO~F8A;k~Ff&C8&hB>!t}V86(wYe5?11sB$YjXHVN5#F!f*-5-@l?um4Fm?3qx9uCES}t)W{nQ{~S$ zE}6e0nEynTf1JvnKWoSN4+ke^W{*M3!l&YP=w*aoB7=Hj(2hW91VP{!h%ORT9}F7( z(x4qqg<;U>p4Qvv$G3ykXg;>zpOrw<>wm#rMXCHt!$T&4f-oCY$g= z_0r}&a!j^x(gmD_7zp&iQ#>LCBt?-AFGl=Xnfo0oce)i9s@(ZzUq{Y;Q84!hRPJRe zcmC{CY_p!?k!hgiis``s7tt3Om?^0LDXIi|CVrVllbK$~w-B4t<5HBxk1@sW#RJ)# zuD!XyyWEckvr`GC7$^g0m8qGfQ@5t@=XbH3h|0-9EuI-9dy(FW>r^dr)Y}D|M08NK z$U!YMe1}y-1F&p2b?RO2Ov={Z^#gUAEpPu%-R8*Ko$7XqyiHOqm?m$}R=3mT?I?9S zmu_W6RaJ@*gO<-{RQux0Ok4Z5pnIr7oA?*}A8J)OP_~cWi94>7z0B+%-h!>C$Gtnq zUd~4Qw&Q_n-&d;25K>b6eo?m$S;s?E9pmI}H+Acjw?_LC<*m^^m%KIFmqfQ{U$83A zs_>A+(xQFf!i?<{<5xr#LHp+NFQ3x8ev>NONAJWxua)h~q)aoZef)S7F$TynlV%aV zQ|*gUReqGR^LOp4Zl9I6z0~bX^7brsyGY(@>b6YYj#sx;^7blqyOwTkRjERZIW>N$ zWM+=7eGdNoF83~)Ur45*R_#^$=$%+|jcgyE5b$<^n;%~lC)=l?eWX3pS4vjuPI%qZ#lu(2 z4og$7=-I&bvbWOETeMZH-nvm$q*Qj^GwPOhMP#{1-99RBSE$=(UN8~Jzd=jc{}tw*<0J`RyLkmm~i@JkGICI7A#@6d0-GUludU`|?Z8O;4$8tv~u546g;G}82s z_1JdA=1)v@MCE5MkG+~MtStMI$M6;Q`>X#2zJ2IbG{dUsXqhaY0yj&|L#HX%t28R; zmMYPSr!RL&>=DQjykUyu3=0Rf!@VO9x&^VjFHJRdUpsHZjSyE-{++krT8e4(&hOJT zpEx_OpiipllS26C!GQ$0zC4gXzoK9pEh_ls@#w#hD968u#-da!e#^~^uW$&CrZ3`= zS3gPX_pv7zx~*F3CctCY0lGH$GH~Z`gsNxayitBb58_&AA$y7C#IHOmq)wsJ#VCJP z8J#Z9f%L;u8-;bDlC@FT!>Qsm6@mGhew>Ed;QXnaf>w*|$TEl)kZ7t}e1T^;icm}D zQcG|gqGa*&D!CD7aUAPXSh z#w@&mYbI~xkQA#M9uxJ|0Q#z?V(V0%5+Tj&5~g|4X7i>`Z(iF{RNIoxw%s?mp|&Ma z+ipe|(5j>xvu%8%+Qwf^ps(s~+nJn+p>-pN?j$^uLpOa|^V;T8ZA&!U_V3FZYMYbV z_At7D+D12K+xSMcjlY^hU)9~V@tldhZKLr_wQWlC+7_qU<}lm#`DG2YjR|Nuy1<~O zX4~kEq!WtFK2BfN-L~1BiM?&t;hAb%PV?GEdlaoV+PdU=i*2xNTkx&;KYT`QqZ_kr ze51yVuElcts_wQu#+lgLb|;>xwq-Z3ZJSU7Y8&n0vTY~lHZ*QkRO=3^ZFFO{jc-)j z_^WS`Sv_rgmtLFtr*gf$iD#;9nayik8LCEYTZCWPHs7R%+V&E@6{m8wBpPD2jouh@ zlD|5v{6;#aoq`ad<)wtMldIG3v>wVBMe(Ho;}{M8xs zRo!#4bC|Z(pnTP~wC1&~6t$soD>B>mx15IBHW%ND8&L&XZ**g}jc?SPq-${jeN}hc zPUlSQ>+Qr~+fssUL(pn4AlALR9eLaX{}H-zA4%*Kbl(8J$>A!W7`92L7+ba%afY8p zvxzCgi9uQ$FE)ap#}5_*POooTi@(`a?3xQ|}e(dwHx zp}o~t;+dM2u4c4Bqc)_;HpDg9h7_?4-%uOSjcVkebwHg;x&$B4%R1WdDkrqJ;VC>* zZ6GF9agL212Y_Z^;$<5$E@@~STp~%e!DY6=WwgO1y42H#ACP%%%J(^*soCcYGyC4+ zB=*_&4}P{J7?2%7G3i} zB#4RN@WURN*i9du3Hg-nDySiDE5Dn!I5!dMzKM>!4lKIAs;IrAG%&QVrhR@_U%wTA zO_z*=%%7CA&d003Nd+}@pMR`6DR5Fls7G|n`-Fl9&V$>ZpZ`RC=aF1oOtF_S?SamI|h5@*a$FG9a!+JWL! zi90<~e1UU#>_?fYc3*~xGS&JmNcF5r#mCR;Db$IWxk&W_Qdy6m58z%NKmUp=14!;X zA2;Gk%0%xxgOczf)H`28*SrinPoht}_@oqPS08T7#A)=V9aVLH8SEWa!0X;pH1Ieg z_WszFGQRl}_z{!g2U05>bQluIO2k_8*)o&3a0=&l)52s+tCojiu;9N%mTo=NY45Mo{#{F9N5 zEaV?352#gmr0Pd}TPIT0hZ}_1dV;)giKFC2l5on4WYJz;q=^0Fsr94N#4qwf6WioP zrub4`WQ&jFMUGe}FQ$kpc`;4A!x#Eo^t^agUK2|oo{`tYCWr^*H8U-D$m>Vxd7-=} zHc8whubF9^Dz6vO^NI4hjIPg<*Hv^qQeLm6>r{EYiLOtR*IVfNM0vf7uDi)=I{Ju? z@|uoAq9&V~uk+#TXL(IWKk<#crsJUaSYD^m^%{At(RGEq&ZO%%6a*_Ledjb!Yted9tUn1KgFDG z@5b8Nb9h}~)Jq)zM%{KHb?sUzDTnad92YHsG%U~+Cqi)sR4#`W!$s|p3up(H(y&D2 zt`-E=4Zae0*I9;_$~Yld1{78x)#ox&P{!q|jBF}n=OMBTw4D^nf@KV$GR~;83~?yR zc>4mg9hp=Hv=fM0qKqh2MkZ5ERR+2i-fJyoe0&1RSly+rzM4m6ObC{tQ5hPS0jDXk z4QbPXNS3#mqlSzr;zHXq3j9f1>51zvrHpW^t`B_0oc>QYvyNo?@T#Fee@ncu*ga7ni7T|$iv_12^c^fI(H46!Hq zgS-$4a=iL(C}Kh7%IklLnhS-TJovXM91MBk^V~-mGLL?k*!=6S=oi>GYWgfvaJ`J+ zDAHg+^)#`dC+p;-kxtGa4Q3x0!D><`%Cj6Yl0EZ(Oh4r5(P5xC*e3G)^*qYM&b9u4XW;lM;fw!;2eQjs1xt>h$jb(pvCOr~&! zNpWwO6eVT~EbovqCWlFpZKl9t4N1{IOp0Ed;yuyl|Gm%N6vWU=Sdvho{oA?J|Jaom$P1S!lov_jW_gh;u9p`nVhUZDBpbutIe#Shka7IJ z^9;HkF0U`A>$ByxhptbNNs}ykZiRcJ^84GC@d?x(@P7!hDn1=Y6=RGcNnCX?HI!%C z(m=uz+RyOarZ1p-@Rw(!AciM4h_v4!!$((MUw`en74ES zKw>XxJ%AD8BNXM7A}WtoIgvgqyP!%Ta~vExkYkxNS!C-5!?MBT<~S45U<})kwa=g- zPiIoUZ6fF(hSWDqjt!%(Hd)EN3zGPY?#379qMoL{g4?w+be1#(Fir%psTg$XaPYzTV{CIl4bHx& z(Wdod(I#S35wr|*J#8HjKgVs8*RCg~9F5)(stjLErhU(!f%mlY z(gvCAA}X3JUmpd-RZ@AxMEr2E1M^AD*bl=Nla399hYB(iIhEhX;r)2q`yT3jXR$Sw z8d?Q_EzqMB7T`or4`=>J**`5GiFSiv%5AS&bnlFs@wNx5BX!JZGbRJrf^BoDy=WFF ze%FVhWV5oxlrged+2W2^*{p2J&fqQ3Ea(=HqU}(!D1s7aHf@pvP-B?SieFGebq>Op zX*4#{j+zXv$FD@TJ&BprT-M(6!*vV*i!7^^8^ml}o6U{@3CL3a#YU)JvmnSgQuJFmJ z2I7V$u;K!94?x&V*1=pz#I2@d&hXOZ_E5{nN+^Z3sky^RxfV>SSO1)yG$T~VJ~G$J z30H-~s0v?sWfeeZs>EUip@M%K=_H$P7Q1DXRPe!$OwiE3nPMEek$B|Or~()ndiFG7 z(#0c_O;8i6)5(tfqth4d;2F^M-v3}7`8#)64Kn)GV?;*H0u1Ti$Yk57j!hO7sE}8` zn%wCz`@lS)7e*jYV!DP`0!yhus}4h}z`zsnvg%3t^wn&a!V{uOtc9YDT++oOT_Lqu zBN9JBa6NzLF>{j~9yqOP->zX zqUc)YvSSE7c}eE78P_tGwYV~Ksi048m$|%&Ya^HE>00LUD1CAj=RzGsYX@_2GelO< z>K}zL7{;U^1IjEzOQPHop;DDb>$2p$behKxZJ?!$d$l_h4@)t*;$fH&ynD-{^w^O% z)@E=D|3#dQBfq!!faWe`EDDGVAgYKPHvMi#0*a+taUp$M3bz3CYh-Oubk!2r+RtE~ zf124CXEMBvK)!YE6wcqaJ|{?y<62su86FyfU0g0(29VjQC{Co>tdaYWY-Gu>^r8ad zRV+QD6^~8|Hk?R>;SdBn)NzATp^0JqQopBBzZ02(9imH;(#eNP?g5VwXaz?qb%205 zchD=5h2oL4Fn>6mzw`^7%!=4rHdwaou8nBfRT{O7HZVz1t3<&BY87>G@rcA=y-B#I z&QW^oj6qauqkmnB%Ca^)NbWhxhQNdiI&vX)f$gs&sbFPw5RzguzqO~RHdCM&u;05oo-ez5^5flO_ z`TqYi^Xw%F)cW=NefhyYb3JqBcIM2PGiOTr$Z{1HAdhYm*7C7U89NxdcK7adTrfXJxYfmRY>6cz#RTe(2rSKJ-#HRV0@lmP4OxbUt_dtby~k?T)G|Fa4J)xqyXUBz1mu+Lb* z2u!i8kKN_9w3i9(c236pjcMVb_eH!F=^O}+goK0w84x?*uN~$Gh~%<-1?y>nxsf?m zGY71THR6k#l(=;%UTNWlXV`@kf-YR^dZLD?Egm<)ThNgR?kH6c^mgkzjIl<7BUnf6 zKz1sfF_>}FiVBIQTPiv+(sXFhb~Mc0Xc)FO8@my?B5_F7M>0Rdh%>vK&#-9hiJQdm zbq#NtU5p7diR^65#OyT9zK>eH;sL@kjQS{MfVW#ij6`BX5(;)!Q?qLlm$=1xb_1(b z1Pi}>3ru*ip6%J;FR@p%V_{wtG8xQIKHr4_818o@ERDjZjc!TPM zg~ws(F1a<=54#C_PIHu6LvO=g^03am-Tn-`$@kA_1#SVe5e`+q8ju59=K}J#*Z2er zpVNB@bvr7Of**M3Eo${s2DM0Z3&2NP@MEfZLe)UyI=MRAMq0N>B>Fp~+ihrA_TnvQ zC1OSj7VjE=c={-eAzwv?7oET;T+%l8@p)0Z;$mO`%4oe2$aojib>R`FxWerE`G*Ds z%hw6wfHDFVGXM+k0~W8(4$~^64@UmGTWoe;`h!=*E`fmup_#oK;_<(ks5t)KWRmqB zdW@r{gI`z~#V`{mp1Hd7c@rliSjUNzPhdTQxa7h(>pCU9zFy5fs9YN_T90s3K)Xq& z=ewSz&|+kL(QddeT5~q%C6hT8p3WJboP*eE@&sOvv^5YObz6kJ0o)srMdl10_LPi7 zL)gPcq8qTgMBj2d60HL z^GOpGiB3bg$!(Q1gNE3tq9-9ybTs$BsJa)WIjW9M?y|En;!7Kja@XxlJLr7e@K;l2 zbVr6P#eV@9F2&S_#Y(hPrWlAms4K^AC5rLJ3CLYYgFX}fMoPSoD!hFq!QVSNn5ybt-_Z}fqave;h|_CH}qB(4#JL6 z&*0cV?i#fl<&ZIfAs7U32qgCi4aFBGb;~cFFbzqo>eyXtfe!bzl9B_1UBp5DvOT{f zDftEIJRlh>=#??4h!H78M4~69qgp+x6R0@KU#x4KT`#+$qy#x+JFqa;UIM9jpA-mG zqvq^`P>iuKigS>WTeHeU#U75thdkLBT>C^DlaHx2wqEohG?=&L>=ZCxAI;d?eInh0 z(PX_S%~{k{=g7WoDN{?Inw5pmA82XId^P_YN-0ng;9iG>*ez9Ymo%UIrpiSN^QsD+ z*sNZVf}+S}+SH1^8^Ob4MkB z-}G292;lt|bXLBEa(%%12z2}_U-6gO;TGibTc0D&Td@mf6A|sVKKo&K(l{79Khsrr z;DoBf@OyIgg!(tD#^{uua7A~Z0+2rR;|U17Ns06mkiPDmOREOq1p{~8muaO9nv&HXdvzG$!8OrHY3M3PlpTnCY1Oy7cSDfXe>cQ@ zFe9TgK>*-%hmMJ!g+v~R<(%&B=X*l&RlMyheyiqGce5jn=|j2Q2P@3Vb&tKw5&abC zq{4p#AyRPmVlD;1C%yX8o&|X;Ugyo~f?a%BB|8N`>=cL#^H_SuJE7d5BmE$?)d)ml zKZCFmGMXMhM)Uvzc=@P(Bz6v)rm9Ekv4D|>4M=jmks}W|VuMq#^YYx4Lm1Bw`>3(h z>zO^eVY2%?~1+IIO z{JtJ2c*9?@RB{K3-^dP^Voj!ObT%FZ0G$D^!|eg52W337vCBFJOnQ3hSsSYdm*P#y zER+%D{oK;UA5>*V4`6|C?`}z}DrV#l+;y-ki>0Y+Ox5>*f)+{zZyD-Xm{~ghU$K6I zT?1H~ofz{wecdla*8u=U%2x!kpKJF8KLKOz3+@xf{Mh-Qp5~Zpjk*Us`p-Vt+a1Vw z!`Jl&rx*u?HmSjQ(}JiVGGy!c7I!Y%#t|DPnU1gn$1xBYwLf@EUU#)A z!4vZ3MFfXYb_t{E8*5E$vwKn+?DO_SDyJt>`G6h$6?#6}fFBKLxBKigbipn0fMx`s znbH03=9aWTczT+@;@v>Oc7MhFro*>qhbe|Vv^f$Xe7$fZa3eA=r7@uCN-TByk(T5Hlw>S61!neY4+dS z=eQT`t8>iz2^Ufqmc~h}s8&hiv8X;-ovX&~*2}323k>8XOv0lK4_2Z19;{H;k$akp zW%W8)R*$q1C<@?>%s@t4j5Xj;{2k7VbY$=r5Rb#Pn^lg*M~D+R!z|xKYA^Hghw6CD zQ0kqS7|*rs8J@K1g;?N(mF(*#9k<}HltFkcF3AjA8QM2Wf1LW0$4|5CY$VIqAu>#x zUFW2=xC(X11pO)E2Xat%PQtP)cYmL_$>SJmmv*xo)W_Prn(jBXyOHj#+TBX` z2JLRA`)TdoLHD1vyMyirwOi4Bk9K#`eYAiycM;tqwVNE7%GPdf4pfGAm(jha5bcnnaFKTs&SpAvFwSPe znQvalWB2yzOg~PCGoU-nm)Co!K^R#uEc;Le%Ll8Gxu~Io4yWyqkqLMiLr=le+#Vic zXO1v#h+s1ZJv~msUCiaRbCuD7*uf@cIb&zrv6Z%CuI&)rFCX?nbqL{nqk9Qs@ke(= zJH@>`$-N@Uy)wzYD#^V%$=#UbZZ&S;S$`C3X9N!6%wHSt4x~VAi}7~AOJtPENOxzF zyDQ1f@xec);rOuK93Qruf^NfUNUQqbeQI~X!>V$C*&C6Ya%|UvxfoXowH5uKFqFtH1mDhsr`aGA zu)raQG7*l&KI{^?S!NGwP~#;G12e+G+()Lv`^a?Q6as4a`=}dc~OI9GI zlU+hbJazDO81kpxP+X5cfX14!R(A;-Mh%S7RNk}FO6-m0%!vlV0zd%;`2XFyH)g9M zK>-^UwR=5!1D(aL-~uzBiD|~eHAMG=R}Erf^aFZ_QRs&{Nvxlv(ZKC~z}6g^pEGez zU{}yjaXorrs!GRvw1e3Tg}N7>&1Wy56WRe4%}+aMnqxD<2oN+Vf^;5d6hS_wLk&XW zC7Ex+4N|BTLDV>0YnEpu^yQ5ugP%ooLz5(sdF8iWz`2u8?;Zmd_Pd+p1P_ij92o6Q zuQ?nC_;(^#^l*%j

~VBs?@LQg_yY>XVZrM8nrabyqY0`OLo=_$4PxM6+)$)&8VE=Y-z@^sz) zQJn(>WGq;j4-Av3JAtjrBpH>k*6*`k(X?vnsTmGzUts70 z!&Q`RNNnbl*vy5#4IGeq!)$JI?KOJ+wo9%!U5x5_kucwnmjf+mXU)j+Q-^Jn*Ln#X z!8Za0?@;7i&ZmuL!^CPO?W|sthEpO64ax(dV?=lm2wj{d_p&PIl!h+Go))JXf$+F= ze?ez-5O^@Wjf;BJp-Sq3!VE{OEbhG%UTI@A=6v0lXjvNi-R3J0)iakm4|mgiw3oq$ zSM>u~xbs-9ODx01u=txw(9P1b(%2)>CgOfF5*+OjCxJj%gRiGMUAuou_wExVdb3+?#^@}0!!I2jEm;X@${r{OF5_?xTQZ=f?Ha|?6S&$TblKAt(xS5 zLg*{U^tfDRa#cr>YnsUgt(I1G9E@7AZ=n2{`Sd|@o%;!L4KumW`K{_fmn5OLoU&|oX9m8xzJu-TixyJqiyA| zU2vI$D{Jsa@Ti{>h&A{PxNYUIEp%(;unkNSV3Oe3e}P-8m^}nn9LjPg$I@}t{Sh(U)Mls29 z4J8L|8%jUAHI%)%NU}gfc^PgEr46n)l;@b_0uAM_aNAHGrdvb#Et8xfP%tdxJXjC@ zOEcCs^R?&ziCA_$DGi8Z7C@LHvHq2#4|b0L&_A6`Y9B!jdOi;>Ao0K}F@9-a zC`6WMN0B;9J6!7f+Tm6C+EJ#Cr$g`SEqD2t^~o<+@!$mO-wfH3fkX;3_=&p#>)u{) zZE|-Phri8s%OxMZRZrNxA+5@ZR#-T+7%kFn4zGjrb2H}+@P^N*AA1U9VWLpo-`(6V zFDpp zYN0Jzo1bEO;2+0xRHteNKEbe-DfxQr?lQZ!aBZRAno|e}g?I?T){&rk!~&$(FK)rd z$;`m(G?2ocK%i(c2a~H728vUF{Gcx&Cu<-@J%P9Y#04O(9zec0t`AK9i9l4x)e{Id z!E?L-;_U(C(Y}B@pn-S^L`wi#N-hQIF`nj==79V_!nS;XgTUbB|?a z-Z|ucgC(E(p)OtkVOto-i}qn|Wxb*LRrm-es}_vnrokr$#^oK%Fzr&R{_k+rTt>Iws-KS!DWTKh zgdaH39}drE%H!_b-|cCr=P5_SGBI&!>4?d|IfANmI2i>1xrjIP)DpOPBj^vj5*(_Jz#Ffz7d5^IMWVUws#bcni)ZY|A7Q8U<5dh# zL!&UF;VY0s{T`a{{_taT*RA7kTJ^~0`pfCiH}@a73~qK`^zT_xPsw%;uAxyn6R(Ls zTvmpIEZ)Tp)pG@diypAtq3}w!b2#h;B(?S}ZYL$kjbF&$ffTct(jQt^h!T8j zm%uY#0v^yNH^W6NIaKe$#~)tDKsytb%k*2*W0|-mM+mwSq3{a&tj6Z`n^hIeJQz%Y zypH%H%4>W6&|{SQ;lVG#)Xp6qcH_3wa0`57JfHvCWlWfkb2S!rn0rl1Y4zM}Lstf+ zk$cNXE>PlNLKl_GMJBHpwL1yv*#QXfhn{ls6JAGO1YU=93pPYA;hzuBykZzJeK_nu z3N`vo_Nie!mN5u}Jxe}vMZ<}@5(LtB;-gNtWUTLnyJ1-uBP<WFD%B zAv>$&(op@Q@O#5DZBg%lbw)+Es2x(+7di)dJC_E;xANrOugg@+Ao$KZM=H=YlJiwS!VE?rvb z{KUw51V$F(rIlg>%3-yN=qC@Wm8?kUsnxnZ^l?}zlp*`<_^>L4kS@F&(dxw=98>UH z%jm~|S|OkKfMRAOUc$uh;TjHz=Us3&EQ{b514<$?v7JOg?HDZfeFMIXn7#NbNt8NL z^5Y|=LlBFTp#UU);rT4+Okm}=0+s#{!mMR=x+sY{x`6`(QK_TjK7cwD>6wUy<6xs> zHo&Khj&hb43RlXfel9*39Sl6k=m3(Tz-%)vXa<4^dMyTh5nTk#KyG&6lNb@K>aff$ z7!F&9>*N>K%xicg5xvZ%pz9i!d-hNCfz;EP1HFZ5}G1*a!_}H~@&u z$dX$nh;5$-nf+y6e`pp;2$(ld)KO$friDG*X|1UcrwQ_Mjmge*7#xM_g`v{V*vbV8 zWdmr(kbA{=kqCyVhfGSoI>2|gO)dNuxHVlL)PS69jYB_+@S?g7S$tM09?!&nNwdQ* zs>={)&&HM#7iwiQB)q!s2cc&dgqIyBUC0NammrB@Di}znLJW(}P7E*K#Qs%7w3q8N zy(42T8ZUsX30vG8yz7wzp_}>!%@V`ZmI%L&$jw@q?Opx0`SXR+sMM17cI-ZH_#t5| z^_IfCuHwCntSDaLg@ssSG=U7LU<(HH3vXyy4m|ou#0zE&`0x)3P66vva~QOt9m6Ep z=#29qg&@Bm1bmC#iNTshaN%L+HRl1)7BvD`^Xu9~fjcg#);pLWC?99QdeP4dPs1mR`NnLHe3F7+WUs@APr2`9y=&5W_a5&7WecBvO9 zT3PtIyw-G#fdT6LtvwojEr^_MdbvKNnP(9-? zbMnz9k8XsRY~c{Vu;53STG5IU=pj2>I^P>Cg&7b;U?REv7BC9Wny-qQbs`Kxo7Vv=^ZD_e^2Dc%@fTAC8yUo2ynd#&@m>IA6o zM`Gt*88y^Vww^g{>AOu_`}y?Uwjkx#S5@6PJTjYnPkV2El|-^ZHu}cVcwP! zFF{0_ORoSNyXCJy%cC_prPYfsqB%fS;I>V7Xhm006*t$C%mLHOV_DYvJ?*32<&nOu z-lPbkIX)qXK4Cq&qU#8b#CCnf69xqG(dZO*K)8hg*{WXQ?85GveSsx)i+b{}-Q6}R zunjCkWd6i&WKwp5ow}16U3KdIe?belo!fM0!+P%PwFuZG$bsZDkpSv|b{fm=N=}He zsxC+*G^rrFTGVm;$Q*}Q;TD0FHZou?u3G!CoZ?X{gA!*5!5|kjmz_5OIcA0>)4&J@O=#wD-%oI^9kG7 zVq&u}$;jaqhjSr5q-}2xO73af`v=4Z(ylvv)`UF4Bw1_V$UgAzhp>pQGFI(gRel$E z^wh9;Ny6Ajg?;3BtdATI#&cjy^(tdQA31&|VO!O_2St|wq8t&>QNcUKdgA8IaY-nq zoKqV#bgFX(C9?}o^aW=6MkfS9y^q8pWR-^=A!Hq!daboj(9wZxFbyo8Kz$e%DQu2v zM#-YowvG;yj9M*xu~kfkfd#`MVkd;D5bInis9DoM{$70OB2X_x0(Y)Ktv(Xz7iryeg;*I#PM5snmG(BGtX<6^Qr7u0T1dRTEx3n zG?p;%C?4)fNc`lCuVs4WUG3n;N~+V#O<*2{{`ax}%YgqI?EOc6YwSUc)HQdYcZBk= z51d*7(Wwf718EHsCm03D_pvxE|g!VP&& zaGE;=?@zIZ1E;wfo`BWmvtGw_-iCS?))iMnXG6VL99<3dWpH>JIg)0ho$+1 zKC%WLOPGC+CF9I(y`s*`B)yphF~eoEeW46RzMPt%)AuT75msl-4XUKIIU z4K3~^Q}UZjui<>+q$J!*y;I%isH#jfiEmP|JiYD^4Qp|CWRWhHj1gIRa=LsQk* zGbVxGf(8V{{5^K88QigEydAq6yd~)auTI%#E;tgyj+L62_RT4`wFB$bB%}kjdo;fY zCUFv^B41{(N60XSra1LETl3WX4DIp;Zv}DakM(Jiqv|qnl9TAns&eu(p!#&ISZ8J6 zrx*>jQ_gSBLJJ%h^B}B<>Le565k(SFfUqB=l{Cj2)=851`t^Sm~!D0Kl&cc*hZ&QNFXx`G<=wbBx1=vZ7z*oJ#fzriUl;dD_F54lf>8Q2UlrAF5 z>X3ttuj|lv+2MQfiwl_$|6K(a#enjS(~vj&8yX@98*j?N#$`+iA?<2{Uqf0!feDt9 zRSXD)v0o!eX~hRpItBu)Wa@FS0VG4*)yk2^?=X{zAm{~xzKAXGhpsAzTv70m3WbM# z_zdKVKTp>Q{nuVr4x!?HeR?7LS4jri5&$L8=N8lAP)i|;>IBv+h+VQ!aXIk}J+)G! zOCPkewxD!Sv;d@D(!5I$tbVaxgty=cmeCJkVgw(M!ZNc>(lXwq^F)kDgFp=_65iE# zI}@PYY&gf7IsKS7P^mIc>5o+tuRwnnY19pADbgss*xGw;r*m$nQyPU!e6b(I`6TXt*p%`7Xgw5BOiB)==#r zae-RHb#xd8hjZB){Q6gCIn*p2j9q1dx3lM$=tVq*9>J=zF_y-q5jY~RR8hY?>_|=aJ(70Ad zY5fP)<26P&1z|4g1%{W2IS2H?eL@9j$ov5Yk&Z>LXIM);=b4lilmi||^_dWTGLTE_ z7WK~e&@*-vPFDYc7!XMT^_&d~Pm)3!r>zI5|w2|2F%mhRe%MNBR@_?o6!dm z9t)W)CIJGNr_iX(9P;aMI8=Yl_YYeW1tYr8&U+VwO))PoHVyaoH4E7eT;$&)C9i ze<+Kh#5w43m^OgxQuaNV0u-LQ@s5kJwGbOCBG>TWj$9XVrORO}eEzJgbYwaazARS? z)ln~9FDo6`RO)c}79FSqG<&6c2TM^k!Q0>Xi2j14BYw)7veIceWAaMZ2?$u}94t0e zpM{Svs^z#F~`)-*f9aFp7FbPdZICAChlX1wgVq|5wa zIatG<@YGq*S)?5)C}N$|UkU`#l0i^)1>yUw!}HXvO-=49?;wzPT=*K*hEcdQ)qIE>e3(DfC zWLSsi!ZwKxZQhV>WQ~Z-KQt91;-4(FOhA;u1h6Dpezlml~bd z-_g7QqOC3JIZ%;Eyb`8LS?Yz^Y!1F(Z{x4qeyj=CjkDyko1062js|?5o2{FL7=|Ab z3Z@^ghl;ptgs}Y)0SfjF7-}@+j3>HzyTsdU!n4tdAT&l&~#oW~jH#!amu}FR|88p4K@ymEELp@YY*x z;h^R!tr)ni`H-@(!DD_7S=jFLXzf;Ap1a>1rl9La6EHg~u~)_Vt?q`fS58lKxv>4aJM+LN zXYr=NbP&Ym%rEFk8BQ_}!-L%$$KZxDF_vKn>CCjd&|n;aEv_6i1&D*bFpjVDc02#zr7V7WZ^YwTB&-e{xP5_pDA$k7> zAUW?#jU<}0RXrThNah~`Ny;IJFEp^z}23H4@3-*VBkh@v&f%n@xD6cQdk8ed;2CEJ|Xg1C27nB-dCX-Y|X==VDmhj{E@D6 zf@-bct2&2+GT;uw`dqAEq#LJi0NsFzy~RsXL9Ql9oG*GSrY4;)8mSv~RqXeJ<#Z9f z4E9ZzktSu>r;Fc%Ng`kHn;vT1A0kaJt@KwBDCdijo>lV(1)Y>z%D-po9@n#%GE8){ zjiBIC5fFej--FsE4P)~H#ZFT0gr(Wk0eX=XfWwb6?Qp88+L5o$(T*Z@hIV+>IPEA` zW3;1E9itud)ev!L>kygRO+upfe$EP5E9m~0c9S(y?`d}<-LGhOJKZm6cL&|;w7Zk; zC$yV;2lbG4v+vYz=r+;@z4)B^AtwB7Iv662aOSb;eD}tI@|$8>%Gn1vgz9Q~=hnkK}mFE)ABWaKl&NWddI87D-)c4^1rp{))_d zoAMmzSwkDW7Pia7&PYQ&Ej-`YF2I5F_n^)VgV-FkSQWh1WS1_e8<^l9gUQTi$Qu|* zg&iJIBcWp#KiJFX$uXr-3F@{xI0?<4R)w`W${K}-U9T z0QCfLi2=Yf67^wF11RbRAh$079s)SV04OAYKNtX9{8KS-q6My7NABc~JnpO2+n~-)k(oQmIcQ9?ENlOpXRx)jePCFNAJD=5c zYh~J{CM`WkJD+Jedp%1YtiuP%(+ud<@T#j!a(eus2bbW(9F6=gc`$;Hx8?Tb`0x*z zKQLvjgjeO8%=94h3VfJ(6~9X!WGHfMGdT!E?S`dI+rkoZNJ`{bp>q%kY53 za?pbujrgz(VumtW@j;Hy9GB#gw%w$y(`k3;wEr||E7dh7Z6(rnFbx*i zxd5tk!ixkAKFQ%S39(auu+t=*jf7n~VVOzjRU=G7FA_?}17aBxa`2>#;!4RmxR#@M z<|ld{f!4LEU1lDUI|O5ZJ!Iw(fcJ-7FyWhdl6E@byhJN;^UTk*bGA2hJI8j*?VKhcdvJ}4yPRfPbR zk9>>WA=yIE!1&HGSLZz;k3z|Rv$L$Yi*1RuXM?xmE;g_@dqBL0V_yS(Vdb|#2+g5} z{14hubV@m@{138Gu*zsl3&Lh3p?uGZcmb8)rhuOKHO8}#{SMh@K+w*u_`m-6@9SnQ z;>hgXUtSI3Pu~JW&&tmz*Lko1E_riw-XEOst@@g?rOyuL+|ZEJ!{4S6II(&)!abyS z8p`j#1(crca8E}(d&PIiKEtVtE*Sl-nnI?p9`>XheYOfotp>X7p?}{hz3Q_np8cNh zkbQ;`5dG-eiMT_p%#xNCqtB_ zDO~7Dj&Ip=iloHei8+NW!)@Il=`-`p*oi3(D~Ir^A03Z24_j<6HBGxa=ss7wIWE+A z?QW#|WbI}Hsgc^fg6?eXCb>}=;+{5N?K_UZr&X#iw4+=p?eMC1wWCPAsvY_2MLI;o z6d3mscFldC8;(@**iR&k;xUMcd*wK%j~s>Z965dDIJ}P>2mZ-&x2TMpZJw9AGf{%T zK7-T@Ywzoe7Px+czv>&!4U9z#JmUAXlz7l0jztT+;vZpDnz7@s&iAVdM1`jKsmN_E zL+ka6THI45&Kv0?(xbj7k)FOHU5etX&=eO{F}2XlYFgCM-3=_de)Ag~!RfX<9v7l~ z6|NizDI$U5P1Skkx~^D=#5Dx$bJh=}Jf%p@{}IPFT#>jjZoP&9n$z3u0#q-cO3r}Q zgv)7e3xJDT=ZzEqlmQgd2BvvSz3W{H8*twzYiI=e=CUuh-)X~|-2mG)UEEz-Zl^Z` z3aQf*C~pc>OwXaY8@wSOuILTa)?o)s5ooNm`*2x|eI2Q6Q~wlAT=ROY1}=N+hwAHpfCS?;B7 zf`sJ@jk>9#_I$UBde!T*boY28FoWnXZq5!b!ch57YkDGU3I>@L!Q#T9B;D|mcTA_D zx&aEd-i5J?fYm0Z?Y9NOLx)648wProz)F2%^kzzrc?ck?U3w4}dU2J$V)_Jc!FF$j zdy==H-D9~YS?&q$0&L71S$w{lA(+F3+;Pz$a|XaB^~gM3XU4NTIx}&1s@zQ78u_$0 zgh4D|^mTlFw1P|di#{byraA%bBz1a=-&vR$eL>V@4nT^4vvXg;MqkEM3~YrPOL7IP z9D`6U`eJnG=PWivFvM$zy0w787oIhchl|r@Qqe(&1wuDC?dXcBMc$0AB%eQ{!v~E? zm>1gY3%=LiSAYrHilf54S=BivncJG`!s&9%htQnlP!B^-M`&(xC=Pi$V$Y_Xz!NieJIS^^j^Ae`)B^*t+oANbp*lYevdC4fc91tx_e30h4Ce~bsi@4>+{C( zwE=F#?5BBXL5e##zPQ8%O^f=5zhwr?F&r$f`hx$=Zgv!UvM_aD3KYBy{W6$$&%VP8 zSp+0S{j+~{4qX25vCEe7EtF9~h@kd0@GX=bFu9zB+$xL-|!}>X~^auv=d%j>( zR&+JD+KV=l#3ifN_BQTrUsp0VF}=lmKn7t75xRpfCqMt9Uo`_&^cFPxGH`mM5{6`6 z0YyMP; zUxIUzf;|kLAi=pw!Bj<#jgnwzQm~)F{czZ!3Eozl;CZ(z|HP`iqT0h~8?z_^icNAt zby(0R-0>_d9k|}E84=89-J0&!$LCm2aAd-zvCuyjhFaxm6JPhH>^q=k0JX|}pkfce z1uFLWui}Q|C;ZYj9G_HL(6j!#IZ6B$hMXukWJMS9I*aDos6J}HFF`OD0VSY2b7Zd__ky-{xIF<9fICqAJ1u!eh0=fFwX% zS#ucQ_^2MqE8R^h3)u#?CvyE7xxhp)svqpsWcP^vIieZcJLWQG3Egck|@1&!Koay-albcp`-SS6FJ60)Aj zq27vie?`dzw!jQ%`7dyZRApo-`sFI{`QVUofL+{LGcmwtT4?zU)C;CK!3dup9tEDVBEz4d5|#EB zt6MYiHcbr1e(*j)OYCvERtQ>)!St>`<4bClTxjb5m3=3zEr9`(yNDcx0xc^= z0=TdE`C2p6{1r1MF?qrB=3PbXGG#GvR9_T;xaWj}0Of;Nd?;c|3~&2_k~?Z)sug)- zc$N$7KaMO}zEtpCJg#$JBv3JeH6}|SOBP;}?k{vChM9|uvNFiqhFJ9UG65=62nJFI zTKfX^-FB9KzV2q&o|CNvhX`70;kDA-TSZ^sbu3)I@Zq=Namh5cSn(&d(-Ns+ch_6c z>fHm~0wjC^Z>ZFusrScD#x?rd(K;Q5FxsWjl#S+W#icCr`Fpt_#`QB2K)nTA>xx@y zGl^%hj?lkYll5p^ABR1`&*XOQc89ErAqPOLm;Df`!m^iXs- zcA~MsZStf zJICEC)OjKGX{|n43v%ou35at<>LUwNtGcxmbwbCu@M<0HU}VfKs^5(PH-1~JJa{0h zCR+!4ESC!+fmliKKu%Jahhe7%59B6=c^P(e@PIQZ%+D}vP`7b-MqmNc9qj1uZt6&P z<8i$0;LjS}x*YTIp+-IkZBl9lImGLw7IY1ZcTi{poGA_fzb3ka7>jz-SMws-=^utY zM|0D+2^()PevZP@ENbt_8l;64>|UDLt2)A(=2Ev{Xj|>zDzDT15?tVMR1MQ^Ynn%0 zB=Oqp9I0LMwkS-u>l4wmLcg{oP;$|t6#p%-fr>21ci?6&Sq@?HLwCC5)&xgv)EbayJUGO(V3TzW_*_RUef&0_6i`m9n+sLSwx;>jJj7b<;mNtNEA94z zS&F3Qm~Il}#7gW0sSR3a5@f~9x-NY&)NXMXFYxFdNr%Nv(@ug2 z5F^EYUTi3$auC&jwKQDjYBsW{b_MrdSu+~K*}YfJ8%P6(dp2G<6-tp%&a{(zZ!joKxH-Y1^lT`(ch`xtre0x_14Q9;?Yy(C7|!nbZ#$ z$e9&L9jIuZV)cu-ttR&%wo-ob11aUgBWxl!TSXJ8+t!~&o8{p%o`Hkw5zPBcfzH~L z&ED|ByeW8h3p|s@*VN(kU`hlAwNlbs-+1#h@P%2`BTKE#?(U6&ikIBa9EoZN3O3<+ zt;x;(vQLim8HG8|4bYT^Q8`nVjLPZ?Et1z}MP_fy)Mq}_2o=F~| z1w{zuMq6vViBMA%6Hx_qw42)>#(~gbDaYDIHrtteQRN6UUb(#*(CA0<%M#_7A81RP z-SSwUk?qecwZ4iCv2~BOsuSPq?)F%nrPgP95aV_*SGqNmLI15?=5DU}Fyi(BKr7r2 z1lZx25+3?9eghS6_%bk{8gnoisgoW($6j)Gm(0Xl+Ycg9qDVK2#0rYVvMLJ(wbHAK zVhc@d7;kk7+FR90NTpHYbG2m>YR9&z)1z2ErzCO}nOvPX^ho4#nOr)yO?|EG*yi<4 z*5>Aqv7|=ZF)tG6-3t&vPxb}MArB&F%Y(@6b@2z0zq&d8AoAVJEL>Cbdh}46Isq^f zh~*o^ew2b(p+QW?wy6pr7NyiNkuld~{3a!%(`3}KZR&fhk?`$av|X0T^U1q*J=u1& zLFu*Z*fzBr2u5LWGO4gG&r9R=#a2#KL%A zFM;I_lhKn>Scl1|V?iUC@eF26ZrtZTMCkD;;93p1ms7yC8*n9pVCs#jvg=Kf z37bNa3qk&T2dG%&-UZDZPKvKn8wwn~?s}LevgW8xKm!^{|65WFmjs|KZL_rt? zA)(AjC6u`WeyjQhh?p9nP^T$W$F`{fC=`S;c}$UGOY~os0rU41FgXT{j%`!x*{IP6 z5)=yfT`w)r2ci6UL7Y%-zA;WHuSg=4V@W9Yg2G3A36SV3(U1e^tVFM%P7Z^Nj%`zC z0GVh`N=Aj2BLVAtBe^jsY9;~Gv7rB~xoHYP;bx-HoI*}^7)TGNKTlJc$;!8%pRQ9qW^U)Sd!eMHg#qC4pM0)U&Th+5E>1Q)N z!rRp6KqR^;CB2vF??_2s#`FkpQ~!vsbB1}CNb+ymM1-YV)r~t64I+D0BSZ}%Z|ui* zi^|a34|*9p-wu*SRwSWufFNdDl`{okA(25i2vQO<0`5`dwZ%6YsC{Ap!{bgIzjU)qLv|)Eq3|)2ZI+Hkli|f>O#-I5L>FFmjs~-Alo|x>B_%U)-;;|6E<+31haU5Y zJmSbe_1ov5P-NVXTab|&cM06MPRca2mX~iy!$C-Zy-Zk|2ckM0Q=>_~{v{;qS_<#J zcFL%9e+4X7ZB-Qu(3{D22?{o#sDcja!Qp%|oG&;9aP@SU`$k-+970Si_(OsD>Wpe` zG2p>YKBTV?2jv4nMF1A6@$Q%0GFFe=s1rg|m%t$hIJ6s!O1Ndp*{@#yMGtiDU!Q_b zu11Gi=zpCHbZ%QG=-|i}mN*}-l2S0EiH@v5LHQ7!ximJyt_X{1ST$Uugq&g((nf3d zl(VtlXhuRioz^{Ent8RIlVCWb zAu0+r5j!D-(8m~`0c>3eD%7Sf`W*D8xqd6kPqUNj#(yIPr5wktN80hh+EI?|JJ%pS zK^NvgDgxPm^`&+qQ?xZ@l-s&6C!;-)bmjy*qe)w8T{sHoCGG;K+O+$}E@OkFRv%D8 zC6gdDT_=rIJ8*pC62Un(pt&(kJ27^5Afuh82Cr}FOa6OyfUDzkX#!X+`ve5LS7YR` zG42?j(rBX`)kh`Jz8h;2?-q?o1Wjg;@FARJU>yOY5DdF5euvi)Pl6$mmB#LuWI=Ej zc2nv0#_KIfLjdi4v>ng(zIBi;s2Q{qlEv4O&(F&sZhgbipe=J+-Mh*=(=%kTr2v1t(fz zRH7Bmv+Jg(0Y7F=cRP`BLHtsl9n_bWE1IhKsshJSns}Eno zDmBA)iZQ_ZtM79(%AoxBy_}1Ja}xDCE+wO!^a=e|e=9&YJdzUId+=b4LfdOc?L{eL z6vIni@`&q?zTvBwhI#pt-2{P(3*p`5E7+8pl4mOvVrvYZyBPJSEZBjJdF20jn6v+PjcKV=}i3Obkf2Tjbi2w5jo{z3`V8&__ z&2-Ud9hOl##YFSJungh^&xP>r})#Equ{NGgUF-agZ1@Ufkgyf!egG;n>jE@2;JdXcb}NYf>N-#+mq^0fMQz z)lyJ0NxMs}*E|KUy1O^|Dz-rePq?onnh!#24`ji9;gs8yii=C^Hq=iCq_p9S>PmDe z+ORCqhP3K&$bkao3Y-nQ*YUU};ttQk^lwuyjk6m|9)@#2gH1RFaEp-|UwMGzJGHA4 zB57?pBxx*45l5QFLQ9{&nX+hQH>#FI7otcMt>xwVSL>z$oqanQ=g-RzRJ;NOFfhVk zcG}fX^KC494^tPr^pQ5Z;n}5Lb_l}T)LYx)T}tn70bVz&S$w}iYf}t#cA|sPn_JcW zDey3AF#ieQ4#3j@jKs&<9xuS|uRg~-sbOk=^&a!H?J*DiItcfrF^{#;ZBu)`;0?u2 z9f0{>7(2<`+?)pVs|`!Qz|^+hiMe1xFmud!ggOeQ&!uRnOWg%6aF&-Ae{(C;Zo0p| z^%VE+=CrDlbs?zrrQMs%z`)Ls1B0z_{@2)O55=s5QbW0;W&o@elq1#w0@Pj8uXMaU zi%>$jJEJAom|>>o?@zMZzjr^P)3&PjUa;Gj{Rkppw(3K%UK6^_h8c~LC0oJ49cLoZS&6dr5e^j|pry5MAEro$25X;@W&Y)l`iv}d85}sP*U`QTJeuC7E}Gqonb(d{=fi-e zPS}@dZ9LZ5n9I&(#Aw@_le5%GYZx(FMtog1va1>tn-G#4$y$JA#^q1tZ2AKUn2;#I zUU0I+Z4?BFJ;U2$6u}76FW5Pma~t zjVQve$3cH_x)4WQ=IqAj6U~tOtlB=z&+ybh^}9gFiX zG-@PDwl)Fn^hAH^dEt?HQ5D^h==ShZeOUqpq-{)e;bOVQL1})g6x60pMFG*Iqh(}V zEm2!l>xSfvjS_0dwyCc+VFX;0sE_R7P~6=qxwye&aXJ?AU*t;U(Zpt}x;bf_EY4eD z^61z$Wg$;unk8oUXRKI!z|Ci4-k+!|X4?F|X8ogJn0w5(N@hJFku_z04kpGjQq6oj zoL!NlD`qTddmx0t zmy$TKUSEmC5ltI)qo7j#{~a=GQmB@pw-7+ura*}iJ zWNxgkOv5V~>PspBGxtvBhOOAt+_u(}*tVLwl7dKB1UiQfty={6sQ%yr2TbsuEb(~r z1n!YKiLo4v=D-$o6J8O)lV6APaqH^C@SJN7^sNMoC96498io0$PNy*aqEm!@H*77z z7|l^yr|5qlCJ*2b4?gXmNY>$D=Uv#OC+Gf zn~xz{48%NghNh0wkb<|2J5YUsT|{zWI?ObMD6ALKybo?G_u3;nrAw)NE%yZ;&8tHj zlv-bE@dW4W)!4pi>fi}oTc};7P^|0^scFf~*kKfzmdr#*Rj!W2WrOmn!{csu^-*r? zRqZ9bqAVQ0OeKT?c)yyL0y+)#K{6(I9h*zPwci#b>PE4pPXvI|FL!9_1pJ?*hp#OH z(A(GKrBq+a*4pJs6-?AF^iA*DQ7Q_K_u%!>m2q3bNmoLHF*Y$JXoS?j)&fWsxv_>f z`JD1|F~>LHWVHj~@LmUE!0TT& zk)Ka#&0n#*LNbKgj0mEybCY1`gIC?Sj!=5);m@PKp>wK0HwT{Y0--z5}?{}Q`ZDsFn&&h%a))q(B1D` zw7(n8Snamqc(1HqOrtQLs#D_TvH%-C-?nm7CL&PeQ7-!nF%n6kc%CU1A6_u9^Z|6phY zN{499*;GDkQaHB3PS4r^bxsU#P2>LYJ455nxQ}|1?I3d?f}$B=GL*>!?w!=-EB9qT z4h?af&-t?-_ve+NH1R=wdJA?%PVsk1N+5@AEld>0!&|*zahh(}`O7g5T=K2ScdsFa z(CGJ#S?|BLeP96hy02}*=QUr`Cr%KaK*px-t+5x}YtT$}Ivp;YS3%pqDdJu;1ff1_ zqpdFeW^$!IS)r9d2Y0=WmlrCw`@{Y2Dz$Pw8Si>R<&#RSH#}+Olk9#nBNOzj(1X!C zjwACy=$Y!iVEqa`AZg>!b{xKbPjP$gbhov>fTAqBTe!gK?CP(3?G8%hmFJ%}cwg$0 z76M6aqHa3g>T4Bo_p4h00KEQb=f<;(3#N8dgTj%b^7>CeU5AdEqe0;ch zv$_jIuV<~|O{g2PXHJm!fVa_l?1M9nN8rV`&coYC>Vn&VqR3eX%e@7JM8BQ1$ zL3_l!gn(=28@+pWzyh72@+QRj9CyX~W;ibV$qIs3NTP!o_ZU8?u{+kCz~owO8q%|^z13p#y^zNTy8 zIRR^<`x!dTO`W~q@=Ed4yv7mo=m1_=wPGG1iUYhC)M()20kY%J0xTz$st#gGf$TDDVwr8?Z4=(IJrr+l1e?;W8ROK3kM?!TrHeE5>(-P7KFieqvao@*CarmK9yvY=w#3yZV!8pgQ$0TDTD;)7T5v3W* zk{oZaeMG)n8^H4h{+v$`SE@sImt2rmb)0tdNDxnD3gbq6+ur1S6V<;4~g4iV4Gt(RmS!!=hx?G?%?Pel(;uN^9s1Q%lHO8`Nr}mFv z^K7z_a>pbMcT7?UEhbh%=Zgnw5i}cypFQx-wFh2_47_17@FEw)2i_}F;{)$mJ>{Hm|({zt-t&|>LiH{lyd9v>D6v;K;zD_LJi#~N?is&}SeQsJ@ z;NdSWzWS{{DUAzv0Dsjm8g_5xRGe zn($#o`P59)rbv`yIV1zNXDOtKJj1a4=fUp}KP!M@m#I$!Agx$?Ac?pR3s6#-U{CnU zUKwLyHu5@phqa%~a=_uL-`>kY=sKMxfDtUz-Y6JQKd$kVMQ|_IumspwI8hm_D!6!x z9RuEm*rHDT0_&{SiI4*(zonZfk>as^;Dc$m`AFb$VQtacf#{IDV=b&|3B)4X;KcGez+7u*JFT~)CpHg0pFq% z?&$n?osbVcyLTr%1-tWy>;$l`@~+ej?18!9=$QcV7)}%K5CwjkLAIXFTcxMMqb6)O zr-Bz@c->8cZhIq zf*pT{niaa_ISKq!Xzjk%TP*eY1i(v74~4nu=l5U8gk=+`CK5(yDxB(%N-_bePlmPk**^ zXqk_W=FV`oksxnXuO5+R+B%wzE>40w9V(vp1J|S=CN+fng9Jjg}805&ay>>-$lfRiw*N#O*Kj_eD5?Wj5qJ1)O9JIk~#A9(j|vqwSfEs#B#O(1)Cy_oON z$!3vcukRU$jp_gM8Hdd=cKMibPmE5QaktzxoV#ko*zsn@r5!HY?L~8)Dvq>Xu4+w)+(u^wyvui4Luo-99#mu;(m39t2<8*ZDjJtABn(2i9Y{n&uk{S2= zKOL;7#EjcJ&@L)I;}TG0#x?)(U{De>?#VcmgU>j-qV|ltAB>@Hx*ju5Crp`f3i~dd zw&#p9$a2QLw#6QWhn#VJb9<1+|3BvT&O0uN(KzzXBu3+5$S;!_jZ5KA;`R=d{6~z& zKaXWO!d`@JZqLIK65QT?EHFK}Jy?#hhyE5d;a~rb!Ds;s(wo7U`QpD}F#dlv{)?lM z8h_axNsW(33{x8aT^=MPSnWlV|D(pgO3Gp57fK;?wE$vLmP z%CvC5oCuEK3g-krE6n~!vj^rjuH7&Y;?vTM9i{b+3lE2NfdSM*+h0-Je>IM-x?@?9 z?hUcuxFHl0PCsQ^jrTsVQ+xW^?(Wc(qU2qlRZ=vzWP%O}E`ZU66ScdgM2;P8kI0U+ zM|A1q8|jpdvs1IK-j)(4$UE8}$9~B+XtibAR#@oVk{y0Tr?8c%`$`w6f1&owxZKBU z&4*dq`MG>oCVo(UUIT_z4=c%&5Ej7;Z90|T`p6r;5c|gU!;)VWfH{~`F2I8V8Ayzi zA+jUKAGg1|G;|fD4I82S9S#gtgEk{FbVDv>7S4psg3?V}-l!#4B5$M~Z0}N9rlXVx zLM)|&V(@2<-4CH@RbCEeK8x|^4ORc!#s_x3)D4W2X2=PfwMRD(%+dQRd_e3aNcnL# ziYItQ+pbj&-FW~4Kl7S&->uD7JS!>9Y}1M-+JaSLl@0`ZJ@K<^2^!KM6}k!8L~tWQ z%ANu|TgY4AeJfdP%r@I06+j<22Vv9QLT_i5K+eey$HK9c$Hlc~UgmbjKHVV;kDxqS`L3YJCuspMEv{VqMUV-VgCuBNQm~;W_Op_?*7Am1AaGPlPVVcBwqyw{~d% zj*;umzeP~-tsQ$rK>-`bi}F8$_rlRhRcvwds#U%Yx>$t_#P!&m8B zyXUF7U){d*{;T1e>s$NzweNkB{ozDBWLrMpxAyA=_q5)>@5ZtI(DFJAL*LrHdrrD* z;#coqfPf_uuJ_W@pFA1?6j}JzF5Me*{dmt0CnI2m1my2} zZPEJA9$buol@gG3?_E#s`pGYkLBJ{r$T@Y))gM29_!$VGywSJTdFhlbTdbphihxE5 zaIe1O{s%^ke;EO-67cXBYV`&GGxvK4XqSM%`!C)2(4_ZfB4CFE+}HfS@1J+e`bQAZ zApsXOIa}U*Viz%067YxH+;=`*@o@_`Mq z8PT`)*z_$oj{ExsKR^I4*7??+)$jiI%ddOrIt1iMKvh;z%M&}!dmRCk!=f*?{Nc;c z<<&66yPSeVbjSU^=uzuFxex(RPDa4)iT7+f`4_J|hJZo|xN=7@^1EppPe4GC1hlT| zKf2`JC8Y>(Nx)q{&Yt|sQ-@dxpbX2mHhRl7u0@mDi7EH(zO~zTZL3SaWyP5YD3^dg ze*92c=1$iQ2$(GaKioPkW8epi-a$a61ibaD>KC`nu7f@7<#Q$And4*kJ<#O12m$jY z;HGn5J)=07_E!YdNx=K(-u2p`kAE`;0ZSyH<<=7(AF*ZpR0KpM;8)$A%TK%i>N^pz zTmnXouX=RS@e4*FV1)!soTJKbIcGN%)t0Z6fO(tSpV+zZ(;E@6N&-Gy{=13~_wINf z0jnjTWx8|f(zd%!K|rGf-1)z*JM-@ya|r@kCE(bpi$+a9b?V;{&@KTFRy~>d_V26k zQsMF)5^!#G&Y(4=Q7-~IB%pTNi^Hp|ZFeC+Nx-dFX_xAcEzo`?Y2`0=g1>X$d9jXnF3^AJGe zKfbkXhrgSC!7naYhJYdo_*MEnjz3L%o0z&J;JD0_(q`VfrWgTU379m{pT6?c>YpQ^ zOakT)UEZ(kvQIuk0Ppkr)=oP!=E%9F^)v*`mVjSh|7x0ZX9N#PFRzqae%rgiNPdt42yr-K5z(BAxjb35Hk6Q@9M7Yb6-osYDOjiP&Ad2GE4CQaH%mpFv#&(28I_(4p{xc5^d; z0D;r`MDI$D?g@Ya1nQ&n5$m19#sGu}66boly)$K@0xS`7ZBwDVZ2ikND|HtDQ3T5R zlpE!F9((|DR}!PbH{Ryq=Pc$z4p`C%_u4qq=Vz~kBCzBU_LuLL*)ErQ3oKQHvhF=P*-I564J-|Wu$QSpb|(6C01Cp6ZxPblbWz-=HE}-x4dL+JEss@aYrOz)KrnhZePmOj7>R`<r$X;Fy*aiG?@9 z(ywYY!$*~G0|X*?C3t^xmTDxE(h=S&w|#!1oUs*vf$+e#?9F*w+8F>Q!l1#qRcBiC zWdT?S9cN`NCYMC62Vf&qN~vc}KRL%8fP)aN;$b86b6Fh#7h%DzV6j0&gy zilJ=~okn6IiXb^Amvc};lEgv+Va15H(;IoE3;=0_L(iJF2@f73v5-f2AD44(;LSUI z0C;lz6@pHfLF5(^5#kAl2*`U>Sk0EP&o zex4QM_Sn1wpdutlWm|~^%qFp*A*iU><%#sc>pb9mAlTa#d5n8!#079e$Y`O>eIeYs z7{D9BvLt8amBBOH00I&2o^;;3zGKQc06IdHX;8qlC+kTp7zmP=NBSgV+(|5$2uf-_ z?^i6S_Xc1g>~^Uu+@q1w2Eaz}4`MD2*sMTe!9n;kB5%?ctZN0pMQHBX8vpKlXf6N` zLFh=?ZO@V=u_#3tET<gyj={LDbPN+2X99$WFKVZaE0ylse4p@H_WSx9=@MF4q(qsgji z_ZSyRER+xg#*XF(W-TYNP(`S{RK}@R-02UXfsnK+Y{**m#wdNucsK1SOg-hd$8%HJ3V$203G4Lp<~zUMV1}|U?9AFH?%2robeC<6T!y* zS5w3~KUDx0LVodB&ddY74ghQf-xFV*7gfJ{1i(QsHgyToT=AG>jf)V+;*a>6F?Im( z5R}$l=;^vGaTTBxLEHPxk2U5KNG$jW{;iWotvQoPENT$Gl#2H~po#|rG$Ayfp8xLf zO<5s8D?;o&4f}atuCE0UAS^lHQ@pxa#~EM%!LYhL*fRHcC4dlN>xwaH1B<&PYa;M7 zI-|lfW+Q8(vRrlnh$2i*7C1}VKD`bgfpDe3G03Ck5t&pPLEW!>1)zk`uDp}q*L8rzLKWe$?KS56s+S~d8VHev8VZF8H(UWI2y+5_bp2JfQ~?+w z)JUD6b=m4yD2as|!Vb$H>+;5? zl2~{nT)q44fXCN4Apn60VFS-3+kZ_UPr-Bqv9?Pq9{-p^V!=R|SGH;oV|1n)025(# zs6~oI|DqZI7D5AkR^PRsH%Qjl2S$D-SeW2(z-AJK0@WRY--D^TV&E2gy^|;H;eCVC$VTkkX}`! zdt%Rd4}eyLwfh3Y#!?nG00vkyuC|_(=bdijQ<<07xU8xX!BWJ-wa8g8Y`( zsBmo4+FK11&TjxvLKr#bv@LzgLN5Sv-I7tEVEA$LzL}ev0W=W!sw0B5Ysn;Q6a=QD zpmwjOi3NZmf_!<+t#se`EC4FP`q-f8}nRFh2hmb@!_nr9g3W-H2g2A{uouWbNBo=&xsPSe`XN`FH0@NVPopd{P zv7n(7pa~)I%9s0W$HydVtq9ucZ@spbGpqpw2mv1V--d+GdH^thU^2H@_)#{I#6pM= zzcP66g}N4r1-T;KsBraOVf$6jqp<*@2uW#c$37i5Cb5t}(BJDk@_IB*3qTqnGObdO z-M_*QKptVv-gC9~Eqi(aln^G&>RB=8;(L-cRfH*ub$gaAE3^e5uk$b}oT-01)zs9# z5P*WPA@xgy?#z=U7KR81cfOq&w(zGh02SfQwfl>v=?E_Y&=4+|4c@rw`q^ISD zUj_F`*0=~tjdvA)_<897@DO%qxEg%>)Eop*ijYLBiu(LI?<)WwVNbeJh?CtC5{nvy z)P1`rRumaJ0W=}(%uEuEI(FePKr6x>#e#7mCR7p&0fL#q(Fqe1*gF9R5R#(=lSP%c zCISc%A_Q^kuO2?K2tZ^iK2WtQ+&8p*Bv}(hSeUe@?qKnY695tjH}<5J&t0~H#6lWj zOR9OqDpNBO3weZ-JMYY}VBK~BP(t{5%}g#!)#xdJD#G(H3C+mHtt1v22rMxL-`SaG zr~niMRVm%hC00{z0vIA}x_)GgoxYyLf{Ji#Q}@VL3wH_t4PiL2y5~$*9UZ^{A>pJA zpI%f>CUrwl{>5XCI~GB9Aa4YlF&~8qLo*Hl1R~^*bm&g*l&c1yBhV7oG+$YxNn*i3 z;3`|^s$2V-0Wc99Z11~y-tW8(z(SaFY>8oe)EJqRjj(LUkokD-SCTaj!j8@h@{y~0 z&j4@{X2zYFoG0oe3&2BIq%=j`W7cDmwNix5)ETm`6dCRSe1u^3g7q8&iF$wD=J9V1`sx7jSLp-iP8fQ zA_Us>boix8MgWMwb$9SXgcirK6ABaO1BfET7nhIx&=n=IAa62lRJi6uM9*lL#6bXQ z1go(b_5ETBO#tNDJ)^=8zsHZNywoJIP(pb4Yf_*6^&?~lQbjoaL+oA2rtS;?4FnUl zm%@_dI1&pALW0Zn!BZwHNGuEyRGx0?_!Dmy1wci(72~^R-NH07DGgzpT$k1UP39yP z4hYd&&+?uJat;BwAxQhhd0rl*z6bC|@RSOj8|JJ>ViAbYs4Ti_+LLe^039LIR$`xI zjCc+J10k~IT7bs_cM=OG!t4^w{#P1x+W=SyOHLm7aL4ENIRG}ol#d;;h4aiwEI0@= zov5VTYmCA`aHw*!`$R1O5xA(usL=F%Yr9^I=urSsgv$kwDk2ul5&%db@XijOJ6-2a zVj+#-E!91LLUO$gfILE*a`nc^#;N%LN(kSR&ikzQQy{TWMHn_%)Zx~vOJbpc(0z7u zW$ml5H~EDkRD|%UY8o>FYRL{nLzq6t#d|?t(iZ>+ z1a*&~c?W-nlUTSRc)l80-6RwzvG7J{?91R{)@^FI{DPa?6PBlO>4K0LNY zjKqS0@L`X_@nNfZEC42gecI$xzdm@7Sg;UE%*B6?J#5$nz(zQANA~B}EoY!9RW)J`jWS{7bCx?mjUn*)a)~;g0=l* z(i#NUV%p6b=MOsonh>gjb98S$DY^>KilAgVkP`lADT##uVK=LFhxi#25{m(ZB-KY( zWhW;D0|*fe978s$Pgnj9AOaU_85JI#BP-@JzL8{26hW|T{k-;x8O{I_2(>%hRzIFf zdjcShz?^A#*vjn#$(lTZ{37Ou+?t|Y07?j3H_JbCzj^EifGWZp-^rGS@?B(74TO7L z)9*4V&$a+i5DrwyxG0>CI|X2fAbH+1s9q*i27rpNV&UtNly#yc7BmF2O<6rV4oK_= za6m{7w5h*ZE&m+A4M9OVgBfO1PqOBXpsPw#5X(>54G@SB>cG{V=ey$;03D$_Ba%`( z?+%Ft1EJb-&grBzW+WC&glqSfjW@8q9Rk2Y;03C>7vV|RYxhIK$+ZAH1nb<#S=no=N!Cgc?z=_W+B;v{1HeZ(SUbD0xKbk( zpax;CZ6eL`kq?PQ6T+$jt(?0d9l8Lm2>XuuIk`@H5(XeZ_`o&J3_9?LOgey2{X?^ciHl+i|BLp%TKPxtEQ3Oyz7?hv&{p_)m`T(j3?OPRxq=tVo05lNRh->}Y z_{^2Wf`VWrdvxq@TouWhAwu4I!AOfzf)@Z4!Na|#r)0PCTL2nDR@RD3mJ*F5YYqsu zwtH6Ilh3dKa6>38NHO2Pm6i?QjX+!4Cy|vhi^L)jA;^f9yjFQ!!yAB&;IVhP=DAVtRsasd+*#U9 zc`h9!Yg~ktivC>BrfSvQnwP zz6(HzaPP2I!z-0hk~I;yOxdXLK+DmzJNA9n0HO%h#XaVGO5TwjNCM&8kYm96k_wVF zX@t*R<$VRG&Kd#8BQ#Y-y!ZPv?;?N_!m9J9?K}T?kXWc9>{~dYg#V|3WK9DhW7Fi5 z7yhLC0ZiU1rC zYL3lYIGCAAvgU?xb9nWpcI#ax0Nx0C-IjrmA6$)lVx<6Ip8I0&aU zy*z(Msj3u!i}11Oe2;?Yc@hgA!tRXl!}&NsD}wb6)-B&FmEQma2nOK`Bel^}T}@)4givI0diaW~#6e#ZUVR=*z44q^?A}rEW8nlgOZZpz2;H?0ufGp)i=q{c03J0N9g)R z(WUKcC6h7`s(zdflv^;$PfQ6vkKV^2=-SIC0*a%adt2dk**iT}? zL6}{6%}ciJ1=)eP2uq_i->xsanhd~0@Cp&Lf4yuGiA5>G+lf-eSvxk9Snv@ZOjQoH zy&4<}P=iohoz!Juc8bKJ2_ZPqpz7@H-z00T2;a5N#!DIfB0G=(VaRXZ8kN|wdVm3h zXU4S+hpDb47D9x$OG)W1>}TcxA`;}WRa#|WQL^>Y9RN{;o1$Akl%({MNhJ{UW`z`; z+R>l~AdL{NIPut@D`^n`@(8*0B3*wLDw0?zA-JcGd-g|1pTt5Hp>F4dxIf1k2LUt? zZYNGw`ZEewa>MyRC@>o*x~|Hd#KI8aX!3Z8{qgnt0H_E(#*^fquTISbpdtL2F^>IJ zw2)-Y0bx{bJmu3Ye**wFgg)(w^v1=XqX4`Seu}NXH(JjplLjIPrQG)Sr(PgC5FKGq zrRMpEU5gI`Fc3QI*_R*Q*!BT{iSQ&Nf1zdgQ4$LlLX71Rox9U}XaH=41@}G%xyaPz z0B{g)42+!&@??@&a1l1Qef>4kC{JR+LpV|P=|@lI));_NguBB(s+1#-kXY~$T)RgT zY-e|qtkobqtL|4RTvF`=(1Z||*kbQ*bgcuR6`?omdy6qAjKo5K&>%Kka)~NNVljY_ zCiU^us+;rf0|*fcCo10){o+AlAp$S0GAaz1YO{Y+C-gCv=^a}tI2u_KE zN?I0*Bo@*L6l@b;J7vYM}CtK-T(Igf;g!LVbg{s?RbO1^b+$u8z9HZ5O0Qd;C(boNC z(yk)_H3;Q-flr4gwvntgA%uGl#&%CFa|CEb5P#ji^yQq;asUB>y4{+aHXgDh76S;L zMOM1`uhx@T2oYWf=7sv+alZy20$27K6<#=L(LHakA&G@3!s1_9)oaq2n*k&cwvE{) zTAM4J0FXwA9x2p%z|kE8kVn{+u+(?ZT%5#03E{f3NoV^VSr-6R1RdLWe#IVjK7a(=lL`f`Y2x^%_>K7zt zkytn&xL9?0Dk><_0o)KIXFIk}_F|J*cq1q+DSIs5Od+udM4%dmM$XSYO?DtU!cC^= zoQ-Z1UH~u<@_W{M_+*KYSTGTe)VsfGw;4xb!9wUxspnMWkG~DTMtBloTWCdlK_=xO zoS#|fpU1tj6@ZJdXp#RH4@dPg06c^n2Rknrw(7_Nlp<_-!(Vlw^f-wHAK}#93l@r} zN8JEw5dOF<&ek8_UklKL@H~@UB!1;5nY0z*vh~(u^Vfgh10X<9dk`|T!EGoNU;x2; z@MHY#ws;Z?AwpaGi#0~&YxDp_;FcLig=H02tz*Nj!vRDQO0CRh_sX`ANhJ{IdAFCm zQZFVukTk+LPa`9aXRs%LJi>&=*jVaoVIzPN!j;kcXZ$bxCRrml<}fN;-|sc$i{dY` z18E?*e|S5i*EBC7Ko?&-4MP2n8pNe6uEAiUgn`oHgZi zD6S7Bv2Z|;x=ejy;3i69;fA2Bb~EN|jl>}UZv4%X&RCb6I+ z42{s6l8%UzSTGPed&cD$bjxx9mZ&M;ibiL2g@s zos#BU5{nuH?dZNDs_#lGfF^_h>G#KOcADn`v?6p){GJm&CP88$KzKTJ$XWcW0*S={ zLhPK*C$hbIOaLLmnZz~Llbo8#q#}~!k(;7zeSg~HTulH`gc<(#56)${9|4d+ko$b_ z%}R;-j{wpLlYSZs4{caUVj+(pCcH54{-C)HfD(e#z~Z*THyj>-D#Au*Er+2CePmJ% zgu|6bOFI|8Hv*s_v_$vNpKdR>2w;d{zl$&PHT5is1r?#>I&)p`E-4ZV8p0_Zg#)i{ zDEk9AAp8l^t>$d8{S4st7o4Q5V7xIPvGD#2e$mY&?wz#*2>c6vj7yf^FZB?Bj_{nd z&b&UTmSl~AaCz+kPRiFLvI8*@)SRoSJ3bjC0I(3eGtc|aRM|>m!A5AaTJ&Y1UC1T? z4nkSp=4PFuiN^rA2%(-Qa*qd29RlDX>}c;AFfnmc1t>+h`naksA-=`|fRC^-GND{$ z&CN#uH3+Xy@3v}e$X^D~gpfVqR&GZ6ksSc72=-I9xm#LvUjYyxWUSw67&z+(nREcb z(mjMZp!khsO^9%}ZlXe)!RO-uB6G?4a7~`7TXwc-6hIVVySW?XT;7GX01^l>oEo~U z=VE67X#~05H^-?rZmR^4N4Vj?N5toGD#@A>!j>;7BJGS_y8u)XPB!lt_juNg>i`-E zrWLv(BkuVmYZL@lRG5gM-k0n^h6rotijAvD?K%lSMY!dmF2YoBB(b0&Y;W)ok=H9D zS#v;$Nox?HgonBUxFIaqn?8;{eQFheH$vU}!u=oJu9B<;BHS(vc=5b;!)^dNf>A*K zmCLuhk^mS8Z>5~WKJ5u6v0x%RP^p~uI#oykU?Ci`kDi;gYw$Dx8=<{Lkk~)-7nziU zP*GB=-LhzmWQ~h(_SCI_;w>Ww0C))V{%q?HJ|%bwP>N9dr&-1HV;qSEA0g>ao;~aN z3KEMN1cN`GC90SAqyRJ_q&_!X=KV>J#G(~p*X0YQt&I_62NED$S6h6!G;?MczyN}o zjuy|d=o*QI5Ft6}sQ0}r9bvvc^Lgj&P#;l$clolp=J`tPtrqnQ#|?kMQH=x&3QC zJ|J1ELHKrK{tK(;hqnVXA$;Dl@k$=6B?h1sLFI@KFKXdM5(@!>-N$zCxjM@<0R|8r zKCft78D#1UAVdhde71b=2&)r71a7tj=YuC0ey_?SSrbJ_@UHDHbo90ckU&swOL`el z-b!{LX@th_;VVq6E|OTtBV-JV?}^V{Mq;6aKO!EUUL|EqgeUqf$++F}G!W3hcuZL7E$r=q|W}Ir*E9E3x z00)FcN{-L&*y$t6JdAM3#YRUZvp^V2uYGxE9Rx&>jz*X6eRMjY6}Nc05}Lo zwSDrE0@~~WxCjFOb`OL8vJwCu0$*w@t69a0#G({|sWM`lXP;{dz(+#^+W1|${|2s*wF-SNq1cLGQw z9PccxUSlGa2q2GO^2Bn*)R~@(0F)3CV(yvEUf8%9Kovnn?m+UAO&KQuG!Uk0W)*n( zDw3yQ3c?&;8^5=m`Xm;H2+KNoz4xC+x&TlSO!+kt*d4WUspCScI-9UH(K!LBJJCthkbi3Pkc68`!{+)2)BRA?j?bc8@hu}UjD zE**e@(0NS#QF==enUsm}bl4-rqU0Ef1q1z5$|M$CggcAUYiO=EW&k_{vn~5><~-xw1}H`Ff0GuzxNMM2%18Kecdz*N(2lJD zH3)BA(`92spPT_`LZ}GZJLYZ8lAgs87+(+*C!Pj(;y!rV`L=Qd3~=ngP|u&ObA zC0D$u4nT--_%TCtKz$X7g@_FK2l~L6HLKNgpE-aiLeZ?nilwhJH~2=e|^dE zFXh`G4toMn5Ppm{N1PApehpxV;QHHc=Y11p5(_Fq)z6354kp;_1E3+qe?PAIMmawN zzyYCm?J2Q}!)Hk>+z=X^f6t3*nMY#bjgbE2=Nie9HBkV82#VH!8fr?CNG#|G`uBgQ z-#leNV!=R&Jow8(?@!br04BohH)Gl1zvsROU?F&{Qd_+9@M{vr^H=1+S zl*FP2p~BB{M6!t6o~~5AvoqlY__5b ziG>4#aKVoy_6Bxw0B#5_H&|NRj%LUKcq2UByw)#TKqIjTM7VgusaLu-hwMOfgylaT zzgnB*`~`r4pshB-ytOBY#Da<7?;=pxo;qR&z(V-UuhEOy+4B&9jc_UE+mQwSKggsU zgjI51x-~w3GXdZt?9*y~>C^Nj0f2`v%U5{50>Y-R(>A?$6+jdrNA{X`vY#A@g#?0=x<;Gv zCoK{SX@m+7@3Kpce!&3p2xl8wLsw;f5&|e8s1rOnd{+H9U&z}wfC`I^8`6=VkBSW5o`3P@L3)j7> zTSsD1gK&4k-~mqZ0XKjq1lK9;FR3OkYXDjiB(GjvAu+R@WKDpev|;%k`Gw(R2O2=w zeQ;+AWz+Oj03m`z@VkOHO>QI>BJg@}czu+R=XWosRu@1NVe5d;r~S^i!T=-?#8ppR zlH6WECY45zbr@T@BIYQGg*?Lg(viJp3wk^Nln~tLJ?XbK>KXu45hUq93cuVgCt1@# zSRpbR@YX0|F8~E$k4Rtt{fjfw0SpoJ);;|hCAUElfQk^YKlb}v?SuLNG=!NimJF}* zZ(;yAAh@5`dM0|(j>N(Zp?;xX+^nBPWC!v_NYUw4S}Z)~1rUf}di>SyZ3Dy20CWVu zE~egA=Vv5q41`b56e2<@<17G}2#uHYW=uM_A{&5(aNz;P{lG3!5(_qh;^EVE)z>9R zEI0@TAI2vq>L^45a1q2S*O`A#o=l#Cc?k2P4{(}H#7Qhl5jIM{q~;{ZdIRtg4yj(h z>7=6G3Q&X4z9~Pv_3&$wwI+m$W4_{#TCywwS`p3;cglv8*xmyWAk0q~yM8aag-kkt zuu=J|&HmM9_H(AICV&J&bccd- zlXaCZfHZ>46TM3AgZM50c?8c#lt+<+y(DW&2#q19L*{feSOcgcWKNneX?bP(0{{(# z{uk@k9~vnnS)(AdTs`3SP7q)OV2Dt>@nsFKwm%kticoUfrhIUPGl>Na;gnH+c*mYf zEdU3E-?6^pPg0}(0NfCME$xzx*(LJ{z#HMYR-8u9%t<5`fe0)=C7-%Q(?~4n2x~u4 z+i!1?ECOI4=s4-EF;7V(v0x$uJr1|xm};85(^Fj ze?whXxVOqC04@U4>$a_Un_VCP4?+H|VWDi5g zgL;{*NA3obShyh^PF)xB(dD}ffH%U2od+hqcsleHAQ0iZZq|#hkDN&?=mm5^w-mlyXydW2#Hf9#x6c_JpfROpfyu|Wcm53Y5+chulr<|Lp|0c z7BvW+b<_Fp>K>Q@G$HVlWtjQNhm!$X5tI}rQEBG$NGt>hRNZN8E@w4~#Q*|3RFdMj z+cFeDh#;Sv_~w{iAc=*@B62<`Zrb;T!v{##L=osU{`K;ofb}=nOr}JX~ z1pmPLWnVo>EC&7oH`CtNBx}NdpoaA-+Xp~Io}3T3>jQi39s3Rd(SJZ*hjEO=LgF8w z1W62A0Z9J?^bz@wc>wbNhi96OBo<2lfXJmIWrhH%|A&>`p%(x&{troUvLqIi|AYPt zbrK81{{zF!<0t_2{~(e4N&rCnKh%6-k{!t5|G<8$U<=^(f1o_jD**8R7m6t)7J>f< zdhlsu0Q&zy!2)fh8jV z!vDZ4k~Q)!?sz^#L_|1_0HXf^YB_+!e?Wr7Li#@-zY{?IKR~$#p!8oLu~7XF&^H5+ zcUSx8j}06>0T})lNGz!T1riI|e}NC+@LwRYaQiQiSa|;z*Z_h51riJTe}Tk; z@n4_=FcHZ8o#2DSf`zc|?+*Yr!v4QM05}NG|Na2rB9whqvN;c*0C)&tpLX*W!Y6=I zglVsDdF#L@06s$X=$?+`tB=W~H3*6Qsg))hBew!HA!xVkI+t*0_8EXygyhwF3qG}P zkOdGR7+Z#GG*)<#SPURsx;xz`MqiMG{N&hi{2SrbK= zRd(y#;>LEe14$q(4&6R~dqzbnfHZ=a>|4*R{pUz5DLfqVcxLYjV2Dtp8`RYhSJDVTMJPEU z?f6)3m}HHHaI#yqjG_H;FMtEW&uYieSpm<}0o)K=S7h#}k+LDN@J6UIv%1Pw;pqbe zA|xc|ZrEz?9SJ~3cu?^0^_!Mp5(@^xVZYjFGHy5Kirl?F#$zmFz%Vgx_gPs>J?$$_C&es42d(9=}dyF+eGT zt3Kz!#Qk<;2jU}CF{p>9J}-&}s6i+@?Qi5(wv@!82_baCm)M$66B3J7gsD@Sm)@M3 z;0+)^m@^~SM0bvI8^8d3^@2Fo!4a3*Vp(e{9+MgVRIQ*7m8WBOt*0(c{=e<>**O1 zi$DZ-TC&%T*eN6ybc8yt@!QQyXZiy$5Rx4)-9KTx@G}4tp05(Fe?5tQ9(XJu@4#JP?8{{P2o{+3@5k_^qw3KRMOaOQYeaD-RQrU6|0Hp}= zU3O9u@|q+Te1z3i50&L9zMBAQ5NPqoZ7KB5K!7HMoYkWRbdjfn0Idj-NiIw2`>jbV z1PF5so*Ik1xbFZkfUrC&_L9gIuSWnvgjYM|cCQP|CRr0%Le9sXM6IO#)9iNuh$5J2 z`{}=sEWQFDfsod8qWNph5SdgO!93?j?x&kwBx~{r9H&wD*LqdQ0pM=^@J)AD^wnoY z#E$}~BKR+lw~ag_FZKlU?aszc-hk z1PDYpu>D@jZ#ydz3p&EfnEg9`JgpPJcK8AnJgcnCqiZ!V3u?4|&e zB8>dhGg*DF`ZNF^Aweyb)3Ep(nY0E$*>&gc^zEP50W=}lKD(B*?|jn%fL4TpI8B4h zg*h()1PHVTn~(O_MUq$yAaDj^U!2@3V_H`@=#{Rvc4^ysZC-b zieR;L?H7}U{$vM|K*%+AYEIbnITSz|VPHm(@Imq=5({~RHo1|3!zQapER+z+wFPZ0 z@%uagR1qQqYRXI2WWEB>K*;U1v064YlEi|7;Qll}*L3!55(`6wy4WM`mzOL_1E3<< z%1O-))0#qJK|?6eQeHXDZw85l1A?EQjk#p+0tSE^f^lbHTH+545({sHOZ-7|?NJ{R zi$H{x7dr0v_jMcupd;*6e6r`uyC-h|7zpntTcV6!bs)PAu*j+GHEG- z;G9XPR8Z+g06s$P`~<$r2>mcX4Z^LB$`|Yf<5~ck5F&gwQMdiLyc(btVMa$FJNnx? zO8^1Fg33XP%$Eaq0R|8>9>u3zcgiAJ6C(J8tl6PcVY3}TWEnXh9TTmu1V!b?0Ei+u z954uz4mnF=A%XCyI%?Y5iBg&X(g-1mbLTpVD*FP+BTUj>weqoqO(%d7!g}9^LskmGnW zgneB5&yqJDldRDZG8{^pR&0*61z;dpK02ARCwO)t023j7*~iHD(jFuhtiQg;j^}d< z*S<0aU?XH+VJ-J}=3D~cAoMTfy)q8!Ba?CwT6DbcTpD?&4ZuSvKHh4!swY1HpcEl^ zv^05N-I0C(K0;T*GKCM{I#d8^5UNym=oWo>Vh_-S5O04aH1O^D5`b2O-j;>AIl^5e z76OEZ5*;_^!5gLk0|@D-j@MMSZ@CO0L?|@9yCTLRg~UQ+IXNEzmtFQOcw|aqA&Sti z_B2H!*l3ejXdo<{?)3IyzW+`D3WARGte7Oc-h>%=cYH^qAvFKp=oqHU9u7c7 zP#&UQk|_B~CZ!?RcHUg6aPkw$ngc>1UvIDO&qhxGH-vx-5ow{q%+~HVQJ1eKySI0yH7Kj#KR7Z{0^?(Tb40!rSBx6bI>Bo-`$i7_v0 z`7%Z%7Hov63vS%Hur8MDKpccQ8k@H-KCt8q02g6GlkZloEH4rZ9>NrESIAMDw{`%f z2s0h3CiU>{KLp?-xNj@FqD&hklhz>AMTe@}a@$P+nh=s@rg|1QR3rejBA9Eq%^k|H zBC!x4aJ*|)c3S3b0vJHp-NxR_zvpobK!}i3wl$r3pkW9=WF^V;6J zUjp-cTrQSi)WR{$=;Gtc$MzAwzJ0^lLU%)NcG>c&HowNeDR zRffOfw;U%s5FbH%A9HNYsc%UDH3(uK7N||Vmq23CgdkO<=`wr23W-H4f=b{K{*vc* zApin|#?For_Sf0uDR=-O_kGsnjrB2CAr~wc~ zSbRvc??C?pk~Im0?eBcwz5H;P>_E~8F}yC`jfX8M0P+YuOB~PU580DgC?V7tmCZZS zRiX=^ijaIUbj`hYu`oo~eP=@P?xg1)091q| zvnj#1^e;C6&=BO))}Q)9;gPI4AW+QRe>b1@-V5M{aGF#1GjBp$8h|&#M|0ah4@K4} z0t6zwxKr@^_&6(l06N0eJ$}DN$LBHt7zjLx9JQ)-79~@C0E7sZG7Z66C#y)-L{{VZP)qxM^k=*!fGC2C ztNCz`aLqjc353j`G}TML8%Wlq5v;$OJFfhdPIe%9g!{dB%FM?s&I2eRSX?R`mQYJ4 zu~0?GUK!A>;IdB>Km);UZ(p?@Kf@P*g77fyU19{&vJ1cvVW>|ScKZGYk~Jzq*ZV=S z30@Da0cZ$Sg&k6pn}Z$zI3QRLU97#b>MqHe8^VLm<+s!=T#Nv`5e`4ywaqh&9}5tO z5Nz##bnZTD5(_%Q_xqm(D>LqE0Wc7Tyx!FArFr=QFcG@m-o2I1ZSDnNA&jkx`cfDv zBw1r4e6^5#8!%_k7J!4$o2_)ee_4AW02kp>^WLyhcR7hgDZ<`m z1s9^jcE$tn5oR5tQFrCeB(bPLP<+Q_Uw2zXV$p=4&vV?WQ@fe`z^oO4;awgQlyqVM zK!C8bWBB7qc^MLm0fcLn-7kJo)EoeW2%6_!Uj1>}r4&G94LKiTJ?Fz*=|LnGq6kuT zi^Qr#zLFhC0zvuqmU;2xdM^V=BOET6e*M9IKABV=q2;K|ro%6oIsi%t#XV|)AFe1I z2T(;gQSUlXq^|c3Km);aW!q2MZ3>A61%YK=_C3e&v=e|K!rD8b!_F7RR{&5EybE_c zYwg)jVnIV_^}ibTsQ$%H00)H9FB?{zNxhl~;D!*bvRSk{B8Pw7 z!n$Ii{Ix~%P6E&orY&Pl{(NI2i3I~e(o|KvY0F^}3nsz}xSElB>Vpda3&BkF(RznJ zMNa|P2x(K#O>6x_BeCEhn9q@&Tly!53cy9+EL*>l{>S+y01rXo(6l6(b=yfSN)hzl zN$RiLA437)BSi34F!n!Ra2lWnp?gU~?)LL_WYQ*tmquys=NBfE9jF!I#zph`g*wIu z00an|m)}Xz35u%*7(m!^s4!wn7nQ_9h;Zti|IAa*ZkhpzD3kN?oA+hm?>N0=08s=r z+Rr+*P;n9q2?STJFxgdfK8b}iLY2dyNtMKgPyl&^^V?Ksp5Nd@Vxfev@SMZKg zYpMvFWFKwX)cn{TKm*~}`jBIRxsmk%6amy=k~5t6i3A9~!~c@Thspda86)ZmiX1i(Z{?aVNFoM}d4!9v*i)G~o# zoxBf#jgT07PkGh@<4gb!LjIYDhbNrnkXUdLe5V|5nLKZ|0RRu7bH=w~@zqID0Hp|V z*Ak*%iWZPb`3OpyDl#`_9VM}-L7@8Dscl{?I0Vpy!0s$^3Eo!o9-tNBvqMQ{SF;U? zg#h8rqm$NEdHFPe0fc*Je%+7vJdy(-L|EMII@o*s1c`-+3OOI!tE<`@M#r`Rh$5W7 zmQa!2|MeVz1j2&P53CfOT}UjX5j2|)=jm7SH2~xhj&NH%BBL+(04O1RbSP<vS2t4|qG)`t-9)KYN?cVc3g-8n$3n~J4|K$L^ z+1Z8wGz5niYW?9$>@EN}AY_!?`YHQrwj6*Pf@RqD@9LbTBo^KX_okg6@}!y^1qejg zKX+l*Yj(Tk86Y$t#r!kWzryHgzJT?3#Z9G>o_r;xdk z#Da$KLAp6y*XrJ&7f;C`C9pvL^J$ z`K2Tle1tawYthj~Ci?+u5bo7Jkm%bI{~VwR;o&!n3Gr`wN!D5sg1%%=UVX1&H-G@) zYqPyLZGZYLfB}THvBzHOw-u7C2@#x@3}25d3)l)EvX-2W$A%wu=7jZ!0Ei-t9F5!J z(XB#aA%P(1Q9AXi+MdKh8lk3s_is*Oi5q}C0z38A&)wRmY5|lG^34leCANGdSyM$g za_4B3{K@Bg05lM~&3fXu{$!;BP!Js7JMO0Z2_>;GL?|mLPon>xss}(t2=j|D824*V zH~&bxFOW8)U17>s^iBY#NB|B3*F58V=s7A0|-a<`kpzmD>v+;btpL&pO9bz}Ez$TzvL=sURFnV3$a~BZKndX@`^ejitt0mUR1qHJ zbA@Lrf00Qw5Dp!29Gr6Q$94b;!n==U?K5RZ$qrrZ!D;cD z05pUXVd^1oBv&5+a6lNF<~i}+3fe~iH-z8S$FB_BoJC^cjqodRbbXuNVjF-!gdf`d z?qw0%cmQ++SKp^u!`;m!YYc>Eow2svFY}B5m#MzZV^BY!uK!k6%%L=N!FSWhThgkP2mQa0JI`>JxHB9)8T78fB+$G zFk<6|IcrHQ1`w1wW*$Dc%xM#V5P@2`=tGm~<3IqBb>w{9jNVd|bD1#+Ac~NmH$8fB z*iI4)34|k_GSb_pB{~2|BXl>asm4fZJpzzNP`1;#wQFPYG5{q6o1&m?Hx3!^08mB9 z5BwUv`F-3K01bqt(rXu_#P*U&DG0`@P8z058*~5+5#k&kd$Wwwjss8;lpZnKR4SdSfzpnuBMmT%kc9M2#EQv)Rg4CkI zY5qHxl336YlsEg&{d~>%IsgMnPZkF+y^Z=!13e#%;8X+SDbK>`G+ED{7XEJ}thOdy3Q zTTqrrSt>46Y^BH+Y>O>JBra%CmZGQ?Q7aKF79>z;%OV6&D7a7sacU8Z2$r?qb>AnM z7QyFz-uKhr-81vQ&di)`&VA0AnLu-(JO*vb=G84v9Xc5xpFuzW)dmO8F5eB{XVBPx z-@XgGGRRq!FlgnTy!`jq8k4gKFzBw^WBIOAt9JlO8BCvYeoa-wC&^iqF*v^WH{02W z!&U&5!PaHpzV>t5bqfG08H~yA{Kad1{-BgrG4Lgge5TWLKlTLB^`iDM<)^jZ4?VSc zDnK}cz1v4_TCsQ5egHj#?dN_to3VW!IST`W^j`~3G|sq6b08ywM*C+Lx4Px>djL@k z_AUABuLpYHN6x~`U`5-6^6Aqi4Fs?-=r^F~;PG!tXbxm$@LrRby%)VNle3T+48FZ} zyL0W@kh5?wSbCpj;Hl`o(*T?dx=c<=-}_SXHvldM(+8b!Z~uHQIg3OFKfYWPmhr^p z5dcXHHn;KAz2(q_4*^mc{8_)eXYbC}D5Y)&CmSD}I&H)ia%-6kcC}iw|C`*ZmjJvB zUOr$f99PhToJBT+Ht$Lc3!YCPXOY98UtC&~nZFl31(3_&`Na)xKXc4;6d;d5tJeDt zOx*b*Ig5M--7U-C-MOefISW67@ky3JN@U|t07@7fpYu?&VfFTtTMIDQdT~zcmEkL6 z0ZJLnJ9p92zj=QJpp3z(gzSd~1WGBTDucbn=DG87K6?P5l0o*8$1h#6CQJvYV$h>) z;a?XQ6#WRG>rL(B-KRXeuigGKIg4-xaYyf1dbMZkF#vi7p7p&uU!H1N4`5(0Y|Ab0 zWdF2=oQ09Wsuv<-dKB8oSwt~-=zQnQi3?wQ8Nkfo=+$S2e*9}1ISUJe^_PEG{^f82~ba-DhS#H|@c;CjlG`ws#*gIP&N!ngcl*q)&L`_0H=DJO1K+!MNPAF9Gry)ct5>;Ro$p9Rd6d8jgDKrD4(j!2l%; znyq`G*{X%^r2qj2%SZlFXZV6sl+scLeLmV<|NS~&_X8+nFk{rx#`gMe%>+;xoLtwr zRrW2t{s5?C&~0B0wtUQw%_wCrN0O1VIUYR&V z+7V06LeJpmi#y+VF;lSv7#Qq4r*x~|ywx%QBZE$FZg}Ud`&W{)h+;7G-X~*wKi!|4 zg_*&Mv44ziNiUzh{nXK?k4#Sf3Ya0fYy5(by2-~Mj?>E7fl0t_x3zc23Dqffd4N*V0#dP}pp zT|T`Xpp3!NF)dqP8a1Arh036dFUs=Q$D5}BR5BPf<>4gtu~}aOR5AGRh3FHn#~R34 z=pLZ^1DK#)Kk3YC_#B{#|U}WIh zyyn3Ve{`n-L@`*`aYU1m7wvZdm>G;2l51G|=dxY^76!gI96d(-((?%bD}yQBR!_{` zJ@p`f%;1IT!#{4fy(Kvd2ZQrJzW-=+`aR?do@dRRk+=OB1K?-iy3=-XZP$}o03{68S#qzP34fiO zMS#JWXB}66XdXq*qLhK}=bTFg9URX9lrfmPQ#wC$P|o)NDudabn)Vpd%t+3nlEHapwW(EYv=_Z+fs(|57_Si*N?xXUra&nzt+tK+j;y$qUOX zT|GSj1_oQZUCZA!>p^lBMh5d9yYlR7=U$*WP!xl!8>>#-{pC2K4|HiPtx3(K-w-MR@N zhe7=3Z&suqs7uZwm%-bK-H$YSw;?%;JO=k482`zwaS^Wrz5QNm#S2ZoN%ublBbK!CxPp*;ql?*GeafKmpFzi%|Kdy~h>S(Gs_Y`Qgl zykYxz0F^wC$80tPCD%UY)Y0O@Q2*%wSIY zYZY?8oOl2SgQ}P-M_zf}`Zj=*LH4oiSJF;4A!p%YVBXN9L&IISle0)<;F^{Y*X-4v za{!VU_`fMy+}bp?3Luri-8(w9eyZ;$GzW4sh|e5mDNP=m0FcSxE&Zybyz=}a05605 zCpOtSEd7eyS~i2ELo;5B>pXWDKn{bS-v8xp&xlJa0dg6*+C9Gd#kG4VrFjhe1Gf*X zKl0510Qn3SWTa=@vi9Ej0DcDXpT~dxcENOV79|YcN_;!z z8K9Iw;yX{j^TYRZ_W+bJm~FKEzH{e#a%(Ds3)WYUDavG;164BkeSv91t5$p70jOfI z)c5r0mGzd8v(WXW_R(ePcc1icbQd{`a0a9IZ5%hNMgJE8^bDF`Sakfex=pAHHZW*^ zI&y15LjySrBZJt|F7t|;nG*q`7$|w8ue{vG6#y_ZxU+KReH#z1Be!N@@Icuglb(8S z%y0lJgX#X`yGjT9-UpBw*v?Ies%kcxoP~qIYp1q4D%*TA5Wvac?yu*sF6%co1Hi?g z@7PnDE;e3ADNSUMlE3%4bFG}@ERq;hBrW^(RQJ4T0I3WP|8(E}uP3;^1#mMM?|SgU z`Qz)ztz|OU?0?~O#nv$+0lW-S7o0CWGT*lrAe+Gu_nYI#pX$&aAcw&ly6#&x?;S+W zB9}q8u<_3$d11Nj-4dJQSL^zneF0ZJIi ziEnt%KQ{juK!Cw_E$?znYT+ZdR?1-GJ^gb^OjAY!lreaEc&hak+ulzAR0f~w4OU0) zc}i&|gYoUm?i@!&EI<{5EdyOTY4u?RK-Z7j$C##Ndyj7Vn^GFiVErBbWxnVBAh)Jx zFsZk@=hR<+oDN`Muxpxb>b`wjjsqAOY@0phr|nC&l3R;nkoNc9?HO(7j{z_`=u!24tS#=V!k zOU}Z{pxu_(+os($s1JaP!N3=kuHW>3c?LitgY>^{8xex8Kg)4jVu=g9)ut zo?o#84E}uQa> z432&F-CKPhx|N)T%3wpn7rj&F-2DbXC4;lKDo5t7Z%EFfiowsFZu|7|qzG~ry8hHY zb`0w}{_kCP(SlhxgUnUV&1YVFuo6JeVCcdhox2=O$XOT|EN`;qvsYIeTmVJ}eQtjt zp(B2g4mcBJ2Wyi$QqXm{X@SdXlq9WYGMf z%)Lh&Pn`&m#Gw5g{W4#xeLDbB89crIiHZ(SjwNT|W^ioMp~Hg?=MM$QWUyh^`yVe^ z_v{J)F9Xy0FWaZJpG(dnn}PgWN^FDJOXSva7`*aL#iAyQ{+bJr%b@*-MSocKZBt!t&15H{n9Rg5(eM@ntAL4>riqQ0S24) zH{UR9!Ey&cDT5iSI!s$tr_XADG6pBwHvGBmTMv=5P#F{tXtrZOuenx$N(L{_Z=E?m z@sb;$ia~2%eRcjPd&sTn9;EhRnbJ5=J@!qS1BEkqcJFOD)tl~}3ZQ3jBDZ`a~=_3nPQal45<;#mXZ9Q4BVgEt*ojq}6)>W(FqLhCx#{)+1+OVIcdb zE!q22BXSm22Culky=&Rg7U=*o1Bb73gN!cI$XPfTX0}5jFPVLjZ{k-1%z{f0G(b&LW9H*s~)){_yO=5df(S>ioR+(cveWehA=Z z@YZXYsXx57pHiC1pjW5nXTR*UisnFG28l!4|C}=Hp_c%%8OR?VDjNKJlRE)&7iHYn9~w)}!pdOYwd$v0-``{bkQrRLQhjuh{kdlW z91JdAtoB7NJM}Ywlfj;A)g2Bz{5Uxa7lSvhRu6jT-R+M8Br@oBxq3;=po|RwNere> zp0cs&ck$#bQW+fIz4xg*H@+8fS1Ag@FN{; zU2Y?1kC1+8>V0qh@Q^F3684M6$&}TsFiaPK3UI!>;@a$2` z#IF}_p_G;}II;fO9d9+A-48%zP(1lWX74*MJP%OGV96eQe0~4v-vO!^q@8~>Fni5X zngi(uQ2S_5u_5PgxyuBAa0X2da|#k%?5~K@XE2Z4-T^?ld~{0Xuo0P?3Hen+?s_!?6i+A^bb2Q3&6@?(Kn-h zpH=6ba{w}f4da^cny34c+?s>Iw1W1pUezT(4&Y?)?enpw%VFwv02hOCpB>A|?s=I~ zn#iDF;s&Y5)C=(dNepK0oR&6m-|4pjQW>1|$alOjwmUfsH-lYwzS8Tj{PE;0G8w%3 zK>H`uXSd7&@G|H)J?3EG#0wVzvKcfyVI5cK`i0zD4ufVz3%*>qZ8yz=aILgpK0q0R)t??eeqWVB&O&7nJz?wC$(60hSyVDu z_|?4md&;^`0jL6yJ@uWv`=V8BxmI0GX3sL%3ckVynLW!H4%6ETwqlPAd(dgiFZPU* z52Flcl&xSJ02%gBg-#28=^uM!*t3egLa`@HzCu6;20H*`*h6>ZblD1aVvh`aiDIuv z>?KLQBEVEzK`{Us^5Di#Q6R`fU@IsABLnbiV3z>d0FsZKcMeOtfyn@J0TARdM;BC0 z29U3Ty#n|FB;Q_0B`kdnOa>4DKv2qj9~c=xnFjU?paMv~{g5hI3ILMHBc&m3qbOfLP})mC@>j75&(i!=EuOu0Nfh*PJm1R$@d*3FH7G8lL2IF;0FP6 zI4(K1T$Tv`D5N}=euR|I(s5ui0KW#x1SsLSWsm|a5&lU?r7Zmfsf?wcfyn?=4V)05 zlH;C$RK*hElS0zfp-i2G6pk%h!7spM0D29a62QQ5PeC%WMEF-BMX~fNBr{7YFd2YF z1LXo(Ic_;5nI*!%3CY0{O>~?rRREI#xHNEDfJBaa8d4HVgnt)ODof;8+$@~|CIiUS zz#js5Iqn~jvRNWrDWn{hDk0^vbQYKlAWs8-3Xson|AgdciSRigm9Rw4Bf!#Mz+?cW z8aOXN8OJ>jNo9%f1tC?kL=%=Omi`7N1JKo_s-vAM0m1urzzHDvu0e9KR1Hi9kO+VviMbA# z3?NklVFI`TBwrY$OqS{ZlL2@E5M(p23q}Tzqk(z?(dXVy1st-&CkPm>s&%6N` z89<2!8VV2qkbDgxm9i8LOa@Q}fIwy52#gG%QUkXLPz50QZh@q$M^)Asm<%8s0D+!) z6EHFWg9e%kU<8nSO(8|G)C`ymzzl%E!aM?u48W=Zy#O+R)0Z6`qkW`kUfyn?W0T5I%j{zeC&^4rrqMcX)!T}^7ElucIiUTGCFaRJh zG9Ls+1`wqISpYMD8Gsc4fy{g`7#V;=149IG0!ThuQFXCoCoH5y0PrN{ z@nB>CsTvq6fEz&a4TY4+(lB5$0Ivod0%UVs2c#U92tO>OT$Ub&l*iH|z+?dV8W=8s zpW_aPRKgPB5kd;EL@QdQER6&v11QtLC;?QCI|@=ION2)Ysfs0fHlYirx^n`P0fcK{ zi~xE7$u|a)fhEF^3dzV4t*}I~^cXN1fLQ}$1+Z}3v5>4R5gsQbnWb@%94w6oCIfJ4 zV1fWHjynNTB1?o_LP}!E1u2!K$AQTJ+!~lDKqkkX2+7M5;RGRNvqaPJ9F`^llL6#v zV6p&t9CtFLe3l4L5t5%Jnk$#EG!>W(AfSOn0ZKV;BBU~w2tOetl_gsBtYm2#Fd0CV z2A&i^*NAHBNl4+?vK0`1N=SN^o`Pgx>1kjx0HX$;5g>}=(xRZ5rRl(A02TlQR^~}y zWB{@To)y3WAo-q!urwQ(44@PMK^gNo zU}ONQ2IdM-2_X6ALaJhE9xxez?iM~rI09S2d@wR_y$0L@7yu-n8 z$N-!gSSNrBK=Q4Fl*rP@z+?bP00>f|WVt|^@(A5u8BYz3Qu$pG{K2n@`>1S115YM?-XC;-V<0LjeKW?(V^3jhKu z^DSUx0I~+Y62Ji<`M!eWWN9lf8Gs7_K_YWM7#Tp42DS;13LyEmL2|RS9heLt699pi zc_A1XK(+>U2#^CH`F23cWoaic89<%}iUi2#xL6X;_OnE|SV$!-6+;TJR02!}P^y7l z0+eywU653k2=5kBB}=;@Rk5@Om<&MIjH-)v_6iUVAlAn9ED`=%NCuX^#!*I=_5qUt zL}_5Z0A`L$%i|W72nU2@WhnqjX6XPh8Gu6r2L*6)Tv{P_u|)WgkP=xs1SyH7Z-B`F zQZ?|c0B(-^Eu>7A2p<-bm!-pyvROI;Oa_pnfl>i-Ic_PWJeCL_6;eJ+MNyjziM3 zR0d22V9>x%0vI{&PmrQm`WcuEzzl%E!u$jn8Guy-Ck2oJ#5%cyrC)%_5Z4KSz{UI& z7#TpK27VPF2|)7EB6%uHDli#<8vsEj^KvjU0Ivpq6CfKv^3e);4oellWB|DU2=bVp z1|tK=*TC-r_yHszEsvM5bOx9VAOL`%l=&ZEWB_Fvs1!g2kbISpDp@)UOa@Q|fIz3G zD*F?R3?N(s=LFCLNWOEB3@rTxOa@>CKoG_JJQx{(SpydYumDKD3y`cV{S8b8AOj$9 zFs}k518{2Kq5v)c$#)S_B1@Nm$pDf75Tr7{3`Pdv*1#13G65vt6-Zu|t^$(*WCI|` zVSWva3?P?4F+FFby*%tmKHAF1R(ub-dHj3`p0(-l*oMwg!jZzT6<~=l9tMz9%2FL{ zm9d1CW*r%TssSuv5~$?3v>aZ=5@9Tik)&%*$*7O5aBSfbJTMu6UIUoU6EJXGS`jz0 zL>QAqlA>6`6WMGtOPGb|$N(%Fz|fX}mE+Q)xXcn^446oAu+$h^PL|-5bz}f84WPp( zkjQaqT|9{;!stIpN@b}Tw%jbCf$GQrGBtpbAmHV=dTeF0L>L<+<*?KoTe&Q?044*- z)4;6)Ykw z5snj*i={Y7i7X8QCId*)fGj{N$E8JaH%o+VLds;x2Fc6PU|=$UYz+(%Acy19x_B;2 zjD?iPk{wb$OYy*D0DcV&6`+LU4uuq8iSRHXm9jJpQW;AQU@`zz0}l&O$#H3Eyox2l zj|hpnVafLhq;PE63Wfud0q8X_LI4BD9RbP665)|TiehObBr{8+fXM(X8W=5rmE(?v zB(vlMCIfH)AaF7t14ahm(!iqvBmzjjM$NH}kPzWB{2O7$<-iK=O@) zl+Dt3U^0Ll00gW(zyN^2$UG5@3?NDaPY7TJ zkbF--vamD_m<+%QfIw#cBp4ZhLjz9<-~^C-v1kjxfJ6WUNz9)CBLhg)z;prJ z0FrMyq)e8QfXM*700^>~KMO_%kfVVa0^|Znz8R46Sb7ea3?N?v$pZK}ZZf12mI$W^ zDZo++q*9ii2POk3)4)stQ~1xyAIu7MW>&;y9Ia05$( zXA8;5(rg?R#nK#LG61s%<_cipxU?K@Wr^@SA;~PwgXCaoJ}?=8Qv+@RTpZU8DUl_@ z3xt%!(gH}SEWHR!2H@5}ngE#`mlnmnED=r@QZ`HJkaAec044*-)xbgl@;EN7i|4aM z_$49vS$YXl2}_y4WB>sTWC>8pakC(mu|#;0kW`iyL8@d)0VV^e(!gQ?Xy_^VXlXng zTebqi9wF&j@<1}M^fE9RfKdZW1c>6eOCXt9BJ35Cg(WW}D@(5clL5#YcvS!g$9)x& zlcm>y$pBmc2ojmU4n_u$q=BUZqyk93rI6e#y#Y)HkO_dm%lu6+GJtFiWDAf3Ao*xf zJeQ?qz+?b<00{D#zXe7H;Mc(00+awqzPBL-SXvHD22cuspp5wnFfssD11kln1dx2R z9A3rJDqu1Inj#nZFB024K;^8Ud^T zl8+X`WtQFpCIfH)AaF8&AB+sZrGXCwNCc34A3#cCDHoUwAQb?CoB4-eWB{2OSSx@R zKoVc^vGfrz8RF&uAjoCD4vY*SPXiwdkPjgFK8ECH=@VcwfD#RSDnNkaehR6SCBk_^ zDq|@RlFHI&z+?cG8dxtt6~|ovkir2ZpAV9rrO$!M01O(~Ab^qMZh#cU z65)+PGPAT1l7*!&fXM)?8pszw=D4&X?qG@VCLuXl+62kP(wD$w0ErqX5FiOaEQ+VH zM0m51+$?RzQJE}l0VV_RYTzpYvNfFA%s3G;8k$N&NwI4nRZfaIe^@iLZ<0Fwcz00=6Xmx7T2RB7O-0J_$6 z4q6cp$Cj<&7%&-t9sq%X`FCJs07eabFF+K42&~M11S12GHE>)2 z2Y^@$cd}FlOoq5F00fE5e*z-|NYcR10;B>+zMmnvSvmns29ODWz{~t37#Tpe27VDB z2SD=u0x6fJQ@~^Zc>oCVng0q#2H@9#DnJQ<(SKZY3lO zON7q~$;#4MNHR-*0+RtaG;mG;ClaTiO3{}NInOMgL1V(C0E89=HAE(qY}xU?>w z$r9neh2&-FZ%ElJRRNO$*Y z)Dgf4Ao=P*ieiayT_KrSstd`&QaxZY0ILS-3m|jc`j8wf5pEzPCrb?=xmaolOa_ps zfp7tmIBqzkRF)b6lL5E^5M(mH1&j>9tAWM>WCKV(S}D(AsR=L{KrR4+JmyWo$N=&+ z&`bb7faIfP@)DLJfXM&?00>H%>%qtX$~4ei02M&;(HeOrOD%xO0IC2G=-N`%-3mqq z5Uzoi0_XuGUrR^^mLh@40E_?#qL|+XMh0NkKq~<(0FsYZ$E_?GfXM)400a)^w}X)Z zI5lvG04@ND{~3xzmhJ>5L);_)1gXqhgOLHaHPA+YOaRH(29lShyMW06vH=j}FmDS+ z29T=(qX2mTlFtY!pQU!dWB`5u1SQPdgOLFQG|)kSQUJ-<0a6)DCSWoERRbLbsN}dE zAyr`u-`z!R>4PdW_qeZTuio?zA>q3^OP|LlCQO=)MHXi`V%&DK7}CJ#nAo^rjCxo5 z=%fN%0GBlIHxSNn$u|kA9`~(^8_sFK2K`gaPNP(ivoH)1ol#PObzlT-nWX~!d(pII z!EOH2dE9kQE4KI_vv$h(SC>yV9#Mx+Phacl)aT_^V$X>^`nR{mo(p?9Glm)(Q9|gu zJstl8;k=iGJ$KQXd7iqY;qyJ6j{g;N>}9)gIDtjuQezXSm&pu*Ngwz&meFG;F93?- z$uFs}upNA8hr*&{)rH}t;kJT$*s3q~@VR0GY&8^nh#8J8q>N%3Z3TL4H5YqPwt^Pe zx>f9%Z3Qi{6)E;Cwu0NR70j-+_LCnf7$dZHA|?u^J+?ZCJtuxa8(SU4p37EnH?}&7 zJrqn7w(b#oC>S%gdWgMLye5yWp1c<ik0~h{2EJLO@Jf@uVZJa0I3Y#z|NZjxEW+) zXPE$*0MaJ>(Mj|gv+m25_#=CoF3M`JQ(fC4b#hjWDN0sK)E7oxs+JY(6kGL(1EK!7 z+xuRB@IyEe4vu$p(5W4Q2OH^N`WBQ9HsYwZI7&|2VU{Np%4w&gI~+u|%cv8A0Q zpQ0=mXIY2s&{=Y5TbyMnMVZfM*%4K!Nd5arz2@nahx;p1uP)o=gn(VyUQsu`r{AXd z3)5!x*Uf7rCp_GrXagyq3Qq{;h~!(+W|cvUR94Q(N}=6jHBg|)2FcxrV%wAha>78pT`BR# zXY88S)uvc%X%<~_d-niwvi<4@TdC+8Qkm@+Io+==1M|wtK6S+-sLr$DA%1LA&n*KNV-xQ%1+LDSZ~jg4E8LW z@n-puJq{euS5E7DT}rQhbz@5ZV75>F>){&{dSm+9EV%SR1kx9|;1a!hL+SmH!dmGK zm8iR)D4;#+Yb&o+i#-XI^Q8{$T2}U`-9ANQ<)SH+N7_c)M%hN#Mxs)Nqgoc6E}^!s zoR+gZe%|`irj*LX8FWw4e{_Q1%j@e&xi4z=6Fpe8IX+?kl!0me zWnDzZwjiA_5_DMUfJ!nd2C^}gkrgFi7jEL+@(aW-i7ly)$~+8 zkyB3d(*>N@6{-?Ixjy*}k|>EJI?)H&vpkuUfwT+?a8Rtnj+jt9*|Jg#OVQ z%w~MTA)B%dxr|Yq`uKi(X0%44toE#Ui#=eg(bsz&6-nH&3W^w*Cxy}rMuv4JA#>25ubr`f{43`cJ~(l&xzq-`{M<1(~uyK+&^ zdfiltP1#dley590&Pq3l`*FSrH|lFpY$!7&Nw1_DViZ^F7$p(q^*Kk9m2^Hf*!y}S z7k-R0cov)dI842YF%-q19U2Rv1*e-zf;+P8S#EOEjwjNY-ky)5UDZel#wmE`JIAH! z;&hW2LVYUMtj|r^e9Y%28p7e&)~m&_w5y){B2t&N*@WvtN*7U(pB&!bY;uT0@H0Yu z1=>|V!yz$QYfP@-F&qcSSejpBb=3x|8u4hYNt zMod&m$m2QD1&%dY#jfHsVW)p+#}M2|Y8~82MN-z>yy_}G5>;oUgbbXCX{)l%L_1X3 zQ3$C-OSuxzLMZe^u6j|FBw=;xMp1FR(|#CNoC=`<#YNt&)U+!3z;shSg;Zp`A3183 zI1yp>E}RJQ`$Oh?3D*rpuL>TX9Xy;mZ=|DD@NmNF@eODM%T2leh^pf(j5Vbq{;w

uD4L$i1}(>MUD=?v;V|Mc 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

*WBw?~{vHHfs++?tYM(eod!>(FeTiz|7VS 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

U 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�~M<0fYBAIhAq)dljM9|nvGJ8 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 oAqcSad$jkKSOSj9#4Xd`D08A>~s;sY_bpn8=R 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

4$#;`a5X)LrMR>AwRx;9-AWiSyBP|zy1m6 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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

GrfhNljFp^~Ig5T7Z@d@V^i&1Dk7e)%M1d*wD4 z;(JAYzn@m$i$7~~N&KHh9w8VWk^3XTC_kIB^nomF;fwxJft%Omp-HmQuu|53(;1bZ4_PLnQIt;F}r*uSr+ z)e$MxO8klXEwAdENsdRxT1YT@TuSD(jEpP(QN}k3RzN!mvGEVs!i*9@g^mYX7o9lAX?Ro_D zl-FfUTt62)@&59AIOSzstf#yhG9&+z$|3UA%O!6CZgK};pZf_2hk=llcnra^^v2HO zx9=NfE!?1McDorF0645R%{U+{aJNoFsn$%9m9WP(>1HOqE=j(77!E$7i&Y62yx0eD zG>{rgWuzHaouOH4>pjq9>ugDUT-I?4kRmohID#xUAgH4V1)1xBFbN>paa|;U%RNkr zo-cv3QFg|V#skXUvc9y;PWk&!X_YgWGB1-W)p|+E1@_&wpk2FmvQY!2DI0DyzB|q{SI$>VKtiU zwtX*Q3@5|NZMFHaB@^6Y`|2aXlzKT4cNNk?vAwOBvZ;v91Me0g!IL2yjL5(?DKZR& zB2st;6nJ|v<-oe&ZCE1QaDYpM>DRa4iEYNNcr#uXFLC>DUL0{ykcj}XuWrPBX*ca5 zrZq*{W@`$9k)SkQD5bRm#;wd<>WdT|3zeKIAU_sw&k1>4b73U|hHI36f8T<#$dX{a zkBtAzN8=9d88ap(q5=4x-7FXiLL~yZkLZnw1^AEm1c+YgOVhW(!A=kc)(tBAZOXN_tG!MlEg_??vW_fo95LbY z^yZRwMAP;%t#Ta!*TScZKPJ0>^;&*T5nDg)=W z%4v7;{XuL0KAJ~#_8w>o8ng!8Xp9w!w!bX-h`p8hO~AP5PHpy^1-iXKUZ|1E25anW^ z0MxoJ-#8g;P81at$rO}ioUY9Hq+a*n1;0dW(gVjg>JFAU#;VC8_De8DJO>V@hzzob ze8)V*1}9+rIo4 zQxo)sPzApg3NzRaw&Bok6Z*^{1HD|Ksa?G80bpkX6H8Al(!h^Y3wuci?>ayp81Zn@ zc;BHB&hbDPWD+3*4rCZN0*1I9B)8+MRe=|O5KTMV%`z~$BdjyO#TTvR7hZC7$VRyI(fu6DjO%GFpd=^!C3}E=cfR^ zo(hmB#89E0b)ZyI++4t}%v!%kdXHX0+~8U}ALNh^)qfC5vls5yVM@Y7l8ON(1_-e* zHXKF6kg`Zn2`N1#x^Ix@Krp4JIG}-E4vzR^91b=)%rqQ6TV?9a!vTX>fBqN=jmf)`XX@h|!P0Y;_{ptfzzaJ!fcGV*9+?gCc~&3}Pjgm44}(ev z5;+RB5!FjRU+S1bTNK|u)>BNueR=WVBiu{%9m2!jt$FgclFfwnx4L$-gxYd$(g^y# zVfIqMd(ysQ+U)SO9ZZ{qG$HyFWBZexex|zzc@?wn4M$$iwCf$@R~cLEB3H9d!tm`e z_d#zX_~$|Vaf>w#z$n&q;{1gS^rIeT0Ve;V$#%^F6;-+*QEh8-=(>sW27 z$x(Wo{`18WwAmmW|N7p3b5z)-b3J5nTRj$b+A!i>Hd1_v)jxf=G~tRwocTuB_V?+L z1|z!HJ|OvD8BD?bDT?tUa_wZ?UFnQzt)B@W^ylrAt?)z4ugk6Q+9{^u?qpK)TU=|X z2-Voj7PDDl$E^dJldQAK$$4}435u71Yjk&`)Pe4JqoEfDz~&?g4t?137fGA+wONUG zAecW62aZrk91y|rMjW}o!HW(E0~X=#aUG=PbdMWpfAPM0LHwmYL z=oAS=ry1mN4>aj#?vRmwilL3!6F>1hktC73tG{}}IV;o?-kT>Q6m3ADnq;rM7nfUH zf?nA^eUH)2$0MMdsy91ET^EY{ZKqVto6H$77K;1~z|t;XXVP~!IlxWY7wTu)o5rwT z@h?F(jNvuZm;Ln<{7gFxP+oXKY6fxJKmga6fw674V0^>8I+~{*q;g$&kU^#5LFg+y z9>jg$B9;yW^H|4$B%_Qp#wj3bPk%rrE(36~O-7+KZKo!v~s~s!O+uqesbDU_u7cd)GJV(b@g+s+%+a##j!PY1e;`_C=47 z{uqE;J?uzbGhm%wj~P4OiTw@FfK`mYS@M;;1~7hKwYSv}KZ90*{mOh`|J_e!>#qjH z#+Ebb?C6SmsLB5p@Bz4lsU5M5Mk1fQr9`HIi1VFNf3^ZnC14E$xX=Lh6+m=?AmzVb z0S6NB=ZSI>dj)d%lhYoI$Y~D-aK3{N+ygoW9>T=T1w_{w>VMD1YgqaYu{~D2Kns1@ znD>HC8^A6)##ax(@GYoF#2QxARR7ujaJD)MpHIEM@?Yo`Q_|&#u>C&vJ)hePaHI|G zCz~F|L;DItd+nQE+V6oTc=-PlqMc9Lw;0+*hV~_f_Qj+<;e6VkD;3`ZVYDAIvca*mO&x!KRzxY3~Pl;QFpJg8Yqmz+VMf zFx2NTjIvunRD>InPAtM$C@AKOvT}C}=Ztb@>Q&QYoO(kG^a1D~uQIWIMZtmfo{KfX zJ`AlO``B~H-iqvyN^w&U*7x3#CB`I-t)P18U-8Yf80(-jf@{Or*G?=x*%>lokkvJx z??Iq#G@Bu9FlG{XoNk9P$PzHM*Y=bK`Yrqx1o$WunJv(<;8@x`ET?geYP+CYsna#O zSEHSBHF`j!cS3Rk+Zw&aM2~4S$wavq3Cf*JG(v{=Ryz}|qS2Nn%Bd58<4m-!MjM(a zSDIN$o(%6=P#uJM98qQU_gyRXHI${v%~8`D`MTCbD;|HvcQ5mhx9ALJBcQ_LaS`E4 z%VY}PJAX=)#`4%ZKU7Lh4W*yZw}8^M%jCI0!5&&%!%s9Vc~X2$lhO7>ECL zJi&RxbScjsq8(SxT6oCjpy8f`hI3zNjAP6({{D%4tH=MeqU959;@Ys`Tfz{-4Z}Ab z>kU`n7YIBHJlLN8`CC~+Cv|_Fx=2^VlNR|@~%WIY8Qs%vLS~TTQjldB|YD%b5^@eJ)Qe8Vul=YLy z1F9Z*_9IO&-CYSYdaa6gbRf`lMO{bKK6sDEgZj}wp+27~TDVJ5Mc&4W>Qqr2hsLbg zuHsR<=F|GYt#q~6dk(qPSfa(B^r~vS%S_RD2J=>6Gar&T#Fhuz<2<$7jghR%iyli=rsm7U!$#z(hD_urHK}4^ePkGjwo~!%buuf z0e7tFc2yex`X{A?wE$~RYmOeK%_VY^X+0(!jBy8@Er1Q(Rb%q!q2w1q4U20B!Gb>- zurVS7HU=<6HLBCQXtgU%|r&54?xPw6-7{EA`dv?I@&u zEo>3hU_*g)F9;q%kUyyrMx;gkoMDYp`jL5-l^=M?#9~2># zpddC54 zj$Xo9rV@L2_&uqenXFRZ-I!OFzE4=?K#5@?L1vCgMP~gvuqj^lX3F8K0$!#h<;XrV zT=utMdyuB*Mn{?pg+9B=6}s$g2h1yUTgtKuZ_Gfhjtr;vfLu31=;HbqnWIvr^3xu) zU;gn=6eN?2=_p5ANX#6kPRF=)$`I@H)5$F&+Vk#FYb`=0&Cf$fa}gNYbs)!@3oz*U z78SXgeJ7M-pW#H|L@k7V!ygE_f&-;jYPb&MIIB76?+0Y$zQNpOTmV4t^SGRSp_JWrA9KvE*-0~saRf|s}LNvI*Z z&Pjl$TkkSe?0hZrRvd*Ve*rBBz~3?9u4=ALRpvT6-j8K+UABkXD5g6M!2M^)a0g4f z?$UYqZ|!90vv;Ccf{y2(1MY_d!4z$pJ1{V`D(s~269>wO)H?&HcRujO$&;vb7#m{{ zqY+iUzB`L$HYn=IN*4Ac>H-3*jMiWf5vsdg52xaBhLv4S>x^JoS7R`U3C}et%48f%TjW+z6pEN2Fubr;qg=lEK~i;&}%3 zR|SF_sK|8Ai7#hyjzgiO%n$w89pS*Jq4978OiW#vDn_E#CTy$WK8eNncj?o&)u7l!dHZGEV?2dH zS_oyiL0M!_<{Ol{+?JfEDA)!E0Wi?g(8iKzV_hHwBZTGJay%pCC8w&pBSKj@s$I@R zbQ-V}>eg=BOV(}9=9@k>I{PIix6~yg>xJ9t6QJu3q-^R4{4=>!AqQV(09*tj1W%90 zN~w5U9cT&Xp~X39x#y!5V^j!&iq=JFVJ&FBXec`_2?=N}+(swK$7^ca(OAi~5J1gA zL{dqhBZ5Y^E_%FvdHF^d@=UK5_q4k!*@DVIKlqEgBaubAtkZaLq4Tan1cRawW}`_6TE=& zg~%@Va4O?T<&zf-6;tBWJ$1D)zKM-Ri9z|ryxUxbAKtZV0eCA`t zema+D4+04N$Ua=e zWB<|(6?75$7bMIIBH@!r*ZKd1_U^6$c2uN~iL|({4s90aDT4>V0Qei2_tinp3S&{X z=xZVrshAlffu!={z1qXexnr{~$J&p8J0;zL2r8aKM)OTHQ==eZ@rQYjmNBF4E|8Cc0dsvrKe_ zMgu0AuhDE1E!1d+i54+B*!uQ06dj90QX-UWFOu>7opq9&CsAmo2axP$&Za?hb|KV^ zVch`$^Czu|5ot{fpf&MPGdegM`7kfWI$0w@R&M*q#MnhAy9}Xzvf~)Qq*P9JxQ(a> z-N4Lwa07#Lg+}NiQv$*$w++P8p685X(|m?mj#c(5&SQcw0Wo>A?Bkfh7T?3gjAU%{ zy8G!9XR!_YcLN+n4I*Y2A)jLy&i}g>)P#g=4&(&D+KQ{{R!V{cY?sI{ON&CqaasOnyI<{16;c$giYQCF5`s zS!SX5L@i~?8UvXs?nn-NrV8TaT)1bDghpZt8Nwb&>`or+NMPSoF7_X6mRIQnw2a|) zXvHB)!$|43=R$H+1f{d1%aeoGI@t#?mkMEzA@)iSb`-GJ0vqyorRAdP>QqA+-Y0H; z72_PzdSg2K*>*DkNxMBCs^PbHf$f_D?C1}oBC$u$Ysj)`V#t;E=NaM83xAiu=Lz79 zI+1o(MX8h_WO&VAZl!P&4diUfgrC?tBVy|ez}ES|70%hn=h_>iD9#O_L?XgioeA?0Jx40-f3p89zv&wFz(AzX5=I%8!qcv8)=rh{s6e^{cOUqOnp z1AA2V$a8K{iopVk`iaTQevqZDI1IG;lVUL<#bN-(;seEc3;8S-qbSxc?tGzG35eQP zm3XDjq}2Q7Xmd5-*{`%@rDDlIYt$efs^nB@ce~Se&nioLov!(ytcw}90NI`pgG2CG z)KY@J_DEwrXB~^AS1@cEB6UVowc?Iaesm@%DEH{>k!RiVHw|k@Gbrp;5Z2p}_Ah}K zxS%05=m$d0qU8{guh}g2%rVw`&2VO8|D)0coelt?)^*)RAm@+l-gMakzA;JrjI`S~P2#zVdW$j6pTekQSp8uCL8`IAjSK32&;N`MrQ zx2Hsi;>Iwc{hzMl-bQ`Mil1&|SG^ivIKsDcSxxwf?Jy#?!vJiDkC==hv>OH?TuTt8 z-Hb=nK4p9DW)TbX$}?&=2E6a$a%#e0&-aP(*aIO*$&+&AMk>)B-4S!j)nzhA-8d74 z7&_Kt)OQ^~{o|HkHr*P)w&|%<{y#zpl zZ#ojpG^z+m_HDB`3Be?Dn*d;WgUQkHd%3*v4GuNSG6$;l^{2Fj+QdpZ*ds6E?#J%QBgN>9sm7T8Jl&e+7+yYp}Fz1j2x>SW%_a`fEC@oWTOt zBFO!Ns!`_UkRza7d=#^Y;mM@dZauY65La-DOKaTAt2&8Gr_{`s0w41L(GG(-2Orf5byF=}&>^iE7cctCnq zXC8LqyQIF22(s|`Ec_R_aB3Jzwt)UiIDRT2+(l|Ax#kyiI5tGfc-37QD}CgxrXUV zm8m%Oh!aN~oKs?W{MF?bDI(K@{N6HA|2bCr;XIvbUNc=y{`AAr%^zdlh_Cg~On8+_ zHISTqe-dN=Awo{>-Gdm7D8~A*Vw6{LtyP99gdPkT?Ehkp4)kayEIIC)Ks$9aF-+d~ zRau$)ZsV-qTSi>?Ze#un=H1435U_{;PzfgmUO`abZJf!(Lp@=rIKMdo?>1iXeWi%m zh)iY1cl&YdGUyx1@R)DlH{_sK1MFB9!oZQ0Cjo%mK#)hSK_g8_*H$t98n;!vg& zbQ^`P2%%ADNi=KkA+!N99^_p{92MT}#L7Q}HdlFELmp#gL(iIsB+O6i;JA_XG<5MG zUP2o^7B8Gdr~B;d-r}{27g>)}w`~!5FuJw%Fe1^@vmggK4rW%*nl(9{zXf3waPI=1 z0K6z_YQXAU0zc{P7?CcF0d!$}^vQ_lz=c6bdX-3u61;PE@w%tV zuf(2Dn&mdB#3Uz%#c`~efuMMsZUNsfkhg0-l?jfI&KGS@<}tfvSb>1N{>2?!hToCl z=hMq)cxbA_P!$MwPNy47-H9tVrxu4U7Nfj)8hEV7UZY*(DsfF#7cjD055g&7>LbDOXD8sHWr1FghH+J2vhlahZQ0F>eaMiDC!EAUGchRkeGTo955^E;$ zTbz*~8j+4oRBPd<)CP{+pq>*W}4b{u2KPLg5e z`}5@GR&%?C^{PZ;te5aa3;(T7(}=Nhsp27oVD{ED1CVZbyf{U)W(}2ijMdxEx4NzV z08_+dBoMK?LF{4>hZw|Gh=)Af3973}Hr+C`%W;fV8;Euz?u(x(loIGAi$`E`(EC?> z={2@By<{Qy{xY|vXHR4)ZQ~Xa`2y+4K0Uc{#N+bL@KJ=M880V{yng-$VB91iVXh*Y z!u|*eNs0!LGEl9`3E=KMQBbSGt_9y9OD~sAhH&g`#v{cJeCwTRo?}51vh*ry=9|(s zhY)rf>@M09(J`QaHCVvbC2l7%2VVnmyV=WsEw7tB^PIW2^B4kl#l7ri4-iX#Y4g;@F5Q$&9d*?@YM zNy{|peubLHq-QnhR!v&Sq$x-OQ{R9L^#_d~kjk9Tyg8rCS;|gI^b;oaFyL(r_%Uwl z;~rM#4FNdXKsA7)_u`7%o2V@8py(u3BOESRpDvURjvy-p1QlQ1iD38!kd1jRl~n?Q zd3{@?2STX%l3qbkH6jyQ2H|ap286yLgf)U-crn7^CHxa*z&L>d@-xBJ6&DY}fYMSL zMbOuPg}fdOo%(7$N%i&H08u~!^9FA#!zX$ic>j?(QW?{jm9RieD2L&5EwT5ZP|>Sx zzZ&Q|1)f2G`xST%dyy~0fa@yovkE+dz*i~oXoi;nn8H0fQH8rlh5HZlHg7HC#udxr zTZD3(cA=E+Cd5JP>Y$kSF`NoYu5I6bxIEi#j(VPaJ@tZsefd|k?HB~h(pz*7`W~8! zuSCf1%WAYQ(mnYsz>;?VO?xRu?b>;}E3tysJg+`;H^5*6%ON0tGF)Iph6@Z}xWGqj zbZ`msIb>iIYrQd`I1kj5gWV#la0O7)w; zwNOf&I_F2D&2a-v_r3#i^XPz9I*ILtr~TiRsPJ&!^+5}2x0+4Rek-y@aS}S<&DMbh zEj%tF>X-7=cnUQz`6`s)C<69@T~yt|}?-^xgTK!m(>)J1S!6DM;q z3Ezo!P4CfX#Pnv;g8upr-_S-|MA_}GA9?(Chkjf&*Bn@RA&fmlxCRL~1z~QYV!wx! z+GE&^!9JP_VcAp+U55&q{S|WL>i$! z-SY!=WP{OHmC3u~;d@&*_coR)Sw%4z3#skql48*3BkcSYYWefWtL3Nm#oEk`YX0Z& zCWrkLh@p=B`+VYLeU)2khfs&*?3^JAU{#yiZ!imki%vh|D!aHndP8 z4M^nVq;MiWu{__aM0^57bedEj8rk)<2!4c>zQRZimBN_)!*JQ3W*Dn|mATqix#b2_Of9=xfmVKZj{B~;U(U3y0^H3Y zPt_ESqxr`83h`uL8OKsJMyc4ONDx~~Y*MW#zF83$qazXBU)q5K)pqW;PGKjop(v&_ z(&Mv$iFT+-J3%b*2T59Gl1{N{ZbK5AQ@%VgjfzFAZ)6qxO}QlMkFL=%HQG?VR+R5$ z$`|xyl1$)Ca^RS;F1sg=dzp3A|Db?kZC52jywCZ%3+z3gQbUP+Mx?bnPt;pTuwqei zV13to-a*aXZovrPRmCFP#;b=yvNlOhFeD2NNj@(mc_J7hDL#=6i5N=qIgqrIo`K!I zfVG8UAJ?|J_D3{#lyouEGQg=2%>h;LiCWN1Cat}O>bBlRlIeCgp>@KLwPTbB;?SP| z;&^prHSwedyHJCP6Xaqs!eJ22{-OE~?i!+M@#3xjGD?kemSpwrUa`*`8NM2lxIM%b zKbGg(+C!wtcLBKt0=D%fU0Wjr%hEfuemm&6(~N$8Nn^{EQ<3`+1lB=RfxQmW%|_%f zBZIz>flnY$20q*P-qt!UIrG z*Pq7v#<^NTk5K3bkOXMX|9nXXIs(wf&1MzFsvqj2sMCnL=o!yGau!lRx{c;9V}53e z`l(}&sh?WWOX_w3^WrvfZ`n-U=0V56EmiHWr^dS(+*JlQO>y66p1slS-C^2As6-TZ z@EjI5oyWtOl2ydzeUq0gd1o#On@Mc}= zX0;TokR-8g&PC@V)p4^<q~9#(!gYagD#+jprSi00p_oiBBU9bd0*Lm(fsWX8avw`a!&ev7D zu{|Aq-03v8vS$94nPDLWs)l9fMHTFf?_rBBN_V2Hc2V+)vNa5)ie=vh6t}Id#U(Nq zF6bQ&n3=|Y1ndP{+17R#- zYS378aT7&LYNEPm15E1TSc>T4Vdf24&*_4%Bg1t8hsE=V7}SFQT987uyRmy)j>rDV)PWBjd7$mN1%@)0r)>@jonN9SMS4UVaLxR>OD-D zMm_8OOP|P+u#Q9h>lNu{!aR_m#d!eqSezzWoZFc9T%qUuP_827Fr$@0YGsg)+$%Z= zGH;+DB}p0ly%cE`Gfu-x(~+DWt(-noq(bJk6r@Z=YN|+=a}2P-AZ;*6PbyMN=ABx{ zyM_8#Pd*)X+V~;nJ&zg-SbK9?@&Fh5O6w7%y4susYM5Qa?;34B6vgWICx8;F=?+rJ zzlRj&hA7YqC z@G>Yu7i|=GJ#p9cV%7DrVv*)K*S(f`Z5om8D5Z8w}dCOntaL%8{GQl?|c;}A4Y!q5#gVvX_;Wd59?XDkfvZE(p6Baj;Lg zFm-V53$L;&Ob0~JbEV+HAA)HJk^+Kx2ofK`RSHmu;BEvlkhmVf69~Sb!8*9w!lZUU zkUs#VAZUoCA!vx@g#cC|2(&4riy(+Gc*3NzQ>|NFsWF^@Fv&5TiZJOVqbHDGAv@#o zNKKX(btw!}=1U3)^Cv0!7r^Xg3TT$%$)E7W$lT$TfUxi)Uyj%b<8YZGe36=*Z@5Ux zd`VHZWs<_NzP1k(7GbuW?!(2&pvWenS%fUx!4R+lNQhs{%<^srBmf=TArJy#?vwQE z#}~(uFy18W2DBv1HwlBCgnT4OTXi^YLIPa!$6a9BpVXt7`zvKjXWEN5No+9dJxd`3OehZtxxx|H6)u062sa4Atrjc7y;zj5hRXNilOfHepk-3N zV=h~U_=9|D9>6*Vu+#-)h(A|8ujWX_6^@XuaP?KVqNgAnMlZC2ZWL~GPf=ckhbP?z zg^Pg0(?Kpn{6V-qQ$wX#WdN(VfDG~H3Kz6~eZr$W5_07uuq)rhheUa;C?7fi%C`oX z_Lmrjf$cyKTe>L97vr*Jh(7>c;{i-DfOTC!hWK;k^D2*2T;T}m3b+435pK?O2q&Af zxVMtRwNv3XW`=Z<1~*3GVqKmL@dx3a_W*VGj?PoE=1KVaEwyAV`kgtu)mLdKC_~(>RLFyX71Q(DY{#^OI$|Dt5 zI6}I@EgmY$>rdg>cS5*JDcniC9S)w;Jv`}iDO{4vlOg^9*v|t^F_UN{i8X|P+F11l-Wbl(kYG@mz zb{DBtGt^=w&HD6zqZX^wI(n#GL~3hvAf=Rz>-HQDiu0?QMZch^E9ZulwW?C>|pC?|+ zuunq->{pV2af{7Kpl&#UXqI&T>=_VNgoANj3A_a8q(I;r z5-`4HBMHn6CvetFppN(sBf$wJa0>SnI0T+0f&0PG^42)mWQH68+GX&~@yIDt#N1Xg(o zAT8z;pyw+?L4%2rMRn?q2pm>-Vs>?6^rvz~MI}*n~?D90|sg zK=p6}le`i*Zc-$mn*@OX37}E23I>qCXZNcDOc9vo7NI->w|NL$M*=y90BC}!b%U2c zzPAYTRf4J>0?kPv83Z6rzxD`k^U1*fs9vtnh}l~jOJDpglCZESgL}?z*~Rv7yI6+! zbE^`z($pyl5@VUkbx;CA4XL0eK7H3%u$casuo&lIktePkeU;0CA^tophL_8NfM9WI z5;Seb+8N{$t6VPfaOoia9>+OcE)1Q=WnsBo2na57$i?&ymy^rtu~L@*Al*^dZo_4m z%Y~uyxcpKs7XpGyTXHd7$c{(BB}KX1ks0l;sDcJ7saWjCZ*(sq($BeFzn2RE!KE^}m=0&p7;tH-TxyrYWroXzA^vD%rYx@l`NFag5L_1H`UQte z4!NuuBN}@P>5j${#FOKiCYK9C4i`S%vt|s$GKDRLP+)NbS(t9;YO?69EN=6#s4Jcp zYa1>LhWKMa_$;3Vp}^uWE=O>>g`Y=*#i`L!3Z^@yP;ZK3WG)Ma`1^MjgaV6PvM`=| zHd)M37TF#a>g{ko!eznG|IdO@V9}N=jAub&R2Z8Of}>q7m;5KySp_x=+Fu|6_#4LyehuP31nR(# zr|7WLD1#ph{Dva{uFJH~D8}(oz!-`pV_k|3XzCHBMvn}WqXCvCMGnx8#d@8yj9gbG zxLYwd5c4Enmh?#QXCuYLNlV2mgv3o0ehJ|}!6d|9WKjs}}Isp2XOJHyl(a<21DgQzwoH zlcS9(S^RlAiBbs?74tG;J{qo*O6BRqr|^{s-jx z12%G?vIyf1B>0OY0cSmge{Ng~w;|j2k)6u|z+gYEwZ6f#^H)7HFc(jr8R$#Ms(=hx zp6`nWEFEqRVd?1L)no^Z#!{smACf!CJ78Q2-o6tlx>~s^K~^hwjD*bNZ)x?9*37D994e1p_a4-nMNfXZAa|^|9fmfUm zR}-)3&sdCqIiBXmpdl<^6}%A57a7tJ;dzg}*?ev<;6UBJw$*vGXBpZ}!)T`%+EK_g zw6jV3O}ykx+IfcdBtx67*#4pAd9>RZ+MDn7%3X>@Wy-zEa%nFm?H-2qDnmQg(54Tz zv(BgeHLzJD!^3E&X{vu@i1sGZK7p5yDfezedsCL`gdKu?IcW0;4b=^wJ?t?WXw+1W zNLK)Wvd*xTTX#HZNe4-EU9T`px)r4rO9Fzm>mDgGYzlsz2XIKqTyTWDtuBS#4D18r zzZSR1i@~SY#LM81;MkeO(&V)QBha3)Jc->WYN}@kZ@_R+sF{4Wtbh}Fy90_~H-;e= zPvQG~euSu;n;-@EhOMi`T-y<8%Z*~L+fi7K09m@}hqZL0@MP(1TH%j)hX(r*ClKaO z%$gA~YX)G*d_+YDEewlI%$W7IyOnWnN60k}w$0rSFC|8V5(B{H1MdT_1g8d? zfdy~wrWHhXsG!4gXF=3dZ!3=S=)M=2>n)iG?1a$wJoK~>X;l2S9;W;qMDbgQ)Z+$G!#Na! zKT#+nq6P+_20ozBjmS4KqtJk}rd}t|eCmXIGnYl+0_%t?Qy>bFu4Cz^Rd4gLXI% zauqkGVuA>1#vd(^@n5<2)VJp$;4E3=diu3+yO4G}lLJn2S|XATF{$Wf=hD@`amfKv zPYXTgeOVRK~Cb;aQN4n&)pXkCpqHc?*g zf!qcr8n02miMG*bO%ugep9oypM3XeSTNXF4Fs{+xA5^|Q5JhWG!-GFDb4J9>8GvE) zQ8hZ)10uti8MA*%lGAAnFDRg6;`?2gEyPge8F#446WfZ#`>hBy;=jsbAy{tQ2^w*m zd*I`7+><2Ob>lh}>cCE@A~$`l$Ei^>w0H*O(ar1C9MV-1CFr{vMX(>n$=j^NK@ZVP z8n9bXdU=~vp}r;rI&rQ7Y$*{yk>vtK5$H<+stceB}=;q_f3RX`} zuF%O!j0S#%^d2FVx(wpx3*&zmz@-a|5qLw`E_x8kYj!<+&a>?Maz2*fWFKlSG2eAE z_flK9_mjzwVR65>45`fv zdFNh@}ME|3^KpwX92)Yj-C6FsKU#U@&+(IqAt z!4FvktyfI6ibj{3XpBaenP^>&zG|Ye8hy<~dDA3F<(p_5L^&xyUmDR>CKkLmNlW7Y z2v;qj*m;1pPsi)zU{A7osd*SW6fWY)L2@3W43%WJtL9kuW7SDh!3e41<|WrYO@8LcN6?B1GkoN-~j}2$fULA*?Z#C~ryX|M}eadY=94 zY4(e+@BjT>*YEnxb=5lE>vP}hUiUgaYpw0eKVvD4)?(Hre>tdr=zfy)&vGzK@ODwg zHaI}w;-v$xZhp_GG`_Dy8l7^pISqzDC}nd>jyX3G)?=pPBK#Xq6x7R4(FNa1W-bd> z>9YkZNcu11X6P!Gxv=rn}^c3=YE$2K37yPGaya zm$(sw7rMa!gM}D-l(;E^%W|MaGk>fT*PL--#?5f!S}`ufxMDXh#5h?(k9Xrz5C_pO zbR$v`VWug+IN5D}gset)Fl^E(mCu+8uH)n?mWdy#Z!^G73U3^pHe zkmE%}p*5Xgx`$|5!+Z~)icTtZgB`R7(SY`z5&P45lK(OMz_Tu`>(_CrvlCb^<1E|! zTHA?BV;rZe=4&^u2jkeynRnc{bi|=LS7-!AYl3mx30`9G`4o7WRbPH!2Hawi&aXX7 zR11YviOxuLxStFnm8iQL7iOI7nH=TDWiU>pZ0N>C7$;KhaZ5OeaUn|nts9rgI5E!m z+_<5LLupoO1mvb5C_)%s@`pDaUb2NZ4PJ7Cm&GL$cv)OxYjKI_6!(XVQQX6Rt1WY) zA3wq_(FJ&?2^)Q^t%0Y<)>Z>{PQUKQP?4Cb^Zm=6E|wF@)$(@9kfOgde8hsu6NzBS)nBdUL@vgeR^pKycK^H)4N} zj=$%*fuCRTLv$~~8lpc$*J3QRp+7{&n_jXUIgfldzi4I057F)FO3nE{Wc-E&Ha>Y$ zDQpeV?=rgnbh(M$X}D;zBQ?3EmMFKSMx`<81w>&S%H+LfDEYuJsknxvh{C-|?1E>S z>B-uJmk!YV!~Gw)`-eNh&!lDS#TDj3DVeMlX*bs%0pw5i?c;v$P*j)x2nYyt<+sS*6i0+0b&0Mdgc6P<4IlM(bmpbZ>qe%}TY z*=Q!A*`am5imSSqANMdfZY>hLsnWb&btY>0C1S`VDA~! z@Mt!8W~408m^p%qQFu;DI?M}3jtuq<&ndaFZ&LH?;fSa2Z%KB^^Bf320 zw$L>g$55uRjP4*p1pLiTR(t>WC|SScGVRQ1Qa8TYJ5ZH(wu-6BQ6P}2)KlltiT6jn zr6T*CFBKUk&M`Rk0e&La%T;0?{wG1k-RaAeUpDDJD}@o)t)(sf-P4Z3@AJem9TJb} z#me-p^Mq-4f<4zpn4U!cDVAwB%k&qRB?J<^TneVFGW?bV_Q&gsHK8_!`OcyMGmnfZ zb?0~jZ0RMX9-sn@CezL;z@_xB(njH53^JDb8WrGLrhSK|i`M45W&;ALvHY%y$1hj; zeKJ%EOud*_TT6k@r~e$wufOG2OZkah`IcWhq?s%14PkF&tf zleJsCtZ()d)pXIU&6xGD*sRI%vfiOtcbzMx+&v0eKW>FiVKh6M2QlQJ5_d56oF`o4 z&O~EC^iPa#3FC%e?4fU^8eSJ*vI=&2)kR{?4pAb5%BwkIeuP%hOx6Rzaa%r zYXYmsM~NoTFMxj`lkbcI_qV|JS>Sils{yZ&2>kvDTv}Wzfge!dp%!>4q%_z4Am|H- ze!E4#0huWFNkES-`qK%~qmQ#&a1~I@X}eUO(`*i3OpY*f)OK@Zk;maS$Kf`|`!K>N zj|g*YIN9ORg*m?dMI`Jd<%hH!Ej~O+CA<&0p_}$ht8bB)*|ZxqttHc*)lv%HBNpRs z(6LgQyaR$kN*p9{u_eg01PLVQs08~*!aqvU_R@c@B|g;>zp);X2U?0)UyMS*T;3au3kdeI!JQiHZi9O@*vSSH zFs0)_%WcEx@?If=*Igj<-6YVO?nmez*5OvD_q9_<1su6;yGXnG5X#p2ToZyF@@il^ zMfeo^yk=q-Mc8DzS4~`5^DZ&II z{LvXbLj?Mw0c{0|xfycSfBm)cA$qA zX(eWGm{*g=bV~&=wo@4ZgN`DFe3Pt6*)rlsP-@c)d!!~GnX4w6hwQ|q_FMWnW8XSx znY{uTT-=l04Hmr0U`-vA;7UwTXEHt0gyA%WZU~ymM*lWuO0>GLbg5W{F!Fw^`?$bhB*dwOr|#h5nplRS zMBwmGG|Yf#m>%p_lSNPcImqO)M?eK2CYdemSr}JdKjkglL3#BFdh_0JXJiJeLCC@n z8WbEdXaocaNATYy(VB>qiFA;u6up&w(J_*P((;E@NOHY=X9{-LivI8j3@#fWPi1d3 z9CIRu7HIA83n9^u54*z*wg(xV$msW@(J!D(P~}jd@(+6!^n&n*;UIi^tDCv?SMJlIT98H|$(#sVzzK9Xi7POSu(-P9UraZJDrM5?~`t z=%5K{On5;Ok~E>QCiG*%zmQPs+dt&Egm&df#Zm{qY_T1|l8W$D-&T0s2T?yp0D4Jh zwlT=2stT0)Rw5yJ`ObP%eJ=`qv9fv6L*Lz{2mGB#kRQ&NEEK-JK%|l9NIm%|7lXMP z9MMpN1sc54ufbvjxrTtlKV3s0plb+txQ2j}STw-;Y;UqCO^qye8i+w=3b0ORS%X1-zQa>e*vp})Hkjvt%L*+W+q7aC&Dlw!q5W|=-_O@ zok%BJ27z=N0QH9k@~-tnUmYV2Y3-`o5vVqdM=PMWo2_)lYE_}X73F*HD^#sA(jS)R zhmV#_c?l_I3lJ)YvVDDzf|y#LBX0ep@U6vvpd8x>lsC_D%b2Xqtv&%>yam~gVk>Ql z|DqF>9Cl9~dN>o6PY#5zziTJL>Bpri=!M=N#Z?n$GumVP`J$yEuS{dBUsimJ;>})$N&IW%@ zi$hINOGnlSIk^VNnS|Wm)q#APkbXd#DLQ}fCt2KzfR0O2=raG^B;0DJms>k2@5f_l zCX#0EBBzC%8?}nLStov$r(lJM;`~ZYhLq7Hp(TF&9?~2ZU&h-A3Jd75%km0 z<|&LlZzHFTrkd2`YMWz{!oS3{rBDge=G(L! zO?!lCpWA%XY}%k0P8-N+fXnFy<`|9~wEiKmK+}1%2z@CNHh!%MH>%FAU|b)|y0eAf z?iY=WWLjIB*2Jc5)U>mi=F?gnNdIq848^ZJR+aIT()D867dGu3n^vZ2U6{5CX;GzZ zW>F?|ag^4I6n9}lO60q2?!lTniD@Mk`8u1{UDI}7fV9hO+66YPnWk-J+LhvWNp!e1SFt1 z!4aRa7Y+D_!sT4nP>7PwPSNw3XNGO5Gc2Q_V8p!JUe%SsR=CW&lX=f@^Y#~hHgA^A z+Z=hLir&i{K{v;d%+cQFXm4|T-%yI2%(UT1Gap_q9dkHS28^xjhuy9z0o}P--N_OE z$McctLtT2{T&$3mn;DAu1rwLfaQeain4%a^@K2^F49FCP9!yc_)RjF~`p_*sPJnut zEnv@e(ZA5^U8stl!}w7E#_sDjkV02c=FPx7DsK|yZR*N<1#`B8yxfdsR(zhJTsz@) ze4{BkLyj?w|v_weQr(tSE>`K6t1&y0Qr6whL>6yGQY zA`|Az5ez-i-9Z0lV7Mpi$3VB34A7?Me#~|dY@(c2l2Z_KJ4|Z05(I|4&guL0bWBWL ztK-ppbM|qLT4ylVC^R(G|87(XaQ#_UvWn$MJ6t5wM2I#hRC_E#Duh~xk(*-X0u5qrJWXosEo3mS)^o%poE4MYjeZ|i zePE5%$l(m@#}~*cz`*(aOLVQj7a7>uq_ITHe?cTFhLMzIpp;=)e@xW^N%+-Kee-*y zukT0f<*+d4IaCsEJO+IxR@V$)FHd8?h8ULwrg#)Z?uFSFnqMLpllYTvfdOfL^q~3C z!CAcLq9MDKx`aH?2e+#SyAMdC@}2f8%nJ%_4r=UN-DZO!4Ze1+uHI5LIK`&&b{>eI zvZ?6|VvR(`a*}T~(adw3*lqZ(?js*3c_eQr)SQ4GR*vLJ0AZ|o=!Fa!9vto&7h&p; z=m?@&gJ*w8ouTKVj;Qf;YCNX{zX#&$IU@D5725>@=FTto@pIE4`fIzh%fn@MI1(i> zeh6sNpQjNxRh{Q&Wt5+c7xDV-<`+fxhwM+0J0>h5XWb1xpe(4rEQn57!jz>EW{1ch zPQ<2)@3K?nH>$A-1QK)29z~-xlW_%ZIZ6(V@JuiNq#_xRilhe>NoQ~DOj&j%m&gqWOv5#^oHwpyDkk%)l*X1J6tLg_||rZgW~g8XIzw0r}!5L31;??X4W ze%*Jl>TvAFkPEDD<2kUtP8(|{RG!N<=%$}JQx&I-Twtc_)3?BkbI>h zk@IT}&W~kJA>d~lPy?r<^Qr8?!>H4+#y1bVE1mmvrvIKR4-Jl|zaJKU(AWrI@lQ0y zfM|>!Xp9a_{|z{1Ar~1iE^Ufg;hbn75J6iU<{uWK+OqVwgtL(cT3*%5wbl`|*08l! z2_OtWdhyM=Axv{DGSTwMmlpdr3V`Sw1W_+DQV0r;A<1GrEJ;y|WoFl6nZ_XUJs+LF*oq>@U?u-ZaS@HiqD$O0umAqh^`;9#3NQ-g&z zb*=_`+SK_7it&??7(e+tHgd=hZ($Eex%m@VoVVXWd$|8?w6dev9tw4}`RiaL?YvTc zX4Lt_aHX)v7}tLpP9H}19e?dB<1Ez-4U| zur}HpEu--=-2TSzPolpvBgA-y`DOxu22}h!&yYCB!75NNQ`r`;zc1rC6q+)(Em&Oq z{wM{Qwpk7ie1ItaiAgaaCPh!F?=;8@%V8k7Y$u~Mpj%)~#%ZWN+Zv3vD%nQVu@RtV zd`Wo&L~KTOSn%g?Ty_iyJ972xc%H0k-9-XVTrUEC}(< zHW?@It*NCK@YD6=7YJ@rHwrkHfH@YBzadA!bPFgyJ~!I}-Wvlr%L3kA9k85$%`D&s z3;4r8m9QBl90)+Ga@0Akl64OCl$)QP@x!MqdexMA8psvl(g%d5ZW%*;~(Lq5QM<@WA@gv zVK^xTAN1M8?!dtv^9is`N^ee%%h4AfZOm|K;^9E@1-?O|fMLE=aZ#hp$&T;B7HZ~4 z@}M8?X$(SR9lTDv(tbAWpq>&OK`z&k%gSC3mm|%s4i{=<-P_h+9Qggs6@CREq%&k; zq%&k0tIq^ZB=?QzHz1jch+o0FxE_85t9D*Ex?(U??M>TJv=WwI)eUyA(oz6NG^e>xf$Gey4 z^IB=g>t{tbhlyCCWtJ!bP^Q=tN$Q0T?%BW;S znSoL(!^`!gG|Msb2eAo_na-GxyfHHwlj6o;wm$_i$c`hhIJ$+0IS_OXbV&qrI6q|R zInz}@8E!`9qrUc}X-z+FSC%7=Q2T6!gLtTG-?oYn)^iveqf1KPP~@-ixK;;bhH__~ zB+5O3Z1R4izVRiRrgxbx{U@b#5~I)ZjYI};(PWsY|17dk#k~*o4=nDymZ*R9#B&)a z_(a6u?HbN#&=JcZk135TEJ?$Q(fslYd>ZAY&r73@GTa`l#&Fw-e9u@I2FRm_WjG%J zX>^3*0RILEu}bwlqX;vk47O`)&Yb&NsHlq=c!$F~zF))im}zB*%rkPK457ZsLE5$ypP*-YW;#v4~pEsMFjien@_gQKzhi@m_g5w$O6$ zAG;eUoH!s@LxPD@3FDjHMV1TvRQDC5KUIUfUYTEoIT4PPV#SN|Kr3+g3+p9d@K5GK z49Mh!9!x~&Bo-YjzYJi0D(CENc)7=>$CAa9SlyV>xJOp?s=~vlvAzU6`5HsNgTz*Zl1)`J&8k@81y6_ zi$v37jR<#jXHiyXRHCiHjk?tWzn%l7B7KLSS(t)UvqFwDoWJOO?{32k{xB0F?*z~Z8IW}>rP0SKLSS(V8 zg(q>5hVg)bUnJl=6%w%LoGBSFdl)aCEMFTzLZ8d5>~rfQ!ghi43D7mT_aM%L>lPmQ zVaR4t0k#xI2?fzf$ZKnTwUQ@2g0KzMPM*{i&91UB=iFuf-KRqlgR^mHOxHjZk)o2h zIir&t7_Ht*4j*2CA8y2AQ)p)hEq4wni@6uancc6#e2$6*>@ROzvm;^&T-tg|kl`LM zspJ_8NK=>9vT78hSzK!niX|MdlS66TTpQ=f2I}9E>W^psx>VQThY?+7GoFO5zJdB6 z-CpYI7)S?0nUpdOGU*V9;2aSZo*A|tZT(S|6(BTon##iqe@o~Hgf?TUXnmLfuV9CB z0zwWZx7@?dIGawLr$J5;ojP}SUcIEAy z-5-mwMK7DYHUkB}>3qFxQjXlbZ1UqUxooll!BMeyO?dGnEcZ=VtGI8H2eG2}O`htC z>4&{<0s`sl&&vRZoLg=0i2Ei_)<@Pdf6-}(&%Vj+HF4j8(Py(JjxA@m;X4t2&UPa3 zFR}hi_@B4_EKhv4Cq5_ImxmyR`Lu~lWr04I=v8Yu7IUy|EE3LUz0V`^2;j@GvHgc5T zRS@AkMiqd-yuTD3Vnzy8sCPQ@&=n$#I~{qxqCU|=q!Kg8LW~)dk{7+4K4^W!beUu| znAZSzK=P*gW_3O;q3U__5if~FhcqI*A8^$0HFdvLW(83-e9p*)m?w%-zGSGYBYEl=%vV`k<8vZt|qhP*#+=&@FSJl(`UPF0^GX1n-WW zyk#zQ%iLzAQ|4vZ&bMVgf;?Kxb;^9br_2qRbSH`%Edvi)nj_sZ{KmG_sahF!Gm`iJ zqzwON=te3+ESz)4U5u)`92U0<^=S%m;NHAU-}9_q*G3}bwXm_HuMe549AmZuX;az2 z$Wn*bCWibjuLkCk^U%4BAoSWonHrUo;^ymZX_F`I1rJOgeF+^o_pfla-Jc@aSWK{& zBb~i~#Qc@ozb(=z&{|Q30b?3|twfFQraGduGWEL~7_s3)`Vn$Q! zR0ucRd~F}%r_xYjn$B{ z@R^mY?aN^U(35`__D48N8zy6!e-nwz&~(jG^z)GB6Gn{BbIqZh_W5ry`UDtglx;5A z9__MCpkUoywrY&OGur{MHZ5?fm{SnL(qOq(iHi}CCwPv|O#K7kQlAA<{|#CH<@V`G z?2sap`FQ<4{9b4nUTH=13H?6yp{)JAOW-p9Vn(l6f&w*r!7DB2I3^Fc+*FjkkRPxo z1HJZWD|6C|nQsO*la_%H`up15O=-A{#)A1H5xOY?7%liblweMkRVF)VpSb|WV_rW- z)!ePFs`(dKBveMtzk%O66^kLxj}4sa$|U38F`7Enl}w!FxELK(^-N}Y+0D|9St{Ht zs_Ilm-g}Tb;-^y4Q3~T0Vl&O^h_ADlD^GW~{}d!WjHwIq zn;)J;r*z7FVkN&b;ry3yJlXj*y8b|cHh*a^P3nE7FTt59o%e6m*q-Dx_h_%}&ZR_O z)OVC|3@LWJ<|so;)}E2epb#v{6G30gF01KBMKojbTewWB3haldri^;|MQ{DjC!;)< z(P5;R>@xD1S+JKC&%c4~(}llwPQ74`xMr}<5fQ95N0j;DPLg4M$gwjzKb+bD6{z#W zEg%pxdWnUI6j%$v{BR^15JaBG_$^rOL4qBvr5XK;QD}fTEx-tIzGtfxqg)&PE zqaZp<3(F)Rj7dPaanWhKc^ig^4* z*)r)%p39z->KsDB&VpdFf(xEY!O;3Je<0BeC0fOkJ*glv-y#;8NN28QjM$_R$1|cX zBUWj|ag6wNF(MWb=u83fO$U%HTfqSn-gP!OSAz%oqkNd@&ez}`8?4aaUK`w?!QX6f zGlE$1Z-v7@S@JUg4Qeb_t_)+zUkQgh)C@wMZx8|f;$8&J@QY+6%%q+^-!aGO+i#m; zLHhO^eV(ynE`sKJpQv1KIPhIK61j+b9ed03Tb@&W3y#M7 zE<%+~TRoG~tYGW7p;`*{U>;@4MM&Z2a01Acp`|!0Wo~EEDM+gP4bLul>ig`cPy_20 zAa%xdQhgtWQ8|$-T_bG-BZUrA0f*5N_V@)?jl+BoJ`dP(3^N$db#;ihr;%6YBpl;8 z4)vE!OAdu!E=KK^1>b8cUFZ}t8G|F~C4E*PrgjnD$6G`X^00AjIM_x8^6B47`@2tb zjb^TQFe;JcSxa)Il3b@GgGur0R`BF_R?yNIDk(Z1{7?9H!1CeWWwdY=kp_c)hQme*@LvUDN^*Q4ek@I{tm z7_sSD?;uysEO)tC>XTxwE@4wyqv$jK=&SY@vZwGaStv#~@+dL7k8wQ7G;S>TUxCtG z3w+aA8Ggfvi(?p8kYO8_;d)XWAIorcHHN#N6NW#x5r)q($Af+-q5|5G(dJ1;ed>;) zTsl6^s2|t@A9bi6VbqH;R1Yy~6{!jxs@aUXGlps=qh^!pd{B9s`DODU#W(Yj@GQn3 zaGgNPi!Zlzn0J}hUjbtEJHv_0uoxLYdo5{$uwwY{r@ub@W;ZAhaUUc0s^u-Ce;fQB z&f6acP!2hFSI%1A9M^g{Z?l#<>u&9JH&FABC(t@7OsCbD61A5`r#U281m=U`q#V?*{?dGRQNH>bmUT zJXzUKMmfQL3aHF5WxpIrrtB$BxHSR&cpAidp7HsJhhKhMaM-0*NBq@f|0_&BAIWCo zc<8s06`jZc@R@OltsI1!Fc;IucMLss@(1>lOauw&J(nCV6Tt?$?CQ=h@+-GtM3ZUl z>RZ9)mi{`e-2!koqVm>bAph z9zL@!P0qg?g*0o=f!x?P=?&&bqOqevBkSdm1+mMS^-am@yMj^JWelUczSR1;zdG9b zGd+IpuR1i@@H=^PJpNpdzkn7c_GFtH18Pz5(4ycZ74;Qsf|vb8>Cn{>#ovq~zOHY) zp^{rTBu@J5_d-ZV&sH^Gv|JD3n!}`)%W2Ppo51XDO-J3LUzh@H9xkGryrg&r=1npa z`-R&1;|bVZG!aWqP2A4JEwPFBJBfygZ^R}(;3R&_#3y1Cai0KOu&x&oredvywxiFT ztta^nBro%Cq5r}$*7}ntosk0H1vo@n580{s)sQA>Qx=)VZv;hCqh0${~GvFz0*-1{z*^DfK)F%s9rk0 zqH(M{dY$s4m!CATMlO1n}lmKIDfqISDj*Z#?gX9a}2jRZ0XP`3nJbJqcA-o zOeOA)u`Qgyh*Xts2DtK1q+>v&qX*K_@fG#LgcMhE;WzhoceKpA!(%!Nn9p=aU>O+;r{bRBDzkui3_E1R%`X5YXL z22t&o>{7M2gMf$TfE`GV)Xnl(5{ErPqJ9Lq%ztN3$aO5_s>G>m+QWT}Xs&`j4pRP! zpbUth^gvKaq@brfUkmlbph@fE)Kf>ww(b{|Z7NQ@ku_<+nhrSiCa32fg%Te@s1HMP z5rTr|gMfd+mjU5R5BN$V`G&!j0kb@o>$#Te;g&0Dz?Ba8e3uSB>E!yD(-)wR>sLz# zM}Dc=00Q=cY2Z{FmcG#}^K6!MC(A;cg%O@CeWF=zvRT4Tmb+{gMtHKE z9L+M=W{EgiF0xq|!7P-RV^fG9m&uwRiWP5$+@3)3j{u12`H0x$(e!tQA1cSUY55bC zGaxFb#}THqID+$@m=-cJx$Is~QpCq3=ve71Oml3^CBG~`k-Z3Xw1ro9sx1^@7Loii z-e5+2$==X}kQ3;05HYtj;arDlm5XY;VRq`r`xbuLCgFPNZ~yp7<$v{kZD+AL z(9R@Bw7->fyvuYVgjx4+w7=cXh^2^tbW6dNe0NXUZG1AR!3hBD| znn1dn+T~04dy$o|HRMB0NR~4Hz2r6!+^QZ#<=@TF$;x{LF!?9E84%v|fHxhh8F~-p zeZ23!FPxF++a0Qz$2O^EVso$uqO?)XNP3yS6@^*&kkw3dXO~k+bJ?yv`h~{tBUu4v zvl!RU!O?ZyNUn#6pHIc{2wK({%l{bgkHQ$jgj|>%Cjh1^C&lY|+)s(Dn{3Zp#S+B(CTDaG*4U`g1r0xjQW11evH%u|CBmMsh=fv zD^Nr5(>6fc*r!TG{X~zI$YTQ`#*_uSYo_rO|A*gE^3i{qB|)>~lh2FH(l1*ylTM6X z!(7cYW9xAD;yK$lFa7M)*pVb&^Q2t+D~Bkoqt~{njobneq8axxW1*YzmmbJirWse+ zjJMg0r^jSWK>IhRx*69o<511`Ix?bZt%k!tb|>X(Z|K;PK>h;!2l7vG$}@2BaDpnne%Z!ZD}HW_8spwtJ$;VBdEC3@PT;Z)F%2|B^Y-d6SEzwX~!lZ=UbAmH`j}NcY+Q|T@TLu zlirsB>3!*esC2M#a4Q^C5JSk_nYoK+>E>~6B{qHVQ&~tdb2>{!%L*+-q68dy&lqf%|70q8%iBOq$w=T#8q5+MW$kd3eox{dE6$Mt}uN-*^EF1tTi%KFWZ@? za7z%VzKuZDgJnP>A|6gAC{gU8)tGeDyDjwG#_ag&5`enr#)SSg*TateMfF=FhAtmqXq-{vL z*dc8NR)R{N)k%*e>1`l2i-(JS9mj}EhPw83j|l2J2GNu|tie_`7|~#B8_d)o`I9(H zgGbq5wgy8sn4>|Ki^RFHc?&d1`IuUapqT&_!#{&bn7Po!EOa$xf-OsQng6%0D8P&N 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 hf4qPBQx@n%_OSG`An~e*t{iRfwG&*#?PH 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�x#*P) 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


Jt-SS~C|5y` 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Νc*Qg*6>~pD-Hkf+l0?=YWPa! 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 z zm)uthcQe%Z)WX0AgTk@VXtH^jEsWPEK^)W3US5bEFZ0t5=(HUd{-~Q0mO1i9Q_oQ z%~o)>Yl<@$q8Gds+~X0CDWnbbjHh^k&-eqM@kc!4PjOFwvaUDjzFS%&XgRQfyD>8; z_1AQpN|%L@oAwgOttAEmePc(6H@_)4@GID|hF@s3yG@HB#7EoFl^zUo62I^vrERBvMp5fak4gE%@32{r!6q_4w>z&W1mVoY)E zXgD3m4S!;4gc+Mf8b?6{3D^~&|+2S+2W2Jqvx;`vE$IK^>fDKzJk!Ogsk9!eGq)bxnU%s0e!9HVo7 zaXm`w`xwXiGjuh)J`G(*ii<^a9J!_Tf%Gm7=||$p{y8qa7WY>n&ixkRERHbY^cJ_t zJnJLS*(BcK&8~v^XxBhZF~nIki(69tQ~O-rgtL}+ zDx|%l&zto3#jXf1ahWg6|5JOXUDQaQ;zECRGP^XQ`X7yj47rjV)E*N6{m6)pUZ?&{ z;$~RnZ-V#M&`8g5LnF?nI4~9=&NNtm!+sVglipSCm?VB;P}9LzKv-|;i50zTKYn&= zYl(n0qGEy%O3D%8bH}-GTt0=b?ykoq&d1=Ig!^xU!NrxuK|_9k;U@CuE43uA z_!AVOqp_4@7=Y-H{UWZ&%R1146FslDwdBlK{8?yQ&NyJljH6j{r65U&sJo z#4=~kWJY|IucaTu;iU;V^7TjQcg865v?gm{(;^maa5AknIC)SDxLKY`(}{Nj??^As zS=Iyky{4#?uP8YyE#=3jF;Jv5W>S$GaB7?_aO((4`ZV9k`P;x$(x?7Er?&=H((AOp zlyh!V#B9Rb<(I`^vs|($Y=L*kFN?$$`VRSJ(b%M)?~vb?F=e@IIn#u>W70Fhi~fy!;N)?qO2Lo%PwZ7ExYv6QPkJlhPLFjV zcL7o(yiSxjQ>3_9Xoweh=1<43_=ot<7eN~I+8~}=6GKg)Hd%k5Y6xOfEgvH^t5l}Aex_TdW`TGmpLvyZHmjG>eT-l zoxp8LBlA#O{S!Z#hYE!Jv5?myEYI>ZQL}t}UP{iAr8p)a3}SgCfq}GKSZ4)B+c=uD z6Cfd-_d!zsD2Jp|lS8GkT&#D~v-gQIuag8)U%KylcI-5gKJ3Q^4D3AZA7^k(D|;K4 z*b9VCN%SaFO*&a3XC4SnlO{R=Lhd5ozs7mE8BThRwz0WRc#bDNqW^@Kc*N)V9+&yO zOs7Qvo{zIyz+dL`9cbX8PnoI~^JIr#820HHhw&pg7rovTp}3}O{Df|Gv^%k55CT_8qX5iD;nKb#zs6mjs2p`DaJmTheje!~ zoTa6DF5sDU5}r@{a-EC4El;gZC64nNm#x-`J})HN$JC7m38=krwH&r_RpUDIbiB^w zJgz&X9zSg3f~7CwIO|5bI^(j5gPT z&%zmFl-J|J8FMf+;Zm{&-1~z(Uvm`}^d@F0kIqiZdhz8>N#9{_ZssMusiA~-*r6|L zO8Ve$$;xZfiw1qWo^AF><;~jf+#isJ(`5iCtXq2^G8fts=GTotX)wV7&a1e_Ayv-h=ptdhxSO~`_q^=f9m|d5uX63Er~5`EGyPcZ z7Hn?+%U;L5A?B|o)79F zkjN5?HnVa?a5=DpFso1Z$5=2YIhO`_m>|jOd}C&+Z+3-Gc|Rhh4{5cWr+Qa|zs=X{ zak!!K(t9F6j%yuu3OtQR+Qwec8RY#Wq^Es8A&d?SwomO+K#4bV#Y7k`>u1GIwZA}pW^g$J z5&0|)aQjHIMZP6HW5xKnT&;LNSmFH-CnKF>Xyt(W;-Jk+b8e-%^i=;Gr{Kz zIO-`7+QJEb18&zgVfB788#meLc=Mg*g-DE6TNHWFe+#P#S-SPB0YqegL*JaEc;+R) z1TlFgNgJ9@X%d`u)TB56MoBLvZqmzG+XClNk;_}MLY=n4)3Du+=kXNvQ1a6`s_2KE zvv&Pi_%KNQvuYche}M1y1(DC!j`#Qaaz`hJuXM~$2`;8r(CaLS>Q8%BcHOP$?4|+l zn9r_s%oA5S=D7sV<)Iu!Pa=m&U~*9o8Q$kxO7HWv6sH`x-N?BE)=eI#`og`OQ1A$2e4><5Y}~!|F2hxVr2-t}Zi=>khZa4~rw(<8s^_<-m2bOL}D;U?4c0>UFLxGGEU!O%@8zfZ{bNO>YmGZtNEGf?8N7p+(0Nebe5E$s>^ z(Bnl-!=8NqhwZ}aOO24X7tn!=3Bew}}*S}pLZP0h<-wvcT=sWbE=0UmqX}*=ib$GSzyrB;rW^aIx z`#-JxRoc)GX**E&8>Q z0bIbXnUwT8yCu0YKBmqRZpAF&rk)bsy{~jiDh&DRdjNb`Mmhx^w+ycH1n<{Mxb-9Y zZiceKyg}a4$fqBWFNa%(G#|rL6+CZ|g^43K#fbDFyMle}#f zaeK(uFK~gvjkejK6n^H~GbT(Y6<4HSdB|@@k8$hkFH}~B%T#4?Ho^mh>JbrFnNG%- zj^-!q2vaY#2#oa~9{!wMUFuD6bdKg{K&v}j{P8I+e)tp@|2vhpG0*e@san9dl}_fJ zfm-KxBEB7dWBJ2=3nuu60^k00OjC85V$%DOR;~h$%JxO3@Pj{^^%1y{K7$`I%oW8x z(l$UsnZ06OR@9I9H>Q43-Za}EC@*+;Z1LO8(uUK(}fab{E&G>v7*#Z zL6u|1UFeDZC%I7v3f7Abfn0og6AWe-;aI8gkuq*?oU7WcrZaq4=C!7md2X8jTDr74 zZRczFJbzhqsHqp;ed2@Kk_w3KeSvGD+@mZ7i|r@(EC)Poc2Tznkoa}A$%mc6y#G!s zq8z^Lh#Y>Z15SN_?O$k~0&xc@+7q?{xAk)@IB0+m5Yp>OIUEfZx5ueOIh@{d;cq_z zj(Uo$^gtrUYiw&V;t}`|!af`B6$SA2K>WC;dh5014}Lj_vPV7w#6yins&J>zP-2(z zT%7cu+RAjtRQn%PzBI`c_ol1-Ntcp#N_{m$tv(eVEJx}YY^mMZ^5yVR6nvVZS=%Kj{F)J5mIIE#A_K?Zw(f4e1X23_Q1!2d11Kwq`>r;zd97ry1N#fc#cF z8OG?tK5yWc(m}5Q-a78I;%%R!NS{n!<<0R{N~@1BV6Y{r{sTDfgM0l1e3Dr7!@>r< zwh2*()o&B8o94~@X=oCwY3HBtRDfpsbH)2!X?f42>yQQOU;3$N zHKAT2IJA1Nw-$WZtY!WtPb6&$ZuXseWU4L7MQ zuSs8)N9FN!UHJ0;w53xxP2RKo6t03mAMw5{jZ!dU9*?+a*TFOA>)<&D!t=fGf^#bz z99!Yw$rK^c}FEWz0!pr^nc9p0-rSdpmWQqD?Ke>7#;(G$w zy&6J@Z-m()U3RagL<1i<>hd}D{?wiVUZ=QWTHTHJc~VF(f~83_*HZ)Ub8RX?mcOJ= zlk|3cnyi<2&DkgCjEBC12sV&#Jq9?hb?Qw+L#{lX;@@QlTdls*j1-x1eo~LRR5S0F zYKzJ%c-jJ@t9P6a?*~b(5VVpJ91cX(xJ}$93#@>-T(5f0ahOCkMPJ?n=;QTZaD7i}1nR)BUED4so3+I9@G6;`R`W61ltvPZ{R)cA8l0W7vGl zN$B}(!g+h=)%6X14fjR^>@fSsAB0|x2&@lkJWUK&m&@}g-u$$CeO#_SCewHan)265 zH3t>}@q=GbKFf*sEo7x{aQA2A{to$c1JXG@Ip@URp%lg^d-sG7@k_qv*SWu;gJSc? zPd+Z>;2Rgi(#I{HrtvJoWnJBb+q#-CmOu0mlVW`>>HNHfHgQQq^FSOwj^{Ai@OIBL z!%4X~z2WUFM+;q?cj=@hOj#B;_t+t7CDHl#mzM|vWqvy8v~U#~=T7mI_|~3rC%SSH z+fK~(7pAa2mMJsFm#j)6mP^~}VH`9&a}oJ#e6EPk7x9H6PU-i+Kz|vZHaPKXgA?C2 zI1Wy+fDQf~aBLK|(qp5o70&!q#z}snZ-F!a7C7^daM-=7G&17)@oqBZQ0@wiM88Lc-SF*heyAx!p=<1gBY?s2E1;|I7Nx)^m1Rs<&OL{eV~wrTk=sl z+JbaG!ytzVV0tJ~7&oDxjh3t>CB_kYHz6bwjqv%P2DDQT z??Wg1H8qz%5->O7C-3k_TFD1`R7ZRi!04sHBn<3@r$ate_Dzo9_Y@K?x21Hy{_bSE zrU|4X41NKh^2sqGIJbwQ)%N#{E0s&k;(g-~TPK3i9FZ|j*dzU{pWHG0Ooyqs3=+BysL z!@aSJzyyak9f#!5dx_t=K7Q^7>F3Jy|8Jc)>{?&qJw3Viw1m%q(=OZ6Xn*nC5)~dl z=^wZ`|Jj`%P}7%h28nFkUKFlt|A^*#yKJxR2?ncRenpTOP`wuTGb3D33?y29jF-Fy z&e$vefGCm*|9~&J`@B-v(kw{j(#c?g?-8P$?TrsD#GgY~vhW3*onz!| z9L_>Myx$;+!iEUa(fh;7EbXx=92Uk}A^t>%c=EAO2?<{8XZpQ((NA%nL)3zF1sp5V z{G3ODmx&g<0#YR8+i@?E;4Cu)O$DWKwy{6%+TnH{@VcI7yUWt)K6y&W^&3fOJV9x8 zw(&9lL0aOJ{0$>;qt{yqrW~HH#jIQ|r|@;MdYsLXA$~AjBRjRMd&sY@n5m(t-tB&) z137=C#J7BW6kpi1WT@9xyf2B{@mn`Y5AU)T#M9H^@bqC!m!K1`9J=r(K_}kR)Bb@x zRvT5Yc>}zafZLO%&x;@&y79sx;^7~)>Xmk?d}Gy<-$TJnobA7Q1?sz3VZxeF(iIS& zID<>=i2N5#4D6WqYa)gwb!=B9kl_(%UJaq2MN}ae$rZ$=entE#HZxa2O`br@b4-?} z1hPCYzk@}p%j`v`-uXLNYF(*bns%n?2+_$;O}PzEA9GeT+mE$B)HL5k7dcf91$sM9 zauJ!NS9zi*i`!M_l$p|%=Tbx>_hY{Nz6Ey_t`EO(YWEA(uUlO7EaIgDZg_QWB+8g+y`WyJd3>tW@F4ulb{<*m{(ii5@ zz!zrHz!&Dyz!zrIz!&BNJkQhlV4>(UoBso!pE-5v!;$A(Ai?wcGCDrkx}ORmwGbYkeomCR@{RoW8rcZa14Zir+ZYGPWe=-fXn6~ z^GWoL&Bj)|?A=9vVVa)hkIW+q+(>Th2T4ZmBNll3`4vvY>5lDACj87Smc@8gmcJC4 z6h(aL+mTRmy^q)44U@yC9q_bb%joT_63>rm{UU<@+1yWce@1S1svyW+`a8_tm;&vT zU%#~P`X&9yV+Ua=p!6-@%dvKM7J)XnO(NyxW znk(Vv8)?AX<-zHgR{8PHhad_*I4#po-y#28hy3`8NIU-y`SD?kR{Hr4`SBh}JAH@z zcxI-ZzC(UIv(!%CAwRx7)k+`yL|MJ#-IR9v4*BtrP&<8x{J5^uPTwIvJ}_bQ@WYY+ z6_<1fVt$MO(srcZ$&zHCOYgx+I{Qvm;%nc@5 zpwk2&y~foREfD6*`S=JI3UBa!gI2>cG!X!V$H7}35-B7-E zPbmo`bOuiu7jSD9TJHS*5|vr#(}X|QLu0~fXiZnlF&(S(prOz09HZsqIUWHs|CJ1d z_KXSLZ;{TN^~Q%)!n~!O80WL`3=KY(SM$3_d^Xzp46s3dm@-OIYK=I)D0z@vFTYpq z(|W02(NlVQo7a=D#}b~sSN-xklUsP#(>};j`a$$_YtV1*Khe*iHQ^oa9NGhD4L&cw zGs&N|d-V>1B0iuP9Rgn%lMD?UlqX{LAl5ng-hS z2RFa_gWB|qcQXAxbQ}KvPwz}({P~ai4xsG2>V2Lt-#|Wc@|`CLw2q+frZ(yH967(A zoUmBeGekZz8s{-O{TH+&;D6-vd|G>n5lvd~+aAbcGbIAw15e-mbZ$hS#^IO-el2~a zPjk{VzVC5ZR&XBI6}89b3;aS6KP)Rcr`Hv>$L9-4xhvfvy4ZJ?AD&;_2 zs=nS7zPhdjT$dv@VNUcLIFV#;+FLmieM6q+vPR@+F=4lBc}K40JwfCH2jicgclCK) z5|5B*dzF5r#L_-P_@49faAUBGyO^Qhk^8xu1xL1vk{S04(072FEy16m_Yt>irGe3>f7FCSX!Rr{$C6Nk?_*|lZ zr_Jld?muY~i~JHu(ep>Y=p^wQoN7{9*+|3V9r&SN#eoX<+{ zEBm_`bndcIGCzPxI;J1=)<%ck58vqs)R^atdZPF7XsX*x=4@s@EqHUjGoFl-<>^S@ zg3r>Y@sl=i{``EukL+D9WYS%2sxP}SdGx5 zDvOWOrzh5OczRkbho__WIh^vk(fh}b)&1>DGux5f9!T6A#uiWW3BlXk(eUQlwzzHa zdR!TLTp3zCY~`{-tQ>sW#YZEuH!4#an9cqKl03ZBZw~{I`qz|-`S84mALih7hF~#( z8c5|pdv8I}K925_>->Q4MaC@3^u7)-T@nG0FOo`CAkJSTeqaQZl(dZ3<^EqA-^_#mc0+P%a->;XvFgN*7kl#B5?m* zWBo?`SMGC>en94piV1o^KUMW`p?~nZ1+Mfip#lcKEq^a@b|c;mpJyZX}ETL+ShJ=H(KbLaLLcU=f=l=IS-*X_%fY% zt~bB(zWQfwn?w{VjYiuYIFsU5~sx>>o>q{a4O(7=M%jpdYh}2 za62p7fOqisNkEaWjS&T(G|9;6(;!;FJLFG;bV1)Czn|4D<>`<=Ek2n)`A@}>FkL*q zOg!j^bxi)Qr=rB)syH@XNhEOI;%Fk7AMcCojH5RLJh@+6+6{2j9>XyoZcn1}wcsVG zyU?UBc~&mv$BMyvq&J9~I}{%6OBg;x8a1fT1G&l`MkFuv4F^v0aA7Cp_iLr^ke?3mw9_hQ+%%Ad=Kwh(-c8>|M}Pn^w_}jTWoUNNN8l-(L+lz zdO3poy9~98H&7i7{^;ive|BpNS4%D5bl;jFm@m+GM9S}gI3vZ!QH*g#xO0_Fge?)F6R#pNzPRQ>+%f;F$M{^rx_!e( zCBl3db0o}J=hs+HL@xrTxac^W zftVH2Ih+NJ@eVo`IMAtvg<*iR;4$98Pwn32kOH`TS}t|HS&b*YIYR6Ry$$z0ZeA!S z*_XlHtP+=-Q0fox{oy7Ua9-c@o9<#cR&R2^l}^{BUV-=| zxL9&dPu`t2dV;sn6aVE+l%YSnN(C_f=SKJpS)DlL@WjdBt9a!skUJlSCvu1Li6DF| z!_pWZhie*xpPcMYXS+M5e&=&`GP^W#Xwna~t@R=LqFRyi>A1@C_T%+d4~ogs6J<9I z+O>RRIdy27PXn&)zJz=KQSgzD&-pjni}KO4fhMxkoBexxQF?=y?S)47kcYP~hf9JC zZoE=6Mm=czrbW`O||1+w~;p5B)BUM)=6VFo$P{*L}1w4UzuB`FzKl<#gfAcw6vhe3k{7C);O{ zkI`9HH=?sFl@8@?7o96M%9XV$m8ui3(sbfgiZ;9zC>H#Bbg|&qql*RS`cLJ~ibe%T zJK=YPvQysqxX{Gs;|$}8G0*Mj6nIPe44? z!EpHltFlXK;AH^M`?HWfh@y6-hoaQ?aahal=dBbz*8!jJfG>2w59=7*;NJnC?|?6K zz;QB%71!Y30f)!3l^&kJRyeK^w!-1*ZH2>w+6sqfvK21Y3_mbqsUOMfNAMx_R4(0zZDMtt#CSTK^bVjsYailw49pJaXoUU)=IZ*ox_dkI8U*QZhliRG{Wo2 zw`@wfVZK_}8_*$NC**qX7SWCTMs&u|=4W9V$Q2BKk9^0XM39p3WBxop?5~+l94_<2 z48im|Ka7Z6k8(2hM)kkY9CusmAGnF;eBvL-yPsycC*XH%|4fOVCVU~{HfoIL(_<_ADPYaaY z+^<-YXlLy6&|FZ4=(Ys=trf6VeAc65dspr9X!!&hlYV+ig;OSpaR1wCI+U#Y9o@K?p6UO4y0#NAA5C zX17f~^f-MY1D*13uO8q{kL?7u&&WGvvOO8M^^jhGjOQ)544vaoY;M;l2fgh;lBMSb zXh3rN4E$vaH6zHf8al8>&p!nmE6PuD{?z#DgJA8qOR z9i~>fH2;0$(4L;(X}V5&tfxB4E&Q<_y8%AwP5a%#JiR|wn=~Iy2{#{42{#{63D4ec z;1WuMDe1B|95TAl=xK{XqQ&TUoqkKMRy)Veeo(Jk8(}A%UcJ5{9m$HT*w>*`3VmZ- z3A^(x`(Lfc{4EyCuDid_vjZIuj`U22x>rVbzT)@_ zaqf^(Tx1FH0$-j_SQ_-{z^=`hRU&%F77qH!dXzd$!A)@Tt4GQNC-Z7zpr4w)V-_(! z$>jRNJhuheDvxER>1HuqF}9GL%~Dc*lAKM9$r&&#CfOyO4>xt0?6BiY^~U9Z$(J6e zkCaH8j`eZWBemhJuj|5FpVz=gJ$QYh-2@S?v(zAVkjK^=iK!D3#6>AUWh!&?$ON#BvMp zf|J_Uw7)&9H8pVII=F;)(0jcU z^ses$F55LtdECET&}-2e^6Tl^27K4fF&BJrabEOU!fpSk0q>v}ftvZ+dF7l>K5N$Y z5yuTttF)^K_wfYtsnr@T+e;(7o*3*!=EEh5=Bo~KYRcE4Zmax8pxYDL#dSzzkst@OwBpg&B#G2vVIYn@8^?7bZ0;1x;zti7AlKyv=nU&;4~4X@Ab za>2QuF7WyM%imeCCbShFp{(0XdNbdfG!D_ zyLexikR?3M9YjukufXT^C+m81y|=+@4#A&jd4|}t1%E2PRAk(Hity-3j_{@4)Q4o0 zYtkD|X=!01;I{fzc(iTahVitEB#8rg*q5tosf0kikMMEXa#~0A zwnS^6WeW74@`a7@Va?Ctb47gK;#c|~{_wyI8S`y4TD%)A%XZ{1_vYxx@o1R(4wPem zHtB8f8SH={eGFHx?yQdnEGfwZf=>Qhh9^7d5J5<|2x2eobjnKU*iU(Sv{|PCb9w1>(nE$fU#3$)k91yzHp%)M zba_EB`M7+lKb;AJ`nTv0Qwwkc^e1|Vs>Fyy$WQlAyYO+`cDAt7Y}|H4W88L(`h_GommCavz&y@h6oqoqc)e0jws;nr`0Mwk3WSZnWda`GOCXmQ z_I$EGna&b&(=svq8BCzt(U2SI38!D=AYV*Kp71O^8z|R+r;}1)D~WtsDP@6ou3GQ9 zJbT}x=O82fsNCzj+o$nC7yhWta5fnY8gQ92w9xkk1Dc%^ACxDuIyKrBdb-ce2)=z! zF#2IVF&YQ(wqE_`Oa6=pzi{uL6ER$XE3=7_GK%wWL5V)}(h#SQLSn8$?-%=FiH!$)Eg?6aww*_VNrVmTfq7O!8`Y>YFOV@Xrg^1I&e2)Lo}t6qgb!wfof0`@bLQgXYA;xac4DbsFN|^PdGnF+F0BPE z8Q?rm+Q25DJ>bd?3%q{Hj9c(9VHV*rep{qTx4O}vPDhiB4f0u>V&c#^e{X^WJkJvK zbg!Y2{?sEY7vdhf+&MJ@!4vz|wJK=MlcBSSKJ&+dMoy&$YGV? zv;8c`l3%Zn<#juj`11Re=SOyzxG;bT774Tr#42H`q=C-o zx^0w!jw@)2X=lcd=OeB8ck#_qaQ~?DJvopdydqronkNwreVp!HHqWA9%)7}9TJUE^ zIH)HM&?qm)4>o~}z48x;BB}5X_=3Biw-UBe�mnI6oX*?w=INkS^aRNO*g9*!{19 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
F$ND@P^;H7jcHSUgy1axV|~O za--MPHNJPYYtd!?<1LHHT;C*}tyxZS(D4Cw%?w zo>5)m_65EZbcP?sR$bv)cl%BlZ=N5#r#bZ06@F!r=Tq1Cu>0*qXSx3acA_)940&DU zlNZ~G&hsk|*@>?4%@6yY)Cu3P#QoJJe*1CvSJ(NAC){5hp7a^7y1zQbue|BAtZRJJ z+wQ4O_z&;dLu_vP$R2c>|BfzQ<==i{54yzZ&;5F#Go1R`wa0lr_&=V3^IaErA*E|P z^S{lZO((qPH-27c__*#Z{_HmQm(SRt#b497ULMn<#lL^7`IkGk_;-*!pZs8|B@EXU zeydMQ7_IBP==&`pugko0w-$c}oO9;$_iyp%!1?~+>oP52sxI-(N410*I^lI;$mId0tD{po`oxp~asqXAgWiw#DOo z;RP+B`vm8}>5i7rQ)hT9T6DP3@rzqR-*}v_!~k97$B@w#{sKed{KS^<#3Vb3$NBPK zw1g3Ho~szGYuq}yC5+W+z7pf(44?hWmM~Elcr7N!d4A~%`-#oRT-g$)>l}}o(h_Fs zJP-S|UB%;k@>Sk19_Lr5w)p=B_p?0YH+G`4{46%^ z)ma`m*RvFx8*lTB>NLNBvaa#=^IAfuPVpV6=rRwO?>W{P?sdC8>olhq*mFG2<-~qE zyf2Tr(|&ZG*DbOiUFYZS^Ze*4PhRZa=pz5{QO}Rg@^3L&m-y=?o&g;mZwXDE_M+2# z>{G5w=XlFf*A-`;Z3*B1i|dLrd|Aag=_2pH%ysE3e~n6@j86!=Pf=fu93h0h37=4`4SA#MQ;Dfb?FRW|F!Q5UE+(k zy6f=%F*b>(QFkvoM@h>VoRLoN3p@{RQSTPy{6*@o}YJLbi(O#+%FwH6)U`Ekzd9XKU?Kq=Xy<@ z;*&ALe2)Jgx;tLtW!T_&l@B_vHH?kt!*`+QB+mdhjW=_N_u^|X-Asu;$3QdT{MK+T zhFov!d6_uGk|&G2k&h_A!l9B$fsbc&hv7#=qevn_H64c--UI4w#-eB*tt&gHQ3}FO8hxyx|Z;$ z&nbpEUf@^I?q1aR*vDLp<2im5o6J{u&n4d1`DgfMEH;zyc8_}<=aAydF;*9OJx1s{ zk9xxOn$Pq1p0rQrmf~kIG`>D>*XiEH*WpoErSp6j*2e4N&oMfl|5MHr^BvFe&6w(V z!t2q~dDeNyr`?PAntT98n9uM@Xo)||m!PjM@T6z_tob5OTk3tiW{I~xYq#-zpY!X< zUwoF$M;}?SXY*Np9!qtV_g&_DHSUUUz)bTc{un*IPMuF!?i%Ac@O@a}c$s&6-glQ> zrT9V&^*ROqJJvZ~<$YJUcAeo{vBLW%e8^wDuh-1-t61v!ukkNl@as;zE^hvtJ)24M zW9aUED}3ropDCT^FR;Q)_4b-^b+27Zj<;Z-*9`x353$YrmU;ARUeobBcYocz@Utmi zg0W^QJig00`MeakI}F!F{sg0SIInk@ zh_UfFZ~sc~FkYwlvhIESIoyu(Ee(A_PA7cPu6@FIUEtEdK4ES=&SMYh6IR9J-21RT zp-ZRvany8$H)HM<-gii!FbJD|<=l7@>W&xr5sY`d!UK-LmF^MGAKE7@bUfkRj_MOe zO!4~s6#B+_{tiie{iFMYA7M*;ef}-B#@FY+U}Bu-X+P={=6L-QFT*;=tGsvCxq1Bz z-;7~8;q8v;6FR+4iZ4gYue~O(N80f^k2b+8Y6WZOE67M|T&dsFwCd~A{CEkpT`EY)p(1?{f%^7U!1~^{i<=AMx%1sxzE;DJ~qr-7C8Gar$UFGvGbpOm0c>9aogLrOy zH|9IHGLOF4XUBY=yHD&B2FCa0C1^8W;qjMvZsR`rB@BtL&+nq{d}{m|+8nR*@Jroy zo#T}l9_RVat3BIZzs#4mS?BoRJKSrX<-gt8Clqv**WA;`|GwON@jZ*& zM_uMa?svc9Jim-;oZ;dFu1lBrU)Z4QJbAItnlAFl2R(Z_&pSQr{^}GjL-(t^FW>Zt zJ?n%IdDLf6XL%L+>KadY%rl@1{BI1@VM(8G+vE1H6aM~_eZo+k=8rH;*ZJ;F-z~b# z1DV<$S{9oN~3PVu7~T$`@&2_N`=(>ea(hrWw+mdAb6CoIwh-tA+1(;2?* zU%pRtiQoOi^QPk28GO_u9fto#kSWwy;E(cUQ6w}ofP&zrKGwZjWb|*ZX?EuIqih=NxoOF7rN{n@7&_n~jZOrCj5`H#LTEp?Uc4Esddn z%)D=FV@Sza{tk_DXlo36BZ=dDKZeQ`zNo#?pO>Id9+WhO5ptRjK}OE;g%}-cI2ow_ zSi^^4T&&?bakDk2QQDrpQG;eXu>13;aT7W0)>id95uPLs3rg$3q*# zEV<5mY~2{TFwJ2i%3a)vM3*&5{{pR|uP z%6TsB-x$WoWjv7VnqNv?AGu*T3MXLt_Ea+x@R-|`(TWm<)4mi3}a)>an^c#V;C=2 zc<>4KTu$>xC)#tl&O=VM=W(1j$a_!agy)}OZ{=$Ax%O5r@vw^B)34z|%=9OvJoEa&*j`}HOldEvu)ldC-WF}=wJ-tTeGSI+XkP?Kx? zk0(4|xx_Wp;>jiFOc_)-ju zo)8#y`yUcqO>p6>Aa*lubo@W-v`7!j!75?&lpWAZypfPM*v!8Op<3F^Y za-O&Qs4*;-GyKBGjbWKwMWvxjnyAHz7g!V`Y5hjN~W{Ads5 zG_U%}J0gdleSU7z6sE{^zHLBLm?4+BvT0M8DOY*oW=)|>&hz-qn?iTY+}zj{dgX+- zZfXj1*F{N&f5n$&4-<3?Q)JE z!~(g(oo6?NMX`ooI?vkWDre7c3bk0z*JFiT;-68MQ&XG5`WH2YHFCn+AYA6`@pSZ; zi@f2*O(7*G+;NFLmD7AC61l*iPO~R+os;QJAsuV@M~swHS2Tq`W0aid7cfSya?6!X z{%j-lJnXNYy`14eGwfj;=N+%HhjE-gzpg1vmg_ulrv5Ki!^dLWbo29VNXcdX5F`Gg zo(Epv_i{6jr@Vm)7k za;)d45UxBB;solbGth72f^^XH-t}tr%gAC0_f+CjYO%e)9hzWxT*2 zpQ#XR^!OVasB~GTvy3Big6zP0U0^mW*k%06!-@$iS@IMBOmACA5e?+w;RV$y%qRF z^r)%x*lzW%&GFNy%2oalwOGT4-{D!yIerF>a+P8c%z~`SeVSyze|;3*0Nq>pp6KT$|!kFweDlei=jMDsS_cp46xLuNY^% z$X{TV`Rjbp<4s|-oaK8^GiRCCpYQCcPw^>Op(f8SBdwn*Z}WuD-Z(%16}dP+--^0i z;xeYVHu_nl(P>!yn(VWrOJgJ{}EpPFZY&^~DR_vji;uA4W&U4e#?kgw!9wy3l z-tHM^Ue0hgrpRUf{j>I2&hd+wE?0T*0_Q|d^GwW=OWf}{&rweCWc0`d-r#v_lM}uI z^W-Am^P+PiSGe;f=TJ^_+bf=H%zO%Ja)CE~)!xbp-}{=qkSp9)^))xvbL9?Hp^4IoC&hy{Du~%}58~^9CS5EkDbjxMl{ac@Va)w{RT)E13{@{IyHN0h? zGa#q=QB>s$AMm5k0XfU>peEP&lh7Pi$aQ|Ve{)zJ$N81@nnVA;%6#DZ&3>lYwfr0! zWID&d*_J9OvE*nnPNy@X!sL!w5Oew<9B$dGJQfVRRhl+mVgq{N?7&VVoQq zoBbK)&0&&U=M$To!(=(npJHkp=YJ*5VVYdy=>wa?EV;-BQG@6y*xgJJKW+d$r-*7Gvp$_ikWha=ik~Kx?(+VGTWZW2`}jO&*C_bywk7c zEH6S;uJOHd?Sow5;~(;Da*ZE++Pf!L_~~bzE4j);7I+`!G@tdHGbR`KfET=va+Xh8Xg}pVpYo#pj5Yk) zOU|BLz_eSkLDpT&moBmYah&&g$NtM%{v3&1=d0hf|8j{pUTXj4gipf=xxjZL zBbWI%%j}DsvgfQIPZeBBsk# z-sB_uA8YvhkL|x)-o{Iy{B@8_g`&)ihAbH&|j`| z{u`ffa)Dd^=krZY^S<9Uht62fH(`QY<{vOgPOY&|ecnwu!xa?dDqr-Y{^cUy|C9dZ z3jg_M{mXe?g_0aXOSl0&a*21_xW(T=YEJIiq$SLk%Y4k{En$J2=Tll+LRBvCErVOa zvRK2XY}pc4#Bsi3o0hOTj`PaxTl~zTd!<{#c009%206o}om)bqT;|z(wuH`@dHCKf z{=QQ+{KY;kVWb>JwS=QETF!HQbW6y_@dH}I<-cnQTK}I zC%1&Da-Od|za>nM^*rW+mM~M!@!RN%_59llTSB*-<+egg=#|qvZCXp1D;N3BzuF(U z%%iTdC$XN3)t0bCF7fNHTl=-<|FhmW&Y5pp!X!D%H(|0|=D};MT~70(m=^1K)9+fs3_0Of zFjKDar{CKLxz0!ZU?1c>FGX)0=cD@ULmcO&m>->!IL;qnQ5@%Ee)2rxIDdd; zahwnRxg{)@bNm!m%2nPzw1(AkhHpimT;{=RwT6DzSqtBe2D!|G*KQ31;yB-q);J!= z)@co$a>CbQm|WtG`?ZGQahzvjWE|%K>$Zkbah#`Pj9lb37%PWgw1zy!%LT4uLLC2P zYd9N|;yACt97RP$tY@^n&Oip+}sx>T+nGfB#HLR3# z{GS2#Uk;nLh9&4X)7jvao4G~~o13r6-o|l0vb8mgkaN6Fn|+g0d?d!kabCCGzQu9= zF0pTN7}y#f#$>s|LkHO_In6r^*0-GDF3gb2+}LTa?$}%3a+&igPi9R$F_!S z%=~|U^t|N)?=aqe${D^6dAYsVCYSj~tdLU^ zTEiiz%Q-&qc>5gdc>%)T-HQjFV4vkQ*N~Fy{GSu;vm7S2hD(shMP81fv4;0L$vY-z z`OuT?dCa`#4Cn11uKho2Ki8hf6~5(S=SME_qgPmC9Oq}QarWdYUw)(gk&FD{P3E8F zUcC3so{^m8M{copxxz`wJ9UG-;?xbCko2t>J@Loj1A0s}_4V;xVS}a4tDNF%KeT?i#4RhF z89Cv_|MgDEHQx0n_12i-f2`LQmdGXEV)M4pC#U)S!EK>`tmpqrw}s`#3%v1f+Cp7U z_%Mu>b6ms#_0g-4@hrlgZQ(eKlk@xr2B@#`9($?r-z74iAg@09w?|p89DNvO$~is}-E#EBD9h0^ zuuzU(f@N~_d#KC*-*RxTI{$fmo1e|n8^4CJu?PMdW8`qObB+mehDZF#Ih3<}2J&)& zA40cW;cJf3hg{+ZF)fbsQ90*F&hcr-I)`$e*E-I+oO;w zFu{H0JYR^MT;TPNx6g9ImteJPi~I!A#w+|DhRQWgo#1_uqlX|Xr}=s$a*1EX2)W9i zAS2g#w-cRXIm4qS`h1YHycCPvx5gWt)=oHUaF7UmWCzp8%3UZD2nB;8B8D4-Xa+NJBZ=4YDh!pweUQ_90%pm1z6%Ap z%%5UjtmnaJ+ml$&(~*;l{0_#+HC}_F9M181gR-3PA($v<`L8I+MSd9-xytKL@hs#N z5640|!xK=I^W1~HT;^A>M6U8L&UFrMaV?KUmz?9LFhGu;b)GfL(GMXL>(6fsA7G7n zYP`Wz_cb0p1xw`UYq3VIaB`9NSB~BbljIDqTkx#Slj6z98ZYo2m>}ma_8h1AntQ97 z%i6-uXq0n&6Nbqp{^WA|E7$p!D}1)ZalZXZYnRJ>*5B-rT)o=Y8qA9I{M>bVlWSZ@ zj~r%tCf9pk=efHrY>mEH&&Qyj@e()O13AU#p)41;5A))+y}qYHQBHVAl;jML$1FL= zQ_&+A_+c!OEBrrH<#2CXcpVkF#$Vj$tjcxX?jif&xn%f0o@@&jpjR$%=Tn}woaUvNE7y1xX2$x8^`c8oct>>0 z89oG)>!Sl|!oZ@5A8SA6gd}-9=X7GqbOJSOO)g~w^sEeCp;Df zImg#yqFmyikdwpfzHh;3In9gS@a*I&4|~(Ii{pGYM#u%e3mLi0zgX-n$tgYxOXMQ= zp(=;BJQK{5GdvkJxxo2`S96VA<842(MmfzV zeC%2|&vTYL|2=x+D^{96Udso4?ekO4@;(3aOyx2+d=K?0PW3qt#-lg=$(fN8{@dE^ zVZ|KtaPrIcP?w{ZV0yP6`nQLJ5#%f{#uPdAtM+g{`pX4=7$w(M_&XHk;(G0&2eafd ze~n@4!}{(1TbX(}!{?%Whk1Bm%<8M0YH)qL7iTd~P4raEiudLD=rLa54L2|@r}$DN zYKr^}igBI|+rxfnl=FNS3UZl0N6EEy-e#lrFx+^WPr=Ao&-b7wu7y9vh*-~Cq-5i1 zJ^^Xtd7cwdJ8 zKDEPmoS&N#Ym^f%p)p>|>kKp=ujL_w%rB?;3)JK~&m7$D_xtSW{~fo7MHp(HD)+^# zCUmxk12IuemM=z1F7gA&%N70}g;+nNJ&eM1IU9|XGgjosQ0`XG|3>8wJ#eyxYm7%9 zig|LDFTz4K1%3)yxyrxT(%RJ&`L3buVT@enueP#Ba-9cmZEw|Q`C^Qg%e>Jx?P1OB z_Jp^_LiK5$j!K-9pT|7?SNRvi?B|{8c_b>vGyF%?&6DTpNP1k$*Pv4_@og9?SGZ|g zXI@TtFN~Bk{3M3Q8XmfxeUQ^U9%JPkKZY@}hF4;|T<1S*FW;+%AHuNv)bJMR_At$O zn%}}C<2BxIhxRbRc$UAxWaD8+5s4WgO=|EHGyn)$YGFIWuuieiBu=!k6r;AGydK`{`3o_#QOgZGU*v{jDXA^90o8 zJU@sva)s9$-5&CCijTw;ImdUSAeZ@jOqas}?co3v?)`Fy0*6!!0o18&B~bNXr>M33WAjz5zA4#4jUJQ|AlLF{hpj zd=FNrDf3c{P*daerufB=b0Be1LiOB5tqo; znB!M2b#CP`Xs5$3G&e=tR^bK!n9u8qDKIl080bM+*rdA~>6L$93Wf%BX( z*QWV~$J#?Rt}(jexu}W$52nZYdDo}CtMNSWd01wRMP7&na+UXc#(N@X`D%2>8h#5I z^VE3Y0_$~t(mWNta)Gyd&U#}%eCYG$(NC7gzvUUoIsOO6sVVVdzC>QXhaXMXGh z=R~gXst?u4;Umu-6V+$nFqnSb>k?}D7-Z86%l zX`YRoJt_0Cb-l@Xei+NGJ^WYySS06ot5wd`eXiw`&}%%;&wTCt#C~|!)xO@V$?zuM zw1?I1oA3jeB3Jm;HEQB|dF>y}DW~|`wK_s$T<_W)ekQsj43qO*LDu}ysdd%J(IbD| z5yq&=@Yb8i`bqP-<#L|?fi5*A{?q0ipNWiK(;^GbLG7Ry%=$#TdED2k&hEOyxXZc7!#`MV>RxTI4d9kF*al^Mm89MXvA<=##_I-a&LeXih#KtBn`2#$nfow94kz0)tdz5S3;OA v{698T#7ub|hn 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 Date: Tue, 29 Dec 2020 00:27:57 +0100 Subject: [PATCH 50/50] Improved serialization --- Editor/src/Serialization/Attributes.bf | 16 ++++ .../src/Serialization/SerializationError.bf | 7 +- Editor/src/Serialization/Serializer.bf | 88 +++++++++++-------- 3 files changed, 71 insertions(+), 40 deletions(-) create mode 100644 Editor/src/Serialization/Attributes.bf diff --git a/Editor/src/Serialization/Attributes.bf b/Editor/src/Serialization/Attributes.bf new file mode 100644 index 0000000..99aab82 --- /dev/null +++ b/Editor/src/Serialization/Attributes.bf @@ -0,0 +1,16 @@ +using System; + +namespace SteelEditor.Serialization +{ + [AttributeUsage(.Class | .Struct, ReflectUser=.NonStaticFields | .StaticFields | .DefaultConstructor | .DynamicBoxing)] + public struct SerializableAttribute : Attribute + { + + } + + [AttributeUsage(.Property | .Field | .StaticField)] + public struct NoSerializeAttribute : Attribute + { + + } +} diff --git a/Editor/src/Serialization/SerializationError.bf b/Editor/src/Serialization/SerializationError.bf index e31b05f..72c845b 100644 --- a/Editor/src/Serialization/SerializationError.bf +++ b/Editor/src/Serialization/SerializationError.bf @@ -2,9 +2,10 @@ namespace SteelEditor.Serialization { public enum SerializationError { - NotImplemented, - VariantError, Unknown, - FieldValError + FieldValError, + VariantError, + BufferSizeError, + TypeMismatch } } diff --git a/Editor/src/Serialization/Serializer.bf b/Editor/src/Serialization/Serializer.bf index cf864be..9a4b5d1 100644 --- a/Editor/src/Serialization/Serializer.bf +++ b/Editor/src/Serialization/Serializer.bf @@ -9,9 +9,39 @@ namespace SteelEditor.Serialization { public static class Serializer { - public static uint8[] AllocateBuffer(Object data) + public static Result Deserialize(String source, Object object) => Deserialize(scope StringStream(source, .Reference), object); + public static Result DeserializeFile(StringView path, Object object) => Deserialize(scope FileStream()..Open(path, .Read), object); + + public static Result Deserialize(Stream source, Object object) + { + var buffer = new uint8[source.Length]; + for (int i = 0; i < source.Length; i++) + buffer[i] = source.Read(); + return Deserialize(buffer, object); + } + + public static Result Deserialize(Span source, Object object) { - return new uint8[GetOutputSize(data)]; + var unpacker = scope MsgUnpacker(source); + return DeserializeObject(unpacker, object); + } + + private static Result DeserializeObject(MsgUnpacker unpacker, Object object) + { + var mapCount = unpacker.ReadMapHeader().Get(); + if (object.GetType().FieldCount != (int32) mapCount) + return .Err(.TypeMismatch); + + for (var field in object.GetType().GetFields()) + { + if (field.GetType().IsPrimitive) + { + if (unpacker.ReadMapHeader() case .Ok) + return .Err(.TypeMismatch); + } + } + + return .Ok; } public static int GetOutputSize(Object object) @@ -33,18 +63,19 @@ namespace SteelEditor.Serialization if (object is String) { - Log.Trace("Detected String: {}", ((String) object).Length + 1); return ((String) object).Length + 1; } else if (object is StringView) { - Log.Trace("Detected String: {}", ((StringView) object).Length + 1); return ((StringView) object).Length + 1; } var fields = object.GetType().GetFields(); for (var field in fields) { + if (field.GetCustomAttribute() case .Ok) + continue; + var valueResult = field.GetValue(object); if (valueResult case .Err) @@ -52,36 +83,26 @@ namespace SteelEditor.Serialization var valueVariant = valueResult.Get(); - var prevNameSize = size; var name = field.GetName(); size += name.Length + 1; - Log.Trace("Detected field name: {}", size - prevNameSize); if (field.FieldType.IsPrimitive) { - var prevSize = size; size += GetPrimitiveSize(valueVariant); - Log.Trace("Detected primitive: {}", size - prevSize); } else if (field.FieldType.IsStruct) { - var prevSize = size; var fieldObject = valueVariant.GetBoxed().Get(); size += GetOutputSize(fieldObject); delete fieldObject; - Log.Trace("Length increased after struct: {}", size - prevSize); } else { - var prevSize = size; size += GetOutputSize(valueVariant.Get()); - Log.Trace("Length increased after object: {}", size - prevSize); } valueVariant.Dispose(); } - Log.Trace("Detected object: {}", size); - return size; } @@ -172,13 +193,16 @@ namespace SteelEditor.Serialization } } - public static Result Serialize(Object object, Stream output) + public static Result Serialize(Object object, uint8[] output) { - return .Err(.NotImplemented); + if (GetOutputSize(object) > output.Count) + return .Err(.BufferSizeError); + return WriteObject(scope MsgPacker(output), object); } - public static Result Serialize(Object object, uint8[] output) + public static Result Serialize(Object object, out uint8[] output) { + output = new uint8[GetOutputSize(object)]; return WriteObject(scope MsgPacker(output), object); } @@ -193,28 +217,31 @@ namespace SteelEditor.Serialization if (object is String) { - Log.Trace("Write string: {}", (object as String).Length + 1); packer.Write((String) object); return .Ok; } else if (object is StringView) { - Log.Trace("Write string: {}", ((StringView)object).Length + 1); packer.Write((StringView) object); return .Ok; } // User defined class var fields = object.GetType().GetFields(); - var prevSize = GetBufferSize(packer.[Friend]mBuffer); uint32 fieldCount = 0; for (var field in fields) - fieldCount++; + { + if (field.GetCustomAttribute() case .Err) + fieldCount++; + } packer.WriteMapHeader(fieldCount); fields.Reset(); for (var field in fields) { + if (field.GetCustomAttribute() case .Ok) + continue; + var valueResult = field.GetValue(object); if (valueResult case .Err) @@ -222,42 +249,29 @@ namespace SteelEditor.Serialization var valueVariant = valueResult.Get(); - var prevNameSize = GetBufferSize(packer.[Friend]mBuffer); + if (!valueVariant.HasValue) + return .Err(.VariantError); + var name = field.GetName(); packer.Write(name); - var newNameSize = GetBufferSize(packer.[Friend]mBuffer); - Log.Trace("Write field name: {}", newNameSize - prevNameSize); if (field.FieldType.IsPrimitive) { - var _prevSize = GetBufferSize(packer.[Friend]mBuffer); WritePrimitive(packer, valueVariant); - var newSize = GetBufferSize(packer.[Friend]mBuffer); - Log.Trace("Write primitive: {}", newSize - _prevSize); } else if (field.FieldType.IsStruct) { - var _prevSize = GetBufferSize(packer.[Friend]mBuffer); var fieldObject = valueVariant.GetBoxed().Get(); WriteObject(packer, fieldObject); delete fieldObject; - var newSize = GetBufferSize(packer.[Friend]mBuffer); - Log.Trace("Length increased after write struct: {}", newSize - _prevSize); } else { - var _prevSize = GetBufferSize(packer.[Friend]mBuffer); WriteObject(packer, valueVariant.Get()); - var newSize = GetBufferSize(packer.[Friend]mBuffer); - Log.Trace("Length increased after write object: {}", newSize - _prevSize); } valueVariant.Dispose(); } - var newSize = GetBufferSize(packer.[Friend]mBuffer); - var gap = newSize - prevSize; - Log.Trace("Write object: {}", gap); - return .Ok; }