summaryrefslogtreecommitdiff
path: root/honey/ecs/render.lua
diff options
context:
space:
mode:
Diffstat (limited to 'honey/ecs/render.lua')
-rw-r--r--honey/ecs/render.lua144
1 files changed, 62 insertions, 82 deletions
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