diff --git a/.gitignore b/.gitignore index 62612a3..7a60b85 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ __pycache__/ *.pyc -assets/atlases/ diff --git a/assets/atlases/blob_concave/tiles.atlas.json b/assets/atlases/blob_concave/tiles.atlas.json new file mode 100644 index 0000000..45262b2 --- /dev/null +++ b/assets/atlases/blob_concave/tiles.atlas.json @@ -0,0 +1,152 @@ +{ + "atlas_id": "blob_concave", + "atlas_version": 2, + "atlas_size_px": [ + 1024, + 128 + ], + "tile_size_px": 64, + "tiles": [ + { + "id": 1, + "name": "slot_00_isolated", + "uv": [ + 2, + 2, + 64, + 64 + ] + }, + { + "id": 2, + "name": "slot_01_end", + "uv": [ + 70, + 2, + 64, + 64 + ] + }, + { + "id": 3, + "name": "slot_02_corner_open", + "uv": [ + 138, + 2, + 64, + 64 + ] + }, + { + "id": 4, + "name": "slot_03_corner_full", + "uv": [ + 206, + 2, + 64, + 64 + ] + }, + { + "id": 5, + "name": "slot_04_straight", + "uv": [ + 274, + 2, + 64, + 64 + ] + }, + { + "id": 6, + "name": "slot_05_tee_open", + "uv": [ + 342, + 2, + 64, + 64 + ] + }, + { + "id": 7, + "name": "slot_06_tee_half", + "uv": [ + 410, + 2, + 64, + 64 + ] + }, + { + "id": 8, + "name": "slot_07_tee_full", + "uv": [ + 478, + 2, + 64, + 64 + ] + }, + { + "id": 9, + "name": "slot_08_cross_open", + "uv": [ + 546, + 2, + 64, + 64 + ] + }, + { + "id": 10, + "name": "slot_09_cross_q1", + "uv": [ + 614, + 2, + 64, + 64 + ] + }, + { + "id": 11, + "name": "slot_10_cross_q2adj", + "uv": [ + 682, + 2, + 64, + 64 + ] + }, + { + "id": 12, + "name": "slot_11_cross_q2opp", + "uv": [ + 750, + 2, + 64, + 64 + ] + }, + { + "id": 13, + "name": "slot_12_cross_q3", + "uv": [ + 818, + 2, + 64, + 64 + ] + }, + { + "id": 14, + "name": "slot_13_solid", + "uv": [ + 886, + 2, + 64, + 64 + ], + "opaque": true + } + ] +} diff --git a/assets/atlases/blob_concave/tiles.atlas.lock.json b/assets/atlases/blob_concave/tiles.atlas.lock.json new file mode 100644 index 0000000..2d73cdb --- /dev/null +++ b/assets/atlases/blob_concave/tiles.atlas.lock.json @@ -0,0 +1,21 @@ +{ + "atlas_id": "blob_concave", + "bindings": { + "slot_00_isolated": 1, + "slot_01_end": 2, + "slot_02_corner_open": 3, + "slot_03_corner_full": 4, + "slot_04_straight": 5, + "slot_05_tee_open": 6, + "slot_06_tee_half": 7, + "slot_07_tee_full": 8, + "slot_08_cross_open": 9, + "slot_09_cross_q1": 10, + "slot_10_cross_q2adj": 11, + "slot_11_cross_q2opp": 12, + "slot_12_cross_q3": 13, + "slot_13_solid": 14 + }, + "deleted": [], + "next_id": 15 +} diff --git a/assets/atlases/blob_concave/tiles.collision.json b/assets/atlases/blob_concave/tiles.collision.json new file mode 100644 index 0000000..f9ea97a --- /dev/null +++ b/assets/atlases/blob_concave/tiles.collision.json @@ -0,0 +1,270 @@ +{ + "schema": "blob-14", + "tile_size_px": 64, + "sub_cell_px": 16, + "shape_kind": "rect_list", + "_note": "Collision matches the rectilinear visual exactly. For diagonal_cut/organic/concave styles, the visible boundary deviates by up to 5 px at convex external corners — acceptable for typical gameplay collision. Modders needing pixel-perfect physics ship per-style polygon overrides.", + "slots": [ + { + "slot": 0, + "name": "isolated", + "bitmask": "0b00000000", + "rects": [ + [ + 16, + 16, + 32, + 32 + ] + ] + }, + { + "slot": 1, + "name": "end", + "bitmask": "0b00000001", + "rects": [ + [ + 16, + 0, + 32, + 48 + ] + ] + }, + { + "slot": 2, + "name": "corner_open", + "bitmask": "0b00000101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ] + ] + }, + { + "slot": 3, + "name": "corner_full", + "bitmask": "0b00000111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ] + ] + }, + { + "slot": 4, + "name": "straight", + "bitmask": "0b00010001", + "rects": [ + [ + 16, + 0, + 32, + 64 + ] + ] + }, + { + "slot": 5, + "name": "tee_open", + "bitmask": "0b00010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 6, + "name": "tee_half", + "bitmask": "0b00010111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 7, + "name": "tee_full", + "bitmask": "0b00011111", + "rects": [ + [ + 16, + 0, + 48, + 64 + ] + ] + }, + { + "slot": 8, + "name": "cross_open", + "bitmask": "0b01010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 9, + "name": "cross_q1", + "bitmask": "0b01010111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 10, + "name": "cross_q2adj", + "bitmask": "0b01011111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 11, + "name": "cross_q2opp", + "bitmask": "0b01110111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 0, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 12, + "name": "cross_q3", + "bitmask": "0b01111111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 48 + ] + ] + }, + { + "slot": 13, + "name": "solid", + "bitmask": "0b11111111", + "rects": [ + [ + 0, + 0, + 64, + 64 + ] + ] + } + ], + "style": "concave" +} diff --git a/assets/atlases/blob_concave/tiles.diffuse.atlas.png b/assets/atlases/blob_concave/tiles.diffuse.atlas.png new file mode 100644 index 0000000..d38dd29 Binary files /dev/null and b/assets/atlases/blob_concave/tiles.diffuse.atlas.png differ diff --git a/assets/atlases/blob_concave/tiles.height.atlas.png b/assets/atlases/blob_concave/tiles.height.atlas.png new file mode 100644 index 0000000..eabcdc0 Binary files /dev/null and b/assets/atlases/blob_concave/tiles.height.atlas.png differ diff --git a/assets/atlases/blob_diagonal_cut/tiles.atlas.json b/assets/atlases/blob_diagonal_cut/tiles.atlas.json new file mode 100644 index 0000000..cb3eb7b --- /dev/null +++ b/assets/atlases/blob_diagonal_cut/tiles.atlas.json @@ -0,0 +1,152 @@ +{ + "atlas_id": "blob_diagonal_cut", + "atlas_version": 2, + "atlas_size_px": [ + 1024, + 128 + ], + "tile_size_px": 64, + "tiles": [ + { + "id": 1, + "name": "slot_00_isolated", + "uv": [ + 2, + 2, + 64, + 64 + ] + }, + { + "id": 2, + "name": "slot_01_end", + "uv": [ + 70, + 2, + 64, + 64 + ] + }, + { + "id": 3, + "name": "slot_02_corner_open", + "uv": [ + 138, + 2, + 64, + 64 + ] + }, + { + "id": 4, + "name": "slot_03_corner_full", + "uv": [ + 206, + 2, + 64, + 64 + ] + }, + { + "id": 5, + "name": "slot_04_straight", + "uv": [ + 274, + 2, + 64, + 64 + ] + }, + { + "id": 6, + "name": "slot_05_tee_open", + "uv": [ + 342, + 2, + 64, + 64 + ] + }, + { + "id": 7, + "name": "slot_06_tee_half", + "uv": [ + 410, + 2, + 64, + 64 + ] + }, + { + "id": 8, + "name": "slot_07_tee_full", + "uv": [ + 478, + 2, + 64, + 64 + ] + }, + { + "id": 9, + "name": "slot_08_cross_open", + "uv": [ + 546, + 2, + 64, + 64 + ] + }, + { + "id": 10, + "name": "slot_09_cross_q1", + "uv": [ + 614, + 2, + 64, + 64 + ] + }, + { + "id": 11, + "name": "slot_10_cross_q2adj", + "uv": [ + 682, + 2, + 64, + 64 + ] + }, + { + "id": 12, + "name": "slot_11_cross_q2opp", + "uv": [ + 750, + 2, + 64, + 64 + ] + }, + { + "id": 13, + "name": "slot_12_cross_q3", + "uv": [ + 818, + 2, + 64, + 64 + ] + }, + { + "id": 14, + "name": "slot_13_solid", + "uv": [ + 886, + 2, + 64, + 64 + ], + "opaque": true + } + ] +} diff --git a/assets/atlases/blob_diagonal_cut/tiles.atlas.lock.json b/assets/atlases/blob_diagonal_cut/tiles.atlas.lock.json new file mode 100644 index 0000000..189f016 --- /dev/null +++ b/assets/atlases/blob_diagonal_cut/tiles.atlas.lock.json @@ -0,0 +1,21 @@ +{ + "atlas_id": "blob_diagonal_cut", + "bindings": { + "slot_00_isolated": 1, + "slot_01_end": 2, + "slot_02_corner_open": 3, + "slot_03_corner_full": 4, + "slot_04_straight": 5, + "slot_05_tee_open": 6, + "slot_06_tee_half": 7, + "slot_07_tee_full": 8, + "slot_08_cross_open": 9, + "slot_09_cross_q1": 10, + "slot_10_cross_q2adj": 11, + "slot_11_cross_q2opp": 12, + "slot_12_cross_q3": 13, + "slot_13_solid": 14 + }, + "deleted": [], + "next_id": 15 +} diff --git a/assets/atlases/blob_diagonal_cut/tiles.collision.json b/assets/atlases/blob_diagonal_cut/tiles.collision.json new file mode 100644 index 0000000..759c3b7 --- /dev/null +++ b/assets/atlases/blob_diagonal_cut/tiles.collision.json @@ -0,0 +1,270 @@ +{ + "schema": "blob-14", + "tile_size_px": 64, + "sub_cell_px": 16, + "shape_kind": "rect_list", + "_note": "Collision matches the rectilinear visual exactly. For diagonal_cut/organic/concave styles, the visible boundary deviates by up to 5 px at convex external corners — acceptable for typical gameplay collision. Modders needing pixel-perfect physics ship per-style polygon overrides.", + "slots": [ + { + "slot": 0, + "name": "isolated", + "bitmask": "0b00000000", + "rects": [ + [ + 16, + 16, + 32, + 32 + ] + ] + }, + { + "slot": 1, + "name": "end", + "bitmask": "0b00000001", + "rects": [ + [ + 16, + 0, + 32, + 48 + ] + ] + }, + { + "slot": 2, + "name": "corner_open", + "bitmask": "0b00000101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ] + ] + }, + { + "slot": 3, + "name": "corner_full", + "bitmask": "0b00000111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ] + ] + }, + { + "slot": 4, + "name": "straight", + "bitmask": "0b00010001", + "rects": [ + [ + 16, + 0, + 32, + 64 + ] + ] + }, + { + "slot": 5, + "name": "tee_open", + "bitmask": "0b00010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 6, + "name": "tee_half", + "bitmask": "0b00010111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 7, + "name": "tee_full", + "bitmask": "0b00011111", + "rects": [ + [ + 16, + 0, + 48, + 64 + ] + ] + }, + { + "slot": 8, + "name": "cross_open", + "bitmask": "0b01010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 9, + "name": "cross_q1", + "bitmask": "0b01010111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 10, + "name": "cross_q2adj", + "bitmask": "0b01011111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 11, + "name": "cross_q2opp", + "bitmask": "0b01110111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 0, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 12, + "name": "cross_q3", + "bitmask": "0b01111111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 48 + ] + ] + }, + { + "slot": 13, + "name": "solid", + "bitmask": "0b11111111", + "rects": [ + [ + 0, + 0, + 64, + 64 + ] + ] + } + ], + "style": "diagonal_cut" +} diff --git a/assets/atlases/blob_diagonal_cut/tiles.diffuse.atlas.png b/assets/atlases/blob_diagonal_cut/tiles.diffuse.atlas.png new file mode 100644 index 0000000..cf9543f Binary files /dev/null and b/assets/atlases/blob_diagonal_cut/tiles.diffuse.atlas.png differ diff --git a/assets/atlases/blob_diagonal_cut/tiles.height.atlas.png b/assets/atlases/blob_diagonal_cut/tiles.height.atlas.png new file mode 100644 index 0000000..eabcdc0 Binary files /dev/null and b/assets/atlases/blob_diagonal_cut/tiles.height.atlas.png differ diff --git a/assets/atlases/blob_organic/tiles.atlas.json b/assets/atlases/blob_organic/tiles.atlas.json new file mode 100644 index 0000000..5ad7329 --- /dev/null +++ b/assets/atlases/blob_organic/tiles.atlas.json @@ -0,0 +1,152 @@ +{ + "atlas_id": "blob_organic", + "atlas_version": 2, + "atlas_size_px": [ + 1024, + 128 + ], + "tile_size_px": 64, + "tiles": [ + { + "id": 1, + "name": "slot_00_isolated", + "uv": [ + 2, + 2, + 64, + 64 + ] + }, + { + "id": 2, + "name": "slot_01_end", + "uv": [ + 70, + 2, + 64, + 64 + ] + }, + { + "id": 3, + "name": "slot_02_corner_open", + "uv": [ + 138, + 2, + 64, + 64 + ] + }, + { + "id": 4, + "name": "slot_03_corner_full", + "uv": [ + 206, + 2, + 64, + 64 + ] + }, + { + "id": 5, + "name": "slot_04_straight", + "uv": [ + 274, + 2, + 64, + 64 + ] + }, + { + "id": 6, + "name": "slot_05_tee_open", + "uv": [ + 342, + 2, + 64, + 64 + ] + }, + { + "id": 7, + "name": "slot_06_tee_half", + "uv": [ + 410, + 2, + 64, + 64 + ] + }, + { + "id": 8, + "name": "slot_07_tee_full", + "uv": [ + 478, + 2, + 64, + 64 + ] + }, + { + "id": 9, + "name": "slot_08_cross_open", + "uv": [ + 546, + 2, + 64, + 64 + ] + }, + { + "id": 10, + "name": "slot_09_cross_q1", + "uv": [ + 614, + 2, + 64, + 64 + ] + }, + { + "id": 11, + "name": "slot_10_cross_q2adj", + "uv": [ + 682, + 2, + 64, + 64 + ] + }, + { + "id": 12, + "name": "slot_11_cross_q2opp", + "uv": [ + 750, + 2, + 64, + 64 + ] + }, + { + "id": 13, + "name": "slot_12_cross_q3", + "uv": [ + 818, + 2, + 64, + 64 + ] + }, + { + "id": 14, + "name": "slot_13_solid", + "uv": [ + 886, + 2, + 64, + 64 + ], + "opaque": true + } + ] +} diff --git a/assets/atlases/blob_organic/tiles.atlas.lock.json b/assets/atlases/blob_organic/tiles.atlas.lock.json new file mode 100644 index 0000000..58d707b --- /dev/null +++ b/assets/atlases/blob_organic/tiles.atlas.lock.json @@ -0,0 +1,21 @@ +{ + "atlas_id": "blob_organic", + "bindings": { + "slot_00_isolated": 1, + "slot_01_end": 2, + "slot_02_corner_open": 3, + "slot_03_corner_full": 4, + "slot_04_straight": 5, + "slot_05_tee_open": 6, + "slot_06_tee_half": 7, + "slot_07_tee_full": 8, + "slot_08_cross_open": 9, + "slot_09_cross_q1": 10, + "slot_10_cross_q2adj": 11, + "slot_11_cross_q2opp": 12, + "slot_12_cross_q3": 13, + "slot_13_solid": 14 + }, + "deleted": [], + "next_id": 15 +} diff --git a/assets/atlases/blob_organic/tiles.collision.json b/assets/atlases/blob_organic/tiles.collision.json new file mode 100644 index 0000000..104c772 --- /dev/null +++ b/assets/atlases/blob_organic/tiles.collision.json @@ -0,0 +1,270 @@ +{ + "schema": "blob-14", + "tile_size_px": 64, + "sub_cell_px": 16, + "shape_kind": "rect_list", + "_note": "Collision matches the rectilinear visual exactly. For diagonal_cut/organic/concave styles, the visible boundary deviates by up to 5 px at convex external corners — acceptable for typical gameplay collision. Modders needing pixel-perfect physics ship per-style polygon overrides.", + "slots": [ + { + "slot": 0, + "name": "isolated", + "bitmask": "0b00000000", + "rects": [ + [ + 16, + 16, + 32, + 32 + ] + ] + }, + { + "slot": 1, + "name": "end", + "bitmask": "0b00000001", + "rects": [ + [ + 16, + 0, + 32, + 48 + ] + ] + }, + { + "slot": 2, + "name": "corner_open", + "bitmask": "0b00000101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ] + ] + }, + { + "slot": 3, + "name": "corner_full", + "bitmask": "0b00000111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ] + ] + }, + { + "slot": 4, + "name": "straight", + "bitmask": "0b00010001", + "rects": [ + [ + 16, + 0, + 32, + 64 + ] + ] + }, + { + "slot": 5, + "name": "tee_open", + "bitmask": "0b00010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 6, + "name": "tee_half", + "bitmask": "0b00010111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 7, + "name": "tee_full", + "bitmask": "0b00011111", + "rects": [ + [ + 16, + 0, + 48, + 64 + ] + ] + }, + { + "slot": 8, + "name": "cross_open", + "bitmask": "0b01010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 9, + "name": "cross_q1", + "bitmask": "0b01010111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 10, + "name": "cross_q2adj", + "bitmask": "0b01011111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 11, + "name": "cross_q2opp", + "bitmask": "0b01110111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 0, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 12, + "name": "cross_q3", + "bitmask": "0b01111111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 48 + ] + ] + }, + { + "slot": 13, + "name": "solid", + "bitmask": "0b11111111", + "rects": [ + [ + 0, + 0, + 64, + 64 + ] + ] + } + ], + "style": "organic" +} diff --git a/assets/atlases/blob_organic/tiles.diffuse.atlas.png b/assets/atlases/blob_organic/tiles.diffuse.atlas.png new file mode 100644 index 0000000..5ee22be Binary files /dev/null and b/assets/atlases/blob_organic/tiles.diffuse.atlas.png differ diff --git a/assets/atlases/blob_organic/tiles.height.atlas.png b/assets/atlases/blob_organic/tiles.height.atlas.png new file mode 100644 index 0000000..eabcdc0 Binary files /dev/null and b/assets/atlases/blob_organic/tiles.height.atlas.png differ diff --git a/assets/atlases/blob_rect_grass/tiles.atlas.json b/assets/atlases/blob_rect_grass/tiles.atlas.json new file mode 100644 index 0000000..8dc917b --- /dev/null +++ b/assets/atlases/blob_rect_grass/tiles.atlas.json @@ -0,0 +1,152 @@ +{ + "atlas_id": "blob_rect_grass", + "atlas_version": 2, + "atlas_size_px": [ + 1024, + 128 + ], + "tile_size_px": 64, + "tiles": [ + { + "id": 1, + "name": "slot_00_isolated", + "uv": [ + 2, + 2, + 64, + 64 + ] + }, + { + "id": 2, + "name": "slot_01_end", + "uv": [ + 70, + 2, + 64, + 64 + ] + }, + { + "id": 3, + "name": "slot_02_corner_open", + "uv": [ + 138, + 2, + 64, + 64 + ] + }, + { + "id": 4, + "name": "slot_03_corner_full", + "uv": [ + 206, + 2, + 64, + 64 + ] + }, + { + "id": 5, + "name": "slot_04_straight", + "uv": [ + 274, + 2, + 64, + 64 + ] + }, + { + "id": 6, + "name": "slot_05_tee_open", + "uv": [ + 342, + 2, + 64, + 64 + ] + }, + { + "id": 7, + "name": "slot_06_tee_half", + "uv": [ + 410, + 2, + 64, + 64 + ] + }, + { + "id": 8, + "name": "slot_07_tee_full", + "uv": [ + 478, + 2, + 64, + 64 + ] + }, + { + "id": 9, + "name": "slot_08_cross_open", + "uv": [ + 546, + 2, + 64, + 64 + ] + }, + { + "id": 10, + "name": "slot_09_cross_q1", + "uv": [ + 614, + 2, + 64, + 64 + ] + }, + { + "id": 11, + "name": "slot_10_cross_q2adj", + "uv": [ + 682, + 2, + 64, + 64 + ] + }, + { + "id": 12, + "name": "slot_11_cross_q2opp", + "uv": [ + 750, + 2, + 64, + 64 + ] + }, + { + "id": 13, + "name": "slot_12_cross_q3", + "uv": [ + 818, + 2, + 64, + 64 + ] + }, + { + "id": 14, + "name": "slot_13_solid", + "uv": [ + 886, + 2, + 64, + 64 + ], + "opaque": true + } + ] +} diff --git a/assets/atlases/blob_rect_grass/tiles.atlas.lock.json b/assets/atlases/blob_rect_grass/tiles.atlas.lock.json new file mode 100644 index 0000000..48bc47d --- /dev/null +++ b/assets/atlases/blob_rect_grass/tiles.atlas.lock.json @@ -0,0 +1,21 @@ +{ + "atlas_id": "blob_rect_grass", + "bindings": { + "slot_00_isolated": 1, + "slot_01_end": 2, + "slot_02_corner_open": 3, + "slot_03_corner_full": 4, + "slot_04_straight": 5, + "slot_05_tee_open": 6, + "slot_06_tee_half": 7, + "slot_07_tee_full": 8, + "slot_08_cross_open": 9, + "slot_09_cross_q1": 10, + "slot_10_cross_q2adj": 11, + "slot_11_cross_q2opp": 12, + "slot_12_cross_q3": 13, + "slot_13_solid": 14 + }, + "deleted": [], + "next_id": 15 +} diff --git a/assets/atlases/blob_rect_grass/tiles.collision.json b/assets/atlases/blob_rect_grass/tiles.collision.json new file mode 100644 index 0000000..29a2b96 --- /dev/null +++ b/assets/atlases/blob_rect_grass/tiles.collision.json @@ -0,0 +1,270 @@ +{ + "schema": "blob-14", + "tile_size_px": 64, + "sub_cell_px": 16, + "shape_kind": "rect_list", + "_note": "Collision matches the rectilinear visual exactly. For diagonal_cut/organic/concave styles, the visible boundary deviates by up to 5 px at convex external corners — acceptable for typical gameplay collision. Modders needing pixel-perfect physics ship per-style polygon overrides.", + "slots": [ + { + "slot": 0, + "name": "isolated", + "bitmask": "0b00000000", + "rects": [ + [ + 16, + 16, + 32, + 32 + ] + ] + }, + { + "slot": 1, + "name": "end", + "bitmask": "0b00000001", + "rects": [ + [ + 16, + 0, + 32, + 48 + ] + ] + }, + { + "slot": 2, + "name": "corner_open", + "bitmask": "0b00000101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ] + ] + }, + { + "slot": 3, + "name": "corner_full", + "bitmask": "0b00000111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ] + ] + }, + { + "slot": 4, + "name": "straight", + "bitmask": "0b00010001", + "rects": [ + [ + 16, + 0, + 32, + 64 + ] + ] + }, + { + "slot": 5, + "name": "tee_open", + "bitmask": "0b00010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 6, + "name": "tee_half", + "bitmask": "0b00010111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 7, + "name": "tee_full", + "bitmask": "0b00011111", + "rects": [ + [ + 16, + 0, + 48, + 64 + ] + ] + }, + { + "slot": 8, + "name": "cross_open", + "bitmask": "0b01010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 9, + "name": "cross_q1", + "bitmask": "0b01010111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 10, + "name": "cross_q2adj", + "bitmask": "0b01011111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 11, + "name": "cross_q2opp", + "bitmask": "0b01110111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 0, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 12, + "name": "cross_q3", + "bitmask": "0b01111111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 48 + ] + ] + }, + { + "slot": 13, + "name": "solid", + "bitmask": "0b11111111", + "rects": [ + [ + 0, + 0, + 64, + 64 + ] + ] + } + ], + "style": "rectilinear" +} diff --git a/assets/atlases/blob_rect_grass/tiles.diffuse.atlas.png b/assets/atlases/blob_rect_grass/tiles.diffuse.atlas.png new file mode 100644 index 0000000..1b8fad7 Binary files /dev/null and b/assets/atlases/blob_rect_grass/tiles.diffuse.atlas.png differ diff --git a/assets/atlases/blob_rect_grass/tiles.height.atlas.png b/assets/atlases/blob_rect_grass/tiles.height.atlas.png new file mode 100644 index 0000000..eabcdc0 Binary files /dev/null and b/assets/atlases/blob_rect_grass/tiles.height.atlas.png differ diff --git a/assets/atlases/blob_rect_stone/tiles.atlas.json b/assets/atlases/blob_rect_stone/tiles.atlas.json new file mode 100644 index 0000000..4896055 --- /dev/null +++ b/assets/atlases/blob_rect_stone/tiles.atlas.json @@ -0,0 +1,152 @@ +{ + "atlas_id": "blob_rect_stone", + "atlas_version": 2, + "atlas_size_px": [ + 1024, + 128 + ], + "tile_size_px": 64, + "tiles": [ + { + "id": 1, + "name": "slot_00_isolated", + "uv": [ + 2, + 2, + 64, + 64 + ] + }, + { + "id": 2, + "name": "slot_01_end", + "uv": [ + 70, + 2, + 64, + 64 + ] + }, + { + "id": 3, + "name": "slot_02_corner_open", + "uv": [ + 138, + 2, + 64, + 64 + ] + }, + { + "id": 4, + "name": "slot_03_corner_full", + "uv": [ + 206, + 2, + 64, + 64 + ] + }, + { + "id": 5, + "name": "slot_04_straight", + "uv": [ + 274, + 2, + 64, + 64 + ] + }, + { + "id": 6, + "name": "slot_05_tee_open", + "uv": [ + 342, + 2, + 64, + 64 + ] + }, + { + "id": 7, + "name": "slot_06_tee_half", + "uv": [ + 410, + 2, + 64, + 64 + ] + }, + { + "id": 8, + "name": "slot_07_tee_full", + "uv": [ + 478, + 2, + 64, + 64 + ] + }, + { + "id": 9, + "name": "slot_08_cross_open", + "uv": [ + 546, + 2, + 64, + 64 + ] + }, + { + "id": 10, + "name": "slot_09_cross_q1", + "uv": [ + 614, + 2, + 64, + 64 + ] + }, + { + "id": 11, + "name": "slot_10_cross_q2adj", + "uv": [ + 682, + 2, + 64, + 64 + ] + }, + { + "id": 12, + "name": "slot_11_cross_q2opp", + "uv": [ + 750, + 2, + 64, + 64 + ] + }, + { + "id": 13, + "name": "slot_12_cross_q3", + "uv": [ + 818, + 2, + 64, + 64 + ] + }, + { + "id": 14, + "name": "slot_13_solid", + "uv": [ + 886, + 2, + 64, + 64 + ], + "opaque": true + } + ] +} diff --git a/assets/atlases/blob_rect_stone/tiles.atlas.lock.json b/assets/atlases/blob_rect_stone/tiles.atlas.lock.json new file mode 100644 index 0000000..6bb8604 --- /dev/null +++ b/assets/atlases/blob_rect_stone/tiles.atlas.lock.json @@ -0,0 +1,21 @@ +{ + "atlas_id": "blob_rect_stone", + "bindings": { + "slot_00_isolated": 1, + "slot_01_end": 2, + "slot_02_corner_open": 3, + "slot_03_corner_full": 4, + "slot_04_straight": 5, + "slot_05_tee_open": 6, + "slot_06_tee_half": 7, + "slot_07_tee_full": 8, + "slot_08_cross_open": 9, + "slot_09_cross_q1": 10, + "slot_10_cross_q2adj": 11, + "slot_11_cross_q2opp": 12, + "slot_12_cross_q3": 13, + "slot_13_solid": 14 + }, + "deleted": [], + "next_id": 15 +} diff --git a/assets/atlases/blob_rect_stone/tiles.collision.json b/assets/atlases/blob_rect_stone/tiles.collision.json new file mode 100644 index 0000000..29a2b96 --- /dev/null +++ b/assets/atlases/blob_rect_stone/tiles.collision.json @@ -0,0 +1,270 @@ +{ + "schema": "blob-14", + "tile_size_px": 64, + "sub_cell_px": 16, + "shape_kind": "rect_list", + "_note": "Collision matches the rectilinear visual exactly. For diagonal_cut/organic/concave styles, the visible boundary deviates by up to 5 px at convex external corners — acceptable for typical gameplay collision. Modders needing pixel-perfect physics ship per-style polygon overrides.", + "slots": [ + { + "slot": 0, + "name": "isolated", + "bitmask": "0b00000000", + "rects": [ + [ + 16, + 16, + 32, + 32 + ] + ] + }, + { + "slot": 1, + "name": "end", + "bitmask": "0b00000001", + "rects": [ + [ + 16, + 0, + 32, + 48 + ] + ] + }, + { + "slot": 2, + "name": "corner_open", + "bitmask": "0b00000101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ] + ] + }, + { + "slot": 3, + "name": "corner_full", + "bitmask": "0b00000111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ] + ] + }, + { + "slot": 4, + "name": "straight", + "bitmask": "0b00010001", + "rects": [ + [ + 16, + 0, + 32, + 64 + ] + ] + }, + { + "slot": 5, + "name": "tee_open", + "bitmask": "0b00010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 6, + "name": "tee_half", + "bitmask": "0b00010111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 7, + "name": "tee_full", + "bitmask": "0b00011111", + "rects": [ + [ + 16, + 0, + 48, + 64 + ] + ] + }, + { + "slot": 8, + "name": "cross_open", + "bitmask": "0b01010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 9, + "name": "cross_q1", + "bitmask": "0b01010111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 10, + "name": "cross_q2adj", + "bitmask": "0b01011111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 11, + "name": "cross_q2opp", + "bitmask": "0b01110111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 0, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 12, + "name": "cross_q3", + "bitmask": "0b01111111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 48 + ] + ] + }, + { + "slot": 13, + "name": "solid", + "bitmask": "0b11111111", + "rects": [ + [ + 0, + 0, + 64, + 64 + ] + ] + } + ], + "style": "rectilinear" +} diff --git a/assets/atlases/blob_rect_stone/tiles.diffuse.atlas.png b/assets/atlases/blob_rect_stone/tiles.diffuse.atlas.png new file mode 100644 index 0000000..64e3478 Binary files /dev/null and b/assets/atlases/blob_rect_stone/tiles.diffuse.atlas.png differ diff --git a/assets/atlases/blob_rect_stone/tiles.height.atlas.png b/assets/atlases/blob_rect_stone/tiles.height.atlas.png new file mode 100644 index 0000000..eabcdc0 Binary files /dev/null and b/assets/atlases/blob_rect_stone/tiles.height.atlas.png differ diff --git a/assets/atlases/blob_rect_wood/tiles.atlas.json b/assets/atlases/blob_rect_wood/tiles.atlas.json new file mode 100644 index 0000000..39e53d0 --- /dev/null +++ b/assets/atlases/blob_rect_wood/tiles.atlas.json @@ -0,0 +1,152 @@ +{ + "atlas_id": "blob_rect_wood", + "atlas_version": 2, + "atlas_size_px": [ + 1024, + 128 + ], + "tile_size_px": 64, + "tiles": [ + { + "id": 1, + "name": "slot_00_isolated", + "uv": [ + 2, + 2, + 64, + 64 + ] + }, + { + "id": 2, + "name": "slot_01_end", + "uv": [ + 70, + 2, + 64, + 64 + ] + }, + { + "id": 3, + "name": "slot_02_corner_open", + "uv": [ + 138, + 2, + 64, + 64 + ] + }, + { + "id": 4, + "name": "slot_03_corner_full", + "uv": [ + 206, + 2, + 64, + 64 + ] + }, + { + "id": 5, + "name": "slot_04_straight", + "uv": [ + 274, + 2, + 64, + 64 + ] + }, + { + "id": 6, + "name": "slot_05_tee_open", + "uv": [ + 342, + 2, + 64, + 64 + ] + }, + { + "id": 7, + "name": "slot_06_tee_half", + "uv": [ + 410, + 2, + 64, + 64 + ] + }, + { + "id": 8, + "name": "slot_07_tee_full", + "uv": [ + 478, + 2, + 64, + 64 + ] + }, + { + "id": 9, + "name": "slot_08_cross_open", + "uv": [ + 546, + 2, + 64, + 64 + ] + }, + { + "id": 10, + "name": "slot_09_cross_q1", + "uv": [ + 614, + 2, + 64, + 64 + ] + }, + { + "id": 11, + "name": "slot_10_cross_q2adj", + "uv": [ + 682, + 2, + 64, + 64 + ] + }, + { + "id": 12, + "name": "slot_11_cross_q2opp", + "uv": [ + 750, + 2, + 64, + 64 + ] + }, + { + "id": 13, + "name": "slot_12_cross_q3", + "uv": [ + 818, + 2, + 64, + 64 + ] + }, + { + "id": 14, + "name": "slot_13_solid", + "uv": [ + 886, + 2, + 64, + 64 + ], + "opaque": true + } + ] +} diff --git a/assets/atlases/blob_rect_wood/tiles.atlas.lock.json b/assets/atlases/blob_rect_wood/tiles.atlas.lock.json new file mode 100644 index 0000000..2441eaa --- /dev/null +++ b/assets/atlases/blob_rect_wood/tiles.atlas.lock.json @@ -0,0 +1,21 @@ +{ + "atlas_id": "blob_rect_wood", + "bindings": { + "slot_00_isolated": 1, + "slot_01_end": 2, + "slot_02_corner_open": 3, + "slot_03_corner_full": 4, + "slot_04_straight": 5, + "slot_05_tee_open": 6, + "slot_06_tee_half": 7, + "slot_07_tee_full": 8, + "slot_08_cross_open": 9, + "slot_09_cross_q1": 10, + "slot_10_cross_q2adj": 11, + "slot_11_cross_q2opp": 12, + "slot_12_cross_q3": 13, + "slot_13_solid": 14 + }, + "deleted": [], + "next_id": 15 +} diff --git a/assets/atlases/blob_rect_wood/tiles.collision.json b/assets/atlases/blob_rect_wood/tiles.collision.json new file mode 100644 index 0000000..29a2b96 --- /dev/null +++ b/assets/atlases/blob_rect_wood/tiles.collision.json @@ -0,0 +1,270 @@ +{ + "schema": "blob-14", + "tile_size_px": 64, + "sub_cell_px": 16, + "shape_kind": "rect_list", + "_note": "Collision matches the rectilinear visual exactly. For diagonal_cut/organic/concave styles, the visible boundary deviates by up to 5 px at convex external corners — acceptable for typical gameplay collision. Modders needing pixel-perfect physics ship per-style polygon overrides.", + "slots": [ + { + "slot": 0, + "name": "isolated", + "bitmask": "0b00000000", + "rects": [ + [ + 16, + 16, + 32, + 32 + ] + ] + }, + { + "slot": 1, + "name": "end", + "bitmask": "0b00000001", + "rects": [ + [ + 16, + 0, + 32, + 48 + ] + ] + }, + { + "slot": 2, + "name": "corner_open", + "bitmask": "0b00000101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ] + ] + }, + { + "slot": 3, + "name": "corner_full", + "bitmask": "0b00000111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ] + ] + }, + { + "slot": 4, + "name": "straight", + "bitmask": "0b00010001", + "rects": [ + [ + 16, + 0, + 32, + 64 + ] + ] + }, + { + "slot": 5, + "name": "tee_open", + "bitmask": "0b00010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 6, + "name": "tee_half", + "bitmask": "0b00010111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 7, + "name": "tee_full", + "bitmask": "0b00011111", + "rects": [ + [ + 16, + 0, + 48, + 64 + ] + ] + }, + { + "slot": 8, + "name": "cross_open", + "bitmask": "0b01010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 9, + "name": "cross_q1", + "bitmask": "0b01010111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 10, + "name": "cross_q2adj", + "bitmask": "0b01011111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 11, + "name": "cross_q2opp", + "bitmask": "0b01110111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 0, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 12, + "name": "cross_q3", + "bitmask": "0b01111111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 48 + ] + ] + }, + { + "slot": 13, + "name": "solid", + "bitmask": "0b11111111", + "rects": [ + [ + 0, + 0, + 64, + 64 + ] + ] + } + ], + "style": "rectilinear" +} diff --git a/assets/atlases/blob_rect_wood/tiles.diffuse.atlas.png b/assets/atlases/blob_rect_wood/tiles.diffuse.atlas.png new file mode 100644 index 0000000..bbb6ed2 Binary files /dev/null and b/assets/atlases/blob_rect_wood/tiles.diffuse.atlas.png differ diff --git a/assets/atlases/blob_rect_wood/tiles.height.atlas.png b/assets/atlases/blob_rect_wood/tiles.height.atlas.png new file mode 100644 index 0000000..eabcdc0 Binary files /dev/null and b/assets/atlases/blob_rect_wood/tiles.height.atlas.png differ diff --git a/assets/atlases/blob_rectilinear/tiles.atlas.json b/assets/atlases/blob_rectilinear/tiles.atlas.json new file mode 100644 index 0000000..afa6711 --- /dev/null +++ b/assets/atlases/blob_rectilinear/tiles.atlas.json @@ -0,0 +1,152 @@ +{ + "atlas_id": "blob_rectilinear", + "atlas_version": 2, + "atlas_size_px": [ + 1024, + 128 + ], + "tile_size_px": 64, + "tiles": [ + { + "id": 1, + "name": "slot_00_isolated", + "uv": [ + 2, + 2, + 64, + 64 + ] + }, + { + "id": 2, + "name": "slot_01_end", + "uv": [ + 70, + 2, + 64, + 64 + ] + }, + { + "id": 3, + "name": "slot_02_corner_open", + "uv": [ + 138, + 2, + 64, + 64 + ] + }, + { + "id": 4, + "name": "slot_03_corner_full", + "uv": [ + 206, + 2, + 64, + 64 + ] + }, + { + "id": 5, + "name": "slot_04_straight", + "uv": [ + 274, + 2, + 64, + 64 + ] + }, + { + "id": 6, + "name": "slot_05_tee_open", + "uv": [ + 342, + 2, + 64, + 64 + ] + }, + { + "id": 7, + "name": "slot_06_tee_half", + "uv": [ + 410, + 2, + 64, + 64 + ] + }, + { + "id": 8, + "name": "slot_07_tee_full", + "uv": [ + 478, + 2, + 64, + 64 + ] + }, + { + "id": 9, + "name": "slot_08_cross_open", + "uv": [ + 546, + 2, + 64, + 64 + ] + }, + { + "id": 10, + "name": "slot_09_cross_q1", + "uv": [ + 614, + 2, + 64, + 64 + ] + }, + { + "id": 11, + "name": "slot_10_cross_q2adj", + "uv": [ + 682, + 2, + 64, + 64 + ] + }, + { + "id": 12, + "name": "slot_11_cross_q2opp", + "uv": [ + 750, + 2, + 64, + 64 + ] + }, + { + "id": 13, + "name": "slot_12_cross_q3", + "uv": [ + 818, + 2, + 64, + 64 + ] + }, + { + "id": 14, + "name": "slot_13_solid", + "uv": [ + 886, + 2, + 64, + 64 + ], + "opaque": true + } + ] +} diff --git a/assets/atlases/blob_rectilinear/tiles.atlas.lock.json b/assets/atlases/blob_rectilinear/tiles.atlas.lock.json new file mode 100644 index 0000000..d4e57c3 --- /dev/null +++ b/assets/atlases/blob_rectilinear/tiles.atlas.lock.json @@ -0,0 +1,21 @@ +{ + "atlas_id": "blob_rectilinear", + "bindings": { + "slot_00_isolated": 1, + "slot_01_end": 2, + "slot_02_corner_open": 3, + "slot_03_corner_full": 4, + "slot_04_straight": 5, + "slot_05_tee_open": 6, + "slot_06_tee_half": 7, + "slot_07_tee_full": 8, + "slot_08_cross_open": 9, + "slot_09_cross_q1": 10, + "slot_10_cross_q2adj": 11, + "slot_11_cross_q2opp": 12, + "slot_12_cross_q3": 13, + "slot_13_solid": 14 + }, + "deleted": [], + "next_id": 15 +} diff --git a/assets/atlases/blob_rectilinear/tiles.collision.json b/assets/atlases/blob_rectilinear/tiles.collision.json new file mode 100644 index 0000000..29a2b96 --- /dev/null +++ b/assets/atlases/blob_rectilinear/tiles.collision.json @@ -0,0 +1,270 @@ +{ + "schema": "blob-14", + "tile_size_px": 64, + "sub_cell_px": 16, + "shape_kind": "rect_list", + "_note": "Collision matches the rectilinear visual exactly. For diagonal_cut/organic/concave styles, the visible boundary deviates by up to 5 px at convex external corners — acceptable for typical gameplay collision. Modders needing pixel-perfect physics ship per-style polygon overrides.", + "slots": [ + { + "slot": 0, + "name": "isolated", + "bitmask": "0b00000000", + "rects": [ + [ + 16, + 16, + 32, + 32 + ] + ] + }, + { + "slot": 1, + "name": "end", + "bitmask": "0b00000001", + "rects": [ + [ + 16, + 0, + 32, + 48 + ] + ] + }, + { + "slot": 2, + "name": "corner_open", + "bitmask": "0b00000101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ] + ] + }, + { + "slot": 3, + "name": "corner_full", + "bitmask": "0b00000111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ] + ] + }, + { + "slot": 4, + "name": "straight", + "bitmask": "0b00010001", + "rects": [ + [ + 16, + 0, + 32, + 64 + ] + ] + }, + { + "slot": 5, + "name": "tee_open", + "bitmask": "0b00010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 16, + 16, + 48, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 6, + "name": "tee_half", + "bitmask": "0b00010111", + "rects": [ + [ + 16, + 0, + 48, + 48 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 7, + "name": "tee_full", + "bitmask": "0b00011111", + "rects": [ + [ + 16, + 0, + 48, + 64 + ] + ] + }, + { + "slot": 8, + "name": "cross_open", + "bitmask": "0b01010101", + "rects": [ + [ + 16, + 0, + 32, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 9, + "name": "cross_q1", + "bitmask": "0b01010111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 32, + 16 + ] + ] + }, + { + "slot": 10, + "name": "cross_q2adj", + "bitmask": "0b01011111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 16, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 11, + "name": "cross_q2opp", + "bitmask": "0b01110111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 32 + ], + [ + 0, + 48, + 48, + 16 + ] + ] + }, + { + "slot": 12, + "name": "cross_q3", + "bitmask": "0b01111111", + "rects": [ + [ + 16, + 0, + 48, + 16 + ], + [ + 0, + 16, + 64, + 48 + ] + ] + }, + { + "slot": 13, + "name": "solid", + "bitmask": "0b11111111", + "rects": [ + [ + 0, + 0, + 64, + 64 + ] + ] + } + ], + "style": "rectilinear" +} diff --git a/assets/atlases/blob_rectilinear/tiles.diffuse.atlas.png b/assets/atlases/blob_rectilinear/tiles.diffuse.atlas.png new file mode 100644 index 0000000..64e3478 Binary files /dev/null and b/assets/atlases/blob_rectilinear/tiles.diffuse.atlas.png differ diff --git a/assets/atlases/blob_rectilinear/tiles.height.atlas.png b/assets/atlases/blob_rectilinear/tiles.height.atlas.png new file mode 100644 index 0000000..eabcdc0 Binary files /dev/null and b/assets/atlases/blob_rectilinear/tiles.height.atlas.png differ diff --git a/assets/atlases/blob_testbench/tiles.atlas.json b/assets/atlases/blob_testbench/tiles.atlas.json new file mode 100644 index 0000000..e1fadb5 --- /dev/null +++ b/assets/atlases/blob_testbench/tiles.atlas.json @@ -0,0 +1,434 @@ +{ + "atlas_id": "blob_testbench", + "atlas_version": 2, + "atlas_size_px": [ + 4096, + 128 + ], + "tile_size_px": 64, + "tiles": [ + { + "id": 1, + "name": "grass_slot_00_isolated", + "uv": [ + 2, + 2, + 64, + 64 + ] + }, + { + "id": 2, + "name": "grass_slot_01_end", + "uv": [ + 70, + 2, + 64, + 64 + ] + }, + { + "id": 3, + "name": "grass_slot_02_corner_open", + "uv": [ + 138, + 2, + 64, + 64 + ] + }, + { + "id": 4, + "name": "grass_slot_03_corner_full", + "uv": [ + 206, + 2, + 64, + 64 + ] + }, + { + "id": 5, + "name": "grass_slot_04_straight", + "uv": [ + 274, + 2, + 64, + 64 + ] + }, + { + "id": 6, + "name": "grass_slot_05_tee_open", + "uv": [ + 342, + 2, + 64, + 64 + ] + }, + { + "id": 7, + "name": "grass_slot_06_tee_half", + "uv": [ + 410, + 2, + 64, + 64 + ] + }, + { + "id": 8, + "name": "grass_slot_07_tee_full", + "uv": [ + 478, + 2, + 64, + 64 + ] + }, + { + "id": 9, + "name": "grass_slot_08_cross_open", + "uv": [ + 546, + 2, + 64, + 64 + ] + }, + { + "id": 10, + "name": "grass_slot_09_cross_q1", + "uv": [ + 614, + 2, + 64, + 64 + ] + }, + { + "id": 11, + "name": "grass_slot_10_cross_q2adj", + "uv": [ + 682, + 2, + 64, + 64 + ] + }, + { + "id": 12, + "name": "grass_slot_11_cross_q2opp", + "uv": [ + 750, + 2, + 64, + 64 + ] + }, + { + "id": 13, + "name": "grass_slot_12_cross_q3", + "uv": [ + 818, + 2, + 64, + 64 + ] + }, + { + "id": 14, + "name": "grass_slot_13_solid", + "uv": [ + 886, + 2, + 64, + 64 + ], + "opaque": true + }, + { + "id": 15, + "name": "stone_slot_00_isolated", + "uv": [ + 954, + 2, + 64, + 64 + ] + }, + { + "id": 16, + "name": "stone_slot_01_end", + "uv": [ + 1022, + 2, + 64, + 64 + ] + }, + { + "id": 17, + "name": "stone_slot_02_corner_open", + "uv": [ + 1090, + 2, + 64, + 64 + ] + }, + { + "id": 18, + "name": "stone_slot_03_corner_full", + "uv": [ + 1158, + 2, + 64, + 64 + ] + }, + { + "id": 19, + "name": "stone_slot_04_straight", + "uv": [ + 1226, + 2, + 64, + 64 + ] + }, + { + "id": 20, + "name": "stone_slot_05_tee_open", + "uv": [ + 1294, + 2, + 64, + 64 + ] + }, + { + "id": 21, + "name": "stone_slot_06_tee_half", + "uv": [ + 1362, + 2, + 64, + 64 + ] + }, + { + "id": 22, + "name": "stone_slot_07_tee_full", + "uv": [ + 1430, + 2, + 64, + 64 + ] + }, + { + "id": 23, + "name": "stone_slot_08_cross_open", + "uv": [ + 1498, + 2, + 64, + 64 + ] + }, + { + "id": 24, + "name": "stone_slot_09_cross_q1", + "uv": [ + 1566, + 2, + 64, + 64 + ] + }, + { + "id": 25, + "name": "stone_slot_10_cross_q2adj", + "uv": [ + 1634, + 2, + 64, + 64 + ] + }, + { + "id": 26, + "name": "stone_slot_11_cross_q2opp", + "uv": [ + 1702, + 2, + 64, + 64 + ] + }, + { + "id": 27, + "name": "stone_slot_12_cross_q3", + "uv": [ + 1770, + 2, + 64, + 64 + ] + }, + { + "id": 28, + "name": "stone_slot_13_solid", + "uv": [ + 1838, + 2, + 64, + 64 + ], + "opaque": true + }, + { + "id": 29, + "name": "wood_slot_00_isolated", + "uv": [ + 1906, + 2, + 64, + 64 + ] + }, + { + "id": 30, + "name": "wood_slot_01_end", + "uv": [ + 1974, + 2, + 64, + 64 + ] + }, + { + "id": 31, + "name": "wood_slot_02_corner_open", + "uv": [ + 2042, + 2, + 64, + 64 + ] + }, + { + "id": 32, + "name": "wood_slot_03_corner_full", + "uv": [ + 2110, + 2, + 64, + 64 + ] + }, + { + "id": 33, + "name": "wood_slot_04_straight", + "uv": [ + 2178, + 2, + 64, + 64 + ] + }, + { + "id": 34, + "name": "wood_slot_05_tee_open", + "uv": [ + 2246, + 2, + 64, + 64 + ] + }, + { + "id": 35, + "name": "wood_slot_06_tee_half", + "uv": [ + 2314, + 2, + 64, + 64 + ] + }, + { + "id": 36, + "name": "wood_slot_07_tee_full", + "uv": [ + 2382, + 2, + 64, + 64 + ] + }, + { + "id": 37, + "name": "wood_slot_08_cross_open", + "uv": [ + 2450, + 2, + 64, + 64 + ] + }, + { + "id": 38, + "name": "wood_slot_09_cross_q1", + "uv": [ + 2518, + 2, + 64, + 64 + ] + }, + { + "id": 39, + "name": "wood_slot_10_cross_q2adj", + "uv": [ + 2586, + 2, + 64, + 64 + ] + }, + { + "id": 40, + "name": "wood_slot_11_cross_q2opp", + "uv": [ + 2654, + 2, + 64, + 64 + ] + }, + { + "id": 41, + "name": "wood_slot_12_cross_q3", + "uv": [ + 2722, + 2, + 64, + 64 + ] + }, + { + "id": 42, + "name": "wood_slot_13_solid", + "uv": [ + 2790, + 2, + 64, + 64 + ], + "opaque": true + } + ] +} diff --git a/assets/atlases/blob_testbench/tiles.atlas.lock.json b/assets/atlases/blob_testbench/tiles.atlas.lock.json new file mode 100644 index 0000000..d88632b --- /dev/null +++ b/assets/atlases/blob_testbench/tiles.atlas.lock.json @@ -0,0 +1,49 @@ +{ + "atlas_id": "blob_testbench", + "bindings": { + "grass_slot_00_isolated": 1, + "grass_slot_01_end": 2, + "grass_slot_02_corner_open": 3, + "grass_slot_03_corner_full": 4, + "grass_slot_04_straight": 5, + "grass_slot_05_tee_open": 6, + "grass_slot_06_tee_half": 7, + "grass_slot_07_tee_full": 8, + "grass_slot_08_cross_open": 9, + "grass_slot_09_cross_q1": 10, + "grass_slot_10_cross_q2adj": 11, + "grass_slot_11_cross_q2opp": 12, + "grass_slot_12_cross_q3": 13, + "grass_slot_13_solid": 14, + "stone_slot_00_isolated": 15, + "stone_slot_01_end": 16, + "stone_slot_02_corner_open": 17, + "stone_slot_03_corner_full": 18, + "stone_slot_04_straight": 19, + "stone_slot_05_tee_open": 20, + "stone_slot_06_tee_half": 21, + "stone_slot_07_tee_full": 22, + "stone_slot_08_cross_open": 23, + "stone_slot_09_cross_q1": 24, + "stone_slot_10_cross_q2adj": 25, + "stone_slot_11_cross_q2opp": 26, + "stone_slot_12_cross_q3": 27, + "stone_slot_13_solid": 28, + "wood_slot_00_isolated": 29, + "wood_slot_01_end": 30, + "wood_slot_02_corner_open": 31, + "wood_slot_03_corner_full": 32, + "wood_slot_04_straight": 33, + "wood_slot_05_tee_open": 34, + "wood_slot_06_tee_half": 35, + "wood_slot_07_tee_full": 36, + "wood_slot_08_cross_open": 37, + "wood_slot_09_cross_q1": 38, + "wood_slot_10_cross_q2adj": 39, + "wood_slot_11_cross_q2opp": 40, + "wood_slot_12_cross_q3": 41, + "wood_slot_13_solid": 42 + }, + "deleted": [], + "next_id": 43 +} diff --git a/assets/atlases/blob_testbench/tiles.diffuse.atlas.png b/assets/atlases/blob_testbench/tiles.diffuse.atlas.png new file mode 100644 index 0000000..85d9776 Binary files /dev/null and b/assets/atlases/blob_testbench/tiles.diffuse.atlas.png differ diff --git a/assets/atlases/blob_testbench/tiles.height.atlas.png b/assets/atlases/blob_testbench/tiles.height.atlas.png new file mode 100644 index 0000000..7417fbf Binary files /dev/null and b/assets/atlases/blob_testbench/tiles.height.atlas.png differ