diff --git a/.gitignore b/.gitignore index a547bf3..e6b2ce6 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,8 @@ dist-ssr *.njsproj *.sln *.sw? + +# Python +.venv +generator/blocks +generator/*.json \ No newline at end of file diff --git a/generator/README.md b/generator/README.md new file mode 100644 index 0000000..af5ff40 --- /dev/null +++ b/generator/README.md @@ -0,0 +1,2 @@ +# blockmatic/generator +Collection of Python scripts to generate data for blockmatic. \ No newline at end of file diff --git a/generator/average-color.py b/generator/average-color.py new file mode 100644 index 0000000..cfa02a8 --- /dev/null +++ b/generator/average-color.py @@ -0,0 +1,36 @@ +import os +import json +from pathlib import Path +from PIL import Image +import numpy as np + +directory = Path("blocks/") +output = Path("average_colors.json") + +# Main function +def calculate(image_path): + image = Image.open(image_path) + image = image.convert("RGB") + pixels = np.array(image) + color = pixels.mean(axis=(0, 1)) + return tuple(int(c) for c in color) + +# Create directory if it doesn't exist +directory.mkdir(parents=True, exist_ok=True) + +# Data for the colors to be written to a file +color_data = {} + +# Go through each file in the directory +for filename in os.listdir(directory): + file = os.path.join(directory, filename) + color = calculate(file) + + # Add to color_data while also removing the file extension (.png) + color_data[filename[:-4]] = list(color) + +# Write output to file +with open(output, "w") as json_file: + json.dump(color_data, json_file) + +print("Done!") \ No newline at end of file diff --git a/generator/requirements.txt b/generator/requirements.txt new file mode 100644 index 0000000..027107d --- /dev/null +++ b/generator/requirements.txt @@ -0,0 +1,2 @@ +numpy==2.1.3 +pillow==11.0.0 \ No newline at end of file diff --git a/src/lib/blocks/programmer-art/average_colors.json b/src/lib/blocks/programmer-art/average_colors.json new file mode 100644 index 0000000..55ae57a --- /dev/null +++ b/src/lib/blocks/programmer-art/average_colors.json @@ -0,0 +1,273 @@ +{ + "redstone_lamp": [70, 43, 26], + "piston_top_sticky": [141, 146, 99], + "chiseled_red_sandstone": [162, 82, 27], + "spruce_log": [45, 28, 12], + "red_glazed_terracotta": [181, 59, 53], + "cauldron_side": [60, 60, 60], + "birch_log_top": [184, 166, 121], + "oak_trapdoor": [144, 116, 75], + "nether_quartz_ore": [125, 84, 79], + "gray_stained_glass": [76, 76, 76], + "orange_stained_glass": [216, 127, 51], + "purple_shulker_box": [103, 32, 156], + "stripped_dark_oak_log": [96, 76, 49], + "purpur_block": [166, 121, 166], + "purple_glazed_terracotta": [109, 48, 152], + "sandstone_top": [218, 210, 158], + "bookshelf": [107, 88, 57], + "dark_oak_log_top": [78, 62, 41], + "enchanting_table_side": [31, 32, 34], + "gray_terracotta": [57, 42, 35], + "light_gray_concrete_powder": [154, 154, 148], + "red_stained_glass": [153, 51, 51], + "coal_block": [18, 18, 18], + "emerald_ore": [109, 128, 116], + "coarse_dirt": [119, 85, 59], + "black_wool": [20, 21, 25], + "mossy_stone_bricks": [114, 119, 106], + "gold_block": [249, 236, 78], + "nether_bricks": [44, 22, 26], + "light_blue_shulker_box": [49, 163, 212], + "purple_terracotta": [118, 70, 86], + "repeating_command_block_front": [123, 107, 171], + "mycelium_top": [111, 99, 105], + "diorite": [179, 179, 182], + "stripped_spruce_log_top": [113, 89, 52], + "cyan_terracotta": [86, 91, 91], + "pink_stained_glass": [242, 127, 165], + "chain_command_block_front": [129, 159, 146], + "green_concrete": [73, 91, 36], + "structure_block": [88, 74, 90], + "brown_wool": [114, 71, 40], + "purpur_pillar_top": [170, 128, 170], + "birch_planks": [195, 179, 123], + "magenta_terracotta": [149, 88, 108], + "melon_side": [141, 145, 36], + "note_block": [100, 67, 50], + "pink_concrete_powder": [228, 153, 181], + "stripped_jungle_log_top": [170, 133, 84], + "polished_andesite": [133, 133, 134], + "dried_kelp_top": [50, 58, 38], + "yellow_stained_glass": [229, 229, 51], + "mossy_cobblestone": [103, 121, 103], + "jungle_log": [87, 67, 26], + "lime_concrete": [94, 168, 24], + "light_gray_stained_glass": [153, 153, 153], + "cyan_glazed_terracotta": [52, 118, 125], + "spruce_planks": [103, 77, 46], + "spawner": [16, 24, 29], + "light_blue_concrete_powder": [74, 180, 213], + "purple_stained_glass": [127, 63, 178], + "sponge": [194, 195, 84], + "orange_terracotta": [161, 83, 37], + "cracked_stone_bricks": [118, 118, 118], + "sea_lantern": [172, 200, 190], + "white_glazed_terracotta": [188, 212, 202], + "dried_kelp_side": [38, 48, 29], + "orange_wool": [240, 118, 19], + "blue_shulker_box": [43, 45, 140], + "green_wool": [84, 109, 27], + "dropper_front": [116, 116, 116], + "shulker_box": [139, 96, 139], + "stripped_dark_oak_log_top": [86, 69, 46], + "andesite": [130, 131, 131], + "white_wool": [233, 236, 236], + "furnace_front_on": [125, 102, 85], + "purple_concrete_powder": [131, 55, 177], + "dirt": [134, 96, 67], + "bone_block_top": [205, 201, 177], + "stone_slab_side": [166, 166, 166], + "purple_wool": [121, 42, 172], + "glass": [60, 66, 67], + "lime_concrete_powder": [125, 189, 41], + "stripped_jungle_log": [171, 132, 84], + "birch_log": [206, 206, 201], + "white_terracotta": [209, 178, 161], + "oak_log": [102, 81, 49], + "bedrock": [83, 83, 83], + "furnace_side": [113, 113, 113], + "grass_path_side": [133, 99, 65], + "light_blue_wool": [58, 175, 217], + "iron_block": [219, 219, 219], + "hay_block_top": [168, 139, 16], + "black_glazed_terracotta": [67, 30, 32], + "red_wool": [160, 39, 34], + "redstone_lamp_on": [119, 89, 55], + "green_terracotta": [76, 83, 42], + "brown_stained_glass": [102, 76, 51], + "blue_terracotta": [74, 59, 91], + "grass_block_side": [126, 107, 65], + "chiseled_sandstone": [215, 208, 154], + "stripped_oak_log": [177, 144, 86], + "magenta_concrete": [169, 48, 159], + "hay_block_side": [157, 116, 18], + "gold_ore": [143, 139, 124], + "redstone_ore": [132, 107, 107], + "quartz_pillar": [231, 227, 219], + "granite": [153, 113, 98], + "light_gray_concrete": [125, 125, 115], + "end_stone": [221, 223, 165], + "green_stained_glass": [102, 127, 51], + "spruce_log_top": [104, 81, 48], + "enchanting_table_bottom": [18, 16, 27], + "stripped_oak_log_top": [164, 133, 81], + "yellow_concrete": [240, 175, 21], + "red_shulker_box": [140, 31, 30], + "gray_concrete": [54, 57, 61], + "jack_o_lantern": [185, 133, 28], + "magenta_glazed_terracotta": [208, 100, 191], + "redstone_block": [171, 27, 9], + "mushroom_block_inside": [202, 171, 120], + "bricks": [146, 99, 86], + "white_concrete_powder": [225, 227, 227], + "black_shulker_box": [25, 25, 29], + "light_blue_glazed_terracotta": [94, 164, 208], + "cyan_concrete_powder": [36, 147, 157], + "mycelium_side": [113, 88, 73], + "gravel": [126, 124, 122], + "snow": [239, 251, 251], + "black_terracotta": [37, 22, 16], + "cut_sandstone": [219, 211, 161], + "orange_glazed_terracotta": [154, 147, 91], + "dried_kelp_bottom": [50, 58, 38], + "gray_concrete_powder": [76, 81, 84], + "piston_side": [106, 102, 95], + "prismarine": [106, 170, 150], + "blue_stained_glass": [51, 76, 178], + "purple_concrete": [100, 31, 156], + "observer_front": [102, 101, 101], + "white_stained_glass": [255, 255, 255], + "iron_ore": [135, 130, 126], + "black_stained_glass": [25, 25, 25], + "carved_pumpkin": [142, 76, 12], + "coal_ore": [115, 115, 115], + "green_shulker_box": [79, 100, 31], + "cobblestone": [122, 122, 122], + "pink_terracotta": [161, 78, 78], + "cyan_stained_glass": [76, 127, 153], + "piston_top": [153, 129, 89], + "dark_oak_planks": [61, 39, 18], + "end_stone_bricks": [225, 230, 170], + "emerald_block": [81, 217, 117], + "light_blue_concrete": [35, 137, 198], + "acacia_log": [105, 99, 89], + "stone_slab_top": [159, 159, 159], + "jungle_planks": [154, 110, 77], + "blue_wool": [53, 57, 157], + "stripped_spruce_log": [115, 89, 52], + "terracotta": [150, 92, 66], + "brown_concrete": [96, 59, 31], + "yellow_terracotta": [186, 133, 35], + "yellow_glazed_terracotta": [234, 192, 88], + "orange_concrete": [224, 97, 0], + "brown_terracotta": [77, 51, 35], + "light_gray_shulker_box": [124, 124, 115], + "pink_wool": [237, 141, 172], + "gray_wool": [62, 68, 71], + "lime_stained_glass": [127, 204, 25], + "glowstone": [143, 118, 69], + "yellow_concrete_powder": [232, 199, 54], + "oak_log_top": [154, 125, 77], + "oak_planks": [156, 127, 78], + "stripped_birch_log": [196, 176, 118], + "white_shulker_box": [215, 220, 221], + "cyan_wool": [21, 137, 145], + "diamond_ore": [129, 140, 143], + "polished_granite": [159, 114, 98], + "red_sandstone": [165, 84, 29], + "crafting_table_front": [115, 95, 63], + "spruce_trapdoor": [99, 75, 49], + "pink_glazed_terracotta": [235, 154, 181], + "ice": [125, 173, 255], + "blue_glazed_terracotta": [47, 64, 139], + "clay": [158, 164, 176], + "gray_glazed_terracotta": [83, 90, 93], + "lime_terracotta": [103, 117, 52], + "acacia_log_top": [154, 91, 64], + "light_gray_terracotta": [135, 106, 97], + "blue_ice": [116, 167, 253], + "light_blue_stained_glass": [102, 153, 216], + "yellow_shulker_box": [248, 188, 29], + "brown_concrete_powder": [125, 84, 53], + "light_gray_glazed_terracotta": [144, 166, 167], + "magenta_shulker_box": [173, 54, 163], + "pink_concrete": [213, 101, 142], + "sandstone_bottom": [212, 205, 148], + "prismarine_bricks": [99, 160, 143], + "cyan_concrete": [21, 119, 136], + "pink_shulker_box": [230, 121, 157], + "tnt_side": [169, 92, 71], + "stripped_acacia_log_top": [166, 91, 58], + "mushroom_stem": [207, 204, 194], + "cyan_shulker_box": [20, 121, 135], + "yellow_wool": [248, 197, 39], + "furnace_front": [78, 78, 78], + "cactus_side": [12, 92, 22], + "light_gray_wool": [142, 142, 134], + "magma": [134, 65, 25], + "wet_sponge": [160, 158, 63], + "grass_path_top": [149, 124, 71], + "black_concrete_powder": [25, 26, 31], + "blue_concrete": [44, 46, 143], + "blue_concrete_powder": [70, 73, 166], + "red_terracotta": [143, 61, 46], + "pumpkin_side": [197, 120, 23], + "green_glazed_terracotta": [117, 142, 67], + "slime_block": [120, 200, 101], + "stone": [125, 125, 125], + "lime_glazed_terracotta": [162, 197, 55], + "brown_shulker_box": [106, 66, 35], + "red_concrete": [142, 32, 32], + "white_concrete": [207, 213, 214], + "soul_sand": [84, 64, 51], + "podzol_side": [122, 87, 57], + "observer_side": [62, 60, 60], + "acacia_planks": [169, 91, 51], + "brown_glazed_terracotta": [119, 106, 85], + "light_blue_terracotta": [113, 108, 137], + "magenta_stained_glass": [178, 76, 216], + "brown_mushroom_block": [141, 106, 83], + "red_concrete_powder": [168, 54, 50], + "red_sand": [169, 88, 33], + "grass_block_snow": [149, 120, 97], + "stripped_birch_log_top": [185, 161, 104], + "green_concrete_powder": [97, 119, 44], + "sandstone": [216, 209, 157], + "packed_ice": [165, 194, 245], + "sand": [219, 211, 160], + "jungle_log_top": [153, 118, 73], + "cobweb": [90, 90, 90], + "magenta_concrete_powder": [192, 83, 184], + "lapis_ore": [102, 112, 134], + "chiseled_quartz_block": [231, 228, 220], + "stripped_acacia_log": [174, 92, 59], + "observer_back": [68, 66, 66], + "dark_oak_log": [52, 40, 23], + "command_block_front": [172, 132, 108], + "lime_shulker_box": [99, 172, 23], + "netherrack": [111, 54, 52], + "obsidian": [20, 18, 29], + "stone_bricks": [122, 122, 122], + "dispenser_front": [116, 116, 116], + "bone_block_side": [224, 220, 200], + "lime_wool": [112, 185, 25], + "red_mushroom_block": [182, 37, 36], + "polished_diorite": [183, 183, 185], + "red_nether_bricks": [68, 4, 6], + "quartz_block_side": [236, 233, 226], + "orange_concrete_powder": [227, 131, 31], + "gray_shulker_box": [55, 58, 62], + "black_concrete": [8, 10, 15], + "magenta_wool": [189, 68, 179], + "orange_shulker_box": [234, 106, 8], + "cut_red_sandstone": [168, 85, 30], + "purpur_pillar": [170, 126, 170], + "dark_prismarine": [59, 87, 75], + "diamond_block": [97, 219, 213], + "chiseled_stone_bricks": [118, 118, 118], + "lapis_block": [38, 67, 137], + "end_portal_frame_side": [119, 130, 100], + "nether_wart_block": [117, 6, 7], + "observer_top": [97, 97, 97] +}