229169cea1
- native.rs: EINE winit-EventLoop hostet 2D- und 3D-Fenster (winit erlaubt nur eine Loop pro Prozess) — loest den RecreationAttempt-Panic zweier Loops; ersetzt native2d.rs/native3d.rs. Feature-gegated (native2d/native3d, einzeln oder zusammen). - render2d/render3d laden das ECHTE Modell aus assets/native2d_scene.json bzw. native3d_walls.json (Demo-Szene als Fallback); initialer Ausschnitt/Kamera aus den Modell-Grenzen gerahmt, initialer Redraw + gesetzte Fenstergroesse. - TS-Konverter toRenderScene/toWalls3d + scripts/dump-native-scene erzeugen die JSON aus sampleProject/generatePlan (npm run dump:native). - render2d: Scene.polylines fuer zusammenhaengende Umriss-/Zeichnungslaeufe → Gehrung statt Stumpfkappen an Wandecken/2D-Geometrien; MITER_LIMIT 4→8 (deckungsgleich mit SVG stroke-miterlimit:8 und WebGL2). - native3d-Feature + render3d-Pfad-Dep in der Tauri-Crate.
51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
// Leitet aus den Wänden eines Projekts die serialisierbaren WallInput-Records
|
|
// für den nativen render3d-Renderer ab. Matcht 1:1 render3d::types::WallInput
|
|
// { start:[x,y], end:[x,y], thickness, height, baseElevation, color:[r,g,b] }
|
|
// mit Modell-Metern und Y-up-Extrusion (Rust-Seite: plan liegt in XZ, +Y hoch).
|
|
//
|
|
// Alle Geschosse werden einbezogen und über wallVerticalExtent korrekt
|
|
// gestapelt (EG baseElevation 0, OG 2.6 …), sodass das 3D-Fenster das ganze
|
|
// Gebäude zeigt.
|
|
|
|
import type { Project } from "../model/types";
|
|
import { getWallType, wallTypeThickness } from "../model/types";
|
|
import { wallVerticalExtent } from "../model/wall";
|
|
|
|
export type RVec2 = [number, number];
|
|
export type RRgb = [number, number, number];
|
|
|
|
export interface RWall {
|
|
start: RVec2;
|
|
end: RVec2;
|
|
thickness: number;
|
|
height: number;
|
|
baseElevation: number;
|
|
color: RRgb;
|
|
}
|
|
|
|
/** Warmer, neutraler Wand-Grundton (wie render3d default). */
|
|
const WALL_RGB: RRgb = [0.82, 0.8, 0.76];
|
|
|
|
export function projectToWalls3d(project: Project): RWall[] {
|
|
const out: RWall[] = [];
|
|
for (const w of project.walls) {
|
|
let thickness = 0.2;
|
|
try {
|
|
thickness = wallTypeThickness(getWallType(project, w));
|
|
} catch {
|
|
thickness = 0.2;
|
|
}
|
|
const { zBottom, zTop } = wallVerticalExtent(project, w);
|
|
const height = Math.max(0.01, zTop - zBottom);
|
|
out.push({
|
|
start: [w.start.x, w.start.y],
|
|
end: [w.end.x, w.end.y],
|
|
thickness,
|
|
height,
|
|
baseElevation: zBottom,
|
|
color: WALL_RGB,
|
|
});
|
|
}
|
|
return out;
|
|
}
|