]> git.lizzy.rs Git - dragonblocks3d-lua.git/blobdiff - modules/RenderEngine/src/mesh.lua
Refactoring
[dragonblocks3d-lua.git] / modules / RenderEngine / src / mesh.lua
diff --git a/modules/RenderEngine/src/mesh.lua b/modules/RenderEngine/src/mesh.lua
new file mode 100644 (file)
index 0000000..446e2b4
--- /dev/null
@@ -0,0 +1,110 @@
+local Mesh = Dragonblocks.create_class()
+
+Mesh.EFFECT_GROW = 1
+Mesh.EFFECT_FLYIN = 2
+Mesh.EFFECT_ROTATE = 3
+Mesh.CUBE = RenderEngine:run("cube")
+Mesh.list = {}
+
+function Mesh:set_size(size)
+       self.size = size
+end
+
+function Mesh:set_pos(pos)
+       self.pos = pos
+end
+
+function Mesh:set_texture(texture)
+       self.texture = texture
+end
+
+function Mesh:set_effect(effect, after)
+       self.effect = effect
+       self.effect_lasts =
+               (effect == Mesh.EFFECT_GROW) and RenderEngine.mesh_effect_grow_time
+               or
+               (effect == Mesh.EFFECT_FLYIN) and RenderEngine.mesh_effect_flyin_time
+       self.after_effect = after
+end
+
+function Mesh:add_to_scene()
+       if self.effect then
+               self.created = glfw.get_time()
+       end
+       table.insert(Mesh.list, self)
+end
+
+function Mesh:remove_from_scene()
+       local i = table.indexof(Mesh.list, self)
+       if i then
+               table.remove(Mesh.list, i)
+       end
+end
+
+function Mesh:make_cube()
+       self:apply_vertices(Mesh.CUBE)
+end
+
+function Mesh:apply_vertices(vertices)
+       self.vao = gl.gen_vertex_arrays(1)
+       self.vbo = gl.gen_buffers(1)
+       
+       gl.bind_vertex_array(self.vao)
+       
+       gl.bind_buffer("array", self.vbo)
+       gl.buffer_data("array", gl.pack("float", vertices), "static draw")
+       
+       local fsize = gl.sizeof("float")
+       
+       local stride = 5 * fsize
+       
+       gl.vertex_attrib_pointer(0, 3, "float", false, stride, 0)
+       gl.enable_vertex_attrib_array(0)
+       gl.vertex_attrib_pointer(1, 2, "float", false, stride, 3 * fsize)       
+       gl.enable_vertex_attrib_array(1)
+       
+       gl.unbind_buffer("array")
+       gl.unbind_vertex_array()
+       
+       return vao
+end
+
+function Mesh:render(dtime)
+       local pos, size = self.pos, self.size
+
+       if self.effect then
+               if self.effect_lasts then
+                       self.effect_lasts = self.effect_lasts - dtime
+                       if self.effect_lasts < 0 then
+                               if self.after_effect then
+                                       self:after_effect()
+                               end
+                               self.effect = nil
+                               self.effect_lasts = nil
+                               self.after_effect = nil
+                               goto draw
+                       end
+               end
+               if self.effect == Mesh.EFFECT_GROW then
+                       size = size * math.pow(1 - self.effect_lasts / RenderEngine.mesh_effect_grow_time, 1)
+               elseif self.effect == Mesh.EFFECT_FLYIN then
+                       pos = pos - glm.vec3(0, RenderEngine.mesh_effect_flyin_offset * self.effect_lasts / RenderEngine.mesh_effect_flyin_time, 0)
+               end
+       end
+       
+       ::draw::
+       
+       local model_matrix = 1
+               * glm.translate(pos)
+               * glm.scale(size)
+       
+       gl.uniform_matrix4f(gl.get_uniform_location(RenderEngine.shaders, "model"), true, model_matrix)
+       gl.active_texture(0)
+       gl.bind_texture("2d", self.texture)
+       gl.bind_vertex_array(self.vao)
+       gl.draw_arrays("triangles", 0, 36)
+       gl.unbind_vertex_array()
+       gl.unbind_texture("2d")
+end
+
+return Mesh