v0.4.3: lucht op de grond (grounded skybox) met gras en schaduw; webserver verplicht
- core/skybox.js: panorama op de grond geprojecteerd (port GroundedSkybox), grastextuur in cirkel rond het object met overvloeiing, zon met schaduw, camera niet onder de grond - woning: maaiveld als instelling (standaard 350 mm onder bovenkant vloer) - assets opgeschoond (alleen grass.jpg + skybox.webp), skybox-data.js weg - start.sh + melding bij file:// Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
3a4b9608c0
commit
f8da490640
+16
-9
@@ -302,6 +302,7 @@ function mountHouseEditor(container, callbacks) {
|
||||
let beplatingVisible = true, isolatieVisible = true, lampenVisible = true;
|
||||
let fullRender = false;
|
||||
let skyOn = Skybox.isOn();
|
||||
const skyEnv = Skybox.createEnvironment(scene);
|
||||
|
||||
// Weergave-filter (core/view-filter.js). Beplating = wandplaten, vloer-
|
||||
// en plafondplaten, dakleer en boeideel/daktrim.
|
||||
@@ -320,17 +321,17 @@ function mountHouseEditor(container, callbacks) {
|
||||
|
||||
// Volle render: avondscène, lampen en spots als echte lichtbronnen.
|
||||
let lightsGroup = null;
|
||||
// Lucht (core/skybox.js): alleen in de gewone weergave (de volle render is
|
||||
// een avondscène). De sandwichpanelen zitten in de grond: met lucht aan
|
||||
// zijn ze niet zichtbaar.
|
||||
// Lucht en gras (core/skybox.js): alleen in de gewone weergave (de volle
|
||||
// render is een avondscène). Het gras ligt op het maaiveld, dus het
|
||||
// ingegraven deel van vloer en sandwichpanelen verdwijnt eronder.
|
||||
function applyRenderMode() {
|
||||
if (fullRender) scene.background = new THREE.Color(0x0b0f18);
|
||||
else Skybox.apply(scene, skyOn, 0x1a1a1a, () => skyOn && !fullRender);
|
||||
if (parts && parts.sandwichGroup) parts.sandwichGroup.visible = beplatingVisible && !(skyOn && !fullRender);
|
||||
const sky = skyOn && !fullRender;
|
||||
scene.background = new THREE.Color(fullRender ? 0x0b0f18 : 0x1a1a1a);
|
||||
Skybox.apply(sky, { env: skyEnv, controls, sun: dirLight, shadowRoot: houseGroup });
|
||||
ambient.intensity = fullRender ? 0.1 : 0.6;
|
||||
dirLight.intensity = fullRender ? 0.12 : 0.8;
|
||||
ground.visible = fullRender;
|
||||
grid.visible = !fullRender && !skyOn;
|
||||
grid.visible = !fullRender && !sky;
|
||||
if (lightsGroup) { scene.remove(lightsGroup); lightsGroup = null; }
|
||||
// De nep-lichtbundels (kegels) alleen in de snelle weergave; in de
|
||||
// volle render schijnt er echt licht.
|
||||
@@ -758,7 +759,8 @@ function mountHouseEditor(container, callbacks) {
|
||||
section('Trasraam', 'bricks', toggle('hs-trasraam', 'Trasraam', st.trasraam.enabled, { hint: 'Cement-gebonden plaat onderaan de gevel' }) +
|
||||
(st.trasraam.enabled ? num('hs-trasraam-h', 'Hoogte', st.trasraam.height, { step: 10, hint: 'Vanaf bovenkant vloer' }) : '')),
|
||||
section('Sandwichpanelen', 'bounding-box', toggle('hs-sandwich', 'Rondom woning', st.sandwich,
|
||||
{ hint: `${SandwichModel.PANEL_WIDTH_MM} × ${SandwichModel.PANEL_LENGTH_MM} × ${SandwichModel.THICK_MM} mm, vanaf bovenkant vloer ${SandwichModel.DEPTH_MM} mm de grond in` }))) },
|
||||
{ hint: `${SandwichModel.PANEL_WIDTH_MM} × ${SandwichModel.PANEL_LENGTH_MM} × ${SandwichModel.THICK_MM} mm, vanaf bovenkant vloer ${SandwichModel.DEPTH_MM} mm naar beneden` })) +
|
||||
section('Maaiveld', 'tree', num('hs-ground', 'Onder bovenkant vloer', st.groundLevel, { step: 10, hint: 'Hoogte van het gras in de 3D-weergave met Lucht aan' }))) },
|
||||
{ key: 'constructie', label: 'Regelwerk', icon: 'columns-gap', html: cols(
|
||||
section('Buitenwanden', 'bricks', num('hs-ext-min', 'Afstand min.', sp.exterior.min, { step: 10, hint: 'Hart-op-hart stijlen' }) + num('hs-ext-max', 'Afstand max.', sp.exterior.max, { step: 10, hint: 'Hart-op-hart stijlen' })),
|
||||
section('Binnenwanden', 'distribute-horizontal', num('hs-int-min', 'Afstand min.', sp.interior.min, { step: 10, hint: 'Hart-op-hart stijlen' }) + num('hs-int-max', 'Afstand max.', sp.interior.max, { step: 10, hint: 'Hart-op-hart stijlen' }))) },
|
||||
@@ -773,6 +775,7 @@ function mountHouseEditor(container, callbacks) {
|
||||
UI.onToggle('hs-trasraam', v => { st.trasraam.enabled = v; }, rerender);
|
||||
UI.onToggle('hs-sandwich', v => { st.sandwich = v; }, rerender);
|
||||
UI.onNum('hs-trasraam-h', v => { st.trasraam.height = v; }, after, pos);
|
||||
UI.onNum('hs-ground', v => { if (v >= 0) st.groundLevel = v; }, after);
|
||||
UI.onNum('hs-ext-min', v => { sp.exterior.min = v; }, after, pos);
|
||||
UI.onNum('hs-ext-max', v => { sp.exterior.max = v; }, after, pos);
|
||||
UI.onNum('hs-int-min', v => { sp.interior.min = v; }, after, pos);
|
||||
@@ -863,12 +866,16 @@ function mountHouseEditor(container, callbacks) {
|
||||
if (parts.sandwichGroup) houseGroup.add(parts.sandwichGroup);
|
||||
if (parts.lightingGroup) houseGroup.add(parts.lightingGroup);
|
||||
scene.add(houseGroup);
|
||||
applyRenderMode();
|
||||
|
||||
const bx0 = Math.min(...parts.rects.map(r => r.x0)), bx1 = Math.max(...parts.rects.map(r => r.x1));
|
||||
const bz0 = Math.min(...parts.rects.map(r => r.z0)), bz1 = Math.max(...parts.rects.map(r => r.z1));
|
||||
const cx = (bx0 + bx1) / 2 * toM, cz = (bz0 + bz1) / 2 * toM;
|
||||
grid.position.set(cx, 0, cz);
|
||||
// Maaiveld: settings.groundLevel onder het loopvlak (bovenkant vloer).
|
||||
const groundY = (Math.max(...parts.units.map(u => u.layout.floorTop)) - state.settings.groundLevel) * toM;
|
||||
skyEnv.setPlacement(cx, groundY, cz);
|
||||
ground.position.set(cx, groundY - 0.002, cz);
|
||||
applyRenderMode();
|
||||
if (!cameraFitted) {
|
||||
const size = Math.max(bx1 - bx0, bz1 - bz0) * toM;
|
||||
controls.target.set(cx, 1.2, cz);
|
||||
|
||||
Reference in New Issue
Block a user