Huge Performance improvements
parent
0dcc4b5bc8
commit
0a8d3b36d3
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
}
|
|
@ -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,
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue