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 local gl = honey.gl local glfw = honey.glfw local node = require 'honey.ecs.node' local module = {} setmetatable(module, {__index=_G}) setfenv(1, module) --===== rendering =====-- local function drawMesh(program, uniforms, matrices, vao, count) gl.UseProgram(program) -- bind matrices shader.configure(program, { matrix={ model = matrices.model, view = matrices.view, projection = matrices.projection, }, }) -- 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 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 -- 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