From ebf1f35eaaceeffc5d6fd526fcb77d50a3d19b0d Mon Sep 17 00:00:00 2001 From: core Date: Wed, 8 Nov 2023 15:05:11 -0500 Subject: [PATCH] font rendering --- nexrad-browser/Cargo.toml | 3 + nexrad-browser/src/equirectangular.rs | 10 --- nexrad-browser/src/fonts/Hermit-Regular.otf | Bin 0 -> 40040 bytes nexrad-browser/src/lib.rs | 2 - nexrad-browser/src/{ => rendering}/colors.rs | 4 +- nexrad-browser/src/rendering/mod.rs | 3 +- nexrad-browser/src/scope.rs | 64 +++++++++++++++++-- nexrad-browser/www/NXRD.ttf | Bin 0 -> 8124 bytes nexrad-browser/www/index.html | 5 ++ 9 files changed, 71 insertions(+), 20 deletions(-) delete mode 100644 nexrad-browser/src/equirectangular.rs create mode 100644 nexrad-browser/src/fonts/Hermit-Regular.otf rename nexrad-browser/src/{ => rendering}/colors.rs (98%) create mode 100644 nexrad-browser/www/NXRD.ttf diff --git a/nexrad-browser/Cargo.toml b/nexrad-browser/Cargo.toml index 7bcb64e..c9906cf 100644 --- a/nexrad-browser/Cargo.toml +++ b/nexrad-browser/Cargo.toml @@ -28,6 +28,9 @@ raw-window-handle = "0.5" wasm-bindgen-futures = "0.4" bytemuck = { version = "1", features = ["derive"]} +# Text rendering # +wgpu_glyph = { git = "https://github.com/hecrj/wgpu_glyph" } + [dependencies.js-sys] version = "0.3" diff --git a/nexrad-browser/src/equirectangular.rs b/nexrad-browser/src/equirectangular.rs deleted file mode 100644 index f385bb3..0000000 --- a/nexrad-browser/src/equirectangular.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub const EARTH_RADIUS_MILES: f64 = 3958.8; - -pub fn latlong_to_xy(lat: f64, long: f64) -> (f64, f64) { - // x = r λ cos(φ0) - // y = r φ - ( - EARTH_RADIUS_MILES * long * lat.cos(), - EARTH_RADIUS_MILES * lat, - ) -} diff --git a/nexrad-browser/src/fonts/Hermit-Regular.otf b/nexrad-browser/src/fonts/Hermit-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..feb19370c46658a5eb7ee2a060f99213ab409e15 GIT binary patch literal 40040 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 &'static str { } } -pub fn rgb_to_srgb(c: u32) -> [f32; 3] { +pub fn rgb_to_srgb(c: u32, a: f32) -> [f32; 4] { let f = |xu: u32| { let x = (xu & 0xFF) as f32 / 255.0; if x > 0.04045 { @@ -220,5 +220,5 @@ pub fn rgb_to_srgb(c: u32) -> [f32; 3] { x / 12.92 } }; - [f(c >> 16), f(c >> 8), f(c)] + [f(c >> 16), f(c >> 8), f(c), a] } \ No newline at end of file diff --git a/nexrad-browser/src/rendering/mod.rs b/nexrad-browser/src/rendering/mod.rs index 348fb7a..222b41d 100644 --- a/nexrad-browser/src/rendering/mod.rs +++ b/nexrad-browser/src/rendering/mod.rs @@ -1 +1,2 @@ -pub mod vertex; \ No newline at end of file +pub mod vertex; +pub mod colors; diff --git a/nexrad-browser/src/scope.rs b/nexrad-browser/src/scope.rs index 4882dcf..4931cb4 100644 --- a/nexrad-browser/src/scope.rs +++ b/nexrad-browser/src/scope.rs @@ -13,10 +13,13 @@ use wgpu::{ RenderPassDescriptor, StoreOp, Surface, SurfaceConfiguration, SurfaceError, TextureUsages, TextureViewDescriptor, }; -use wgpu::util::DeviceExt; +use wgpu::util::{DeviceExt, StagingBelt}; +use wgpu_glyph::ab_glyph::FontArc; +use wgpu_glyph::{GlyphBrush, GlyphBrushBuilder, HorizontalAlign, Layout, Section, Text}; use winit::dpi::PhysicalSize; use winit::event::WindowEvent; use winit::window::Window; +use crate::rendering::colors::rgb_to_srgb; use crate::rendering::vertex::{VERTICES}; pub struct ScopeState { @@ -42,7 +45,9 @@ pub struct WgpuState { pub size: PhysicalSize, pub window: Window, pub vertex_buffer: wgpu::Buffer, - pub pipeline: RenderPipeline + pub pipeline: RenderPipeline, + pub staging_belt: StagingBelt, + pub glyph_brush: GlyphBrush<()> } impl WgpuState { @@ -151,6 +156,10 @@ impl WgpuState { multiview: None, }); + let staging_belt = StagingBelt::new(1024); + let font = FontArc::try_from_slice(include_bytes!("./fonts/Hermit-Regular.otf")).unwrap(); + let mut glyph_brush = GlyphBrushBuilder::using_font(font).build(&device, surface_config.format); + Self { window, surface, @@ -159,7 +168,9 @@ impl WgpuState { surface_config, size, vertex_buffer, - pipeline: render_pipeline + pipeline: render_pipeline, + staging_belt, + glyph_brush } } @@ -193,10 +204,12 @@ impl WgpuState { label: Some("Render Encoder"), }); - let _physical_width = (self.surface_config.width as f64 * self.window.scale_factor()) as f32; - let _physical_height = + let physical_width = (self.surface_config.width as f64 * self.window.scale_factor()) as f32; + let physical_height = (self.surface_config.height as f64 * self.window.scale_factor()) as f32; + + // LOCK BLOCK { let mut render_pass = encoder.begin_render_pass(&RenderPassDescriptor { @@ -224,9 +237,50 @@ impl WgpuState { } + 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") + .with_color(rgb_to_srgb(0x32cd32, 1.0)) + .with_scale(20.0)], + ..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), + text: vec![Text::new("RADAR INOPERATIVE NO DATA LOADED") + .with_color(rgb_to_srgb(0xff0000, 1.0)) + .with_scale(26.0)], + ..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), + text: vec![Text::new("RADAR SITE") + .with_color(rgb_to_srgb(0x32cd32, 1.0)) + .with_scale(12.0)], + ..Section::default() + }.with_layout(Layout::default().h_align(HorizontalAlign::Right))); + + self.glyph_brush + .draw_queued( + &self.device, + &mut self.staging_belt, + &mut encoder, + &view, + self.surface_config.width, + self.surface_config.height, + ) + .expect("Draw queued"); + + self.staging_belt.finish(); self.queue.submit(iter::once(encoder.finish())); output.present(); + self.staging_belt.recall(); + Ok(()) } } diff --git a/nexrad-browser/www/NXRD.ttf b/nexrad-browser/www/NXRD.ttf new file mode 100644 index 0000000000000000000000000000000000000000..aae20dc53205fcbff7a28b17aee9a59c79917cac GIT binary patch literal 8124 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 E3&=(NIRF3v literal 0 HcmV?d00001 diff --git a/nexrad-browser/www/index.html b/nexrad-browser/www/index.html index 6c95dc0..e2c7943 100644 --- a/nexrad-browser/www/index.html +++ b/nexrad-browser/www/index.html @@ -23,6 +23,11 @@ padding: 0; overflow: hidden; } + + @font-face { + font-family: NXRD; + src: url(./NXRD.ttf); + }