diff --git a/webstore/index.html b/webstore/index.html
index 06ea627..8b206c7 100644
--- a/webstore/index.html
+++ b/webstore/index.html
@@ -126,7 +126,7 @@ function slopedSide(x, ch, cd, hf, th, m) {
// Cyclorama / infinity cove — the floor curves up into the named wall(s) via a fillet of radius R,
// with a white floor lead-in, so there's no hard floor↔wall seam (the seamless studio look). Each
// wall gets one swept profile: [wall down to R] → [quarter-circle fillet] → [flat floor lead-in].
-function buildCyclorama(walls, R, lead, W, D, H, mat) {
+function buildCyclorama(walls, R, lead, W, D, H, mat, extent) {
const prof = [];
for (let i = 0; i <= 6; i++) prof.push([0, H - (H - R) * i / 6]); // wall: u=0, v H→R
for (let i = 1; i <= 12; i++) { const t = Math.PI + (Math.PI / 2) * i / 12; prof.push([R + R * Math.cos(t), R + R * Math.sin(t)]); } // fillet R→0
@@ -141,14 +141,18 @@ function buildCyclorama(walls, R, lead, W, D, H, mat) {
};
walls.forEach(wall => {
const mp = maps[wall]; if (!mp) return;
+ // east/west coves only run the cyclorama section (extent from the north wall), not the full L-shaped depth
+ let s0 = -mp.len / 2, s1 = mp.len / 2;
+ if ((wall === 'east' || wall === 'west') && extent > 0) { s0 = -D / 2; s1 = -D / 2 + extent; }
const pos = [];
- [-mp.len / 2, mp.len / 2].forEach(s => prof.forEach(([u, v]) => { const p = mp.f(s, u, v); pos.push(p[0], p[1], p[2]); }));
+ [s0, s1].forEach(s => prof.forEach(([u, v]) => { const p = mp.f(s, u, v); pos.push(p[0], p[1], p[2]); }));
const idx = [];
for (let p = 0; p < P - 1; p++) idx.push(p, P + p, p + 1, p + 1, P + p, P + p + 1);
const geo = new THREE.BufferGeometry();
geo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(pos), 3));
- geo.setIndex(idx); geo.computeVertexNormals();
- grp.add(new THREE.Mesh(geo, mat));
+ geo.setIndex(idx); geo.computeVertexNormals(); geo.computeBoundingSphere();
+ const me = new THREE.Mesh(geo, mat); me.frustumCulled = false; // big static surface — never cull it
+ grp.add(me);
});
return grp;
}
@@ -255,7 +259,7 @@ function buildScene(data) {
const R = num(sp.cyclorama_radius, 0.9);
const cmat = material(sp.cyclorama_color || '#ffffff', '#ffffff');
cmat.side = THREE.DoubleSide; cmat.roughness = 0.92; cmat.metalness = 0;
- roomGroup.add(buildCyclorama(cyc, R, Math.max(R + 0.3, 1.2), W, D, H, cmat));
+ roomGroup.add(buildCyclorama(cyc, R, Math.max(R + 0.3, 1.2), W, D, H, cmat, num(sp.cyclorama_extent, 0)));
}
// lights (data-driven + a soft ambient so it's never pitch black)