diff --git a/minecraft/gen/mc.py b/minecraft/gen/mc.py index 0225e32..b77c26d 100644 --- a/minecraft/gen/mc.py +++ b/minecraft/gen/mc.py @@ -3,6 +3,7 @@ import struct from pprint import pprint from itertools import chain from collections import defaultdict +import functools import mcregion import vec3 @@ -22,52 +23,52 @@ non_solid_blocks = { data.BlockID.TALL_GRASS, data.BlockID.MUSHROOM_1, data.BlockID.MUSHROOM_2, + data.BlockID.FLOWER, + data.BlockID.ROSE, + data.BlockID.SAPLING, } +def neighbor_exists(level_table, chunk_x, chunk_z, nx, ny, nz): + if ny > 127 or ny < 0: + return False + nx, n_chunk_x = wrap_n(nx, chunk_x) + nz, n_chunk_z = wrap_n(nz, chunk_z) + assert nx <= 15 and nx >= 0 + assert nz <= 15 and nz >= 0 + key = (n_chunk_x, n_chunk_z) + if key not in level_table: + return True + n_block_index = mcregion.block_index_from_xyz(nx, ny, nz) + n_block_id = level_table[key].blocks[n_block_index] + + has_neighbor = (n_block_id != data.BlockID.AIR) and (n_block_id not in non_solid_blocks) + return has_neighbor + def block_neighbors(level_table, chunk_x, chunk_z, block_index): block_id = level_table[(chunk_x, chunk_z)].blocks[block_index] if block_id == data.BlockID.AIR: return - def neighbor_exists(nx, ny, nz): - if ny > 127 or ny < 0: - return False - nx, n_chunk_x = wrap_n(nx, chunk_x) - nz, n_chunk_z = wrap_n(nz, chunk_z) - if nx > 15 or nx < 0: - return True - if nz > 15 or nz < 0: - return True - n_block_index = mcregion.block_index_from_xyz(nx, ny, nz) - key = (n_chunk_x, n_chunk_z) - if key not in level_table: - return True - n_block_id = level_table[key].blocks[n_block_index] + xyz = mcregion.xyz_from_block_index(block_index) - has_neighbor = (n_block_id != data.BlockID.AIR) and (n_block_id not in non_solid_blocks) - return has_neighbor - - x, y, z = mcregion.xyz_from_block_index(block_index) - - center_position = vec3.add((x, y, z), (chunk_x * 16, 0, chunk_z * 16)) + center_position = vec3.add(xyz, (chunk_x * 16, 0, chunk_z * 16)) def find_non_neighbors(): for i, normal in enumerate(vertex_buffer.normals): - neighbor = vec3.add(normal, (x, y, z)) - if not neighbor_exists(*neighbor): + neighbor = vec3.add(normal, xyz) + if not neighbor_exists(level_table, chunk_x, chunk_z, *neighbor): yield i normal_indices = list(find_non_neighbors()) if block_id in non_solid_blocks or normal_indices: yield center_position, block_id, normal_indices -def devoxelize_region(level_table): - for chunk_x, chunk_z in level_table.keys(): +def devoxelize_region(level_table, level_table_keys): + for chunk_x, chunk_z in level_table_keys: for block_index in range(128 * 16 * 16): yield from block_neighbors(level_table, chunk_x, chunk_z, block_index) -def build_level_table(mem, locations): - level_table = {} +def build_level_table(level_table, mem, locations): for location in locations: try: level = mcregion.parse_location(mem, location) @@ -93,6 +94,11 @@ def build_block_configuration_table(): non_cube_blocks = { data.BlockID.TALL_GRASS, + data.BlockID.MUSHROOM_1, + data.BlockID.MUSHROOM_2, + data.BlockID.FLOWER, + data.BlockID.ROSE, + data.BlockID.SAPLING, } def pack_instance_data(position, block_id): @@ -148,11 +154,11 @@ def build_block_instances(blocks): with open(f"{data_path}.instance.cfg", "wb") as f: for instance_count, offset in configuration_instance_count_offset: - print(instance_count, offset) + #print(instance_count, offset) f.write(struct.pack("= 0 and block_index < (128 * 16 * 16) - x = int(block_index / (128 * 16)) - y = int(block_index % 128) - z = int(int(block_index / 128) % 16) + x = block_index // (128 * 16) + y = block_index % 128 + z = (block_index // 128) % 16 return x, y, z -def block_index_from_xyz(x, y, z): +def _block_index_from_xyz(x, y, z): assert x >= 0 and x < 16 assert y >= 0 and y < 128 assert z >= 0 and z < 16 return int(y + z * 128 + x * 128 * 16) + +xyz_to_block_index = {} +block_index_to_xyz = {} + +for i in range(128 * 16 * 16): + xyz = _xyz_from_block_index(i) + assert _block_index_from_xyz(*xyz) == i + xyz_to_block_index[xyz] = i + block_index_to_xyz[i] = xyz + +def xyz_from_block_index(block_index): + return block_index_to_xyz[block_index] + +def block_index_from_xyz(x, y, z): + return xyz_to_block_index[(x, y, z)] diff --git a/minecraft/gen/tallgrass.obj b/minecraft/gen/tallgrass.obj index 3f84163..32a4995 100644 --- a/minecraft/gen/tallgrass.obj +++ b/minecraft/gen/tallgrass.obj @@ -1,14 +1,14 @@ # Blender 5.0.0 # www.blender.org o TallGrass -v 0.800011 0.600021 0.800011 -v 0.800011 -1.000000 0.800011 -v -0.800010 -1.000000 0.800011 -v -0.800011 0.600021 0.800011 -v -0.800011 0.600021 -0.800011 -v -0.800011 -1.000000 -0.800011 -v 0.800011 -1.000000 -0.800011 -v 0.800010 0.600022 -0.800011 +v 0.800000 0.600000 0.800000 +v 0.800000 -1.000000 0.800000 +v -0.800000 -1.000000 0.800000 +v -0.800000 0.600000 0.800000 +v -0.800000 0.600000 -0.800000 +v -0.800000 -1.000000 -0.800000 +v 0.800000 -1.000000 -0.800000 +v 0.800000 0.600000 -0.800000 vn 0.7071 -0.0000 0.7071 vn 0.7071 -0.0000 -0.7071 vt 1.000000 1.000000 diff --git a/minecraft/region.-1.-1.instance.cfg b/minecraft/region.-1.-1.instance.cfg index c925ab2..31a6a33 100644 Binary files a/minecraft/region.-1.-1.instance.cfg and b/minecraft/region.-1.-1.instance.cfg differ diff --git a/minecraft/region.-1.-1.instance.vtx b/minecraft/region.-1.-1.instance.vtx index eb04261..a8a1902 100644 Binary files a/minecraft/region.-1.-1.instance.vtx and b/minecraft/region.-1.-1.instance.vtx differ diff --git a/minecraft/region.-1.0.instance.cfg b/minecraft/region.-1.0.instance.cfg index bec1c85..a50501e 100644 Binary files a/minecraft/region.-1.0.instance.cfg and b/minecraft/region.-1.0.instance.cfg differ diff --git a/minecraft/region.-1.0.instance.vtx b/minecraft/region.-1.0.instance.vtx index df8f91d..c678e57 100644 Binary files a/minecraft/region.-1.0.instance.vtx and b/minecraft/region.-1.0.instance.vtx differ diff --git a/minecraft/region.0.-1.instance.cfg b/minecraft/region.0.-1.instance.cfg index 599397e..f74e23d 100644 Binary files a/minecraft/region.0.-1.instance.cfg and b/minecraft/region.0.-1.instance.cfg differ diff --git a/minecraft/region.0.-1.instance.vtx b/minecraft/region.0.-1.instance.vtx index 33e417b..6db8213 100644 Binary files a/minecraft/region.0.-1.instance.vtx and b/minecraft/region.0.-1.instance.vtx differ diff --git a/minecraft/region.0.0.instance.cfg b/minecraft/region.0.0.instance.cfg index c82cbea..150cbfd 100644 Binary files a/minecraft/region.0.0.instance.cfg and b/minecraft/region.0.0.instance.cfg differ diff --git a/minecraft/region.0.0.instance.vtx b/minecraft/region.0.0.instance.vtx index 319c4df..d6c02eb 100644 Binary files a/minecraft/region.0.0.instance.vtx and b/minecraft/region.0.0.instance.vtx differ diff --git a/shader/test.frag b/shader/test.frag index 11dce84..b6c5264 100644 --- a/shader/test.frag +++ b/shader/test.frag @@ -51,7 +51,7 @@ void main() if (diffuse_intensity < 0.1) diffuse_intensity = 0.1; - if (fs_in.BlockID == 31) // tall_grass + if (fs_in.BlockID == 31 || fs_in.BlockID == 39 || fs_in.BlockID == 40 || fs_in.BlockID == 37 || fs_in.BlockID == 38 || fs_in.BlockID == 6) // tall_grass diffuse_intensity = 1.0; FragColor = vec4(texture_color.xyz * vec3(diffuse_intensity), 1.0);