Commit baked atlases for all 8 blob-styles; remove atlases/ from .gitignore

Aligns with the other lib-asset prototype packages (fa-starter,
subterrain) where baked atlases ship with the lib instead of being
regenerated per-consumer. Removes a runtime atlas-baker dependency
for downstream consumers (vagrant-skeleton, map-editor) — they can
load the JSON+PNG pair directly after a plain install-reference
stage without invoking Python+Node toolchains.

Variants committed: blob_concave, blob_diagonal_cut, blob_organic,
blob_rectilinear, blob_rect_grass, blob_rect_stone, blob_rect_wood,
blob_testbench. Re-bake via scripts/bake.sh when sources change.
This commit is contained in:
Axel Meyer
2026-05-31 14:08:27 +02:00
parent 1a99e22e1f
commit 644ab0911d
40 changed files with 3584 additions and 1 deletions

View File

@@ -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
}
]
}

View File

@@ -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
}

View File

@@ -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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -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
}
]
}

View File

@@ -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
}

View File

@@ -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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -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
}
]
}

View File

@@ -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
}

View File

@@ -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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -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
}
]
}

View File

@@ -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
}

View File

@@ -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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 952 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -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
}
]
}

View File

@@ -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
}

View File

@@ -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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 951 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -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
}
]
}

View File

@@ -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
}

View File

@@ -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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 951 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -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
}
]
}

View File

@@ -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
}

View File

@@ -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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 951 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -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
}
]
}

View File

@@ -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
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB