local glm = require 'honey.glm' local Vec3 = glm.Vec3 local Mat4 = glm.Mat4 local gl = honey.gl local glfw = honey.glfw local module = {} setmetatable(module, {__index=_G}) setfenv(1, module) --===== rendering =====-- function draw(model, view, projection, textures, shader, mesh) shader:use() -- 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(), }, matrix={ view=view, projection=projection, model=model, }, } -- draw mesh mesh:drawElements() -- unbind textures for i=0,texOffset-1 do gl.BindTexture(gl.TEXTURE_2D + i, 0) end 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 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 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 return module