diff options
Diffstat (limited to 'honey/ecs/render.lua')
-rw-r--r-- | honey/ecs/render.lua | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/honey/ecs/render.lua b/honey/ecs/render.lua new file mode 100644 index 0000000..4217422 --- /dev/null +++ b/honey/ecs/render.lua @@ -0,0 +1,98 @@ +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 + ) + 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 |