Natives 2D/3D live: Webview pusht Szene/Waende per Tauri-Command

Die nativen wgpu-Fenster spiegeln jetzt das LIVE-Modell statt des
eingefrorenen JSON-Snapshots: die Webview schiebt bei jeder Aenderung
(debounced 200 ms) den sichtbaren Plan (planToRenderScene) bzw. die
Projekt-Waende (projectToWalls3d) per push_native_scene/push_native_walls
an einen EventLoopProxy<UserEvent> der winit-Loop. Ansicht wird nur neu
eingepasst, solange im Fenster noch nicht gepannt/gezoomt/orbitiert
wurde; die JSON-Assets bleiben Start-Fallback. Ohne Tauri: No-op.
This commit is contained in:
2026-07-02 20:10:38 +02:00
parent 19f99382f6
commit 128c04a5d0
4 changed files with 228 additions and 20 deletions
+42 -9
View File
@@ -14,17 +14,50 @@ async fn compute_joins(
Ok(geometry::compute_joins(input))
}
// Live-Spiegelung: die Webview schiebt bei jeder Modellaenderung (debounced)
// die aktuelle 2D-Szene bzw. die 3D-Waende hierher; native.rs stellt sie ueber
// einen EventLoopProxy in die winit-Loop zu. Die Payload kommt als rohes JSON
// (`serde_json::Value`) an und wird erst in native.rs in die render2d-/render3d-
// Typen deserialisiert — so existieren beide Commands unter EINEM cfg, egal
// welche Feature-Kombination gebaut wird.
#[cfg(any(feature = "native2d", feature = "native3d"))]
#[tauri::command]
fn push_native_scene(scene: serde_json::Value) {
#[cfg(feature = "native2d")]
native::push_scene(scene);
#[cfg(not(feature = "native2d"))]
let _ = scene;
}
#[cfg(any(feature = "native2d", feature = "native3d"))]
#[tauri::command]
fn push_native_walls(walls: serde_json::Value) {
#[cfg(feature = "native3d")]
native::push_walls(walls);
#[cfg(not(feature = "native3d"))]
let _ = walls;
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.setup(|_app| {
// Native GPU-Fenster (2D und/oder 3D je nach Feature) auf einem eigenen
// Thread hochfahren, damit der Tauri-/GTK-Hauptthread frei bleibt.
#[cfg(any(feature = "native2d", feature = "native3d"))]
native::spawn();
Ok(())
})
.invoke_handler(tauri::generate_handler![compute_joins])
let builder = tauri::Builder::default().setup(|_app| {
// Native GPU-Fenster (2D und/oder 3D je nach Feature) auf einem eigenen
// Thread hochfahren, damit der Tauri-/GTK-Hauptthread frei bleibt.
#[cfg(any(feature = "native2d", feature = "native3d"))]
native::spawn();
Ok(())
});
#[cfg(any(feature = "native2d", feature = "native3d"))]
let builder = builder.invoke_handler(tauri::generate_handler![
compute_joins,
push_native_scene,
push_native_walls
]);
#[cfg(not(any(feature = "native2d", feature = "native3d")))]
let builder = builder.invoke_handler(tauri::generate_handler![compute_joins]);
builder
.run(tauri::generate_context!())
.expect("error while running tauri application");
}