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