diff options
Diffstat (limited to 'src/tacmap')
| -rw-r--r-- | src/tacmap/camera.rs | 6 | ||||
| -rw-r--r-- | src/tacmap/render.rs | 70 |
2 files changed, 52 insertions, 24 deletions
diff --git a/src/tacmap/camera.rs b/src/tacmap/camera.rs index c573cfb..895fa1e 100644 --- a/src/tacmap/camera.rs +++ b/src/tacmap/camera.rs @@ -253,7 +253,7 @@ impl CameraController &mut self, camera: &mut Camera, target: Vector3<Kilometers>, - min_radius: f32, + target_radius: f32, dt: Duration) { camera.abs_position = target; @@ -278,7 +278,7 @@ impl CameraController let (az_sin, az_cos) = camera.yaw.0.sin_cos(); let (p_sin, p_cos) = camera.pitch.0.sin_cos(); - let radius = f32::max(min_radius * camera.scale, current_radius + dist_diff); + let radius = f32::max(target_radius * camera.scale, current_radius + dist_diff).max(0.1); camera.rel_position = Vector3::new( radius * p_cos * az_cos, radius * p_sin, @@ -333,7 +333,7 @@ impl CameraController self.update_orbit( camera, current_system.body_position(body).cast().unwrap(), - body.radius() * 2.0, + (body.radius() * 2.0).max(1.0), dt); } None => self.update_pan(camera, dt) diff --git a/src/tacmap/render.rs b/src/tacmap/render.rs index 26d6977..c1256ff 100644 --- a/src/tacmap/render.rs +++ b/src/tacmap/render.rs @@ -1,10 +1,12 @@ use std::{fmt::Display, num::NonZero}; use std::error::Error; +use wgpu::RenderPass; + use crate::canvas::Canvas; use crate::solar_system::Kilometers; use crate::tacmap::camera::Camera; -use crate::wgpuctx::RenderPassBuilder; +use crate::wgpuctx::{RenderPassBuilder, SceneCtx}; use crate::{solar_system::{SolarSystem, SystemId}, timeman::Second, vertex::{self, Vertex}, wgpuctx::{WgpuCtx, pipeline::RenderPipelineBuilder}}; struct BodyInstance @@ -161,7 +163,7 @@ impl BodyRenderer pub fn render( &self, wgpuctx: &WgpuCtx, - canvas: &Canvas, + pass: &mut RenderPass, camera: &Camera) { let (num_bodies, bodies_buffer) = match &self.body_instance_buffer { @@ -169,27 +171,13 @@ impl BodyRenderer None => return }; - let mut encoder = wgpuctx.create_default_encoder("Tactical map renderer encoder"); - let view = canvas.view(); - - { - camera.stage_changes(&mut encoder); - } - { - let mut pass = RenderPassBuilder::new("Tactiacal map render pass", view) - .clear_color(wgpu::Color { r: 0.0, g: 0.0, b: 0.1, a: 1.0 }) - .build(&mut encoder); - - pass.set_pipeline(&self.pipeline); - pass.set_bind_group(0, camera.bindgroup(), &[]); + pass.set_pipeline(&self.pipeline); + pass.set_bind_group(0, camera.bindgroup(), &[]); - pass.set_vertex_buffer(0, self.body_vertex_buffer.slice(..)); - pass.set_vertex_buffer(1, bodies_buffer.slice(..)); + pass.set_vertex_buffer(0, self.body_vertex_buffer.slice(..)); + pass.set_vertex_buffer(1, bodies_buffer.slice(..)); - pass.draw(0..6, 0..num_bodies.clone() as _); - } - - wgpuctx.submit_encoder(encoder); + pass.draw(0..6, 0..num_bodies.clone() as _); } } // impl RenderState @@ -229,3 +217,43 @@ impl BodyInstanceRaw } } } + +pub struct GridRenderer +{ + pipeline: wgpu::RenderPipeline, +} + +impl GridRenderer +{ + pub fn new(wgpuctx: &WgpuCtx) + -> Self + { + let shader = wgpuctx.create_shader( + wgpu::include_wgsl!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/assets/shaders/tacmap/grid.wgsl") + )); + + let render_pipeline = RenderPipelineBuilder::new(&shader) + .add_bindgroup(&Camera::bindgroup_layout(wgpuctx)) + .cull_mode(None) + .build(Some("Tactical map grid pipeline"), wgpuctx); + + Self { + pipeline: render_pipeline + } + } + + pub fn render( + &self, + wgpuctx: &WgpuCtx, + pass: &mut RenderPass, + camera: &Camera + ) + { + pass.set_pipeline(&self.pipeline); + pass.set_bind_group(0, camera.bindgroup(), &[]); + + pass.draw(0..6, 0..1); + } +} |
