{
  "schema": "forge.atom-kit.v2",
  "units": "metres",
  "up": "+Y",
  "facade_outward": "+Z",
  "facade_horizontal": "+X",
  "uv_rule": "UV0 is orthonormal surface distance in metres / material tile size. Translation preserves scale. Rotate masters as rigid units; do not rescale. For phase-continuous generated walls, use global facade coordinates.",
  "atoms": [
    {
      "node_name": "slate_a",
      "origin_rule": "Middle of top edge; top edge Z=0, down-slope +Z, underside Y=0.",
      "size_metres": [
        0.345,
        0.01,
        0.42
      ],
      "thickness_metres": 0.01,
      "bow_metres": 0.0025,
      "course_gauge_metres": 0.21,
      "roof_placement": "Course origins follow the 42..47 degree roof plane at 0.21m gauge. Rotate slate X by roof pitch minus atan(0.07) (4.0 degrees cant); offset all origins 0.018m along roof normal. Lay from eave upward; stagger X by 0.1725m. No accumulating course height.",
      "bounding_box": {
        "min": [
          -0.1725,
          0.0,
          0.0
        ],
        "max": [
          0.1725,
          0.0125,
          0.42
        ]
      },
      "triangles": 38,
      "triangle_budget": 40,
      "materials": [
        "Blue_grey_slate"
      ]
    },
    {
      "node_name": "slate_b",
      "origin_rule": "Middle of top edge; top edge Z=0, down-slope +Z, underside Y=0.",
      "size_metres": [
        0.345,
        0.011,
        0.42
      ],
      "thickness_metres": 0.011,
      "bow_metres": 0.0025,
      "course_gauge_metres": 0.21,
      "roof_placement": "Course origins follow the 42..47 degree roof plane at 0.21m gauge. Rotate slate X by roof pitch minus atan(0.07) (4.0 degrees cant); offset all origins 0.018m along roof normal. Lay from eave upward; stagger X by 0.1725m. No accumulating course height.",
      "bounding_box": {
        "min": [
          -0.1725,
          0.0,
          0.0
        ],
        "max": [
          0.1725,
          0.0135,
          0.42
        ]
      },
      "triangles": 38,
      "triangle_budget": 40,
      "materials": [
        "Blue_grey_slate"
      ]
    },
    {
      "node_name": "slate_c",
      "origin_rule": "Middle of top edge; top edge Z=0, down-slope +Z, underside Y=0.",
      "size_metres": [
        0.345,
        0.012,
        0.42
      ],
      "thickness_metres": 0.012,
      "bow_metres": 0.0025,
      "course_gauge_metres": 0.21,
      "roof_placement": "Course origins follow the 42..47 degree roof plane at 0.21m gauge. Rotate slate X by roof pitch minus atan(0.07) (4.0 degrees cant); offset all origins 0.018m along roof normal. Lay from eave upward; stagger X by 0.1725m. No accumulating course height.",
      "bounding_box": {
        "min": [
          -0.1725,
          0.0,
          0.0
        ],
        "max": [
          0.1725,
          0.0145,
          0.42
        ]
      },
      "triangles": 38,
      "triangle_budget": 40,
      "materials": [
        "Blue_grey_slate"
      ]
    },
    {
      "node_name": "slate_d",
      "origin_rule": "Middle of top edge; top edge Z=0, down-slope +Z, underside Y=0.",
      "size_metres": [
        0.345,
        0.013000000000000001,
        0.42
      ],
      "thickness_metres": 0.013000000000000001,
      "bow_metres": 0.0025,
      "course_gauge_metres": 0.21,
      "roof_placement": "Course origins follow the 42..47 degree roof plane at 0.21m gauge. Rotate slate X by roof pitch minus atan(0.07) (4.0 degrees cant); offset all origins 0.018m along roof normal. Lay from eave upward; stagger X by 0.1725m. No accumulating course height.",
      "bounding_box": {
        "min": [
          -0.1725,
          0.0,
          0.0
        ],
        "max": [
          0.1725,
          0.0155,
          0.42
        ]
      },
      "triangles": 38,
      "triangle_budget": 40,
      "materials": [
        "Blue_grey_slate"
      ]
    },
    {
      "node_name": "slate_strip_a",
      "origin_rule": "Top course edge midpoint; four slates span X=-0.69..0.69.",
      "size_metres": [
        1.38,
        0.016,
        0.424
      ],
      "course_gauge_metres": 0.21,
      "slate_count": 4,
      "jitter_metres": 0.002,
      "bounding_box": {
        "min": [
          -0.69,
          0.0,
          -0.002
        ],
        "max": [
          0.69,
          0.0155,
          0.422
        ]
      },
      "triangles": 152,
      "triangle_budget": 160,
      "materials": [
        "Blue_grey_slate"
      ]
    },
    {
      "node_name": "slate_strip_b",
      "origin_rule": "Top course edge midpoint; four slates span X=-0.69..0.69.",
      "size_metres": [
        1.38,
        0.016,
        0.424
      ],
      "course_gauge_metres": 0.21,
      "slate_count": 4,
      "jitter_metres": 0.002,
      "bounding_box": {
        "min": [
          -0.69,
          0.0,
          -0.002
        ],
        "max": [
          0.69,
          0.0155,
          0.422
        ]
      },
      "triangles": 152,
      "triangle_budget": 160,
      "materials": [
        "Blue_grey_slate"
      ]
    },
    {
      "node_name": "roof_underlay",
      "origin_rule": "Top edge middle; 1m X by 1m down-slope Z, top Y=0. Scalable backing only.",
      "size_metres": [
        1,
        0.02,
        1
      ],
      "bounding_box": {
        "min": [
          -0.5,
          -0.02,
          0.0
        ],
        "max": [
          0.5,
          0.0,
          1.0
        ]
      },
      "triangles": 12,
      "triangle_budget": 12,
      "materials": [
        "Blue_grey_slate"
      ]
    },
    {
      "node_name": "ridge_tile",
      "origin_rule": "Centre of ridge line; length along X.",
      "pitch_degrees": 44,
      "compatible_pitch_degrees": [
        42,
        47
      ],
      "mortar_bedding": true,
      "length_metres": 0.42,
      "lap_metres": 0.025,
      "bounding_box": {
        "min": [
          -0.21,
          -0.174652,
          -0.185
        ],
        "max": [
          0.21,
          0.053,
          0.185
        ]
      },
      "triangles": 140,
      "triangle_budget": 150,
      "materials": [
        "Dressed_granite",
        "Terracotta"
      ]
    },
    {
      "node_name": "quoin_long",
      "origin_rule": "Block centre; X along facade, Y vertical; alternate with 0.014 m bed joints.",
      "nominal_size_metres": [
        0.6,
        0.386,
        0.35
      ],
      "bounding_box": {
        "min": [
          -0.3,
          -0.193,
          -0.175
        ],
        "max": [
          0.3,
          0.193,
          0.175
        ]
      },
      "triangles": 44,
      "triangle_budget": 150,
      "materials": [
        "Dressed_granite"
      ]
    },
    {
      "node_name": "quoin_short",
      "origin_rule": "Block centre; X along facade, Y vertical; alternate with 0.014 m bed joints.",
      "nominal_size_metres": [
        0.35,
        0.386,
        0.65
      ],
      "bounding_box": {
        "min": [
          -0.175,
          -0.193,
          -0.325
        ],
        "max": [
          0.175,
          0.193,
          0.325
        ]
      },
      "triangles": 44,
      "triangle_budget": 150,
      "materials": [
        "Dressed_granite"
      ]
    },
    {
      "node_name": "window_std",
      "origin_rule": "Bottom centre of clear opening at outer wall plane Z=0.",
      "opening": {
        "width": 0.95,
        "height": 1.3,
        "wall_thickness": 0.38,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "full_storey": true,
      "scale_rule": "Always unit scale; use window_std on every full storey.",
      "bounding_box": {
        "min": [
          -0.715,
          -0.1025,
          -0.38
        ],
        "max": [
          0.715,
          1.45,
          0.245
        ]
      },
      "triangles": 1448,
      "triangle_budget": 3000,
      "materials": [
        "Dressed_granite",
        "Old_window_glass",
        "Weathered_zinc_iron",
        "Window_frame_paint"
      ]
    },
    {
      "node_name": "window_small",
      "origin_rule": "Bottom centre of clear opening at outer wall plane Z=0.",
      "opening": {
        "width": 0.5,
        "height": 0.7,
        "wall_thickness": 0.38,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "full_storey": false,
      "scale_rule": "Always unit scale; use window_std on every full storey.",
      "bounding_box": {
        "min": [
          -0.49,
          -0.1025,
          -0.38
        ],
        "max": [
          0.49,
          0.85,
          0.245
        ]
      },
      "triangles": 1248,
      "triangle_budget": 1500,
      "materials": [
        "Dressed_granite",
        "Old_window_glass",
        "Weathered_zinc_iron",
        "Window_frame_paint"
      ]
    },
    {
      "node_name": "shutters_std",
      "origin_rule": "Same bottom centre as window_std; mount at identical transform.",
      "fits": "window_std",
      "clear_opening_metres": [
        0.95,
        1.3
      ],
      "bounding_box": {
        "min": [
          -1.115,
          -0.0275,
          0.1025
        ],
        "max": [
          1.115,
          1.3275,
          0.208
        ]
      },
      "triangles": 952,
      "triangle_budget": 1200,
      "materials": [
        "Shutter_paint",
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "window_shop",
      "origin_rule": "Bottom centre of 2.0 x 1.9 clear opening at wall face.",
      "opening": {
        "width": 2.0,
        "height": 1.9,
        "wall_thickness": 0.38,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "fascia_name_area_metres": [
        2.3,
        0.23
      ],
      "bounding_box": {
        "min": [
          -1.255,
          -0.15,
          -0.38
        ],
        "max": [
          1.255,
          2.3875,
          0.25
        ]
      },
      "triangles": 960,
      "triangle_budget": 3500,
      "materials": [
        "Dressed_granite",
        "Old_window_glass",
        "Window_frame_paint"
      ]
    },
    {
      "node_name": "door_main",
      "origin_rule": "Bottom centre of 1.00 \u00d7 2.10 opening at outer wall plane.",
      "opening": {
        "width": 1,
        "height": 2.1,
        "wall_thickness": 0.38,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "hinge_child": "door_leaf",
      "hinge_axis": "+Y",
      "hinge_position": [
        -0.44,
        0.025,
        -0.12
      ],
      "bounding_box": {
        "min": [
          -0.845,
          -0.21,
          -0.38
        ],
        "max": [
          0.845,
          2.4225,
          0.65
        ]
      },
      "triangles": 1884,
      "triangle_budget": 4000,
      "materials": [
        "Door_paint",
        "Dressed_granite",
        "Old_window_glass",
        "Weathered_zinc_iron",
        "Window_frame_paint"
      ],
      "children": [
        {
          "node_name": "door_leaf",
          "translation": [
            -0.4399999976158142,
            0.02500000037252903,
            -0.11999999731779099
          ],
          "origin_rule": "Hinge line; rotate about local Y.",
          "triangles": 960
        }
      ]
    },
    {
      "node_name": "door_back",
      "origin_rule": "Bottom centre at wall face.",
      "opening": {
        "width": 0.9,
        "height": 2.1,
        "wall_thickness": 0.38,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "hinge_axis": "+Y",
      "bounding_box": {
        "min": [
          -0.65,
          -0.15,
          -0.38
        ],
        "max": [
          0.65,
          2.26,
          0.43
        ]
      },
      "triangles": 1260,
      "triangle_budget": 2500,
      "materials": [
        "Door_paint",
        "Dressed_granite",
        "Weathered_zinc_iron",
        "Window_frame_paint"
      ],
      "children": [
        {
          "node_name": "door_back_leaf",
          "translation": [
            -0.3970000147819519,
            0.02500000037252903,
            -0.11999999731779099
          ],
          "origin_rule": "Hinge line; rotate about local Y.",
          "triangles": 512
        }
      ]
    },
    {
      "node_name": "door_double",
      "origin_rule": "Bottom centre of segmental opening at wall face.",
      "opening": {
        "width": 1.6,
        "height": 2.4,
        "wall_thickness": 0.38,
        "bottom_center": [
          0,
          0,
          0
        ]
      },
      "spring_height_metres": 2.16,
      "arch_rise_metres": 0.24,
      "hinge_axis": "+Y",
      "hinge_children": [
        "door_double_left",
        "door_double_right"
      ],
      "bounding_box": {
        "min": [
          -1.05,
          -0.14,
          -0.38
        ],
        "max": [
          1.05,
          2.618153,
          0.45
        ]
      },
      "triangles": 1316,
      "triangle_budget": 3500,
      "materials": [
        "Door_paint",
        "Dressed_granite",
        "Weathered_zinc_iron",
        "Window_frame_paint"
      ],
      "children": [
        {
          "node_name": "door_double_left",
          "translation": [
            -0.7620000243186951,
            0.02500000037252903,
            -0.11999999731779099
          ],
          "origin_rule": "Hinge line; rotate about local Y.",
          "triangles": 188
        },
        {
          "node_name": "door_double_right",
          "translation": [
            0.7620000243186951,
            0.02500000037252903,
            -0.11999999731779099
          ],
          "origin_rule": "Hinge line; rotate about local Y.",
          "triangles": 188
        }
      ]
    },
    {
      "node_name": "dormer",
      "origin_rule": "Bottom centre of dormer front at main wall eaves: Y=0, facade Z=0.",
      "window_opening_metres": [
        0.85,
        1.1
      ],
      "window_is_scaled_standard": false,
      "nominal_width_metres": 1.3,
      "main_roof_pitch_degrees": 44,
      "main_roof_plane": "Y = -Z * tan(44 degrees)",
      "roof_cut_polygon_XZ": [
        [
          -0.65,
          0
        ],
        [
          0.65,
          0
        ],
        [
          0.65,
          -1.4497424393067975
        ],
        [
          0,
          -2.0997424393067976
        ],
        [
          -0.65,
          -1.4497424393067975
        ]
      ],
      "roof_cut_note": "Remove underlying main-roof slates and decking inside this polygon; use included valley strips; front is at eaves.",
      "bounding_box": {
        "min": [
          -0.697098,
          0.0,
          -2.120037
        ],
        "max": [
          0.697098,
          2.105698,
          0.286
        ]
      },
      "triangles": 4532,
      "triangle_budget": 8000,
      "materials": [
        "Blue_grey_slate",
        "Dressed_granite",
        "Granite_lime_moss",
        "Old_window_glass",
        "Terracotta",
        "Weathered_zinc_iron",
        "Window_frame_paint"
      ]
    },
    {
      "node_name": "chimney_stack",
      "origin_rule": "Bottom centre; nominal stack 1.00 X \u00d7 0.70 Z; pots reach Y=2.00.",
      "nominal_body_size_metres": [
        1,
        0.7
      ],
      "total_height_metres": 2,
      "bounding_box": {
        "min": [
          -0.585,
          0.0055,
          -0.425
        ],
        "max": [
          0.585,
          2.0,
          0.425
        ]
      },
      "triangles": 844,
      "triangle_budget": 2500,
      "materials": [
        "Dressed_granite",
        "Terracotta",
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "gutter_1m",
      "origin_rule": "Centre of back rim; X length, trough below Y=0, projects +Z.",
      "length_metres": 1,
      "open_ends": true,
      "inner_radius_metres": 0.077,
      "sheet_thickness_metres": 0.003,
      "rolled_bead_radius_metres": 0.006,
      "assembly": "Rim Y=eave_height-0.06; back rim Z=eave_tip_Z-0.035. Slates discharge 35mm into trough. Never attach at roof-plane height. Brackets every 0.5m, plus terminal caps and one outlet.",
      "bounding_box": {
        "min": [
          -0.5,
          -0.08,
          0.0
        ],
        "max": [
          0.5,
          0.006,
          0.172
        ]
      },
      "triangles": 156,
      "triangle_budget": 250,
      "materials": [
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "gutter_bracket",
      "origin_rule": "Same datum as gutter_1m; place at 0.5m intervals, 0.10m from ends.",
      "spacing_metres": 0.5,
      "bounding_box": {
        "min": [
          -0.017,
          -0.135,
          -0.018
        ],
        "max": [
          0.017,
          0.015,
          0.177
        ]
      },
      "triangles": 168,
      "triangle_budget": 250,
      "materials": [
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "gutter_end_cap",
      "origin_rule": "Gutter terminal X plane. Place at either run end with shared rim datum.",
      "bounding_box": {
        "min": [
          -0.003,
          -0.08,
          0.006
        ],
        "max": [
          0.003,
          0.0,
          0.166
        ]
      },
      "triangles": 48,
      "triangle_budget": 250,
      "materials": [
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "gutter_outlet",
      "origin_rule": "Shared gutter rim datum; throat descends below bowl.",
      "drain_hole_radius_metres": 0.043,
      "assembly": "Assembler must remove a circular opening of radius 0.043m in gutter bottom at outlet. Viewer demo clips that opening in the gutter mesh before instancing the outlet.",
      "bounding_box": {
        "min": [
          -0.062,
          -0.19,
          0.024
        ],
        "max": [
          0.062,
          -0.035,
          0.148
        ]
      },
      "triangles": 144,
      "triangle_budget": 250,
      "materials": [
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "downpipe_1m",
      "origin_rule": "Bottom on wall face; Y=0..1; pipe centre Z=0.086.",
      "length_metres": 1,
      "open_ends": true,
      "bounding_box": {
        "min": [
          -0.05,
          0.0,
          0.008
        ],
        "max": [
          0.05,
          1.0,
          0.136
        ]
      },
      "triangles": 172,
      "triangle_budget": 250,
      "materials": [
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "downpipe_shoe",
      "origin_rule": "Wall/ground datum; inlet Y=.26; shoe discharges outward at Z=.24.",
      "open_ends": true,
      "bounding_box": {
        "min": [
          -0.048,
          -0.010305,
          0.04
        ],
        "max": [
          0.048,
          0.26,
          0.255857
        ]
      },
      "triangles": 128,
      "triangle_budget": 250,
      "materials": [
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "fascia_1m",
      "origin_rule": "Middle of top back edge, length along X.",
      "length_metres": 1,
      "bounding_box": {
        "min": [
          -0.5,
          -0.16,
          0.0
        ],
        "max": [
          0.5,
          0.0,
          0.045
        ]
      },
      "triangles": 44,
      "triangle_budget": 250,
      "materials": [
        "Window_frame_paint"
      ]
    },
    {
      "node_name": "verge_board_1m",
      "origin_rule": "Middle of top back edge, length along X.",
      "length_metres": 1,
      "bounding_box": {
        "min": [
          -0.5,
          -0.12,
          0.0
        ],
        "max": [
          0.5,
          0.0,
          0.035
        ]
      },
      "triangles": 44,
      "triangle_budget": 250,
      "materials": [
        "Window_frame_paint"
      ]
    },
    {
      "node_name": "lantern",
      "origin_rule": "Centre of wall mounting plate on facade face Z=0.",
      "bounding_box": {
        "min": [
          -0.14,
          -0.3725,
          0.0
        ],
        "max": [
          0.14,
          0.12,
          0.43
        ]
      },
      "triangles": 288,
      "triangle_budget": 600,
      "materials": [
        "Old_window_glass",
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "tavern_sign",
      "origin_rule": "Centre of wrought iron wall mounting plate, Z=0.",
      "paint_slot": "Sign_paint",
      "board_name_area_metres": [
        0.6,
        0.43
      ],
      "bounding_box": {
        "min": [
          -0.055,
          -0.6375,
          0.0
        ],
        "max": [
          0.055,
          0.18,
          0.942728
        ]
      },
      "triangles": 636,
      "triangle_budget": 1500,
      "materials": [
        "Sign_paint",
        "Weathered_zinc_iron"
      ]
    },
    {
      "node_name": "bench_stone",
      "origin_rule": "Ground centre at wall plane; 1.6m along X; seat projects +Z.",
      "length_metres": 1.6,
      "seat_height_metres": 0.52,
      "bounding_box": {
        "min": [
          -0.8,
          0.0,
          0.05
        ],
        "max": [
          0.8,
          0.52,
          0.53
        ]
      },
      "triangles": 132,
      "triangle_budget": 400,
      "materials": [
        "Dressed_granite"
      ]
    }
  ],
  "total_triangles": 17100,
  "glb_bytes": 1845768,
  "material_binding": "materials.json",
  "images_embedded": 0
}