summaryrefslogtreecommitdiff
path: root/honey/ecs/render.lua
blob: 4217422f4c37b038173f3b174a4033dc43ef94de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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