[object Object]

← back to Quadrille Showroom

CEILING: replace crude 64px procedural grid (read as a wireframe) with a clean, bright, EVEN soft warm off-white gallery ceiling + two slim emissive recessed warm-light strips (no light cost, no harsh lines). Reads like a real gallery ceiling. FPS 72, errorCount 0

7dcf8466e6e625b78762d785058e01af7eabaa0c · 2026-06-27 12:25:53 -0700 · Steve

Files touched

Diff

commit 7dcf8466e6e625b78762d785058e01af7eabaa0c
Author: Steve <steve@designerwallcoverings.com>
Date:   Sat Jun 27 12:25:53 2026 -0700

    CEILING: replace crude 64px procedural grid (read as a wireframe) with a clean, bright, EVEN soft warm off-white gallery ceiling + two slim emissive recessed warm-light strips (no light cost, no harsh lines). Reads like a real gallery ceiling. FPS 72, errorCount 0
---
 public/js/showroom.js | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/public/js/showroom.js b/public/js/showroom.js
index 2120e1e..aa6d00e 100644
--- a/public/js/showroom.js
+++ b/public/js/showroom.js
@@ -378,14 +378,26 @@ function buildRoom() {
   }));
   floorMesh.rotation.x = -Math.PI/2; floorMesh.receiveShadow = true; scene.add(floorMesh);
 
-  // Ceiling
-  const cc = document.createElement('canvas'); cc.width = 64; cc.height = 64;
-  const cx = cc.getContext('2d'); cx.fillStyle = '#d5d5cd'; cx.fillRect(0,0,64,64);
-  cx.strokeStyle = '#b8b8b0'; cx.lineWidth = 1;
-  for (let i = 0; i <= 2; i++) { cx.beginPath(); cx.moveTo(i*32,0); cx.lineTo(i*32,64); cx.stroke(); cx.beginPath(); cx.moveTo(0,i*32); cx.lineTo(64,i*32); cx.stroke(); }
-  const ct = srgb(new THREE.CanvasTexture(cc)); ct.wrapS = ct.wrapT = THREE.RepeatWrapping; ct.repeat.set(6,5);
-  const ceil = new THREE.Mesh(new THREE.PlaneGeometry(W, D), new THREE.MeshLambertMaterial({ map: ct }));
-  ceil.rotation.x = Math.PI/2; ceil.position.y = H; scene.add(ceil);
+  // Ceiling — clean, bright, EVEN soft warm off-white gallery ceiling. (Was a crude
+  // 64px procedural grid that read as a wireframe — see REVIEW.md.) No texture, no
+  // harsh lines: a flat matte panel in a soft warm off-white so it reads as a real
+  // gallery ceiling. Lambert keeps it cheap and reflection-free.
+  const ceil = new THREE.Mesh(
+    new THREE.PlaneGeometry(W, D),
+    new THREE.MeshLambertMaterial({ color: 0xf2eee5 }) // soft warm off-white
+  );
+  ceil.rotation.x = Math.PI/2; ceil.position.y = H; ceil.receiveShadow = false; scene.add(ceil);
+
+  // Two slim recessed warm-light strips running front→back, set just below the ceiling
+  // plane — emissive (self-lit, no light cost) so they read as soft linear coves, the
+  // calm "this is a real gallery ceiling" cue without any hard grid lines.
+  const stripMat = new THREE.MeshBasicMaterial({ color: 0xfff6e6 });
+  [-W * 0.22, W * 0.22].forEach(sx => {
+    const strip = new THREE.Mesh(new THREE.PlaneGeometry(0.10, D * 0.78), stripMat);
+    strip.rotation.x = Math.PI / 2;
+    strip.position.set(sx, H - 0.012, 0);
+    scene.add(strip);
+  });
 
   // Walls — capture the 3 main surfaces so a focused pattern can clad them
   roomWalls = [

← bb93cda WALL realism: derive subtle normal+roughness maps from wall-  ·  back to Quadrille Showroom  ·  CONTACT GROUNDING: soft radial-gradient contact shadows on t c49c3db →