|
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) |