{
  "schema": "forge.atom-kit.v1",
  "units": "metres",
  "up": "+Y",
  "facade_outward": "+Z",
  "facade_horizontal": "+X",
  "wall_thickness_metres": 0.35,
  "storey_height_metres": 3,
  "uv_rule": "UV0 = orthonormal surface metres / shelf tile_size_metres. Do not repeat/divide again. Global facade U,V for generated walls. All masters have identity transforms.",
  "atoms": [
    {
      "node_name": "window_tall",
      "origin_rule": "Bottom centre on facade outer plane; X horizontal, Y up, +Z outward.",
      "sill_height_metres": 0.1,
      "sill_bedding_relief_metres": 0.044,
      "storey_rule": "Same master on all storeys; never scale height.",
      "opening": {
        "width": 1.2,
        "height": 2.4,
        "wall_thickness": 0.35,
        "bottom_center": [
          0,
          0,
          0
        ],
        "meaning": "Assembler clear wall cutout. Frame/lining occupy its perimeter; visible glass is smaller."
      },
      "triangles": 684,
      "triangle_budget": 2000,
      "bounding_box": {
        "min": [
          -0.625,
          -0.044,
          -0.35
        ],
        "max": [
          0.625,
          2.4,
          0.095
        ]
      },
      "materials": [
        "Bronze_aluminium",
        "Glass_clear",
        "Steel_dark"
      ]
    },
    {
      "node_name": "window_std",
      "origin_rule": "Bottom centre on facade outer plane; X horizontal, Y up, +Z outward.",
      "sill_height_metres": 0.9,
      "sill_bedding_relief_metres": 0.044,
      "storey_rule": "Same master on all storeys; never scale height.",
      "opening": {
        "width": 1.2,
        "height": 1.5,
        "wall_thickness": 0.35,
        "bottom_center": [
          0,
          0,
          0
        ],
        "meaning": "Assembler clear wall cutout. Frame/lining occupy its perimeter; visible glass is smaller."
      },
      "triangles": 684,
      "triangle_budget": 2000,
      "bounding_box": {
        "min": [
          -0.625,
          -0.044,
          -0.35
        ],
        "max": [
          0.625,
          1.5,
          0.095
        ]
      },
      "materials": [
        "Bronze_aluminium",
        "Glass_clear",
        "Steel_dark"
      ]
    },
    {
      "node_name": "window_ribbon_1m",
      "origin_rule": "Left edge of run, bottom on facade; X=0..1. Repeat at exactly 1 m.",
      "sill_bedding_relief_metres": 0.044,
      "joint_rule": "Left mullion only, X=0..0.05. Close right run edge with ribbon_end_mullion at X=N. Cut continuous N x 1.30 m opening.",
      "opening": {
        "width": 1,
        "height": 1.3,
        "wall_thickness": 0.35,
        "bottom_center": [
          0,
          0,
          0
        ],
        "meaning": "Assembler clear wall cutout. Frame/lining occupy its perimeter; visible glass is smaller."
      },
      "triangles": 176,
      "triangle_budget": 600,
      "bounding_box": {
        "min": [
          0.0,
          -0.035,
          -0.35
        ],
        "max": [
          1.0,
          1.3,
          0.08
        ]
      },
      "materials": [
        "Bronze_aluminium",
        "Glass_clear"
      ]
    },
    {
      "node_name": "ribbon_end_mullion",
      "origin_rule": "Right edge of ribbon opening at X=N, Y=bottom. Mullion extends toward -X.",
      "mate": "window_ribbon_1m",
      "triangles": 56,
      "triangle_budget": 80,
      "bounding_box": {
        "min": [
          -0.05,
          0.0,
          -0.35
        ],
        "max": [
          0.0,
          1.3,
          0.0
        ]
      },
      "materials": [
        "Bronze_aluminium"
      ]
    },
    {
      "node_name": "glazing_slider",
      "origin_rule": "Bottom centre on facade outer plane; X horizontal, Y up, +Z outward.",
      "threshold_height_metres": 0.055,
      "leaves": "Two overlapping tracks with central interlock, fixed exported pose.",
      "opening": {
        "width": 2.8,
        "height": 2.4,
        "wall_thickness": 0.35,
        "bottom_center": [
          0,
          0,
          0
        ],
        "meaning": "Assembler clear wall cutout. Frame/lining occupy its perimeter; visible glass is smaller."
      },
      "triangles": 884,
      "triangle_budget": 2500,
      "bounding_box": {
        "min": [
          -1.425,
          -0.044,
          -0.35
        ],
        "max": [
          1.425,
          2.4,
          0.095
        ]
      },
      "materials": [
        "Bronze_aluminium",
        "Glass_clear",
        "Steel_dark"
      ]
    },
    {
      "node_name": "door_pivot",
      "origin_rule": "Bottom centre on facade outer plane; X horizontal, Y up, +Z outward.",
      "pivot_axis": "child door_leaf rotates local +Y; pivot inset 0.16 m from left leaf edge",
      "opening": {
        "width": 1.2,
        "height": 2.4,
        "wall_thickness": 0.35,
        "bottom_center": [
          0,
          0,
          0
        ],
        "meaning": "Assembler clear wall cutout. Frame/lining occupy its perimeter; visible glass is smaller."
      },
      "triangles": 676,
      "triangle_budget": 2500,
      "bounding_box": {
        "min": [
          -0.6,
          0.0,
          -0.35
        ],
        "max": [
          0.6,
          2.4,
          0.01
        ]
      },
      "materials": [
        "Bronze_aluminium",
        "Door_paint",
        "Steel_dark"
      ],
      "children": [
        {
          "node_name": "door_leaf",
          "translation": [
            -0.39500001072883606,
            0.0,
            -0.23499999940395355
          ],
          "origin_rule": "Inset vertical pivot axis; rotate local Y."
        }
      ]
    },
    {
      "node_name": "shopfront_bay",
      "origin_rule": "Bottom centre on facade outer plane; X horizontal, Y up, +Z outward.",
      "door_clear_width_metres": 0.946,
      "door_position": "Left third",
      "note": "Frameless glass with narrow head/floor channels and patch hinges; opaque reflective material.",
      "opening": {
        "width": 3,
        "height": 3,
        "wall_thickness": 0.35,
        "bottom_center": [
          0,
          0,
          0
        ],
        "meaning": "Assembler clear wall cutout. Frame/lining occupy its perimeter; visible glass is smaller."
      },
      "triangles": 416,
      "triangle_budget": 2500,
      "bounding_box": {
        "min": [
          -1.5,
          0.0,
          -0.27
        ],
        "max": [
          1.5,
          3.0,
          -0.136
        ]
      },
      "materials": [
        "Bronze_aluminium",
        "Glass_clear",
        "Steel_dark"
      ]
    },
    {
      "node_name": "balcony_steel",
      "origin_rule": "Wall centre at finished balcony floor; slab top Y=0; cantilever Z=0..1.4.",
      "width_metres": 2.4,
      "depth_metres": 1.4,
      "railing_height_metres": 1.1225,
      "slab_thickness_metres": 0.21,
      "railing_clear_spacing_max_metres": 0.095,
      "triangles": 1356,
      "triangle_budget": 3000,
      "bounding_box": {
        "min": [
          -1.2,
          -0.21,
          0.0
        ],
        "max": [
          1.2,
          1.1225,
          1.415
        ]
      },
      "materials": [
        "Concrete_boardmarked",
        "Steel_dark",
        "Zinc_coping"
      ]
    },
    {
      "node_name": "canopy_concrete",
      "origin_rule": "Wall centre at canopy upper bearing plane; top Y=0; projects +Z.",
      "width_metres": 2,
      "depth_metres": 1.4,
      "thickness_metres": 0.14,
      "triangles": 28,
      "triangle_budget": 300,
      "bounding_box": {
        "min": [
          -1.0,
          -0.14,
          0.0
        ],
        "max": [
          1.0,
          0.0,
          1.4
        ]
      },
      "materials": [
        "Concrete_boardmarked"
      ]
    },
    {
      "node_name": "parapet_coping_1m",
      "origin_rule": "Start on parapet wall centreline at top; length X=0..1; wall Z=-.175..+.175.",
      "length_metres": 1,
      "wall_thickness_metres": 0.35,
      "joint_rule": "Butt 1m runs; continuous folded cross-section. Corner atom has 0.5m legs.",
      "triangles": 36,
      "triangle_budget": 80,
      "bounding_box": {
        "min": [
          0.0,
          -0.048,
          -0.205
        ],
        "max": [
          1.0,
          0.034,
          0.205
        ]
      },
      "materials": [
        "Zinc_coping"
      ]
    },
    {
      "node_name": "parapet_corner",
      "origin_rule": "Outer 90-degree corner on intersecting wall centrelines; incoming -X, outgoing -Z.",
      "leg_length_metres": 0.5,
      "wall_thickness_metres": 0.35,
      "joint_rule": "Mate straight-run end at X=-.5; rotate outgoing run 90 degrees about Y, start at Z=-.5. Miter is continuous, no overlapping coplanar plates.",
      "triangles": 56,
      "triangle_budget": 100,
      "bounding_box": {
        "min": [
          -0.5,
          -0.048,
          -0.5
        ],
        "max": [
          0.205,
          0.034,
          0.205
        ]
      },
      "materials": [
        "Zinc_coping"
      ]
    },
    {
      "node_name": "roof_rail_1m",
      "origin_rule": "Start of railing, finished deck Y=0; X=0..1.",
      "length_metres": 1,
      "joint_rule": "Half-width 18mm end posts butt into full 36mm posts between modules. End posts are intentionally slim; no separate terminal atom is needed. Rails and base plates terminate at exact metre.",
      "triangles": 180,
      "triangle_budget": 200,
      "bounding_box": {
        "min": [
          0.0,
          0.0,
          -0.02
        ],
        "max": [
          1.0,
          1.118,
          0.08
        ]
      },
      "materials": [
        "Steel_dark"
      ]
    },
    {
      "node_name": "downpipe_square_1m",
      "origin_rule": "Bottom on facade Z=0; tube Y=0..1, centre Z=.075.",
      "length_metres": 1,
      "section_metres": 0.1,
      "joint_rule": "Stack at integer Y with matching open square ends; shoe inlet/head outlet share section and Z=.075.",
      "triangles": 56,
      "triangle_budget": 60,
      "bounding_box": {
        "min": [
          -0.056,
          0.0,
          0.0
        ],
        "max": [
          0.056,
          1.0,
          0.131
        ]
      },
      "materials": [
        "Steel_dark",
        "Zinc_coping"
      ]
    },
    {
      "node_name": "rainwater_head",
      "origin_rule": "Outlet bottom at Y=0, facade Z=0. Top Y=.389; pipe joins directly below.",
      "joint_rule": "Place at parapet; back upper opening accepts hidden gutter. Pipe top at head origin; 100mm outlet.",
      "triangles": 164,
      "triangle_budget": 200,
      "bounding_box": {
        "min": [
          -0.16,
          0.0,
          -0.025
        ],
        "max": [
          0.16,
          0.3885,
          0.209
        ]
      },
      "materials": [
        "Zinc_coping"
      ]
    },
    {
      "node_name": "downpipe_shoe",
      "origin_rule": "Wall datum at shoe low outlet centre; inlet at Y=.24, Z=.075.",
      "joint_rule": "Pipe bottom joins inlet at Y=.24. Place shoe origin at least .06m above paving.",
      "triangles": 48,
      "triangle_budget": 60,
      "bounding_box": {
        "min": [
          -0.05,
          -0.031301,
          0.025
        ],
        "max": [
          0.05,
          0.24,
          0.23
        ]
      },
      "materials": [
        "Zinc_coping"
      ]
    },
    {
      "node_name": "roof_skylight",
      "origin_rule": "Centre on finished roof; upstand starts Y=0.",
      "size_metres": [
        1.2,
        0.199,
        1.2
      ],
      "roof_cutout_metres": [
        1.02,
        1.02
      ],
      "triangles": 268,
      "triangle_budget": 400,
      "bounding_box": {
        "min": [
          -0.6,
          0.0,
          -0.6
        ],
        "max": [
          0.6,
          0.199,
          0.6
        ]
      },
      "materials": [
        "Glass_clear",
        "Steel_dark",
        "Zinc_coping"
      ]
    },
    {
      "node_name": "roof_vent",
      "origin_rule": "Centre of flashing on roof Y=0.",
      "height_metres": 0.455,
      "triangles": 140,
      "triangle_budget": 200,
      "bounding_box": {
        "min": [
          -0.18,
          0.0,
          -0.18
        ],
        "max": [
          0.18,
          0.455,
          0.18
        ]
      },
      "materials": [
        "Steel_dark",
        "Zinc_coping"
      ]
    },
    {
      "node_name": "planter_concrete",
      "origin_rule": "Bottom centre on paving; long dimension X.",
      "length_metres": 1.6,
      "planter_height_metres": 0.585,
      "vegetation": "155 deterministic closed tapered blades; COLOR_0 tints neutral Door_paint. No extra shelf names.",
      "triangles": 852,
      "triangle_budget": 1500,
      "bounding_box": {
        "min": [
          -0.8,
          0.0,
          -0.300886
        ],
        "max": [
          0.8,
          1.258189,
          0.316375
        ]
      },
      "materials": [
        "Concrete_boardmarked",
        "Door_paint",
        "Roof_gravel"
      ]
    },
    {
      "node_name": "bike_rack",
      "origin_rule": "Bottom centre on paving; three inverted-U stands across X.",
      "size_metres": [
        1.21,
        0.812,
        0.78
      ],
      "triangles": 348,
      "triangle_budget": 400,
      "bounding_box": {
        "min": [
          -0.605,
          0.0,
          -0.39
        ],
        "max": [
          0.605,
          0.808946,
          0.39
        ]
      },
      "materials": [
        "Steel_dark",
        "Zinc_coping"
      ]
    }
  ],
  "total_triangles": 7108,
  "glb_bytes": 1032532,
  "material_binding": "materials.json",
  "images_embedded": 0,
  "status": "review-only"
}