From: Elias Fleckenstein Date: Thu, 6 Aug 2020 16:08:31 +0000 (+0200) Subject: Added task manager and window X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=5af7069ac52b83fc36fea41f729dd1c838701d66;p=dragonblocks3d-lua.git Added task manager and window --- diff --git a/.gitignore b/.gitignore index 1e077ff..82f0c3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -/client/ -/server/ +/data/ diff --git a/init.lua b/init.lua index 2ac0088..5edef9f 100755 --- a/init.lua +++ b/init.lua @@ -1,9 +1,9 @@ #! /usr/bin/env lua -require("lfs") -require("socket") -require("lsqlite3") -require("moongl") -require("moonglfw") +lfs = require("lfs") +socket = require("socket") +lsqlite3 = require("lsqlite3") +gl = require("moongl") +glfw = require("moonglfw") require("util/objectmgr") require("util/split") require("util/indexof") @@ -14,4 +14,6 @@ require("src/init") Dragonblocks:init() -Dragonblocks:start_module(arg[1] or "Menu") +Dragonblocks:start_module(arg[1]) + +Dragonblocks:start_tasks() diff --git a/modules/MainMenu/dependencies.txt b/modules/MainMenu/dependencies.txt new file mode 100644 index 0000000..0055b8e --- /dev/null +++ b/modules/MainMenu/dependencies.txt @@ -0,0 +1 @@ +RenderEngine diff --git a/modules/MainMenu/src/init.lua b/modules/MainMenu/src/init.lua new file mode 100644 index 0000000..503e73e --- /dev/null +++ b/modules/MainMenu/src/init.lua @@ -0,0 +1,6 @@ +RenderEngine:open_window() +RenderEngine:set_window_title("Dragonblocks 3D - Main Menu") + +RenderEngine:add_render_task() + +MainMenu:init() diff --git a/modules/Menu/src/init.lua b/modules/Menu/src/init.lua deleted file mode 100644 index e7a722d..0000000 --- a/modules/Menu/src/init.lua +++ /dev/null @@ -1,4 +0,0 @@ -print("Success!") -Menu:add_proto(Dragonblocks.serializer) -Menu:init() - diff --git a/modules/RenderEngine/src/init.lua b/modules/RenderEngine/src/init.lua new file mode 100644 index 0000000..0da1656 --- /dev/null +++ b/modules/RenderEngine/src/init.lua @@ -0,0 +1,37 @@ +glfw.window_hint("context version major", 3) +glfw.window_hint("context version minor", 3) +glfw.window_hint("opengl profile", "core") + +function RenderEngine.reshape(_, width, height) + gl.viewport(0, 0, width, height) +end + +function RenderEngine:open_window() + self.window = glfw.create_window(50, 50, "Unnamed Window") + glfw.make_context_current(self.window) + gl.init() + glfw.set_framebuffer_size_callback(self.window, RenderEngine.reshape) +end + +function RenderEngine:set_window_title(title) + glfw.set_window_title(self.window, title) +end + +function RenderEngine:render() + glfw.poll_events() + gl.clear_color(1.0, 0.5, 0.2, 1.0) + gl.clear("color", "depth") + glfw.swap_buffers(self.window) + coroutine.yield() +end + +function RenderEngine:render_loop() + repeat RenderEngine:render() + until glfw.window_should_close(self.window) +end + +function RenderEngine:add_render_task() + Dragonblocks:add_task(function() RenderEngine:render_loop() end) +end + +RenderEngine:init() diff --git a/src/event_interface.lua b/src/event_interface.lua index d1dfed3..cb23a2d 100644 --- a/src/event_interface.lua +++ b/src/event_interface.lua @@ -1,18 +1,22 @@ local event_interface = {} function event_interface:init() + assert(self._task_manager) self:clear_event_listeners() end -function event_interface:fire_event(eventtype, event) +function event_interface:fire_event(event, callback) event = event or {} - event.type = eventtype event.origin = self local listeners = self._event_listeners[eventtype] if listeners then - for _, listener in ipairs(listeners) do - listener(event) - end + self._task_manager:add_task(function() + for _, listener in ipairs(listeners) do + listener(event) + coroutine.yield() + end + callback(event) + end) end end diff --git a/src/init.lua b/src/init.lua index c0ef6f3..a036f98 100644 --- a/src/init.lua +++ b/src/init.lua @@ -1,7 +1,13 @@ Dragonblocks.event_interface = require("src/event_interface") Dragonblocks.class = require("src/class") +Dragonblocks.task_manager = require("src/task_manager") Dragonblocks.module_manager = require("src/module_manager") Dragonblocks.serializer = require("src/serializer") Dragonblocks:add_proto(Dragonblocks.module_manager) +Dragonblocks:add_proto(Dragonblocks.task_manager) Dragonblocks:add_proto(Dragonblocks.serializer) + +Dragonblocks:register_event_interface(Dragonblocks) + +print("Started Dragonblocks core") diff --git a/src/module_manager.lua b/src/module_manager.lua index b9c8895..dee4720 100644 --- a/src/module_manager.lua +++ b/src/module_manager.lua @@ -3,34 +3,56 @@ local module_ref = {} function module_ref:preinit() self._dependencies = {} self._started = false - local depfile = io.open(self._path .. "/.txt") + local depfile = io.open(self._path .. "/dependencies.txt") if depfile then local data = depfile:read() depfile:close() self._dependencies = data:split("\n") end + end function module_ref:init() self._started = true end +function module_ref:run_script(s) + return require(self._path .. "src/" .. s) +end + function module_ref:start() _G[self._name] = self - require(self._path .. "src/init") + self:run_script("init") + print("Started module " .. self._name) +end + +function module_ref:get_path() + return self._path +end + +function module_ref:get_data_path() + local p = self._data_path + if not lfs.attributes(p, "mode") then + lfs.mkdir(p) + end end local module_manager = {} module_manager.module_path = "modules/" +module_manager.data_path = "data/" function module_manager:init() + if not lfs.attributes(self.data_path, "mode") then + lfs.mkdir(self.data_path) + end self._modules = {} for modulename in lfs.dir(self.module_path) do if modulename:sub(1, 1) ~= "." then local m = ObjectMgr.create() m._name = modulename m._path = self.module_path .. modulename .. "/" + m._data_path = self.data_path .. modulename .. "/" m:add_proto(module_ref) m:preinit() self._modules[modulename] = m @@ -41,7 +63,7 @@ end function module_manager:start_module(name) local m = self._modules[name] if not m then - error("Failed to start module '" .. name .. "'.") + error("Module '" .. name .. "' not found.") elseif m._started then return end diff --git a/src/task_manager.lua b/src/task_manager.lua new file mode 100644 index 0000000..23a4ead --- /dev/null +++ b/src/task_manager.lua @@ -0,0 +1,34 @@ +local task_manager = {} + +function task_manager:init() + self._tasks = {} +end + +function task_manager:add_task(f) + local t = coroutine.create(f) + table.insert(self._tasks, t) + return t +end + +function task_manager:step() + local t_start = socket.gettime() + local tasks = self._tasks + self._tasks = {} + for _, t in ipairs(tasks) do + if coroutine.resume(t) then + table.insert(self._tasks, t) + end + end + self.tps = 1 / (socket.gettime() - t_start) +end + +function task_manager:start_tasks() + repeat self:step() + until #self._tasks == 0 +end + +function task_manager:register_event_interface(e) + e._task_manager = self +end + +return task_manager diff --git a/util/split.lua b/util/split.lua index 0b9da3d..f0bc8af 100644 --- a/util/split.lua +++ b/util/split.lua @@ -6,13 +6,13 @@ function string.split(str, delim, include_empty, max_splits, sep_is_pattern) local plain = not sep_is_pattern max_splits = max_splits + 1 repeat - local np, npe = string_find(str, delim, pos, plain) + local np, npe = string.find(str, delim, pos, plain) np, npe = (np or (len+1)), (npe or (len+1)) if (not np) or (max_splits == 1) then np = len + 1 npe = np end - local s = string_sub(str, pos, np - 1) + local s = string.sub(str, pos, np - 1) if include_empty or (s ~= "") then max_splits = max_splits - 1 items[#items + 1] = s