diff options
Diffstat (limited to 'honey/ecs/render.lua')
-rw-r--r-- | honey/ecs/render.lua | 144 |
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 |