{
  "schema": "forge.atom-kit.v1",
  "units": "metres",
  "up": "+Y",
  "facade_outward": "+Z",
  "facade_horizontal": "+X",
  "uv_rule": "Metric UV0 divided by shelf physical repeat. Oak grain follows each structural member. No extra texture repeat at runtime.",
  "atoms": [
    {
      "node_name": "brace_storey",
      "origin_rule": "Panel bottom centre. Timber face Z=0; mirror X for opposite hand.",
      "panel_metres": [
        1.2,
        2.4
      ],
      "attachment_centres": [
        [
          -0.53,
          0.07,
          -0.082
        ],
        [
          0.53,
          2.3299999999999996,
          -0.082
        ]
      ],
      "infill_front_z": -0.025,
      "bounding_box": {
        "min": [
          -0.587645,
          0.030288,
          -0.164
        ],
        "max": [
          0.597924,
          2.346923,
          0.015
        ]
      },
      "triangles": 244,
      "triangle_budget": 400,
      "materials": [
        "Oak_frame"
      ]
    },
    {
      "node_name": "brace_straight",
      "origin_rule": "Panel bottom centre. Timber face Z=0; mirror X for opposite hand.",
      "panel_metres": [
        1.0,
        2.4
      ],
      "attachment_centres": [
        [
          -0.43,
          0.07,
          -0.082
        ],
        [
          0.43,
          2.3299999999999996,
          -0.082
        ]
      ],
      "infill_front_z": -0.025,
      "bounding_box": {
        "min": [
          -0.495423,
          0.045104,
          -0.164
        ],
        "max": [
          0.495423,
          2.354896,
          0.015
        ]
      },
      "triangles": 68,
      "triangle_budget": 200,
      "materials": [
        "Oak_frame"
      ]
    },
    {
      "node_name": "peg_cluster",
      "origin_rule": "Joint centre at timber face. Two tapered-looking octagonal end pegs; axis Z.",
      "bounding_box": {
        "min": [
          -0.049,
          -0.042266,
          -0.015
        ],
        "max": [
          0.046135,
          0.042266,
          0.013
        ]
      },
      "triangles": 32,
      "triangle_budget": 40,
      "materials": [
        "Oak_frame"
      ]
    },
    {
      "node_name": "bressummer_1m",
      "origin_rule": "Top reference: X endpoints \u00b10.5, Y=0 top, Z=0 timber face.",
      "length_metres": 1,
      "butt_join": "Repeat every 1.0 X; vine endpoints at Y=-0.13, Z=0.007 with matching tangents.",
      "bounding_box": {
        "min": [
          -0.50669,
          -0.26,
          -0.18
        ],
        "max": [
          0.50669,
          0.0,
          0.02
        ]
      },
      "triangles": 544,
      "triangle_budget": 600,
      "materials": [
        "Oak_frame"
      ]
    },
    {
      "node_name": "joist_end",
      "origin_rule": "Back top centre at wall; projects Z=0..0.45.",
      "projection_metres": 0.45,
      "end_grain": "Irregular growth rings and two fine drying checks at projecting cut face.",
      "bounding_box": {
        "min": [
          -0.085,
          -0.19,
          0.0
        ],
        "max": [
          0.085,
          0.0,
          0.4505
        ]
      },
      "triangles": 70,
      "triangle_budget": 80,
      "materials": [
        "Oak_frame",
        "Oak_frame_grey",
        "Wrought_iron"
      ]
    },
    {
      "node_name": "jetty_bracket",
      "origin_rule": "Top at jetty underside Y=0; back plane Z=0; projects +Z 0.47; drops 0.68.",
      "bounding_box": {
        "min": [
          -0.095,
          -0.68,
          0.0
        ],
        "max": [
          0.091944,
          0.0,
          0.47
        ]
      },
      "triangles": 140,
      "triangle_budget": 400,
      "materials": [
        "Oak_frame"
      ]
    },
    {
      "node_name": "window_leaded",
      "origin_rule": "Bottom centre of clear opening, exterior wall plane Z=0.",
      "opening": {
        "width": 0.7,
        "height": 1,
        "wall_thickness": 0.2,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "hinge_axis": "+Y",
      "clear_opening_note": "Outer surround extends outside opening. Generated studs align with outer jamb edges; do not add a second surround.",
      "bounding_box": {
        "min": [
          -0.47,
          -0.0945,
          -0.2
        ],
        "max": [
          0.47,
          1.09,
          0.112
        ]
      },
      "triangles": 1076,
      "triangle_budget": 2500,
      "materials": [
        "Leaded_glass",
        "Oak_frame",
        "Wrought_iron"
      ],
      "children": [
        {
          "node_name": "window_leaded_casement_left",
          "translation": [
            -0.3479999899864197,
            0.004000000189989805,
            -0.04699999839067459
          ],
          "hinge_axis": "+Y",
          "triangles": 428
        },
        {
          "node_name": "window_leaded_casement_right",
          "translation": [
            0.3479999899864197,
            0.004000000189989805,
            -0.04699999839067459
          ],
          "hinge_axis": "+Y",
          "triangles": 428
        }
      ]
    },
    {
      "node_name": "window_leaded_stone",
      "origin_rule": "Bottom centre of clear opening, exterior wall plane Z=0.",
      "opening": {
        "width": 0.7,
        "height": 1,
        "wall_thickness": 0.5,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "hinge_axis": "+Y",
      "clear_opening_note": "Outer surround extends outside opening. Generated studs align with outer jamb edges; do not add a second surround.",
      "bounding_box": {
        "min": [
          -0.56,
          -0.115,
          -0.5
        ],
        "max": [
          0.56,
          1.215,
          0.2
        ]
      },
      "triangles": 1356,
      "triangle_budget": 2500,
      "materials": [
        "Dressed_limestone",
        "Leaded_glass",
        "Oak_frame",
        "Wrought_iron"
      ],
      "children": [
        {
          "node_name": "window_leaded_stone_casement_left",
          "translation": [
            -0.3479999899864197,
            0.004000000189989805,
            -0.04699999839067459
          ],
          "hinge_axis": "+Y",
          "triangles": 428
        },
        {
          "node_name": "window_leaded_stone_casement_right",
          "translation": [
            0.3479999899864197,
            0.004000000189989805,
            -0.04699999839067459
          ],
          "hinge_axis": "+Y",
          "triangles": 428
        }
      ]
    },
    {
      "node_name": "window_small",
      "origin_rule": "Bottom centre of clear opening, exterior wall plane Z=0.",
      "opening": {
        "width": 0.45,
        "height": 0.55,
        "wall_thickness": 0.2,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "hinge_axis": "+Y",
      "clear_opening_note": "Outer surround extends outside opening. Generated studs align with outer jamb edges; do not add a second surround.",
      "bounding_box": {
        "min": [
          -0.345,
          -0.0945,
          -0.2
        ],
        "max": [
          0.345,
          0.64,
          0.112
        ]
      },
      "triangles": 636,
      "triangle_budget": 1200,
      "materials": [
        "Leaded_glass",
        "Oak_frame",
        "Wrought_iron"
      ],
      "children": [
        {
          "node_name": "window_small_casement_left",
          "translation": [
            -0.22300000488758087,
            0.004000000189989805,
            -0.04699999839067459
          ],
          "hinge_axis": "+Y",
          "triangles": 416
        }
      ]
    },
    {
      "node_name": "door_plank",
      "origin_rule": "Bottom centre of 1.0 \u00d7 2.0 clear opening, exterior Z=0.",
      "opening": {
        "width": 1,
        "height": 2,
        "wall_thickness": 0.5,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "hinge_axis": "+Y",
      "bounding_box": {
        "min": [
          -0.65,
          -0.11,
          -0.48
        ],
        "max": [
          0.65,
          2.15,
          0.24
        ]
      },
      "triangles": 1012,
      "triangle_budget": 3000,
      "materials": [
        "Door_paint",
        "Dressed_limestone",
        "Oak_frame",
        "Wrought_iron"
      ],
      "children": [
        {
          "node_name": "door_plank_leaf",
          "translation": [
            -0.49399998784065247,
            0.006000000052154064,
            -0.054999999701976776
          ],
          "hinge_axis": "+Y",
          "triangles": 836
        }
      ]
    },
    {
      "node_name": "door_arched_double",
      "origin_rule": "Bottom centre of 1.8 wide arch; spring Y=1.70, crown Y=2.60.",
      "opening": {
        "width": 1.8,
        "height": 2.6,
        "wall_thickness": 0.5,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "spring_height": 1.7,
      "arch_radius": 0.9,
      "hinge_axis": "+Y",
      "bounding_box": {
        "min": [
          -1.159986,
          -0.104,
          -0.515
        ],
        "max": [
          1.159986,
          2.852227,
          0.255
        ]
      },
      "triangles": 1864,
      "triangle_budget": 3500,
      "materials": [
        "Door_paint",
        "Dressed_limestone",
        "Oak_frame",
        "Wrought_iron"
      ],
      "children": [
        {
          "node_name": "door_arched_double_left",
          "translation": [
            -0.8949999809265137,
            0.0,
            -0.061000000685453415
          ],
          "hinge_axis": "+Y",
          "triangles": 568
        },
        {
          "node_name": "door_arched_double_right",
          "translation": [
            0.8949999809265137,
            0.0,
            -0.061000000685453415
          ],
          "hinge_axis": "+Y",
          "triangles": 568
        }
      ]
    },
    {
      "node_name": "window_shop",
      "origin_rule": "Bottom centre of 1.8 \u00d7 1.4 opening; counter pivot at sill.",
      "opening": {
        "width": 1.8,
        "height": 1.4,
        "wall_thickness": 0.2,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "shutter_open_rotation_x_degrees": 90,
      "hinge_axis": "+X",
      "shutter_note": "Rotate child +90\u00b0 X from closed vertical to horizontal outward counter.",
      "bounding_box": {
        "min": [
          -1.02,
          -0.12,
          -0.225
        ],
        "max": [
          1.02,
          1.525,
          0.088
        ]
      },
      "triangles": 1272,
      "triangle_budget": 2500,
      "materials": [
        "Oak_frame",
        "Wrought_iron"
      ],
      "children": [
        {
          "node_name": "window_shop_counter",
          "translation": [
            0.0,
            0.00800000037997961,
            0.03799999877810478
          ],
          "hinge_axis": "+X",
          "triangles": 744
        }
      ]
    },
    {
      "node_name": "tile_a",
      "origin_rule": "Centre of head/top edge, underside at Y=0; X width, +Z downslope.",
      "size_metres": [
        0.165,
        0.012,
        0.265
      ],
      "course_gauge_metres": 0.1,
      "installation": "Rotate X by +roof pitch. Nominal thickness 12 mm; camber 3.5 mm; built-in lap tilt 0.16 m/m keeps courses separated. Lay heads every .10 m downslope on common plane.",
      "bounding_box": {
        "min": [
          -0.0825,
          0.0,
          0.0
        ],
        "max": [
          0.0825,
          0.0544,
          0.265
        ]
      },
      "triangles": 28,
      "triangle_budget": 30,
      "materials": [
        "Clay_tile"
      ]
    },
    {
      "node_name": "tile_b",
      "origin_rule": "Centre of head/top edge, underside at Y=0; X width, +Z downslope.",
      "size_metres": [
        0.165,
        0.012,
        0.265
      ],
      "course_gauge_metres": 0.1,
      "installation": "Rotate X by +roof pitch. Nominal thickness 12 mm; camber 3.5 mm; built-in lap tilt 0.16 m/m keeps courses separated. Lay heads every .10 m downslope on common plane.",
      "bounding_box": {
        "min": [
          -0.0825,
          0.0,
          0.0
        ],
        "max": [
          0.0825,
          0.0544,
          0.265
        ]
      },
      "triangles": 28,
      "triangle_budget": 30,
      "materials": [
        "Clay_tile"
      ]
    },
    {
      "node_name": "tile_c",
      "origin_rule": "Centre of head/top edge, underside at Y=0; X width, +Z downslope.",
      "size_metres": [
        0.165,
        0.012,
        0.265
      ],
      "course_gauge_metres": 0.1,
      "installation": "Rotate X by +roof pitch. Nominal thickness 12 mm; camber 3.5 mm; built-in lap tilt 0.16 m/m keeps courses separated. Lay heads every .10 m downslope on common plane.",
      "bounding_box": {
        "min": [
          -0.0825,
          0.0,
          0.0
        ],
        "max": [
          0.0825,
          0.0544,
          0.265
        ]
      },
      "triangles": 28,
      "triangle_budget": 30,
      "materials": [
        "Clay_tile"
      ]
    },
    {
      "node_name": "tile_d",
      "origin_rule": "Centre of head/top edge, underside at Y=0; X width, +Z downslope.",
      "size_metres": [
        0.165,
        0.012,
        0.265
      ],
      "course_gauge_metres": 0.1,
      "installation": "Rotate X by +roof pitch. Nominal thickness 12 mm; camber 3.5 mm; built-in lap tilt 0.16 m/m keeps courses separated. Lay heads every .10 m downslope on common plane.",
      "bounding_box": {
        "min": [
          -0.0825,
          0.0,
          0.0
        ],
        "max": [
          0.0825,
          0.0544,
          0.265
        ]
      },
      "triangles": 28,
      "triangle_budget": 30,
      "materials": [
        "Clay_tile_dark"
      ]
    },
    {
      "node_name": "tile_strip_a",
      "origin_rule": "Row midpoint at tile heads; nominal X span 1.32 m.",
      "tiles": 8,
      "row_width_metres": 1.32,
      "gauge_metres": 0.1,
      "jitter": "Camber, internal edge offsets and sub-mm rise baked; outer span remains 1.32.",
      "bounding_box": {
        "min": [
          -0.66,
          0.0,
          0.0
        ],
        "max": [
          0.66,
          0.0548,
          0.265
        ]
      },
      "triangles": 224,
      "triangle_budget": 240,
      "materials": [
        "Clay_tile",
        "Clay_tile_dark"
      ]
    },
    {
      "node_name": "tile_strip_b",
      "origin_rule": "Row midpoint at tile heads; nominal X span 1.32 m.",
      "tiles": 8,
      "row_width_metres": 1.32,
      "gauge_metres": 0.1,
      "jitter": "Camber, internal edge offsets and sub-mm rise baked; outer span remains 1.32.",
      "bounding_box": {
        "min": [
          -0.66,
          0.0,
          0.0
        ],
        "max": [
          0.66,
          0.0548,
          0.265
        ]
      },
      "triangles": 224,
      "triangle_budget": 240,
      "materials": [
        "Clay_tile",
        "Clay_tile_dark"
      ]
    },
    {
      "node_name": "roof_underlay",
      "origin_rule": "Head centre, top face Y=0, X \u00b10.5, Z=0..1.",
      "size_metres": [
        1,
        0.025,
        1
      ],
      "note": "Hidden dark deck; scale in X/Z to roof envelope, offset beneath tile undersides.",
      "bounding_box": {
        "min": [
          -0.5,
          -0.025,
          0.0
        ],
        "max": [
          0.5,
          0.0,
          1.0
        ]
      },
      "triangles": 12,
      "triangle_budget": 12,
      "materials": [
        "Clay_tile_dark"
      ]
    },
    {
      "node_name": "ridge_tile_round",
      "origin_rule": "Centre along ridge X; bedding shoulders below Y=0.",
      "length_metres": 0.3,
      "pitch_range_degrees": [
        50,
        60
      ],
      "nominal_pitch_degrees": 55,
      "spacing_metres": 0.255,
      "lap_metres": 0.045,
      "lap_rule": "Repeat in +X. Raised +X lip overlaps lowered -X end of next cap by 45 mm. Crown rises 32 mm along length.",
      "bounding_box": {
        "min": [
          -0.15,
          -0.231,
          -0.15
        ],
        "max": [
          0.15,
          0.071,
          0.15
        ]
      },
      "triangles": 140,
      "triangle_budget": 150,
      "materials": [
        "Clay_tile",
        "Dressed_limestone"
      ]
    },
    {
      "node_name": "verge_board_1m",
      "origin_rule": "Top face Y=0, exterior Z=0, X endpoints \u00b10.5.",
      "bounding_box": {
        "min": [
          -0.5,
          -0.13,
          -0.046
        ],
        "max": [
          0.5,
          0.0,
          0.0
        ]
      },
      "triangles": 44,
      "triangle_budget": 80,
      "materials": [
        "Oak_frame"
      ]
    },
    {
      "node_name": "rafter_end",
      "origin_rule": "Back top at eaves; pre-cut 17-degree tail, extends +Z; repeat 0.5 m along X.",
      "bounding_box": {
        "min": [
          -0.052,
          -0.235,
          -0.03
        ],
        "max": [
          0.052,
          0.0,
          0.46
        ]
      },
      "triangles": 16,
      "triangle_budget": 60,
      "materials": [
        "Oak_frame"
      ]
    },
    {
      "node_name": "dormer",
      "origin_rule": "Dormer front bottom centre at intersection with main roof; +Z toward eaves.",
      "main_roof_pitch_degrees": 55,
      "main_roof_plane": "Y = -Z * tan(55 degrees)",
      "roof_cut_polygon_XZ": [
        [
          -0.48,
          0
        ],
        [
          0.48,
          0
        ],
        [
          0.48,
          -0.6021784828603505
        ],
        [
          0,
          -1.0821784828603505
        ],
        [
          -0.48,
          -0.6021784828603505
        ]
      ],
      "roof_cut_note": "Cut all main-roof decking and tiles within polygon. Cheek bottom and rear roof edges follow main roof plane. Do not place intact main roof through dormer.",
      "casement_clear_metres": [
        0.45,
        0.55
      ],
      "bounding_box": {
        "min": [
          -0.598063,
          0.0,
          -1.091111
        ],
        "max": [
          0.598063,
          1.643511,
          0.1375
        ]
      },
      "triangles": 4532,
      "triangle_budget": 6000,
      "materials": [
        "Clay_tile",
        "Clay_tile_dark",
        "Dressed_limestone",
        "Leaded_glass",
        "Oak_frame",
        "Plaster_ochre",
        "Plaster_white",
        "Wrought_iron"
      ]
    },
    {
      "node_name": "chimney_stone",
      "origin_rule": "Bottom centre; body 0.90 X \u00d7 0.70 Z, pots reach Y=2.50.",
      "body_size_metres": [
        0.9,
        0.7
      ],
      "total_height_metres": 2.5,
      "construction": "12 irregular bed courses, dressed cap, two hollow clay pots.",
      "bounding_box": {
        "min": [
          -0.52,
          0.0,
          -0.42
        ],
        "max": [
          0.52,
          2.5,
          0.42
        ]
      },
      "triangles": 2492,
      "triangle_budget": 2500,
      "materials": [
        "Clay_tile",
        "Dressed_limestone",
        "Rubble_stone_dark"
      ]
    },
    {
      "node_name": "tavern_sign",
      "origin_rule": "Wall mounting-plate centre; bracket projects +Z, board hangs in YZ plane.",
      "board_child": "tavern_sign_board",
      "hinge_axis": "+Z",
      "projection_metres": 1.08,
      "bounding_box": {
        "min": [
          -0.052562,
          -0.67,
          0.0
        ],
        "max": [
          0.056,
          0.385,
          1.059738
        ]
      },
      "triangles": 1292,
      "triangle_budget": 2000,
      "materials": [
        "Oak_frame",
        "Sign_paint",
        "Wrought_iron"
      ],
      "children": [
        {
          "node_name": "tavern_sign_board",
          "translation": [
            0.0,
            0.05999999865889549,
            0.6200000047683716
          ],
          "hinge_axis": "+Z",
          "triangles": 724
        }
      ]
    },
    {
      "node_name": "lantern_iron",
      "origin_rule": "Centre of wall plate at Z=0; lantern projects +Z. Unlit historical iron lantern.",
      "bounding_box": {
        "min": [
          -0.14,
          -0.2225,
          0.0
        ],
        "max": [
          0.14,
          0.315,
          0.46
        ]
      },
      "triangles": 348,
      "triangle_budget": 600,
      "materials": [
        "Leaded_glass",
        "Wrought_iron"
      ]
    },
    {
      "node_name": "bench_wood",
      "origin_rule": "Ground centre; seat Y=0.5075.",
      "nominal_size_metres": [
        1.45,
        0.5075,
        0.42
      ],
      "bounding_box": {
        "min": [
          -0.725,
          0.054374,
          -0.225
        ],
        "max": [
          0.725,
          0.5075,
          0.225
        ]
      },
      "triangles": 396,
      "triangle_budget": 400,
      "materials": [
        "Oak_frame"
      ]
    },
    {
      "node_name": "barrel",
      "origin_rule": "Bottom centre, Y=0; height 0.86.",
      "diameter_metres": 0.638,
      "bounding_box": {
        "min": [
          -0.319,
          0.0,
          -0.319
        ],
        "max": [
          0.319,
          0.86,
          0.319
        ]
      },
      "triangles": 536,
      "triangle_budget": 600,
      "materials": [
        "Oak_frame",
        "Wrought_iron"
      ]
    },
    {
      "node_name": "corner_stone",
      "origin_rule": "Block centre, Y vertical; alternate bonding with generated stone courses.",
      "size_metres": [
        0.5,
        0.3,
        0.5
      ],
      "bounding_box": {
        "min": [
          -0.25,
          -0.15,
          -0.25
        ],
        "max": [
          0.25,
          0.15,
          0.25
        ]
      },
      "triangles": 44,
      "triangle_budget": 80,
      "materials": [
        "Dressed_limestone"
      ]
    }
  ],
  "total_triangles": 18726,
  "glb_bytes": 2039876,
  "material_binding": "materials.json",
  "images_embedded": 0,
  "provenance": {
    "geometry": "Original procedural authoring from supplied sheet.png; helper structure adapted from adjacent read-only Breton kit.",
    "textures": "Poly Haven CC0; see materials.json"
  }
}