Skip to content

walls: add configurable curtain wall systems - #905

Merged
wass08 merged 22 commits into
pascalorg:mainfrom
sudhir9297:feat/curtain-walls
Sep 23, 2026
Merged

wass08 merged 22 commits into
pascalorg:mainfrom
sudhir9297:feat/curtain-walls

Conversation

@sudhir9297

@sudhir9297 sudhir9297 commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

  • Adds curtain walls as a configurable wall type with stick and unitized construction, capped and structural-glazing frame styles, adjustable grids, spandrels, per-panel glass/solid/empty overrides, glass appearance controls, and frame materials driven by the paint tool.
  • Supports straight and curved curtain walls, transparent shadow geometry, floor-plan rendering, and rectangular, rounded, and arched door/window openings with adaptive perimeter frames.
  • Keeps slider and handle edits on live mesh overrides until commit, constrains openings to their host, preserves undo/redo as one history step, and optimizes dense grids and resize-time geometry work.
  • Keeps curtain-specific rendering in the built-in wall node while exposing generic viewer geometry and material adapters, with schema compatibility and curtain-wall documentation.
  • Adds contextual help for selected doors and windows: holding Shift enables one-sided corner-radius adjustment, and the floating shortcut panel shows the Shift hint.

How to test

  1. Run bun run checks and bun run build; both should complete successfully.
  2. Run bun run dev, open http://localhost:3002, create several walls, and switch their wall type to Curtain wall.
  3. Exercise stick/unitized construction, every framing style, count/maximum-spacing/fixed-spacing grids, grid alignment, spandrels, panel overrides, glass tint, opacity, and roughness; the mesh should update smoothly and undo/redo should restore each committed edit.
  4. Use the paint tool on curtain frames and verify the selected scene or library material appears on the frame without changing the glass.
  5. Add doors and windows with rectangular, rounded, and arched openings, resize and move them, then test the same combinations on curved walls; the perimeter frame and glass cutout should follow the opening without seams or stale geometry.
  6. Select a single door or window and verify the floating shortcut panel shows the Shift hint; hold Shift and adjust one side’s corner radius.
  7. Test full-height and cutaway wall modes and orbit the camera; transparent panes should transmit light while mullions, spandrels, and solid panels cast shadows.

Screenshots / screen recording

Curtain wall variations

Checklist

  • I've tested this locally with bun dev
  • My code follows the existing code style (run bun check to verify)
  • I've updated relevant documentation (if applicable)
  • This PR targets the main branch

Note

Medium Risk
Large surface area across wall rendering, opening placement, and editor handle/drag behavior; regressions could affect standard walls, undo, or door/window sizing on non-curtain hosts if constraints leak.

Overview
Introduces curtain walls as a first-class wall type: schema (wallType: 'curtain', CurtainWallConfig), panel UI, stick/unitized layout, materials/paint roles, 3D geometry (including curved walls and dense grids), floorplan shapes, and a viewer wall geometry adapter for openings, shadows, and live previews.

Doors and windows on curtain hosts get perimeter-aware sizing/placement (constrainCurtainOpening, arc-length wall math), shaped opening frames in the curtain mesh, and a shared property preview path so sliders/handles update live overrides and commit as a single undo step. SliderControl gains cancel/escape, optional preview-while-typing, and pointer-loss cleanup.

The editor adds a corner-radius handle type (Shift for per-corner radii on openings), wired into door/window definitions plus contextual Shift help. Minor tooling: ignore .next-*, Biome exclude, lints script. Door panel drops the documentation section and uses preview-based dimension sliders.

Reviewed by Cursor Bugbot for commit 73eefdc. Bugbot is set up for automated code reviews on this repo. Configure here.

@pascal

pascal Bot commented Sep 22, 2026

Copy link
Copy Markdown

I hit an error while handling your request (Model unavailable on AI Gateway free tier: Free tier users do not have access to this model. Upgrade to paid credits at https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%3Fmodal%3Dtop-up for unrestricted…).

Please try again, rephrase, or reach out if it keeps failing.

Error id: f639cf86-11ae-4239-bb94-2c7e2ba0b67c

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/door/panel.tsx

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/wall/curtain-wall-panel.tsx
Comment thread packages/nodes/src/wall/curtain-opening-frame.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/shared/opening-property-preview.ts Outdated
Comment thread packages/nodes/src/wall/curtain-wall-adapter.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/wall/curtain-wall-adapter.ts Outdated
Comment thread packages/nodes/src/shared/curtain-opening-limits.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/door/door-math.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/door/floorplan-affordances.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/shared/curtain-opening-limits.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/wall/curtain-wall-geometry.ts
Comment thread packages/nodes/src/door/door-math.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/wall/curtain-panel-highlight.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/nodes/src/wall/curtain-wall-panel.tsx
Comment thread packages/nodes/src/door/door-math.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/editor/src/components/ui/controls/slider-control.tsx
- Add curtain wall schema, grid layouts, panels, and openings
- Render curtain walls in 3D and floor plans with material painting
- Add editor controls, previews, and coverage tests
- Add panel layout diagram and spacing summaries
- Improve frame dimensions and glass appearance controls
- Preserve painted glass and simplify wall finish handling
- Constrain door and window sizing within curtain wall clearances
- Add live property previews and panel highlighting
- Improve curtain wall grid navigation and tint editing
- Merge continuous stick members and cull shared faces
- Preserve hosted opening cuts and live shaped-opening performance
- Add viewer adapter for curtain wall geometry
- Decouple opening previews from core scene stores
- Fix rectangular opening frame bounds
- Add corner-radius handles with Shift-based individual rounding
- Improve curtain-wall cutouts, preview rebuilds, and shadow updates

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

if (!shadowMesh) return
const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material]
shadowMesh.geometry.dispose()
shadowMesh.geometry = buildCurtainWallShadowGeometry(geometry, isOpaque(materials[1]))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Curtain shadow mesh never created

High Severity

syncAuxiliaryGeometry only updates an existing curtain-wall-shadow child and never creates one. Nothing else in the app mounts that mesh, so curtain walls never get the opaque frame/spandrel caster. Glass panes then cast or drop shadows with the main wall mesh instead of transmitting light.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 063ee7a. Configure here.

})
}
max={limits?.height ?? 1000}
min={Math.min(1, limits?.height ?? 1)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inspector sliders block opening recovery

Medium Severity

Door width (and the matching window size sliders) cap at limits.width / limits.height, the in-place centered span. For a flush or off-center curtain opening that value is 0 or smaller than the current size, so the slider clamps every edit before constrainCurtainOpening can slide the opening back into the perimeter band.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 063ee7a. Configure here.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

There are 3 total unresolved issues (including 2 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 73eefdc. Configure here.

precision={2}
restoreOnCommit={false}
step={0.05}
step={0.01}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preview sliders ignore repeated arrows

Medium Severity

Door and window dimension sliders now preview through live overrides while still binding value to the document node. SliderControl arrow-key nudges apply a step to that frozen value, so repeat ArrowUp/ArrowDown does not accumulate and a nudge after typing jumps back to the committed size.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 73eefdc. Configure here.

@wass08
wass08 merged commit 6e5be33 into pascalorg:main Sep 23, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants