diff --git a/HANDOVER.md b/HANDOVER.md index 165003a..afec519 100644 --- a/HANDOVER.md +++ b/HANDOVER.md @@ -48,6 +48,16 @@ User-GPU (AMD RX 7800 XT) langweilt sich; bei **144 Hz** (~6,9 ms/Frame) ruckelt **Objekt-Bewegen** sichtbar. three.js/WebGL (3D) läuft GPU-beschleunigt → NUR der 2D-SVG-Pfad ist CPU-gebunden. Entscheidung mit User: 2D-Plan **von SVG auf WebGL2 (GPU)** umbauen. +**Sofortlösung fürs Vorführen/Entwickeln — Chromium-App-Shell:** `npm run shell` +(`scripts/chromium-shell.sh`) startet bei Bedarf den Vite-Dev-Server (Port 5187, Polling per +`curl`) und öffnet ihn dann in einem randlosen Chromium-Fenster (`--app=…`, eigenes Profil unter +`~/.cache/cad-chromium-shell`), statt im WebKitGTK-Webview von `tauri:dev`. Chromium rendert +dieselbe Seite GPU-beschleunigt und spürbar flüssiger. Kein Ersatz für den nativen wgpu-Pfad +(`render2d`/`render3d`), aber ein schneller Weg zu einer ruckelfreien Oberfläche, solange der +Electron/CEF-Shell (siehe Notizen zu „Render path decision") noch aussteht. Läuft rein im +Browser ohne Tauri-Backend — `src/compute/index.ts` guardet den einzigen `invoke()`-Aufruf +bereits per dynamischem Import mit TS-Fallback. + **Architektur (mit User abgestimmt):** - **Hybrid:** WebGL2-Canvas rendert die schwere Geometrie (Poché-Polygone, Linien, Schraffuren, Kreise/Bögen als Segmente). **Dünne SVG-Ebene DARÜBER** behält Text (Raumstempel/Labels), diff --git a/package.json b/package.json index 5227dd0..e000200 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "tauri": "tauri", "tauri:dev": "tauri dev", "tauri:build": "tauri build", - "dump:native": "node scripts/dump-native-scene.mjs" + "dump:native": "node scripts/dump-native-scene.mjs", + "shell": "scripts/chromium-shell.sh" }, "dependencies": { "@mlightcad/libredwg-web": "^0.7.7", diff --git a/scripts/chromium-shell.sh b/scripts/chromium-shell.sh new file mode 100755 index 0000000..aa24df1 --- /dev/null +++ b/scripts/chromium-shell.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +# chromium-shell.sh — startet die CAD-Oberfläche in einem randlosen +# Chromium-App-Fenster statt im Tauri-Webview. +# +# Hintergrund: Tauris Linux-Webview ist WebKitGTK, das SVG/2D auf der CPU +# (Cairo) rastert und bei hoher Bildwiederholrate sichtbar ruckelt. Chromium +# rendert dieselbe Seite butterweich (GPU-beschleunigt). Bis ein nativer +# wgpu-Renderer oder ein Electron/CEF-Shell fertig ist, ist dieses Script der +# schnellste Weg zu einer flüssigen Oberfläche für Vorführungen/Entwicklung. +# +# Ablauf: +# 1. Prüft, ob der Vite-Dev-Server auf dem konfigurierten Port bereits +# lauscht; falls nicht, startet es ihn selbst und wartet per Polling. +# 2. Öffnet den Dev-Server im App-Modus (kein Tab/URL-Leiste) im ersten +# gefundenen Chromium-basierten Browser. +# 3. Hat es den Dev-Server selbst gestartet, beendet es ihn wieder, sobald +# das Browserfenster geschlossen wird. + +set -u + +PORT=5187 +URL="http://localhost:${PORT}" +PROFILE_DIR="${HOME}/.cache/cad-chromium-shell" + +# ── Browser-Suche (Reihenfolge wie vorgegeben) ──────────────────────────────── +BROWSER_BIN="" +for candidate in chromium chromium-browser google-chrome-stable google-chrome brave vivaldi; do + if command -v "${candidate}" >/dev/null 2>&1; then + BROWSER_BIN="${candidate}" + break + fi +done + +if [ -z "${BROWSER_BIN}" ]; then + echo "chromium-shell: kein Chromium-basierter Browser gefunden." >&2 + echo "Gesucht wurden: chromium, chromium-browser, google-chrome-stable, google-chrome, brave, vivaldi." >&2 + echo "Bitte einen dieser Browser installieren, um die flüssige App-Shell zu nutzen." >&2 + exit 1 +fi + +# ── Dev-Server sicherstellen ─────────────────────────────────────────────────── +DEV_SERVER_PID="" + +server_is_up() { + curl --silent --fail --max-time 1 --output /dev/null "${URL}" +} + +if server_is_up; then + echo "chromium-shell: Dev-Server läuft bereits auf ${URL}." +else + echo "chromium-shell: starte Vite-Dev-Server (Port ${PORT}) …" + npm run dev >/tmp/cad-chromium-shell-dev.log 2>&1 & + DEV_SERVER_PID=$! + + ATTEMPTS=0 + MAX_ATTEMPTS=60 + until server_is_up; do + ATTEMPTS=$((ATTEMPTS + 1)) + if [ "${ATTEMPTS}" -ge "${MAX_ATTEMPTS}" ]; then + echo "chromium-shell: Dev-Server antwortet nach ${MAX_ATTEMPTS}s nicht, Abbruch." >&2 + kill "${DEV_SERVER_PID}" 2>/dev/null + exit 1 + fi + sleep 1 + done + echo "chromium-shell: Dev-Server bereit." +fi + +cleanup() { + if [ -n "${DEV_SERVER_PID}" ]; then + echo "chromium-shell: beende selbst gestarteten Dev-Server (PID ${DEV_SERVER_PID}) …" + kill "${DEV_SERVER_PID}" 2>/dev/null + wait "${DEV_SERVER_PID}" 2>/dev/null + fi +} +trap cleanup EXIT + +mkdir -p "${PROFILE_DIR}" + +echo "chromium-shell: öffne ${URL} in ${BROWSER_BIN} (App-Modus) …" +"${BROWSER_BIN}" \ + --app="${URL}" \ + --user-data-dir="${PROFILE_DIR}" \ + --window-size=1600,1000 \ + >/tmp/cad-chromium-shell-browser.log 2>&1 + +# Läuft weiter, bis der Browserprozess (das App-Fenster) beendet wird; dann +# räumt der trap oben den selbst gestarteten Dev-Server auf.