| SUBCHUNK_WIDTH = 4 |
| SUBCHUNK_HEIGHT = 4 |
| SUBCHUNK_LENGTH = 4 |
|
|
| class Subchunk: |
| def __init__(self, parent, subchunk_position): |
| self.parent = parent |
| self.world = self.parent.world |
|
|
| self.subchunk_position = subchunk_position |
|
|
| self.local_position = ( |
| self.subchunk_position[0] * SUBCHUNK_WIDTH, |
| self.subchunk_position[1] * SUBCHUNK_HEIGHT, |
| self.subchunk_position[2] * SUBCHUNK_LENGTH) |
|
|
| self.position = ( |
| self.parent.position[0] + self.local_position[0], |
| self.parent.position[1] + self.local_position[1], |
| self.parent.position[2] + self.local_position[2]) |
|
|
| |
|
|
| self.mesh_vertex_positions = [] |
| self.mesh_tex_coords = [] |
| self.mesh_shading_values = [] |
|
|
| self.mesh_index_counter = 0 |
| self.mesh_indices = [] |
| |
| def update_mesh(self): |
| self.mesh_vertex_positions = [] |
| self.mesh_tex_coords = [] |
| self.mesh_shading_values = [] |
|
|
| self.mesh_index_counter = 0 |
| self.mesh_indices = [] |
|
|
| def add_face(face): |
| vertex_positions = block_type.vertex_positions[face].copy() |
|
|
| for i in range(4): |
| vertex_positions[i * 3 + 0] += x |
| vertex_positions[i * 3 + 1] += y |
| vertex_positions[i * 3 + 2] += z |
| |
| self.mesh_vertex_positions.extend(vertex_positions) |
|
|
| indices = [0, 1, 2, 0, 2, 3] |
| for i in range(6): |
| indices[i] += self.mesh_index_counter |
| |
| self.mesh_indices.extend(indices) |
| self.mesh_index_counter += 4 |
|
|
| self.mesh_tex_coords.extend(block_type.tex_coords[face]) |
| self.mesh_shading_values.extend(block_type.shading_values[face]) |
|
|
| for local_x in range(SUBCHUNK_WIDTH): |
| for local_y in range(SUBCHUNK_HEIGHT): |
| for local_z in range(SUBCHUNK_LENGTH): |
| parent_lx = self.local_position[0] + local_x |
| parent_ly = self.local_position[1] + local_y |
| parent_lz = self.local_position[2] + local_z |
|
|
| block_number = self.parent.blocks[parent_lx][parent_ly][parent_lz] |
|
|
| if block_number: |
| block_type = self.world.block_types[block_number] |
|
|
| x, y, z = ( |
| self.position[0] + local_x, |
| self.position[1] + local_y, |
| self.position[2] + local_z) |
| |
| def can_render_face(position): |
| if not self.world.is_opaque_block(position): |
| if block_type.glass and self.world.get_block_number(position) == block_number: |
| return False |
| |
| return True |
| |
| return False |
|
|
| |
| |
| |
|
|
| if block_type.is_cube: |
| if can_render_face((x + 1, y, z)): add_face(0) |
| if can_render_face((x - 1, y, z)): add_face(1) |
| if can_render_face((x, y + 1, z)): add_face(2) |
| if can_render_face((x, y - 1, z)): add_face(3) |
| if can_render_face((x, y, z + 1)): add_face(4) |
| if can_render_face((x, y, z - 1)): add_face(5) |
| |
| else: |
| for i in range(len(block_type.vertex_positions)): |
| add_face(i) |