2D-Plan-Renderer auf WebGL2 (GPU) + akkumulierter Funktionsstand

Neuer GPU-Renderer fuer den Grundriss (src/plan/glPlan/): Earcut-Tessellierung
(konkav-faehig), gehrte Linienzuege (Miter), echte Papier-mm-Strichbreiten im
Massstab (repliziert den SVG-printStrokeVb-Pfad), Hybrid mit scharfem SVG-Text-
Overlay. GPU ist der Standardpfad; der SVG-Renderer bleibt automatischer Fallback,
falls WebGL2/Shader nicht verfuegbar sind. Imperativer Pan (rAF + CSS-transform)
fuer fluessige Interaktion ohne React-Re-Render je Frame.

Enthaelt zudem den bisher nicht committeten Arbeitsstand des Browser-BIM
(Oeffnungen, Treppen, Raeume, Decken, DXF-Export, Materialbibliothek, Kontext-
Import, Tauri-Compute-Boundary-PoC).
This commit is contained in:
2026-07-02 00:12:39 +02:00
parent cfe5249440
commit 3d2d4d6321
184 changed files with 29421 additions and 669 deletions
+47
View File
@@ -21,16 +21,63 @@ const wasmPath = fileURLToPath(
),
);
// opencascade.js (Welle-C-HLR-Spike) verpackt Emscripten-Glue + `.wasm` in
// `dist/`, ohne sinnvolle `exports`. Analog zu LibreDWG mappen wir zwei
// virtuelle Module auf die echten Dateien, damit Vite die (große) WASM als
// gehashtes Asset ausgibt (Dev mit korrektem MIME, Build als Asset). Der Import
// im Code ist dynamisch → die WASM bleibt aus dem Haupt-Bundle heraus.
const occtGluePath = fileURLToPath(
new URL(
"./node_modules/opencascade.js/dist/opencascade.wasm.js",
import.meta.url,
),
);
const occtWasmPath = fileURLToPath(
new URL(
"./node_modules/opencascade.js/dist/opencascade.wasm.wasm",
import.meta.url,
),
);
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
// Tauri lädt die App über den Vite-Dev-Server; dessen Logs (cargo/tauri)
// sollen nicht vom Bildschirm gewischt werden, und Tauri-eigene Env-Vars
// müssen im Client sichtbar sein.
clearScreen: false,
envPrefix: ["VITE_", "TAURI_ENV_"],
resolve: {
alias: {
"virtual:libredwg-glue": gluePath,
"virtual:libredwg-wasm-url": wasmPath + "?url",
"virtual:occt-glue": occtGluePath,
"virtual:occt-wasm-url": occtWasmPath + "?url",
},
},
// Emscripten-Glue nicht vor-bündeln (esbuild kommt mit dem UMD-Wrapper +
// Node-Shims nicht klar); der dynamische Import lädt sie zur Laufzeit.
optimizeDeps: {
exclude: ["opencascade.js"],
},
server: {
host: true,
// Fester Port für die Tauri-Integration (tauri.conf.json zeigt hierauf).
port: 5187,
strictPort: true,
// ambientCG-Proxy: Die Such-JSON (`/api/...`) und der Download-Starter
// (`/get`, ein 302-Redirect) senden KEINE CORS-Header und sind daher aus
// dem Browser nicht direkt abrufbar. Der Dev-Proxy reicht `/ambientcg/*`
// an `https://ambientcg.com` durch (Redirects werden gefolgt), sodass der
// Live-Browse ohne separaten Server funktioniert. Für Prod eine analoge
// Proxy-Route bereitstellen und via `VITE_AMBIENTCG_PROXY` konfigurieren.
proxy: {
"/ambientcg": {
target: "https://ambientcg.com",
changeOrigin: true,
followRedirects: true,
rewrite: (path: string) => path.replace(/^\/ambientcg/, ""),
},
},
},
});