From 81d6c7b7723c12f1ff406e429cbe0fce22c4601a Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Tue, 7 Dec 2021 23:09:56 +0100 Subject: [PATCH 01/10] Add translucency, use VAOs and Syncs --- episode-11/chunk.py | 132 ++++++++++++++++-------------------- episode-11/frag.glsl | 5 +- episode-11/main.py | 48 +++++++------ episode-11/models/liquid.py | 1 + episode-11/subchunk.py | 86 +++++++++++------------ episode-11/world.py | 70 +++++++++++++++++-- 6 files changed, 191 insertions(+), 151 deletions(-) diff --git a/episode-11/chunk.py b/episode-11/chunk.py index 7bb7fff3..18cd5945 100644 --- a/episode-11/chunk.py +++ b/episode-11/chunk.py @@ -1,5 +1,4 @@ import ctypes -import math import pyglet.gl as gl @@ -35,30 +34,37 @@ def __init__(self, world, chunk_position): # mesh variables - self.mesh_vertex_positions = [] - self.mesh_tex_coords = [] - self.mesh_shading_values = [] + self.mesh = [] + self.translucent_mesh = [] - self.mesh_index_counter = 0 - self.mesh_indices = [] + self.mesh_quad_count = 0 + self.translucent_quad_count = 0 # create VAO and VBO's self.vao = gl.GLuint(0) - gl.glGenVertexArrays(1, self.vao) + gl.glGenVertexArrays(1, ctypes.byref(self.vao)) gl.glBindVertexArray(self.vao) - self.vertex_position_vbo = gl.GLuint(0) - gl.glGenBuffers(1, self.vertex_position_vbo) + self.vbo = gl.GLuint(0) + gl.glGenBuffers(1, ctypes.byref(self.vbo)) + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) - self.tex_coord_vbo = gl.GLuint(0) - gl.glGenBuffers(1, self.tex_coord_vbo) + gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, + gl.GL_FALSE, 7 * ctypes.sizeof(gl.GLfloat), 0) + gl.glEnableVertexAttribArray(0) + gl.glVertexAttribPointer(1, 3, gl.GL_FLOAT, + gl.GL_FALSE, 7 * ctypes.sizeof(gl.GLfloat), 3 * ctypes.sizeof(gl.GLfloat)) + gl.glEnableVertexAttribArray(1) + gl.glVertexAttribPointer(2, 1, gl.GL_FLOAT, + gl.GL_FALSE, 7 * ctypes.sizeof(gl.GLfloat), 6 * ctypes.sizeof(gl.GLfloat)) + gl.glEnableVertexAttribArray(2) - self.shading_values_vbo = gl.GLuint(0) - gl.glGenBuffers(1, self.shading_values_vbo) + gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, world.ibo) - self.ibo = gl.GLuint(0) - gl.glGenBuffers(1, self.ibo) + def __del__(self): + gl.glDeleteBuffers(1, ctypes.byref(self.vbo)) + gl.glDeleteVertexArrays(1, ctypes.byref(self.vao)) def update_subchunk_meshes(self): for subchunk_position in self.subchunks: @@ -74,9 +80,9 @@ def update_at_position(self, position): clx, cly, clz = self.world.get_local_position(position) - sx = math.floor(clx / subchunk.SUBCHUNK_WIDTH) - sy = math.floor(cly / subchunk.SUBCHUNK_HEIGHT) - sz = math.floor(clz / subchunk.SUBCHUNK_LENGTH) + sx = clx // subchunk.SUBCHUNK_WIDTH + sy = cly // subchunk.SUBCHUNK_HEIGHT + sz = clz // subchunk.SUBCHUNK_LENGTH self.subchunks[(sx, sy, sz)].update_mesh() @@ -96,88 +102,64 @@ def try_update_subchunk_mesh(subchunk_position): def update_mesh(self): # combine all the small subchunk meshes into one big chunk mesh - self.mesh_vertex_positions = [] - self.mesh_tex_coords = [] - self.mesh_shading_values = [] - - self.mesh_index_counter = 0 - self.mesh_indices = [] - for subchunk_position in self.subchunks: subchunk = self.subchunks[subchunk_position] - self.mesh_vertex_positions.extend(subchunk.mesh_vertex_positions) - self.mesh_tex_coords.extend(subchunk.mesh_tex_coords) - self.mesh_shading_values.extend(subchunk.mesh_shading_values) - - mesh_indices = [index + self.mesh_index_counter for index in subchunk.mesh_indices] - - self.mesh_indices.extend(mesh_indices) - self.mesh_index_counter += subchunk.mesh_index_counter + self.mesh.extend(subchunk.mesh) + self.translucent_mesh.extend(subchunk.translucent_mesh) # send the full mesh data to the GPU and free the memory used client-side (we don't need it anymore) # don't forget to save the length of 'self.mesh_indices' before freeing - self.mesh_indices_length = len(self.mesh_indices) - self.send_mesh_data_to_gpu() - - del self.mesh_vertex_positions - del self.mesh_tex_coords - del self.mesh_shading_values + self.mesh_quad_count = len(self.mesh) // 28 + self.translucent_quad_count = len(self.translucent_mesh) // 28 - del self.mesh_indices + self.send_mesh_data_to_gpu() + + self.mesh = [] + self.translucent_mesh = [] def send_mesh_data_to_gpu(self): # pass mesh data to gpu - if not self.mesh_index_counter: + if not self.mesh_quad_count: return + self.mesh.extend(self.translucent_mesh) + gl.glBindVertexArray(self.vao) - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vertex_position_vbo) + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) gl.glBufferData( gl.GL_ARRAY_BUFFER, - ctypes.sizeof(gl.GLfloat * len(self.mesh_vertex_positions)), - (gl.GLfloat * len(self.mesh_vertex_positions)) (*self.mesh_vertex_positions), - gl.GL_STATIC_DRAW) - - gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, gl.GL_FALSE, 0, 0) - gl.glEnableVertexAttribArray(0) + ctypes.sizeof(gl.GLfloat * len(self.mesh)), + (gl.GLfloat * len(self.mesh)) (*self.mesh), + gl.GL_DYNAMIC_DRAW) - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.tex_coord_vbo) - gl.glBufferData( - gl.GL_ARRAY_BUFFER, - ctypes.sizeof(gl.GLfloat * len(self.mesh_tex_coords)), - (gl.GLfloat * len(self.mesh_tex_coords)) (*self.mesh_tex_coords), - gl.GL_STATIC_DRAW) + gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.world.ibo) - gl.glVertexAttribPointer(1, 3, gl.GL_FLOAT, gl.GL_FALSE, 0, 0) - gl.glEnableVertexAttribArray(1) - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.shading_values_vbo) - gl.glBufferData( - gl.GL_ARRAY_BUFFER, - ctypes.sizeof(gl.GLfloat * len(self.mesh_shading_values)), - (gl.GLfloat * len(self.mesh_shading_values)) (*self.mesh_shading_values), - gl.GL_STATIC_DRAW) + def draw(self): + if not self.mesh_quad_count: + return - gl.glVertexAttribPointer(2, 1, gl.GL_FLOAT, gl.GL_FALSE, 0, 0) - gl.glEnableVertexAttribArray(2) + gl.glBindVertexArray(self.vao) - gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo) - gl.glBufferData( - gl.GL_ELEMENT_ARRAY_BUFFER, - ctypes.sizeof(gl.GLuint * self.mesh_indices_length), - (gl.GLuint * self.mesh_indices_length) (*self.mesh_indices), - gl.GL_STATIC_DRAW) + gl.glDrawElementsBaseVertex( + gl.GL_TRIANGLES, + self.mesh_quad_count * 6, + gl.GL_UNSIGNED_INT, + None, + 0) - def draw(self): - if not self.mesh_index_counter: + def draw_translucent(self): + if not self.translucent_quad_count: return gl.glBindVertexArray(self.vao) - gl.glDrawElements( + gl.glDrawElementsBaseVertex( gl.GL_TRIANGLES, - self.mesh_indices_length, + self.translucent_quad_count * 6, gl.GL_UNSIGNED_INT, - None) \ No newline at end of file + None, + self.mesh_quad_count * 4 + ) \ No newline at end of file diff --git a/episode-11/frag.glsl b/episode-11/frag.glsl index 46c3d2a2..3b3a8be0 100644 --- a/episode-11/frag.glsl +++ b/episode-11/frag.glsl @@ -10,9 +10,8 @@ in float interpolated_shading_value; void main(void) { vec4 texture_colour = texture(texture_array_sampler, interpolated_tex_coords); - fragment_colour = texture_colour * interpolated_shading_value; - - if (texture_colour.a == 0.0) { // discard if texel's alpha component is 0 (texel is transparent) + if (texture_colour.a < 0.5) { // discard if texel's alpha component is 0 (texel is transparent) discard; } + fragment_colour = texture_colour * interpolated_shading_value; } \ No newline at end of file diff --git a/episode-11/main.py b/episode-11/main.py index de946428..ff602d66 100644 --- a/episode-11/main.py +++ b/episode-11/main.py @@ -23,10 +23,6 @@ class Window(pyglet.window.Window): def __init__(self, **args): super().__init__(**args) - - # create world - - self.world = world.World() # create shader @@ -36,16 +32,38 @@ def __init__(self, **args): # pyglet stuff - pyglet.clock.schedule_interval(self.update, 1.0 / 10000) + pyglet.clock.schedule(self.update) self.mouse_captured = False # camera stuff self.camera = camera.Camera(self.shader, self.width, self.height) + # create world + + self.world = world.World(self.camera) + # misc stuff self.holding = 5 + + # bind textures + + gl.glActiveTexture(gl.GL_TEXTURE0) + gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.world.texture_manager.texture_array) + gl.glUniform1i(self.shader_sampler_location, 0) + + # enable cool stuff + + gl.glEnable(gl.GL_DEPTH_TEST) + gl.glEnable(gl.GL_CULL_FACE) + gl.glBlendFunc(gl.GL_SRC_COLOR, gl.GL_ONE_MINUS_SRC_COLOR) + + # Creating fence sync + self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) + + def __del__(self): + gl.glDeleteSync(self.fence) def update(self, delta_time): # print(f"FPS: {1.0 / delta_time}") @@ -58,22 +76,12 @@ def update(self, delta_time): def on_draw(self): self.camera.update_matrices() - # bind textures - - gl.glActiveTexture(gl.GL_TEXTURE0) - gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.world.texture_manager.texture_array) - gl.glUniform1i(self.shader_sampler_location, 0) - - # draw stuff - - gl.glEnable(gl.GL_DEPTH_TEST) - gl.glEnable(gl.GL_CULL_FACE) - gl.glClearColor(0.0, 0.0, 0.0, 0.0) self.clear() - self.world.draw() - gl.glFinish() + self.world.draw() + + gl.glClientWaitSync(self.fence, gl.GL_SYNC_FLUSH_COMMANDS_BIT, 16666667) # input functions @@ -154,8 +162,8 @@ def on_key_release(self, key, modifiers): class Game: def __init__(self): - self.config = gl.Config(major_version = 3, depth_size = 16) - self.window = Window(config = self.config, width = 800, height = 600, caption = "Minecraft clone", resizable = True, vsync = False) + self.config = gl.Config(double_buffer = True, major_version = 3, depth_size = 16) + self.window = Window(config = self.config, width = 854, height = 480, caption = "Minecraft clone", resizable = True, vsync = False) def run(self): pyglet.app.run() diff --git a/episode-11/models/liquid.py b/episode-11/models/liquid.py index 948ce298..b4ff32d2 100644 --- a/episode-11/models/liquid.py +++ b/episode-11/models/liquid.py @@ -1,6 +1,7 @@ # in the end, it'd be nice to have it so that liquids fill up the whole block when they have a block above them # this would avoid the problems this solution has +translucent = True transparent = True is_cube = True glass = True diff --git a/episode-11/subchunk.py b/episode-11/subchunk.py index 839a77dd..d0718725 100644 --- a/episode-11/subchunk.py +++ b/episode-11/subchunk.py @@ -21,40 +21,38 @@ def __init__(self, parent, subchunk_position): # mesh variables - self.mesh_vertex_positions = [] - self.mesh_tex_coords = [] - self.mesh_shading_values = [] - - self.mesh_index_counter = 0 - self.mesh_indices = [] + self.mesh = [] + self.translucent_mesh = [] - 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() + def add_face(self, face, pos, block_type): + x, y, z = pos + vertex_positions = block_type.vertex_positions[face] + tex_coords = block_type.tex_coords[face] + shading_values = block_type.shading_values[face] + + if hasattr(block_type.model, "translucent"): + mesh = self.translucent_mesh + else: + mesh = self.mesh + + for i in range(4): + mesh.append(vertex_positions[i * 3 + 0] + x) + mesh.append(vertex_positions[i * 3 + 1] + y) + mesh.append(vertex_positions[i * 3 + 2] + z) + + mesh.append(tex_coords[i * 3 + 0]) + mesh.append(tex_coords[i * 3 + 1]) + mesh.append(tex_coords[i * 3 + 2]) + + mesh.append(shading_values[i]) + + def can_render_face(self, glass, block_number, position): + return not (self.world.is_opaque_block(position) + or (glass and self.world.get_block_number(position) == block_number)) - 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]) + def update_mesh(self): + self.mesh = [] + self.translucent_mesh = [] for local_x in range(SUBCHUNK_WIDTH): for local_y in range(SUBCHUNK_HEIGHT): @@ -68,32 +66,24 @@ def add_face(face): if block_number: block_type = self.world.block_types[block_number] - x, y, z = ( + x, y, z = pos = ( 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 is cube, we want it to check neighbouring blocks so that we don't uselessly render faces # if block isn't a cube, we just want to render all faces, regardless of neighbouring blocks # since the vast majority of blocks are probably anyway going to be cubes, this won't impact performance all that much; the amount of useless faces drawn is going to be minimal 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) + if self.can_render_face(block_type.glass, block_number, (x + 1, y, z)): self.add_face(0, pos, block_type) + if self.can_render_face(block_type.glass, block_number, (x - 1, y, z)): self.add_face(1, pos, block_type) + if self.can_render_face(block_type.glass, block_number, (x, y + 1, z)): self.add_face(2, pos, block_type) + if self.can_render_face(block_type.glass, block_number, (x, y - 1, z)): self.add_face(3, pos, block_type) + if self.can_render_face(block_type.glass, block_number, (x, y, z + 1)): self.add_face(4, pos, block_type) + if self.can_render_face(block_type.glass, block_number, (x, y, z - 1)): self.add_face(5, pos, block_type) else: for i in range(len(block_type.vertex_positions)): - add_face(i) \ No newline at end of file + self.add_face(i, pos, block_type) \ No newline at end of file diff --git a/episode-11/world.py b/episode-11/world.py index 696fc078..c3ea6f41 100644 --- a/episode-11/world.py +++ b/episode-11/world.py @@ -7,12 +7,16 @@ import block_type import texture_manager +import pyglet.gl as gl +import ctypes + # import custom block models import models class World: - def __init__(self): + def __init__(self, camera): + self.camera = camera self.texture_manager = texture_manager.Texture_manager(16, 16, 256) self.block_types = [None] @@ -70,6 +74,30 @@ def __init__(self): self.texture_manager.generate_mipmaps() + chunk_indices = [] + + for nquad in range(chunk.CHUNK_WIDTH * chunk.CHUNK_HEIGHT * chunk.CHUNK_LENGTH * 8): + chunk_indices.append(4 * nquad + 0) + chunk_indices.append(4 * nquad + 1) + chunk_indices.append(4 * nquad + 2) + chunk_indices.append(4 * nquad + 0) + chunk_indices.append(4 * nquad + 2) + chunk_indices.append(4 * nquad + 3) + + print(len(chunk_indices)) + + self.ibo = gl.GLuint(0) + gl.glGenBuffers(1, ctypes.byref(self.ibo)) + gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo) + gl.glBufferData( + gl.GL_ELEMENT_ARRAY_BUFFER, + ctypes.sizeof(gl.GLuint * len(chunk_indices)), + (gl.GLuint * len(chunk_indices))(*chunk_indices), + gl.GL_STATIC_DRAW) + gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0) + + + # load the world self.save = save.Save(self) @@ -80,14 +108,19 @@ def __init__(self): for chunk_position in self.chunks: self.chunks[chunk_position].update_subchunk_meshes() self.chunks[chunk_position].update_mesh() + + del chunk_indices + + def __del__(self): + gl.glDeleteBuffers(1, ctypes.byref(self.ibo)) def get_chunk_position(self, position): x, y, z = position return ( - math.floor(x / chunk.CHUNK_WIDTH), - math.floor(y / chunk.CHUNK_HEIGHT), - math.floor(z / chunk.CHUNK_LENGTH)) + (x // chunk.CHUNK_WIDTH), + (y // chunk.CHUNK_HEIGHT), + (z // chunk.CHUNK_LENGTH)) def get_local_position(self, position): x, y, z = position @@ -157,6 +190,33 @@ def try_update_chunk_at_position(chunk_position, position): if lz == chunk.CHUNK_LENGTH - 1: try_update_chunk_at_position((cx, cy, cz + 1), (x, y, z + 1)) if lz == 0: try_update_chunk_at_position((cx, cy, cz - 1), (x, y, z - 1)) + def can_render_chunk(self, chunk_position, pl_c_pos): + rx, ry, rz = (chunk_position[0] - pl_c_pos[0]) \ + * math.cos(self.camera.rotation[0]) \ + * math.cos(self.camera.rotation[1]) , \ + (chunk_position[1] - pl_c_pos[1]) \ + * math.sin(self.camera.rotation[1]) , \ + (chunk_position[2] - pl_c_pos[2]) \ + * math.sin(self.camera.rotation[0]) \ + * math.cos(self.camera.rotation[1]) + return rx >= -1 and ry >= -1 and rz >= -1 + def draw(self): + player_floored_pos = tuple(self.camera.position) + player_chunk_pos = self.get_chunk_position(player_floored_pos) + for chunk_position in self.chunks: - self.chunks[chunk_position].draw() \ No newline at end of file + if self.can_render_chunk(chunk_position, player_chunk_pos): + self.chunks[chunk_position].draw() + + gl.glDisable(gl.GL_CULL_FACE) + gl.glEnable(gl.GL_BLEND) + gl.glDepthMask(gl.GL_FALSE) + + for chunk_position in self.chunks: + if self.can_render_chunk(chunk_position, player_chunk_pos): + self.chunks[chunk_position].draw_translucent() + + gl.glDepthMask(gl.GL_TRUE) + gl.glDisable(gl.GL_BLEND) + gl.glEnable(gl.GL_CULL_FACE) \ No newline at end of file From 0dbeac0bb9daa00dac71f0f92b1f3773115dd42e Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Tue, 7 Dec 2021 23:19:46 +0100 Subject: [PATCH 02/10] slight tweaks --- episode-11/chunk.py | 2 -- episode-11/models/button.py | 1 + episode-11/models/cactus.py | 1 + episode-11/models/crop.py | 1 + episode-11/models/cube.py | 1 + episode-11/models/door.py | 1 + episode-11/models/fire.py | 1 + episode-11/models/flat.py | 2 +- episode-11/models/glass.py | 2 +- episode-11/models/ladder.py | 2 +- episode-11/models/leaves.py | 1 + episode-11/models/lever.py | 1 + episode-11/models/plant.py | 1 + episode-11/models/pressure_plate.py | 1 + episode-11/models/sign.py | 1 + episode-11/models/sign_post.py | 1 + episode-11/models/slab.py | 1 + episode-11/models/snow.py | 1 + episode-11/models/soil.py | 1 + episode-11/models/stairs.py | 1 + episode-11/models/torch.py | 1 + episode-11/subchunk.py | 2 +- 22 files changed, 21 insertions(+), 6 deletions(-) diff --git a/episode-11/chunk.py b/episode-11/chunk.py index 18cd5945..4cc03629 100644 --- a/episode-11/chunk.py +++ b/episode-11/chunk.py @@ -134,8 +134,6 @@ def send_mesh_data_to_gpu(self): # pass mesh data to gpu (gl.GLfloat * len(self.mesh)) (*self.mesh), gl.GL_DYNAMIC_DRAW) - gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.world.ibo) - def draw(self): if not self.mesh_quad_count: diff --git a/episode-11/models/button.py b/episode-11/models/button.py index 67502779..cec02833 100644 --- a/episode-11/models/button.py +++ b/episode-11/models/button.py @@ -1,3 +1,4 @@ +translucent = False transparent = True is_cube = False glass = False diff --git a/episode-11/models/cactus.py b/episode-11/models/cactus.py index 8fb6e407..b049b4fb 100644 --- a/episode-11/models/cactus.py +++ b/episode-11/models/cactus.py @@ -1,3 +1,4 @@ +translucent = False transparent = True is_cube = False glass = False diff --git a/episode-11/models/crop.py b/episode-11/models/crop.py index 73d699b5..fd377819 100644 --- a/episode-11/models/crop.py +++ b/episode-11/models/crop.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [ 0.25, 0.4375, 0.50, 0.25, -0.5625, 0.50, 0.25, -0.5625, -0.50, 0.25, 0.4375, -0.50], # right diff --git a/episode-11/models/cube.py b/episode-11/models/cube.py index 89361993..184033fc 100644 --- a/episode-11/models/cube.py +++ b/episode-11/models/cube.py @@ -1,6 +1,7 @@ transparent = False is_cube = True glass = False +translucent = False vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right diff --git a/episode-11/models/door.py b/episode-11/models/door.py index 89361993..184033fc 100644 --- a/episode-11/models/door.py +++ b/episode-11/models/door.py @@ -1,6 +1,7 @@ transparent = False is_cube = True glass = False +translucent = False vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right diff --git a/episode-11/models/fire.py b/episode-11/models/fire.py index 39a7d923..a80d50c2 100644 --- a/episode-11/models/fire.py +++ b/episode-11/models/fire.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/flat.py b/episode-11/models/flat.py index 9addf96d..863960f6 100644 --- a/episode-11/models/flat.py +++ b/episode-11/models/flat.py @@ -1,7 +1,7 @@ transparent = True is_cube = False glass = False - +translucent = False vertex_positions = [ [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top [-0.5, -0.4375, 0.5, -0.5, -0.4375, -0.5, 0.5, -0.4375, -0.5, 0.5, -0.4375, 0.5], # bottom diff --git a/episode-11/models/glass.py b/episode-11/models/glass.py index 2f54df74..826d3e6a 100644 --- a/episode-11/models/glass.py +++ b/episode-11/models/glass.py @@ -1,7 +1,7 @@ transparent = True is_cube = True glass = True - +translucent = False vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right [-0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5], # left diff --git a/episode-11/models/ladder.py b/episode-11/models/ladder.py index 39a7d923..4d5a99c4 100644 --- a/episode-11/models/ladder.py +++ b/episode-11/models/ladder.py @@ -1,7 +1,7 @@ transparent = True is_cube = False glass = False - +translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], [-0.3536, 0.5000, -0.3536, -0.3536, -0.5000, -0.3536, 0.3536, -0.5000, 0.3536, 0.3536, 0.5000, 0.3536], diff --git a/episode-11/models/leaves.py b/episode-11/models/leaves.py index 9c10ec46..dfc86c88 100644 --- a/episode-11/models/leaves.py +++ b/episode-11/models/leaves.py @@ -1,6 +1,7 @@ transparent = True is_cube = True glass = False +translucent = False vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right diff --git a/episode-11/models/lever.py b/episode-11/models/lever.py index 67502779..66257452 100644 --- a/episode-11/models/lever.py +++ b/episode-11/models/lever.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right diff --git a/episode-11/models/plant.py b/episode-11/models/plant.py index 39a7d923..a80d50c2 100644 --- a/episode-11/models/plant.py +++ b/episode-11/models/plant.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/pressure_plate.py b/episode-11/models/pressure_plate.py index 9addf96d..d25ecd9f 100644 --- a/episode-11/models/pressure_plate.py +++ b/episode-11/models/pressure_plate.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top diff --git a/episode-11/models/sign.py b/episode-11/models/sign.py index 39a7d923..a80d50c2 100644 --- a/episode-11/models/sign.py +++ b/episode-11/models/sign.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/sign_post.py b/episode-11/models/sign_post.py index 39a7d923..a80d50c2 100644 --- a/episode-11/models/sign_post.py +++ b/episode-11/models/sign_post.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/slab.py b/episode-11/models/slab.py index 67502779..66257452 100644 --- a/episode-11/models/slab.py +++ b/episode-11/models/slab.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right diff --git a/episode-11/models/snow.py b/episode-11/models/snow.py index 9addf96d..d25ecd9f 100644 --- a/episode-11/models/snow.py +++ b/episode-11/models/snow.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top diff --git a/episode-11/models/soil.py b/episode-11/models/soil.py index 301b5b71..af5bb98a 100644 --- a/episode-11/models/soil.py +++ b/episode-11/models/soil.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [ 0.5, 0.4375, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.4375, -0.5], # right diff --git a/episode-11/models/stairs.py b/episode-11/models/stairs.py index 67502779..66257452 100644 --- a/episode-11/models/stairs.py +++ b/episode-11/models/stairs.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right diff --git a/episode-11/models/torch.py b/episode-11/models/torch.py index 9224655c..75239771 100644 --- a/episode-11/models/torch.py +++ b/episode-11/models/torch.py @@ -1,6 +1,7 @@ transparent = True is_cube = False glass = False +translucent = False vertex_positions = [ [ 0.0625, 0.5, 0.5, 0.0625, -0.5, 0.5, 0.0625, -0.5, -0.5, 0.0625, 0.5, -0.5], # right diff --git a/episode-11/subchunk.py b/episode-11/subchunk.py index d0718725..0c06f2ae 100644 --- a/episode-11/subchunk.py +++ b/episode-11/subchunk.py @@ -30,7 +30,7 @@ def add_face(self, face, pos, block_type): tex_coords = block_type.tex_coords[face] shading_values = block_type.shading_values[face] - if hasattr(block_type.model, "translucent"): + if block_type.model.translucent: mesh = self.translucent_mesh else: mesh = self.mesh From 10f0e19d71e870d81884bb02801e158f029ac1cb Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Wed, 8 Dec 2021 14:06:16 +0100 Subject: [PATCH 03/10] Tweaked fence syncs --- episode-11/main.py | 15 ++++++--------- episode-11/models/flat.py | 1 + episode-11/models/glass.py | 1 + episode-11/models/ladder.py | 1 + 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/episode-11/main.py b/episode-11/main.py index ff602d66..c99e5bab 100644 --- a/episode-11/main.py +++ b/episode-11/main.py @@ -58,15 +58,9 @@ def __init__(self, **args): gl.glEnable(gl.GL_DEPTH_TEST) gl.glEnable(gl.GL_CULL_FACE) gl.glBlendFunc(gl.GL_SRC_COLOR, gl.GL_ONE_MINUS_SRC_COLOR) - - # Creating fence sync - self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) - - def __del__(self): - gl.glDeleteSync(self.fence) def update(self, delta_time): - # print(f"FPS: {1.0 / delta_time}") + print(pyglet.clock.get_fps()) if not self.mouse_captured: self.camera.input = [0, 0, 0] @@ -80,8 +74,11 @@ def on_draw(self): self.clear() self.world.draw() - - gl.glClientWaitSync(self.fence, gl.GL_SYNC_FLUSH_COMMANDS_BIT, 16666667) + + # Not really necessary tbf + fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) + gl.glClientWaitSync(fence, gl.GL_SYNC_FLUSH_COMMANDS_BIT, 8333333) + gl.glDeleteSync(fence) # input functions diff --git a/episode-11/models/flat.py b/episode-11/models/flat.py index 863960f6..d25ecd9f 100644 --- a/episode-11/models/flat.py +++ b/episode-11/models/flat.py @@ -2,6 +2,7 @@ is_cube = False glass = False translucent = False + vertex_positions = [ [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top [-0.5, -0.4375, 0.5, -0.5, -0.4375, -0.5, 0.5, -0.4375, -0.5, 0.5, -0.4375, 0.5], # bottom diff --git a/episode-11/models/glass.py b/episode-11/models/glass.py index 826d3e6a..9c0f6df6 100644 --- a/episode-11/models/glass.py +++ b/episode-11/models/glass.py @@ -2,6 +2,7 @@ is_cube = True glass = True translucent = False + vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right [-0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5], # left diff --git a/episode-11/models/ladder.py b/episode-11/models/ladder.py index 4d5a99c4..a80d50c2 100644 --- a/episode-11/models/ladder.py +++ b/episode-11/models/ladder.py @@ -2,6 +2,7 @@ is_cube = False glass = False translucent = False + vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], [-0.3536, 0.5000, -0.3536, -0.3536, -0.5000, -0.3536, 0.3536, -0.5000, 0.3536, 0.3536, 0.5000, 0.3536], From 835d86fee578e84bba73e9f9f5ffc58cf9b92ef6 Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:12:33 +0100 Subject: [PATCH 04/10] Reduced the number of vertex attribute to 6 by hardcoding texture UV on the vertex shader --- episode-11/block_type.py | 14 ++++++-------- episode-11/camera.py | 5 +++-- episode-11/chunk.py | 12 ++++++------ episode-11/main.py | 3 ++- episode-11/matrix.py | 6 +++--- episode-11/models/cube.py | 1 + episode-11/subchunk.py | 7 +++---- episode-11/vert.glsl | 12 ++++++++++-- 8 files changed, 34 insertions(+), 26 deletions(-) diff --git a/episode-11/block_type.py b/episode-11/block_type.py index f010fc2b..131b479b 100644 --- a/episode-11/block_type.py +++ b/episode-11/block_type.py @@ -16,18 +16,16 @@ def __init__(self, texture_manager, name = "unknown", block_face_textures = {"al # replace data contained in numbers.py with model specific data self.vertex_positions = model.vertex_positions - self.tex_coords = model.tex_coords.copy() + self.tex_coords = model.tex_coords # to deprecate + self.tex_indices = [0] * len(self.tex_coords) self.shading_values = model.shading_values def set_block_face(face, texture): - # make sure we don't add inexistent faces + # make sure we don't add inexistent face if face > len(self.tex_coords) - 1: return - - self.tex_coords[face] = self.tex_coords[face].copy() - - for vertex in range(4): - self.tex_coords[face][vertex * 3 + 2] = texture + self.tex_indices[face] = texture + print("Appended texture", texture, "for block", name) for face in block_face_textures: texture = block_face_textures[face] @@ -36,7 +34,7 @@ def set_block_face(face, texture): texture_index = texture_manager.textures.index(texture) if face == "all": - for i in range(len(self.tex_coords)): + for i in range(6): set_block_face(i, texture_index) elif face == "sides": diff --git a/episode-11/camera.py b/episode-11/camera.py index 2e7ba4c3..4af5e7a2 100644 --- a/episode-11/camera.py +++ b/episode-11/camera.py @@ -13,6 +13,7 @@ def __init__(self, shader, width, height): self.mv_matrix = matrix.Matrix() self.p_matrix = matrix.Matrix() + self.mvp_matrix = matrix.Matrix() # shaders @@ -58,5 +59,5 @@ def update_matrices(self): # modelviewprojection matrix - mvp_matrix = self.p_matrix * self.mv_matrix - self.shader.uniform_matrix(self.shader_matrix_location, mvp_matrix) \ No newline at end of file + self.mvp_matrix = self.p_matrix * self.mv_matrix + self.shader.uniform_matrix(self.shader_matrix_location, self.mvp_matrix) \ No newline at end of file diff --git a/episode-11/chunk.py b/episode-11/chunk.py index 4cc03629..2c14abff 100644 --- a/episode-11/chunk.py +++ b/episode-11/chunk.py @@ -51,13 +51,13 @@ def __init__(self, world, chunk_position): gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, - gl.GL_FALSE, 7 * ctypes.sizeof(gl.GLfloat), 0) + gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 0) gl.glEnableVertexAttribArray(0) - gl.glVertexAttribPointer(1, 3, gl.GL_FLOAT, - gl.GL_FALSE, 7 * ctypes.sizeof(gl.GLfloat), 3 * ctypes.sizeof(gl.GLfloat)) + gl.glVertexAttribPointer(1, 2, gl.GL_FLOAT, + gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 3 * ctypes.sizeof(gl.GLfloat)) gl.glEnableVertexAttribArray(1) gl.glVertexAttribPointer(2, 1, gl.GL_FLOAT, - gl.GL_FALSE, 7 * ctypes.sizeof(gl.GLfloat), 6 * ctypes.sizeof(gl.GLfloat)) + gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 5 * ctypes.sizeof(gl.GLfloat)) gl.glEnableVertexAttribArray(2) gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, world.ibo) @@ -111,8 +111,8 @@ def update_mesh(self): # send the full mesh data to the GPU and free the memory used client-side (we don't need it anymore) # don't forget to save the length of 'self.mesh_indices' before freeing - self.mesh_quad_count = len(self.mesh) // 28 - self.translucent_quad_count = len(self.translucent_mesh) // 28 + self.mesh_quad_count = len(self.mesh) // 24 + self.translucent_quad_count = len(self.translucent_mesh) // 24 self.send_mesh_data_to_gpu() diff --git a/episode-11/main.py b/episode-11/main.py index c99e5bab..6b678e66 100644 --- a/episode-11/main.py +++ b/episode-11/main.py @@ -13,6 +13,7 @@ import shader import camera + import block_type import texture_manager @@ -60,7 +61,7 @@ def __init__(self, **args): gl.glBlendFunc(gl.GL_SRC_COLOR, gl.GL_ONE_MINUS_SRC_COLOR) def update(self, delta_time): - print(pyglet.clock.get_fps()) + # print(pyglet.clock.get_fps()) if not self.mouse_captured: self.camera.input = [0, 0, 0] diff --git a/episode-11/matrix.py b/episode-11/matrix.py index f2a5c61c..f55d95c4 100644 --- a/episode-11/matrix.py +++ b/episode-11/matrix.py @@ -43,9 +43,9 @@ def __imul__(self, matrix): self.data = multiply_matrices(self.data, matrix.data) def scale(self, x, y, z): - for i in range(4): self.data[0][i] *= scale_x - for i in range(4): self.data[1][i] *= scale_y - for i in range(4): self.data[2][i] *= scale_z + for i in range(4): self.data[0][i] *= x + for i in range(4): self.data[1][i] *= y + for i in range(4): self.data[2][i] *= z def translate(self, x, y, z): for i in range(4): diff --git a/episode-11/models/cube.py b/episode-11/models/cube.py index 184033fc..e80d6a75 100644 --- a/episode-11/models/cube.py +++ b/episode-11/models/cube.py @@ -12,6 +12,7 @@ [ 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5], # back ] +# Deprecating tex_coords = [ [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], diff --git a/episode-11/subchunk.py b/episode-11/subchunk.py index 0c06f2ae..22403fec 100644 --- a/episode-11/subchunk.py +++ b/episode-11/subchunk.py @@ -27,7 +27,7 @@ def __init__(self, parent, subchunk_position): def add_face(self, face, pos, block_type): x, y, z = pos vertex_positions = block_type.vertex_positions[face] - tex_coords = block_type.tex_coords[face] + tex_index = block_type.tex_indices[face] shading_values = block_type.shading_values[face] if block_type.model.translucent: @@ -40,9 +40,8 @@ def add_face(self, face, pos, block_type): mesh.append(vertex_positions[i * 3 + 1] + y) mesh.append(vertex_positions[i * 3 + 2] + z) - mesh.append(tex_coords[i * 3 + 0]) - mesh.append(tex_coords[i * 3 + 1]) - mesh.append(tex_coords[i * 3 + 2]) + mesh.append(i) + mesh.append(tex_index) mesh.append(shading_values[i]) diff --git a/episode-11/vert.glsl b/episode-11/vert.glsl index 5a945d25..a8d1cb72 100644 --- a/episode-11/vert.glsl +++ b/episode-11/vert.glsl @@ -1,18 +1,26 @@ #version 330 layout(location = 0) in vec3 vertex_position; -layout(location = 1) in vec3 tex_coords; +layout(location = 1) in vec2 texture_pointer; layout(location = 2) in float shading_value; + out vec3 local_position; out vec3 interpolated_tex_coords; out float interpolated_shading_value; uniform mat4 matrix; +vec2 texture_UV[4] = { + vec2(0.0, 1.0), + vec2(0.0, 0.0), + vec2(1.0, 0.0), + vec2(1.0, 1.0) +}; + void main(void) { local_position = vertex_position; - interpolated_tex_coords = tex_coords; + interpolated_tex_coords = vec3(texture_UV[int(texture_pointer[0])], texture_pointer[1]); interpolated_shading_value = shading_value; gl_Position = matrix * vec4(vertex_position, 1.0); } \ No newline at end of file From 7814f24ea2f5c060dcc3e5f1df14575f517612b8 Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:24:56 +0100 Subject: [PATCH 05/10] small fix --- episode-11/block_type.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/episode-11/block_type.py b/episode-11/block_type.py index 131b479b..61419122 100644 --- a/episode-11/block_type.py +++ b/episode-11/block_type.py @@ -34,7 +34,7 @@ def set_block_face(face, texture): texture_index = texture_manager.textures.index(texture) if face == "all": - for i in range(6): + for i in range(len(self.tex_coords)): set_block_face(i, texture_index) elif face == "sides": From 153d6bd198f3b8ad8dcbdde7754d03b7edf89c73 Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Wed, 8 Dec 2021 20:12:12 +0100 Subject: [PATCH 06/10] Fix crash due to C-style intialization --- episode-11/vert.glsl | 50 ++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/episode-11/vert.glsl b/episode-11/vert.glsl index a8d1cb72..4dd5bc8e 100644 --- a/episode-11/vert.glsl +++ b/episode-11/vert.glsl @@ -1,26 +1,26 @@ -#version 330 - -layout(location = 0) in vec3 vertex_position; -layout(location = 1) in vec2 texture_pointer; -layout(location = 2) in float shading_value; - - -out vec3 local_position; -out vec3 interpolated_tex_coords; -out float interpolated_shading_value; - -uniform mat4 matrix; - -vec2 texture_UV[4] = { - vec2(0.0, 1.0), - vec2(0.0, 0.0), - vec2(1.0, 0.0), - vec2(1.0, 1.0) -}; - -void main(void) { - local_position = vertex_position; - interpolated_tex_coords = vec3(texture_UV[int(texture_pointer[0])], texture_pointer[1]); - interpolated_shading_value = shading_value; - gl_Position = matrix * vec4(vertex_position, 1.0); +#version 330 + +layout(location = 0) in vec3 vertex_position; +layout(location = 1) in vec2 texture_pointer; +layout(location = 2) in float shading_value; + + +out vec3 local_position; +out vec3 interpolated_tex_coords; +out float interpolated_shading_value; + +uniform mat4 matrix; + +vec2 texture_UV[4] = vec2[4]( + vec2(0.0, 1.0), + vec2(0.0, 0.0), + vec2(1.0, 0.0), + vec2(1.0, 1.0) +); + +void main(void) { + local_position = vertex_position; + interpolated_tex_coords = vec3(texture_UV[int(texture_pointer[0])], texture_pointer[1]); + interpolated_shading_value = shading_value; + gl_Position = matrix * vec4(vertex_position, 1.0); } \ No newline at end of file From 32653aa022131b54c2f6a15fa183822a274aab03 Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Sat, 11 Dec 2021 13:42:10 +0100 Subject: [PATCH 07/10] Done several fixes, fixed translucency and added some options --- episode-11/block_type.py | 2 +- episode-11/camera.py | 2 +- episode-11/chunk.py | 7 +++-- episode-11/frag.glsl | 16 +++++----- episode-11/main.py | 24 +++++++++------ episode-11/matrix.py | 1 - episode-11/options.py | 7 +++++ episode-11/render_region.py | 13 ++++++++ episode-11/subchunk.py | 26 ++++++++++------ episode-11/texture_manager.py | 4 +-- episode-11/vert.glsl | 24 +++++++-------- episode-11/world.py | 58 +++++++++++++++++++++++++---------- 12 files changed, 122 insertions(+), 62 deletions(-) create mode 100644 episode-11/options.py create mode 100644 episode-11/render_region.py diff --git a/episode-11/block_type.py b/episode-11/block_type.py index 61419122..e39015b2 100644 --- a/episode-11/block_type.py +++ b/episode-11/block_type.py @@ -12,6 +12,7 @@ def __init__(self, texture_manager, name = "unknown", block_face_textures = {"al self.transparent = model.transparent self.is_cube = model.is_cube self.glass = model.glass + self.translucent = model.translucent # replace data contained in numbers.py with model specific data @@ -25,7 +26,6 @@ def set_block_face(face, texture): if face > len(self.tex_coords) - 1: return self.tex_indices[face] = texture - print("Appended texture", texture, "for block", name) for face in block_face_textures: texture = block_face_textures[face] diff --git a/episode-11/camera.py b/episode-11/camera.py index 4af5e7a2..2dfb5d56 100644 --- a/episode-11/camera.py +++ b/episode-11/camera.py @@ -18,7 +18,7 @@ def __init__(self, shader, width, height): # shaders self.shader = shader - self.shader_matrix_location = self.shader.find_uniform(b"matrix") + self.shader_matrix_location = self.shader.find_uniform(b"u_ModelViewProjMatrix") # camera variables diff --git a/episode-11/chunk.py b/episode-11/chunk.py index 2c14abff..eedd8ede 100644 --- a/episode-11/chunk.py +++ b/episode-11/chunk.py @@ -49,6 +49,7 @@ def __init__(self, world, chunk_position): self.vbo = gl.GLuint(0) gl.glGenBuffers(1, ctypes.byref(self.vbo)) gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) + gl.glBufferData(gl.GL_ARRAY_BUFFER, ctypes.sizeof(gl.GLfloat * CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_LENGTH * 8), None, gl.GL_DYNAMIC_DRAW) gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 0) @@ -128,11 +129,11 @@ def send_mesh_data_to_gpu(self): # pass mesh data to gpu gl.glBindVertexArray(self.vao) gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) - gl.glBufferData( + gl.glBufferSubData( gl.GL_ARRAY_BUFFER, + 0, ctypes.sizeof(gl.GLfloat * len(self.mesh)), - (gl.GLfloat * len(self.mesh)) (*self.mesh), - gl.GL_DYNAMIC_DRAW) + (gl.GLfloat * len(self.mesh)) (*self.mesh)) def draw(self): diff --git a/episode-11/frag.glsl b/episode-11/frag.glsl index 3b3a8be0..25c93cce 100644 --- a/episode-11/frag.glsl +++ b/episode-11/frag.glsl @@ -1,17 +1,17 @@ #version 330 -out vec4 fragment_colour; +out vec4 fragColor; -uniform sampler2DArray texture_array_sampler; +uniform sampler2DArray u_TextureArraySampler; -in vec3 local_position; -in vec3 interpolated_tex_coords; -in float interpolated_shading_value; +in vec3 v_Position; +in vec3 v_TexCoords; +in float v_LightMultiplier; void main(void) { - vec4 texture_colour = texture(texture_array_sampler, interpolated_tex_coords); - if (texture_colour.a < 0.5) { // discard if texel's alpha component is 0 (texel is transparent) + vec4 textureColor = texture(u_TextureArraySampler, v_TexCoords); + if (textureColor.a < 0.5) { // discard if texel's alpha component is 0 (texel is transparent) discard; } - fragment_colour = texture_colour * interpolated_shading_value; + fragColor = textureColor * v_LightMultiplier; } \ No newline at end of file diff --git a/episode-11/main.py b/episode-11/main.py index 6b678e66..7bd61916 100644 --- a/episode-11/main.py +++ b/episode-11/main.py @@ -1,6 +1,5 @@ import math -import ctypes import random import pyglet @@ -9,7 +8,6 @@ import pyglet.gl as gl -import matrix import shader import camera @@ -28,7 +26,7 @@ def __init__(self, **args): # create shader self.shader = shader.Shader("vert.glsl", "frag.glsl") - self.shader_sampler_location = self.shader.find_uniform(b"texture_array_sampler") + self.shader_sampler_location = self.shader.find_uniform(b"u_TextureArraySampler") self.shader.use() # pyglet stuff @@ -59,6 +57,10 @@ def __init__(self, **args): gl.glEnable(gl.GL_DEPTH_TEST) gl.glEnable(gl.GL_CULL_FACE) gl.glBlendFunc(gl.GL_SRC_COLOR, gl.GL_ONE_MINUS_SRC_COLOR) + + # Sync status: + self.status = gl.GL_CONDITION_SATISFIED + self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) def update(self, delta_time): # print(pyglet.clock.get_fps()) @@ -71,15 +73,17 @@ def update(self, delta_time): def on_draw(self): self.camera.update_matrices() + self.status = gl.glClientWaitSync(self.fence, gl.GL_SYNC_FLUSH_COMMANDS_BIT, 2985984) + gl.glDeleteSync(self.fence) + gl.glClearColor(0.0, 0.0, 0.0, 0.0) self.clear() self.world.draw() - # Not really necessary tbf - fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) - gl.glClientWaitSync(fence, gl.GL_SYNC_FLUSH_COMMANDS_BIT, 8333333) - gl.glDeleteSync(fence) + self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) + gl.glFlush() + # input functions @@ -160,10 +164,12 @@ def on_key_release(self, key, modifiers): class Game: def __init__(self): - self.config = gl.Config(double_buffer = True, major_version = 3, depth_size = 16) + self.config = gl.Config(double_buffer = True, + major_version = 3, minor_version = 3, + depth_size = 16) self.window = Window(config = self.config, width = 854, height = 480, caption = "Minecraft clone", resizable = True, vsync = False) - def run(self): + def run(self): pyglet.app.run() if __name__ == "__main__": diff --git a/episode-11/matrix.py b/episode-11/matrix.py index f55d95c4..7210217a 100644 --- a/episode-11/matrix.py +++ b/episode-11/matrix.py @@ -1,6 +1,5 @@ import copy -import ctypes import math def copy_matrix(matrix): diff --git a/episode-11/options.py b/episode-11/options.py new file mode 100644 index 00000000..2f12f1f5 --- /dev/null +++ b/episode-11/options.py @@ -0,0 +1,7 @@ +# FAST = 0; FANCY = 1 +import pyglet.gl as gl + + +TRANSLUCENT_BLENDING = 1 +ALTERNATE_BLOCKS = False # True is in WIP +MIPMAP_TYPE = gl.GL_LINEAR_MIPMAP_LINEAR \ No newline at end of file diff --git a/episode-11/render_region.py b/episode-11/render_region.py new file mode 100644 index 00000000..fb068ecb --- /dev/null +++ b/episode-11/render_region.py @@ -0,0 +1,13 @@ +import chunk + +# Work in Progress # + +import pyglet.gl as gl + +class RenderRegion: + def __init__(self, chunks): + self.chunks = chunks + def build_draw_batch(): + pass + def draw(): + gl.glMultiDrawElementsBaseVertex() \ No newline at end of file diff --git a/episode-11/subchunk.py b/episode-11/subchunk.py index 22403fec..eb2e903f 100644 --- a/episode-11/subchunk.py +++ b/episode-11/subchunk.py @@ -1,3 +1,6 @@ +import options +import random + SUBCHUNK_WIDTH = 4 SUBCHUNK_HEIGHT = 4 SUBCHUNK_LENGTH = 4 @@ -25,6 +28,9 @@ def __init__(self, parent, subchunk_position): self.translucent_mesh = [] def add_face(self, face, pos, block_type): + rotation = 0 + if options.ALTERNATE_BLOCKS and block_type.is_cube and not block_type.transparent: + rotation = random.randint(0, 3) x, y, z = pos vertex_positions = block_type.vertex_positions[face] tex_index = block_type.tex_indices[face] @@ -40,14 +46,16 @@ def add_face(self, face, pos, block_type): mesh.append(vertex_positions[i * 3 + 1] + y) mesh.append(vertex_positions[i * 3 + 2] + z) - mesh.append(i) + mesh.append((i + rotation) % 4) mesh.append(tex_index) mesh.append(shading_values[i]) - def can_render_face(self, glass, block_number, position): + def can_render_face(self, block_type, block_number, position): return not (self.world.is_opaque_block(position) - or (glass and self.world.get_block_number(position) == block_number)) + or (block_type.glass and self.world.get_block_number(position) == block_number)) \ + or (block_type.translucent and self.world.get_block_number(position) != block_number) + def update_mesh(self): self.mesh = [] @@ -76,12 +84,12 @@ def update_mesh(self): # since the vast majority of blocks are probably anyway going to be cubes, this won't impact performance all that much; the amount of useless faces drawn is going to be minimal if block_type.is_cube: - if self.can_render_face(block_type.glass, block_number, (x + 1, y, z)): self.add_face(0, pos, block_type) - if self.can_render_face(block_type.glass, block_number, (x - 1, y, z)): self.add_face(1, pos, block_type) - if self.can_render_face(block_type.glass, block_number, (x, y + 1, z)): self.add_face(2, pos, block_type) - if self.can_render_face(block_type.glass, block_number, (x, y - 1, z)): self.add_face(3, pos, block_type) - if self.can_render_face(block_type.glass, block_number, (x, y, z + 1)): self.add_face(4, pos, block_type) - if self.can_render_face(block_type.glass, block_number, (x, y, z - 1)): self.add_face(5, pos, block_type) + if self.can_render_face(block_type, block_number, (x + 1, y, z)): self.add_face(0, pos, block_type) + if self.can_render_face(block_type, block_number, (x - 1, y, z)): self.add_face(1, pos, block_type) + if self.can_render_face(block_type, block_number, (x, y + 1, z)): self.add_face(2, pos, block_type) + if self.can_render_face(block_type, block_number, (x, y - 1, z)): self.add_face(3, pos, block_type) + if self.can_render_face(block_type, block_number, (x, y, z + 1)): self.add_face(4, pos, block_type) + if self.can_render_face(block_type, block_number, (x, y, z - 1)): self.add_face(5, pos, block_type) else: for i in range(len(block_type.vertex_positions)): diff --git a/episode-11/texture_manager.py b/episode-11/texture_manager.py index 6cfc9fdf..7d326dec 100644 --- a/episode-11/texture_manager.py +++ b/episode-11/texture_manager.py @@ -1,4 +1,4 @@ -import ctypes +import options import pyglet import pyglet.gl as gl @@ -16,7 +16,7 @@ def __init__(self, texture_width, texture_height, max_textures): gl.glGenTextures(1, self.texture_array) gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.texture_array) - gl.glTexParameteri(gl.GL_TEXTURE_2D_ARRAY, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST) + gl.glTexParameteri(gl.GL_TEXTURE_2D_ARRAY, gl.GL_TEXTURE_MIN_FILTER, options.MIPMAP_TYPE) gl.glTexParameteri(gl.GL_TEXTURE_2D_ARRAY, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST) gl.glTexImage3D( diff --git a/episode-11/vert.glsl b/episode-11/vert.glsl index 4dd5bc8e..630e1724 100644 --- a/episode-11/vert.glsl +++ b/episode-11/vert.glsl @@ -1,17 +1,17 @@ #version 330 -layout(location = 0) in vec3 vertex_position; -layout(location = 1) in vec2 texture_pointer; -layout(location = 2) in float shading_value; +layout(location = 0) in vec3 a_Position; +layout(location = 1) in vec2 a_TextureFetcher; +layout(location = 2) in float a_LightMultiplier; -out vec3 local_position; -out vec3 interpolated_tex_coords; -out float interpolated_shading_value; +out vec3 v_Position; +out vec3 v_TexCoords; +out float v_LightMultiplier; -uniform mat4 matrix; +uniform mat4 u_ModelViewProjMatrix; -vec2 texture_UV[4] = vec2[4]( +const vec2 texture_UV[4] = const vec2[4]( vec2(0.0, 1.0), vec2(0.0, 0.0), vec2(1.0, 0.0), @@ -19,8 +19,8 @@ vec2 texture_UV[4] = vec2[4]( ); void main(void) { - local_position = vertex_position; - interpolated_tex_coords = vec3(texture_UV[int(texture_pointer[0])], texture_pointer[1]); - interpolated_shading_value = shading_value; - gl_Position = matrix * vec4(vertex_position, 1.0); + v_Position = a_Position; + v_TexCoords = vec3(texture_UV[int(a_TextureFetcher[0])], a_TextureFetcher[1]); + v_LightMultiplier = a_LightMultiplier; + gl_Position = u_ModelViewProjMatrix * vec4(a_Position, 1.0); } \ No newline at end of file diff --git a/episode-11/world.py b/episode-11/world.py index c3ea6f41..4e59316b 100644 --- a/episode-11/world.py +++ b/episode-11/world.py @@ -1,18 +1,17 @@ -import math -import random - -import save import chunk +import ctypes +import math -import block_type -import texture_manager import pyglet.gl as gl -import ctypes +import block_type +import models +import save +import texture_manager +import options # import custom block models -import models class World: def __init__(self, camera): @@ -201,22 +200,49 @@ def can_render_chunk(self, chunk_position, pl_c_pos): * math.cos(self.camera.rotation[1]) return rx >= -1 and ry >= -1 and rz >= -1 - def draw(self): - player_floored_pos = tuple(self.camera.position) - player_chunk_pos = self.get_chunk_position(player_floored_pos) + def draw_translucent_fast(self, player_chunk_pos): + gl.glDisable(gl.GL_CULL_FACE) + gl.glEnable(gl.GL_BLEND) + gl.glDepthMask(gl.GL_FALSE) for chunk_position in self.chunks: if self.can_render_chunk(chunk_position, player_chunk_pos): - self.chunks[chunk_position].draw() + self.chunks[chunk_position].draw_translucent() + + gl.glDepthMask(gl.GL_TRUE) + gl.glDisable(gl.GL_BLEND) + gl.glEnable(gl.GL_CULL_FACE) - gl.glDisable(gl.GL_CULL_FACE) - gl.glEnable(gl.GL_BLEND) + def draw_translucent_fancy(self, player_chunk_pos): gl.glDepthMask(gl.GL_FALSE) + gl.glFrontFace(gl.GL_CW) + gl.glEnable(gl.GL_BLEND) + for chunk_position in self.chunks: + if self.can_render_chunk(chunk_position, player_chunk_pos): + self.chunks[chunk_position].draw_translucent() + + gl.glFrontFace(gl.GL_CCW) + gl.glEnable(gl.GL_BLEND) + for chunk_position in self.chunks: if self.can_render_chunk(chunk_position, player_chunk_pos): self.chunks[chunk_position].draw_translucent() - gl.glDepthMask(gl.GL_TRUE) gl.glDisable(gl.GL_BLEND) - gl.glEnable(gl.GL_CULL_FACE) \ No newline at end of file + gl.glDepthMask(gl.GL_TRUE) + + draw_translucent = draw_translucent_fancy if options.TRANSLUCENT_BLENDING else draw_translucent_fast + + def draw(self): + player_floored_pos = tuple(self.camera.position) + player_chunk_pos = self.get_chunk_position(player_floored_pos) + + for chunk_position in self.chunks: + if self.can_render_chunk(chunk_position, player_chunk_pos): + self.chunks[chunk_position].draw() + + self.draw_translucent(player_chunk_pos) + + + \ No newline at end of file From b6aa722b27f300f07edbe9f6f7ee1f0dc4cd0d71 Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Mon, 13 Dec 2021 07:55:52 +0100 Subject: [PATCH 08/10] Moved my changes into a community folder --- community/block_type.py | 59 +++++ community/camera.py | 63 +++++ community/chunk.py | 164 ++++++++++++ community/data/blocks.mcpy | 91 +++++++ community/frag.glsl | 17 ++ community/hit.py | 105 ++++++++ community/main.py | 177 +++++++++++++ community/matrix.py | 138 ++++++++++ community/models/__init__.py | 27 ++ community/models/button.py | 31 +++ community/models/cactus.py | 31 +++ community/models/crop.py | 37 +++ community/models/cube.py | 32 +++ community/models/door.py | 31 +++ community/models/fire.py | 25 ++ community/models/flat.py | 19 ++ community/models/glass.py | 31 +++ community/models/ladder.py | 25 ++ community/models/leaves.py | 31 +++ community/models/lever.py | 31 +++ community/models/liquid.py | 43 +++ community/models/plant.py | 25 ++ community/models/pressure_plate.py | 19 ++ community/models/sign.py | 25 ++ community/models/sign_post.py | 25 ++ community/models/slab.py | 31 +++ community/models/snow.py | 19 ++ community/models/soil.py | 31 +++ community/models/stairs.py | 31 +++ community/models/torch.py | 31 +++ {episode-11 => community}/options.py | 0 {episode-11 => community}/render_region.py | 0 community/save.py | 95 +++++++ community/save/0/0/c.0.0.dat | Bin 0 -> 4557 bytes community/save/0/1/c.0.1.dat | Bin 0 -> 3212 bytes community/save/0/1o/c.0.-4.dat | Bin 0 -> 2925 bytes community/save/0/1p/c.0.-3.dat | Bin 0 -> 3135 bytes community/save/0/1q/c.0.-2.dat | Bin 0 -> 2939 bytes community/save/0/1r/c.0.-1.dat | Bin 0 -> 5036 bytes community/save/0/2/c.0.2.dat | Bin 0 -> 2456 bytes community/save/0/3/c.0.3.dat | Bin 0 -> 2437 bytes community/save/1/0/c.1.0.dat | Bin 0 -> 5067 bytes community/save/1/1/c.1.1.dat | Bin 0 -> 3057 bytes community/save/1/1o/c.1.-4.dat | Bin 0 -> 2765 bytes community/save/1/1p/c.1.-3.dat | Bin 0 -> 3205 bytes community/save/1/1q/c.1.-2.dat | Bin 0 -> 3462 bytes community/save/1/1r/c.1.-1.dat | Bin 0 -> 4607 bytes community/save/1/2/c.1.2.dat | Bin 0 -> 2676 bytes community/save/1/3/c.1.3.dat | Bin 0 -> 2688 bytes community/save/1o/0/c.-4.0.dat | Bin 0 -> 3150 bytes community/save/1o/1/c.-4.1.dat | Bin 0 -> 3195 bytes community/save/1o/1o/c.-4.-4.dat | Bin 0 -> 2985 bytes community/save/1o/1p/c.-4.-3.dat | Bin 0 -> 2493 bytes community/save/1o/1q/c.-4.-2.dat | Bin 0 -> 3195 bytes community/save/1o/1r/c.-4.-1.dat | Bin 0 -> 3431 bytes community/save/1o/2/c.-4.2.dat | Bin 0 -> 3161 bytes community/save/1o/3/c.-4.3.dat | Bin 0 -> 3046 bytes community/save/1p/0/c.-3.0.dat | Bin 0 -> 3549 bytes community/save/1p/1/c.-3.1.dat | Bin 0 -> 4020 bytes community/save/1p/1o/c.-3.-4.dat | Bin 0 -> 3005 bytes community/save/1p/1p/c.-3.-3.dat | Bin 0 -> 3445 bytes community/save/1p/1q/c.-3.-2.dat | Bin 0 -> 3557 bytes community/save/1p/1r/c.-3.-1.dat | Bin 0 -> 3529 bytes community/save/1p/2/c.-3.2.dat | Bin 0 -> 3275 bytes community/save/1p/3/c.-3.3.dat | Bin 0 -> 3179 bytes community/save/1q/0/c.-2.0.dat | Bin 0 -> 3242 bytes community/save/1q/1/c.-2.1.dat | Bin 0 -> 4691 bytes community/save/1q/1o/c.-2.-4.dat | Bin 0 -> 3181 bytes community/save/1q/1p/c.-2.-3.dat | Bin 0 -> 3455 bytes community/save/1q/1q/c.-2.-2.dat | Bin 0 -> 3462 bytes community/save/1q/1r/c.-2.-1.dat | Bin 0 -> 4241 bytes community/save/1q/2/c.-2.2.dat | Bin 0 -> 4194 bytes community/save/1q/3/c.-2.3.dat | Bin 0 -> 3635 bytes community/save/1r/0/c.-1.0.dat | Bin 0 -> 3384 bytes community/save/1r/1/c.-1.1.dat | Bin 0 -> 3780 bytes community/save/1r/1o/c.-1.-4.dat | Bin 0 -> 2902 bytes community/save/1r/1p/c.-1.-3.dat | Bin 0 -> 2589 bytes community/save/1r/1q/c.-1.-2.dat | Bin 0 -> 3146 bytes community/save/1r/1r/c.-1.-1.dat | Bin 0 -> 3231 bytes community/save/1r/2/c.-1.2.dat | Bin 0 -> 3575 bytes community/save/1r/3/c.-1.3.dat | Bin 0 -> 3543 bytes community/save/2/0/c.2.0.dat | Bin 0 -> 3104 bytes community/save/2/1/c.2.1.dat | Bin 0 -> 3342 bytes community/save/2/1o/c.2.-4.dat | Bin 0 -> 3534 bytes community/save/2/1p/c.2.-3.dat | Bin 0 -> 3423 bytes community/save/2/1q/c.2.-2.dat | Bin 0 -> 3259 bytes community/save/2/1r/c.2.-1.dat | Bin 0 -> 3180 bytes community/save/2/2/c.2.2.dat | Bin 0 -> 3201 bytes community/save/2/3/c.2.3.dat | Bin 0 -> 2753 bytes community/save/3/0/c.3.0.dat | Bin 0 -> 3648 bytes community/save/3/1/c.3.1.dat | Bin 0 -> 4240 bytes community/save/3/1o/c.3.-4.dat | Bin 0 -> 4104 bytes community/save/3/1p/c.3.-3.dat | Bin 0 -> 3877 bytes community/save/3/1q/c.3.-2.dat | Bin 0 -> 3228 bytes community/save/3/1r/c.3.-1.dat | Bin 0 -> 2784 bytes community/save/3/2/c.3.2.dat | Bin 0 -> 3168 bytes community/save/3/3/c.3.3.dat | Bin 0 -> 2758 bytes community/shader.py | 71 +++++ community/subchunk.py | 96 +++++++ community/texture_manager.py | 42 +++ community/textures/aqua_cloth.png | Bin 0 -> 1193 bytes community/textures/bedrock.png | Bin 0 -> 833 bytes community/textures/black_cloth.png | Bin 0 -> 1076 bytes community/textures/blue_cloth.png | Bin 0 -> 1179 bytes community/textures/bookshelf.png | Bin 0 -> 1070 bytes community/textures/bricks.png | Bin 0 -> 1173 bytes community/textures/brown_mushroom.png | Bin 0 -> 634 bytes community/textures/cactus_bottom.png | Bin 0 -> 825 bytes community/textures/cactus_side.png | Bin 0 -> 1015 bytes community/textures/cactus_top.png | Bin 0 -> 1041 bytes community/textures/chest_front.png | Bin 0 -> 1079 bytes community/textures/chest_side.png | Bin 0 -> 1025 bytes community/textures/chest_top.png | Bin 0 -> 1035 bytes community/textures/clay.png | Bin 0 -> 1203 bytes community/textures/coal_ore.png | Bin 0 -> 928 bytes community/textures/cobblestone.png | Bin 0 -> 1360 bytes community/textures/crafting_table_top.png | Bin 0 -> 1256 bytes community/textures/crafting_table_x.png | Bin 0 -> 1171 bytes community/textures/crafting_table_z.png | Bin 0 -> 1205 bytes community/textures/crops.png | Bin 0 -> 1167 bytes community/textures/cyan_cloth.png | Bin 0 -> 1289 bytes community/textures/dead_bush.png | Bin 0 -> 739 bytes community/textures/diamond_block.png | Bin 0 -> 984 bytes community/textures/diamond_ore.png | Bin 0 -> 975 bytes community/textures/dirt.png | Bin 0 -> 1059 bytes community/textures/fire.png | Bin 0 -> 666 bytes community/textures/furnace_front.png | Bin 0 -> 1238 bytes community/textures/furnace_side.png | Bin 0 -> 1190 bytes community/textures/furnace_y.png | Bin 0 -> 1221 bytes community/textures/glass.png | Bin 0 -> 728 bytes community/textures/gold_block.png | Bin 0 -> 1049 bytes community/textures/gold_ore.png | Bin 0 -> 1008 bytes community/textures/grass.png | Bin 0 -> 1349 bytes community/textures/grass_side.png | Bin 0 -> 1152 bytes community/textures/gravel.png | Bin 0 -> 1423 bytes community/textures/green_cloth.png | Bin 0 -> 1071 bytes community/textures/grey_cloth.png | Bin 0 -> 1055 bytes community/textures/ice.png | Bin 0 -> 676 bytes community/textures/indigo_cloth.png | Bin 0 -> 1112 bytes community/textures/iron_block.png | Bin 0 -> 863 bytes community/textures/iron_door.png | Bin 0 -> 1022 bytes community/textures/iron_door_bottom_half.png | Bin 0 -> 1011 bytes community/textures/iron_ore.png | Bin 0 -> 1007 bytes community/textures/jukebox.png | Bin 0 -> 1191 bytes community/textures/jukebox_top.png | Bin 0 -> 1031 bytes community/textures/ladder.png | Bin 0 -> 996 bytes community/textures/lava.png | Bin 0 -> 787 bytes community/textures/leaves.png | Bin 0 -> 1269 bytes community/textures/lever.png | Bin 0 -> 1360 bytes community/textures/lime_cloth.png | Bin 0 -> 1221 bytes community/textures/lit_furnace_front.png | Bin 0 -> 1260 bytes community/textures/log_side.png | Bin 0 -> 1244 bytes community/textures/log_y.png | Bin 0 -> 1085 bytes community/textures/magenta_cloth.png | Bin 0 -> 1257 bytes community/textures/mob_spawner.png | Bin 0 -> 962 bytes community/textures/mossy_cobblestone.png | Bin 0 -> 1401 bytes community/textures/obsidian.png | Bin 0 -> 1183 bytes community/textures/off_redstone_torch.png | Bin 0 -> 659 bytes community/textures/off_redstone_torch_top.png | Bin 0 -> 588 bytes community/textures/orange_cloth.png | Bin 0 -> 1181 bytes community/textures/pink_cloth.png | Bin 0 -> 1294 bytes community/textures/planks.png | Bin 0 -> 247 bytes community/textures/purple_cloth.png | Bin 0 -> 1248 bytes community/textures/rails.png | Bin 0 -> 869 bytes community/textures/red_cloth.png | Bin 0 -> 1189 bytes community/textures/red_mushroom.png | Bin 0 -> 702 bytes community/textures/red_rose.png | Bin 0 -> 702 bytes community/textures/redstone_ore.png | Bin 0 -> 946 bytes community/textures/redstone_torch.png | Bin 0 -> 670 bytes community/textures/redstone_torch_top.png | Bin 0 -> 604 bytes community/textures/redstone_wire.png | Bin 0 -> 627 bytes community/textures/sand.png | Bin 0 -> 1333 bytes community/textures/sapling.png | Bin 0 -> 989 bytes community/textures/slab_side.png | Bin 0 -> 896 bytes community/textures/slab_y.png | Bin 0 -> 881 bytes community/textures/snow.png | Bin 0 -> 770 bytes community/textures/snowy_grass_side.png | Bin 0 -> 1036 bytes community/textures/soil.png | Bin 0 -> 1170 bytes community/textures/sponge.png | Bin 0 -> 1316 bytes community/textures/stone.png | Bin 0 -> 841 bytes community/textures/sugar_cane.png | Bin 0 -> 792 bytes community/textures/tnt_bottom.png | Bin 0 -> 629 bytes community/textures/tnt_side.png | Bin 0 -> 772 bytes community/textures/tnt_top.png | Bin 0 -> 923 bytes community/textures/torch.png | Bin 0 -> 660 bytes community/textures/torch_top.png | Bin 0 -> 589 bytes community/textures/unknown.png | Bin 0 -> 5519 bytes community/textures/violet_cloth.png | Bin 0 -> 1264 bytes community/textures/water.png | Bin 0 -> 760 bytes community/textures/white_cloth.png | Bin 0 -> 1273 bytes community/textures/wooden_door.png | Bin 0 -> 1132 bytes community/textures/yellow_cloth.png | Bin 0 -> 1280 bytes community/textures/yellow_flower.png | Bin 0 -> 694 bytes community/vert.glsl | 26 ++ .../language-configuration.json | 33 +++ community/vscode_mcpy_extension/package.json | 36 +++ .../syntaxes/mcpy_blocks.tmLanguage.json | 36 +++ community/world.py | 248 ++++++++++++++++++ episode-11/block_type.py | 12 +- episode-11/camera.py | 7 +- episode-11/chunk.py | 135 ++++++---- episode-11/frag.glsl | 17 +- episode-11/main.py | 58 ++-- episode-11/matrix.py | 7 +- episode-11/models/button.py | 1 - episode-11/models/cactus.py | 1 - episode-11/models/crop.py | 1 - episode-11/models/cube.py | 2 - episode-11/models/door.py | 1 - episode-11/models/fire.py | 1 - episode-11/models/flat.py | 1 - episode-11/models/glass.py | 1 - episode-11/models/ladder.py | 1 - episode-11/models/leaves.py | 1 - episode-11/models/lever.py | 1 - episode-11/models/liquid.py | 1 - episode-11/models/plant.py | 1 - episode-11/models/pressure_plate.py | 1 - episode-11/models/sign.py | 1 - episode-11/models/sign_post.py | 1 - episode-11/models/slab.py | 1 - episode-11/models/snow.py | 1 - episode-11/models/soil.py | 1 - episode-11/models/stairs.py | 1 - episode-11/models/torch.py | 1 - episode-11/subchunk.py | 91 +++---- episode-11/texture_manager.py | 4 +- episode-11/vert.glsl | 42 ++- episode-11/world.py | 106 +------- 229 files changed, 2327 insertions(+), 302 deletions(-) create mode 100644 community/block_type.py create mode 100644 community/camera.py create mode 100644 community/chunk.py create mode 100644 community/data/blocks.mcpy create mode 100644 community/frag.glsl create mode 100644 community/hit.py create mode 100644 community/main.py create mode 100644 community/matrix.py create mode 100644 community/models/__init__.py create mode 100644 community/models/button.py create mode 100644 community/models/cactus.py create mode 100644 community/models/crop.py create mode 100644 community/models/cube.py create mode 100644 community/models/door.py create mode 100644 community/models/fire.py create mode 100644 community/models/flat.py create mode 100644 community/models/glass.py create mode 100644 community/models/ladder.py create mode 100644 community/models/leaves.py create mode 100644 community/models/lever.py create mode 100644 community/models/liquid.py create mode 100644 community/models/plant.py create mode 100644 community/models/pressure_plate.py create mode 100644 community/models/sign.py create mode 100644 community/models/sign_post.py create mode 100644 community/models/slab.py create mode 100644 community/models/snow.py create mode 100644 community/models/soil.py create mode 100644 community/models/stairs.py create mode 100644 community/models/torch.py rename {episode-11 => community}/options.py (100%) rename {episode-11 => community}/render_region.py (100%) create mode 100644 community/save.py create mode 100644 community/save/0/0/c.0.0.dat create mode 100644 community/save/0/1/c.0.1.dat create mode 100644 community/save/0/1o/c.0.-4.dat create mode 100644 community/save/0/1p/c.0.-3.dat create mode 100644 community/save/0/1q/c.0.-2.dat create mode 100644 community/save/0/1r/c.0.-1.dat create mode 100644 community/save/0/2/c.0.2.dat create mode 100644 community/save/0/3/c.0.3.dat create mode 100644 community/save/1/0/c.1.0.dat create mode 100644 community/save/1/1/c.1.1.dat create mode 100644 community/save/1/1o/c.1.-4.dat create mode 100644 community/save/1/1p/c.1.-3.dat create mode 100644 community/save/1/1q/c.1.-2.dat create mode 100644 community/save/1/1r/c.1.-1.dat create mode 100644 community/save/1/2/c.1.2.dat create mode 100644 community/save/1/3/c.1.3.dat create mode 100644 community/save/1o/0/c.-4.0.dat create mode 100644 community/save/1o/1/c.-4.1.dat create mode 100644 community/save/1o/1o/c.-4.-4.dat create mode 100644 community/save/1o/1p/c.-4.-3.dat create mode 100644 community/save/1o/1q/c.-4.-2.dat create mode 100644 community/save/1o/1r/c.-4.-1.dat create mode 100644 community/save/1o/2/c.-4.2.dat create mode 100644 community/save/1o/3/c.-4.3.dat create mode 100644 community/save/1p/0/c.-3.0.dat create mode 100644 community/save/1p/1/c.-3.1.dat create mode 100644 community/save/1p/1o/c.-3.-4.dat create mode 100644 community/save/1p/1p/c.-3.-3.dat create mode 100644 community/save/1p/1q/c.-3.-2.dat create mode 100644 community/save/1p/1r/c.-3.-1.dat create mode 100644 community/save/1p/2/c.-3.2.dat create mode 100644 community/save/1p/3/c.-3.3.dat create mode 100644 community/save/1q/0/c.-2.0.dat create mode 100644 community/save/1q/1/c.-2.1.dat create mode 100644 community/save/1q/1o/c.-2.-4.dat create mode 100644 community/save/1q/1p/c.-2.-3.dat create mode 100644 community/save/1q/1q/c.-2.-2.dat create mode 100644 community/save/1q/1r/c.-2.-1.dat create mode 100644 community/save/1q/2/c.-2.2.dat create mode 100644 community/save/1q/3/c.-2.3.dat create mode 100644 community/save/1r/0/c.-1.0.dat create mode 100644 community/save/1r/1/c.-1.1.dat create mode 100644 community/save/1r/1o/c.-1.-4.dat create mode 100644 community/save/1r/1p/c.-1.-3.dat create mode 100644 community/save/1r/1q/c.-1.-2.dat create mode 100644 community/save/1r/1r/c.-1.-1.dat create mode 100644 community/save/1r/2/c.-1.2.dat create mode 100644 community/save/1r/3/c.-1.3.dat create mode 100644 community/save/2/0/c.2.0.dat create mode 100644 community/save/2/1/c.2.1.dat create mode 100644 community/save/2/1o/c.2.-4.dat create mode 100644 community/save/2/1p/c.2.-3.dat create mode 100644 community/save/2/1q/c.2.-2.dat create mode 100644 community/save/2/1r/c.2.-1.dat create mode 100644 community/save/2/2/c.2.2.dat create mode 100644 community/save/2/3/c.2.3.dat create mode 100644 community/save/3/0/c.3.0.dat create mode 100644 community/save/3/1/c.3.1.dat create mode 100644 community/save/3/1o/c.3.-4.dat create mode 100644 community/save/3/1p/c.3.-3.dat create mode 100644 community/save/3/1q/c.3.-2.dat create mode 100644 community/save/3/1r/c.3.-1.dat create mode 100644 community/save/3/2/c.3.2.dat create mode 100644 community/save/3/3/c.3.3.dat create mode 100644 community/shader.py create mode 100644 community/subchunk.py create mode 100644 community/texture_manager.py create mode 100644 community/textures/aqua_cloth.png create mode 100644 community/textures/bedrock.png create mode 100644 community/textures/black_cloth.png create mode 100644 community/textures/blue_cloth.png create mode 100644 community/textures/bookshelf.png create mode 100644 community/textures/bricks.png create mode 100644 community/textures/brown_mushroom.png create mode 100644 community/textures/cactus_bottom.png create mode 100644 community/textures/cactus_side.png create mode 100644 community/textures/cactus_top.png create mode 100644 community/textures/chest_front.png create mode 100644 community/textures/chest_side.png create mode 100644 community/textures/chest_top.png create mode 100644 community/textures/clay.png create mode 100644 community/textures/coal_ore.png create mode 100644 community/textures/cobblestone.png create mode 100644 community/textures/crafting_table_top.png create mode 100644 community/textures/crafting_table_x.png create mode 100644 community/textures/crafting_table_z.png create mode 100644 community/textures/crops.png create mode 100644 community/textures/cyan_cloth.png create mode 100644 community/textures/dead_bush.png create mode 100644 community/textures/diamond_block.png create mode 100644 community/textures/diamond_ore.png create mode 100644 community/textures/dirt.png create mode 100644 community/textures/fire.png create mode 100644 community/textures/furnace_front.png create mode 100644 community/textures/furnace_side.png create mode 100644 community/textures/furnace_y.png create mode 100644 community/textures/glass.png create mode 100644 community/textures/gold_block.png create mode 100644 community/textures/gold_ore.png create mode 100644 community/textures/grass.png create mode 100644 community/textures/grass_side.png create mode 100644 community/textures/gravel.png create mode 100644 community/textures/green_cloth.png create mode 100644 community/textures/grey_cloth.png create mode 100644 community/textures/ice.png create mode 100644 community/textures/indigo_cloth.png create mode 100644 community/textures/iron_block.png create mode 100644 community/textures/iron_door.png create mode 100644 community/textures/iron_door_bottom_half.png create mode 100644 community/textures/iron_ore.png create mode 100644 community/textures/jukebox.png create mode 100644 community/textures/jukebox_top.png create mode 100644 community/textures/ladder.png create mode 100644 community/textures/lava.png create mode 100644 community/textures/leaves.png create mode 100644 community/textures/lever.png create mode 100644 community/textures/lime_cloth.png create mode 100644 community/textures/lit_furnace_front.png create mode 100644 community/textures/log_side.png create mode 100644 community/textures/log_y.png create mode 100644 community/textures/magenta_cloth.png create mode 100644 community/textures/mob_spawner.png create mode 100644 community/textures/mossy_cobblestone.png create mode 100644 community/textures/obsidian.png create mode 100644 community/textures/off_redstone_torch.png create mode 100644 community/textures/off_redstone_torch_top.png create mode 100644 community/textures/orange_cloth.png create mode 100644 community/textures/pink_cloth.png create mode 100644 community/textures/planks.png create mode 100644 community/textures/purple_cloth.png create mode 100644 community/textures/rails.png create mode 100644 community/textures/red_cloth.png create mode 100644 community/textures/red_mushroom.png create mode 100644 community/textures/red_rose.png create mode 100644 community/textures/redstone_ore.png create mode 100644 community/textures/redstone_torch.png create mode 100644 community/textures/redstone_torch_top.png create mode 100644 community/textures/redstone_wire.png create mode 100644 community/textures/sand.png create mode 100644 community/textures/sapling.png create mode 100644 community/textures/slab_side.png create mode 100644 community/textures/slab_y.png create mode 100644 community/textures/snow.png create mode 100644 community/textures/snowy_grass_side.png create mode 100644 community/textures/soil.png create mode 100644 community/textures/sponge.png create mode 100644 community/textures/stone.png create mode 100644 community/textures/sugar_cane.png create mode 100644 community/textures/tnt_bottom.png create mode 100644 community/textures/tnt_side.png create mode 100644 community/textures/tnt_top.png create mode 100644 community/textures/torch.png create mode 100644 community/textures/torch_top.png create mode 100644 community/textures/unknown.png create mode 100644 community/textures/violet_cloth.png create mode 100644 community/textures/water.png create mode 100644 community/textures/white_cloth.png create mode 100644 community/textures/wooden_door.png create mode 100644 community/textures/yellow_cloth.png create mode 100644 community/textures/yellow_flower.png create mode 100644 community/vert.glsl create mode 100644 community/vscode_mcpy_extension/language-configuration.json create mode 100644 community/vscode_mcpy_extension/package.json create mode 100644 community/vscode_mcpy_extension/syntaxes/mcpy_blocks.tmLanguage.json create mode 100644 community/world.py diff --git a/community/block_type.py b/community/block_type.py new file mode 100644 index 00000000..e39015b2 --- /dev/null +++ b/community/block_type.py @@ -0,0 +1,59 @@ +import models.cube # default model + +class Block_type: + # new optional model argument (cube model by default) + def __init__(self, texture_manager, name = "unknown", block_face_textures = {"all": "cobblestone"}, model = models.cube): + self.name = name + self.block_face_textures = block_face_textures + self.model = model + + # create members based on model attributes + + self.transparent = model.transparent + self.is_cube = model.is_cube + self.glass = model.glass + self.translucent = model.translucent + + # replace data contained in numbers.py with model specific data + + self.vertex_positions = model.vertex_positions + self.tex_coords = model.tex_coords # to deprecate + self.tex_indices = [0] * len(self.tex_coords) + self.shading_values = model.shading_values + + def set_block_face(face, texture): + # make sure we don't add inexistent face + if face > len(self.tex_coords) - 1: + return + self.tex_indices[face] = texture + + for face in block_face_textures: + texture = block_face_textures[face] + texture_manager.add_texture(texture) + + texture_index = texture_manager.textures.index(texture) + + if face == "all": + for i in range(len(self.tex_coords)): + set_block_face(i, texture_index) + + elif face == "sides": + set_block_face(0, texture_index) + set_block_face(1, texture_index) + set_block_face(4, texture_index) + set_block_face(5, texture_index) + + elif face == "x": + set_block_face(0, texture_index) + set_block_face(1, texture_index) + + elif face == "y": + set_block_face(2, texture_index) + set_block_face(3, texture_index) + + elif face == "z": + set_block_face(4, texture_index) + set_block_face(5, texture_index) + + else: + set_block_face(["right", "left", "top", "bottom", "front", "back"].index(face), texture_index) \ No newline at end of file diff --git a/community/camera.py b/community/camera.py new file mode 100644 index 00000000..2dfb5d56 --- /dev/null +++ b/community/camera.py @@ -0,0 +1,63 @@ +import math +import matrix + +WALKING_SPEED = 7 +SPRINTING_SPEED = 21 + +class Camera: + def __init__(self, shader, width, height): + self.width = width + self.height = height + + # create matrices + + self.mv_matrix = matrix.Matrix() + self.p_matrix = matrix.Matrix() + self.mvp_matrix = matrix.Matrix() + + # shaders + + self.shader = shader + self.shader_matrix_location = self.shader.find_uniform(b"u_ModelViewProjMatrix") + + # camera variables + + self.input = [0, 0, 0] + + self.position = [0, 80, 0] + self.rotation = [-math.tau / 4, 0] + + self.target_speed = WALKING_SPEED + self.speed = self.target_speed + + def update_camera(self, delta_time): + self.speed += (self.target_speed - self.speed) * delta_time * 20 + multiplier = self.speed * delta_time + + self.position[1] += self.input[1] * multiplier + + if self.input[0] or self.input[2]: + angle = self.rotation[0] - math.atan2(self.input[2], self.input[0]) + math.tau / 4 + + self.position[0] += math.cos(angle) * multiplier + self.position[2] += math.sin(angle) * multiplier + + def update_matrices(self): + # create projection matrix + + self.p_matrix.load_identity() + + self.p_matrix.perspective( + 90 + 20 * (self.speed - WALKING_SPEED) / (SPRINTING_SPEED - WALKING_SPEED), + float(self.width) / self.height, 0.1, 500) + + # create modelview matrix + + self.mv_matrix.load_identity() + self.mv_matrix.rotate_2d(self.rotation[0] + math.tau / 4, self.rotation[1]) + self.mv_matrix.translate(-self.position[0], -self.position[1], -self.position[2]) + + # modelviewprojection matrix + + self.mvp_matrix = self.p_matrix * self.mv_matrix + self.shader.uniform_matrix(self.shader_matrix_location, self.mvp_matrix) \ No newline at end of file diff --git a/community/chunk.py b/community/chunk.py new file mode 100644 index 00000000..eedd8ede --- /dev/null +++ b/community/chunk.py @@ -0,0 +1,164 @@ +import ctypes + +import pyglet.gl as gl + +import subchunk + +CHUNK_WIDTH = 16 +CHUNK_HEIGHT = 128 +CHUNK_LENGTH = 16 + +class Chunk: + def __init__(self, world, chunk_position): + self.world = world + + self.modified = False + self.chunk_position = chunk_position + + self.position = ( + self.chunk_position[0] * CHUNK_WIDTH, + self.chunk_position[1] * CHUNK_HEIGHT, + self.chunk_position[2] * CHUNK_LENGTH) + + self.blocks = [[[0 + for z in range(CHUNK_LENGTH)] + for y in range(CHUNK_HEIGHT)] + for x in range(CHUNK_WIDTH )] + + self.subchunks = {} + + for x in range(int(CHUNK_WIDTH / subchunk.SUBCHUNK_WIDTH)): + for y in range(int(CHUNK_HEIGHT / subchunk.SUBCHUNK_HEIGHT)): + for z in range(int(CHUNK_LENGTH / subchunk.SUBCHUNK_LENGTH)): + self.subchunks[(x, y, z)] = subchunk.Subchunk(self, (x, y, z)) + + # mesh variables + + self.mesh = [] + self.translucent_mesh = [] + + self.mesh_quad_count = 0 + self.translucent_quad_count = 0 + + # create VAO and VBO's + + self.vao = gl.GLuint(0) + gl.glGenVertexArrays(1, ctypes.byref(self.vao)) + gl.glBindVertexArray(self.vao) + + self.vbo = gl.GLuint(0) + gl.glGenBuffers(1, ctypes.byref(self.vbo)) + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) + gl.glBufferData(gl.GL_ARRAY_BUFFER, ctypes.sizeof(gl.GLfloat * CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_LENGTH * 8), None, gl.GL_DYNAMIC_DRAW) + + gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, + gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 0) + gl.glEnableVertexAttribArray(0) + gl.glVertexAttribPointer(1, 2, gl.GL_FLOAT, + gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 3 * ctypes.sizeof(gl.GLfloat)) + gl.glEnableVertexAttribArray(1) + gl.glVertexAttribPointer(2, 1, gl.GL_FLOAT, + gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 5 * ctypes.sizeof(gl.GLfloat)) + gl.glEnableVertexAttribArray(2) + + gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, world.ibo) + + def __del__(self): + gl.glDeleteBuffers(1, ctypes.byref(self.vbo)) + gl.glDeleteVertexArrays(1, ctypes.byref(self.vao)) + + def update_subchunk_meshes(self): + for subchunk_position in self.subchunks: + subchunk = self.subchunks[subchunk_position] + subchunk.update_mesh() + + def update_at_position(self, position): + x, y, z = position + + lx = int(x % subchunk.SUBCHUNK_WIDTH ) + ly = int(y % subchunk.SUBCHUNK_HEIGHT) + lz = int(z % subchunk.SUBCHUNK_LENGTH) + + clx, cly, clz = self.world.get_local_position(position) + + sx = clx // subchunk.SUBCHUNK_WIDTH + sy = cly // subchunk.SUBCHUNK_HEIGHT + sz = clz // subchunk.SUBCHUNK_LENGTH + + self.subchunks[(sx, sy, sz)].update_mesh() + + def try_update_subchunk_mesh(subchunk_position): + if subchunk_position in self.subchunks: + self.subchunks[subchunk_position].update_mesh() + + if lx == subchunk.SUBCHUNK_WIDTH - 1: try_update_subchunk_mesh((sx + 1, sy, sz)) + if lx == 0: try_update_subchunk_mesh((sx - 1, sy, sz)) + + if ly == subchunk.SUBCHUNK_HEIGHT - 1: try_update_subchunk_mesh((sx, sy + 1, sz)) + if ly == 0: try_update_subchunk_mesh((sx, sy - 1, sz)) + + if lz == subchunk.SUBCHUNK_LENGTH - 1: try_update_subchunk_mesh((sx, sy, sz + 1)) + if lz == 0: try_update_subchunk_mesh((sx, sy, sz - 1)) + + def update_mesh(self): + # combine all the small subchunk meshes into one big chunk mesh + + for subchunk_position in self.subchunks: + subchunk = self.subchunks[subchunk_position] + + self.mesh.extend(subchunk.mesh) + self.translucent_mesh.extend(subchunk.translucent_mesh) + + # send the full mesh data to the GPU and free the memory used client-side (we don't need it anymore) + # don't forget to save the length of 'self.mesh_indices' before freeing + + self.mesh_quad_count = len(self.mesh) // 24 + self.translucent_quad_count = len(self.translucent_mesh) // 24 + + self.send_mesh_data_to_gpu() + + self.mesh = [] + self.translucent_mesh = [] + + def send_mesh_data_to_gpu(self): # pass mesh data to gpu + if not self.mesh_quad_count: + return + + self.mesh.extend(self.translucent_mesh) + + gl.glBindVertexArray(self.vao) + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) + gl.glBufferSubData( + gl.GL_ARRAY_BUFFER, + 0, + ctypes.sizeof(gl.GLfloat * len(self.mesh)), + (gl.GLfloat * len(self.mesh)) (*self.mesh)) + + + def draw(self): + if not self.mesh_quad_count: + return + + gl.glBindVertexArray(self.vao) + + gl.glDrawElementsBaseVertex( + gl.GL_TRIANGLES, + self.mesh_quad_count * 6, + gl.GL_UNSIGNED_INT, + None, + 0) + + def draw_translucent(self): + if not self.translucent_quad_count: + return + + gl.glBindVertexArray(self.vao) + + gl.glDrawElementsBaseVertex( + gl.GL_TRIANGLES, + self.translucent_quad_count * 6, + gl.GL_UNSIGNED_INT, + None, + self.mesh_quad_count * 4 + ) \ No newline at end of file diff --git a/community/data/blocks.mcpy b/community/data/blocks.mcpy new file mode 100644 index 00000000..2c069379 --- /dev/null +++ b/community/data/blocks.mcpy @@ -0,0 +1,91 @@ +# block ID's from: +# https://www.minecraftforum.net/forums/minecraft-java-edition/discussion/114963-all-item-block-ids-in-one-place +# (with some slight modifications) + +1: name "Stone", texture.all stone +2: name "Grass", texture.top grass, texture.bottom dirt, texture.sides grass_side +3: name "Dirt", texture.all dirt +4: name "Cobblestone", texture.all cobblestone +5: name "Planks", texture.all planks +6: name "Sapling", model models.plant, texture.all sapling +7: name "Bedrock", texture.all bedrock +8: name "Water", model models.liquid, texture.all water +9: sameas 8, name "Stationary Water" +10: name "Lava", model models.liquid, texture.all lava +11: sameas 10, name "Stationary Lava" +12: name "Sand", texture.all sand +13: name "Gravel", texture.all gravel +14: name "Gold Ore", texture.all gold_ore +15: name "Iron Ore", texture.all iron_ore +16: name "Coal Ore", texture.all coal_ore +17: name "Log", texture.y log_y, texture.sides log_side +18: name "Leaves", model models.leaves, texture.all leaves +19: name "Sponge", texture.all sponge +20: name "Glass", model models.glass, texture.all glass +21: name "Red Cloth", texture.all red_cloth +22: name "Orange Cloth", texture.all orange_cloth +23: name "Yellow Cloth", texture.all yellow_cloth +24: name "Lime Cloth", texture.all lime_cloth +25: name "Green Cloth", texture.all green_cloth +26: name "Aqua Cloth", texture.all aqua_cloth +27: name "Cyan Cloth", texture.all cyan_cloth +28: name "Blue Cloth", texture.all blue_cloth +29: name "Purple Cloth", texture.all purple_cloth +30: name "Indigo Cloth", texture.all indigo_cloth +31: name "Violet Cloth", texture.all violet_cloth +32: name "Magenta Cloth", texture.all magenta_cloth +33: name "Pink Cloth", texture.all pink_cloth +34: name "Black Cloth", texture.all black_cloth +35: name "Grey Cloth", texture.all grey_cloth +36: name "White Cloth", texture.all white_cloth +37: name "Yellow Flower", model models.plant, texture.all yellow_flower +38: name "Red Rose", model models.plant, texture.all red_rose +39: name "Brown Mushroom", model models.plant, texture.all brown_mushroom +40: name "Red Mushroom", model models.plant, texture.all red_mushroom +41: name "Gold Block", texture.all gold_block +42: name "Iron Block", texture.all iron_block +43: name "Double Slab", texture.sides slab_side, texture.y slab_y +44: name "Slab", model models.slab, texture.sides slab_side, texture.y slab_y +45: name "Bricks", texture.all bricks +46: name "TNT", texture.top tnt_top, texture.bottom tnt_bottom, texture.sides tnt_side +47: name "Bookshelf", texture.y planks, texture.sides bookshelf +48: name "Mossy Cobblestone", texture.all mossy_cobblestone +49: name "Obsidian", texture.all obsidian +50: name "Torch", model models.torch, texture.top torch_top, texture.bottom torch, texture.sides torch +51: name "Fire", model models.fire, texture.all fire +# I know, the model name isn't great, but it's got the same graphical properties +52: name "Mob Spawner", model models.leaves, texture.all mob_spawner +53: name "Wooden Stairs", model models.stairs, texture.all planks +54: name "Chest", texture.y chest_top, texture.sides chest_side, texture.front chest_front +55: name "Redstone Wire", model models.flat, texture.all redstone_wire +56: name "Diamond Ore", texture.all diamond_ore +57: name "Diamond Block", texture.all diamond_block +58: name "Crafting Table", texture.top crafting_table_top, texture.bottom planks, texture.x crafting_table_x, texture.z crafting_table_z +59: name "Crops", model models.crop, texture.all crops +60: name "Soil", model models.soil, texture.all dirt, texture.top soil +61: name "Furnace", texture.y furnace_y, texture.sides furnace_side, texture.front furnace_front +62: name "Lit Furnace", texture.y furnace_y, texture.sides furnace_side, texture.front lit_furnace_front +63: name "Sign Post", model models.sign_post, texture.all planks +64: name "Wooden Door", model models.door, texture.all wooden_door +65: name "Ladder", model models.ladder, texture.all ladder +66: name "Rails", model models.flat, texture.all rails +67: name "Cobblestone Stairs", model models.stairs, texture.all cobblestone +68: name "Sign", model models.sign, texture.all planks +69: name "Lever", model models.lever, texture.all lever +70: name "Stone Pressure Plate", model models.pressure_plate, texture.all stone +71: name "Iron Door", model models.door, texture.all iron_door_bottom_half +72: name "Wooden Pressure Plate", model models.pressure_plate, texture.all planks +73: name "Redstone Ore", texture.all redstone_ore +# when we implement a lighting system, this will have some kind of "emissive" property +74: name "Lit Redstone Ore", texture.all redstone_ore +75: name "Redstone Torch", model models.torch, texture.top redstone_torch_top, texture.bottom redstone_torch, texture.sides redstone_torch +76: name "Redstone Torch (Off)", model models.torch, texture.top off_redstone_torch_top, texture.bottom off_redstone_torch, texture.sides off_redstone_torch +77: name "Stone Button", model models.button, texture.all stone +78: name "Snow", model models.snow, texture.all snow +# ditto as for mob spawners (52) +79: name "Ice", model models.glass, texture.all ice +80: name "Snow Block", texture.all snow +81: name "Cactus", model models.cactus, texture.top cactus_top, texture.bottom cactus_bottom, texture.sides cactus_side +82: name "Clay", texture.all clay +83: name "Sugar Cane", model models.plant, texture.all sugar_cane +84: name "Jukebox", texture.all jukebox, texture.top jukebox_top diff --git a/community/frag.glsl b/community/frag.glsl new file mode 100644 index 00000000..25c93cce --- /dev/null +++ b/community/frag.glsl @@ -0,0 +1,17 @@ +#version 330 + +out vec4 fragColor; + +uniform sampler2DArray u_TextureArraySampler; + +in vec3 v_Position; +in vec3 v_TexCoords; +in float v_LightMultiplier; + +void main(void) { + vec4 textureColor = texture(u_TextureArraySampler, v_TexCoords); + if (textureColor.a < 0.5) { // discard if texel's alpha component is 0 (texel is transparent) + discard; + } + fragColor = textureColor * v_LightMultiplier; +} \ No newline at end of file diff --git a/community/hit.py b/community/hit.py new file mode 100644 index 00000000..88389510 --- /dev/null +++ b/community/hit.py @@ -0,0 +1,105 @@ +import math + +HIT_RANGE = 3 + +class Hit_ray: + def __init__(self, world, rotation, starting_position): + self.world = world + + # get the ray unit vector based on rotation angles + # sqrt(ux ^ 2 + uy ^ 2 + uz ^ 2) must always equal 1 + + self.vector = ( + math.cos(rotation[0]) * math.cos(rotation[1]), + math.sin(rotation[1]), + math.sin(rotation[0]) * math.cos(rotation[1])) + + # point position + self.position = list(starting_position) + + # block position in which point currently is + self.block = tuple(map(lambda x: int(round(x)), self.position)) + + # current distance the point has travelled + self.distance = 0 + + # 'check' and 'step' both return 'True' if something is hit, and 'False' if not + + def check(self, hit_callback, distance, current_block, next_block): + if self.world.get_block_number(next_block): + hit_callback(current_block, next_block) + return True + + else: + self.position = list(map(lambda x: self.position[x] + self.vector[x] * distance, range(3))) + + self.block = next_block + self.distance += distance + + return False + + def step(self, hit_callback): + bx, by, bz = self.block + + # point position relative to block centre + local_position = list(map(lambda x: self.position[x] - self.block[x], range(3))) + + # we don't want to deal with negatives, so remove the sign + # this is also cool because it means we don't need to take into account the sign of our ray vector + # we do need to remember which components were negative for later on, however + + sign = [1, 1, 1] # '1' for positive, '-1' for negative + absolute_vector = list(self.vector) + + for component in range(3): + if self.vector[component] < 0: + sign[component] = -1 + + absolute_vector[component] = -absolute_vector[component] + local_position[component] = -local_position[component] + + lx, ly, lz = local_position + vx, vy, vz = absolute_vector + + # calculate intersections + # I only detail the math for the first component (X) because the rest is pretty self-explanatory + + # ray line (passing through the point) r ≡ (x - lx) / vx = (y - ly) / lz = (z - lz) / vz (parametric equation) + + # +x face fx ≡ x = 0.5 (y & z can be any real number) + # r ∩ fx ≡ (0.5 - lx) / vx = (y - ly) / vy = (z - lz) / vz + + # x: x = 0.5 + # y: (y - ly) / vy = (0.5 - lx) / vx IFF y = (0.5 - lx) / vx * vy + ly + # z: (z - lz) / vz = (0.5 - lx) / vx IFF z = (0.5 - lx) / vx * vz + lz + + if vx: + x = 0.5 + y = (0.5 - lx) / vx * vy + ly + z = (0.5 - lx) / vx * vz + lz + + if y >= -0.5 and y <= 0.5 and z >= -0.5 and z <= 0.5: + distance = math.sqrt((x - lx) ** 2 + (y - ly) ** 2 + (z - lz) ** 2) + + # we can return straight away here + # if we intersect with one face, we know for a fact we're not intersecting with any of the others + + return self.check(hit_callback, distance, (bx, by, bz), (bx + sign[0], by, bz)) + + if vy: + x = (0.5 - ly) / vy * vx + lx + y = 0.5 + z = (0.5 - ly) / vy * vz + lz + + if x >= -0.5 and x <= 0.5 and z >= -0.5 and z <= 0.5: + distance = math.sqrt((x - lx) ** 2 + (y - ly) ** 2 + (z - lz) ** 2) + return self.check(hit_callback, distance, (bx, by, bz), (bx, by + sign[1], bz)) + + if vz: + x = (0.5 - lz) / vz * vx + lx + y = (0.5 - lz) / vz * vy + ly + z = 0.5 + + if x >= -0.5 and x <= 0.5 and y >= -0.5 and y <= 0.5: + distance = math.sqrt((x - lx) ** 2 + (y - ly) ** 2 + (z - lz) ** 2) + return self.check(hit_callback, distance, (bx, by, bz), (bx, by, bz + sign[2])) \ No newline at end of file diff --git a/community/main.py b/community/main.py new file mode 100644 index 00000000..7bd61916 --- /dev/null +++ b/community/main.py @@ -0,0 +1,177 @@ + +import math +import random +import pyglet + +pyglet.options["shadow_window"] = False +pyglet.options["debug_gl"] = False + +import pyglet.gl as gl + +import shader +import camera + + +import block_type +import texture_manager + +import world + +import hit + +class Window(pyglet.window.Window): + def __init__(self, **args): + super().__init__(**args) + + # create shader + + self.shader = shader.Shader("vert.glsl", "frag.glsl") + self.shader_sampler_location = self.shader.find_uniform(b"u_TextureArraySampler") + self.shader.use() + + # pyglet stuff + + pyglet.clock.schedule(self.update) + self.mouse_captured = False + + # camera stuff + + self.camera = camera.Camera(self.shader, self.width, self.height) + + # create world + + self.world = world.World(self.camera) + + # misc stuff + + self.holding = 5 + + # bind textures + + gl.glActiveTexture(gl.GL_TEXTURE0) + gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.world.texture_manager.texture_array) + gl.glUniform1i(self.shader_sampler_location, 0) + + # enable cool stuff + + gl.glEnable(gl.GL_DEPTH_TEST) + gl.glEnable(gl.GL_CULL_FACE) + gl.glBlendFunc(gl.GL_SRC_COLOR, gl.GL_ONE_MINUS_SRC_COLOR) + + # Sync status: + self.status = gl.GL_CONDITION_SATISFIED + self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) + + def update(self, delta_time): + # print(pyglet.clock.get_fps()) + + if not self.mouse_captured: + self.camera.input = [0, 0, 0] + + self.camera.update_camera(delta_time) + + def on_draw(self): + self.camera.update_matrices() + + self.status = gl.glClientWaitSync(self.fence, gl.GL_SYNC_FLUSH_COMMANDS_BIT, 2985984) + gl.glDeleteSync(self.fence) + + gl.glClearColor(0.0, 0.0, 0.0, 0.0) + self.clear() + + self.world.draw() + + self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) + gl.glFlush() + + + # input functions + + def on_resize(self, width, height): + print(f"Resize {width} * {height}") + gl.glViewport(0, 0, width, height) + + self.camera.width = width + self.camera.height = height + + def on_mouse_press(self, x, y, button, modifiers): + if not self.mouse_captured: + self.mouse_captured = True + self.set_exclusive_mouse(True) + + return + + # handle breaking/placing blocks + + def hit_callback(current_block, next_block): + if button == pyglet.window.mouse.RIGHT: self.world.set_block(current_block, self.holding) + elif button == pyglet.window.mouse.LEFT: self.world.set_block(next_block, 0) + elif button == pyglet.window.mouse.MIDDLE: self.holding = self.world.get_block_number(next_block) + + hit_ray = hit.Hit_ray(self.world, self.camera.rotation, self.camera.position) + + while hit_ray.distance < hit.HIT_RANGE: + if hit_ray.step(hit_callback): + break + + def on_mouse_motion(self, x, y, delta_x, delta_y): + if self.mouse_captured: + sensitivity = 0.004 + + self.camera.rotation[0] += delta_x * sensitivity + self.camera.rotation[1] += delta_y * sensitivity + + self.camera.rotation[1] = max(-math.tau / 4, min(math.tau / 4, self.camera.rotation[1])) + + def on_mouse_drag(self, x, y, delta_x, delta_y, buttons, modifiers): + self.on_mouse_motion(x, y, delta_x, delta_y) + + def on_key_press(self, key, modifiers): + if not self.mouse_captured: + return + + if key == pyglet.window.key.D: self.camera.input[0] += 1 + elif key == pyglet.window.key.A: self.camera.input[0] -= 1 + elif key == pyglet.window.key.W: self.camera.input[2] += 1 + elif key == pyglet.window.key.S: self.camera.input[2] -= 1 + + elif key == pyglet.window.key.SPACE : self.camera.input[1] += 1 + elif key == pyglet.window.key.LSHIFT: self.camera.input[1] -= 1 + elif key == pyglet.window.key.LCTRL : self.camera.target_speed = camera.SPRINTING_SPEED + + elif key == pyglet.window.key.G: + self.holding = random.randint(1, len(self.world.block_types) - 1) + + elif key == pyglet.window.key.O: + self.world.save.save() + + elif key == pyglet.window.key.ESCAPE: + self.mouse_captured = False + self.set_exclusive_mouse(False) + + def on_key_release(self, key, modifiers): + if not self.mouse_captured: + return + + if key == pyglet.window.key.D: self.camera.input[0] -= 1 + elif key == pyglet.window.key.A: self.camera.input[0] += 1 + elif key == pyglet.window.key.W: self.camera.input[2] -= 1 + elif key == pyglet.window.key.S: self.camera.input[2] += 1 + + elif key == pyglet.window.key.SPACE : self.camera.input[1] -= 1 + elif key == pyglet.window.key.LSHIFT: self.camera.input[1] += 1 + elif key == pyglet.window.key.LCTRL : self.camera.target_speed = camera.WALKING_SPEED + +class Game: + def __init__(self): + self.config = gl.Config(double_buffer = True, + major_version = 3, minor_version = 3, + depth_size = 16) + self.window = Window(config = self.config, width = 854, height = 480, caption = "Minecraft clone", resizable = True, vsync = False) + + def run(self): + pyglet.app.run() + +if __name__ == "__main__": + game = Game() + game.run() diff --git a/community/matrix.py b/community/matrix.py new file mode 100644 index 00000000..7210217a --- /dev/null +++ b/community/matrix.py @@ -0,0 +1,138 @@ + +import copy +import math + +def copy_matrix(matrix): + return copy.deepcopy(matrix) # we need to use deepcopy since we're dealing with 2D arrays + +clean_matrix = [[0.0 for x in range(4)] for x in range(4)] +identity_matrix = copy_matrix(clean_matrix) + +identity_matrix[0][0] = 1.0 +identity_matrix[1][1] = 1.0 +identity_matrix[2][2] = 1.0 +identity_matrix[3][3] = 1.0 + +def multiply_matrices(x_matrix, y_matrix): + result_matrix = copy_matrix(clean_matrix) + + for i in range(4): + for j in range(4): + result_matrix[i][j] = \ + (x_matrix[0][j] * y_matrix[i][0]) + \ + (x_matrix[1][j] * y_matrix[i][1]) + \ + (x_matrix[2][j] * y_matrix[i][2]) + \ + (x_matrix[3][j] * y_matrix[i][3]) + + return result_matrix + +class Matrix: + def __init__(self, base = None): + if type(base) == Matrix: self.data = copy_matrix(base.data) + elif type(base) == list: self.data = copy_matrix(base) + else: self.data = copy_matrix(clean_matrix) + + def load_identity(self): + self.data = copy_matrix(identity_matrix) + + def __mul__(self, matrix): + return Matrix(multiply_matrices(self.data, matrix.data)) + + def __imul__(self, matrix): + self.data = multiply_matrices(self.data, matrix.data) + + def scale(self, x, y, z): + for i in range(4): self.data[0][i] *= x + for i in range(4): self.data[1][i] *= y + for i in range(4): self.data[2][i] *= z + + def translate(self, x, y, z): + for i in range(4): + self.data[3][i] = self.data[3][i] + (self.data[0][i] * x + self.data[1][i] * y + self.data[2][i] * z) + + def rotate(self, angle, x, y, z): + magnitude = math.sqrt(x * x + y * y + z * z) + + x /= -magnitude + y /= -magnitude + z /= -magnitude + + sin_angle = math.sin(angle) + cos_angle = math.cos(angle) + one_minus_cos = 1.0 - cos_angle + + xx = x * x + yy = y * y + zz = z * z + + xy = x * y + yz = y * z + zx = z * x + + xs = x * sin_angle + ys = y * sin_angle + zs = z * sin_angle + + rotation_matrix = copy_matrix(clean_matrix) + + rotation_matrix[0][0] = (one_minus_cos * xx) + cos_angle + rotation_matrix[0][1] = (one_minus_cos * xy) - zs + rotation_matrix[0][2] = (one_minus_cos * zx) + ys + + rotation_matrix[1][0] = (one_minus_cos * xy) + zs + rotation_matrix[1][1] = (one_minus_cos * yy) + cos_angle + rotation_matrix[1][2] = (one_minus_cos * yz) - xs + + rotation_matrix[2][0] = (one_minus_cos * zx) - ys + rotation_matrix[2][1] = (one_minus_cos * yz) + xs + rotation_matrix[2][2] = (one_minus_cos * zz) + cos_angle + + rotation_matrix[3][3] = 1.0 + self.data = multiply_matrices(self.data, rotation_matrix) + + def rotate_2d(self, x, y): + self.rotate(x, 0, 1.0, 0) + self.rotate(-y, math.cos(x), 0, math.sin(x)) + + def frustum(self, left, right, bottom, top, near, far): + deltax = right - left + deltay = top - bottom + deltaz = far - near + + frustum_matrix = copy_matrix(clean_matrix) + + frustum_matrix[0][0] = 2 * near / deltax + frustum_matrix[1][1] = 2 * near / deltay + + frustum_matrix[2][0] = (right + left) / deltax + frustum_matrix[2][1] = (top + bottom) / deltay + frustum_matrix[2][2] = -(near + far) / deltaz + + frustum_matrix[2][3] = -1.0 + frustum_matrix[3][2] = -2 * near * far / deltaz + + self.data = multiply_matrices(self.data, frustum_matrix) + + def perspective(self, fovy, aspect, near, far): + frustum_y = math.tan(math.radians(fovy) / 2) + frustum_x = frustum_y * aspect + + self.frustum(-frustum_x * near, frustum_x * near, -frustum_y * near, frustum_y * near, near, far) + + def orthographic(self, left, right, bottom, top, near, far): + deltax = right - left + deltay = top - bottom + deltaz = far - near + + orthographic_matrix = copy_matrix(identity_matrix) + + orthographic_matrix[0][0] = 2.0 / deltax + orthographic_matrix[3][0] = -(right + left) / deltax + + orthographic_matrix[1][1] = 2.0 / deltay + orthographic_matrix[3][1] = -(top + bottom) / deltay + + orthographic_matrix[2][2] = 2.0 / deltax + orthographic_matrix[3][2] = -(near + far) / deltaz + + self.data = multiply_matrices(self.data, orthographic_matrix) diff --git a/community/models/__init__.py b/community/models/__init__.py new file mode 100644 index 00000000..2de92c17 --- /dev/null +++ b/community/models/__init__.py @@ -0,0 +1,27 @@ +# all possible models + +__all__ = [ + "cube", + "plant", + "liquid", + "leaves", + "glass", + "slab", + "torch", + "fire", + "stairs", + "flat", + "crop", + "soil", + "sign_post", + "door", + "ladder", + "sign", + "lever", + "pressure_plate", + "button", + "snow", + "cactus", +] + +from . import * \ No newline at end of file diff --git a/community/models/button.py b/community/models/button.py new file mode 100644 index 00000000..cec02833 --- /dev/null +++ b/community/models/button.py @@ -0,0 +1,31 @@ +translucent = False +transparent = True +is_cube = False +glass = False + +vertex_positions = [ + [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right + [-0.5, 0.0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.0, 0.5], # left + [ 0.5, 0.0, 0.5, 0.5, 0.0, -0.5, -0.5, 0.0, -0.5, -0.5, 0.0, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.0, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.0, 0.5], # front + [ 0.5, 0.0, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.0, -0.5], # back +] + +tex_coords = [ + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/cactus.py b/community/models/cactus.py new file mode 100644 index 00000000..b049b4fb --- /dev/null +++ b/community/models/cactus.py @@ -0,0 +1,31 @@ +translucent = False +transparent = True +is_cube = False +glass = False + +vertex_positions = [ + [ 0.4375, 0.5000, 0.5000, 0.4375, -0.5000, 0.5000, 0.4375, -0.5000, -0.5000, 0.4375, 0.5000, -0.5000], # right + [-0.4375, 0.5000, -0.5000, -0.4375, -0.5000, -0.5000, -0.4375, -0.5000, 0.5000, -0.4375, 0.5000, 0.5000], # left + [ 0.5000, 0.5000, 0.5000, 0.5000, 0.5000, -0.5000, -0.5000, 0.5000, -0.5000, -0.5000, 0.5000, 0.5000], # top + [-0.5000, -0.5000, 0.5000, -0.5000, -0.5000, -0.5000, 0.5000, -0.5000, -0.5000, 0.5000, -0.5000, 0.5000], # bottom + [-0.5000, 0.5000, 0.4375, -0.5000, -0.5000, 0.4375, 0.5000, -0.5000, 0.4375, 0.5000, 0.5000, 0.4375], # front + [ 0.5000, 0.5000, -0.4375, 0.5000, -0.5000, -0.4375, -0.5000, -0.5000, -0.4375, -0.5000, 0.5000, -0.4375], # back +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/crop.py b/community/models/crop.py new file mode 100644 index 00000000..fd377819 --- /dev/null +++ b/community/models/crop.py @@ -0,0 +1,37 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.25, 0.4375, 0.50, 0.25, -0.5625, 0.50, 0.25, -0.5625, -0.50, 0.25, 0.4375, -0.50], # right + [ 0.25, 0.4375, -0.50, 0.25, -0.5625, -0.50, 0.25, -0.5625, 0.50, 0.25, 0.4375, 0.50], # right + [-0.25, 0.4375, -0.50, -0.25, -0.5625, -0.50, -0.25, -0.5625, 0.50, -0.25, 0.4375, 0.50], # left + [-0.25, 0.4375, 0.50, -0.25, -0.5625, 0.50, -0.25, -0.5625, -0.50, -0.25, 0.4375, -0.50], # left + [-0.50, 0.4375, 0.25, -0.50, -0.5625, 0.25, 0.50, -0.5625, 0.25, 0.50, 0.4375, 0.25], # front + [ 0.50, 0.4375, 0.25, 0.50, -0.5625, 0.25, -0.50, -0.5625, 0.25, -0.50, 0.4375, 0.25], # front + [ 0.50, 0.4375, -0.25, 0.50, -0.5625, -0.25, -0.50, -0.5625, -0.25, -0.50, 0.4375, -0.25], # back + [-0.50, 0.4375, -0.25, -0.50, -0.5625, -0.25, 0.50, -0.5625, -0.25, 0.50, 0.4375, -0.25], # back +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/cube.py b/community/models/cube.py new file mode 100644 index 00000000..e80d6a75 --- /dev/null +++ b/community/models/cube.py @@ -0,0 +1,32 @@ +transparent = False +is_cube = True +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right + [-0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5], # left + [ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5], # front + [ 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5], # back +] + +# Deprecating +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/door.py b/community/models/door.py new file mode 100644 index 00000000..184033fc --- /dev/null +++ b/community/models/door.py @@ -0,0 +1,31 @@ +transparent = False +is_cube = True +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right + [-0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5], # left + [ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5], # front + [ 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5], # back +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/fire.py b/community/models/fire.py new file mode 100644 index 00000000..a80d50c2 --- /dev/null +++ b/community/models/fire.py @@ -0,0 +1,25 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], + [-0.3536, 0.5000, -0.3536, -0.3536, -0.5000, -0.3536, 0.3536, -0.5000, 0.3536, 0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, -0.3536, 0.3536, -0.5000, -0.3536, -0.3536, -0.5000, 0.3536, -0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, 0.3536, 0.3536, -0.5000, 0.3536, -0.3536, -0.5000, -0.3536, -0.3536, 0.5000, -0.3536], +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], +] \ No newline at end of file diff --git a/community/models/flat.py b/community/models/flat.py new file mode 100644 index 00000000..d25ecd9f --- /dev/null +++ b/community/models/flat.py @@ -0,0 +1,19 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top + [-0.5, -0.4375, 0.5, -0.5, -0.4375, -0.5, 0.5, -0.4375, -0.5, 0.5, -0.4375, 0.5], # bottom +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], +] \ No newline at end of file diff --git a/community/models/glass.py b/community/models/glass.py new file mode 100644 index 00000000..9c0f6df6 --- /dev/null +++ b/community/models/glass.py @@ -0,0 +1,31 @@ +transparent = True +is_cube = True +glass = True +translucent = False + +vertex_positions = [ + [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right + [-0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5], # left + [ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5], # front + [ 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5], # back +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/ladder.py b/community/models/ladder.py new file mode 100644 index 00000000..a80d50c2 --- /dev/null +++ b/community/models/ladder.py @@ -0,0 +1,25 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], + [-0.3536, 0.5000, -0.3536, -0.3536, -0.5000, -0.3536, 0.3536, -0.5000, 0.3536, 0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, -0.3536, 0.3536, -0.5000, -0.3536, -0.3536, -0.5000, 0.3536, -0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, 0.3536, 0.3536, -0.5000, 0.3536, -0.3536, -0.5000, -0.3536, -0.3536, 0.5000, -0.3536], +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], +] \ No newline at end of file diff --git a/community/models/leaves.py b/community/models/leaves.py new file mode 100644 index 00000000..dfc86c88 --- /dev/null +++ b/community/models/leaves.py @@ -0,0 +1,31 @@ +transparent = True +is_cube = True +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right + [-0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5], # left + [ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5], # front + [ 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5], # back +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/lever.py b/community/models/lever.py new file mode 100644 index 00000000..66257452 --- /dev/null +++ b/community/models/lever.py @@ -0,0 +1,31 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right + [-0.5, 0.0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.0, 0.5], # left + [ 0.5, 0.0, 0.5, 0.5, 0.0, -0.5, -0.5, 0.0, -0.5, -0.5, 0.0, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.0, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.0, 0.5], # front + [ 0.5, 0.0, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.0, -0.5], # back +] + +tex_coords = [ + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/liquid.py b/community/models/liquid.py new file mode 100644 index 00000000..e951fd9f --- /dev/null +++ b/community/models/liquid.py @@ -0,0 +1,43 @@ +# in the end, it'd be nice to have it so that liquids fill up the whole block when they have a block above them +# this would avoid the problems this solution has + +translucent = True +transparent = True +is_cube = True +glass = True + +vertex_positions = [ + [ 0.500, 0.375, 0.500, 0.500, -0.625, 0.500, 0.500, -0.625, -0.500, 0.500, 0.375, -0.500], # right + [-0.500, 0.375, -0.500, -0.500, -0.625, -0.500, -0.500, -0.625, 0.500, -0.500, 0.375, 0.500], # left + [ 0.500, 0.375, 0.500, 0.500, 0.375, -0.500, -0.500, 0.375, -0.500, -0.500, 0.375, 0.500], # top + [-0.500, -0.625, 0.500, -0.500, -0.625, -0.500, 0.500, -0.625, -0.500, 0.500, -0.625, 0.500], # bottom + [-0.500, 0.375, 0.500, -0.500, -0.625, 0.500, 0.500, -0.625, 0.500, 0.500, 0.375, 0.500], # front + [ 0.500, 0.375, -0.500, 0.500, -0.625, -0.500, -0.500, -0.625, -0.500, -0.500, 0.375, -0.500], # back +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +_shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0] +] \ No newline at end of file diff --git a/community/models/plant.py b/community/models/plant.py new file mode 100644 index 00000000..a80d50c2 --- /dev/null +++ b/community/models/plant.py @@ -0,0 +1,25 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], + [-0.3536, 0.5000, -0.3536, -0.3536, -0.5000, -0.3536, 0.3536, -0.5000, 0.3536, 0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, -0.3536, 0.3536, -0.5000, -0.3536, -0.3536, -0.5000, 0.3536, -0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, 0.3536, 0.3536, -0.5000, 0.3536, -0.3536, -0.5000, -0.3536, -0.3536, 0.5000, -0.3536], +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], +] \ No newline at end of file diff --git a/community/models/pressure_plate.py b/community/models/pressure_plate.py new file mode 100644 index 00000000..d25ecd9f --- /dev/null +++ b/community/models/pressure_plate.py @@ -0,0 +1,19 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top + [-0.5, -0.4375, 0.5, -0.5, -0.4375, -0.5, 0.5, -0.4375, -0.5, 0.5, -0.4375, 0.5], # bottom +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], +] \ No newline at end of file diff --git a/community/models/sign.py b/community/models/sign.py new file mode 100644 index 00000000..a80d50c2 --- /dev/null +++ b/community/models/sign.py @@ -0,0 +1,25 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], + [-0.3536, 0.5000, -0.3536, -0.3536, -0.5000, -0.3536, 0.3536, -0.5000, 0.3536, 0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, -0.3536, 0.3536, -0.5000, -0.3536, -0.3536, -0.5000, 0.3536, -0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, 0.3536, 0.3536, -0.5000, 0.3536, -0.3536, -0.5000, -0.3536, -0.3536, 0.5000, -0.3536], +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], +] \ No newline at end of file diff --git a/community/models/sign_post.py b/community/models/sign_post.py new file mode 100644 index 00000000..a80d50c2 --- /dev/null +++ b/community/models/sign_post.py @@ -0,0 +1,25 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], + [-0.3536, 0.5000, -0.3536, -0.3536, -0.5000, -0.3536, 0.3536, -0.5000, 0.3536, 0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, -0.3536, 0.3536, -0.5000, -0.3536, -0.3536, -0.5000, 0.3536, -0.3536, 0.5000, 0.3536], + [ 0.3536, 0.5000, 0.3536, 0.3536, -0.5000, 0.3536, -0.3536, -0.5000, -0.3536, -0.3536, 0.5000, -0.3536], +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0], +] \ No newline at end of file diff --git a/community/models/slab.py b/community/models/slab.py new file mode 100644 index 00000000..66257452 --- /dev/null +++ b/community/models/slab.py @@ -0,0 +1,31 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right + [-0.5, 0.0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.0, 0.5], # left + [ 0.5, 0.0, 0.5, 0.5, 0.0, -0.5, -0.5, 0.0, -0.5, -0.5, 0.0, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.0, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.0, 0.5], # front + [ 0.5, 0.0, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.0, -0.5], # back +] + +tex_coords = [ + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/snow.py b/community/models/snow.py new file mode 100644 index 00000000..d25ecd9f --- /dev/null +++ b/community/models/snow.py @@ -0,0 +1,19 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top + [-0.5, -0.4375, 0.5, -0.5, -0.4375, -0.5, 0.5, -0.4375, -0.5, 0.5, -0.4375, 0.5], # bottom +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], +] \ No newline at end of file diff --git a/community/models/soil.py b/community/models/soil.py new file mode 100644 index 00000000..af5bb98a --- /dev/null +++ b/community/models/soil.py @@ -0,0 +1,31 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, 0.4375, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.4375, -0.5], # right + [-0.5, 0.4375, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.4375, 0.5], # left + [ 0.5, 0.4375, 0.5, 0.5, 0.4375, -0.5, -0.5, 0.4375, -0.5, -0.5, 0.4375, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.4375, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.4375, 0.5], # front + [ 0.5, 0.4375, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.4375, -0.5], # back +] + +tex_coords = [ + [0.0, 0.9375, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.9375, 0.0], + [0.0, 0.9375, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.9375, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 0.9375, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.9375, 0.0], + [0.0, 0.9375, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.9375, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/stairs.py b/community/models/stairs.py new file mode 100644 index 00000000..66257452 --- /dev/null +++ b/community/models/stairs.py @@ -0,0 +1,31 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right + [-0.5, 0.0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.0, 0.5], # left + [ 0.5, 0.0, 0.5, 0.5, 0.0, -0.5, -0.5, 0.0, -0.5, -0.5, 0.0, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.0, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.0, 0.5], # front + [ 0.5, 0.0, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.0, -0.5], # back +] + +tex_coords = [ + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], + [0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.5, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] \ No newline at end of file diff --git a/community/models/torch.py b/community/models/torch.py new file mode 100644 index 00000000..75239771 --- /dev/null +++ b/community/models/torch.py @@ -0,0 +1,31 @@ +transparent = True +is_cube = False +glass = False +translucent = False + +vertex_positions = [ + [ 0.0625, 0.5, 0.5, 0.0625, -0.5, 0.5, 0.0625, -0.5, -0.5, 0.0625, 0.5, -0.5], # right + [-0.0625, 0.5, -0.5, -0.0625, -0.5, -0.5, -0.0625, -0.5, 0.5, -0.0625, 0.5, 0.5], # left + [ 0.5, 0.125, 0.5, 0.5, 0.125, -0.5, -0.5, 0.125, -0.5, -0.5, 0.125, 0.5], # top + [-0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5], # bottom + [-0.5, 0.5, 0.0625, -0.5, -0.5, 0.0625, 0.5, -0.5, 0.0625, 0.5, 0.5, 0.0625], # front + [ 0.5, 0.5, -0.0625, 0.5, -0.5, -0.0625, -0.5, -0.5, -0.0625, -0.5, 0.5, -0.0625], # back +] + +tex_coords = [ + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], +] + +shading_values = [ + [0.6, 0.6, 0.6, 0.6], + [0.6, 0.6, 0.6, 0.6], + [1.0, 1.0, 1.0, 1.0], + [0.4, 0.4, 0.4, 0.4], + [0.8, 0.8, 0.8, 0.8], + [0.8, 0.8, 0.8, 0.8], +] diff --git a/episode-11/options.py b/community/options.py similarity index 100% rename from episode-11/options.py rename to community/options.py diff --git a/episode-11/render_region.py b/community/render_region.py similarity index 100% rename from episode-11/render_region.py rename to community/render_region.py diff --git a/community/save.py b/community/save.py new file mode 100644 index 00000000..6fe61755 --- /dev/null +++ b/community/save.py @@ -0,0 +1,95 @@ +import nbtlib as nbt +import base36 + +import chunk + +class Save: + def __init__(self, world, path = "save"): + self.world = world + self.path = path + + def chunk_position_to_path(self, chunk_position): + x, y, z = chunk_position + + chunk_path = '/'.join((self.path, + base36.dumps(x % 64), base36.dumps(z % 64), + f"c.{base36.dumps(x)}.{base36.dumps(z)}.dat")) + + return chunk_path + + def load_chunk(self, chunk_position): + # load the chunk file + + chunk_path = self.chunk_position_to_path(chunk_position) + + try: + chunk_blocks = nbt.load(chunk_path)["Level"]["Blocks"] + + except FileNotFoundError: + return + + # create chunk and fill it with the blocks from our chunk file + + self.world.chunks[chunk_position] = chunk.Chunk(self.world, chunk_position) + + for x in range(chunk.CHUNK_WIDTH): + for y in range(chunk.CHUNK_HEIGHT): + for z in range(chunk.CHUNK_LENGTH): + self.world.chunks[chunk_position].blocks[x][y][z] = chunk_blocks[ + x * chunk.CHUNK_LENGTH * chunk.CHUNK_HEIGHT + + z * chunk.CHUNK_HEIGHT + + y] + + def save_chunk(self, chunk_position): + x, y, z = chunk_position + + # try to load the chunk file + # if it doesn't exist, create a new one + + chunk_path = self.chunk_position_to_path(chunk_position) + + try: + chunk_data = nbt.load(chunk_path) + + except FileNotFoundError: + chunk_data = nbt.File({"": nbt.Compound({"Level": nbt.Compound()})}) + + chunk_data["Level"]["xPos"] = x + chunk_data["Level"]["zPos"] = z + + # fill the chunk file with the blocks from our chunk + + chunk_blocks = nbt.ByteArray([0] * (chunk.CHUNK_WIDTH * chunk.CHUNK_HEIGHT * chunk.CHUNK_LENGTH)) + + for x in range(chunk.CHUNK_WIDTH): + for y in range(chunk.CHUNK_HEIGHT): + for z in range(chunk.CHUNK_LENGTH): + chunk_blocks[ + x * chunk.CHUNK_LENGTH * chunk.CHUNK_HEIGHT + + z * chunk.CHUNK_HEIGHT + + y] = self.world.chunks[chunk_position].blocks[x][y][z] + + # save the chunk file + + chunk_data["Level"]["Blocks"] = chunk_blocks + chunk_data.save(chunk_path, gzipped = True) + + def load(self): + # for x in range(-1, 15): + # for y in range(-15, 1): + # self.load_chunk((x, y)) + + for x in range(-4, 4): + for y in range(-4, 4): + self.load_chunk((x, 0, y)) + + def save(self): + for chunk_position in self.world.chunks: + if chunk_position[1] != 0: # reject all chunks above and below the world limit + continue + + chunk = self.world.chunks[chunk_position] + + if chunk.modified: + self.save_chunk(chunk_position) + chunk.modified = False diff --git a/community/save/0/0/c.0.0.dat b/community/save/0/0/c.0.0.dat new file mode 100644 index 0000000000000000000000000000000000000000..bc537027fc83a53d9cbb561491a48187726850c2 GIT binary patch literal 4557 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

