diff options
author | sanine-a <sanine.not@pm.me> | 2023-05-12 14:10:48 -0500 |
---|---|---|
committer | sanine-a <sanine.not@pm.me> | 2023-05-12 14:10:48 -0500 |
commit | 0d96ebc90c9740e7e66a70aa11168b11f49d220b (patch) | |
tree | 758403f74f4fbcab61a228ef58e720850b3f70db /honey | |
parent | 6036d1b5d7e0fc160637ce70595bac57ed1fcd00 (diff) |
run working program with refactored code
Diffstat (limited to 'honey')
-rw-r--r-- | honey/asset/mesh.lua | 12 | ||||
-rw-r--r-- | honey/asset/shader.lua | 4 | ||||
-rw-r--r-- | honey/ecs/ecs.lua | 6 | ||||
-rw-r--r-- | honey/ecs/node.lua | 77 | ||||
-rw-r--r-- | honey/ecs/render.lua | 144 | ||||
-rw-r--r-- | honey/ecs/script.lua | 28 | ||||
-rw-r--r-- | honey/init.lua | 26 | ||||
-rw-r--r-- | honey/notes.md | 1 | ||||
-rw-r--r-- | honey/std.lua | 10 |
9 files changed, 139 insertions, 169 deletions
diff --git a/honey/asset/mesh.lua b/honey/asset/mesh.lua index 876c5e4..5e0a26d 100644 --- a/honey/asset/mesh.lua +++ b/honey/asset/mesh.lua @@ -136,14 +136,20 @@ end --===== builtin meshes =====-- -function createBuiltins() - cache["builtin.quad"] = {Mesh( +local function builtin(name, vertices, indices) + local vao, vbo, ebo, count = createMesh(vertices, indices) + cache[name] = { {vao=vao, vbo=vbo, ebo=ebo, count=count } } +end + +init = function() + builtin( + "builtin.quad", { 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1 }, { 0, 1, 3, 0, 3, 2 } - )} + ) end diff --git a/honey/asset/shader.lua b/honey/asset/shader.lua index 0e8c93a..a23c17b 100644 --- a/honey/asset/shader.lua +++ b/honey/asset/shader.lua @@ -35,8 +35,8 @@ local function buildProgram(sources) local shader = compileShader(readFile(sources.vertex), gl.VERTEX_SHADER) table.insert(shaders, shader) end - if sources.vertex then - local shader = compileShader(readFile(sources.vertex), gl.VERTEX_SHADER) + if sources.fragment then + local shader = compileShader(readFile(sources.fragment), gl.FRAGMENT_SHADER) table.insert(shaders, shader) end diff --git a/honey/ecs/ecs.lua b/honey/ecs/ecs.lua index d7eb4ac..0c84041 100644 --- a/honey/ecs/ecs.lua +++ b/honey/ecs/ecs.lua @@ -77,11 +77,9 @@ end -- load database from file function EntityDb.load(self, filename) - print(collectgarbage("count")) self.entities = {} self.components = {} collectgarbage() - print(collectgarbage("count")) local env = { Entity = function(id, components) self:createEntity(id) @@ -320,7 +318,6 @@ function SystemDb.update(self, dt) -- check for dangling dependencies local dangle = "" for dependency in pairs(self.dangling) do - print(dependency) dangle = dangle .. string.format( "unresolved dangling dependency: %s\n", dependency @@ -330,11 +327,10 @@ function SystemDb.update(self, dt) error(dangle) end - for _, name in ipairs(self.sort) do local system = self.systems[name] local params = self.params[name] - system.f(self.db, dt, params) + system.f(self.entityDb, dt, params) end end diff --git a/honey/ecs/node.lua b/honey/ecs/node.lua index 4953af5..6a47a1f 100644 --- a/honey/ecs/node.lua +++ b/honey/ecs/node.lua @@ -1,52 +1,47 @@ +local ecs = require 'honey.ecs.ecs' + local module = {} setmetatable(module, {__index=_G}) setfenv(1, module) --===== transform cascading =====-- -system = function(params) - return { - db = params.db, - - priority = 2, - update = function(self, dt) - local nodes = self.db:queryComponent("node") - - -- prepare nodes - for id, node in pairs(nodes) do - node._visited = false - node._child = nil - end - - -- helper function - local function recursiveTransform(id, node) - if node._visited then - return node._matrix - end - - if not node.parent then - node._matrix = node.matrix - else - local parentNode = self.db:getComponent(node.parent, "node") - local parentMatrix = recursiveTransform(node.parent, parentNode) - node._matrix = parentMatrix * node.matrix - if node.name then - if not parentNode._child then parentNode._child = {} end - parentNode._child[node.name] = honey.ecs.Accessor(self.db, id) - end - end - node._visited = true - return node._matrix - end - - -- compute nodes - for id, node in pairs(nodes) do - recursiveTransform(id, node) - end - end, - } +local function recursiveTransform(db, id, node) + if node._visited then + return node._matrix + end + + if not node.parent then + node._matrix = node.matrix + else + local parentNode = db:getComponent(node.parent, "node") + local parentMatrix = recursiveTransform(db, node.parent, parentNode) + node._matrix = parentMatrix * node.matrix + if node.name then + if not parentNode._child then parentNode._child = {} end + parentNode._child[node.name] = ecs.Accessor(db, id) + end + end + node._visited = true + return node._matrix end +system = {ecs.System("node", function(db, dt, params) + local nodes = db:queryComponent("node") + + -- prepare nodes + for id, node in pairs(nodes) do + node._visited = false + node._child = nil + end + + -- compute nodes + for id, node in pairs(nodes) do + recursiveTransform(db, id, node) + end +end)} + + return module diff --git a/honey/ecs/render.lua b/honey/ecs/render.lua index 1e41e7a..8cca6cf 100644 --- a/honey/ecs/render.lua +++ b/honey/ecs/render.lua @@ -1,3 +1,9 @@ +local ecs = require 'honey.ecs.ecs' + +local image = require 'honey.asset.image' +local shader = require 'honey.asset.shader' +local mesh = require 'honey.asset.mesh' + local glm = require 'honey.glm' local Vec3 = glm.Vec3 local Mat4 = glm.Mat4 @@ -5,103 +11,77 @@ local Mat4 = glm.Mat4 local gl = honey.gl local glfw = honey.glfw +local node = require 'honey.ecs.node' + local module = {} setmetatable(module, {__index=_G}) setfenv(1, module) --===== rendering =====-- -function draw(model, view, projection, textures, shader, mesh) - shader:use() +local function drawMesh(program, uniforms, matrices, vao, count) + gl.UseProgram(program) - -- bind textures - local texOffset = 0 - for name, texTbl in pairs(textures or {}) do - local texture = honey.image.loadImage(texTbl.filename, texTbl.params) - gl.BindTexture(gl.TEXTURE_2D + texOffset, texture.texture) - shader:setInt(name, texOffset) - texOffset = texOffset + 1 - end - - -- configure default uniforms - shader:configure{ - float={ - time=glfw.GetTime(), - }, + -- bind matrices + shader.configure(program, { matrix={ - view=view, - projection=projection, - model=model, + model = matrices.model, + view = matrices.view, + projection = matrices.projection, }, - } + }) - -- draw mesh - mesh:drawElements() - - -- unbind textures - for i=0,texOffset-1 do - gl.BindTexture(gl.TEXTURE_2D + i, 0) + -- bind textures + local offset = 0 + for name, tbl in pairs(uniforms.textures or {}) do + local tex = image.get(tbl.filename) + gl.BindTexture(gl.TEXTURE_2D + offset, tex) + shader.setInt(program, name, offset) + offset = offset+1 end + + -- configure additional uniforms + shader.configure(program, uniforms) + + -- render mesh + gl.BindVertexArray(vao) + gl.DrawElements(gl.TRIANGLES, count, gl.UNSIGNED_INT, 0) end -system = function(params) - return { - db = params.db, - priority = params.priority or 99, - update = function(self, dt) - for id, camera in pairs(self.db:queryComponent("camera")) do - local projection = camera.projection - local cameraTransform = self.db:getComponent(id, "node") - local view = Mat4() - if cameraTransform then - honey.glm.mat4_inv(cameraTransform._matrix.data, view.data) - else - view:identity() - end + +local render = ecs.System("render", function(db, dt, p) + for id, camera in pairs(db:queryComponent("camera")) do + -- get camera's view and projection matrices + local projection = camera.projection + local view = Mat4() + local node = db:getComponent(id, "node") + if node then + honey.glm.mat4_inv(node._matrix.data, view.data) + else + view:identity() + end - local entities = self.db:queryComponent("renderMesh") - for entity, tbl in pairs(entities) do - -- get model - local node = self.db:getComponent(entity, "node") - local model = - (node and node._matrix) or - Mat4():identity() - -- get shader - if not tbl.shader then - print(node) - print(node and node._matrix) - print(node and node.name) - print(node and node.parent) - for k, v in pairs(tbl) do - print(k, v) - end - end - local shader = honey.shader.loadShader( - tbl.shader.vertex, tbl.shader.fragment - ) - -- get mesh - local mesh = honey.mesh.loadCached( - tbl.mesh.filename, tbl.mesh.index, tbl.mesh.debug - ) - draw(model, view, projection, tbl.textures, shader, mesh) - end - - entities = self.db:queryComponent("renderQuad") - local quadmesh = honey.mesh.loadCached("builtin.quad", 1) - for entity, tbl in pairs(entities) do - -- get model - local model = Mat4():identity() - -- get shader - local shader = honey.shader.loadShader( - tbl.shader.vertex, tbl.shader.fragment - ) - draw(model, view, projection, tbl.textures, shader, quadmesh) - end - end - end, - } -end + -- iterate over all scene meshes + local meshes = db:queryComponent("renderMesh") + for id, tbl in pairs(meshes) do + -- get model matrix + local node = db:getComponent(id, "node") + local model = (node and node._matrix) or Mat4():identity() + + -- get shader program + local program = shader.get(tbl.shader) + + -- get mesh + local vao, count = mesh.get(tbl.mesh.filename, tbl.mesh.index) + + -- draw c: + drawMesh(program, tbl.uniforms or {}, {view=view, model=model, projection=projection}, vao, count) + end + end +end) +render:addDependencies(node.system) +system = {render} return module diff --git a/honey/ecs/script.lua b/honey/ecs/script.lua index 9ae7d72..46af4fa 100644 --- a/honey/ecs/script.lua +++ b/honey/ecs/script.lua @@ -1,3 +1,6 @@ +local ecs = require 'honey.ecs.ecs' +local node = require 'honey.ecs.node' + local module = {} setmetatable(module, {__index=_G}) setfenv(1, module) @@ -16,8 +19,8 @@ end --===== dispatch messages to handlers =====-- -dispatch = function(entities, msg, data) - local query = entities:queryComponent(msg) +dispatch = function(db, msg, data) + local query = db:queryComponent(msg) for id, handler in pairs(query) do local f = getFunction(handler) f(entities, id, data) @@ -26,19 +29,16 @@ end --===== script system =====-- -system = function(params) - return { - db=params.db, - update=function(self, dt) - local entities = self.db:queryComponent("script") - for id, script in pairs(entities) do - local f = getFunction(script) - f(self.db, id, dt) - end - end - } -end +local script = ecs.System("script", function(db, dt, params) + local entities = db:queryComponent("script") + for id, script in pairs(entities) do + local f = getFunction(script) + f(db, id, dt) + end +end) +script:addDependencies(node.system) +system = {script} return module diff --git a/honey/init.lua b/honey/init.lua index d2f5279..7ceee2f 100644 --- a/honey/init.lua +++ b/honey/init.lua @@ -1,13 +1,10 @@ local glfw = honey.glfw local gl = honey.gl -local window = require 'honey.window' -local module = {} -setmetatable(module, {__index=_G}) -setfenv(1, module) +local mesh = require 'honey.asset.mesh' -function init(width, height, title) +function honey.init(width, height, title) local width = width or 640 local height = height or 480 local title = title or "honey3d" @@ -16,34 +13,29 @@ function init(width, height, title) glfw.WindowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) glfw.WindowHint(glfw.CONTEXT_VERSION_MAJOR, 4) glfw.WindowHint(glfw.CONTEXT_VERSION_MINOR, 1) - local window = honey.Window(width, height, title) - glfw.MakeContextCurrent(window.win) + honey.window = glfw.CreateWindow(width, height, title, glfw.monitor_NULL, glfw.window_NULL) + glfw.MakeContextCurrent(honey.window) gl.InitGlad() gl.Enable(gl.DEPTH_TEST) honey.ode.InitODE() - honey.mesh.createBuiltins() - - return window + mesh.init() end -function loop(window, update) +function honey.loop(update) local prevTime = 0 - while not window:shouldClose() do + while glfw.WindowShouldClose(honey.window) == glfw.FALSE do local time = glfw.GetTime() local dt = time - prevTime prevTime = time update(dt) - window:swapBuffers() + glfw.SwapBuffers(honey.window) glfw.PollEvents() end end -function terminate() +function honey.terminate() glfw.Terminate() end - - -return module diff --git a/honey/notes.md b/honey/notes.md index 16ccc49..863c019 100644 --- a/honey/notes.md +++ b/honey/notes.md @@ -9,6 +9,7 @@ assets are cached. each asset type has a module (e.g. `mesh`, `image`, `sound`, * `get(filename)` - cached load of the given file. throws error if it cannot be found * `forget(filename` - remove the cached copy, if any of the given file * `clearCache()` - clear the full cache for that asset type + * `init()` - optional, initializes any builtins that must come after opengl or other things individual assets may have additional functions. diff --git a/honey/std.lua b/honey/std.lua index 222798c..8b70699 100644 --- a/honey/std.lua +++ b/honey/std.lua @@ -1,15 +1,15 @@ local init = require 'honey.init' -honey.init = init.init -honey.loop = init.loop -honey.terminate = init.terminate - honey.asset = {} honey.asset.image = require 'honey.asset.image' honey.asset.mesh = require 'honey.asset.mesh' honey.asset.shader = require 'honey.asset.shader' -honey.ecs = require 'honey.ecs' + +honey.ecs = require 'honey.ecs.ecs' +honey.ecs.node = require 'honey.ecs.node' +honey.ecs.render = require 'honey.ecs.render' +honey.ecs.script = require 'honey.ecs.script' -- glm is so frequently used that we load it globally, not locally |