]> git.lizzy.rs Git - dragonblocks3d-lua.git/commitdiff
Huge Performance improvements
authorElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 11 Aug 2020 15:59:17 +0000 (17:59 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 11 Aug 2020 15:59:17 +0000 (17:59 +0200)
modules/Client/src/graphics.lua
modules/Client/src/init.lua
modules/PlayerSystem/src/localplayer.lua
modules/RenderEngine/src/chunk_mesh.lua [new file with mode: 0644]
modules/RenderEngine/src/cube.lua [deleted file]
modules/RenderEngine/src/cube_vertices.lua [new file with mode: 0644]
modules/RenderEngine/src/init.lua
modules/RenderEngine/src/mesh.lua
modules/WorldSystem/src/chunk.lua
src/serialisation.lua
src/taskmgr.lua

index cc883f665692cda804637308219764617fb09688..9f412670a8313911940c1e3ff3cb52a6f180b455 100644 (file)
@@ -8,7 +8,7 @@ function graphics:init()
        RenderEngine.mouse_sensitivity = 0.7
        --RenderEngine.pitch_move = true
        RenderEngine.mesh_effect_grow_time = 0.25
-       RenderEngine.mesh_effect_flyin_time = 1
+       RenderEngine.mesh_effect_flyin_time = 0.5
        RenderEngine.mesh_effect_flyin_offset = 20
        --RenderEngine.mesh_effect_rotate_speed = 
        
@@ -24,20 +24,12 @@ function graphics:init()
 end
 
 function graphics:create_chunk_meshes(chunk)
-       for _, block in pairs(chunk.blocks) do
-               self:create_block_mesh(block, false)
-       end
-end
-
-function graphics:create_block_mesh(block, grow)
-       local mesh = RenderEngine.Mesh()
-       mesh:set_pos(block.pos)
+       local mesh = RenderEngine.ChunkMesh()
+       mesh:set_pos(glm.vec3(0, 0, 0))
        mesh:set_size(glm.vec3(1, 1, 1))
-       mesh:set_texture(block.def.texture)
-       mesh:make_cube()
-       if grow then
-               mesh:set_effect(RenderEngine.Mesh.EFFECT_GROW)
-       end
+       mesh:set_texture(BlockSystem:get_def("game:dirt").texture)
+       mesh:create_vertices(chunk)
+       mesh:set_effect(RenderEngine.Mesh.EFFECT_FLYIN)
        mesh:add_to_scene()
 end
 
index ad7c81b96e1fba8984a6b333d43523f8501ef18b..067b04190669832f0b42e649d6114dd480c22f6d 100644 (file)
@@ -8,4 +8,8 @@ Client.player = PlayerSystem.LocalPlayer()
 
 Client.player:set_position(glm.vec3(8, 20, 8))
 
-RenderEngine:render_loop()
+Dragonblocks:add_task(function()
+       repeat
+               coroutine.yield("FPS:" .. math.floor(Dragonblocks.tps or 0))
+       until false
+end)
index d2e46a8e51ed1ab079390dc59cc903b12b3e826c..753520fbc03113523003962936c0ec35c9ba11b0 100644 (file)
@@ -6,7 +6,7 @@ function LocalPlayer:constructor()
        self:set_speed(10)
        self:set_fov(86.1)
        self:set_yaw(-90)
-       self:set_pitch(0)
+       self:set_pitch(-80)
        self:add_event_listener("after_set_position", function(event) self:set_position_callback(event) end)
        RenderEngine:add_event_listener("keypress", function(event) self:key_press_callback(event) end)
        RenderEngine:add_event_listener("mousemove", function(event) self:mouse_move_callback(event) end)
diff --git a/modules/RenderEngine/src/chunk_mesh.lua b/modules/RenderEngine/src/chunk_mesh.lua
new file mode 100644 (file)
index 0000000..4a1369d
--- /dev/null
@@ -0,0 +1,44 @@
+local ChunkMesh = Dragonblocks.create_class()
+table.assign(ChunkMesh, RenderEngine.Mesh)
+
+function ChunkMesh:create_vertices(chunk)
+       self.vertices = {}
+       self.textures = {}
+       self.vertex_blob_size = 6
+       local face_orientations = {
+               glm.vec3( 0,  0, -1),
+               glm.vec3( 0,  0,  1),
+               glm.vec3(-1,  0,  0),
+               glm.vec3( 1,  0,  0),
+               glm.vec3( 0, -1,  0),
+               glm.vec3( 0,  1,  0),
+       }
+       for _, block in pairs(chunk.blocks) do
+               for i, dir in ipairs(face_orientations) do
+                       local pos = block.pos
+                       if not chunk:get_block(pos + dir) then
+                               table.insert(self.textures, block.def.texture)
+                               self:add_face(block.pos, i)
+                       end
+               end
+       end
+       self:apply_vertices(self.vertices)
+end
+
+function ChunkMesh:add_face(pos, facenr)
+       local cube_vertices = RenderEngine.cube_vertices
+       local pos_modifier = {pos.x, pos.y, pos.z}
+       local offset = (facenr - 1) * 6
+       for vertex_index = offset, offset + 5 do
+               for attribute_index = 1, 5 do   
+                       local k = vertex_index * 5 + attribute_index
+                       local v = cube_vertices[k]
+                       if attribute_index <= 3 then
+                               v = v + pos_modifier[attribute_index]
+                       end
+                       table.insert(self.vertices, v)
+               end
+       end
+end
+
+return ChunkMesh
diff --git a/modules/RenderEngine/src/cube.lua b/modules/RenderEngine/src/cube.lua
deleted file mode 100644 (file)
index ba4e6c9..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-return {
-  -0.5, -0.5, -0.5,  0.0, 0.0,
-   0.5, -0.5, -0.5,  1.0, 0.0,
-   0.5,  0.5, -0.5,  1.0, 1.0,
-   0.5,  0.5, -0.5,  1.0, 1.0,
-  -0.5,  0.5, -0.5,  0.0, 1.0,
-  -0.5, -0.5, -0.5,  0.0, 0.0,
-
-  -0.5, -0.5,  0.5,  0.0, 0.0,
-   0.5, -0.5,  0.5,  1.0, 0.0,
-   0.5,  0.5,  0.5,  1.0, 1.0,
-   0.5,  0.5,  0.5,  1.0, 1.0,
-  -0.5,  0.5,  0.5,  0.0, 1.0,
-  -0.5, -0.5,  0.5,  0.0, 0.0,
-
-  -0.5,  0.5,  0.5,  1.0, 0.0,
-  -0.5,  0.5, -0.5,  1.0, 1.0,
-  -0.5, -0.5, -0.5,  0.0, 1.0,
-  -0.5, -0.5, -0.5,  0.0, 1.0,
-  -0.5, -0.5,  0.5,  0.0, 0.0,
-  -0.5,  0.5,  0.5,  1.0, 0.0,
-
-   0.5,  0.5,  0.5,  1.0, 0.0,
-   0.5,  0.5, -0.5,  1.0, 1.0,
-   0.5, -0.5, -0.5,  0.0, 1.0,
-   0.5, -0.5, -0.5,  0.0, 1.0,
-   0.5, -0.5,  0.5,  0.0, 0.0,
-   0.5,  0.5,  0.5,  1.0, 0.0,
-
-  -0.5, -0.5, -0.5,  0.0, 1.0,
-   0.5, -0.5, -0.5,  1.0, 1.0,
-   0.5, -0.5,  0.5,  1.0, 0.0,
-   0.5, -0.5,  0.5,  1.0, 0.0,
-  -0.5, -0.5,  0.5,  0.0, 0.0,
-  -0.5, -0.5, -0.5,  0.0, 1.0,
-
-  -0.5,  0.5, -0.5,  0.0, 1.0,
-   0.5,  0.5, -0.5,  1.0, 1.0,
-   0.5,  0.5,  0.5,  1.0, 0.0,
-   0.5,  0.5,  0.5,  1.0, 0.0,
-  -0.5,  0.5,  0.5,  0.0, 0.0,
-  -0.5,  0.5, -0.5,  0.0, 1.0
-} 
diff --git a/modules/RenderEngine/src/cube_vertices.lua b/modules/RenderEngine/src/cube_vertices.lua
new file mode 100644 (file)
index 0000000..a088dbd
--- /dev/null
@@ -0,0 +1,44 @@
+return {
+       -0.5, -0.5, -0.5,  0.0, 0.0,
+        0.5, -0.5, -0.5,  1.0, 0.0,
+        0.5,  0.5, -0.5,  1.0, 1.0,
+        0.5,  0.5, -0.5,  1.0, 1.0,
+       -0.5,  0.5, -0.5,  0.0, 1.0,
+       -0.5, -0.5, -0.5,  0.0, 0.0,
+
+       -0.5, -0.5,  0.5,  0.0, 0.0,
+        0.5, -0.5,  0.5,  1.0, 0.0,
+        0.5,  0.5,  0.5,  1.0, 1.0,
+        0.5,  0.5,  0.5,  1.0, 1.0,
+       -0.5,  0.5,  0.5,  0.0, 1.0,
+       -0.5, -0.5,  0.5,  0.0, 0.0,
+
+       -0.5,  0.5,  0.5,  1.0, 0.0,
+       -0.5,  0.5, -0.5,  1.0, 1.0,
+       -0.5, -0.5, -0.5,  0.0, 1.0,
+       -0.5, -0.5, -0.5,  0.0, 1.0,
+       -0.5, -0.5,  0.5,  0.0, 0.0,
+       -0.5,  0.5,  0.5,  1.0, 0.0,
+
+        0.5,  0.5,  0.5,  1.0, 0.0,
+        0.5,  0.5, -0.5,  1.0, 1.0,
+        0.5, -0.5, -0.5,  0.0, 1.0,
+        0.5, -0.5, -0.5,  0.0, 1.0,
+        0.5, -0.5,  0.5,  0.0, 0.0,
+        0.5,  0.5,  0.5,  1.0, 0.0,
+
+       -0.5, -0.5, -0.5,  0.0, 1.0,
+        0.5, -0.5, -0.5,  1.0, 1.0,
+        0.5, -0.5,  0.5,  1.0, 0.0,
+        0.5, -0.5,  0.5,  1.0, 0.0,
+       -0.5, -0.5,  0.5,  0.0, 0.0,
+       -0.5, -0.5, -0.5,  0.0, 1.0,
+
+       -0.5,  0.5, -0.5,  0.0, 1.0,
+        0.5,  0.5, -0.5,  1.0, 1.0,
+        0.5,  0.5,  0.5,  1.0, 0.0,
+        0.5,  0.5,  0.5,  1.0, 0.0,
+       -0.5,  0.5,  0.5,  0.0, 0.0,
+       -0.5,  0.5, -0.5,  0.0, 1.0,
+}
index 39ec7fc897775c84554a173cb433769f20a01e72..4b060abc38219d2be7b46a3b41bfe78a9a356a66 100644 (file)
@@ -3,7 +3,9 @@ RenderEngine:run("shaders")
 RenderEngine:run("textures")
 RenderEngine:run("window")
 
+RenderEngine.cube_vertices = RenderEngine:run("cube_vertices")
 RenderEngine.Mesh = RenderEngine:run("mesh")
+RenderEngine.ChunkMesh = RenderEngine:run("chunk_mesh")
 RenderEngine.camera = RenderEngine:run("camera")
 
 function RenderEngine:init()
@@ -25,12 +27,15 @@ function RenderEngine:add_render_task()
        end)
 end
 
