Fenster/Tür 3D: tiefer, Detailgrad im 3D, kein Fenster→Tür-Umschalten
Nutzer-Feedback:
- Fenster wirkten im 3D flach: die Rahmen-Einbautiefe wurde fälschlich aus
frameThickness (Profil-Breite, ~6 cm) statt aus der Wanddicke bestimmt.
Jetzt füllt der Rahmen die VOLLE Wanddicke (tiefe Laibung), die Scheibe
ist eine dünne Tafel mittig darin → plastische Fenster mit sichtbarer
Laibung. frameDepth übersteuert weiterhin.
- Detailgrad grob/mittel/fein wirkt jetzt auch im 3D: grob = nur Loch +
Scheibe, mittel = Rahmen (+Oberlicht-Kämpfer), fein = zusätzlich
Flügel-Mittelpfosten/Kämpfer-Sprossen. Durchgereicht App → Viewport3D →
Wasm3DViewport → useWasm3dRenderer → projectToModel3d({detail}).
- Fenster↔Tür-Umschalter im Objekt-Info entfernt (nur noch Anzeige): die
Gattung wird beim Platzieren festgelegt, nicht nachträglich getauscht.
+1 Test (Detailgrad-Gating grob/mittel/fein). tsc + vitest grün.
This commit is contained in:
@@ -47,7 +47,7 @@ import {
|
||||
import { MaterialRuntime } from "../materials/runtime";
|
||||
import { Wasm3DViewport } from "./Wasm3DViewport";
|
||||
import type { Pick3dHit } from "./Wasm3DViewport";
|
||||
import type { RenderMode, View3d } from "../ui/TopBar";
|
||||
import type { DetailLevel, RenderMode, View3d } from "../ui/TopBar";
|
||||
import type { ToolDraft } from "../tools/types";
|
||||
import { applyAngleConstraint } from "../tools/snapping";
|
||||
import { drawingGripVertices, drawingMoveAnchor } from "./drawingGrips";
|
||||
@@ -143,6 +143,7 @@ export function Viewport3D(
|
||||
project={props.project}
|
||||
view3d={props.view3d}
|
||||
renderMode={props.renderMode}
|
||||
detail={props.detail}
|
||||
gridVisible={gridVisible}
|
||||
groundElevation={props.gridElevation}
|
||||
onToggleGrid={onToggleGrid}
|
||||
@@ -210,6 +211,8 @@ function ThreeViewport3D({
|
||||
* schwarze Kantenlinien, tiefen-getestet → Hidden-Line-Look). Default shaded.
|
||||
*/
|
||||
renderMode?: RenderMode;
|
||||
/** Detailgrad (grob/mittel/fein) — reicht die Öffnungs-Details ins wgpu-Modell. */
|
||||
detail?: DetailLevel;
|
||||
/**
|
||||
* Render-Entscheidung je Geschoss-ID (Darstellungsmodus „Zeichnungsebenen").
|
||||
* Ohne Angabe werden alle sichtbaren Geschosse normal gezeigt.
|
||||
|
||||
@@ -46,7 +46,7 @@ import { useEffect, useRef, useState } from "react";
|
||||
import type { Project, Wall, Drawing2D, Ceiling, Vec2 } from "../model/types";
|
||||
import { ceilingVerticalExtent, wallVerticalExtent } from "../model/wall";
|
||||
import { projectToModel3d, pickGeometry, TRUCK_MESH_READY_EVENT } from "../plan/toWalls3d";
|
||||
import type { RenderMode, View3d } from "../ui/TopBar";
|
||||
import type { DetailLevel, RenderMode, View3d } from "../ui/TopBar";
|
||||
import { t } from "../i18n";
|
||||
import { useWasm3dRenderer } from "./useWasm3dRenderer";
|
||||
import type { Camera3d } from "./useWasm3dRenderer";
|
||||
@@ -288,6 +288,7 @@ export function Wasm3DViewport({
|
||||
project,
|
||||
view3d = "perspective",
|
||||
renderMode = "shaded",
|
||||
detail = "fein",
|
||||
gridVisible = true,
|
||||
groundElevation = 0,
|
||||
onToggleGrid,
|
||||
@@ -308,6 +309,8 @@ export function Wasm3DViewport({
|
||||
/** Darstellungsart (Oberleiste) — alle fünf Werte wirken hier, s.
|
||||
* Datei-Kommentar. */
|
||||
renderMode?: RenderMode;
|
||||
/** Detailgrad (grob/mittel/fein) — steuert die Öffnungs-Rahmen/Sprossen im 3D. */
|
||||
detail?: DetailLevel;
|
||||
/** Boden-Referenzraster sichtbar? Umgeschaltet über den Overlay-Button unten
|
||||
* rechts im Viewport (`onToggleGrid`) — Single Source of Truth ist der
|
||||
* Aufrufer (App/viewSlice `grid3dVisible`), diese Komponente spiegelt nur. */
|
||||
@@ -382,6 +385,8 @@ export function Wasm3DViewport({
|
||||
onEditEndRef.current = onEditEnd;
|
||||
const groundElevationRef = useRef(groundElevation);
|
||||
groundElevationRef.current = groundElevation;
|
||||
const detailRef = useRef(detail);
|
||||
detailRef.current = detail;
|
||||
const {
|
||||
render,
|
||||
updateModel,
|
||||
@@ -414,9 +419,9 @@ export function Wasm3DViewport({
|
||||
// Snapshot) — nur das `view3d`-Effekt unten springt aktiv auf ein Praeset.
|
||||
useEffect(() => {
|
||||
if (!ready) return;
|
||||
updateModel(project);
|
||||
updateModel(project, detail);
|
||||
redrawRef.current();
|
||||
}, [ready, project, updateModel]);
|
||||
}, [ready, project, detail, updateModel]);
|
||||
|
||||
// truck-Extrusionen (s. toWalls3d.ts emitExtrudedSolids): die WASM-Extrusion
|
||||
// läuft asynchron und ist beim ersten `updateModel` oben typischerweise noch
|
||||
@@ -425,7 +430,7 @@ export function Wasm3DViewport({
|
||||
useEffect(() => {
|
||||
if (!ready) return;
|
||||
const onMeshReady = () => {
|
||||
updateModel(projectRef.current);
|
||||
updateModel(projectRef.current, detailRef.current);
|
||||
redrawRef.current();
|
||||
};
|
||||
window.addEventListener(TRUCK_MESH_READY_EVENT, onMeshReady);
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import type { Project } from "../model/types";
|
||||
import { projectToModel3d } from "../plan/toWalls3d";
|
||||
import type { DetailLevel } from "../ui/TopBar";
|
||||
import { loadEngine3d } from "../engine/engine3d";
|
||||
import { decodeMaterialTextures } from "./materialTextures";
|
||||
|
||||
@@ -166,12 +167,13 @@ export function useWasm3dRenderer(
|
||||
// geändert haben (updateModel läuft bei JEDER Projektänderung).
|
||||
const materialSigRef = useRef<string | null>(null);
|
||||
|
||||
/** Modell bei Projektänderung neu setzen (re-extrudiert in Rust). */
|
||||
const updateModel = useCallback((project: Project) => {
|
||||
/** Modell bei Projektänderung neu setzen (re-extrudiert in Rust). `detail`
|
||||
* steuert den Öffnungs-Detailgrad (grob/mittel/fein) im 3D wie im Grundriss. */
|
||||
const updateModel = useCallback((project: Project, detail?: DetailLevel) => {
|
||||
const r = rendererRef.current;
|
||||
if (!r || !project) return;
|
||||
try {
|
||||
r.set_model(JSON.stringify(projectToModel3d(project)));
|
||||
r.set_model(JSON.stringify(projectToModel3d(project, { detail })));
|
||||
} catch (e) {
|
||||
console.warn("render3d set_model fehlgeschlagen:", e);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user