From 6953a5733398152a2825c2d5b1e04e0de91735c3 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 28 Mar 2025 07:46:00 +0100 Subject: [PATCH] :tada: Avoid full tiles rebuild on set modifiers --- render-wasm/src/main.rs | 5 +---- render-wasm/src/render.rs | 14 ++++++++++++++ render-wasm/src/state.rs | 5 +++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/render-wasm/src/main.rs b/render-wasm/src/main.rs index ef5bbdff45..e0ef988590 100644 --- a/render-wasm/src/main.rs +++ b/render-wasm/src/main.rs @@ -613,10 +613,7 @@ pub extern "C" fn set_modifiers() { for entry in entries { state.modifiers.insert(entry.id, entry.transform); } - // TODO: Do a more specific rebuild of tiles. For - // example: using only the selected shapes to rebuild - // the tiles affected by the selected shapes. - state.rebuild_tiles(); + state.rebuild_modifier_tiles(); }); } diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 0a1f775739..c53bcee72b 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -844,6 +844,20 @@ impl RenderState { } } + pub fn rebuild_modifier_tiles( + &mut self, + tree: &mut HashMap, + modifiers: &HashMap, + ) { + for (uuid, matrix) in modifiers { + if let Some(shape) = tree.get(uuid) { + let mut shape = shape.clone(); + shape.apply_transform(matrix); + self.update_tile_for(&shape); + } + } + } + pub fn get_scale(&self) -> f32 { self.viewbox.zoom() * self.options.dpr() } diff --git a/render-wasm/src/state.rs b/render-wasm/src/state.rs index 347880513c..41872e7b06 100644 --- a/render-wasm/src/state.rs +++ b/render-wasm/src/state.rs @@ -111,4 +111,9 @@ impl<'a> State<'a> { self.render_state .rebuild_tiles(&mut self.shapes, &self.modifiers); } + + pub fn rebuild_modifier_tiles(&mut self) { + self.render_state + .rebuild_modifier_tiles(&mut self.shapes, &self.modifiers); + } }