From 92cea44839bb0e0c89f2ce5fa3588a2b97df021f Mon Sep 17 00:00:00 2001 From: tsuki Date: Sat, 16 Nov 2024 10:47:31 +0800 Subject: [PATCH] sync --- mp_elements/image.png | Bin 1942 -> 3218 bytes mp_elements/shaders/ppi.wgsl | 14 +++--- mp_elements/src/app.rs | 14 ++++-- mp_elements/src/elements/ppi.rs | 78 +++++++++++++++++--------------- mp_elements/src/utils.rs | 3 +- 5 files changed, 61 insertions(+), 48 deletions(-) diff --git a/mp_elements/image.png b/mp_elements/image.png index df1c11d22e5834457beef651355bf9b10a1b9f46..638423d7a2f881efd86001ab0d293ca15c9dd29e 100644 GIT binary patch literal 3218 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 diff --git a/mp_elements/shaders/ppi.wgsl b/mp_elements/shaders/ppi.wgsl index a7a1048..9d2d22a 100644 --- a/mp_elements/shaders/ppi.wgsl +++ b/mp_elements/shaders/ppi.wgsl @@ -22,24 +22,24 @@ struct UniformParams { struct VertexOutput { @builtin(position) position: vec4f, - @location(0) r_range: vec2f, + @location(0) r_range: vec4f, @location(1) idx: u32 } @vertex fn vertex( - @location(0) position: vec3f, - @location(1) r_range: vec2f, - @location(2) idx: u32 + @location(0) position: vec4f, + @location(1) r_range: vec4f, + // @location(2) idx: u32 ) -> VertexOutput { var out: VertexOutput; // Transform position // out.position = common_tools.proj_matrix * common_tools.view_matrix * common_tools.model_matrix * vec4f(position, 1.0); - out.position = vec4(position, 1.0); + out.position = vec4(position.xyz, 1.0); out.r_range = r_range; - out.idx = idx; + out.idx = 0u; return out; } @@ -68,6 +68,6 @@ fn fragment(input: VertexOutput) -> @location(0) vec4f { // let is_outside = outside_lower_bound + outside_upper_bound; // color.a *= 1.0 - is_outside; - return color; + return vec4(r,r,r,r); } diff --git a/mp_elements/src/app.rs b/mp_elements/src/app.rs index b0afb45..c90937c 100644 --- a/mp_elements/src/app.rs +++ b/mp_elements/src/app.rs @@ -46,7 +46,10 @@ 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(&Default::default(), None) + .request_device(&wgpu::DeviceDescriptor{ + required_features: wgpu::Features::POLYGON_MODE_LINE, + ..Default::default() + }, None) .await .unwrap(); @@ -404,11 +407,14 @@ mod test { use super::*; #[test] fn test_app() { - let plugin_manager = PluginManager::new(r#"/Users/tsuki/projects/mp/loaders"#).unwrap(); + let plugin_manager = PluginManager::new( + // r#"/Users/tsuki/projects/mp/loaders"# + 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", - // r#"C:\Users\qwin7\Downloads\ZJSXAA_20230113070200_R.dat.gz"#, + // "/Users/tsuki/Desktop/Z_RADR_I_X5775_20230726180000_O_DOR-XPD-CAP-FMT.BIN.zip", + r#"C:\Users\qwin7\Downloads\ZJSXAA_20230113070200_R.dat.gz"#, ); pollster::block_on(async { diff --git a/mp_elements/src/elements/ppi.rs b/mp_elements/src/elements/ppi.rs index d59ea11..451da8c 100644 --- a/mp_elements/src/elements/ppi.rs +++ b/mp_elements/src/elements/ppi.rs @@ -29,9 +29,9 @@ pub struct PPIUniform { #[repr(C)] #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] pub struct PPIVertex { - position: Vec3, - r_ranges: [f32; 2], - idx: u32, + position: Vec4, + r_ranges: [f32; 4], + // idx: u32, } impl PPIVertex { @@ -43,18 +43,18 @@ impl PPIVertex { wgpu::VertexAttribute { offset: 0, shader_location: 0, - format: wgpu::VertexFormat::Float32x3, + format: wgpu::VertexFormat::Float32x4, }, wgpu::VertexAttribute { - offset: std::mem::size_of::() as wgpu::BufferAddress, + offset: std::mem::size_of::() as wgpu::BufferAddress, shader_location: 1, - format: wgpu::VertexFormat::Float32x2, - }, - wgpu::VertexAttribute { - offset: std::mem::size_of::<[f32; 2]>() as wgpu::BufferAddress, - shader_location: 2, - format: wgpu::VertexFormat::Uint32, + format: wgpu::VertexFormat::Float32x4, }, + // wgpu::VertexAttribute { + // offset: std::mem::size_of::<[f32; 2]>() as wgpu::BufferAddress, + // shader_location: 2, + // format: wgpu::VertexFormat::Uint32, + // }, ], } } @@ -135,7 +135,7 @@ impl Element for PPI { strip_index_format: None, front_face: wgpu::FrontFace::Ccw, cull_mode: None, - polygon_mode: wgpu::PolygonMode::Fill, + polygon_mode: wgpu::PolygonMode::Line, unclipped_depth: false, conservative: false, }, @@ -166,7 +166,7 @@ impl Element for PPI { } = coord_typ { let e = elevation.map(|v| *v.first().unwrap_or(&0.0)).unwrap_or(0.0); - let (vertices, indices) = Self::bake_vi(e, azimuth, &range); + let (vertices, indices) = Self::bake_vi(e as f32, azimuth, &range); (vertices, Some(indices)) } else { @@ -189,6 +189,7 @@ impl Element for PPI { buffer_pool: &mut DataBufferPool, ) -> ElementAttach { let (vertex, index) = self.bake(data); + println!("index: {:?}", &(index.as_ref()).unwrap()[0..24]); let device = &ctx.device; let uniform_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -257,7 +258,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#"/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 = device.create_shader_module(wgpu::ShaderModuleDescriptor { label: Some("PPI Shader Module"), source: wgpu::ShaderSource::Wgsl(shader_str.into()), @@ -274,7 +276,7 @@ impl PPI { BufferKey::new(key_name) } - fn bake_vi(e: f64, a: &Vec, r: &Vec) -> (Vec, Vec) { + fn bake_vi(e: f32, a: &Vec, r: &Vec) -> (Vec, Vec) { // Sort azimuth let mut sorted_azimuth = a.clone(); sorted_azimuth.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Greater)); @@ -283,40 +285,43 @@ impl PPI { let azi_step = max_step(&sorted_azimuth, f64::MIN) / 2.0; let r_step = min_step(&r, f64::MAX) / (r[r.len() - 1]) / 2.0; let r_step_f32 = r_step as f32; + let r_max = r[r.len() - 1] as f32; // One cell has 4 vertices 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 r_ranges = [*_r as f32 - r_step_f32, *_r as f32 + r_step_f32]; + + 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; // Left Top - let lt = polar_to_cartesian(*_r + r_step, _a - azi_step, e); + let lt = polar_to_cartesian(cr + r_step_f32, (_a - azi_step) as f32, e); vertexs.push(PPIVertex { - position: Vec3::new(lt.0, lt.1, lt.2), + position: Vec4::new(lt.0, lt.1, lt.2,0.0), r_ranges, - idx, + // idx, }); // Left Bot - let lb = polar_to_cartesian(*_r - r_step, _a - azi_step, e); + let lb = polar_to_cartesian(cr - r_step_f32, (_a - azi_step) as f32, e); vertexs.push(PPIVertex { - position: Vec3::new(lb.0, lb.1, lb.2), + position: Vec4::new(lb.0, lb.1, lb.2,0.0), r_ranges, - idx, + // idx, }); // Right Top - let rt = polar_to_cartesian(*_r + r_step, _a + azi_step, e); + let rt = polar_to_cartesian(cr + r_step_f32, (_a + azi_step) as f32, e); vertexs.push(PPIVertex { - position: Vec3::new(rt.0, rt.1, rt.2), + position: Vec4::new(rt.0, rt.1, rt.2,0.0), r_ranges, - idx, + // idx, }); // Right Bot - let rb = polar_to_cartesian(*_r - r_step, _a + azi_step, e); + let rb = polar_to_cartesian(cr - r_step_f32, (_a + azi_step) as f32, e); vertexs.push(PPIVertex { - position: Vec3::new(rb.0, rb.1, rb.2), + position: Vec4::new(rb.0, rb.1, rb.2,0.0), r_ranges, - idx, + // idx, }); } } @@ -325,13 +330,14 @@ impl PPI { let mut indice_buffer = Vec::with_capacity(a.len() * r.len() * 6); for i in 0..a.len() * r.len() { - indice_buffer.push(i as u32 * 4); - indice_buffer.push(i as u32 * 4 + 1); - indice_buffer.push(i as u32 * 4 + 2); + let start = (i * 2) as u32; + indice_buffer.push(start); + indice_buffer.push(start + 1); + indice_buffer.push(start + 2); - indice_buffer.push(i as u32 * 4 + 1); - indice_buffer.push(i as u32 * 4 + 3); - indice_buffer.push(i as u32 * 4 + 2); + indice_buffer.push(start + 2); + indice_buffer.push(start + 1); + indice_buffer.push(start + 3); } return (vertexs, indice_buffer); @@ -372,9 +378,9 @@ where return max_gap; } -fn polar_to_cartesian(r: f64, azimuth: f64, elevation: f64) -> (f32, f32, f32) { +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 as f32, y as f32, z as f32) + (x, y, z ) } diff --git a/mp_elements/src/utils.rs b/mp_elements/src/utils.rs index 128562e..cd675c8 100644 --- a/mp_elements/src/utils.rs +++ b/mp_elements/src/utils.rs @@ -33,7 +33,8 @@ struct UniformCommonTools { Ok(path) => path.parent().unwrap().to_owned(), Err(e) => { // panic!("Failed to canonicalize path: {}", e); - PathBuf::from(r#"/Users/tsuki/projects/mp/mp_elements/shaders"#) + // PathBuf::from(r#"/Users/tsuki/projects/mp/mp_elements/shaders"#) + PathBuf::from(r#"C:\Users\qwin7\projects\radarmp\mp_elements\shaders"#) } };