diff options
| author | mat <git@matdoes.dev> | 2025-05-01 21:26:55 -0930 |
|---|---|---|
| committer | mat <git@matdoes.dev> | 2025-05-01 22:12:00 -0845 |
| commit | b3f65f9d4b3b625309e5b92aae4221e116e9a068 (patch) | |
| tree | e3572c2c95af19c7daef9c8ef856aa846ad49101 /codegen/lib/code | |
| parent | 1d3f659c1d304b2a9820feaac063cac3109c2add (diff) | |
| download | azalea-drasl-b3f65f9d4b3b625309e5b92aae4221e116e9a068.tar.xz | |
drop dependency on pixlyzer and start using pumpkin extractor
Diffstat (limited to 'codegen/lib/code')
| -rw-r--r-- | codegen/lib/code/blocks.py | 17 | ||||
| -rw-r--r-- | codegen/lib/code/shapes.py | 97 |
2 files changed, 62 insertions, 52 deletions
diff --git a/codegen/lib/code/blocks.py b/codegen/lib/code/blocks.py index aaa95ffa..212d080c 100644 --- a/codegen/lib/code/blocks.py +++ b/codegen/lib/code/blocks.py @@ -12,7 +12,7 @@ BLOCKS_RS_DIR = get_dir_location('../azalea-block/src/generated.rs') # - Block: Has properties and states. -def generate_blocks(blocks_report: dict, pixlyzer_block_datas: dict, ordered_blocks: list[str], burger_data: dict): +def generate_blocks(blocks_report: dict, pumpkin_block_datas: dict, ordered_blocks: list[str], burger_data: dict): with open(BLOCKS_RS_DIR, 'r') as f: existing_code = f.read().splitlines() @@ -21,6 +21,11 @@ def generate_blocks(blocks_report: dict, pixlyzer_block_datas: dict, ordered_blo burger_block_datas = burger_data[0]['blocks']['block'] + pumpkin_block_map = {} + for block_data in pumpkin_block_datas['blocks']: + block_id = block_data['name'] + pumpkin_block_map[block_id] = block_data + # Find properties properties = {} @@ -77,8 +82,8 @@ def generate_blocks(blocks_report: dict, pixlyzer_block_datas: dict, ordered_blo new_make_block_states_macro_code.append(' Blocks => {') for block_id in ordered_blocks: block_data_report = blocks_report['minecraft:' + block_id] - block_data_pixlyzer = pixlyzer_block_datas.get(f'minecraft:{block_id}', {}) block_data_burger = burger_block_datas.get(block_id, {}) + block_data_pumpkin = pumpkin_block_map[block_id] default_property_variants: dict[str, str] = {} for state in block_data_report['states']: @@ -116,11 +121,11 @@ def generate_blocks(blocks_report: dict, pixlyzer_block_datas: dict, ordered_blo # make the block behavior behavior_constructor = 'BlockBehavior::new()' # requires tool - if block_data_pixlyzer.get('requires_tool'): + if block_data_burger.get('requires_correct_tool_for_drops'): behavior_constructor += '.requires_correct_tool_for_drops()' # strength - destroy_time = block_data_pixlyzer.get('hardness') - explosion_resistance = block_data_pixlyzer.get('explosion_resistance') + destroy_time = block_data_pumpkin.get('hardness') + explosion_resistance = block_data_pumpkin.get('blast_resistance') if destroy_time and explosion_resistance: behavior_constructor += f'.strength({destroy_time}, {explosion_resistance})' elif destroy_time: @@ -128,7 +133,7 @@ def generate_blocks(blocks_report: dict, pixlyzer_block_datas: dict, ordered_blo elif explosion_resistance: behavior_constructor += f'.explosion_resistance({explosion_resistance})' # friction - friction = block_data_pixlyzer.get('friction') + friction = block_data_burger.get('friction') if friction != None: behavior_constructor += f'.friction({friction})' diff --git a/codegen/lib/code/shapes.py b/codegen/lib/code/shapes.py index 0896bd82..3a3e6d83 100644 --- a/codegen/lib/code/shapes.py +++ b/codegen/lib/code/shapes.py @@ -5,64 +5,69 @@ COLLISION_BLOCKS_RS_DIR = get_dir_location( '../azalea-physics/src/collision/blocks.rs') -def generate_block_shapes(blocks_pixlyzer: dict, shapes: dict, aabbs: dict, block_states_report): - blocks, shapes = simplify_shapes(blocks_pixlyzer, shapes, aabbs) +def generate_block_shapes(pumpkin_block_datas: dict, block_states_report): + blocks, shapes = simplify_shapes(pumpkin_block_datas) code = generate_block_shapes_code(blocks, shapes, block_states_report) with open(COLLISION_BLOCKS_RS_DIR, 'w') as f: f.write(code) -def simplify_shapes(blocks: dict, shapes: dict, aabbs: dict): - new_id_increment = 0 - - new_shapes = {} - old_id_to_new_id = {} - - old_id_to_new_id[None] = 0 - new_shapes[0] = () - new_id_increment += 1 - - used_shape_ids = set() - # determine the used shape ids - for _block_id, block_data in blocks.items(): - block_shapes = {state.get('collision_shape') for state in block_data['states'].values()} - block_shapes.update({state.get('outline_shape') for state in block_data['states'].values()}) - for s in block_shapes: - used_shape_ids.add(s) - - for shape_id, shape in enumerate(shapes): - if shape_id not in used_shape_ids: continue - # pixlyzer gives us shapes as an index or list of indexes into the - # aabbs list - # and aabbs look like { "from": number or [x, y, z], "to": (number or vec3) } - # convert them to [x1, y1, z1, x2, y2, z2] - shape = [shape] if isinstance(shape, int) else shape - shape = [aabbs[shape_aabb] for shape_aabb in shape] - shape = tuple([( - (tuple(part['from']) if isinstance( - part['from'], list) else ((part['from'],)*3)) - + (tuple(part['to']) if isinstance(part['to'], list) - else ((part['to'],)*3)) - ) for part in shape]) - - old_id_to_new_id[shape_id] = new_id_increment - new_shapes[new_id_increment] = shape - new_id_increment += 1 - - # now map the blocks to the new shape ids +def simplify_shapes(blocks: dict) -> tuple[dict, dict]: + ''' + Returns new_blocks and new_shapes, + where new_blocks is like { grass_block: { collision: [1, 1], outline: [1, 1] } } + and new_shapes is like { 1: [ [0, 0, 0, 1, 1, 1] ] } + ''' new_blocks = {} - for block_id, block_data in blocks.items(): - block_id = block_id.split(':')[-1] + new_shapes = {} - block_collision_shapes = [state.get('collision_shape') for state in block_data['states'].values()] - block_outline_shapes = [state.get('outline_shape') for state in block_data['states'].values()] + all_shapes_ids = {} + + for block_data in blocks['blocks']: + new_block_collision_shapes = [] + new_block_outline_shapes = [] + + for state in block_data['states']: + collision_shape = [] + for box_id in state['collision_shapes']: + box = blocks['shapes'][box_id] + collision_shape.append( + tuple(box['min'] + box['max']) + ) + outline_shape = [] + for box_id in state['outline_shapes']: + box = blocks['shapes'][box_id] + outline_shape.append( + tuple(box['min'] + box['max']) + ) + + collision_shape = tuple(collision_shape) + outline_shape = tuple(outline_shape) + + if collision_shape in all_shapes_ids: + collision_shape_id = all_shapes_ids[collision_shape] + else: + collision_shape_id = len(all_shapes_ids) + all_shapes_ids[collision_shape] = collision_shape_id + new_shapes[collision_shape_id] = collision_shape + if outline_shape in all_shapes_ids: + outline_shape_id = all_shapes_ids[outline_shape] + else: + outline_shape_id = len(all_shapes_ids) + all_shapes_ids[outline_shape] = outline_shape_id + new_shapes[outline_shape_id] = outline_shape + + block_id = block_data['name'] + new_block_collision_shapes.append(collision_shape_id) + new_block_outline_shapes.append(outline_shape_id) new_blocks[block_id] = { - 'collision': [old_id_to_new_id[shape_id] for shape_id in block_collision_shapes], - 'outline': [old_id_to_new_id[shape_id] for shape_id in block_outline_shapes] + 'collision': new_block_collision_shapes, + 'outline': new_block_outline_shapes } + return new_blocks, new_shapes |