-function RenderEngine:render_loop()
+function RenderEngine:render_loop(is_only_task)
        self.last_time = glfw.get_time()
        repeat
                self:render()
-               --coroutine.yield()
+               if not is_only_task then
+                       coroutine.yield()
+               end
        until glfw.window_should_close(self.window)
+       os.exit()
 end
 
 function RenderEngine:update_projection_matrix()
@@ -53,7 +58,7 @@ function RenderEngine:render()
        
        gl.use_program(self.shaders)    
        
-       RenderEngine:update_view_matrix()
+       self:update_view_matrix()
        
        for _, mesh in ipairs(self.Mesh.list) do
                mesh:render(dtime)
index 446e2b4970475995bfed7beaecfe92ba00ae7a05..94c2a570a60e1c404aa5d5b9f9509e80bb6098cd 100644 (file)
@@ -3,7 +3,6 @@ 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)
@@ -15,7 +14,7 @@ function Mesh:set_pos(pos)
 end
 
 function Mesh:set_texture(texture)
-       self.texture = texture
+       self.textures = {texture}
 end
 
 function Mesh:set_effect(effect, after)
@@ -41,11 +40,9 @@ function Mesh:remove_from_scene()
        end
 end
 
-function Mesh:make_cube()
-       self:apply_vertices(Mesh.CUBE)
-end
-
 function Mesh:apply_vertices(vertices)