Yan$9N**NK;(AozYns;yw457#L zhH;KP95T?DluG2P`4{LMH(Tot*#p{>(x$KfWY&ounAyD8pazM*UJA;dYe1=g+ALB+ z`zoBxxCh6vtjJ$d;2nD9Hc!q`{2tnuct>8&p`xdtR>5DU((`n|Tk=H{VUxnxrp_^$ z9`*evw93sfWl^dip)1P6>gH28d#1N@3ly%Q-bgjUI)CS*ip8F zaIi|)jc$y(c>OVHRArR!XN4KA_$N)&BH&) zZLT$vYl-{4=xl3ee}zRe#3Q^k-q+JDAE`UNRA<+=j-i22#=4Dh#|=hjcox~r%VI1S z3vf}>Luq-Y@olz8ZK?DOgx;7IOzzN*eeJW83U{l@x+~kJ<(hxuFLgaD%v-cqy=D37 zkE=flHZiRbylm^7&R)m=@uwCjl*rLyy|?9x{A+O_vG>vUIuLZC2psfV5tvNT=$!q4 zC2rzW#B7-H^$1!jEeDl5fVC6&tx%TC&BvCzc#yIL(p_h{J;5}lY&K?4@{N*zF9m&a zKqp3k?HgIOz&g}Pckm|rFnZDk`Yiz5$Ki3{XIez=iWgK}Sq)LRZ>Q|$E2s$iz5(+Y z;r2>;e)9oa!osCcve-UX29mqLM|z>!rX8HXf7Zb>_ETSlr4EI%eJj9IHL=r4MIsOA zZxkxG=EZ#b0pmJY#CPFVQTxu(=3wSSkVf&kOMJQq9p-6cbhTTy(Yp>R&jme|I=3y84y~;Gft?`l8_4{A*f*XYFsLb_x0g~fP8EDw!x{+F^(F}9xLKCap(1swjZB)r z{_Xt`CeYbm5&xTDr7)i260$JM>S%E~@k2WE)&*%5EuFE%gO^1Um5WDl`Il89+TDE9 zmz5%#BVas?48wv&T4ZVUg@!X$&@r(eU{I#Gxg2H$epnw6Cvc~@A@Qd;qS&}YbvoJZ zd3N?pzG-zN*eSAK?U=#1rACA$kq78VwWoo@kaJxV+#0%a^BFLPxKM3V#t8~ie}r`_ z=))jdm;S6mkeo|Y<{7r9T~rNOjtVrGh@Y}93!M#90ueH*iiP%Hhff9Vsi-Db`&c!3 z|5BXyj>cr_oy2QBC(Ni&JVOsfs_)T@1Wzbd44`(o#U}Vx0_4=dniTBcOuqwFbNKq# zTu;;L$Mk_87EP=!BEQwuj_~@>^QSUSGh`JZ-LtY%ySf;a|185};TUDw9FTy7gG8N* z>#h+t=b)R=iKJHqV$0cotdedPK1#%MY-G z4vhDZ_zbmeCVBBD#+G`U6QJNh8IOKua>z*#E=T1SHyCtN#+KRx!pqVhttXAv5_5ca zefZtDI4}*Z?n0V~hm~r}+UujLTE@QRbjr8cSbqiFWN@37N;rGaRJ=}!id6f(rjx(6 zf}5s|6mS%CgF1TZyC5U{qTEx*hJ{ySYt=klt*>8~Jfql}On6q2xeIVf_@RoH^8z2L zd|vjeM=To-yWFZmi$97lULxk!#uL%X_{Yn_-s}JD4KxkqVDp;p&}GG6jPWC1)*Q{o z1R75AnmW}AuDT5S$GHHIFQ1m}9|LJe+2i~oU?K?D-|@-QIasiDz^or#R%kt#VO8+e z_MlOkj&$^PJ@n>?v7nH+`a&4{`|-HmLB|J|u3F!PGcgCkn|QTyS;*&GM%{~h;nHu} zqe(pz^}{>atnWa#;DTTrFX{giON7i+pnNA)zOlstoYn|DO@cWD;aPH1T7bNq$2Pj& zsbtn10!)N9HU34~3VH~Y)Q$WT;yUZvG-%d|c)Hy251(=;atuX#f?w0pIxbm{@~Kng z4GjNZh&j@cv<*FoKBNCm*KwAcoO<|39hGbyPfm|8^I2y-$MK25`aUrqdGYMU3gz?|U;K0& zzpu>TNn!k;X3XA_)1OBQfFw(dMv?WE* z3YgX#L3NC?kQezN1PP{&>;b9>8X*^De^d33Lw- zckXeCBnPSQk^qb$Zp6u)4ki#S#o+*qtC zd5wSnp9_0E4zD~<&h3cN>W_gh$2d5;MED**=#1QFI?F-`LC%8hgzOSRNW8}tWm+0~R(}4wm8ASd0=$RV>`af0K2ju_& literal 0 HcmV?d00001 diff --git a/community/save/0/1o/c.0.-4.dat b/community/save/0/1o/c.0.-4.dat new file mode 100644 index 0000000000000000000000000000000000000000..d840026b2d9b7e6e1e7a5d16c477da7c16490b91 GIT binary patch literal 2925 zcmb7>Sx{4H0)+!OfLmxp8wDk3x9u`2xU>k-Txitb0;srx5X2Fr5rQk5StG z!VQ8_3L=6CN@TkzC}4;|SrUj45F{ZGvyg?{+%TD5?|k?9ReFEt0?mcBg1aGI(tU;1G3U%XpTsB~EE7mBqqH*%uCK0UB_~fZi)r|X zPFd(B-j45h6g!K(&vvLMc(!Bg2pgFmqTw|0ZYw4#{z3fgo>~(knRI>L=XOgr@W#^r^m8XWeek4b!Ib;q$3GHFcdOP~s98W&4eP<6x)b2{9 zWAhN|)V-sm_dI?-`zKA|lQ`Q1syA&8eD3`7VDKEiRBCvyK|H^Hn1e8vkHc`%A zeW`>qw*x=oFguCr0%Z|SI})R7FPm$=P+haKDO_YKRC9wvibL;twCu)XSIy2qRUj$Uo_z)2D7c!OmvJ;M$Mv#7m>Ifk8paMv=Pkt z5d0lfUccl+GRijNM~1iy;7iJ1_z)5`$h<83z|_*aP>~e&HdNKDl$C(ptWdDK6{@zn z)h$|WceeKO>Vj7I0kRXTocsx5GrD))N5_VaSrhJD}M`5**8VpwJh%f^(cjJAi1Ss-7 z-&05}4`n~Dx)`4_O0z-3bRDB7afeRXV9esxxTugNu_-FSD!*0vfg)^>eA~dA@_9m3 zt2G_)jWF=IJb%z`Rx6+x1rO5J4H70j)@ZD1dcpH~-7DT

CCu9`b4 zmqy?F*kvouI|!bbz>=?GB{vJs^zkgNk2Vi>@NS{ZThLaVa-EShP=wQkGRMeh7G#yT z9i;O)11jjBo%8P9$two|eRW+;S`H0_*VgwMm9zK2Tcg&tsDIBMgH7su+@bFRIg949 z7)0jMT2bjkun)XxMuLQ>`a2|<6ximU$!Ca*iN>$i0x3_ct`zQ#%g@qqS;Xh3ZtfOd zsmuMC-hs|gF{RpWNLM)O;Q{k8SACKX%V~qzn+9fRmo!;Gom1R#%-@i+4{)%8(S*=! zKb$F%BRg=l#q%55*uwkyFm^Q^9Yqf$w8UZa#~2hsm+$lDJ@S!NYc`myhDE2U7O-D# z0X0LSHl7KZ`J}uwblM+LO1N2$#9Me*Wq}Fpa2D}rc#)X*ilbR6VD2Y&CF-(htYbxU z6_btbJ`LK*aGLx1p=PS3jT9`A?v>W&mXJ|jD)` zR!|wZWU~-Mtt4=XjUI{5o;SoC;ROQe&}G`%Z+GEbGxPJDMrz{+Xg^7BY+iSy1r7Pp zy>X3s1m-D7AK(G`(e@fmqTT{fM5a&s^NMH4=YH$z!y=CW}w3FB3BY{MFE&G31_hbo=vV2ZJD2E_~qPP5A7cU$tQh1uBg=Di@X|HC-X9 za#{^CI@n;S60cTl+24_D;+#jki{>%@<{F}uGlYnt6I^@%0@}tr3WnmQv2Vikm25$)wSv(@;z!;4C*nk`%8_M?;0xo_KYg`TJh;^?9>jjA;}Yc1Pd=`e z;MRp>aIUNizguiI8xCd_XLzy#K=+X`STMas&Rc=eKLHxD55!}_2>X1f*9czi{#CUs zM_ILX;Yp(N8Hn~&!U9>p*llIaJoo_!I}iNQjdCv_VPIH}>mx#OOgF%mKrD*`g|^6; zbW5dvGr2o0$2@DiKqPx4%`g}ABXkwWkjVbP_CQ~I={&Hbs(FI)K{n&|rWVMAapTo% zc<(Sqb@~Y$Hj#z!4TcUXt~)gYtkBur1pbFDCbi00Qx2QLzMvPnJuC|0B6uXBY`#jm zNJ$^ZgrNgP*m3OK*da;tM?_*gL}VCXt(luCV@48h4QV}QB-s*{NPM|qRxgiieva74 z!Dp4KI|{N(TL;VYKoqx!+V+mHHtTH1ci)2WBEpndG=(uqj(&^CBe}p#uugw_((Fq>7|K2o?dBylqE<=yqsi_+V zC8`A@6`H@CC{z%ghwKmm5M$Z9Y11YVGGidoxc|xK-00+TXq+)#50{G)L+`g}(&dx- zGgWITNQ;AR!mNEjW2G#;Y3ex^hOiqE(c6fAQ(EaSUpYh0 z_9HhW=BJ((g~8wb_S$wcrG}MH2+)Pg6LM%+Qa(;^r=26Vf%+5di6o<8h+N6Bs4aXf z>Gtc$em>kVE7_=$t~|~qlS;tt*Tdk&NrxcB@>&iMzcfB;^D8>;+~#te_(%hP`=9#B z!v~)%f#I`fbHUvrm4h51QqO4xPoGx7bsKBE;oOb;cp&j)3Ze4wa`tkTi?Ad_ODFzX4*Gn7IG| literal 0 HcmV?d00001 diff --git a/community/save/0/1p/c.0.-3.dat b/community/save/0/1p/c.0.-3.dat new file mode 100644 index 0000000000000000000000000000000000000000..f1210d2effae7b79c58cdcb7c2f6f472cacde9b0 GIT binary patch literal 3135 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 RqgN=LgKD3C{mhF<_#bL>(H#H) literal 0 HcmV?d00001 diff --git a/community/save/0/1q/c.0.-2.dat b/community/save/0/1q/c.0.-2.dat new file mode 100644 index 0000000000000000000000000000000000000000..1d0f5490eb9703dc09b6f33833450b6805f77eb1 GIT binary patch literal 2939 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 v>E%t>ID`&H* z`VS;BKpu4})gixsiD81~eNL{4>U$O?pU@_nD`v%KHk+r69ko#tkE3$bGbUMYnSg@U zJnAU|7oNrh-Rk(+c)#_jfg1I@@G0 z-6kJaf`xl?!a87@d#)_o2Zql@lN!hIbVv8@T-{&+(-3YIAv=~c;1MV(EG5cLnszL( z=z|J!NgY4Mm&9>=A)~H>UM!Z#5Q-z}o_+Ro!6Ungw92ZMTd3%?|rum6?27Q`2fGhgzqbPvK5}wPEI!dO0p-DGW$C zw*%XdV81dA=N0KSg@!>H)nUsNY%$(Bk*j7P$jj^&qx7QT^}4Hz)bMPQoSL_^v;}$o znBG?Lgt`-_`472bNQvkQXm1C$mh;8@(>Qa~z?5dE1@7Gza~xkf28kJY zqtsH%X)&04G${nIMolZPg3mQ&Og}<-pB>`O!*@p+d7xA6{M8v5bl%zre!>zg*p)Ca zqsOqqgp#D3mKI+@)e;rs9Cjz5&Y2%eJiaE|w=I}Gwm2PoaEL~%rxR-?*@%C5O$vcT zvNacx9{AR3gcYr&&`27FhZJg9(QyGqjnx?HZard>x@q>4lUGVFvqyC(8#6CwoOk;n zzPUD}6YZRGnP9IWKI?=b0sQ%}xD8glQG9G+=UQtXXdy^A^MUy=_HaNLcA{9=`2rU=M|nDi;*9!?if zlX8lUoLlZt?7--RKVenW@gY`BW;6JdJ^-xE6?&JOf=$T_m%Rju1>P>`I6p_6I0>Gm zpnPZOrn)yBTlPj@F6Bx{4{XR zXRKRtYN8K(Er)+A(C>+az&$76y2-BK`{Dw!t)|1sQ5C)A-qeC*-8z}Ox1Y3v^lk|?%|P;^fT?e4>v$_`4o%UY>jdl|SAoge4yxOEVg zsVkbqBRD;+{qR;kage%&CjF)Kw?} z0{cr8W!Hq#O)Ttmt_-QJH*RR!_chsi26eNn@9$gNBzE{<7+fexJ`U}JV5TuEgI=r- zwSRb>_9w-w+XPAh2a+50;1dDWvyw$)!3MeK3!#aTo-ZM1sNLd$HVDjLxE^xd{es@v zxFu&np;7o&IOo}irOX@P=sk{Bk1}%R38fRLIn`;@lxM{#)QN4iJgnUxxW7w%+PGtg}~vi!!ksJun-?wV2n7sB}e-22Kw6yg>(@M-~{r zgk866JpI)IC1cK;4Nf|q>$DvM_)I`qaaaz1L@%A5ac75Esf_fs7S1|Yct;rr!(`O% zR_ohA`B zD8k~T`MiYcUF`0W=&%(8hTJ~5!FZ}am7d*HOvayH_M zmO+O<`#a{D(ksczyQOt7ReOp-+T}6?e0*2@d~g%LZ$(mW`7lgwv@;_|#R=9ncc^!BW|~KYL+)ODV3fKaPfs3^ zwH;m_au5%Qn(zA>Em%|-pVhzbBNg^~ipm&R?-R+>=IKZtw6h0?B z_QRb#Fh=lz+1DK{-#Y6$0mD*K)+9ZzRVla$T=s}|gFxN!7uAE;Tr)2Ieiw#si(K}x zXNW@i(Qj}>w{O$N^Cf>Li8p?4C+?|E15E8Msd7vS3`hH7Djx`g3R3`^lG3v(42 z%!`3k&Z!o1)Fr4${T#ZAGMcIGBJ=xMBKE8LzBJ&*d)xB%zx_W}xTg8)x4I5~mTM!g zK7H3Wy3qyVYn#E-`UW#0QAi~GB?4cF@%GB;TxNX3XRKqEVUf=Nfb+*5pS1G&?!YdH zHN@A=aSr?BHsv|=p18dCUMGK0GG$mv`mWOJ|G)(9?ny+qpwDXgz2BO@f&@N2F{Ld_ rN8*&zdaiC)5G&t} literal 0 HcmV?d00001 diff --git a/community/save/0/3/c.0.3.dat b/community/save/0/3/c.0.3.dat new file mode 100644 index 0000000000000000000000000000000000000000..69d837c0898c530595f89a069fd2fbdfd938c356 GIT binary patch literal 2437 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 literal 0 HcmV?d00001 diff --git a/community/save/1/1/c.1.1.dat b/community/save/1/1/c.1.1.dat new file mode 100644 index 0000000000000000000000000000000000000000..ab84ceb077a0d8db403b883ccb6677215f3f1bd1 GIT binary patch literal 3057 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 Z%stwi)#83$=p4`wcFJ+Df^~Y(e*h|~z#sqs literal 0 HcmV?d00001 diff --git a/community/save/1/1o/c.1.-4.dat b/community/save/1/1o/c.1.-4.dat new file mode 100644 index 0000000000000000000000000000000000000000..bf48008f1b52a52d36aa124ed8c82c7de5c0f4e7 GIT binary patch literal 2765 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 G%Krh{4iI$! literal 0 HcmV?d00001 diff --git a/community/save/1/1p/c.1.-3.dat b/community/save/1/1p/c.1.-3.dat new file mode 100644 index 0000000000000000000000000000000000000000..f4a072cdd91fabc0e2744dd7144f5499da0827cf GIT binary patch literal 3205 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 literal 0 HcmV?d00001 diff --git a/community/save/1o/1/c.-4.1.dat b/community/save/1o/1/c.-4.1.dat new file mode 100644 index 0000000000000000000000000000000000000000..cb2288847b190dfe7cd585d9436bc2cc1faa451e GIT binary patch literal 3195 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 literal 0 HcmV?d00001 diff --git a/community/save/1o/3/c.-4.3.dat b/community/save/1o/3/c.-4.3.dat new file mode 100644 index 0000000000000000000000000000000000000000..bde272ba9853c408fb038dc03f15ef9fa287283e GIT binary patch literal 3046 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 literal 0 HcmV?d00001 diff --git a/community/save/1p/0/c.-3.0.dat b/community/save/1p/0/c.-3.0.dat new file mode 100644 index 0000000000000000000000000000000000000000..549461daa46696c8ff6f7f207fcf31940ad95ac2 GIT binary patch literal 3549 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 T5LWdcR1jVk=E*7#sNnt&`UvAl literal 0 HcmV?d00001 diff --git a/community/save/1p/1/c.-3.1.dat b/community/save/1p/1/c.-3.1.dat new file mode 100644 index 0000000000000000000000000000000000000000..074d25b77b4cc077147ac71da523d86d15af6046 GIT binary patch literal 4020 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 Fe*xG<&g}pI literal 0 HcmV?d00001 diff --git a/community/save/1p/1o/c.-3.-4.dat b/community/save/1p/1o/c.-3.-4.dat new file mode 100644 index 0000000000000000000000000000000000000000..c9a6d415e70b0954c901ac5c96125d776525e7ba GIT binary patch literal 3005 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 literal 0 HcmV?d00001 diff --git a/community/save/1p/1r/c.-3.-1.dat b/community/save/1p/1r/c.-3.-1.dat new file mode 100644 index 0000000000000000000000000000000000000000..738fcacf2e496a3178fb3aebbfe6b7523a2e7a7e GIT binary patch literal 3529 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 literal 0 HcmV?d00001 diff --git a/community/save/1p/3/c.-3.3.dat b/community/save/1p/3/c.-3.3.dat new file mode 100644 index 0000000000000000000000000000000000000000..bec68c2c21fe2192f0d9e7eb446c79c64a66f70f GIT binary patch literal 3179 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 O(rK8p)w$F|i}oM!?=FS_ literal 0 HcmV?d00001 diff --git a/community/save/1q/1/c.-2.1.dat b/community/save/1q/1/c.-2.1.dat new file mode 100644 index 0000000000000000000000000000000000000000..1045f76a19978bca07bfbcd91224ad81d59b6936 GIT binary patch literal 4691 zcmXAse>7D2|Hu7`+J4YdLYhjyY;7ZC6uHWl-H&C8EtNEORqTq<+E6lY=?DE_T5Xil zWF-}vN*M`Pk@2G%Dn`T%Q+_jZjp5Fnd++~ap67Ya<2=uKF)mEk``?WQ zOSqrv<}KRg7k;dy+c&DxYM?l4g=duhH%lI^vHwwj$)7Qqe@}n#tKIzHM9~T3_clj) z%=7cBTJdaP$}g7|{>h7Rl?5GPWvBcw{~3wDaUZW#zKPB( zuWp|<+2L&hUCW-_iCT;6>XO>81=uzGK>#yn(GyAoxB-`?Kl`%4ZiO`d7CF42S`bs{=al2vCl|SR5*58*xR{<@Z_0;VG;j&dbY1Uzd#|nR?FoZr|y4Fci)OYS}IOs zSt5`Jdsgf;Nu#T*a?$@x6{X3=$E;uOr4r3sI5#Ex2uWl215u7tEA1{SVxkLAT(l=- zPtLFcd`=mI!_*5Qus!O>yMFG+FT9gO!i%h1N1yof;;kKWO4CnHh+NZNGh=YuODzNF zUyV7otkWN+H9Y_B~mV;cxPk+A=`T+XTjc!InzYuYS z*{|=a0)~}aYics+2vO)xP)%eFvTnt`chlx8^yxJfdJZ0UEw0|Dqhp1kdW{P*U?-Nc z0WJ=(K%};BLf+sdDA_b6h@f*noO#(gJUm?I{S64_O|;5Z3_J8S%gV{dx|kZ7MM%V{ zC$#yXum{V3507U{@{yn4!*)91oo&!*xg$h$1h4~&oY zs<2GD>AR6O&UZX$^u!m~Yo8aOvw5TEZz(ukhIM!lQ61}3O+=(aity=xpV~mbp`Le% z1C-8bj=#R&g>PkBx0ecAM+mNyH}+OFu190Y3$2W2V^bOB#cnm4EDfNS$P$mTeCR*A z3kzs5&bbe@u>qi-+^f57doU*7%^?|)th5G+l&@BbTiIDbYs%8EwdTz`kb#N%*jHpL z!5wIa`%+i5Da|mTk5NV+nWuNBeZ$RDd8F~9$IJg-U&HaI-fO##a+}z9Vdfy138-74 z`jliF-EW#>ECH&^7r(izVPlTS+M*fjh|B%+X{`N&%#)_ok~zF!VEDjuf-re2%ZHhm z=q&@1d2*&`*!aMCXq&b9a8q2!VJcT8^=sDs-cxWDG7DPPkVEK&UZ!>P^h>3LXTRt* zSU@W!$UE~(w^+lbIx6KY+BvOVh>n}t+QQ=+fJu;TlLyGa>{B{U{c3@A->5nbZ|@ zkLx~FnDKJqay0Fi77k@_z=+h|t9u4$*moz}IQMnwd*^_sg7oVFaC7?I(Nk%{$qofitNe z`XF2I8@2i15<>Z>-hDKUj%#t7Q%!REQ3u}e+yT<-&==9#+Wb3QFdjlz?QkZ;j$_65W6rQ5H8@aID3>W;*QW{eXx1kBL(8AI&%psikb zM89alf)I#ihh!L@7<2iQJY>p8r&9$(XsxUvyeq90$%`dr-tc=4OdCN{J=;F&>GYi? zum+Dz=pkzE!zzpgf7%H?k81*Fnyo~*)!z;vb}h1QGHs{$lv?QvogR6)V67u(hQO|V z&`@K1xnb=f5;8hbFk$gS9;?EiC32gAUofsH8S54GSC;Oy zkO(R@-Vtpd!{e#WdU;%P;oqBk;LrDveNSBIZJ>vgg_6w3?O6YjudV@giiaj8lIafj zS8112&>xh3?a-f^dk1}KqZ-O0=)y(Sr^my-M_#Fw`+7{nlU#3mEZh%Pw#l5yjEON=ao#&{M0adqm8(`$1a{!Xginj!@7loURmffX*Ix)u7PD4soH+5gnV(8$bCX(CHFi6Z&~AXsq@pCz^GSEKU}q zU-on#QHu@*r_C8c%M1UO%FDUo3lM z*9G#y%Oq8DiSW)ZumVkFj=4jlvE4gxjO=Vly0{OvO8KX;l6-l=ae8ib_?X>$u#P@D zjIL+K9M=4{^k0INjHa7p_w&a{u5e~N9Ok^}M~|6Ok&$VssDN&o9WH}g*U@XWZV@2? zP#QwbwX800+*(l3C%J8@dRBGtwrZH*w-hQlgLlGu=i6s@)H7S~!cGfb-Kq(ZX{A3f z!%{wf-H?DkYB&b;E`2Tk0kW|sRl_+3y_3urL}(DZL9hzUyZN)*tVPgxqP=}*A<}?z z#%{bhT>fzFtReS^Hl((Vace4H!+O63+#vh>UhrK!TV;!4JbQO;2&W?_3O*}a^ahJ> z$kn2j@B#ok51E~SVFlyiaZ~qFWJ6N|!+~MrC;0|r0L~0Q%3Fck-}G45G$pB=xVRT~ zDdCPHp5;mT=WVszcp0(L09$*yzkOB1h@RQ%P(}Nmj8DEELJmrAxEV^cEkfb6y5tl zp<$QM&lsq~d7`jcmb05zM&DnQG;*Ly2-jxFPU!z9^~!i)C~|Ob@L}m<%8%is`F?-N{E<-4ygs^mlxqvK@&r#Q!hG=inn<27FRPZJ_B!#YrFr4RTGCYJ?Lk6(s` z2TE?kZLl`{Vv7{nVz7n?P=4$8-lLb?By(G;k(C*(fZ2^qu(q7h#JvL3>45Pm+|ct{ zc=8!knZU8;#qyMW2vUB8;>KBZPEWq!&Kzm|^hd#2c+i!$WX?2H#eQy-hs{7%b(Xb?>$7=%UIC;~0WG9{aGEnUu zr7XZX`W2?U`KngjvN})AwZIr+nBthEP@vg)X;aYuGe1|s4gY`3GK@cfY~=B!Fs^Ck zCJf_zF%?Z&<{%5E@dj`kYvn1yvsD~7{r*I{ihX-S7H$&R;36+aO%za>8NgPJ1Cun|1Yj;BA)4b5tQkaJ;!FjFGpwb z`%EXTQ<;$iI?(#H6nBwwS_&rC!Ok%k92;Ih_iUO4m+uC@xJ*#!P&~uEr*d+Ty+7K7 z=EdP!Eh7t22%%zT&TLh03yCHD8gD!aMJK0TnDcUR;DtdI)?zvxir7~0ZO{az9{62k zSkVP$^{%$r$UA!h^;uk{!%`SB3jeD?!3`ln)wW)sXcDCJsW^cEVkMW4NT=VnQF4<^ z;oak2C!DKFOD-sHR!u0LGr(=~ktfNUi|&uM1l}WYa>gbqU(w@bf}98B$Of-*_Q6#i z9v~O*8XNRs^73@pJxdrnrFj44E#smA(yoyu;za?xL|n%P&)QG!52ur`t@MCh7U<_13-e~|#Hjz4YRG1Af9-Q7`6zDVd*M@C(LHQC)g zDc1B&UTI<+_9@Lj%#Dl;{#dbwJHPXK(3PDG%hKi7N)xwsRrzz9;6Cj`IVg`REYlR3v%j3r? z?2_CU?X}*Ra5|mQtOEn&DZ*5cC{`$?xfsItB%3kQC%|7W##Bq`LuNdGIY<|?7o6?a z8op$^dUV5uz+gaPR4a)$FpNUAj3?U^gxQPb1MAKJu@fq{s*Pueon>2D^z{MD1qTtT)%dJ+kUqNqV z3;r=tuHD?@z6w|nX@k;*3xTOSFD!)oH~tBIXff~QL%jcNE%HY=`BEad0F`!X#;X}~ z^rw!vXCP&U)#Q$SFrM%Sy*>F$)G6j>obgbti4Al*O!}S#j&fq|gm(5;I$p1gFG0t^ z6|p)`n>SExxD3p*l+XB6HwPsWG^2A)d4Cp#SFe3cmcC|S(GO%( zC&^csclCJ6a(vSJvD4vjs#>gkUOkW^fl+!KhFl%?BP~}RCU};kcX^G~p%S0z zWw>%wx{l`x^t2Jibx7Sne}FGMpSUeJxn?(Z54VY`O8}Nun9* z<^UQQ4Vmwj_5#D(3zyDkdA`k6dp|yK;i1s37Y$BO4?I^^=|Z{WHty;3=gw`7sod@k zF6L_O_B@`}o_7_mG|H%}U22VHeMR@H==fa(nh<(o=F0jznKGh1Kj3Bke5wCNo-mi~(T-mUSiU%O7%*Q5e6FY2Qtf9lzn%;gDRo8>hu{U;lW z!Q`EBks^{n9rx}3@KmQi^0>)PV=~tN>b22)W?ACL9%fFMntl|0PgZS$u z@#(?6CgQnsOqIhUykEC1H!TSYs)MzTTgFerlazHZQ&#KfWkm6X0~f(($!+8f*@0HZ zy`V)&ZB##8oQh7_*nOrYB59CQi=Y);u%|R2+Q_Ht8|93m`QjZ37T`Uupwc@`D6am z8?-5yP|yRr9&+vBb!;edG24%LVi}ZicsJp&*JPPAI2oiuZpbZZRThw(F+&gSRv3tH zm;raYq!MyxBBI?kF4*x|b0#47V|VZoN`fb_@V;>ah37PHIX%GdxY(>Ab#Eqqu+4_g zs1c*`7r?=x4L4HIYn($gcH+VTUH&ve+17L|5BYb@R$wDgF?G_LI4C?bUST{hnLTJ_ zvX_UP+q=&N3(oA6#kd<>nB8m`+r2c4sf_r=u8;Arf_qen;}7j?`}4f^i1xIv@v!Sxod8j?&pFDc?g~s6)95s|r=`rl2Hv*{g+- z<>y73@vPjRxK--Sg%}oAo9p?=dDllT?R86gdvm`)?1>A$x zKiK?4$>y1x%qK2gMqaAR<~y_CE{beJC%8Y6el3ixl~v-Np_wd1@9MaL`l)a_Wh+^d zRyZovb*v`^%P~ffI=JZQx;EDGB9%i0=v_OV6Y}?{_EAEwz41C0Fp}#ITVBM9B~ThU zhHtIlkoR09tvz70!MPa@kvD!~(I^kl)iLS#Nuu--or2f`GlHk}PZMNpDdDsj;TZZ7 z-fwW`)+{4~99a^ZgmJmoy)d2!oL<_a6vAr*$HAHT?US3G2-wg}rI@zI7*CI2?!A8= z`VIJD<^28nq&X1JD-^)-0vdfb@1d)N7SHO?SlCIo7*IIdzrX~U@Nv9W2Crsc#-n7k z9OMct!dDa9J0O=A@-Mk<$P3NH@(Ii6&-gXUQwhzNYEuf(Bj7RPSOFrxY9-9?&r%?_ zp@Ef4bC9DaG&LIMDyd!-q^nS*pv3^*9wM37fNN>TmVxYgo;OI#0}BX_hlsXYkr37n zB~Q|vs_4&V5o36l^%3ISjbI`!lQ#!d%+dyOKY+dr*ag0zI%h_;nrXFqeIE+JQ!aBW z$)sA$v=jEC9`X#LQW;VlE(Zu`yBgmB2ad;|6-b^i8p6@OOH z8?9T1rN~sQI5G|oMHCJbdC=J`(y|D-`)GI)ONlw01(_h|u8=mlvj~3adGcc7rg4yL z_}Yg^&|bbV=So!xxlL7Pm9``HIM$g6AFM<8m6OHsE?2m&z$W&$T=uARR||;LtZML+ z-pn9%|K;^jw4nqq$`LXg1wB0SnT5@1tTln$y2Svyf2Utf>!8QXv23%+A6d!*;< zSD|$BQD}Y4`RZIpUpyme+4U6Hc?s{cEe3jz=<@khi-3gyK3{zFFtY@2jo)s>#5bH` z|D+K!PTNY}-O-^y8=c>PHLv=lLk#~-Sp;eae|?`%>J=5k!Zku6xRITV7MriUDQ2`wp9GOP_~A7+ z@4@RM)L&1+8aRu+XCXXyQBM|tjjNXW@3(v@18zeO_lvg3gO@0=4L=NX#Jj5-&Kr%> zKH^+UOL+&1Gld%)adgIVmi2wmEd;+6hm27P*1cv8W=iMhk zLNnw_9yvA_i?&jKAYi9S<|%h zG@K;OPkbeteg#hI_-OHBPuPzq@*{{7AL%yW&xsrmGmDhuc>xgx`BF8GjFG0i zF&ll@V=6j#kU2-Un<=jcm1>?)E#=hZbkfV`xW{2rqMqzl&{x{!;dIMaJv{Y*WdXD} zUUJqqf1cOj(}di7G#b< z``LCP@i0i>(4jLEHFX>}oqZFbIJDp%7*JLB$JVdj3+(Dxqw|Cpx6)YIHBYQK2S^ke z_-bin_sH4;_EMn!gldF#4^FkVU>kiAuRz|<8$c$L&EIkqy+Y8wxriBWD{N{J8wpZ1 zOe^>XyBb3n_ZWKs@kBTqSiJovbF=JSE>8`Snd0y|F*L98Rwo3}t;nm^>^)@n{+w^W zMU6`Dl+vupK!I|#S}1)puFMqBMbl+5qbl{lYNqXlp(z{SqV!r^b& zx!(O@_{7JG_SDJl{_8^dT&BpqvAZ%{Ega!ahKu_B@0D>rKa~Hh^roN<=;C!Xtt%h$ zrBXhBY;4TOoPUq=rW%{?Vn=`LY<$k<8tGtQq{SAFpoEj#IyU^D(lkk3tM5qb*sDv? zZ1(;_UBR!v$^?hX@c-0YxDsLE#7b*R@D<3y7qd#l-Pe@0KCZ^jmFbNy9%3OS3|+1u zm6juXzq`Fp@h%Ky@{6P+E^ zPiXTJ{^z1U;Eo_BelL=)b^XK;YWXK)7qI|Hk z|JTj4ckXwA@&C4Cr`v-=Ux&|E{uLQYDEo$@OCvUMZ!tV~FbsT|`9uC6-amfE*9&zq zqQ6KO3pa)@SDf->SvQGHr99Z!8Y8D+{O2pUW3*Ws%k$UdcloOJnk+xRN3J7o)3Drw zEX-xxMy3(=bI_;95g5qp+XIS`&FP2rLEr6O_^JtQWF_tqDo%c%1&hnuRHz4U_*prpMClBqTwm?xFH--XkceZ^ R+iL)|DdV51L^~?we*k88^eg}X literal 0 HcmV?d00001 diff --git a/community/save/1q/1p/c.-2.-3.dat b/community/save/1q/1p/c.-2.-3.dat new file mode 100644 index 0000000000000000000000000000000000000000..ec6aa86f644c5d95b9e6e2eb9ccecaf427c5361b GIT binary patch literal 3455 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 literal 0 HcmV?d00001 diff --git a/community/save/1q/2/c.-2.2.dat b/community/save/1q/2/c.-2.2.dat new file mode 100644 index 0000000000000000000000000000000000000000..db26b75a2c00934f06c826680c7d23f116c886e4 GIT binary patch literal 4194 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 NngYS{f{jeZe*kIL3km=L literal 0 HcmV?d00001 diff --git a/community/save/1r/0/c.-1.0.dat b/community/save/1r/0/c.-1.0.dat new file mode 100644 index 0000000000000000000000000000000000000000..3c1d0631d7e3eebb2dfd688991646798db69b540 GIT binary patch literal 3384 zcmZ8jX;@R&7EOo@Dm7XMv<_DVlu9ACh~UIUaVV9VD)phFL_ne9kSeHDLk=i|AQ~qW zaflWz0%}B*h$2AYVv?KW-gBPq`}fw5y}xg-Z?AuAuZ^9wvn%t0 z+pSQzyW98f^WArZ#?S_~)$N-m8#lP&&AxNBT6>1%MPBSZ! zJ%nm3p9WirUz$%3-hX*+JQ&HffF9#4pFWb60yLX1#1N zxkx8zJi2P9R`6_gvk4muMe}ywshC)u2c9YXdzezk$(_REcqV#Jh`aHhXH|~yT@0%o zO+ZgO-|=qku@3qSH<0Cg8PYsWyV6m@39xf5G7-Xd#YBGfJqcEYTvK*ba7UC~AUsjf zmEU*w34YjsIvTNqk2o{U+39KAIlN7^m;+uTDWMcS%uC>8`B}?64xIXz!j(A_)mE~#7A+%K=XLDk-HPXOX%Kig^1+pfo@0ETjEp@40*}9Vg(g-a$M*50B+bgP zoslfj>iY?s4t(Qs!T8@*!cb~&HOlUI*3Fh8Kgjx{53}Q^q-a3l{OE24Uw`UvY>&yy z`!ic7skw-<#!5bGJYS6bj@(^-YEp3gZ()pNAxIrw!-Q+!5;|Yfj0tb4kT+VfCn)_a zdhFkxz|JBlo~l`htQjE@onQ}=mou~3nap{8 z^(hB!Rw#8^e1W+_j%U<@OqcLRjE-C;Gr>gKq}^5q(_9H`j#0b_a#S)7z;X3h@n`0C z{o!sM=t1e0A#Wtp1l1130~ETf!M$`f+Y#H*1&)?~%eziu0qpDk%6y&)oWR^^m4$R} z@@MQM*iBwyZC0`wE3YQp)@&v?*=qTg`B~`6YvFIll`>P1*lOlSv>-vWx&ixUZO*VeK`?|w%W=2Ki2h`Ke3B!u^)yBZrv6lYH?>bF51Bvxsww$Ctx8Afc z?akSBc;Dq2RVclWGu2OvCY!^(QCA~cbG+`>JH=@JE#70*>zxQ(TkE?H*${t2Jn9Xvs(BX=bN z4<%y*45FB2&XNlw1)OB!r~0|R8|0{WkhCNtx*9B?MdTvAj@30Rap7k$fHxB7bb0F? zwjk@Rpqa2OG4G~NKx1|Ce93GwMZL=hY&-tn^rM=t(sPq?5%!3RQ&?`1-% z__R}@lHqM;c7rYa{St6eedYR)=N+D2&;%6>Lg;{*O;{u-&=_jCm-9+%G2xNOAIj&W9>}Tz>wLqug0tlK3RarEiIWK8 zAS-Q-Cb9u{N1-HV!d+6JVaIcxZXP)oEk6nqRcK$}OStB(-k}>ALVwWUv@@iHZ@bX0 zG~c@F5IRl4eB;+q2@U(}Z$znd4jt`*EV@YRS!;24F(_#Y{p8&Br-?p^ya?9vBozjr z9yO^-ilE!dg=mpq`8M!PJV)EfZD-#xJKn~}cK%l1`yzC2$@L;#Q}Iv4gkh9{(0l8)JDk;S0(7ipyrwt6K1IVfMl2Pc@R^YXs7YufE zfD_7m(p+)o4OWtzwFYGNXdKC)?zi|A@=7^}&IpGmRSJIAg|#45$DGBJNlNr{k1Mn} z$DInOs0>(Giazv?=^y@M0qQCRqn3ah4?Au9uyDK}QzUnUf>B-ZA`*0A1CYd4YB=RmQxm*9L& z%F{6^#}?~UjC(0;#1|r6yWeu9qgm8E!MS)4)3Ht7#Fv_Y-;BsSQ**{mskl|kYxeQ z(TX$~x=U1j%N3ETp%cTyqHpc_@4q@{j+g=hrC%<>K>8vylns#Q%DU@-xmFU)Ycq1w zUzqS?@@f=i6o`;kIV=ao>p$I5r^r#9BD^7_1@T%XKkX51Xa!dvQWnaH&gvZp#A2!o z=5J_`yx;iA{U-J7IkY|VWei@B%W~26yagz3X9FodjYTzRfpZ_Hg!GmbjD+SC!>rMiE?@=w#qIAe@Z1Zx^@1z0mqk)PQ(Ou1j z>SaPnugNI-D3`UVb7X7m4UOnF`=dbK&t1AKgzp36j6cfc*WDxqrqt<=k+OfFPT0mf zd?>m;y@Lz&>}5hhzJ4mqmEOM`s8t6#G-aY{?(bxVwm_jQ|d P5o6cKm{(7h(`o+&D5J1_ literal 0 HcmV?d00001 diff --git a/community/save/1r/1/c.-1.1.dat b/community/save/1r/1/c.-1.1.dat new file mode 100644 index 0000000000000000000000000000000000000000..9254e9ad0c29bbe70865ce403e6da24264e7b551 GIT binary patch literal 3780 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 ibgdD_ioN#elly^D3;55n_7^@{q<;g>0!y0! literal 0 HcmV?d00001 diff --git a/community/save/1r/1p/c.-1.-3.dat b/community/save/1r/1p/c.-1.-3.dat new file mode 100644 index 0000000000000000000000000000000000000000..2ab9f0c0665ce7191b7aacfc6ca442dc437a79ac GIT binary patch literal 2589 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 literal 0 HcmV?d00001 diff --git a/community/save/1r/1q/c.-1.-2.dat b/community/save/1r/1q/c.-1.-2.dat new file mode 100644 index 0000000000000000000000000000000000000000..2a597b55c7b72035b9f04ca30b6545e08c4847b7 GIT binary patch literal 3146 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 Lt$kv9h)ntqN@x4K literal 0 HcmV?d00001 diff --git a/community/save/1r/1r/c.-1.-1.dat b/community/save/1r/1r/c.-1.-1.dat new file mode 100644 index 0000000000000000000000000000000000000000..83d36a09bc947385812f3540a7d61efdcde7d41d GIT binary patch literal 3231 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 literal 0 HcmV?d00001 diff --git a/community/save/1r/2/c.-1.2.dat b/community/save/1r/2/c.-1.2.dat new file mode 100644 index 0000000000000000000000000000000000000000..7db9d2f12153e07d275e545eb3411c482d8481c7 GIT binary patch literal 3575 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 B;UWM4 literal 0 HcmV?d00001 diff --git a/community/save/2/0/c.2.0.dat b/community/save/2/0/c.2.0.dat new file mode 100644 index 0000000000000000000000000000000000000000..35ca0883fed4ee833a2dbb9104a58b3b0c3e4eab GIT binary patch literal 3104 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 literal 0 HcmV?d00001 diff --git a/community/save/2/1/c.2.1.dat b/community/save/2/1/c.2.1.dat new file mode 100644 index 0000000000000000000000000000000000000000..380981817fe10ac268f9aee20caabdf429bb7c71 GIT binary patch literal 3342 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 JQ13&5{tlqQOez2X literal 0 HcmV?d00001 diff --git a/community/save/2/1o/c.2.-4.dat b/community/save/2/1o/c.2.-4.dat new file mode 100644 index 0000000000000000000000000000000000000000..ec2b75f516c4cce3a4043fdbacff9bbd8aa4fbf5 GIT binary patch literal 3534 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 literal 0 HcmV?d00001 diff --git a/community/save/2/1p/c.2.-3.dat b/community/save/2/1p/c.2.-3.dat new file mode 100644 index 0000000000000000000000000000000000000000..e2543c4bf45498c2994d2ef752378a006a852c78 GIT binary patch literal 3423 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 literal 0 HcmV?d00001 diff --git a/community/save/2/1q/c.2.-2.dat b/community/save/2/1q/c.2.-2.dat new file mode 100644 index 0000000000000000000000000000000000000000..d78bded05371b47c6c617faa6b067c3b75373116 GIT binary patch literal 3259 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 literal 0 HcmV?d00001 diff --git a/community/save/2/2/c.2.2.dat b/community/save/2/2/c.2.2.dat new file mode 100644 index 0000000000000000000000000000000000000000..8bc0fc85d6f075b0d51126f138ee51becfd44e3f GIT binary patch literal 3201 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 literal 0 HcmV?d00001 diff --git a/community/save/3/0/c.3.0.dat b/community/save/3/0/c.3.0.dat new file mode 100644 index 0000000000000000000000000000000000000000..5d50c0871d19360b22ae399915a829a65c583ebd GIT binary patch literal 3648 zcmai$`CpQG_r_6kudq#Q6PucB#*%i+4co?^aSB`1YEmp}+BB@Dq(pAb)Y4I=vP{je zY%$Gn$*fc$&80M#%+$&d3`kJ{5x8%-@B8!keSQCc=lpWL&hn|22|J zJNdO~RzuN;vG(Ac(R8Lmi{-`esr{^_y(vrm{O0kO{bSi!vSMY!@BN2l#nI*ZUt^f3 z~_pIBV~BL(}Ohv9-m*=i_iup}dHXpKW{UP$m6b*D2%) z_FvA0oOv~lS<^N3eVIqZ)lKf-QZ_ICaCh}}P3^&}pwpd{y89D!J+x1-tYOK2YGJ#_ z^!vxO{x;%XLM%J$;T)(GPK$$;x>qlD=r_hf{x`gkeD!&g7c%ueex^0k3c5cNd|K99 zPcPojbeKjLDjfuiBmp$@OP2+Bf_(ClgPYr>m*0Usz9SgS3lDKNlh!Ra2^qi4v_ogqSsS>^KMCWCP^eZ0LI7vX`j1 zx@F29VYN>y!Dld2TYRK_5Of8N3iIvScK`?9c%UGL>*RJK;6L_YDE?-%%z^V+%H7>- z49H=+^x?F+ZcS+exjBXG9*f2snJeefE6iH>O6o=00O%?gyYVdi9P@^#569NbKkX6? zictDx7mEheqbecz(r*8hJaZ9xKjODUl8$kB?9mt)TDv9Wx?|IAN(L~D9RShag0#W3 zVta7nX@iM>#Qfi0W-@S(z@?R04G46eSWdjfM0b3IYFdph9b@88*P36wbkTw`y`y-q zEQ#N90rUU$*yNIAW=a&c0ik!pjDv#xMk_*C_3;ayU@k-CmW@CU?Zm74m>Om9MLBqT zdLGZ5QrO53tqRHm2d6GN+(AhH6q<-oUZYi_BG7OLxep)6_}C1lf=tK5 z#fUHzT)h^mg}#8rJ!X;W6k*xPVXN)6ZK~C#NzeA-Akv?o&XC{X&hm6k#C-UPM5jHUFXbn0U12_>;+w#OCFtt2A3mtqGT zeA)OisrlcHnuO)r1SP*1%pI3j9$=dTX1DJP!oOw#gOX$q(Po_7)YvV~oR3q_>a+@) zBB%a`s5{h*gHt;6)a>)2(OoCJCmLa@TxfmzFVKY?exQ&Qnf1Pa1-O>-7}3%k|=@-3!aI zbol^JZLE|l@<22MS8OXM*=$9j4mKiMau=t6`u&A{J9S24D{npWnelv716@Rzop@a% zx&G~r2=w~LwydL8;WcU78#5#EJe~D88p9yeu*VRlGoR>p$nZ`zNega*p)DsQZx!N& z@J;aauFjBfUr-qo7wGE=wnqr)Gv0%u7_KzIqY( zB6R{rj)WTVgeYyz5pBOp*kRw#!)R}!`M#I9)K3{=YPUMUKn=v>pDDzltYnaf$MhHP zb0F)Xw&L8m9p9Czvh3I%wqZNG$V6O27rsoUsX+5z_5$97mW_#{dZB;x&<$WkUVm(j zZ5oJyJB^S4FG8RkYB4C{^CEfyo1Jx(t$_3WGnC*sVfiCK8ke7;>zX4G>RbW@=-Sui zQw5b~{fH2oRdPlfIYpV^2gq--FN&W)lVHl4u!7#?2vm5%(Za{}jRI5EDnJeDO^^i) z$_&B2+nCqbfcd&mko1D&c1c$n1*1DGXCcKFuyNL?@JcJ$8+XZq8on$0hMFX#K7^07 ziN9!7JGR9Y3o}E*Vy(`F+p3Z1TNrIX_h7lQd~E=<;xme8NNe> zAH^x#K=c=W{Uf#bes*kHDP#w_hN$hp-Z!cH8+eDuyxcqUF*rdBmjE-iJ?$L6cMl_H zHmpaqS&h^W<-lk2X07VLk?n)<8s8wg(8u*#57^cfU?EW>hKKmUC^Jzf*{Glu>dCvI znM^L#%3dBYjJQ4##xfdHcfrs}QGIT(JaWEeN#&BV02VIZb7zHMvgFYut0yA@>-o@f zibRs^18lX>0J9wvy9n@m%m29c8C-8*V*)*TfS`$4|0{)^fk#9@AA8Mqp!}& z;*VgjSwR^}vdnQsFDk5qA_dr=N3q`9P@-BVb}%yYfD%eDF*`9*H^v$`L}+0;gFsU^ zm0OlK4*UcQ%t3`!_!(_6mVAJVqq-cXWDAEuAbS{v6IQacs?I}#^y%Rqq!}Tv zx-)UsCXf^b)WT{7+qm3ZsC1yJc0DMSp1~obrc_Hg#|~MipaxGYp;3L$;gRR@(>OyW zHYz5P|2O$4oy!BIJZd_3u6R}}!j-HC>p4U4Q}vX~;xSY;Rh6cC&8*c{jc7t8a~;TD z&;;D*58)m@0ynn3)WdtiU?^zA6NzP)xw*pIU@M!ByGk1pI?-lA`t~r}1@)4;{JJ{p z#8HK(x2LCPgu9CD94rj!hCEl}D4wvdUMApN4INd6^vXC``KzxU?s|hEo2)IW@xc`P zyPzARea$#BUQt|i6TfxLf7sXid@P$ zsuSu}%SvE=3E%uc=_NRK8056=W(o)w`N4tUR95{$%>QJpA2>Dpxvp=TFl7!gDK%gz zy6OXY?Z?gTuU-3x@>!V#c&YOs^=TO^4>XODhNvklzYV*RxBK1#QQkAtsj++3-4%pI z$O$gZkG6tSi8^xT7O=vZydF?G@P()G{5scXa8d~x`|M0k!90tz@v%1s zx*B=yFwvtSS%GlJ$ss*(eiQH*(3E0i6*W(qk5p}JBwkIX%)!S$_uz~xHzZQ)CFs}y zEznGay8fW%Y5eaHnA6z%Ei4)VJhtU4%B^AFdru8ZtEm@?8C&3KzYD8DkLAEswAn;1 zF%QHQ7g7@&cMr?zrYQ0?ZYetJLq@kT+`>tiQVm$7HO|A-Nnhi7@cLlo^ibTQ8?@sL z%Taosjxx!Y11?xUq1#pizkvY-b331FGpf}yx?0@(HrxbUXa8xFalFsyZ~ym{e)Pqf$YGmkX0H(I-V#xYj4lJBMe9OJ}Gv*MfK(!Dc!TwF}42S{}TJo zjlU_%iVP~Hrf(-ND;p{t PfVE;L`O}LHW`zF&3xPpn literal 0 HcmV?d00001 diff --git a/community/save/3/1/c.3.1.dat b/community/save/3/1/c.3.1.dat new file mode 100644 index 0000000000000000000000000000000000000000..bc472fc38a51e7b3cd59dffa8208bb27dbea3c21 GIT binary patch literal 4240 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 literal 0 HcmV?d00001 diff --git a/community/save/3/1o/c.3.-4.dat b/community/save/3/1o/c.3.-4.dat new file mode 100644 index 0000000000000000000000000000000000000000..0b093de842e863b3de2627802899c85ae05b4d83 GIT binary patch literal 4104 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 literal 0 HcmV?d00001 diff --git a/community/save/3/2/c.3.2.dat b/community/save/3/2/c.3.2.dat new file mode 100644 index 0000000000000000000000000000000000000000..02f4acb609731b77554bab9683b0b8c0d01272f2 GIT binary patch literal 3168 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 literal 0 HcmV?d00001 diff --git a/community/save/3/3/c.3.3.dat b/community/save/3/3/c.3.3.dat new file mode 100644 index 0000000000000000000000000000000000000000..159e18cd6d85bb8b18a367916b2174513d701e68 GIT binary patch literal 2758 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 Kae1`Dgz+zYu@@Eq literal 0 HcmV?d00001 diff --git a/community/shader.py b/community/shader.py new file mode 100644 index 00000000..5414a0e2 --- /dev/null +++ b/community/shader.py @@ -0,0 +1,71 @@ +import ctypes +import pyglet.gl as gl + +class Shader_error(Exception): + def __init__(self, message): + self.message = message + +def create_shader(target, source_path): + # read shader source + + source_file = open(source_path, "rb") + source = source_file.read() + source_file.close() + + source_length = ctypes.c_int(len(source) + 1) + source_buffer = ctypes.create_string_buffer(source) + + buffer_pointer = ctypes.cast( + ctypes.pointer(ctypes.pointer(source_buffer)), + ctypes.POINTER(ctypes.POINTER(ctypes.c_char))) + + # compile shader + + gl.glShaderSource(target, 1, buffer_pointer, ctypes.byref(source_length)) + gl.glCompileShader(target) + + # handle potential errors + + log_length = gl.GLint(0) + gl.glGetShaderiv(target, gl.GL_INFO_LOG_LENGTH, ctypes.byref(log_length)) + + log_buffer = ctypes.create_string_buffer(log_length.value) + gl.glGetShaderInfoLog(target, log_length, None, log_buffer) + + if log_length.value > 1: + raise Shader_error(str(log_buffer.value)) + +class Shader: + def __init__(self, vert_path, frag_path): + self.program = gl.glCreateProgram() + + # create vertex shader + + self.vert_shader = gl.glCreateShader(gl.GL_VERTEX_SHADER) + create_shader(self.vert_shader, vert_path) + gl.glAttachShader(self.program, self.vert_shader) + + # create fragment shader + + self.frag_shader = gl.glCreateShader(gl.GL_FRAGMENT_SHADER) + create_shader(self.frag_shader, frag_path) + gl.glAttachShader(self.program, self.frag_shader) + + # link program and clean up + + gl.glLinkProgram(self.program) + + gl.glDeleteShader(self.vert_shader) + gl.glDeleteShader(self.frag_shader) + + def __del__(self): + gl.glDeleteProgram(self.program) + + def find_uniform(self, name): + return gl.glGetUniformLocation(self.program, ctypes.create_string_buffer(name)) + + def uniform_matrix(self, location, matrix): + gl.glUniformMatrix4fv(location, 1, gl.GL_FALSE, (gl.GLfloat * 16) (*sum(matrix.data, []))) + + def use(self): + gl.glUseProgram(self.program) diff --git a/community/subchunk.py b/community/subchunk.py new file mode 100644 index 00000000..eb2e903f --- /dev/null +++ b/community/subchunk.py @@ -0,0 +1,96 @@ +import options +import random + +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]) + + # mesh variables + + self.mesh = [] + self.translucent_mesh = [] + + def add_face(self, face, pos, block_type): + rotation = 0 + if options.ALTERNATE_BLOCKS and block_type.is_cube and not block_type.transparent: + rotation = random.randint(0, 3) + x, y, z = pos + vertex_positions = block_type.vertex_positions[face] + tex_index = block_type.tex_indices[face] + shading_values = block_type.shading_values[face] + + if block_type.model.translucent: + mesh = self.translucent_mesh + else: + mesh = self.mesh + + for i in range(4): + mesh.append(vertex_positions[i * 3 + 0] + x) + mesh.append(vertex_positions[i * 3 + 1] + y) + mesh.append(vertex_positions[i * 3 + 2] + z) + + mesh.append((i + rotation) % 4) + mesh.append(tex_index) + + mesh.append(shading_values[i]) + + def can_render_face(self, block_type, block_number, position): + return not (self.world.is_opaque_block(position) + or (block_type.glass and self.world.get_block_number(position) == block_number)) \ + or (block_type.translucent and self.world.get_block_number(position) != block_number) + + + def update_mesh(self): + self.mesh = [] + self.translucent_mesh = [] + + 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 = pos = ( + self.position[0] + local_x, + self.position[1] + local_y, + self.position[2] + local_z) + + + # if block is cube, we want it to check neighbouring blocks so that we don't uselessly render faces + # if block isn't a cube, we just want to render all faces, regardless of neighbouring blocks + # since the vast majority of blocks are probably anyway going to be cubes, this won't impact performance all that much; the amount of useless faces drawn is going to be minimal + + if block_type.is_cube: + if self.can_render_face(block_type, block_number, (x + 1, y, z)): self.add_face(0, pos, block_type) + if self.can_render_face(block_type, block_number, (x - 1, y, z)): self.add_face(1, pos, block_type) + if self.can_render_face(block_type, block_number, (x, y + 1, z)): self.add_face(2, pos, block_type) + if self.can_render_face(block_type, block_number, (x, y - 1, z)): self.add_face(3, pos, block_type) + if self.can_render_face(block_type, block_number, (x, y, z + 1)): self.add_face(4, pos, block_type) + if self.can_render_face(block_type, block_number, (x, y, z - 1)): self.add_face(5, pos, block_type) + + else: + for i in range(len(block_type.vertex_positions)): + self.add_face(i, pos, block_type) \ No newline at end of file diff --git a/community/texture_manager.py b/community/texture_manager.py new file mode 100644 index 00000000..7d326dec --- /dev/null +++ b/community/texture_manager.py @@ -0,0 +1,42 @@ +import options +import pyglet + +import pyglet.gl as gl + +class Texture_manager: + def __init__(self, texture_width, texture_height, max_textures): + self.texture_width = texture_width + self.texture_height = texture_height + + self.max_textures = max_textures + + self.textures = [] + + self.texture_array = gl.GLuint(0) + gl.glGenTextures(1, self.texture_array) + gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.texture_array) + + gl.glTexParameteri(gl.GL_TEXTURE_2D_ARRAY, gl.GL_TEXTURE_MIN_FILTER, options.MIPMAP_TYPE) + gl.glTexParameteri(gl.GL_TEXTURE_2D_ARRAY, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST) + + gl.glTexImage3D( + gl.GL_TEXTURE_2D_ARRAY, 0, gl.GL_RGBA, + self.texture_width, self.texture_height, self.max_textures, + 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, None) + + def generate_mipmaps(self): + gl.glGenerateMipmap(gl.GL_TEXTURE_2D_ARRAY) + + def add_texture(self, texture): + if not texture in self.textures: + self.textures.append(texture) + + texture_image = pyglet.image.load(f"textures/{texture}.png").get_image_data() + gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.texture_array) + + gl.glTexSubImage3D( + gl.GL_TEXTURE_2D_ARRAY, 0, + 0, 0, self.textures.index(texture), + self.texture_width, self.texture_height, 1, + gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, + texture_image.get_data("RGBA", texture_image.width * 4)) \ No newline at end of file diff --git a/community/textures/aqua_cloth.png b/community/textures/aqua_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..d24b7d5bb9c32347f76b4060a9bd34984deea528 GIT binary patch literal 1193 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 literal 0 HcmV?d00001 diff --git a/community/textures/bookshelf.png b/community/textures/bookshelf.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd85b5e0244d2d6ff03e4b63a9d69dc37b00955 GIT binary patch literal 1070 zcmV+}1kwA6P)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMhFV0oRiU0rr8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0tZP%K~y-)eUm?E6LA#BKl$Z%?KQC$u|=x{-E2S+?P9Zt zpwNi8lsbq=Tk2lzREmRxB2I#X|Ar3MNfZT9!5|JIE*6w4Z6gltHABc%C25jhyvx-g zxl7U{ey4Zu`+kr2d%w>G5)US}s7fh?uIt_>rj_wyBWV$jMX8r*Wsm?p3Wd&HYZJzc^KlgoX1p8--Yboya zml2WPzLp0MpZUUp!3Es1+qQY6w~xT|<)JNrLg8;yK`7MW$J>3+lkr%z;k~`iN+|#` zo4Fg%OxWw`z5Q_B%GDg4;uEX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMh0*i{9{{R308FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0&Yn}K~y-)Ws})zQ&AL#zdf8GCuy6cO|?=gguX$GmqM%% z3W}&z(C6{WR}g#vsVE3SDHeL=g#&mef@m!r(jiGRoSd9tA1^YH(*JU;{jbgX_P@oe zr)z01jL6s)g|&w?KD|QJh$zuBhz;5lbon|PMSk75AyUZV|w7sf2+ zvRFBfFZ(rGLCDWqol-7Cm^7Gj97g(e+9XL+Bp?CuuFXNKOArK{bbOQ$OuIHYTLWM# zO+QWmIBIvvdoBPo83(<*{)p716;m{Z+mA(5IUG!Y`8f}*HIsP>})ct^>=aRI0%mIEB zv)5>khh7AIX50afc}oo#9JV^tdjYK=r0BWST3wVB*jkfwHLV~d@419YJT?O)ae{dL z@4h|f&y7ZF-B?U?jdYyiZXALrp5GMw$BvMFj+<%5Pso_t(eT8z} z4_E*kt@!-+=u%GtQc8;b{vZc+KVZaS4AgV6tU+zkY-`D69<^Gnu(BeEl8EcJ4aR_! nU<^VDtXpf8jk)qKMnU=yr1ub7$_|*j00000NkvXXu0mjf;IIRe literal 0 HcmV?d00001 diff --git a/community/textures/brown_mushroom.png b/community/textures/brown_mushroom.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2245cc85469aff9cc8e807f37ced62f8d5c4fb GIT binary patch literal 634 zcmV-=0)_pFP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ*I$b6uN&o-=8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b08>dsK~y-)V_+BsqhK%qMqCnSW>)-%v5#K4%aA{LH6zgm zz%(Ddau+W4@Z~#(zEyiM)U#kS09hkUGcLe_O9G!JqCrM<(0@+{tN-}aFi~m=014+D U$?nUE7ytkO07*qoM6N<$f)KU?;{X5v literal 0 HcmV?d00001 diff --git a/community/textures/cactus_bottom.png b/community/textures/cactus_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ca2984b4e6666762cdcc407e97661b845d668cc8 GIT binary patch literal 825 zcmV-91IGM`P)EX>4Tx04R}tkv&MmKpe$iQ>8^J3U(;skfG{gK~%(1t5Adrp;l;o12rOiK+~&c zDiIem*;O&{3IRd%V-yjYS;m|sCE+=~?&0I>U5saWpZjz4syT}RK9P8q8D^DugLrzg zYH;2s4zr@H5}y-~nRG$oN3JU_zi}=&Ebz>*nNH0Uhl#~P2P+-Sil#<9MI2Q%o$`f@ z%PQwB&RV&~TKD8H4CVBdWvu?YAB(MDq^(iq*zGNe%!-9==ddaDdZ}F zkz)ZBXpkL0_#gc4*2+&#xJjWn(EVcDAHzUk7iiXP`}^3oneSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{009w6L_t(I%e9kBQUfs%L!WvkAxXiWb8sWhk#)|&jW`E; z2#^$RvG9B|6bn*#<8oV;EVT_+4guUf-uo|yU!Pvo_KWBJ0UM+_Xj+p3Nn{ot4toFw z0x9@78%Y>&CW=_7hG5fUGdhlG9GOW-lq{r8$pSFU z`XPsQ;&ujkKSQV?Z6MgLk|b&4Wi|MQuy{mpy>`&f2O)U~4500000NkvXXu0mjf Dw9sI1 literal 0 HcmV?d00001 diff --git a/community/textures/cactus_side.png b/community/textures/cactus_side.png new file mode 100644 index 0000000000000000000000000000000000000000..b59d492f52510a55d6de2acf768ee20aa55bb975 GIT binary patch literal 1015 zcmVEX>4Tx04R}tkv&MmKpe$iQ>8^J3U(;skfG{gK~%(1t5Adrp;l;o12rOiK+~&c zDiIem*;O&{3IRd%V-yjYS;m|sCE+=~?&0I>U5saWpZjz4syT}RK9P8q8D^DugLrzg zYH;2s4zr@H5}y-~nRG$oN3JU_zi}=&Ebz>*nNH0Uhl#~P2P+-Sil#<9MI2Q%o$`f@ z%PQwB&RV&~TKD8H4CVBdWvu?YAB(MDq^(iq*zGNe%!-9==ddaDdZ}F zkz)ZBXpkL0_#gc4*2+&#xJjWn(EVcDAHzUk7iiXP`}^3oneSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00GZQL_t(I%WacOjuSx)hCjRdmFF}8#DK&;S6~5)xd|uB zo`wlZDa1P20-(Kze52#u6Nk40N%h! zOw1FCH|5}QIC}v6ms4BZ6p&=$@pc%Yx&2$K~s(Q=oZ*zD}9FzXpgSq^}C( zN)Z)woW^;lQAx5aaEk<_Zy-SjBgDAxrP{d_7mMpW&K_z{ID70-v5tX^lyC|l0kira zSduAWAHVzCYRF)8Q7HUKQ98Bqappz6)0Rt6B zwW;{?;b+faP|_3?hkKTFG6BRCX*MG>H(+4L^$!27g4+5*4Y0>X0`R}j=)$$ddnb|` zI!Qr7v}~q5#8RpEzO#6GJ?gQwW^q?Ju1pEd;e>c?F}KLOwNe@W$N4`_Y(R=>T-Ece lKPCy(dymzIRRPBRKMy){(v%YtWy1gf002ovPDHLkV1meez+eCX literal 0 HcmV?d00001 diff --git a/community/textures/cactus_top.png b/community/textures/cactus_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f03df7f0ca00da2b5836bcd9678878c8c0e6bef0 GIT binary patch literal 1041 zcmV+s1n&EZP)EX>4Tx04R}tkv&MmKpe$iQ>8^J3U(;skfG{gK~%(1t5Adrp;l;o12rOiK+~&c zDiIem*;O&{3IRd%V-yjYS;m|sCE+=~?&0I>U5saWpZjz4syT}RK9P8q8D^DugLrzg zYH;2s4zr@H5}y-~nRG$oN3JU_zi}=&Ebz>*nNH0Uhl#~P2P+-Sil#<9MI2Q%o$`f@ z%PQwB&RV&~TKD8H4CVBdWvu?YAB(MDq^(iq*zGNe%!-9==ddaDdZ}F zkz)ZBXpkL0_#gc4*2+&#xJjWn(EVcDAHzUk7iiXP`}^3oneSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00HSqL_t(I%cYaQZWBQe#(%qe>;JYaK_u%G6e&uP0?|;V z;tlAaqj2e$;5A(O0o?HtK~zyF;sP02iVjC{;rQbC{_NgTTy7H!x=c4av){}&^9{Vv z1VDEZk^}11+$N%=>1Z5>J*w0yNM1{_|!Wk#EM?+q=k^mQ}6)EkGPcdah={MB)i;V?^2`^*j46r zu=~Cyz1a8y{uZ{=73t4=e<<7Oitcd0-M2rOS%T~Y{{8tuz1aQ&=nx8-Qsx(i00000 LNkvXXu0mjfbNJkc literal 0 HcmV?d00001 diff --git a/community/textures/chest_front.png b/community/textures/chest_front.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb4289d0802fbb3103f029cc766945d017b4f7b GIT binary patch literal 1079 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 FV1n+_(V+kU literal 0 HcmV?d00001 diff --git a/community/textures/clay.png b/community/textures/clay.png new file mode 100644 index 0000000000000000000000000000000000000000..3670a86755e585cbc5f3d9a9f6e35c76dc2b884f GIT binary patch literal 1203 zcmV;k1WfyhP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ+5^;#U@c;k-8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0*pySK~y-)CDXfd+%_0M;e#Il!RyM>T8d|rNNMw$snX}| zTso0QW9!Z(2!gnzPWx*K3vc7Y5 z^Cy0rK^GE{eNTkl^Xbzi)>z)=XL5}==P0F+b4J1zpjb*$ygq$p^?{rcC1v)q0&qUh zSlx0u{Xx?-bZ$h6qHibUFdaxGFpeX&RHnnowrw=7;dpgK8%^FJ#D&MF?6V`O7Vz9;%;+eDVx4in R@D%_6002ovPDHLkV1f=1CaVAd literal 0 HcmV?d00001 diff --git a/community/textures/coal_ore.png b/community/textures/coal_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..c60f980d40caed86794bc7d64758dc5f92a5d125 GIT binary patch literal 928 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 literal 0 HcmV?d00001 diff --git a/community/textures/crafting_table_z.png b/community/textures/crafting_table_z.png new file mode 100644 index 0000000000000000000000000000000000000000..31de683d4617c4c064c1af45005a6ba6003b4879 GIT binary patch literal 1205 zcmV;m1WNmfP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMk4~R??2LJ#78FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0**;UK~y-)Rgzsu6j2z4pWRj+#~CY~p%S++!X+?M38C^L zF~XlNg1ssV47`diObQBus35x#BZ%m-AP5to2ve#HlUz#*{Mpc56^bp}oGGeVr(L%h zyBK!X{jSc(Ip;a=`<>UbO_A1abT+cSdhbur9o)yG;VCTJ=45Lvmj>Q*>wH_zxl@-P z;|1_5Dyk$Cj_RnAO!wI)y86bkY#V^CzHz$R>q#b)#B_~hGU-CRnT3`xsH#+W_jVR7 zVbI&z%#4}l<6n!r7mwjrQ~<(J9YGLWfDd5c)f51q8>*oQmVy0bnJGO2l5C{;7L;#pxSjt*xIk21H;k^JHJ$(&P%%{Gl zjFMuJl46m@x(eDF0-QUs--TE2D$4?5x<<+$bR~N6p-M9Lnoa6o8ZBXGrB5(^yyGT96Bb>ashDRb^|?k9xyfkEepu_kIygC($Pdr*PLH@J%=DVImlF{=%KZ>m65*f%zgUd z0AjjEII2^tIw~?j5{e2a@a3UOvTG~9yp)b$ZEln^7b4*=q&I7BpD95Qi0K-tBqIm{ z$B#Js&qo*VdA%NnLbCuAiZTk!oVwDwd+TAzJC1T$V{97DFUayD$@yH1` T5WR2T00000NkvXXu0mjf^IaC@ literal 0 HcmV?d00001 diff --git a/community/textures/crops.png b/community/textures/crops.png new file mode 100644 index 0000000000000000000000000000000000000000..9a530f084ef05b162a646a7a35684aad805d040f GIT binary patch literal 1167 zcmV;A1aSL_P)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMq0hJrpiU0rr8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0%%D@K~y-)jgd=hQ&AL!zjJPK(fQU>DK2 zi?|R3pf_Pt%!B1fB6A_eGc^FtU9E6_3ias=LiP(>E@^_e6G zAf&rAEsyn;7yvuj2+4V$BXg@gB!;^=+>c-zF6j}2{JH@^wHPMWud}%kqq|GvclVAd z*j%-IfpFAj``a-`WsO3vi3~t$EDV5U3aSMQEX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQKCGNKhs-T(jq8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0^&(TK~y-)J<`i=<75Da;rBn!dy4&)xM)LVigw~R~dCoE~ z37n>`Yc8%6(q&1v<>MK_{>g+eaI`{8J5=aaXpsVr{+pwf#`x&7kW5xVlM+lY%dH z+f3seZH>e;iqUvMC-UgFd;tDBzUOE(Wvdt9dz#bB1#wdF+4dTN)BOHs!b7q`zq^Q^ zjO%NbkvQv`nFa|a32?}Ru!{F z0YF*ScvcYwhIVLpKS_xf1uu4@CrXxA=>5|fz|#w5RZ~_qfztpSj^=nq@vP?@Zk;Jg~$Z$Fw}?M+x~T6VUYJftg*&tsgY@QlJUg7=e@yIICZgMihl;_UK)ss=s2 z&G7AGKwG^Aul6QbEgAM31P#sjHlx>e4Ev7(9gXI+Ld%Pth}Eh>{P@eCwGe_NTLG}y z@tHjoq|1`BstFs0vZ@*1Bskw-v>;uU+)Ohz)*brbY=%~n&CVlb?_`RSf)BKVvl&VX zw34g^k4Xaz`wgs-=no5fCsVAJeEG72F^bm*x5SGjpKiB^nubMIqNL#4ueSiWxK8-z zY=-#$=ht;v)pQ~c=P9OfPP#0~@`^MoIK5i1I}8b%2Incpw;57Ef88f=8od@+>Z<1I zCS{qI47!diuP|EBZ27$WxW(N(XLPjypcPttE4jE%ct}_1KlX13oM!iV$bDRJIGPhU z&9L9Vvx>vBIm@D?*Y*gU=5RDeNx>(>5Gmk)l>tMW+;QSI00000NkvXXu0mjf2+dvD literal 0 HcmV?d00001 diff --git a/community/textures/dead_bush.png b/community/textures/dead_bush.png new file mode 100644 index 0000000000000000000000000000000000000000..ca793d4b0d0b2b96ecf57f1939630e9957c28763 GIT binary patch literal 739 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 literal 0 HcmV?d00001 diff --git a/community/textures/dirt.png b/community/textures/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..58d3fac4f98118350a63952cebf8885dbb3aaef6 GIT binary patch literal 1059 zcmV+;1l;?HP)EX>4Tx04R}tkv&MmKpe$iQ>7{u2RjsT2vVIah>AFB6^c+H)C#RSm|XfHG-*gu zTpR`0f`cE6RRL;k>@Q#C4j3NMZqtkRU=q6&onSMx0ii6botEPx$x;T)#vvg#t9I72Cnp$zfuRLKS{5( zwAc~Qw+&oew=`uBxZDAvPljyDt`wvx6bium8GTa@=)VPeR=wVu`#607GSpS-1~@nb zMv9cZ=JW2Z_TK(I)9mjDK>u=+__5Q400006VoOIv00000008+zyMF)x010qNS#tmY z4zmCN4zmH{a@Al{?7ma02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00H|+L_t(I%VmX=uU2 zSRo)nK?b{c+oAu4w_f%adD=mk)SEEc9y~2=AdELbO=8`&2qhls`;yN0^uEvgyzlqd zqg|Yzm7&N0h|>aq!1uUci;^7IHr4&*ct+rR)STVMu+`XNG?`;GwgFg`B|jeb`26W3 zMq``6_h>%cVsW=r_tQ`?z7}W~=V#^Rc&1PW{VwucMUyK^asbt*ha%&r)gkabT-ziR znQD?!9LoT}u?$?>WYF&_i8??ty&@DDf$uSz%;~lF0Tl9RG6&!b9sr@pRIMJT1yPdY zSO%fUlu?pJ)x7VM4>WC)I4y8(lfd`T1K(3_$7#V%=R`FO`dtS7u9747Qc@@~>VWzU zAiNpTvJB$1;Bq{}u?(UlSDGc5{G@jD{K;@}w}|{h zz%&%-nzm-(ScWpCYMRtueJGhqcC|MzpAG?ZO;b@8w@Xfs57oe&9v|Y`rec}j{)T6- z`FcHF$0!j(k*PRkguCrms$ONcxOz{N-x77Fb3*TCw2{4Q do9bSI{smh*G@tr71Y7_B002ovPDHLkV1hGs+;so| literal 0 HcmV?d00001 diff --git a/community/textures/fire.png b/community/textures/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4a5b91ee10a40d06e3d79ac2b9483513e87d88 GIT binary patch literal 666 zcmV;L0%iS)P)EX>4Tx04R}tkv&MmKpe$iQ>7vm!4?s5$WWauh>AFB6^c+H)C#RSm|XfHG-*gu zTpR`0f`cE6RRL;k>@Q#C4iONMZqtkRU=q6&onSMx0ii6botEPx$x;UB5&wg#t9I72Cnp$zfuRLKS{5( zwAc~QyA51iw=`uBxZD8-o($QPT`5RYC=`JAGy0|+5V-}qSH0ev`#607GSpS-1~@nb zMv9cZ=JW2Z_TK(I)9mjDL(X!P#jJ+&00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{0044HL_t(I%e7KL4!|G?EByb@-3h}8)g?GDhJsK_jQ}w@ zwL!!gC%~?b0DV^!xB;eyt_HOzP}^6>BP=J-JqirPr0#(4-B$h*Wk$8?EnA(07*qoM6N<$g05i~ A{{R30 literal 0 HcmV?d00001 diff --git a/community/textures/furnace_front.png b/community/textures/furnace_front.png new file mode 100644 index 0000000000000000000000000000000000000000..8059c5affd5004fb841a899147e21a1295752d0d GIT binary patch literal 1238 zcmV;{1S$K8P)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMr17Z$_=Kufz8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0W^Y&Myloh6gW08p#dn4h1= zG)<(G{QUgTZnsILQq=2pj83ORv)Lq<%hB)m$z(DVi$${8ERjfrbUMxV_ctpmE97!H zB9RE&+uMxCW0X=@mSv%o;_dB?rKKgb)|{Q4kw_%aTGQ!ta2$ubyE|4_S6N?QXKrqe zbUMxR^D|Z~7GrH~4aaeKe0-$UYEi4z_!|}$7Wn-9B%96Rx-LNwVDx%D-rwJG9EaD} zS8i@@_!p|xD#ypiG#U-Aude~HT-PNMi6DfS7A6u248y=QO_WlYrioz~_`Z*6n&k6& zMxzlI7Z+GkN`fGuUaupi+6eHEQas^O}4u{;|-&3hn2*Z%8tE>Mg5Cj3GQii>I0<|LI{Kqc%DbQ-KNoKVB0o-0LF+-t=+Dpw*UYD07*qoM6N<$f>IYd AG5`Po literal 0 HcmV?d00001 diff --git a/community/textures/furnace_side.png b/community/textures/furnace_side.png new file mode 100644 index 0000000000000000000000000000000000000000..18aaba2664fa82b790f48507395f6f7af40091b3 GIT binary patch literal 1190 zcmV;X1X=ruP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMr4TZL=-~a#s8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0)I(FK~y-)ZIew;>P#4hFZwx%MUkpOvaHny&i{$hv>SFQi|nr ziSPSVDiu7>Lkog{;c!T^*b3&W7nXoO{1SeC_P zGC|X{ZPP9$)5q9MJ3aa2$tLtHpY~X1QE4o6QKr5a0JP41-py#rO9& z#_8!P4-XG?IvsLdUteRICIIvKoZa1Bq?F_j4&dqO3Bxcp1mp3T@p#O?6ow&=<7~&1 z$%Im=#CSX=2!c%k%d&{$cxzfL7L-aQgb-w)bP16AQ3nv0Y>`+ths{jB107*qoM6N<$ EfEX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMqFGS_Rm;g^E_8mlb`NNNLC94Lu8F;OPo zffseI%z+~(PBccuCJ-eQ70XXS`rkd+(X)4QW@lZ(dh+Jl?RJ(V2>@xDk|YUPmXW3@ z0ISuCTCGNsBqT|K@B4&dh_36zaZCZ={QMl(brC`^91bZKi~?fubm!o}Lnh zA!(W-6$%B?G-WUtu(Pwn+1VMLPKO`}*xcMC3`6SmIu8#I*tX63`a0!u8N)CLf`Edm zsx+HTWLai5o3UE0s8lL=o=3mmN7FP+)8ydbfGo@C^?F26gb;!#ijX|d!*LvBSw@y+ zK0iN^B_MN!D*asc?gk8Rsbr&IR!_UQNf zEEWsOJt0XFaU7%TI_l z8jXnKm?(+>D3{9&heN_JB#vVylL-L#_xC@H(l=wNR01Ff0`mDh@9*!dRx5-M0NA#T zs;cbo?*sfW7QPuB$KlT{77I2uHt6+w_`XlO-NyHQ#^W)?Vv(z>tKTPnGj45dVObVI z5Fmu$@$r#fuSd07<>KOk@p#O9K1T>a5CpVZEv~PxDaf*ns;W4SgX_9~#bg);-EJ4p j^Zqj?UDwI|-<*E|lVge5sY;m_00000NkvXXu0mjf+-53? literal 0 HcmV?d00001 diff --git a/community/textures/glass.png b/community/textures/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..64cb447f5cabe6b34eacdb7865576e0adf938513 GIT binary patch literal 728 zcmV;}0w?{6P)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQK9HW1eKiU0rr8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0I^9#K~y-)rBcBS!ypW_PyKa{emX@L=(Je?F+@I59+@FR z{OmpwOMoCD=}Aa7z7yvYEFwxf0C3u$!AByP5CEq&0QNEO%d;*sQTk$9yU^!^MMTZI zx#)olqU$nmE1ZeTTwDl;q6j0nj4%h;Ln&DFASdT+5*LU(lPj3yshAPe?9^K78DEDTm+pi)~NqYrG%ig_@_4de)o(0000< KMNUMnLSTXry*DNR literal 0 HcmV?d00001 diff --git a/community/textures/gold_block.png b/community/textures/gold_block.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c257748db5a193d122fbe97d5bd45d77dbcb77 GIT binary patch literal 1049 zcmV+!1m^pRP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMgBtV=mLjV8(8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0rE*iK~y-)Ws|{<97PaBUu4ycn_VPd5Euywi3?o#1iqQy z@dp4FvV@J-J2Tx~6~Uorxi~LXN@b-YUq|7-0`<)UFCk$1FM^H+ zDdbQ!P&P6*CM)p@b)i@BMM#sX0v9nv0k6P@6#A(F3(=KMfcy>m4(AW>MzsP@NJj`% zB#?w8V1PpH6&;zVk^D)0{&YxKPWNF9m>|*woFO4GM@P}8Cesj$TFwA?45~Gdfq_)) z>`rBEbI>JITJFf!!~Zi$3H5=+8X`R zsEhDzW4~==+v#M1oI&lV_DUXp044_??q?_h4t>6+FN3G^dpew<9u8=yUmyc9iF{{p zn5VL%7fJI*ZYzFX>CiwY2%y}R7|D=%U#F1*`;~dQFt0bVt#}>uvZ;iQHllx-ObDnNiZ~=0JjvJ?&mYlxr8A*I0kY|^B7dSXkJSx< z1U~*kIm8pMD_n1kbt7XUhq({*&)eT}xC(HHk9&*poQR_J#^V^&z0SjUn2hirk=99^ T3#U3Z00000NkvXXu0mjfr{Bx* literal 0 HcmV?d00001 diff --git a/community/textures/gold_ore.png b/community/textures/gold_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..d5221fe3c5a89b4ebc0f4f32b14e8c51bde308b9 GIT binary patch literal 1008 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ&1mQ5uqyPW_8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0m(^3K~y-)g_A#P8$l4oe$*) zX&jtRA0bU3g&G?n47U&yIk<5M$W5Aj16OgEkixwRgSk{zv5>2@g%)Ipq!h}oPk%zD zn_=heoA+iaS(YuFbCg2}fs_(}JkLqf6l*Qp-bL#T>k-E>08&b%l;nAiQVIa)+!CND zihzFHyQcfT832+b!5D)O0)Vr#SIou(-hF(65Q0jUWeX`K*4ofi6a`8tv~F>Gen5ZN z-k|T92LJ$L4F8HGNj7SEo)bCeaLyrw2sE|Uz*qM7zaxa8C<;2APN)G)CKHrWL>}2% z8yaWhJphh&Zs-r&D5aQ<_xSzeh9r5t!l066*}@mL&FO#hZj|Q-mM&=BVm2P|w)cQE zO;=R+tWHmVZUwJwTO=PRC(pS(KM48ZC21Yil<+8p=|lR zX0xf|IA%JXQmt0G_;#Q9d>-;fqd~o1$68Cb`-sQCK5#XCO08C7G#U{pr8dMX=UTUb zmw(+E5IuXy8$NS*xrJVdnm@y#jQ!a}hM~;`-(LuZ`;s<*O7zEH`o8^E6F2 e#9BXR5BvwuH|ULHam)$;0000Ho98? literal 0 HcmV?d00001 diff --git a/community/textures/grass.png b/community/textures/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..89ffa14d525908f4060cc263e101e865a9833485 GIT binary patch literal 1349 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 literal 0 HcmV?d00001 diff --git a/community/textures/grey_cloth.png b/community/textures/grey_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc157726815c38f7c2fe287fae12bdf16f1138c GIT binary patch literal 1055 zcmV+)1mOFLP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMf7)0Ix2LJ#78FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0r*KoK~y-)Rg+t8>o5#Nk0?r(V;3n}WHsIYcIqIp9Y6HA zAHEivZ;I66%+UP&{1g!(#)ydEy+>7<=NS>fIfsbwd_EBoLI?mX%R_1>3mF~%@W6Cy&}wxpD>){;`9ZCgZyoHGDj*8#Ba z`#}(6B*sVxp$;mgpsIurn5GG9?HhWGk&llLVvMLU25T+zJmbBmX&L|?j|VwtLI_xE zdA(l580q^SRb?24gWxQ9?{UsCO%vO;;k~cu<2VvRz&Ten5D`=r{rvoV6VH2(_nuM; z#u!wU>-AdEzrVi$*tU(75;~3}Ky{&%Le3fI96%K}gn+8DEDHdtdQhA@-|u%+m9}lk zIoC!J!5G7`ENt7x<#HjV#Ow7s2CeH_Q9}p}!+?m;G!3fCx~?=$Q(ZX4?)(05t8H5V za?X@exZQ5V7|A)4bEfM$N-2!vh_x0GA*IAH498k$M9)>8&nEyO1Vn^sngHr5f9wCr zwKj?f*XtE)E%*EV&G++GZns+v)HF?ph&ku#LX44p-w7d*QeqrOx~{9L&+`m`_nxn> zFVs0lDTQTONGa7uV+>8x(Dyz2zQ5UbCNt-Z{{H@=s`W_z9@QD~loHN4RJCeyxm+;D Z@DH|_F1Lcb_Ba3l002ovPDHLkV1m>p*`WXc literal 0 HcmV?d00001 diff --git a/community/textures/ice.png b/community/textures/ice.png new file mode 100644 index 0000000000000000000000000000000000000000..d17fe06e2e760daddafc814f08fe497150bf1826 GIT binary patch literal 676 zcmV;V0$crwP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMg0+Nxcz5oCK8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0DVbBK~y-)rINuBfG`LI@ruyS(u$UlE_`ce+JwGTWFWwV zFWk+sFwEPvQb(cHoW`U(*3uFoO4~|=C~a#F)LA#+&M@BP4b7YY0000< KMNUMnLSTY|f+3Lr literal 0 HcmV?d00001 diff --git a/community/textures/indigo_cloth.png b/community/textures/indigo_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..59c1ae01f00f9a325bdc1be06281a392d64d8360 GIT binary patch literal 1112 zcmV-e1gHCnP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMfB7)M{wEzGB8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0x?NMK~y-)J(F8*BR3F5Pd&(f$o6P3K#&BphO8s|UxqQr zNV3dsvH8dc1^Q|-Z8*qBqtwP69W&u$I{+{h*4g>k4ot=wAUz7DHol)Ga%;G$(7TXwA(}D;1K^S} z*X`gG2b0h3Ah*Wb9C1_L?>n`2{Nr&@YiA0^6pfGVV9S*`D6=c=+3XaJ$&5?N%&sU9 zgW-R?%wOa#{kV^e=cOf{3u^!d@CLlT%ygo}W3`b3sIy%vdJl z{kmf+EWwDbY)55rWqk_Ww#*cabBLqCX$b(-+G!1beqYJ0QER97&g&BBy>m$!H^pt_ z3mxP zZc1$(5#jIi`W5l(cHmPmdhfig5fdS|MlOw03>0fzw}ZFY32vAPw{19>C+E+%8IL|3 zq(`B)&N>guDq|DRYvfTYX&>VY&*e*dp|pnoy6?CuuS*~wja$mND(mc+48__;Qr-27 e$;<4BIR68*fH6^t$4QF-0000EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMgEKWzKaR2}S8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0XRuSK~y-)rISIf@-Pg9KQ{>yY6}tq4#EA`oC1k+K+}*$ zBz}uuRE^+YJl^aaC-#iTk@NYiAp}GO=N!&CthI;;s>%x@g7+Q~sm^TIb(~Ho0Gg)3 z7*jo-riuUIdc9&(N|aInD5daxKKTvoFbu>P=OR_o+A5x=300l%dhfA)-?Q88D5cEQ zo2IGsKOPSNR;yK2uyD?^#uw>-D$8I(o_WS+3Vaw^Klq$N*7@%$2e-ga+ zU(r`p?Co~@XyeO;7o!;CoGYbZj3I=8-EOxWk4H)=s4B*oszc717~@A5*6TG^RsSX- prNrfOc^jar&I`5tol7Yq!Vk>K$XB>j9oYZ?002ovPDHLkV1l}hf@J^z literal 0 HcmV?d00001 diff --git a/community/textures/iron_door.png b/community/textures/iron_door.png new file mode 100644 index 0000000000000000000000000000000000000000..e00dc8df6130a0dce64873d399bd2bbef16004e3 GIT binary patch literal 1022 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMsEtU1y>i_@%8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0oO@HK~y-)ZIeM#B_R+*9|Z`82k;t(CvatixAGPq!9%#x zg@zY#;X=Qmzv-rdnuP5Z56jeoKR$^{%Z?%+ywU!V9F-DG$j}Z}CYqZu75v;X{ z2*#Lk_WM2V^z;-FK~-7Tl^7$&7+Pzis6$n$wT=d_udg_3E!J96N*H5UmIVM~3?T$^ z&Ib*aW#Q!Hgw`4WE~SKXj#3I&S67A&9v>ey=lmo7@bI8HXG$r^&CShsC+GMd&N)H| zKjJY)y!XTyk@NF&LI{*nek7{u7du8&of6yN2HWcRd&1Gcxfx5G5=)n-lMAIoN+NmoO2jsxVX4D5bOE*SwB8LxV*eP zh(A3&>3+XQM3By<*7~c6TOV|Y2;Ted6QQ5qMBI+PZO~eyl!CdtyVFh~#(1E*F@|}b zi7^iKbI#OSnWpL6iCqI#9XqeJVy>`fZlKR`1(cmId!U-g{j4_t)1K^E@9=vDT7v zW}au(b)}Sos^YyL6kQ*6``fIwBeAc!Qxg&1-`@u%`}X#BeRg)nvMi`7DJ7<9VwxsW sO6+z!N-3=CN^1@09L_mDKR*HZ0~{1Adb5oI7ytkO07*qoM6N<$g0|ww-T(jq literal 0 HcmV?d00001 diff --git a/community/textures/iron_door_bottom_half.png b/community/textures/iron_door_bottom_half.png new file mode 100644 index 0000000000000000000000000000000000000000..283d896591d54e5982fcea76f2ae3892bcb8162e GIT binary patch literal 1011 zcmVEX>4Tx04R}tkv&MmP!xqvQ>7vmL5qkuWT@g`K~%(1t5Adrp;l*{h@IUxHTPr^??j?oeK>Lg1d<+4hU7%idobO}DshQiya5gl zf#CvWulc;Yqjhfo-f7J52YnB6t3iyFQvd(}24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jvGA5*Gm=DL32z000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0005XNkl8T zmdDEsKMg+kfp#Af2Sj&KRb803x3~WK`btWP%jJSG1`z>ZSr)#&zF3xp-aD-|dhaaD z!tHir+cwO{$48Gb(tAfl2q6H>;*=60gn7<6(|aez$hK`bV+_Wa`9h2l0Ambe{rvo( zs;DaGdE&jNwT7zVVvHQeK`CVdjqRKx#z-jzRh_`CHGn^W5CW=7@0}0=z4uvUj3MXD z<#M6-PALWNJ?pv>W5hX!tF@x4T}7-Oil z(puv<4n$;{`u+VqCEZKh_Z_$I`y9_`nDqWl;okKS0@hkY1m_&`{{B8`d+#3#y!UfD zAq1YDp0L)kuItQ=dwF@8vu>@?TBFuF+5Df6k;wBrNh#r;pPy%wh)nI)+PR%`voVB# zF@|MX{&FxPDED|;{zNI|55PHxF^1zfrip{Hh;W|g%*VJJKyKT%`B{d> h@udgISoini{0p2@qwX8Vosa+k002ovPDHLkV1gH1&F}yK literal 0 HcmV?d00001 diff --git a/community/textures/iron_ore.png b/community/textures/iron_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..001beee9108a7dc0353afa34078ab2ce4ef3afd9 GIT binary patch literal 1007 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ%IM+mhVgLXD8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0mw;2K~y-)eUq_j8$l3;KVc!x*^6=k!Gc$iH0C1QD7C6o zaT`*pP97j{aCs0tLi(gPs$&RPtW!7#cfuzST9aEvg)OB}c6~aDOgGESzyJLIOe0B> zjkT6)2qB1~2mq}$aU5fe;ZR+(-cXM)3;~Fuh$xECS|gni{TCr4b~ zfs~SKeZ_D4XNQT_nnsc&8~0GR$wgU~-i_+~z*d7{ze6^g^W}R<9LGDVJ62zR-5&&R z99kq79|td(++;ogg+`aN`?eyzNK5Uhi`lhOAaA zTCEn7Tg!UA_IbD4rQL30jN#p@ko(1y)p3U)2uRbErj&9|ylOt|cX;w#vRpLDW^c! dqJGW}_%BPP`}G-s93ub#002ovPDHLkV1g=Uyl?;j literal 0 HcmV?d00001 diff --git a/community/textures/jukebox.png b/community/textures/jukebox.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9dfca9e8d2b6cd8901297163e13a0097214654 GIT binary patch literal 1191 zcmV;Y1X%ltP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMu5pLU?vj6}98FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0)R(SI(=xUVfH4N8b-MrC2EmX_X|}+#)kTVyK};h|HYw&$M*m!Jas~X!2q#xSYQgI- zmsm-_=HTQ9I;%K1`GH|XyVGacnWgIntlgTY>jvD&TeL5`EII|8T=FVQYr|NMky3Hf z&N3Rs+_bZ}gCSxX(eZquFreKVpe8ZhFhUN7#8P4-uq;au>M1*wJM0}_uwA}O-xN?~Pen}yOGjdPFZPgeNY?6AAF!Mmd~o>rFF|J-Ez;cY$~owB>NLGv=;RqZhg zr8zRTjb)T3mNLcI?hTNGA?@Da8YfrSui~+k7^Sg{!Tg(x z_uqe}*st<3#UcumaNvdkZQtXx*Qf1!^rt%IqV0RM`~Yt}#2pL)IPLXu!yx&_jBVrO z3LKyHsaMx&UIx6ZuBX@!PdYrUEOC6+=lSLuZ$CAuSJ!cJg+#SRY1A}M|NRQ%|8&vy zC2A6*raIAqur2b%Ji9v;8s{GMTA4TB&ZyVQsV@HXFRH6Fnl19he4+zm3~m?@g#q1A z0uU*Y>fp9BpX#75qeKVc2saEc#vnEyZJ1}Pi%h379h!yG8~|<@Tw6Q20@-Zl_pmAU zzjhE0?k}5CAt6KnS|r^qW6(k%j7bX{AyC?2TS<;KnqLT-jKYZ2-L(J!002ovPDHLk FV1fXeBQO8} literal 0 HcmV?d00001 diff --git a/community/textures/jukebox_top.png b/community/textures/jukebox_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb81f2c8168b43d24e6098eb2f87cb3bbfa4191 GIT binary patch literal 1031 zcmV+i1o-=jP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMu8;%ZgtpET38FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0pLkQK~y-)b&@-78!-@uKQ6gXNf0a>K~w}V^3EC3<`_9% z4v`Dw3@K7LP2fgWuzJwqa>;SQ)y9f!RwQQTpP7%p`t9- zE_yNnLP}ZA7hu;X znjGgGWqBNRe2QD0T6slK2SQNYAT9>K>^&h>obA7;Kxan@2Hw8`9MTi z?Y7KfPBER043>ifkG4K?7=2(pB7#v$k>?FJ){fw=2BG797htv9GB0cLJpD!<14?aB zAKzTdw64>hKvXI@UWBL=N@Nrhr3g{bS;~nLc>tPo-aUKZ`>p^0002ovPDHLkV1imZ B(EI=Z literal 0 HcmV?d00001 diff --git a/community/textures/ladder.png b/community/textures/ladder.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0a787730fbac4f294c9c3d630c73404f191c52 GIT binary patch literal 996 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMs1lLDEhX4Qo8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0li5?K~y-)jgwDn6G0eCXC#OBbZ zEvQA}T7;5bn`1AY{Q^1m`K$A?hI;OrZzrPg-#at!!!z)Ay?MPRik2w|S^K+N;#J|H%qaln(uM#izda|vHVZ%^Ist&L>$17i z>EO86eEM?5F*js!^%cgHPMeo5EVU z7dpar-W1QW(=rzs6xqyO;*)w(F+BfGF92NMqg>h$0S}%$n#0hp zIQVcrmchV_e(sj^Kr#TtcgN-U?At#X46~99tXzuuWbD5@P}RtI544Dec|Xd`R6=@i zvra@OaNO(h9;6pyR4Ed+YFZ=;C+{u}T S&*K{a0000EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ(6~w`MkpKVy8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0PIObK~y-)b(75v!ypWWzed@IJ-PsgOvj-I7U&invJVnH z1jj!#mMkF*_IuCvtHDTx%f3K`6SX9Ve8s@W>6y{{^vvj7-q7>?Cd3uf;C4oy) z6hXsRYY}Z>?ASiPRkT!tm{z#&bP>@(%mJzqc0r3E$f3fVhkFW-FqI`D2pzC(S`Zrk z+Q$CS>!*?Kk-{;>Vx7Dc>3wwR0QS==UIX`R65AwZE4Mh}$%uGXzvl5Xzz;=`M~mmA Rt1SQk002ovPDHLkV1m+|RCoXY literal 0 HcmV?d00001 diff --git a/community/textures/leaves.png b/community/textures/leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..858664e11ad1091dc240cad4703f466e8c862f26 GIT binary patch literal 1269 zcmVEX>4Tx04R}tkv&MmKpe$iQ>7{u2RjsT2vVIah>AFB6^c+H)C#RSm|XfHG-*gu zTpR`0f`cE6RRL;k>@Q#C4j3NMZqtkRU=q6&onSMx0ii6botEPx$x;T)#vvg#t9I72Cnp$zfuRLKS{5( zwAc~Qw+&oew=`uBxZDAvPljyDt`wvx6bium8GTa@=)VPeR=wVu`#607GSpS-1~@nb zMv9cZ=JW2Z_TK(I)9mjDK>u=+__5Q400006VoOIv00000008+zyMF)x010qNS#tmY z4zmCN4zmH{a@eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00PZPL_t(I%Vm>IZxdG(hMzm0phn4Piu{QZlSFbFiui~V zLYnL(kn2=WR6HpgOEPz4^X@eArg8B#g3rf@-3#zJussd2~YMMfdVPU{zoH+K_ z9yiP+_F-XpLY2F^=jy)ieb3QzIWXHV0ArOw`8eAvUEg&HZ>{9b*#ByPj*A@vkSZlb zvuzsyv)yD<(I7LCQClXq_@c!>0tC+l1>m?lA}732@jMTJyWd;ut{>jpCIG#sdS$#i zB>SyK{n5*W9I^W)F`bYvSB7QZ!<_=~#eaJxRZ5E1H27`ryaGu7kXH429p~990ES_( zmJMLrHuZX)m6a6$YPA}xFEuoPPZs)Q->dih*!prCi`N4HcrO%{N`?G%Uj5Yer_!{> zo8`2NZQBh4(=;ikT>wI7Lt7OaO*YM=?#4+aQKv zPvVnJ1otWX)Cw+Lj-u85i<8J zn&N{~J2>+1usDu`mbqs!JF^79U)L9LU6=W*^C}Ps@avvOs^emZ+)VzhbY1r$Dpra( zjze}bt4K^IHjvhJvdf>v;o@#dm6HCQ_+(r@n;Tfyj8z7Gluvl08_dQkgT5eDO3KLX zZUKmV9g)Mu-J<1Y8z{H5v`~8T8i1qa0XgoD2*8YSUo~;h<#M#PwyuM;x{BUBxN~KJ z-cQ>Ba9x+Bxw4-keZv8uy&B}f%mT-pJyNUH_}P4@v{$zpsWTH9mA>K7bGb*BA36L! z`cyRyg25o+b74_Rk)O^hUDv5R^@vZ#g#)?wH}rk*pT=Bb7h;ksC1t!iB+>IxdHdsa fUh0(b>X5tva0^y+E9z*w00000NkvXXu0mjfpr=HI literal 0 HcmV?d00001 diff --git a/community/textures/lever.png b/community/textures/lever.png new file mode 100644 index 0000000000000000000000000000000000000000..b43d14dd51f0bd1461ed4a918bf2c079a34ee80f GIT binary patch literal 1360 zcmV-W1+V&vP)EX>4Tx04R}tkv&MmKpe$iQ>7{u2RjsT2vVIah>AFB6^c+H)C#RSm|XfHG-*gu zTpR`0f`cE6RRL;k>@Q#C4j3NMZqtkRU=q6&onSMx0ii6botEPx$x;T)#vvg#t9I72Cnp$zfuRLKS{5( zwAc~Qw+&oew=`uBxZDAvPljyDt`wvx6bium8GTa@=)VPeR=wVu`#607GSpS-1~@nb zMv9cZ=JW2Z_TK(I)9mjDK>u=+__5Q400006VoOIv00000008+zyMF)x010qNS#tmY z4zmCN4zmH{a@eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00SsVL_t(I%T1HrD?<$c#(!sX@_jf)Qd-JH*hrMiB}K9; zO)e-GF8mKJxO3xAP;SHpYbFhmh?r#gsG*%L?u>m{bDVAFocH2=>3wdW=ehblkKpt9 z4E~d4Fc_q?v=mL#kY$-@G|Iuj0S<=)v&m#y$mjD^R8+9FwS~jsV0?TWfV;ap&d$!b zzP_fnx0ifAkI(0$xw#ol(>3ir8#6TrL-qB(b`>O3}c;08Xcqjg1Wea=9E51v-X{=T&fj|IV*ZKPT zA|8+9@pw>G6=8mU{*OW=5}~4^f}5Kg0NUEx5Cj3c-A-Ly9g3om$z-Ukti&)39v>eu zJDtu20H4o?BuR{pj^cDWd3}8)lgS{8BB4--xl0<)hKW?|1 z@9%FO9v(P6JY;ZikiESs9Q4|G15LjMbrm?XRQ4}!&`2BubTU*g}om47?D2fDw zLE`Z^7K;Ud?d@$E8X9o9TmYP$oUpUAgYf%>#l=Pbua1rm8XFr41OlW|Ddy(pNG6j! zKR^Ew0}%H1_KefhQ&d%DXlRIZI*lYrtgWq~C<+}N9n8+o^7QmXI2^`ev5-h4C@U+& zEX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQKC5dd;MtN;K28FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0-i}kK~y-)J(A0ABSjcSPgVU@)fdNhVrSxk2_SYOfy82V zhzH;;c@drh2?R{U5DO(kE{@&ZRqk6g3y;`+yH7gjsPBJzH)*RFDMbqTw$WM`JcHqt$JxC@82iquc+ZyK^Ik6Q}WO@o~aMuV&! zvU$5=LKC_`KP0mG3C=W5Xs6MIu>Sgj>QFO=fj8e?0kE%Y=o0d@-2?n@VV`Q!IN@^x zKz$nsHj-U>{K~W2R{+>T&`u-%;^g)Iw_BVyFk^Ulpj*z%hYQeD>W2fZe{L zxebV0SkgFAz9}emM(6@V7$~ni{ZgoJ1Nn816oPe{-TezmL%wv(zgZ(v2qb8CEwPKI zWV=K%>Jz+ks$(F0jI>JOXD5BlLrWb4^788elN;vOIek4)-v(4}C@(#eoF4lw;g$}c j8|vFYQi}5P9HZesC7(G5fOn0a00000NkvXXu0mjftUM=| literal 0 HcmV?d00001 diff --git a/community/textures/lit_furnace_front.png b/community/textures/lit_furnace_front.png new file mode 100644 index 0000000000000000000000000000000000000000..83abc9f7a0b900ac4faf9769950391e40ff0c485 GIT binary patch literal 1260 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 Tido^^00000NkvXXu0mjfboMuF literal 0 HcmV?d00001 diff --git a/community/textures/mob_spawner.png b/community/textures/mob_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba9080251373f7b8a070f5e84380caa465d72b9 GIT binary patch literal 962 zcmV;z13mnSP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ&B-&o=YybcN8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0h>ugK~y-)m6B0!+AtJ_KRa>VU|67#v4J$GhS0>cR#R1J z+r$3<-`LBhRihLL3M6s72ZTr4Y+~odSJ%h(J;z798ckeaI=F0!h+=lT9VW2IMw|J3 zjxh!)rQZ*NfQBqt7Xp_pVK}>W@MnEm*Yyr{fBMmh-f--6ocI^2s-mSF>p~!mdR>L(aqe|a{+aqqw#U43?v8WcrwQg5|dAqJOIC!!daEeV?! zSZg_}w&e2M6T>j1SkKXMLZ0Vd?jsZ1qnRJ^^}CyYn%Eppy=*VR7~{!O)++PpcDr7d zR7&x`D9aK6r4+KxoVrU7ho08rMKW-$WJtF7N!01@3F$pn8MM|IV@T5!wkt#wljk|g zW<;Gniyz;h_x8#Gy!r6Sn>4xkdQuXHvs)*%)&Nvh<;hu=o$QAgTuxne)<{9 literal 0 HcmV?d00001 diff --git a/community/textures/mossy_cobblestone.png b/community/textures/mossy_cobblestone.png new file mode 100644 index 0000000000000000000000000000000000000000..d76bac867f1f28c62f312a4bd6084dfe5ca94771 GIT binary patch literal 1401 zcmV-<1%~>GP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ%17=TXMgRZ+8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b15!yuK~y-)O_NPb6A1uDUps}iQ#viswft=%4UK^iNX_EG z#E=LW5)LN2#&FVudol5Z38*#FvlopgV*L-lqwi7yG-n%gi8gJ!gb-9aot1&QaVg;y3+Bl0+d@Kxk@eimR%M%jIG{ zyUyJ194)>UG)-e6y@2N@4|hB7l1L=j&^L(MqGYpKo=-m~Q^;T!MG?a=c%6Fg}3vBuwx<7jXY`z6Nx&-c+%8fMO9@Z2DU zLV-t#N0bgqSVtC?ZsE;(iN#{<@9$%;sHosn_!Kw#Z(tY(dPc|iY%q9kkm>1Z{C+=n z(axo|OW52tq9>vZ4-YdrImzQuQgu@86i|vdZP`{Plt( z?-63VNO~uYoR<0i3R>5NE@(_xm@bu$TdMbK&wfPDF zyVL1JmSxI9W!(Ao4xY0fVpn5WMGIM$5qts literal 0 HcmV?d00001 diff --git a/community/textures/obsidian.png b/community/textures/obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..b4869a918eb647ba61275bdad81a06c3b12fa016 GIT binary patch literal 1183 zcmV;Q1YrA#P)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ%4jBFv`v3p{8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0(eP8K~y-)O_M!u8%Gd^pV=j~q)d?vZ9+~E19A~ah?63a z5O*#TAdv0GKgqu1MtKcIM{p2$>IoOEGb1&y5(T+87GS)K#;Ai znKn(seDVNmEz6q)#w0-b@!J=?KK>Jc>-xM?RN>sPQ)H0wc%~@@=93*({sKq<FyuYH~A7O2eJN+rvT0#gk##2?7 z%qKgXUH!w}*H0LYMw~2;Sot;9xxvdAYYz6F6Jv!>6^$mgHYbP(K2=!TBj!xg1XMFO z)xTWV=U59e9?#Vn+X>$2Oe}yf8*Q_^Ii-{aW5D~&_7`7qRh{v%$FwU05rb+w0R&aU z@@9z$G)+X+FdWWU`6VgkPaYYV5<*1?>u$F#(jo3X|bIR({D~FygPbzoIIDV4a)4JimTN2y0Z8m^T4c002ovPDHLkV1g~+1a<%b literal 0 HcmV?d00001 diff --git a/community/textures/off_redstone_torch.png b/community/textures/off_redstone_torch.png new file mode 100644 index 0000000000000000000000000000000000000000..e09094348f431c1c749beb985940af2e80dc36e2 GIT binary patch literal 659 zcmV;E0&M+>P)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMtIuAW;Z2$lO8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0BlJ_K~y-)V_+BsgB*l0F#PvmVEB(u4HG`ePYetU4+&U; z*8r0wI|gN2HS!G*7i44j@aY@*1~4%(F|e_*k#7JO7Z=07fB(og;Kz?241fOoA>V)t tw_h?aGBT2HfT5ZMWnMUc>jgnC003?~9dovA=7InK002ovPDHLkV1h6F4T1mw literal 0 HcmV?d00001 diff --git a/community/textures/off_redstone_torch_top.png b/community/textures/off_redstone_torch_top.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d50249f5ff86a1b5da1f429f69c99e15fee7a7 GIT binary patch literal 588 zcmV-S0<-;zP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMtG6Ck~UjP6A8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b03}I8K~y-)V_+Bs!ySY%F#PvmVEB(u4HG`ePYetU4@bjs aBme*;js$XtlH@Z00000EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQKBH~CWQk^lez8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0(MD6K~y-)J(JsV8$}dF*E!wObCE_G--2CG2`PA?itxg> z@v)RCia-(>S(apFB+aESJdE)Vbg#YFKJxo-zb3I6X*h#gw3wr=z_(jO1XI=|F?5fA zlerwN8UW&HPl^Gn#T>O3z5EstA#_Jl45)Pg_;ye7J#Mx@Oh&u;LRD3WD^WFA%_|Va z?;ij#^%VpqsfFk<^%Y_=QWybPzWWI=8R7gDNdX)C6Uq0OY6)ryU!O=ZAa=s_hc#;5 zD|$FSPefPW5&AP$ttCc}Z?~wc&|(h2dHsR?6J))xPpFl&p7m0f7sA> zXNtN(i#h(Vrf;9gs~WKxDF(Xjiehnz7ITL6UzpiM>*gia-TsIJVt<0@QCCr3RuDa? z#pD(4`YrLaCk`FuyAM;jr^7@vZa)K%y;w*oAt`{JqWJv-Vhm<>fmRLSxC215l4LTh zmJ0xehd+=k$J96A1OBi^)F8%8tsi%U2;#T_Xntf_Ah5uzVRF;IX1fjD%eFd`{nmfw(KVBD>yrMiMR z_VlZJv}&+^`w6Uj)%SlVrdpCP_}vOrr&+s#1&jB0gziXap8$}oM6#UFKH>d{9sd0jaV2)~hS;@} vcbh>mpQ7wmq!=(|4Yrt$Za87c7QA$EzY~i00000NkvXXu0mjfldlsS literal 0 HcmV?d00001 diff --git a/community/textures/pink_cloth.png b/community/textures/pink_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..d83b6162f575d2126ab9b2500481cc6d2da39c49 GIT binary patch literal 1294 zcmV+p1@ZccP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMeGKPNmkN^Mx8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0_RCYK~y-)J(A0A<5U1Z&-K06&m^|vrjyX5v;%_*s@Sq( zi^TWv8Az;IBQ|XL1tc_x#b`RE>Vv*$J4sU}&BKY~_}XDn)K54M@yB=Hucg)$vl&7w zoFv8xYs{|uSjxglVl1V2e0PSf2Y8((09k*8SuRj+vw_f>X#XXarN}2!%4~%We5eeI z_xG4ZhPxRdwc_#3DLSs>#34>nN7>B~AuXoImk6y0dToTXDDx%d+)&%zLe*SMx&&bB z+iirFEQez%V^FKngkqNAwiA@^kY3zURUkbFf4jrv4Nz4U35KQ`1*iiHb>3QZz%I6 z?nZ*sikX~TvmAWDZ6`>rDT{*n;RQjjjh8eS9h~4K5m;;dj}pY+KmWRZmX{Y4vpE1% zC6=wRqXtgcAiW)6(u`2T9adArylb_;`zTQ8K^2 zqpCnHha)Uo<8Flb-8RGD-yozW=(SP4OZG6rZYD(CHUN{eOYEplw6{xD8N~6AzpRB+ z&+LACgH@Vh(j}EKIB`g23bMO?S^@K7yI0Z}Kw-Z3| z_}3{yDx}sZsTd!f0T67xKxmCpHSbB*(HTN&T3_vB*@}lhk1*3YjlCV5utqUoU@1lS zo38;#ZwE|IFA;}7{Isr&!E41x$6+;{VHWxSD`%wt^r?T+L)Yu5noHJy0Kn_CP`-<@ zqu_bbGB^0$7G=IfNQJ%8r2EAy^2wC+>JBlK=+H+xF6mVtvsj>puiv8Ub;4KMT3Dox3KvB)duN`J}|W~1vPJeq-Zo6s0!6yWI+x56xVv&&z*!RpcOTy xo*qah|Am}@m#W+Y$74GF_~D-UpAJLNUWUc@J literal 0 HcmV?d00001 diff --git a/community/textures/purple_cloth.png b/community/textures/purple_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..8b245d92eb55e56ec2f288a7d33728d832eb1f04 GIT binary patch literal 1248 zcmV<61Rwi}P)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQKD3*-y+mjD0&8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0=Y>;? z#A>$NEyFM%+7d@8+5Q!K3W=liOti~s+KTx%Gpf8rj26TM?8+s+P4G4b;Pv>KRnd^T zYpnLX?bkGY!E}6wl@U+RkJMd>Y>F37eMJ;Z@ZOW{UpY2!T-ZxQIohG-_5E)q?gk$u zERJ9B5~I+>c8Yv=`w69?*q`Nv5)(?yK#wSg3n$!O+_BFJ>bBt1xAy=XH#J??ApwACNZbdk3CWu`yu{4r9=IV} zZV7`6X7ee1H=us|<&QyWXv%Zviz`Q!x18#Ze&`r^OWzF~-}hMUQ5xFr#QSMWWG|7` z?isBNk-Y?9@v=uLb-pl$)!Pe7DU1qG0*m|sfYe=Mv>?um8HRyH{(#ZK-PI46K=F0; zNZIDh{6}06(zY#H8SX#+2*5roSik>^cpK9X9n)i|1gd~1~SWULv(sn1tF2Ri~>)qMORXj(j3I73j12rkow@*j_0000< KMNUMnLSTYhG(Lm? literal 0 HcmV?d00001 diff --git a/community/textures/rails.png b/community/textures/rails.png new file mode 100644 index 0000000000000000000000000000000000000000..802d13ce9f5858ed96afa7960dccfaadc9278b23 GIT binary patch literal 869 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 literal 0 HcmV?d00001 diff --git a/community/textures/red_rose.png b/community/textures/red_rose.png new file mode 100644 index 0000000000000000000000000000000000000000..4a202b59f486669a6a8fea157d07581fcd3c8712 GIT binary patch literal 702 zcmV;v0zv(WP)EX>4Tx04R}tkv&MmKpe$iQ>7{u2RjsT2vVIah>AFB6^c+H)C#RSm|XfHG-*gu zTpR`0f`cE6RRL;k>@Q#C4j3NMZqtkRU=q6&onSMx0ii6botEPx$x;T)#vvg#t9I72Cnp$zfuRLKS{5( zwAc~Qw+&oew=`uBxZDAvPljyDt`wvx6bium8GTa@=)VPeR=wVu`#607GSpS-1~@nb zMv9cZ=JW2Z_TK(I)9mjDK>u=+__5Q400006VoOIv00000008+zyMF)x010qNS#tmY z4zmCN4zmH{a@eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{005RrL_t(I%VS^|1+)d<+4=u}XXpQqPYokJ&9i=gV{l+$ zVR-qUi9ww4AA|m{?-=TtuxY-?#`*u&|6dFaEG!IajBE_o|Ng?NnV<^}|NFym{qHXZ z1_lNO2No8bhA`lAg;+boe}QC%|6~VZw5u6qn#I~Fu$_T{fk7adfuJEw_#{8fg#kl5@Q2$p8QV07*qoM6N<$g15dX+W-In literal 0 HcmV?d00001 diff --git a/community/textures/redstone_ore.png b/community/textures/redstone_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..ef0bcfe40b88d1f0d74f7f4adf7c617ff5bbe223 GIT binary patch literal 946 zcmV;j15NyiP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ&77~fQ>;M1&8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0gFjQK~y-)g_E&rD=`p7kI{B=p-zR$6#EAc@*(+zfXj8i zu-+z(4eKuZ5BU>!DOJ2u@U{quV1bK(USW?|I}Vw0n7O)l?$x5}x|~vCURrC6F#ve) zsq2~;BlqU2+lAX&E|&lpV=%_xy~kP$KuYNhFilfIe;5Y-uGa;?IY$Tqtu+9z3AcVkA<(&K0^WIaXlt?L|wJtO_ zea~A}acCN})=bkxvtE}T!0~v*T1zF!F-9I=Uii$JQ7On7Hw?tK#ahd#6sMf8n0W8c z5~OiYr@SU^%=H6j7dCy*s1)zd&(w8&b#;*ww%fbli+e$m`m^5?av?~#u{Xwe9i$Kf z55vG|w*%nNG=;u%4pARtEVeIJt5ud{$sL5gBv6(l7hE1FNBl{G$awnt;;pLqxX3wO zRp4W9EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMt15h~RWdHyG8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0C!15K~y-)V_+Bsv;}_|82<|NoS^Vm-N<85kHCCKtQ>x6zluYXB2oNhT%+Ha0c}vJK$k;$rys?;rUF z{P^*M;m@Bx`tFjSME%nRply&&iX0O$5J@&tIFH2?qr07*qoM6N<$ Ef)5QL2LJ#7 literal 0 HcmV?d00001 diff --git a/community/textures/redstone_torch_top.png b/community/textures/redstone_torch_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd10c451fce6d1c3c62128eff8cbb80b38933eb GIT binary patch literal 604 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 literal 0 HcmV?d00001 diff --git a/community/textures/sapling.png b/community/textures/sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..df8784b3c65fd65a88856f0461cedf150c2d444a GIT binary patch literal 989 zcmV<310wv1P)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ&HL&i?o&W#<8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0k%m*K~y-)y^}#}6JZdBpD!*&60=!oK(q&|5HJ@PQZL0y zbC#SoV9z~xHTnzs6N3Lh5Dz_cPa=4;O%EQdCKnAZXp&Mf!os&3HYuWvr(N7lNN>(< z=9_QcdEc3V|7kl1+memt79}l8+&S2m@knDimMkss@o2z!q*KM}ZCm!6hYFxos;2T) z7UlMz80mE~9xYcNNl z-nQlLyBvM*6tkG8a%+ue!Dk-$CIHv3u2Lvmrr%gex=K;F@#vZ~YGsLi%dwcd982nLTa4_Y1pbWUb>IWZK5W<(PI_JnQM+1oL301{kA;b2S6-aaDplz>R`_zi zFgGpjYNeL#{@(7UMALKn-f1$z3vVH7-+%ZC+M@TR1%fcT@IwCrLYdy{z7gK`00000 LNkvXXu0mjfL5sPK literal 0 HcmV?d00001 diff --git a/community/textures/slab_side.png b/community/textures/slab_side.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9bc23ac8e8abbfe3a01c66f9176231bbb2e1df GIT binary patch literal 896 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 literal 0 HcmV?d00001 diff --git a/community/textures/sponge.png b/community/textures/sponge.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb11e795b54729c3787730de704725c7eacb3d0 GIT binary patch literal 1316 zcmV+<1>5?GP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQK9Et<1GW&i*H8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0{uxuK~y-)U6MU$8+RDSfB!@F9XfH5jPM^xCWRJ4K@d

>ZBF|G^- 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 P00000NkvXXu0mjfHdO=U literal 0 HcmV?d00001 diff --git a/community/textures/tnt_side.png b/community/textures/tnt_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7aaa0d758441683f856a26a8fb2e9b031b841a12 GIT binary patch literal 772 zcmV+f1N;1mP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMh83FH76951J8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0NqJMK~y-)&5|){12GUqpVm%nuonU$jhn4<0g=L0D&KcI zA7d_{N@W~uV$`fRmXsoqkQ*D3A`uKT@Bd*W#3-{_#lz@1jDe4H;N@XP4L1Nofa5u` zI|XXF;g{#{2Pk7qOyHcOZQF~6QghA$T(XG7pCLI!BEX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMh2^?5LcK`qY8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0dz@3K~y-)m69=Q!ax+qe>SD!)=J^PvEY!wsT~gDRCLMM z;pn#z#LZE%3VwpF<%TX9BTfn2P$!2B0mp(+v}+4u2a}LWQt-bdk9+Uk`~U9Ml3wdT zs^!-Y_t#gP6JG-O?g#+uWx~1fMb^z2Ls7;U2CE(I`A6wlrrPVn?P2r12OzThJgpaO zzV}3SA14lo>^@p+W}TZn$BBcy!DZ2tSTA_Hd&Jv@M1ZJU03^K@?fC})$_7_7su_6O zFiqAt>8-vyLN$+LYps#fX*q+)?gKDQ6SDD*F=(xi6DY-SI4oySEIO4^3MUQ_b&Kcs z&zwoEY7a8cS+Tbb88^GRjilFN`So*b;Jc&zY07TTY*{Z82CE%PDWsHt8AvH{;((;r zDlIO)y_B+=!CEX>4Tx04R}tkv&MmKpe$iQ%j{(9PA+CkfAzRC@LaOT7@E12(?114kp)6Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi4rtTK|Hl- z>74h8BdjdviO-4047wokBi9v|-#C{X7Imu4RCM> zjFu>S-Q(T8-M#&LrrqBU*0XZY1rG|v00006VoOIv0RI30001*5eDeSR010qNS#tmY z3ljhU3ljkVnw%H_000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{003-BL_t(I%VS^|1%n*?zrpbTe?P;2@(uVu{r~^}|H(I? zCdux(t` literal 0 HcmV?d00001 diff --git a/community/textures/torch_top.png b/community/textures/torch_top.png new file mode 100644 index 0000000000000000000000000000000000000000..8d66d02feaf300bda3daf25124a684a4aeec93c0 GIT binary patch literal 589 zcmV-T0EX>4Tx04R}tkv&MmKpe$iQ%j{(9PA+CkfAzRC@LaOT7@E12(?114kp)6Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi4rtTK|Hl- z>74h8BdjdviO-4047wokBi9v|-#C{X7Imu4RCM> zjFu>S-Q(T8-M#&LrrqBU*0XZY1rG|v00006VoOIv0RI30001*5eDeSR010qNS#tmY z3ljhU3ljkVnw%H_000McNliruX1b02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{001RPL_t(I%VS^|1;ZWuzrpbTe?P;2@(uVu{r~^}|NoB$ b<*)|;4IvElCp5KD00000NkvXXu0mjfH7xe{ literal 0 HcmV?d00001 diff --git a/community/textures/unknown.png b/community/textures/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba274d99e19cd481cea636d29f89a4c8b58e3ac GIT binary patch literal 5519 zcmeHKdpJ~U7azrlbfFs}W2BUC?lb0+$!)|ax1o@3duH}9nwyznMktqVY9dY)T^vQ6 zPIQse{cfaCgN{z2R79!JAv!1d_Ds4x-}$HK`ObgMJbPyE^{(|>YyH-G-~GO60e)T+ zj4h2}FxUj9H-iQJPu5=J;LxwlpCbSaX5hUpI8@F86bOk_%;O6{ggj0HB0wdd2ZJde zyb1}IwmX@;@0=&qPtiB(r6ertfK%7!P2yLTzsa;F|#pjW7)gi z1@T3yK&5l_yRMq>L@Ip$B}>{YT)BMnwTWG&XWG{uN%b#_e=|L#GcNvlXGTKRN{KosHLbmo z^{&Xrv3GjFH3MbdZTI^RuO_6|*)6iM%D>-KaPwet+~lXKRYTDktGaC8bqzPUn5h5$ z0B>6C|Jbvq2W**{(SPD({9A`Yi(iVL8vTyTORvAjy`F3L*6PmTveKibb8;+72bNdP z8!}LV`;Cep2pmfqRi)J>V{9|WZcE)`30mI0cagPe`%BuJ23qI*fP9+4^qWgvaGi0M zmVU4ee;V_GC2EgXqScY5dz+-$Q!j`&=BBSv^;RY3MLbsAwlUd(lWnekVeL57!JB?< zM_S7T_Hinf4)?V(A3ZvR{@5)zy*2mS$(wb9}?2 z&ITD~(*`x1-DUIvXV;3yh8fr=I}7Y~BpiwjNZkIwQR?EgV`7v@uVVsQdI(-o4W{s@ zMpFogXM2*)EYWw3B;(3`YDLJ9og{doVVJ4a1(PZJ7EQq+s`sxjmvaVPU$1O2>E11o z9jneYYE>X2=EyPC!&{pdlvLa|dEqVq3&PwgW<&8066n9H3ce3DUonY`e)<0%(m zsXechR90c&)Z}qBM5#-c2#(c-wfn!0<8^yOWH`MIp(lYzD z2G_AC9om+x%CUB8(;JW#g&i32IO^7uUeRM)5Sd?`I?Qx_TyHk%X?LJQ=#-wc%L(Mw ziG9BlWM|(#39H%iGBeRyvGV4Y{?y8hJ-ziOOwyNB&9Fx2v*{Y*gCNSxhJnlxRAJPl zZcY68)Bf+B9tD8+hV#i&{WL8qPf5sG*OK1GmE{G!>cPnFf*>!wdiSRcL!t^8ypVNj zK?1vHGQnI8AUf;mZNUAB$iFkkhIoMb#>OW&hSq{PaK`ZKo< zxGX*KAdD!!JU-7Tkd__0{;)p1t~1KL>XO5ybt8{7b4?zvKE~v%{Q$2$IBvC>;V;`@ zFujd@503z*hsUQi6z>bP*e=Q?aAeBaKR|0s<5Jd3iR$X=R@zfP~Rmqj#!8W zxMDVlRthE1I}iqQc2PgJq+BkcVK54X0<9pR#nK22j!LCsuy_m}kAgH% zvN(|(P@+UKJ1xXV3uUo1jsF#)zXMovc}p>f2g_=FN)-_P(O*(eJT9~dPd z!QjwXj8KUA+CnDxjDI7Z3=J!3(U-0o`#F6XnoBt|OGrNiZ5 zKmjO(RArD?+&3=0n7#p@EwmIw@P!hc6-4$onsPqx3t8X9rXA6x^K~GQ`Dfg3v_Ivp zQ--vBeQ69aCq^3{lR-yn{nNN&4xdZY-2wy(i2wj36p73OQA8@1fT9pU5(?mwus9-x ziX-3%UqLZNGC3gPfLbUB9Lr6c>WxlG!*S0gFT7cpNT@2sq(UYyy#l!gKH(kPVQXI8JyS6qiF= zB$f&RsGNKu5CLK&q6po9mT;O|0F#cyqp@Ek0RlkIgAC}%r6Ruai#(Vw1cT&&mQ0)z zo_%D7&OYtvyfS`Xk`7VBc z(Dj3^?_%J)lz(*B54ygKf$viO(Ov&Hx{SXZcR&%e2~t3ZnYk59KR^c|ID4@d12&@l z{(Q0cCrDx>@eY&0U}!t-rKc=%iG_rQa;C4RVTYly>Da09jVvojWFhwqm3xSV+FdhD zx0?gG2nAmriO}xmLXs!WfRuWe47XrPO#5nI=#qu_aOILhooH$)}@chZ9xU}kl4MT>B bGi&w!3XglEuh5=8VKAnrAEV5DP0D`($?JZ# literal 0 HcmV?d00001 diff --git a/community/textures/violet_cloth.png b/community/textures/violet_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..30374ae34e55b076f0d715aece6a9f5f60a80d69 GIT binary patch literal 1264 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 literal 0 HcmV?d00001 diff --git a/community/textures/wooden_door.png b/community/textures/wooden_door.png new file mode 100644 index 0000000000000000000000000000000000000000..9d21e8903987d6baa53fab27dff237d0cd2f32ae GIT binary patch literal 1132 zcmV-y1e5!TP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQMrHLbK0egFUf8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0!2wgK~y-)ZIZih(@+$Lzu1oBx=oX)c~p&HVPk+5Rbpgd z?2Pymm{<{FW@139Iv~cboseK)K@3cQRDnuFXj0NN&ckt?IQF%#&0rcDnzJ0;-?{fZ zzI!qUyE}>SJuaJWm;fX)A`Hd+{J$N2ZJ_~ln+|a->5n}sMH3hyq`dM#S5<_R=&FjM zsI(fxGyy>G?0mr+no6O(iaVOk6U^e6uIqF2Ms==fgJX-1zfzRqOqvr#JnV4c|fKC;m4 z&Vb&?r8oHdl|Op(WVN!%&`u#X+hZb`z+sP#qJgFp2f++K6aXl?VWO)lhNdoswal{FEV`QB&%Aze zH~HQeplJ$Qn|UJfZv!=5<@C&DYcoIBF5;)wgjVM~Wl(q0N*9EKU`8&tLJ-U-Oa*I2 zW1+g;cd1tkBzAz7$Ou0aG}~jG!DOM;TtO#r1jn`ofFGsROO;gsWD=ugR1G7mQ(DQA zE2P_KWK&EX>4Tx04R}tkv&MmKpe$iQ>9WW4i*t{$WWauh)QwPDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;>4zH zaNZ}5va+lapA(OnbV1@rt}7nDaW1(m@XV;0&CC%;iN#U}D;>Ej=A{Svtpa#g^{ zF^>&skX=9cAN=mtDo###Ns%Pb{o*(uBS2^uXx1I)``B@sCqVESxYFDHjRr9NNqW7l z#g2f!ZQ$a%ttorJh;#z$LRx*rLNL9z`-Ff zTB7VVpLh3k_V(|YR)0UF=W@H&5}cg?000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQKC2xJ+RYybcN8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0@+DKK~y-)J(Ejs8&v>>zq$9$of*%Jow4J@&V#mYQmIG< zi8Tv;C2RI2tF<7@DwGm* z6HOdRZto0ALO0R4uEXh@l)#q^20j3jiJ`14s+(wB<#0TTQ3@7|HDzUK1p=qll^k=hq*{3@Xv->qcAd$kMSX=Jz4LdtNYW#MAt0n(gIUT1cxgm007@ucI>7XP;q2laq2EhK% z!&MHd-Bwif2Iwk>FJC2SE%@!vN7BcVpFb%_4eiqQ^V!;66fb1KDT9Q zNfHlFJEU37dR<|P&6IE6uXy$(B#tD$ub4~?QabdvJ$z50qDW({W%kif6g9&^fGHZJ zaOftQqfx|SvF7&900o_ni|+~UJ}k-d2KD;)e`vK7&z^)V(lz7rj3^ZB4O=KBxVXw$ qmkr%S6NWD5mzzwU9{TJJCI14D`bo$BDI)&>0000@B literal 0 HcmV?d00001 diff --git a/community/textures/yellow_flower.png b/community/textures/yellow_flower.png new file mode 100644 index 0000000000000000000000000000000000000000..6f35174d4b0b3fe60e0445a16274d058346b7d57 GIT binary patch literal 694 zcmV;n0!jUeP)EX>4Tx04R}tkv&MmKpe$iQ>9WW4i+imkfAzR5EXIMDionYs1;guFuC*#ni!H4 z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIN3n$;;BvB z;Ji;9Wo204LKlt6PRh$_2k|If<`^9lShJny7(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9 ziyr}f+rY(jTT}Lc%N-#0WXPuMNh;#z$LRx*rLNL9z`-Ff zQljiNpLh3k_V(|YR)0TQ1#+Eku*4()000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rg2MQJ*B2G%Z8~^|S8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0FOyTK~y-)V_+BsqW}jubD8P?$Dd6985kHCKK^9-zikgA zoR1EeunC&z{$sp-3t|uh0|Ud2>;D<}+5a&TZNSH$O#fBY7#Lo?{Le6V)<3wbNcM_Y zJHvmmb_To}nFty3>kh;qfn@9kVfB|lGQ)p16@&o{3=9k(<}wf;1|Q}!Fv2wA(~Q>( c_%tB{0EDhJ&^+$p^#A|>07*qoM6N<$f}_JB-v9sr literal 0 HcmV?d00001 diff --git a/community/vert.glsl b/community/vert.glsl new file mode 100644 index 00000000..4aa417bb --- /dev/null +++ b/community/vert.glsl @@ -0,0 +1,26 @@ +#version 330 + +layout(location = 0) in vec3 a_Position; +layout(location = 1) in vec2 a_TextureFetcher; +layout(location = 2) in float a_LightMultiplier; + + +out vec3 v_Position; +out vec3 v_TexCoords; +out float v_LightMultiplier; + +uniform mat4 u_ModelViewProjMatrix; + +const vec2 texture_UV[4] = const vec2[4]( + vec2(0.0, 1.0), + vec2(0.0, 0.0), + vec2(1.0, 0.0), + vec2(1.0, 1.0) +); + +void main(void) { + v_Position = a_Position; + v_TexCoords = vec3(texture_UV[int(a_TextureFetcher[0])], a_TextureFetcher[1]); + v_LightMultiplier = a_LightMultiplier; + gl_Position = u_ModelViewProjMatrix * vec4(a_Position, 1.0); +} \ No newline at end of file diff --git a/community/vscode_mcpy_extension/language-configuration.json b/community/vscode_mcpy_extension/language-configuration.json new file mode 100644 index 00000000..6bd45cbc --- /dev/null +++ b/community/vscode_mcpy_extension/language-configuration.json @@ -0,0 +1,33 @@ +{ + "comments": { + "lineComment": "#" + }, + "brackets": [ + [ + "[", + "]" + ], + ], + "autoClosingPairs": [ + { + "open": "\"", + "close": "\"", + "notIn": ["string"] + }, + { + "open": "[", + "close": "]", + "notIn": ["comment"] + }, + ], + "surroundingPairs": [ + [ + "\"", + "\"" + ], + [ + "[", + "]" + ], + ] +} \ No newline at end of file diff --git a/community/vscode_mcpy_extension/package.json b/community/vscode_mcpy_extension/package.json new file mode 100644 index 00000000..443213de --- /dev/null +++ b/community/vscode_mcpy_extension/package.json @@ -0,0 +1,36 @@ +{ + "name": "mcpy", + "displayName": "MCPY", + "description": "Syntax highlighting for MCPY data files", + "categories": [ + "Programming Languages" + ], + "publisher": "obiwac", + "author": { + "name": "obiwac" + }, + "homepage": "https://github.com/obiwac/python-minecraft-clone", + "version": "0.0.1", + "engines": { + "vscode": "^1.22.0" + }, + "contributes": { + "languages": [{ + "id": "mcpy_blocks", + "aliases": [ + "MCPY Blocks" + ], + "filenames": [ + "blocks.mcpy" + ], + "configuration": "./language-configuration.json" + }], + "grammars": [ + { + "language": "mcpy_blocks", + "scopeName": "source.mcpy_blocks", + "path": "./syntaxes/mcpy_blocks.tmLanguage.json" + } + ] + } +} \ No newline at end of file diff --git a/community/vscode_mcpy_extension/syntaxes/mcpy_blocks.tmLanguage.json b/community/vscode_mcpy_extension/syntaxes/mcpy_blocks.tmLanguage.json new file mode 100644 index 00000000..0e382d2d --- /dev/null +++ b/community/vscode_mcpy_extension/syntaxes/mcpy_blocks.tmLanguage.json @@ -0,0 +1,36 @@ +{ + "name": "mcpy_blocks", + "scopeName": "source.mcpy_blocks", + "patterns": [ + { + "name": "keyword.control.mcpy_blocks", + "match": "\\b(name|texture|model)\\b" + }, + { + "name": "keyword.operator.mcpy_blocks", + "match": "\\b(sameas)\\b" + }, + { + "name": "constant.language.mcpy_blocks", + "match": "\\b(all|sides|x|y|z|top|bottom|front|back|left|right)\\b" + }, + { + "name": "constant.numeric.mcpy_blocks", + "match": "\\b[0-9]+\\b" + }, + { + "name": "comment.line.mcpy_blocks", + "begin": "#", + "end": "$" + }, + { + "name": "string.quoted.double.mcpy_blocks", + "begin": "\"", + "end": "\"", + "patterns": [{ + "name": "constant.character.escape.mcpy_blocks", + "match": "\\\\." + }] + } + ] +} \ No newline at end of file diff --git a/community/world.py b/community/world.py new file mode 100644 index 00000000..4e59316b --- /dev/null +++ b/community/world.py @@ -0,0 +1,248 @@ +import chunk +import ctypes +import math + + +import pyglet.gl as gl + +import block_type +import models +import save +import texture_manager +import options +# import custom block models + + +class World: + def __init__(self, camera): + self.camera = camera + self.texture_manager = texture_manager.Texture_manager(16, 16, 256) + self.block_types = [None] + + # parse block type data file + + blocks_data_file = open("data/blocks.mcpy") + blocks_data = blocks_data_file.readlines() + blocks_data_file.close() + + for block in blocks_data: + if block[0] in ['\n', '#']: # skip if empty line or comment + continue + + number, props = block.split(':', 1) + number = int(number) + + # default block + + name = "Unknown" + model = models.cube + texture = {"all": "unknown"} + + # read properties + + for prop in props.split(','): + prop = prop.strip() + prop = list(filter(None, prop.split(' ', 1))) + + if prop[0] == "sameas": + sameas_number = int(prop[1]) + + name = self.block_types[sameas_number].name + texture = self.block_types[sameas_number].block_face_textures + model = self.block_types[sameas_number].model + + elif prop[0] == "name": + name = eval(prop[1]) + + elif prop[0][:7] == "texture": + _, side = prop[0].split('.') + texture[side] = prop[1].strip() + + elif prop[0] == "model": + model = eval(prop[1]) + + # add block type + + _block_type = block_type.Block_type(self.texture_manager, name, texture, model) + + if number < len(self.block_types): + self.block_types[number] = _block_type + + else: + self.block_types.append(_block_type) + + self.texture_manager.generate_mipmaps() + + chunk_indices = [] + + for nquad in range(chunk.CHUNK_WIDTH * chunk.CHUNK_HEIGHT * chunk.CHUNK_LENGTH * 8): + chunk_indices.append(4 * nquad + 0) + chunk_indices.append(4 * nquad + 1) + chunk_indices.append(4 * nquad + 2) + chunk_indices.append(4 * nquad + 0) + chunk_indices.append(4 * nquad + 2) + chunk_indices.append(4 * nquad + 3) + + print(len(chunk_indices)) + + self.ibo = gl.GLuint(0) + gl.glGenBuffers(1, ctypes.byref(self.ibo)) + gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo) + gl.glBufferData( + gl.GL_ELEMENT_ARRAY_BUFFER, + ctypes.sizeof(gl.GLuint * len(chunk_indices)), + (gl.GLuint * len(chunk_indices))(*chunk_indices), + gl.GL_STATIC_DRAW) + gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0) + + + + # load the world + + self.save = save.Save(self) + + self.chunks = {} + self.save.load() + + for chunk_position in self.chunks: + self.chunks[chunk_position].update_subchunk_meshes() + self.chunks[chunk_position].update_mesh() + + del chunk_indices + + def __del__(self): + gl.glDeleteBuffers(1, ctypes.byref(self.ibo)) + + def get_chunk_position(self, position): + x, y, z = position + + return ( + (x // chunk.CHUNK_WIDTH), + (y // chunk.CHUNK_HEIGHT), + (z // chunk.CHUNK_LENGTH)) + + def get_local_position(self, position): + x, y, z = position + + return ( + int(x % chunk.CHUNK_WIDTH), + int(y % chunk.CHUNK_HEIGHT), + int(z % chunk.CHUNK_LENGTH)) + + def get_block_number(self, position): + x, y, z = position + chunk_position = self.get_chunk_position(position) + + if not chunk_position in self.chunks: + return 0 + + lx, ly, lz = self.get_local_position(position) + + block_number = self.chunks[chunk_position].blocks[lx][ly][lz] + return block_number + + def is_opaque_block(self, position): + # get block type and check if it's opaque or not + # air counts as a transparent block, so test for that too + + block_type = self.block_types[self.get_block_number(position)] + + if not block_type: + return False + + return not block_type.transparent + + def set_block(self, position, number): # set number to 0 (air) to remove block + x, y, z = position + chunk_position = self.get_chunk_position(position) + + if not chunk_position in self.chunks: # if no chunks exist at this position, create a new one + if number == 0: + return # no point in creating a whole new chunk if we're not gonna be adding anything + + self.chunks[chunk_position] = chunk.Chunk(self, chunk_position) + + if self.get_block_number(position) == number: # no point updating mesh if the block is the same + return + + lx, ly, lz = self.get_local_position(position) + + self.chunks[chunk_position].blocks[lx][ly][lz] = number + self.chunks[chunk_position].modified = True + + self.chunks[chunk_position].update_at_position((x, y, z)) + self.chunks[chunk_position].update_mesh() + + cx, cy, cz = chunk_position + + def try_update_chunk_at_position(chunk_position, position): + if chunk_position in self.chunks: + self.chunks[chunk_position].update_at_position(position) + self.chunks[chunk_position].update_mesh() + + if lx == chunk.CHUNK_WIDTH - 1: try_update_chunk_at_position((cx + 1, cy, cz), (x + 1, y, z)) + if lx == 0: try_update_chunk_at_position((cx - 1, cy, cz), (x - 1, y, z)) + + if ly == chunk.CHUNK_HEIGHT - 1: try_update_chunk_at_position((cx, cy + 1, cz), (x, y + 1, z)) + if ly == 0: try_update_chunk_at_position((cx, cy - 1, cz), (x, y - 1, z)) + + if lz == chunk.CHUNK_LENGTH - 1: try_update_chunk_at_position((cx, cy, cz + 1), (x, y, z + 1)) + if lz == 0: try_update_chunk_at_position((cx, cy, cz - 1), (x, y, z - 1)) + + def can_render_chunk(self, chunk_position, pl_c_pos): + rx, ry, rz = (chunk_position[0] - pl_c_pos[0]) \ + * math.cos(self.camera.rotation[0]) \ + * math.cos(self.camera.rotation[1]) , \ + (chunk_position[1] - pl_c_pos[1]) \ + * math.sin(self.camera.rotation[1]) , \ + (chunk_position[2] - pl_c_pos[2]) \ + * math.sin(self.camera.rotation[0]) \ + * math.cos(self.camera.rotation[1]) + return rx >= -1 and ry >= -1 and rz >= -1 + + def draw_translucent_fast(self, player_chunk_pos): + gl.glDisable(gl.GL_CULL_FACE) + gl.glEnable(gl.GL_BLEND) + gl.glDepthMask(gl.GL_FALSE) + + for chunk_position in self.chunks: + if self.can_render_chunk(chunk_position, player_chunk_pos): + self.chunks[chunk_position].draw_translucent() + + gl.glDepthMask(gl.GL_TRUE) + gl.glDisable(gl.GL_BLEND) + gl.glEnable(gl.GL_CULL_FACE) + + def draw_translucent_fancy(self, player_chunk_pos): + gl.glDepthMask(gl.GL_FALSE) + gl.glFrontFace(gl.GL_CW) + gl.glEnable(gl.GL_BLEND) + + for chunk_position in self.chunks: + if self.can_render_chunk(chunk_position, player_chunk_pos): + self.chunks[chunk_position].draw_translucent() + + gl.glFrontFace(gl.GL_CCW) + gl.glEnable(gl.GL_BLEND) + + for chunk_position in self.chunks: + if self.can_render_chunk(chunk_position, player_chunk_pos): + self.chunks[chunk_position].draw_translucent() + + gl.glDisable(gl.GL_BLEND) + gl.glDepthMask(gl.GL_TRUE) + + draw_translucent = draw_translucent_fancy if options.TRANSLUCENT_BLENDING else draw_translucent_fast + + def draw(self): + player_floored_pos = tuple(self.camera.position) + player_chunk_pos = self.get_chunk_position(player_floored_pos) + + for chunk_position in self.chunks: + if self.can_render_chunk(chunk_position, player_chunk_pos): + self.chunks[chunk_position].draw() + + self.draw_translucent(player_chunk_pos) + + + \ No newline at end of file diff --git a/episode-11/block_type.py b/episode-11/block_type.py index e39015b2..f010fc2b 100644 --- a/episode-11/block_type.py +++ b/episode-11/block_type.py @@ -12,20 +12,22 @@ def __init__(self, texture_manager, name = "unknown", block_face_textures = {"al self.transparent = model.transparent self.is_cube = model.is_cube self.glass = model.glass - self.translucent = model.translucent # replace data contained in numbers.py with model specific data self.vertex_positions = model.vertex_positions - self.tex_coords = model.tex_coords # to deprecate - self.tex_indices = [0] * len(self.tex_coords) + self.tex_coords = model.tex_coords.copy() self.shading_values = model.shading_values def set_block_face(face, texture): - # make sure we don't add inexistent face + # make sure we don't add inexistent faces if face > len(self.tex_coords) - 1: return - self.tex_indices[face] = texture + + self.tex_coords[face] = self.tex_coords[face].copy() + + for vertex in range(4): + self.tex_coords[face][vertex * 3 + 2] = texture for face in block_face_textures: texture = block_face_textures[face] diff --git a/episode-11/camera.py b/episode-11/camera.py index 2dfb5d56..2e7ba4c3 100644 --- a/episode-11/camera.py +++ b/episode-11/camera.py @@ -13,12 +13,11 @@ def __init__(self, shader, width, height): self.mv_matrix = matrix.Matrix() self.p_matrix = matrix.Matrix() - self.mvp_matrix = matrix.Matrix() # shaders self.shader = shader - self.shader_matrix_location = self.shader.find_uniform(b"u_ModelViewProjMatrix") + self.shader_matrix_location = self.shader.find_uniform(b"matrix") # camera variables @@ -59,5 +58,5 @@ def update_matrices(self): # modelviewprojection matrix - self.mvp_matrix = self.p_matrix * self.mv_matrix - self.shader.uniform_matrix(self.shader_matrix_location, self.mvp_matrix) \ No newline at end of file + mvp_matrix = self.p_matrix * self.mv_matrix + self.shader.uniform_matrix(self.shader_matrix_location, mvp_matrix) \ No newline at end of file diff --git a/episode-11/chunk.py b/episode-11/chunk.py index eedd8ede..7bb7fff3 100644 --- a/episode-11/chunk.py +++ b/episode-11/chunk.py @@ -1,4 +1,5 @@ import ctypes +import math import pyglet.gl as gl @@ -34,38 +35,30 @@ def __init__(self, world, chunk_position): # mesh variables - self.mesh = [] - self.translucent_mesh = [] + self.mesh_vertex_positions = [] + self.mesh_tex_coords = [] + self.mesh_shading_values = [] - self.mesh_quad_count = 0 - self.translucent_quad_count = 0 + self.mesh_index_counter = 0 + self.mesh_indices = [] # create VAO and VBO's self.vao = gl.GLuint(0) - gl.glGenVertexArrays(1, ctypes.byref(self.vao)) + gl.glGenVertexArrays(1, self.vao) gl.glBindVertexArray(self.vao) - self.vbo = gl.GLuint(0) - gl.glGenBuffers(1, ctypes.byref(self.vbo)) - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) - gl.glBufferData(gl.GL_ARRAY_BUFFER, ctypes.sizeof(gl.GLfloat * CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_LENGTH * 8), None, gl.GL_DYNAMIC_DRAW) + self.vertex_position_vbo = gl.GLuint(0) + gl.glGenBuffers(1, self.vertex_position_vbo) - gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, - gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 0) - gl.glEnableVertexAttribArray(0) - gl.glVertexAttribPointer(1, 2, gl.GL_FLOAT, - gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 3 * ctypes.sizeof(gl.GLfloat)) - gl.glEnableVertexAttribArray(1) - gl.glVertexAttribPointer(2, 1, gl.GL_FLOAT, - gl.GL_FALSE, 6 * ctypes.sizeof(gl.GLfloat), 5 * ctypes.sizeof(gl.GLfloat)) - gl.glEnableVertexAttribArray(2) + self.tex_coord_vbo = gl.GLuint(0) + gl.glGenBuffers(1, self.tex_coord_vbo) - gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, world.ibo) + self.shading_values_vbo = gl.GLuint(0) + gl.glGenBuffers(1, self.shading_values_vbo) - def __del__(self): - gl.glDeleteBuffers(1, ctypes.byref(self.vbo)) - gl.glDeleteVertexArrays(1, ctypes.byref(self.vao)) + self.ibo = gl.GLuint(0) + gl.glGenBuffers(1, self.ibo) def update_subchunk_meshes(self): for subchunk_position in self.subchunks: @@ -81,9 +74,9 @@ def update_at_position(self, position): clx, cly, clz = self.world.get_local_position(position) - sx = clx // subchunk.SUBCHUNK_WIDTH - sy = cly // subchunk.SUBCHUNK_HEIGHT - sz = clz // subchunk.SUBCHUNK_LENGTH + sx = math.floor(clx / subchunk.SUBCHUNK_WIDTH) + sy = math.floor(cly / subchunk.SUBCHUNK_HEIGHT) + sz = math.floor(clz / subchunk.SUBCHUNK_LENGTH) self.subchunks[(sx, sy, sz)].update_mesh() @@ -103,62 +96,88 @@ def try_update_subchunk_mesh(subchunk_position): def update_mesh(self): # combine all the small subchunk meshes into one big chunk mesh + self.mesh_vertex_positions = [] + self.mesh_tex_coords = [] + self.mesh_shading_values = [] + + self.mesh_index_counter = 0 + self.mesh_indices = [] + for subchunk_position in self.subchunks: subchunk = self.subchunks[subchunk_position] - self.mesh.extend(subchunk.mesh) - self.translucent_mesh.extend(subchunk.translucent_mesh) + self.mesh_vertex_positions.extend(subchunk.mesh_vertex_positions) + self.mesh_tex_coords.extend(subchunk.mesh_tex_coords) + self.mesh_shading_values.extend(subchunk.mesh_shading_values) + + mesh_indices = [index + self.mesh_index_counter for index in subchunk.mesh_indices] + + self.mesh_indices.extend(mesh_indices) + self.mesh_index_counter += subchunk.mesh_index_counter # send the full mesh data to the GPU and free the memory used client-side (we don't need it anymore) # don't forget to save the length of 'self.mesh_indices' before freeing - self.mesh_quad_count = len(self.mesh) // 24 - self.translucent_quad_count = len(self.translucent_mesh) // 24 - + self.mesh_indices_length = len(self.mesh_indices) self.send_mesh_data_to_gpu() - - self.mesh = [] - self.translucent_mesh = [] + + del self.mesh_vertex_positions + del self.mesh_tex_coords + del self.mesh_shading_values + + del self.mesh_indices def send_mesh_data_to_gpu(self): # pass mesh data to gpu - if not self.mesh_quad_count: + if not self.mesh_index_counter: return - self.mesh.extend(self.translucent_mesh) - gl.glBindVertexArray(self.vao) - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbo) - gl.glBufferSubData( + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vertex_position_vbo) + gl.glBufferData( gl.GL_ARRAY_BUFFER, - 0, - ctypes.sizeof(gl.GLfloat * len(self.mesh)), - (gl.GLfloat * len(self.mesh)) (*self.mesh)) + ctypes.sizeof(gl.GLfloat * len(self.mesh_vertex_positions)), + (gl.GLfloat * len(self.mesh_vertex_positions)) (*self.mesh_vertex_positions), + gl.GL_STATIC_DRAW) + + gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, gl.GL_FALSE, 0, 0) + gl.glEnableVertexAttribArray(0) + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.tex_coord_vbo) + gl.glBufferData( + gl.GL_ARRAY_BUFFER, + ctypes.sizeof(gl.GLfloat * len(self.mesh_tex_coords)), + (gl.GLfloat * len(self.mesh_tex_coords)) (*self.mesh_tex_coords), + gl.GL_STATIC_DRAW) + + gl.glVertexAttribPointer(1, 3, gl.GL_FLOAT, gl.GL_FALSE, 0, 0) + gl.glEnableVertexAttribArray(1) - def draw(self): - if not self.mesh_quad_count: - return + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.shading_values_vbo) + gl.glBufferData( + gl.GL_ARRAY_BUFFER, + ctypes.sizeof(gl.GLfloat * len(self.mesh_shading_values)), + (gl.GLfloat * len(self.mesh_shading_values)) (*self.mesh_shading_values), + gl.GL_STATIC_DRAW) - gl.glBindVertexArray(self.vao) + gl.glVertexAttribPointer(2, 1, gl.GL_FLOAT, gl.GL_FALSE, 0, 0) + gl.glEnableVertexAttribArray(2) - gl.glDrawElementsBaseVertex( - gl.GL_TRIANGLES, - self.mesh_quad_count * 6, - gl.GL_UNSIGNED_INT, - None, - 0) + gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo) + gl.glBufferData( + gl.GL_ELEMENT_ARRAY_BUFFER, + ctypes.sizeof(gl.GLuint * self.mesh_indices_length), + (gl.GLuint * self.mesh_indices_length) (*self.mesh_indices), + gl.GL_STATIC_DRAW) - def draw_translucent(self): - if not self.translucent_quad_count: + def draw(self): + if not self.mesh_index_counter: return gl.glBindVertexArray(self.vao) - gl.glDrawElementsBaseVertex( + gl.glDrawElements( gl.GL_TRIANGLES, - self.translucent_quad_count * 6, + self.mesh_indices_length, gl.GL_UNSIGNED_INT, - None, - self.mesh_quad_count * 4 - ) \ No newline at end of file + None) \ No newline at end of file diff --git a/episode-11/frag.glsl b/episode-11/frag.glsl index 25c93cce..46c3d2a2 100644 --- a/episode-11/frag.glsl +++ b/episode-11/frag.glsl @@ -1,17 +1,18 @@ #version 330 -out vec4 fragColor; +out vec4 fragment_colour; -uniform sampler2DArray u_TextureArraySampler; +uniform sampler2DArray texture_array_sampler; -in vec3 v_Position; -in vec3 v_TexCoords; -in float v_LightMultiplier; +in vec3 local_position; +in vec3 interpolated_tex_coords; +in float interpolated_shading_value; void main(void) { - vec4 textureColor = texture(u_TextureArraySampler, v_TexCoords); - if (textureColor.a < 0.5) { // discard if texel's alpha component is 0 (texel is transparent) + vec4 texture_colour = texture(texture_array_sampler, interpolated_tex_coords); + fragment_colour = texture_colour * interpolated_shading_value; + + if (texture_colour.a == 0.0) { // discard if texel's alpha component is 0 (texel is transparent) discard; } - fragColor = textureColor * v_LightMultiplier; } \ No newline at end of file diff --git a/episode-11/main.py b/episode-11/main.py index 7bd61916..de946428 100644 --- a/episode-11/main.py +++ b/episode-11/main.py @@ -1,5 +1,6 @@ import math +import ctypes import random import pyglet @@ -8,10 +9,10 @@ import pyglet.gl as gl +import matrix import shader import camera - import block_type import texture_manager @@ -22,48 +23,32 @@ class Window(pyglet.window.Window): def __init__(self, **args): super().__init__(**args) + + # create world + + self.world = world.World() # create shader self.shader = shader.Shader("vert.glsl", "frag.glsl") - self.shader_sampler_location = self.shader.find_uniform(b"u_TextureArraySampler") + self.shader_sampler_location = self.shader.find_uniform(b"texture_array_sampler") self.shader.use() # pyglet stuff - pyglet.clock.schedule(self.update) + pyglet.clock.schedule_interval(self.update, 1.0 / 10000) self.mouse_captured = False # camera stuff self.camera = camera.Camera(self.shader, self.width, self.height) - # create world - - self.world = world.World(self.camera) - # misc stuff self.holding = 5 - - # bind textures - - gl.glActiveTexture(gl.GL_TEXTURE0) - gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.world.texture_manager.texture_array) - gl.glUniform1i(self.shader_sampler_location, 0) - - # enable cool stuff - - gl.glEnable(gl.GL_DEPTH_TEST) - gl.glEnable(gl.GL_CULL_FACE) - gl.glBlendFunc(gl.GL_SRC_COLOR, gl.GL_ONE_MINUS_SRC_COLOR) - - # Sync status: - self.status = gl.GL_CONDITION_SATISFIED - self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) def update(self, delta_time): - # print(pyglet.clock.get_fps()) + # print(f"FPS: {1.0 / delta_time}") if not self.mouse_captured: self.camera.input = [0, 0, 0] @@ -73,17 +58,22 @@ def update(self, delta_time): def on_draw(self): self.camera.update_matrices() - self.status = gl.glClientWaitSync(self.fence, gl.GL_SYNC_FLUSH_COMMANDS_BIT, 2985984) - gl.glDeleteSync(self.fence) + # bind textures + + gl.glActiveTexture(gl.GL_TEXTURE0) + gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.world.texture_manager.texture_array) + gl.glUniform1i(self.shader_sampler_location, 0) + + # draw stuff + + gl.glEnable(gl.GL_DEPTH_TEST) + gl.glEnable(gl.GL_CULL_FACE) gl.glClearColor(0.0, 0.0, 0.0, 0.0) self.clear() - self.world.draw() - self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) - gl.glFlush() - + gl.glFinish() # input functions @@ -164,12 +154,10 @@ def on_key_release(self, key, modifiers): class Game: def __init__(self): - self.config = gl.Config(double_buffer = True, - major_version = 3, minor_version = 3, - depth_size = 16) - self.window = Window(config = self.config, width = 854, height = 480, caption = "Minecraft clone", resizable = True, vsync = False) + self.config = gl.Config(major_version = 3, depth_size = 16) + self.window = Window(config = self.config, width = 800, height = 600, caption = "Minecraft clone", resizable = True, vsync = False) - def run(self): + def run(self): pyglet.app.run() if __name__ == "__main__": diff --git a/episode-11/matrix.py b/episode-11/matrix.py index 7210217a..f2a5c61c 100644 --- a/episode-11/matrix.py +++ b/episode-11/matrix.py @@ -1,5 +1,6 @@ import copy +import ctypes import math def copy_matrix(matrix): @@ -42,9 +43,9 @@ def __imul__(self, matrix): self.data = multiply_matrices(self.data, matrix.data) def scale(self, x, y, z): - for i in range(4): self.data[0][i] *= x - for i in range(4): self.data[1][i] *= y - for i in range(4): self.data[2][i] *= z + for i in range(4): self.data[0][i] *= scale_x + for i in range(4): self.data[1][i] *= scale_y + for i in range(4): self.data[2][i] *= scale_z def translate(self, x, y, z): for i in range(4): diff --git a/episode-11/models/button.py b/episode-11/models/button.py index cec02833..67502779 100644 --- a/episode-11/models/button.py +++ b/episode-11/models/button.py @@ -1,4 +1,3 @@ -translucent = False transparent = True is_cube = False glass = False diff --git a/episode-11/models/cactus.py b/episode-11/models/cactus.py index b049b4fb..8fb6e407 100644 --- a/episode-11/models/cactus.py +++ b/episode-11/models/cactus.py @@ -1,4 +1,3 @@ -translucent = False transparent = True is_cube = False glass = False diff --git a/episode-11/models/crop.py b/episode-11/models/crop.py index fd377819..73d699b5 100644 --- a/episode-11/models/crop.py +++ b/episode-11/models/crop.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.25, 0.4375, 0.50, 0.25, -0.5625, 0.50, 0.25, -0.5625, -0.50, 0.25, 0.4375, -0.50], # right diff --git a/episode-11/models/cube.py b/episode-11/models/cube.py index e80d6a75..89361993 100644 --- a/episode-11/models/cube.py +++ b/episode-11/models/cube.py @@ -1,7 +1,6 @@ transparent = False is_cube = True glass = False -translucent = False vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right @@ -12,7 +11,6 @@ [ 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5], # back ] -# Deprecating tex_coords = [ [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], diff --git a/episode-11/models/door.py b/episode-11/models/door.py index 184033fc..89361993 100644 --- a/episode-11/models/door.py +++ b/episode-11/models/door.py @@ -1,7 +1,6 @@ transparent = False is_cube = True glass = False -translucent = False vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right diff --git a/episode-11/models/fire.py b/episode-11/models/fire.py index a80d50c2..39a7d923 100644 --- a/episode-11/models/fire.py +++ b/episode-11/models/fire.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/flat.py b/episode-11/models/flat.py index d25ecd9f..9addf96d 100644 --- a/episode-11/models/flat.py +++ b/episode-11/models/flat.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top diff --git a/episode-11/models/glass.py b/episode-11/models/glass.py index 9c0f6df6..2f54df74 100644 --- a/episode-11/models/glass.py +++ b/episode-11/models/glass.py @@ -1,7 +1,6 @@ transparent = True is_cube = True glass = True -translucent = False vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right diff --git a/episode-11/models/ladder.py b/episode-11/models/ladder.py index a80d50c2..39a7d923 100644 --- a/episode-11/models/ladder.py +++ b/episode-11/models/ladder.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/leaves.py b/episode-11/models/leaves.py index dfc86c88..9c10ec46 100644 --- a/episode-11/models/leaves.py +++ b/episode-11/models/leaves.py @@ -1,7 +1,6 @@ transparent = True is_cube = True glass = False -translucent = False vertex_positions = [ [ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5], # right diff --git a/episode-11/models/lever.py b/episode-11/models/lever.py index 66257452..67502779 100644 --- a/episode-11/models/lever.py +++ b/episode-11/models/lever.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right diff --git a/episode-11/models/liquid.py b/episode-11/models/liquid.py index b4ff32d2..948ce298 100644 --- a/episode-11/models/liquid.py +++ b/episode-11/models/liquid.py @@ -1,7 +1,6 @@ # in the end, it'd be nice to have it so that liquids fill up the whole block when they have a block above them # this would avoid the problems this solution has -translucent = True transparent = True is_cube = True glass = True diff --git a/episode-11/models/plant.py b/episode-11/models/plant.py index a80d50c2..39a7d923 100644 --- a/episode-11/models/plant.py +++ b/episode-11/models/plant.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/pressure_plate.py b/episode-11/models/pressure_plate.py index d25ecd9f..9addf96d 100644 --- a/episode-11/models/pressure_plate.py +++ b/episode-11/models/pressure_plate.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top diff --git a/episode-11/models/sign.py b/episode-11/models/sign.py index a80d50c2..39a7d923 100644 --- a/episode-11/models/sign.py +++ b/episode-11/models/sign.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/sign_post.py b/episode-11/models/sign_post.py index a80d50c2..39a7d923 100644 --- a/episode-11/models/sign_post.py +++ b/episode-11/models/sign_post.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [-0.3536, 0.5000, 0.3536, -0.3536, -0.5000, 0.3536, 0.3536, -0.5000, -0.3536, 0.3536, 0.5000, -0.3536], diff --git a/episode-11/models/slab.py b/episode-11/models/slab.py index 66257452..67502779 100644 --- a/episode-11/models/slab.py +++ b/episode-11/models/slab.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right diff --git a/episode-11/models/snow.py b/episode-11/models/snow.py index d25ecd9f..9addf96d 100644 --- a/episode-11/models/snow.py +++ b/episode-11/models/snow.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.5, -0.4375, 0.5, 0.5, -0.4375, -0.5, -0.5, -0.4375, -0.5, -0.5, -0.4375, 0.5], # top diff --git a/episode-11/models/soil.py b/episode-11/models/soil.py index af5bb98a..301b5b71 100644 --- a/episode-11/models/soil.py +++ b/episode-11/models/soil.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.5, 0.4375, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.4375, -0.5], # right diff --git a/episode-11/models/stairs.py b/episode-11/models/stairs.py index 66257452..67502779 100644 --- a/episode-11/models/stairs.py +++ b/episode-11/models/stairs.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.5, 0.0, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.0, -0.5], # right diff --git a/episode-11/models/torch.py b/episode-11/models/torch.py index 75239771..9224655c 100644 --- a/episode-11/models/torch.py +++ b/episode-11/models/torch.py @@ -1,7 +1,6 @@ transparent = True is_cube = False glass = False -translucent = False vertex_positions = [ [ 0.0625, 0.5, 0.5, 0.0625, -0.5, 0.5, 0.0625, -0.5, -0.5, 0.0625, 0.5, -0.5], # right diff --git a/episode-11/subchunk.py b/episode-11/subchunk.py index eb2e903f..839a77dd 100644 --- a/episode-11/subchunk.py +++ b/episode-11/subchunk.py @@ -1,6 +1,3 @@ -import options -import random - SUBCHUNK_WIDTH = 4 SUBCHUNK_HEIGHT = 4 SUBCHUNK_LENGTH = 4 @@ -24,42 +21,40 @@ def __init__(self, parent, subchunk_position): # mesh variables - self.mesh = [] - self.translucent_mesh = [] + self.mesh_vertex_positions = [] + self.mesh_tex_coords = [] + self.mesh_shading_values = [] + + self.mesh_index_counter = 0 + self.mesh_indices = [] - def add_face(self, face, pos, block_type): - rotation = 0 - if options.ALTERNATE_BLOCKS and block_type.is_cube and not block_type.transparent: - rotation = random.randint(0, 3) - x, y, z = pos - vertex_positions = block_type.vertex_positions[face] - tex_index = block_type.tex_indices[face] - shading_values = block_type.shading_values[face] - - if block_type.model.translucent: - mesh = self.translucent_mesh - else: - mesh = self.mesh - - for i in range(4): - mesh.append(vertex_positions[i * 3 + 0] + x) - mesh.append(vertex_positions[i * 3 + 1] + y) - mesh.append(vertex_positions[i * 3 + 2] + z) - - mesh.append((i + rotation) % 4) - mesh.append(tex_index) - - mesh.append(shading_values[i]) - - def can_render_face(self, block_type, block_number, position): - return not (self.world.is_opaque_block(position) - or (block_type.glass and self.world.get_block_number(position) == block_number)) \ - or (block_type.translucent and self.world.get_block_number(position) != block_number) + 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) - def update_mesh(self): - self.mesh = [] - self.translucent_mesh = [] + 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): @@ -73,24 +68,32 @@ def update_mesh(self): if block_number: block_type = self.world.block_types[block_number] - x, y, z = pos = ( + 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 is cube, we want it to check neighbouring blocks so that we don't uselessly render faces # if block isn't a cube, we just want to render all faces, regardless of neighbouring blocks # since the vast majority of blocks are probably anyway going to be cubes, this won't impact performance all that much; the amount of useless faces drawn is going to be minimal if block_type.is_cube: - if self.can_render_face(block_type, block_number, (x + 1, y, z)): self.add_face(0, pos, block_type) - if self.can_render_face(block_type, block_number, (x - 1, y, z)): self.add_face(1, pos, block_type) - if self.can_render_face(block_type, block_number, (x, y + 1, z)): self.add_face(2, pos, block_type) - if self.can_render_face(block_type, block_number, (x, y - 1, z)): self.add_face(3, pos, block_type) - if self.can_render_face(block_type, block_number, (x, y, z + 1)): self.add_face(4, pos, block_type) - if self.can_render_face(block_type, block_number, (x, y, z - 1)): self.add_face(5, pos, block_type) + 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)): - self.add_face(i, pos, block_type) \ No newline at end of file + add_face(i) \ No newline at end of file diff --git a/episode-11/texture_manager.py b/episode-11/texture_manager.py index 7d326dec..6cfc9fdf 100644 --- a/episode-11/texture_manager.py +++ b/episode-11/texture_manager.py @@ -1,4 +1,4 @@ -import options +import ctypes import pyglet import pyglet.gl as gl @@ -16,7 +16,7 @@ def __init__(self, texture_width, texture_height, max_textures): gl.glGenTextures(1, self.texture_array) gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.texture_array) - gl.glTexParameteri(gl.GL_TEXTURE_2D_ARRAY, gl.GL_TEXTURE_MIN_FILTER, options.MIPMAP_TYPE) + gl.glTexParameteri(gl.GL_TEXTURE_2D_ARRAY, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST) gl.glTexParameteri(gl.GL_TEXTURE_2D_ARRAY, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST) gl.glTexImage3D( diff --git a/episode-11/vert.glsl b/episode-11/vert.glsl index 630e1724..5a945d25 100644 --- a/episode-11/vert.glsl +++ b/episode-11/vert.glsl @@ -1,26 +1,18 @@ -#version 330 - -layout(location = 0) in vec3 a_Position; -layout(location = 1) in vec2 a_TextureFetcher; -layout(location = 2) in float a_LightMultiplier; - - -out vec3 v_Position; -out vec3 v_TexCoords; -out float v_LightMultiplier; - -uniform mat4 u_ModelViewProjMatrix; - -const vec2 texture_UV[4] = const vec2[4]( - vec2(0.0, 1.0), - vec2(0.0, 0.0), - vec2(1.0, 0.0), - vec2(1.0, 1.0) -); - -void main(void) { - v_Position = a_Position; - v_TexCoords = vec3(texture_UV[int(a_TextureFetcher[0])], a_TextureFetcher[1]); - v_LightMultiplier = a_LightMultiplier; - gl_Position = u_ModelViewProjMatrix * vec4(a_Position, 1.0); +#version 330 + +layout(location = 0) in vec3 vertex_position; +layout(location = 1) in vec3 tex_coords; +layout(location = 2) in float shading_value; + +out vec3 local_position; +out vec3 interpolated_tex_coords; +out float interpolated_shading_value; + +uniform mat4 matrix; + +void main(void) { + local_position = vertex_position; + interpolated_tex_coords = tex_coords; + interpolated_shading_value = shading_value; + gl_Position = matrix * vec4(vertex_position, 1.0); } \ No newline at end of file diff --git a/episode-11/world.py b/episode-11/world.py index 4e59316b..696fc078 100644 --- a/episode-11/world.py +++ b/episode-11/world.py @@ -1,21 +1,18 @@ -import chunk -import ctypes import math +import random - -import pyglet.gl as gl +import save +import chunk import block_type -import models -import save import texture_manager -import options + # import custom block models +import models class World: - def __init__(self, camera): - self.camera = camera + def __init__(self): self.texture_manager = texture_manager.Texture_manager(16, 16, 256) self.block_types = [None] @@ -73,30 +70,6 @@ def __init__(self, camera): self.texture_manager.generate_mipmaps() - chunk_indices = [] - - for nquad in range(chunk.CHUNK_WIDTH * chunk.CHUNK_HEIGHT * chunk.CHUNK_LENGTH * 8): - chunk_indices.append(4 * nquad + 0) - chunk_indices.append(4 * nquad + 1) - chunk_indices.append(4 * nquad + 2) - chunk_indices.append(4 * nquad + 0) - chunk_indices.append(4 * nquad + 2) - chunk_indices.append(4 * nquad + 3) - - print(len(chunk_indices)) - - self.ibo = gl.GLuint(0) - gl.glGenBuffers(1, ctypes.byref(self.ibo)) - gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo) - gl.glBufferData( - gl.GL_ELEMENT_ARRAY_BUFFER, - ctypes.sizeof(gl.GLuint * len(chunk_indices)), - (gl.GLuint * len(chunk_indices))(*chunk_indices), - gl.GL_STATIC_DRAW) - gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0) - - - # load the world self.save = save.Save(self) @@ -107,19 +80,14 @@ def __init__(self, camera): for chunk_position in self.chunks: self.chunks[chunk_position].update_subchunk_meshes() self.chunks[chunk_position].update_mesh() - - del chunk_indices - - def __del__(self): - gl.glDeleteBuffers(1, ctypes.byref(self.ibo)) def get_chunk_position(self, position): x, y, z = position return ( - (x // chunk.CHUNK_WIDTH), - (y // chunk.CHUNK_HEIGHT), - (z // chunk.CHUNK_LENGTH)) + math.floor(x / chunk.CHUNK_WIDTH), + math.floor(y / chunk.CHUNK_HEIGHT), + math.floor(z / chunk.CHUNK_LENGTH)) def get_local_position(self, position): x, y, z = position @@ -189,60 +157,6 @@ def try_update_chunk_at_position(chunk_position, position): if lz == chunk.CHUNK_LENGTH - 1: try_update_chunk_at_position((cx, cy, cz + 1), (x, y, z + 1)) if lz == 0: try_update_chunk_at_position((cx, cy, cz - 1), (x, y, z - 1)) - def can_render_chunk(self, chunk_position, pl_c_pos): - rx, ry, rz = (chunk_position[0] - pl_c_pos[0]) \ - * math.cos(self.camera.rotation[0]) \ - * math.cos(self.camera.rotation[1]) , \ - (chunk_position[1] - pl_c_pos[1]) \ - * math.sin(self.camera.rotation[1]) , \ - (chunk_position[2] - pl_c_pos[2]) \ - * math.sin(self.camera.rotation[0]) \ - * math.cos(self.camera.rotation[1]) - return rx >= -1 and ry >= -1 and rz >= -1 - - def draw_translucent_fast(self, player_chunk_pos): - gl.glDisable(gl.GL_CULL_FACE) - gl.glEnable(gl.GL_BLEND) - gl.glDepthMask(gl.GL_FALSE) - - for chunk_position in self.chunks: - if self.can_render_chunk(chunk_position, player_chunk_pos): - self.chunks[chunk_position].draw_translucent() - - gl.glDepthMask(gl.GL_TRUE) - gl.glDisable(gl.GL_BLEND) - gl.glEnable(gl.GL_CULL_FACE) - - def draw_translucent_fancy(self, player_chunk_pos): - gl.glDepthMask(gl.GL_FALSE) - gl.glFrontFace(gl.GL_CW) - gl.glEnable(gl.GL_BLEND) - - for chunk_position in self.chunks: - if self.can_render_chunk(chunk_position, player_chunk_pos): - self.chunks[chunk_position].draw_translucent() - - gl.glFrontFace(gl.GL_CCW) - gl.glEnable(gl.GL_BLEND) - - for chunk_position in self.chunks: - if self.can_render_chunk(chunk_position, player_chunk_pos): - self.chunks[chunk_position].draw_translucent() - - gl.glDisable(gl.GL_BLEND) - gl.glDepthMask(gl.GL_TRUE) - - draw_translucent = draw_translucent_fancy if options.TRANSLUCENT_BLENDING else draw_translucent_fast - def draw(self): - player_floored_pos = tuple(self.camera.position) - player_chunk_pos = self.get_chunk_position(player_floored_pos) - for chunk_position in self.chunks: - if self.can_render_chunk(chunk_position, player_chunk_pos): - self.chunks[chunk_position].draw() - - self.draw_translucent(player_chunk_pos) - - - \ No newline at end of file + self.chunks[chunk_position].draw() \ No newline at end of file From fc48124c2c7bcb7c663394e9b9db24e58f8ee782 Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Mon, 13 Dec 2021 10:55:53 +0100 Subject: [PATCH 09/10] Changed sky --- community/main.py | 6 +----- community/models/liquid.py | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/community/main.py b/community/main.py index 7bd61916..9222fea8 100644 --- a/community/main.py +++ b/community/main.py @@ -1,4 +1,3 @@ - import math import random import pyglet @@ -12,9 +11,6 @@ import camera -import block_type -import texture_manager - import world import hit @@ -76,7 +72,7 @@ def on_draw(self): self.status = gl.glClientWaitSync(self.fence, gl.GL_SYNC_FLUSH_COMMANDS_BIT, 2985984) gl.glDeleteSync(self.fence) - gl.glClearColor(0.0, 0.0, 0.0, 0.0) + gl.glClearColor(0.4, 0.7, 1.0, 1.0) self.clear() self.world.draw() diff --git a/community/models/liquid.py b/community/models/liquid.py index e951fd9f..1af2b4d6 100644 --- a/community/models/liquid.py +++ b/community/models/liquid.py @@ -24,7 +24,7 @@ [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0], ] -_shading_values = [ +shading_values = [ [0.6, 0.6, 0.6, 0.6], [0.6, 0.6, 0.6, 0.6], [1.0, 1.0, 1.0, 1.0], @@ -33,7 +33,7 @@ [0.8, 0.8, 0.8, 0.8], ] -shading_values = [ +_shading_values = [ [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], From 2aaea1292ed76e2737bda1a8cd74bf899404cf27 Mon Sep 17 00:00:00 2001 From: Jukitsu <84381972+Jukitsu@users.noreply.github.com> Date: Mon, 13 Dec 2021 11:38:29 +0100 Subject: [PATCH 10/10] remove flush --- community/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community/main.py b/community/main.py index 9222fea8..07b1419f 100644 --- a/community/main.py +++ b/community/main.py @@ -78,7 +78,7 @@ def on_draw(self): self.world.draw() self.fence = gl.glFenceSync(gl.GL_SYNC_GPU_COMMANDS_COMPLETE, 0) - gl.glFlush() + # input functions