summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes1
-rw-r--r--honey/ecs-systems.lua140
-rw-r--r--honey/std.lua2
-rw-r--r--main.lua94
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'
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", {