From e889aa9dc6f090e5bee69ac0a76ff9d0fdd0b59a Mon Sep 17 00:00:00 2001 From: core Date: Wed, 8 Nov 2023 21:57:19 -0500 Subject: [PATCH] improved text rendering, slight refactor and enable dynamics --- nexrad-browser/src/command.rs | 2 +- .../src/fonts/Inconsolata-Regular.ttf | Bin 0 -> 101752 bytes nexrad-browser/src/lib.rs | 48 +------ nexrad-browser/src/rendering/mod.rs | 2 + nexrad-browser/src/{ => rendering}/scope.rs | 125 ++++++++++++------ nexrad-browser/src/rendering/time.rs | 12 ++ 6 files changed, 109 insertions(+), 80 deletions(-) create mode 100644 nexrad-browser/src/fonts/Inconsolata-Regular.ttf rename nexrad-browser/src/{ => rendering}/scope.rs (69%) create mode 100644 nexrad-browser/src/rendering/time.rs diff --git a/nexrad-browser/src/command.rs b/nexrad-browser/src/command.rs index 3cb394b..aab9e80 100644 --- a/nexrad-browser/src/command.rs +++ b/nexrad-browser/src/command.rs @@ -1,6 +1,6 @@ use crate::loadar2; use crate::mode::Mode; -use crate::scope::ScopeState; +use crate::rendering::scope::ScopeState; pub fn should_newline(state: &mut ScopeState) -> bool { diff --git a/nexrad-browser/src/fonts/Inconsolata-Regular.ttf b/nexrad-browser/src/fonts/Inconsolata-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d1241516bc2357fadd283371e34055d9b1cc89a8 GIT binary patch literal 101752 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�qnEPT11X=ckn@bDcNSYq1*MY8OvKB(de&^F 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 AbiProxy { canvas.set_width(w); canvas.set_height(h); - let render_state = WgpuState::new(window, PhysicalSize::new(w, h)).await; - - info!("initializing the scope"); - - let document = web_sys::window() - .expect("window should exist") - .document() - .expect("document should exist"); - - info!("finding form input element"); - - let file = document - .get_element_by_id("file") - .expect("file element should exist"); - let file: web_sys::HtmlInputElement = file - .dyn_into::() - .map_err(|_| ()) - .expect("file input is not an input"); - - let mut scope_state = ScopeState { - ar2: None, - scope_mode: Mode::RadarInoperative, - file_input: file, - lat: 30.48500, // jacksonville - long: -81.70200, // jacksonville - prefs: Preferences { fcs: 20 }, - command_buf: String::new(), - command_buf_response_mode: false, - new_data_available: false, - selected_elevation: 1, - show_ui: false, - wgpu: render_state, - }; + let mut scope_state = ScopeState::new(window, PhysicalSize::new(w, h)).await; let event_proxy: EventLoopProxy = event_loop.create_proxy(); @@ -113,7 +80,6 @@ pub async fn __nxrd_browser_init(w: u32, h: u32) -> AbiProxy { Event::UserEvent(e) => match e { RenderMessage::Resize { new_w, new_h } => { scope_state - .wgpu .reconfigure(PhysicalSize::new(new_w, new_h)); } }, @@ -128,14 +94,14 @@ pub async fn __nxrd_browser_init(w: u32, h: u32) -> AbiProxy { window.exit(); } WindowEvent::Resized(physical_size) => { - scope_state.wgpu.reconfigure(*physical_size); + scope_state.reconfigure(*physical_size); } WindowEvent::RedrawRequested => { - scope_state.wgpu.update(); - match scope_state.wgpu.render() { + scope_state.update(); + match scope_state.render() { Ok(_) => {} Err(SurfaceError::Lost) => { - scope_state.wgpu.reconfigure(scope_state.wgpu.size) + scope_state.reconfigure(scope_state.wgpu.size) } Err(SurfaceError::OutOfMemory) => { error!("out of memory!"); @@ -147,7 +113,7 @@ pub async fn __nxrd_browser_init(w: u32, h: u32) -> AbiProxy { _ => {} }, Event::AboutToWait => { - scope_state.wgpu.window().request_redraw(); + scope_state.window().request_redraw(); } _ => {} }, diff --git a/nexrad-browser/src/rendering/mod.rs b/nexrad-browser/src/rendering/mod.rs index 222b41d..40e88f0 100644 --- a/nexrad-browser/src/rendering/mod.rs +++ b/nexrad-browser/src/rendering/mod.rs @@ -1,2 +1,4 @@ pub mod vertex; pub mod colors; +pub mod time; +pub mod scope; diff --git a/nexrad-browser/src/scope.rs b/nexrad-browser/src/rendering/scope.rs similarity index 69% rename from nexrad-browser/src/scope.rs rename to nexrad-browser/src/rendering/scope.rs index 4931cb4..e9df051 100644 --- a/nexrad-browser/src/scope.rs +++ b/nexrad-browser/src/rendering/scope.rs @@ -3,6 +3,9 @@ use nexrad2::Nexrad2Chunk; use std::iter; +use chrono::Utc; +use log::info; +use wasm_bindgen::JsCast; use web_sys::{HtmlInputElement}; @@ -20,6 +23,7 @@ use winit::dpi::PhysicalSize; use winit::event::WindowEvent; use winit::window::Window; use crate::rendering::colors::rgb_to_srgb; +use crate::rendering::time::zulu; use crate::rendering::vertex::{VERTICES}; pub struct ScopeState { @@ -50,7 +54,7 @@ pub struct WgpuState { pub glyph_brush: GlyphBrush<()> } -impl WgpuState { +impl ScopeState { pub async fn new(window: Window, size: PhysicalSize) -> Self { let instance = Instance::new(InstanceDescriptor { backends: Backends::all(), @@ -112,7 +116,7 @@ impl WgpuState { let shader = device.create_shader_module(ShaderModuleDescriptor { label: Some("Shader"), - source: ShaderSource::Wgsl(include_str!("./shader.wgsl").into()), + source: ShaderSource::Wgsl(include_str!("../shader.wgsl").into()), }); let render_pipeline_layout = device.create_pipeline_layout(&PipelineLayoutDescriptor { @@ -157,10 +161,10 @@ impl WgpuState { }); let staging_belt = StagingBelt::new(1024); - let font = FontArc::try_from_slice(include_bytes!("./fonts/Hermit-Regular.otf")).unwrap(); + let font = FontArc::try_from_slice(include_bytes!("../fonts/Inconsolata-Regular.ttf")).unwrap(); let mut glyph_brush = GlyphBrushBuilder::using_font(font).build(&device, surface_config.format); - Self { + let wgpu = WgpuState { window, surface, device, @@ -171,19 +175,53 @@ impl WgpuState { pipeline: render_pipeline, staging_belt, glyph_brush - } + }; + + info!("initializing the scope"); + + let document = web_sys::window() + .expect("window should exist") + .document() + .expect("document should exist"); + + info!("finding form input element"); + + let file = document + .get_element_by_id("file") + .expect("file element should exist"); + let file: web_sys::HtmlInputElement = file + .dyn_into::() + .map_err(|_| ()) + .expect("file input is not an input"); + + let scope_state = ScopeState { + ar2: None, + scope_mode: Mode::RadarInoperative, + file_input: file, + lat: 30.48500, // jacksonville + long: -81.70200, // jacksonville + prefs: Preferences { fcs: 24.0 }, + command_buf: String::new(), + command_buf_response_mode: false, + new_data_available: false, + selected_elevation: 1, + show_ui: false, + wgpu, + }; + + scope_state } pub fn window(&self) -> &Window { - &self.window + &self.wgpu.window } pub fn reconfigure(&mut self, new_size: PhysicalSize) { if new_size.width > 0 && new_size.height > 0 { - self.size = new_size; - self.surface_config.width = new_size.width; - self.surface_config.height = new_size.height; - self.surface.configure(&self.device, &self.surface_config); + self.wgpu.size = new_size; + self.wgpu.surface_config.width = new_size.width; + self.wgpu.surface_config.height = new_size.height; + self.wgpu.surface.configure(&self.wgpu.device, &self.wgpu.surface_config); } } @@ -194,20 +232,19 @@ impl WgpuState { pub fn update(&mut self) {} pub fn render(&mut self) -> Result<(), SurfaceError> { - let output = self.surface.get_current_texture()?; + let output = self.wgpu.surface.get_current_texture()?; let view = output .texture .create_view(&TextureViewDescriptor::default()); let mut encoder = self - .device + .wgpu.device .create_command_encoder(&CommandEncoderDescriptor { label: Some("Render Encoder"), }); - let physical_width = (self.surface_config.width as f64 * self.window.scale_factor()) as f32; + let physical_width = (self.wgpu.surface_config.width as f64 * self.wgpu.window.scale_factor()) as f32; let physical_height = - (self.surface_config.height as f64 * self.window.scale_factor()) as f32; - + (self.wgpu.surface_config.height as f64 * self.wgpu.window.scale_factor()) as f32; // LOCK BLOCK @@ -232,59 +269,71 @@ impl WgpuState { occlusion_query_set: None, }); - render_pass.set_pipeline(&self.pipeline); + render_pass.set_pipeline(&self.wgpu.pipeline); render_pass.draw(0..3, 0..1); } - self.glyph_brush.queue(Section { - screen_position: (10.0, 10.0), - bounds: (self.surface_config.width as f32, self.surface_config.height as f32), - text: vec![Text::new("NEXRAD INOP 00:00:00Z") + // TEXT RENDERING // + let time = Utc::now(); + let line_height = self.prefs.fcs - 1.0; + + self.wgpu.glyph_brush.queue(Section { + screen_position: (10.0, 8.0), + bounds: (self.wgpu.surface_config.width as f32, self.wgpu.surface_config.height as f32), + text: vec![Text::new(&format!( + "NEXRAD {} {}", + self + .ar2 + .as_ref() + .map(|u| u.volume_header_record.icao.as_str()) + .unwrap_or("INOP"), + zulu(time) + )) .with_color(rgb_to_srgb(0x32cd32, 1.0)) - .with_scale(20.0)], + .with_scale(self.prefs.fcs)], ..Section::default() }); - self.glyph_brush.queue(Section { - screen_position: (10.0, 32.0), - bounds: (self.surface_config.width as f32, self.surface_config.height as f32), + self.wgpu.glyph_brush.queue(Section { + screen_position: (10.0, 8.0 + line_height), + bounds: (self.wgpu.surface_config.width as f32, self.wgpu.surface_config.height as f32), text: vec![Text::new("RADAR INOPERATIVE NO DATA LOADED") .with_color(rgb_to_srgb(0xff0000, 1.0)) - .with_scale(26.0)], + .with_scale(self.prefs.fcs)], ..Section::default() }); - self.glyph_brush.queue(Section { - screen_position: (self.surface_config.width as f32 - 10.0, 10.0), - bounds: (self.surface_config.width as f32, self.surface_config.height as f32), + self.wgpu.glyph_brush.queue(Section { + screen_position: (self.wgpu.surface_config.width as f32 - 10.0, 8.0), + bounds: (self.wgpu.surface_config.width as f32, self.wgpu.surface_config.height as f32), text: vec![Text::new("RADAR SITE") .with_color(rgb_to_srgb(0x32cd32, 1.0)) - .with_scale(12.0)], + .with_scale(self.prefs.fcs)], ..Section::default() }.with_layout(Layout::default().h_align(HorizontalAlign::Right))); - self.glyph_brush + self.wgpu.glyph_brush .draw_queued( - &self.device, - &mut self.staging_belt, + &self.wgpu.device, + &mut self.wgpu.staging_belt, &mut encoder, &view, - self.surface_config.width, - self.surface_config.height, + self.wgpu.surface_config.width, + self.wgpu.surface_config.height, ) .expect("Draw queued"); - self.staging_belt.finish(); - self.queue.submit(iter::once(encoder.finish())); + self.wgpu.staging_belt.finish(); + self.wgpu.queue.submit(iter::once(encoder.finish())); output.present(); - self.staging_belt.recall(); + self.wgpu.staging_belt.recall(); Ok(()) } } pub struct Preferences { - pub fcs: usize, + pub fcs: f32, } diff --git a/nexrad-browser/src/rendering/time.rs b/nexrad-browser/src/rendering/time.rs new file mode 100644 index 0000000..24f0bd0 --- /dev/null +++ b/nexrad-browser/src/rendering/time.rs @@ -0,0 +1,12 @@ +use chrono::{DateTime, Timelike, Utc}; + +pub fn time(h: usize, m: usize, s: usize, tag_end: &str) -> String { + format!("{:0>2}:{:0>2}:{:0>2}{}", h, m, s, tag_end) +} +pub fn hms(t: DateTime) -> (usize, usize, usize) { + (t.hour() as usize, t.minute() as usize, t.second() as usize) +} +pub fn zulu(t: DateTime) -> String { + let t2 = hms(t); + time(t2.0, t2.1, t2.2, "Z") +} \ No newline at end of file