]> git.lizzy.rs Git - dragonblocks3d-lua.git/blob - modules/RenderEngine/src/chunk_mesh.lua
Dynamic World System
[dragonblocks3d-lua.git] / modules / RenderEngine / src / chunk_mesh.lua
1 local ChunkMesh = Dragonblocks.create_class()
2 table.assign(ChunkMesh, RenderEngine.Mesh)
3
4 function ChunkMesh:create_faces(blocks)
5         self.vertices = {}
6         self.textures = {}
7         self.vertex_blob_size = 6
8         local face_orientations = {
9                 glm.vec3( 0,  0, -1),
10                 glm.vec3( 0,  0,  1),
11                 glm.vec3(-1,  0,  0),
12                 glm.vec3( 1,  0,  0),
13                 glm.vec3( 0, -1,  0),
14                 glm.vec3( 0,  1,  0),
15         }
16         local bc = 0
17         for _, block in pairs(blocks) do
18                 for i, dir in ipairs(face_orientations) do
19                         local pos = block.pos
20                         local dir_pos_hash = WorldSystem.Chunk.get_pos_hash(pos + dir)
21                         if not dir_pos_hash or not blocks[dir_pos_hash] then
22                                 table.insert(self.textures, block.def.texture)
23                                 self:add_face(block.pos - glm.vec3(7.5, 7.5, 7.5), i)
24                         end
25                 end
26                 bc = bc + 1
27                 if bc == 64 then
28                         bc = 0
29                         coroutine.yield()
30                 end
31         end
32         self:apply_vertices(self.vertices)
33 end
34
35 function ChunkMesh:add_face(pos, facenr)
36         local cube_vertices = RenderEngine.cube_vertices
37         local pos_modifier = {pos.x, pos.y, pos.z}
38         local offset = (facenr - 1) * 6
39         for vertex_index = offset, offset + 5 do
40                 for attribute_index = 1, 5 do   
41                         local k = vertex_index * 5 + attribute_index
42                         local v = cube_vertices[k]
43                         if attribute_index <= 3 then
44                                 v = v + pos_modifier[attribute_index]
45                         end
46                         table.insert(self.vertices, v)
47                 end
48         end
49 end
50
51 return ChunkMesh