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 =
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
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)
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)
--- /dev/null
+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
+++ /dev/null
-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
-}
--- /dev/null
+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,
+}
+
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()
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()
gl.use_program(self.shaders)
- RenderEngine:update_view_matrix()
+ self:update_view_matrix()
for _, mesh in ipairs(self.Mesh.list) do
mesh:render(dtime)
Mesh.EFFECT_GROW = 1
Mesh.EFFECT_FLYIN = 2
Mesh.EFFECT_ROTATE = 3
-Mesh.CUBE = RenderEngine:run("cube")
Mesh.list = {}
function Mesh:set_size(size)
end
function Mesh:set_texture(texture)
- self.texture = texture
+ self.textures = {texture}
end
function Mesh:set_effect(effect, after)
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)
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
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)
vdata = v
elseif vtype == "boolean" then
vdata = v and "true" or "false"
+ elseif vtype == "function" then
+ vdata = tostring(v)
else
serialize_pair = false
end
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