From 20f27d6eaee89e6b4950ccf9b3a96ab1e59f9d51 Mon Sep 17 00:00:00 2001 From: sanine Date: Fri, 7 Apr 2023 00:13:15 -0500 Subject: move new render/transform systems into ecs-systems.lua --- .gitattributes | 1 + honey/ecs-systems.lua | 140 ++++++++++++++++++++++++++++++++------------------ honey/std.lua | 2 +- main.lua | 94 ++------------------------------- 4 files changed, 96 insertions(+), 141 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..5ddf9ae --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.lua text=true diff --git a/honey/ecs-systems.lua b/honey/ecs-systems.lua index 5dec159..18f50a8 100644 --- a/honey/ecs-systems.lua +++ b/honey/ecs-systems.lua @@ -1,4 +1,6 @@ local ecs = require 'honey.ecs' +local gl = honey.gl +local glfw = honey.glfw local module = {} @@ -9,67 +11,107 @@ setfenv(1, module) --===== transform cascading =====-- -local function recursiveComputeTransform(entity) - if entity._transformComputed then - return entity._transform - end - if entity.parent == false then - entity._transformComputed = true - entity._transform = entity.transform - return entity.transform - end - - entity._transformComputed = true - local parentTransform = recursiveComputeTransform(entity.parent) - entity._transform = parentTransform * entity.transform - return entity._transform +transform = function(params) + return { + db = params.db, + update = function(self, dt) + local entities = self.db:queryComponent("transform") + + -- prepare transforms + for id, transform in pairs(entities) do + transform._visited = false + end + + -- helper function + local function recursiveTransform(transform) + if transform._visited then + return transform._matrix + end + + if not transform.parent then + transform._matrix = transform.matrix + else + local parentTransform = self.db:getComponent(transform.parent, "transform") + local parentMatrix = recursiveTransform(parentTransform) + transform._matrix = parentMatrix * transform.matrix + end + transform._visited = true + return transform._matrix + end + + -- compute transforms + for id, transform in pairs(entities) do + recursiveTransform(transform) + end + end, + priority = 0, + } end --- update transforms -transformCascade = { - filter=ecs.Filter.AND{"transform", "parent"}, - prepareEntity=function(self, entity) - entity._transform = nil - entity._transformComputed = false - end, - update=function(self, entity, dt) - recursiveComputeTransform(entity) - end, - priority=98, -} --===== rendering =====-- -function renderCam(camera, priority) - local priority = priority or 99 +function renderCamera(params) return { - filter=ecs.Filter.AND{"mesh", "shader", "transform"}, - update=function(self, entity, dt) - entity.shader:use() - entity.shader:configure{ - matrix={ - model=entity._transform, - view=camera.view, - projection=camera.projection, - }, - } - entity.mesh:drawElements() + camera = params.camera, + db = params.db, + priority = params.priority or 99, + update = function(self, dt) + local cameraParams = self.db:getComponent(self.camera, "camera") + local cameraTransform = self.db:getComponent(self.camera, "transform") + local view + if cameraTransform then + view = cameraTransform._matrix + else + view = Mat4():identity() + end + + local entities = self.db:queryComponent("renderMesh") + for entity, tbl in pairs(entities) do + -- get shader + local shader = honey.shader.loadShader(tbl.shader.vertex, tbl.shader.fragment) + shader:use() + + -- bind textures + local texOffset = 0 + for name, texTbl in pairs(tbl.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 + local query = self.db:getComponent(entity, "transform") + local model = (query and query._matrix) or Mat4():identity() + shader:configure{ + float={ + time=glfw.GetTime(), + }, + matrix={ + view=view, + projection=cameraParams.projection, + model=model, + }, + } + + -- draw mesh + local mesh = honey.mesh.loadMesh(tbl.mesh.filename, tbl.mesh.index) + mesh:drawElements() + + -- unbind textures + for i=0,texOffset-1 do + gl.BindTexture(gl.TEXTURE_2D + i, 0) + end + end end, - nopause=true, - priority=priority, } end ---===== update functions =====-- -update = { - filter=ecs.Filter.AND{"update"}, - update=function(self, entity, dt) - entity.update(entity, dt) - end, - priority=50, -} + +--===== update functions =====-- diff --git a/honey/std.lua b/honey/std.lua index 98e942d..b16708a 100644 --- a/honey/std.lua +++ b/honey/std.lua @@ -5,7 +5,7 @@ honey.loop = init.loop honey.terminate = init.terminate honey.ecs = require 'honey.ecs' ---honey.standardSystems = require 'honey.ecs-systems' +honey.standardSystems = require 'honey.ecs-systems' honey.mesh = require 'honey.mesh' honey.shader = require 'honey.shader' honey.Window = require 'honey.window' diff --git a/main.lua b/main.lua index 38556ca..c5d3aa6 100644 --- a/main.lua +++ b/main.lua @@ -6,7 +6,7 @@ local Vec3 = honey.Vec3 local Mat4 = honey.Mat4 local Quaternion = honey.Quaternion local ecs = honey.ecs -local systems = honey.standardSystems +local stdSystem = honey.standardSystems local ode = honey.ode local nvg = honey.nvg @@ -41,96 +41,8 @@ sdb:addSystem{ } -sdb:addSystem{ - update = function(self, dt) - local entities = self.db:queryComponent("transform") - - -- prepare transforms - for id, transform in pairs(entities) do - transform._visited = false - end - - -- helper function - local function recursiveTransform(transform) - if transform._visited then - return transform._matrix - end - - if not transform.parent then - transform._matrix = transform.matrix - else - local parentTransform = self.db:getComponent(transform.parent, "transform") - local parentMatrix = recursiveTransform(parentTransform) - transform._matrix = parentMatrix * transform.matrix - end - transform._visited = true - return transform._matrix - end - - -- compute transforms - for id, transform in pairs(entities) do - recursiveTransform(transform) - end - end, - db = edb, - priority = 0, -} - -sdb:addSystem{ - camera = camera, - update = function(self, dt) - local cameraParams = self.db:getComponent(camera, "camera") - local cameraTransform = self.db:getComponent(camera, "transform") - local view - if cameraTransform then - view = cameraTransform._matrix - else - view = Mat4():identity() - end - - local entities = self.db:queryComponent("renderMesh") - for entity, tbl in pairs(entities) do - -- get shader - local shader = honey.shader.loadShader(tbl.shader.vertex, tbl.shader.fragment) - shader:use() - - -- bind textures - local texOffset = 0 - for name, texTbl in pairs(tbl.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 - local query = self.db:getComponent(entity, "transform") - local model = (query and query._matrix) or Mat4():identity() - shader:configure{ - float={ - time=glfw.GetTime(), - }, - matrix={ - view=view, - projection=cameraParams.projection, - model=model, - }, - } - - -- draw mesh - local mesh = honey.mesh.loadMesh(tbl.mesh.filename, tbl.mesh.index) - mesh:drawElements() - - -- unbind textures - for i=0,texOffset-1 do - gl.BindTexture(gl.TEXTURE_2D + i, 0) - end - end - end, - db = edb, - priority = 99, -} - +sdb:addSystem(stdSystem.transform, {db=edb}) +sdb:addSystem(stdSystem.renderCamera, {camera=camera, db=edb}) local id = edb:createEntity() edb:addComponent(id, "renderMesh", { -- cgit v1.2.1