From 6247dcc9f50603ad5339b92ee5f2e3f5347ea172 Mon Sep 17 00:00:00 2001 From: Michael Sippel Date: Fri, 10 Sep 2021 12:53:08 +0200 Subject: [PATCH] SdfTerm: impl Observer to only update modified layers --- sdf_editor/src/main.rs | 62 ++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/sdf_editor/src/main.rs b/sdf_editor/src/main.rs index de5e7f5..c404ec9 100644 --- a/sdf_editor/src/main.rs +++ b/sdf_editor/src/main.rs @@ -75,7 +75,7 @@ struct SdfTerm { pub src_view: Option>, bg_layers: HashMap, (bool, LayerId2d)>, fg_layers: HashMap, (bool, LayerId2d)>, - font: Font, + //font: Arc>, renderer: Arc> } @@ -85,12 +85,12 @@ impl SdfTerm { src_view: None, bg_layers: HashMap::new(), fg_layers: HashMap::new(), - font: Font::from_path(Path::new("/usr/share/fonts/TTF/FiraCode-Medium.ttf"),0).unwrap(), + //font: Arc::new(RwLock::new(Font::from_path(Path::new("/usr/share/fonts/TTF/FiraCode-Medium.ttf"),0).unwrap())), renderer } } - pub fn get_order(&mut self) -> Vec { + pub fn get_order(&self) -> Vec { vec![ self.bg_layers.iter(), self.fg_layers.iter() @@ -177,7 +177,8 @@ impl SdfTerm { // foreground layer if let Some(c) = atom.c { - let mut ch = Character::from_font(&self.font, c).with_size(1.0).with_tesselation_factor(0.01); + let font = Font::from_path(Path::new("/usr/share/fonts/TTF/FiraCode-Medium.ttf"),0).unwrap(); + let mut ch = Character::from_font(&font, c).with_size(1.0).with_tesselation_factor(0.01); let (r,g,b) = atom.style.fg_color.unwrap_or((0, 0, 0)); @@ -202,14 +203,21 @@ impl SdfTerm { } } } -/* + impl Observer for SdfTerm { + fn reset(&mut self, new_view: Option>) { + self.src_view = new_view; + + for pt in self.src_view.area().unwrap_or(vec![]) { + self.notify(&pt); + } + } + fn notify(&mut self, pt: &Point2) { self.update(pt); - self.update_order(); } } -*/ + #[async_std::main] async fn main() { let term_port = ViewPort::new(); @@ -246,33 +254,21 @@ async fn main() { compositor.write().unwrap().push(color_editor.get_term_view().offset(Vector2::new(0, 0))); - let color_view = color_port.outer().get_view(); - - let cp = color_port.clone(); let tp = term_port.clone(); - - let event_loop = nakorender::winit::event_loop::EventLoop::new(); - let window = nakorender::winit::window::Window::new(&event_loop).unwrap(); - let mut renderer = Arc::new(Mutex::new(nakorender::marp::MarpBackend::new(&window, &event_loop))); - - let mut sdf_term = Arc::new(RwLock::new(SdfTerm::new(renderer.clone()))); - sdf_term.write().unwrap().src_view = term_port.outer().get_view(); - //term_port.outer().add_observer(sdf_term.clone()); - async_std::task::spawn( async move { loop { - cp.update(); - tp.update(); - match term.next_event().await { - TerminalEvent::Resize(new_size) => { + TerminalEvent::Resize(mut new_size) => { + new_size.x = 10; + new_size.y = 5; tp.inner().get_broadcast().notify_each( nested::grid::GridWindowIterator::from( Point2::new(0,0) .. Point2::new(new_size.x, new_size.y) ) ); } + TerminalEvent::Input(Event::Key(Key::Ctrl('c'))) | TerminalEvent::Input(Event::Key(Key::Ctrl('g'))) | TerminalEvent::Input(Event::Key(Key::Ctrl('d'))) => break, @@ -308,7 +304,16 @@ async fn main() { term_writer.show().await.expect("output error!"); }); - + let event_loop = nakorender::winit::event_loop::EventLoop::new(); + let window = nakorender::winit::window::Window::new(&event_loop).unwrap(); + let mut renderer = Arc::new(Mutex::new(nakorender::marp::MarpBackend::new(&window, &event_loop))); + + // terminal view + let mut sdf_term = Arc::new(RwLock::new(SdfTerm::new(renderer.clone()))); + term_port.outer().add_observer(sdf_term.clone()); + + // color preview + let color_view = color_port.outer().get_view(); let color_layer_id = renderer.lock().unwrap().new_layer_2d(); renderer.lock().unwrap().update_camera_2d(color_layer_id, Camera2d{ extent: Vec2::new(4.0, 4.0), @@ -335,11 +340,8 @@ async fn main() { window.request_redraw(); } winit::event::Event::RedrawRequested(_) => { - for pt in nested::grid::GridWindowIterator::from( - Point2::new(0, 0) .. Point2::new(30, 1) - ) { - sdf_term.write().unwrap().update(&pt); - } + color_port.update(); + term_port.update(); let c = color_view.get(); let color_stream = PrimaryStream2d::new() @@ -365,7 +367,7 @@ async fn main() { renderer.lock().unwrap().update_sdf_2d(color_layer_id, color_stream); renderer.lock().unwrap().set_layer_order( vec![ - sdf_term.write().unwrap().get_order().into_iter(), + sdf_term.read().unwrap().get_order().into_iter(), vec![ color_layer_id.into() ].into_iter() ] .into_iter()