]> git.lizzy.rs Git - dragonblocks3d-lua.git/commitdiff
Added task manager and window
authorElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 6 Aug 2020 16:08:31 +0000 (18:08 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 6 Aug 2020 16:08:31 +0000 (18:08 +0200)
.gitignore
init.lua
modules/MainMenu/dependencies.txt [new file with mode: 0644]
modules/MainMenu/src/init.lua [new file with mode: 0644]
modules/Menu/src/init.lua [deleted file]
modules/RenderEngine/src/init.lua [new file with mode: 0644]
src/event_interface.lua
src/init.lua
src/module_manager.lua
src/task_manager.lua [new file with mode: 0644]
util/split.lua

index 1e077ff3e41441c0a959bb9375b1f1826b0bbe49..82f0c3ac6d4d43fca14022bb41875074ff494d99 100644 (file)
@@ -1,2 +1 @@
-/client/
-/server/
+/data/
index 2ac008835a9f444293e5da17971e973106a14925..5edef9f52bcc8f08c66010972c0bbbb48df3ab33 100755 (executable)
--- 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 (file)
index 0000000..0055b8e
--- /dev/null
@@ -0,0 +1 @@
+RenderEngine
diff --git a/modules/MainMenu/src/init.lua b/modules/MainMenu/src/init.lua
new file mode 100644 (file)
index 0000000..503e73e
--- /dev/null
@@ -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 (file)
index e7a722d..0000000
+++ /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 (file)
index 0000000..0da1656
--- /dev/null
@@ -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()
index d1dfed336071d1db485fedf2908c26411c1c9a82..cb23a2d064a2b84a68292b2d11bb49f75a3313af 100644 (file)
@@ -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
 
index c0ef6f314c78c96e5ceb6cc8e44955604533a22d..a036f98d083346ed66bd70068989d7e303b11318 100644 (file)
@@ -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")
index b9c88952f04ba506afe90ffacbcc0fd4493840d9..dee47200b736efb7b61ca9fbfe14abfaaee87422 100644 (file)
@@ -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 (file)
index 0000000..23a4ead
--- /dev/null
@@ -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
index 0b9da3d0e9133b8c134f2f2be9e7144d2f70f09d..f0bc8af6feded568c971383e59cd9277c6adba52 100644 (file)
@@ -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