From b83e6d3a0f3cd4972e8ba2748cd067ce87291166 Mon Sep 17 00:00:00 2001 From: tsuki Date: Sat, 16 Nov 2024 13:12:52 +0800 Subject: [PATCH] sync --- Cargo.lock | 2 ++ mp/Cargo.toml | 2 ++ mp/src/app.rs | 3 +- mp/src/lib.rs | 10 +++++++ mp_elements/image.png | Bin 3218 -> 71369 bytes mp_elements/shaders/ppi.wgsl | 15 ++++++---- mp_elements/src/app.rs | 24 +++++++++------- mp_elements/src/elements/ppi.rs | 49 +++++++++++++++++++++----------- mp_elements/src/lib.rs | 2 ++ 9 files changed, 74 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3783d90..5544548 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1697,8 +1697,10 @@ dependencies = [ "log", "makepad-widgets", "mp_core", + "mp_elements", "native-dialog", "once_cell", + "tokio", "tracing", "tracing-subscriber", ] diff --git a/mp/Cargo.toml b/mp/Cargo.toml index 9028484..2dcc5ac 100644 --- a/mp/Cargo.toml +++ b/mp/Cargo.toml @@ -13,3 +13,5 @@ native-dialog = "0.7.0" once_cell = "1.20.2" tracing = "0.1.40" tracing-subscriber = "0.3.18" +mp_elements = { path = "../mp_elements", version = "*" } +tokio = { version = "1.41.1", features = ["full"] } diff --git a/mp/src/app.rs b/mp/src/app.rs index bfa7cb4..278d211 100644 --- a/mp/src/app.rs +++ b/mp/src/app.rs @@ -1,7 +1,8 @@ use makepad_widgets::makepad_micro_serde::*; use makepad_widgets::*; +use mp_elements::elements::Element; -use crate::{DATAPOOL, PLUGIN_MANAGER}; +use crate::{DATAPOOL, GIAPP, PLUGIN_MANAGER}; live_design! { import makepad_widgets::base::*; diff --git a/mp/src/lib.rs b/mp/src/lib.rs index 82fb68f..60034e8 100644 --- a/mp/src/lib.rs +++ b/mp/src/lib.rs @@ -1,3 +1,5 @@ +use mp_elements; +use tokio::runtime::Runtime; pub mod app; pub use makepad_widgets; pub use makepad_widgets::makepad_draw; @@ -11,6 +13,7 @@ use mp_core::{config::Setting, datapool::DataPool, plugin_system::PluginManager} use once_cell::sync::Lazy; use std::env; +pub static RUNTIME: Lazy = Lazy::new(|| Runtime::new().unwrap()); pub static CONFIG: Lazy = Lazy::new(|| Setting::new()); pub static PLUGIN_MANAGER: Lazy = Lazy::new(|| { PluginManager::new( @@ -23,3 +26,10 @@ pub static PLUGIN_MANAGER: Lazy = Lazy::new(|| { .unwrap() }); pub static DATAPOOL: Lazy = Lazy::new(|| DataPool::new(&PLUGIN_MANAGER, 10)); +pub static GIAPP: Lazy = Lazy::new(|| { + RUNTIME.block_on(async { + let mut app = mp_elements::App::instant().await; + app.init().await; + app + }) +}); diff --git a/mp_elements/image.png b/mp_elements/image.png index 638423d7a2f881efd86001ab0d293ca15c9dd29e..c655438016a883063261dfcd7d4833388f8d5ec3 100644 GIT binary patch literal 71369 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�t+8WoW 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 literal 3218 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 @location(0) vec4f { let value = data[input.idx]; let ear = polar_forward(input.position.xyz); // var color = linear_colormap(value); - var color = vec4(1.0, 1.0, 1.0, 1.0); - let r = ear.z; + var color = clamp(value / 75.0, 0.0, 1.0); + + // let r = ear.x; // Valid range // let r_range = input.r_range; @@ -68,6 +70,7 @@ fn fragment(input: VertexOutput) -> @location(0) vec4f { // let is_outside = outside_lower_bound + outside_upper_bound; // color.a *= 1.0 - is_outside; - return vec4(r,r,r,r); + + return vec4(color,color,color, 1.0); } diff --git a/mp_elements/src/app.rs b/mp_elements/src/app.rs index c90937c..ea44e5d 100644 --- a/mp_elements/src/app.rs +++ b/mp_elements/src/app.rs @@ -1,4 +1,4 @@ -use quick_cache::unsync::Cache; +use quick_cache::sync::Cache; use wgpu::util::DeviceExt; use crate::elements::{Element, ElementAttach, ElementsRef}; @@ -7,7 +7,7 @@ use wgpu::{Backends, Instance}; use encase; -type DB = std::rc::Rc; +type DB = std::sync::Arc; const BACKENDS_DEFAULT: u32 = Backends::DX12.bits() | Backends::METAL.bits() @@ -46,10 +46,13 @@ impl App { // Request a device and a queue from the adapter. The device is the handle to the GPU, and the queue is used to submit commands to the GPU. let (device, queue) = adapter - .request_device(&wgpu::DeviceDescriptor{ - required_features: wgpu::Features::POLYGON_MODE_LINE, - ..Default::default() - }, None) + .request_device( + &wgpu::DeviceDescriptor { + required_features: wgpu::Features::POLYGON_MODE_LINE, + ..Default::default() + }, + None, + ) .await .unwrap(); @@ -295,14 +298,14 @@ impl DataBufferPool { } } - pub fn get_or_create_buffer(&mut self, key: BufferKey, f: F) -> Option<&DB> + pub fn get_or_create_buffer(&mut self, key: BufferKey, f: F) -> DB where F: FnOnce() -> wgpu::Buffer, { let buffer = self .buffers .get_or_insert_with(&key, || { - Ok::, ()>(std::rc::Rc::new(f())) + Ok::, ()>(std::sync::Arc::new(f())) }) .unwrap(); buffer @@ -409,8 +412,9 @@ mod test { fn test_app() { let plugin_manager = PluginManager::new( // r#"/Users/tsuki/projects/mp/loaders"# - r#"C:\Users\qwin7\projects\radarmp\loaders"# - ).unwrap(); + r#"C:\Users\qwin7\projects\radarmp\loaders"#, + ) + .unwrap(); let data = plugin_manager.try_load_data( // "/Users/tsuki/Desktop/Z_RADR_I_X5775_20230726180000_O_DOR-XPD-CAP-FMT.BIN.zip", diff --git a/mp_elements/src/elements/ppi.rs b/mp_elements/src/elements/ppi.rs index 451da8c..2a18951 100644 --- a/mp_elements/src/elements/ppi.rs +++ b/mp_elements/src/elements/ppi.rs @@ -135,7 +135,7 @@ impl Element for PPI { strip_index_format: None, front_face: wgpu::FrontFace::Ccw, cull_mode: None, - polygon_mode: wgpu::PolygonMode::Line, + polygon_mode: wgpu::PolygonMode::Fill, unclipped_depth: false, conservative: false, }, @@ -190,6 +190,7 @@ impl Element for PPI { ) -> ElementAttach { let (vertex, index) = self.bake(data); println!("index: {:?}", &(index.as_ref()).unwrap()[0..24]); + println!("vertex: {:?}", &vertex[0..4]); let device = &ctx.device; let uniform_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -220,14 +221,13 @@ impl Element for PPI { let data_array_f32 = data_array.cast_to::(); let key = self.generate_key(data); - let buffer = buffer_pool.get_or_create_buffer(key.clone(), || { + let data_buffer = buffer_pool.get_or_create_buffer(key.clone(), || { device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("PPI Texture Buffer"), contents: bytemuck::cast_slice(data_array_f32.as_slice().unwrap()), usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::STORAGE, }) }); - let data_buffer = buffer.unwrap(); // Bind Group let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { @@ -259,7 +259,8 @@ impl Element for PPI { impl PPI { fn init_shader(device: &wgpu::Device) -> wgpu::ShaderModule { // let shader_str = merge_shader(r#"/Users/tsuki/projects/mp/mp_elements/shaders/ppi.wgsl"#); - let shader_str = merge_shader(r#"C:\Users\qwin7\projects\radarmp\mp_elements\shaders\ppi.wgsl"#); + let shader_str = + merge_shader(r#"C:\Users\qwin7\projects\radarmp\mp_elements\shaders\ppi.wgsl"#); let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { label: Some("PPI Shader Module"), source: wgpu::ShaderSource::Wgsl(shader_str.into()), @@ -291,35 +292,51 @@ impl PPI { let mut vertexs = Vec::with_capacity(a.len() * r.len() * 4); for (a_idx, _a) in sorted_azimuth.into_iter().enumerate() { for (r_idx, _r) in r.iter().enumerate() { - let cr = *_r as f32 / r_max; let r_ranges = [cr - r_step_f32, cr + r_step_f32, 0.0, 0.0]; - let idx = (a_idx * r.len() + r_idx) as u32; + let idx = (a_idx * r.len() + r_idx) as f32; + // Left Top - let lt = polar_to_cartesian(cr + r_step_f32, (_a - azi_step) as f32, e); + let lt = polar_to_cartesian( + cr + r_step_f32, + (_a - azi_step).to_radians() as f32, + e.to_radians(), + ); vertexs.push(PPIVertex { - position: Vec4::new(lt.0, lt.1, lt.2,0.0), + position: Vec4::new(lt.0, lt.1, lt.2, idx), r_ranges, // idx, }); // Left Bot - let lb = polar_to_cartesian(cr - r_step_f32, (_a - azi_step) as f32, e); + let lb = polar_to_cartesian( + cr - r_step_f32, + (_a - azi_step).to_radians() as f32, + e.to_radians(), + ); vertexs.push(PPIVertex { - position: Vec4::new(lb.0, lb.1, lb.2,0.0), + position: Vec4::new(lb.0, lb.1, lb.2, idx), r_ranges, // idx, }); // Right Top - let rt = polar_to_cartesian(cr + r_step_f32, (_a + azi_step) as f32, e); + let rt = polar_to_cartesian( + cr + r_step_f32, + (_a + azi_step).to_radians() as f32, + e.to_radians(), + ); vertexs.push(PPIVertex { - position: Vec4::new(rt.0, rt.1, rt.2,0.0), + position: Vec4::new(rt.0, rt.1, rt.2, idx), r_ranges, // idx, }); // Right Bot - let rb = polar_to_cartesian(cr - r_step_f32, (_a + azi_step) as f32, e); + let rb = polar_to_cartesian( + cr - r_step_f32, + (_a + azi_step).to_radians() as f32, + e.to_radians(), + ); vertexs.push(PPIVertex { - position: Vec4::new(rb.0, rb.1, rb.2,0.0), + position: Vec4::new(rb.0, rb.1, rb.2, idx), r_ranges, // idx, }); @@ -330,7 +347,7 @@ impl PPI { let mut indice_buffer = Vec::with_capacity(a.len() * r.len() * 6); for i in 0..a.len() * r.len() { - let start = (i * 2) as u32; + let start = (i * 4) as u32; indice_buffer.push(start); indice_buffer.push(start + 1); indice_buffer.push(start + 2); @@ -382,5 +399,5 @@ fn polar_to_cartesian(r: f32, azimuth: f32, elevation: f32) -> (f32, f32, f32) { let x = r * azimuth.cos() * elevation.cos(); let y = r * azimuth.sin() * elevation.cos(); let z = r * elevation.sin(); - (x, y, z ) + (x, y, z) } diff --git a/mp_elements/src/lib.rs b/mp_elements/src/lib.rs index 8b260ce..874e0f1 100644 --- a/mp_elements/src/lib.rs +++ b/mp_elements/src/lib.rs @@ -3,3 +3,5 @@ pub mod elements; pub mod elementvec; pub mod renderer; mod utils; + +pub use app::App;