]> git.lizzy.rs Git - dragonblocks3d-lua.git/blob - modules/RenderEngine/src/mesh.lua
Trees; Random Seed
[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, rotation = self.pos, self.size, 0
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                 elseif self.effect == Mesh.EFFECT_ROTATE then
90                         rotation = glfw.get_time() * RenderEngine.mesh_effect_rotate_speed * math.pi * 2
91                 end
92         end
93         
94         ::draw::
95         
96         local model_matrix = 1
97                 * glm.translate(pos)
98                 * glm.rotate(rotation, glm.vec3(0, 1, 0))
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_vertex_array(self.vao)
104         for i = 1, self.vertex_blob_count do
105                 gl.bind_texture("2d", self.textures[i])
106                 gl.draw_arrays("triangles", (i - 1) * self.vertex_blob_size, self.vertex_blob_size)
107         end
108         gl.unbind_vertex_array()
109         gl.unbind_texture("2d")
110 end
111
112 return Mesh