+       self.vertex_blob_count = #vertices / 5 / self.vertex_blob_size
+       
        self.vao = gl.gen_vertex_arrays(1)
        self.vbo = gl.gen_buffers(1)
        
@@ -100,9 +97,11 @@ function Mesh:render(dtime)
        
        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)
+       for i = 1, self.vertex_blob_count do
+               gl.bind_texture("2d", self.textures[i])
+               gl.draw_arrays("triangles", (i - 1) * self.vertex_blob_size, self.vertex_blob_size)
+       end
        gl.unbind_vertex_array()
        gl.unbind_texture("2d")
 end
index 1d6824994415e99f18d59b1efa7ce707a1060bed..f49390ea862f3bab60b3f0b320a417724a27c31d 100644 (file)
@@ -12,7 +12,9 @@ function Chunk:constructor()
 end
 
 function Chunk:get_pos_hash(pos)
-       return pos.x + size * pos.y + size_squared * pos.z
+       local x, y, z = pos.x, pos.y, pos.z
+       if x > 15 or y > 15 or z > 15 or x < 0 or y < 0 or z < 0 then return end
+       return x + size * y + size_squared * z
 end
 
 function Chunk:add_block(pos, def)
index a1877ed5b302d3965a4fbb58abcbb806f386126f..bcd8d7bbd3ee070798b06b976aa8a771eba6722c 100644 (file)
@@ -23,6 +23,8 @@ function Dragonblocks:serialize()
                        vdata = v
                elseif vtype == "boolean" then
                        vdata = v and "true" or "false"
+               elseif vtype == "function" then
+                       vdata = tostring(v)
                else
                        serialize_pair = false
                end
index 77927182700ea08ef3d4298eaf43bf99efe18c99..4c4693e6d3ba50920c4379c4224c4dad80622c80 100644 (file)
@@ -11,7 +11,11 @@ function Dragonblocks:step()
        local tasks = self.tasks
        self.tasks = {}
        for _, t in ipairs(tasks) do
-               if coroutine.resume(t) then
+               local continue, status = coroutine.resume(t)
+               if status then
+                       print(status)
+               end
+               if continue then
                        table.insert(self.tasks, t)
                end
        end