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.lua98
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