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
|