]> git.lizzy.rs Git - dragonblocks3d-lua.git/blob - modules/RenderEngine/src/mesh.lua
Refactoring
[dragonblocks3d-lua.git] / modules / RenderEngine / src / mesh.lua
1 local Mesh = Dragonblocks.create_class()
2
3 Mesh.EFFECT_GROW = 1
4 Mesh.EFFECT_FLYIN = 2
5 Mesh.EFFECT_ROTATE = 3
6 Mesh.CUBE = RenderEngine:run("cube")
7 Mesh.list = {}
8
9 function Mesh:set_size(size)
10         self.size = size
11 end
12
13 function Mesh:set_pos(pos)
14         self.pos = pos
15 end
16
17 function Mesh:set_texture(texture)
18         self.texture = texture
19 end
20
21 function Mesh:set_effect(effect, after)
22         self.effect = effect
23         self.effect_lasts =
24                 (effect == Mesh.EFFECT_GROW) and RenderEngine.mesh_effect_grow_time
25                 or
26                 (effect == Mesh.EFFECT_FLYIN) and RenderEngine.mesh_effect_flyin_time
27         self.after_effect = after
28 end
29
30 function Mesh:add_to_scene()
31         if self.effect then
32                 self.created = glfw.get_time()
33         end
34         table.insert(Mesh.list, self)
35 end
36
37 function Mesh:remove_from_scene()
38         local i = table.indexof(Mesh.list, self)
39         if i then
40                 table.remove(Mesh.list, i)
41         end
42 end
43
44 function Mesh:make_cube()
45         self:apply_vertices(Mesh.CUBE)
46 end
47
48 function Mesh:apply_vertices(vertices)
49         self.vao = gl.gen_vertex_arrays(1)
50         self.vbo = gl.gen_buffers(1)
51         
52         gl.bind_vertex_array(self.vao)
53         
54         gl.bind_buffer("array", self.vbo)
55         gl.buffer_data("array", gl.pack("float", vertices), "static draw")
56         
57         local fsize = gl.sizeof("float")
58         
59         local stride = 5 * fsize
60         
61         gl.vertex_attrib_pointer(0, 3, "float", false, stride, 0)
62         gl.enable_vertex_attrib_array(0)
63         gl.vertex_attrib_pointer(1, 2, "float", false, stride, 3 * fsize)       
64         gl.enable_vertex_attrib_array(1)
65         
66         gl.unbind_buffer("array")
67         gl.unbind_vertex_array()
68         
69         return vao
70 end
71
72 function Mesh:render(dtime)
73         local pos, size = self.pos, self.size
74
75         if self.effect then
76                 if self.effect_lasts then
77                         self.effect_lasts = self.effect_lasts - dtime
78                         if self.effect_lasts < 0 then
79                                 if self.after_effect then
80                                         self:after_effect()
81                                 end
82                                 self.effect = nil
83                                 self.effect_lasts = nil
84                                 self.after_effect = nil
85                                 goto draw
86                         end
87                 end
88                 if self.effect == Mesh.EFFECT_GROW then
89                         size = size * math.pow(1 - self.effect_lasts / RenderEngine.mesh_effect_grow_time, 1)
90                 elseif self.effect == Mesh.EFFECT_FLYIN then
91                         pos = pos - glm.vec3(0, RenderEngine.mesh_effect_flyin_offset * self.effect_lasts / RenderEngine.mesh_effect_flyin_time, 0)
92                 end
93         end
94         
95         ::draw::
96         
97         local model_matrix = 1
98                 * glm.translate(pos)
99                 * glm.scale(size)
100         
101         gl.uniform_matrix4f(gl.get_uniform_location(RenderEngine.shaders, "model"), true, model_matrix)
102         gl.active_texture(0)
103         gl.bind_texture("2d", self.texture)
104         gl.bind_vertex_array(self.vao)
105         gl.draw_arrays("triangles", 0, 36)
106         gl.unbind_vertex_array()
107         gl.unbind_texture("2d")
108 end
109
110 return Mesh