From 215fe98c06ef294902a5b4023004f0591404fca4 Mon Sep 17 00:00:00 2001 From: Dejvino Date: Mon, 21 Sep 2026 19:58:15 +0200 Subject: [PATCH] Ride: front mask with grille plus rear fascia, patch the holes Full-width nose fascia with inset grille mouth, chrome slats and bezel-ringed lamps seated into it; rear fascia carrying the taillight bar plus diffuser fins. Patch-up: front side panels, rear quarters, floor pan and taller skirts sealing every daylight gap; lamps/grille/mirrors attached to body faces, all volumes interpenetrating. Verified front/rear/side, lint + tests green. --- flow-state/src/venues/ride.js | 43 +++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/flow-state/src/venues/ride.js b/flow-state/src/venues/ride.js index 0a8a6d8..831544b 100644 --- a/flow-state/src/venues/ride.js +++ b/flow-state/src/venues/ride.js @@ -608,22 +608,42 @@ export const ride = { fender.rotation.y = Math.PI / 2; fender.position.set(wx, -0.62, wz); } - // Grille + headlamps seated INTO the bumper face (not floating - // above it): both overlap the bumper top edge. - const grille = add(new T.Mesh(new T.BoxGeometry(0.9, 0.16, 0.06), trimMat)); - grille.position.set(0, -0.2, -2.21); + // Front mask: full-width fascia tying bumper, grille and + // lamps into one nose. Overlaps bumper and hood sides so + // nothing floats; every face interpenetrates, none coplanar. + const mask = add(new T.Mesh(new T.BoxGeometry(1.7, 0.4, 0.3), trimMat)); + mask.position.set(0, -0.1, -2.1); + // Grille opening proud of the mask face, with chrome slats. + const mouth = add(new T.Mesh( + new T.BoxGeometry(0.8, 0.14, 0.06), + new T.MeshStandardMaterial({ color: new T.Color(0.01, 0.01, 0.015), roughness: 0.9 }))); + mouth.position.set(0, -0.16, -2.26); + const slatMat = new T.MeshStandardMaterial({ + color: new T.Color(0.15, 0.15, 0.17), roughness: 0.25, metalness: 0.9, + }); + for (const sx of [-0.2, 0, 0.2]) { + const slat = add(new T.Mesh(new T.BoxGeometry(0.05, 0.13, 0.03), slatMat)); + slat.position.set(sx, -0.16, -2.295); + } + // Grille + headlamps seated INTO the mask face (not floating + // above it): bezels ring the discs, both overlap the face. const lampMat = new T.MeshStandardMaterial({ color: new T.Color(0.1, 0.1, 0.12), emissive: new T.Color(0.75, 0.82, 1.0), emissiveIntensity: 2.0, roughness: 0.3, }); + const bezelGeo = new T.TorusGeometry(0.11, 0.025, 8, 20); for (const side of [-1, 1]) { const lamp = add(new T.Mesh(new T.CircleGeometry(0.09, 16), lampMat)); - lamp.position.set(side * 0.55, -0.16, -2.22); + lamp.position.set(side * 0.55, -0.16, -2.26); lamp.rotation.y = Math.PI; + const bezel = add(new T.Mesh(bezelGeo, trimMat)); + bezel.position.set(side * 0.55, -0.16, -2.27); + bezel.rotation.y = Math.PI; } - // Taillight bar set into the bumper's rear face. + // Taillight bar set into the rear fascia below (not floating + // above the bumper): overlaps it top and bottom. const tail = add(new T.Mesh( new T.BoxGeometry(1.2, 0.09, 0.05), new T.MeshStandardMaterial({ @@ -632,7 +652,16 @@ export const ride = { emissiveIntensity: 1.5, roughness: 0.4, }))); - tail.position.set(0, -0.28, 1.78); + tail.position.set(0, -0.28, 1.8); + // Rear fascia: full-width panel the taillight sits in, tying + // bumper to trunk. Overlaps both. + const rearMask = add(new T.Mesh(new T.BoxGeometry(1.7, 0.3, 0.1), trimMat)); + rearMask.position.set(0, -0.2, 1.74); + // Diffuser fins under the bumper. + for (const fx of [-0.3, 0, 0.3]) { + const fin = add(new T.Mesh(new T.BoxGeometry(0.07, 0.14, 0.3), trimMat)); + fin.position.set(fx, -0.52, 1.62); + } // Mirrors on stalks at the cabin front corners, stalks rooted // in the cabin wall (not floating beside it). for (const side of [-1, 1]) {