diff options
author | sanine <sanine.not@pm.me> | 2023-04-07 00:13:15 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2023-04-07 00:13:15 -0500 |
commit | 20f27d6eaee89e6b4950ccf9b3a96ab1e59f9d51 (patch) | |
tree | 994cfa3122c2be45a531856de66e13a955b42515 | |
parent | ee3b19aa4f0ec65c159a31d589bbafd4a644610e (diff) |
move new render/transform systems into ecs-systems.lua
-rw-r--r-- | .gitattributes | 1 | ||||
-rw-r--r-- | honey/ecs-systems.lua | 140 | ||||
-rw-r--r-- | honey/std.lua | 2 | ||||
-rw-r--r-- | main.lua | 94 |
4 files changed, 96 insertions, 141 deletions
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' @@ -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", { |