From 420bfed5e9fd51c2e3020c6ac0d6dd083d20cbd6 Mon Sep 17 00:00:00 2001 From: Matthew Gordon Date: Tue, 10 Jun 2025 11:44:43 -0300 Subject: [PATCH] Allow loading new DEM after one has already been loaded --- src/app/dem_renderer/mod.rs | 2 +- src/app/mod.rs | 8 ++++++-- src/app/raster/dem.rs | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/app/dem_renderer/mod.rs b/src/app/dem_renderer/mod.rs index 2e5abe3..91ff162 100644 --- a/src/app/dem_renderer/mod.rs +++ b/src/app/dem_renderer/mod.rs @@ -11,7 +11,7 @@ use { }; pub struct DemRenderer { - source: Rc, + pub source: Rc, pipeline: wgpu::RenderPipeline, bind_group: wgpu::BindGroup, vertex_buffer: wgpu::Buffer, diff --git a/src/app/mod.rs b/src/app/mod.rs index 890462a..86cb81b 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -158,8 +158,12 @@ impl MvuApp for App { async fn view(&mut self, model: Rc) -> Result<(), Box> { if let Some(context) = &mut self.context { context.frame_timer.mark_frame_start(); - if context.scene_data.is_none() { - if let Some(dem) = &model.dem { + if let Some(dem) = &model.dem { + if context + .scene_data + .as_ref() + .is_none_or(|scene_data| scene_data.source.id != dem.id) + { context.scene_data = Some(DemRenderer::new( dem.clone(), &context.device, diff --git a/src/app/raster/dem.rs b/src/app/raster/dem.rs index 1dc3874..4f868d1 100644 --- a/src/app/raster/dem.rs +++ b/src/app/raster/dem.rs @@ -1,4 +1,5 @@ use crate::mvu::File; +use std::sync::atomic::{AtomicU32, Ordering}; #[derive(Clone)] pub struct Dem { @@ -11,6 +12,7 @@ pub struct Dem { pub z_min: f32, pub z_max: f32, pub grid: Vec, + pub id: Id, } impl std::fmt::Debug for Dem { @@ -46,6 +48,18 @@ pub struct DemBvhLayer { pub data: Vec, } +#[derive(Clone, Eq, PartialEq)] +pub struct Id(u32); + +impl Id { + fn get_next() -> Self { + NEXT_ID.fetch_add(1, Ordering::SeqCst); + Self(NEXT_ID.load(Ordering::SeqCst)) + } +} + +static NEXT_ID: AtomicU32 = AtomicU32::new(0); + /// Find the smallest number that's larger then the input and that is also one /// less than a power of two. fn round_bound(v: u32) -> u32 { @@ -198,6 +212,7 @@ impl Dem { z_min, z_max, grid, + id: Id::get_next(), } } _ => { @@ -283,6 +298,7 @@ mod tests { z_min: z1.min(z2), z_max: z1.max(z2), grid, + id: Id::get_next() }, ) .boxed()