diff options
Diffstat (limited to 'src/tacmap/camera.rs')
| -rw-r--r-- | src/tacmap/camera.rs | 68 |
1 files changed, 30 insertions, 38 deletions
diff --git a/src/tacmap/camera.rs b/src/tacmap/camera.rs index d751a2a..a2adc84 100644 --- a/src/tacmap/camera.rs +++ b/src/tacmap/camera.rs @@ -4,21 +4,23 @@ use cgmath::{InnerSpace, Rad, Vector2, Vector3, Zero, perspective}; use winit::event::ElementState; use winit::keyboard::KeyCode; +use crate::fleet::FleetsManager; use crate::solar_system::body::OrbitalBody; use crate::solar_system::{self, Kilometers, SolarSystem}; use crate::timeman::Second; use crate::ui; +use crate::ui::contact::MapContact; use crate::wgpuctx::WgpuCtx; pub struct Camera { origin_position: Vector3<Kilometers>, - rel_position: Vector3<f32>, + offset_position: Vector3<f32>, pitch: Rad<f32>, yaw: Rad<f32>, scale: f32, - target: Option<solar_system::body::BodyId>, + target: Option<MapContact>, buffer: wgpu::Buffer, staging_buffer: wgpu::Buffer, @@ -99,11 +101,11 @@ impl Camera ); Self { origin_position: position.into(), - rel_position: Vector3::new(0.0, 0.0, 0.0), + offset_position: Vector3::new(0.0, 0.0, 0.0), yaw: yaw.into(), pitch: pitch.into(), scale: 1e-7, - target: Some(0), + target: Some(MapContact::from_body(0)), buffer: buffer, staging_buffer: staging_buffer, bindgroup: bind_group @@ -118,7 +120,7 @@ impl Camera pub fn get_combined_position(&self) -> Vector3<Kilometers> { - self.origin_position + self.rel_position.map(|v| { v as f64 }) + self.origin_position + self.offset_position.map(|v| { v as f64 }) } pub fn get_rotation(&self) -> Vector2<Rad<f32>> @@ -170,12 +172,12 @@ impl Camera pub fn set_target( &mut self, - target: Option<solar_system::body::BodyId>) + target: Option<MapContact>) { if target == self.target { return; } - if !target.is_some() || !self.target.is_some() { + if target.is_none() { self.origin_position = self.get_combined_position(); - self.rel_position = Vector3::new(0.0, 0.0, 0.0); + self.offset_position = Vector3::new(0.0, 0.0, 0.0); } self.target = target; } @@ -222,9 +224,9 @@ impl Camera self.origin_position.y as f32, self.origin_position.z as f32 ], rel_pos: [ - self.rel_position.x as f32, - self.rel_position.y as f32, - self.rel_position.z as f32 ], + self.offset_position.x as f32, + self.offset_position.y as f32, + self.offset_position.z as f32 ], scale: self.scale, _pad0: 0 @@ -267,26 +269,16 @@ impl CameraController fn update_orbit( &mut self, camera: &mut Camera, - solar_system: &SolarSystem, - target: &OrbitalBody, - time: Second, + target_origin: cgmath::Vector3<Kilometers>, + target_offset: cgmath::Vector3<Kilometers>, dt: Duration) { - let target_radius = (target.radius() * 2.0).max(1.0); + let target_radius = 1.0; camera.scale *= 1.0 + ((self.scale_delta.y - self.scale_delta.x) * 0.1); camera.scale = f32::max(1e-16, f32::min(1.0 / target_radius, camera.scale)); - match target.get_orbit() { - Some(orbit) => { - let parent = solar_system.body(orbit.parent()); - camera.origin_position = parent.absolute_position(solar_system, time); - camera.rel_position = target.relative_position(time).map(|v| { v as f32 }); - }, - None => { - camera.origin_position = target.absolute_position(solar_system, time); - camera.rel_position.set_zero(); - } - } + camera.origin_position = target_origin; + camera.offset_position = target_offset.map(|v| { v as f32 }); let dt = dt.as_secs_f32(); let speed = 1.0; @@ -319,9 +311,9 @@ impl CameraController let right = Vector3::new(-yaw_sin, 0.0, yaw_cos).normalize(); let up = Vector3::new(0.0, 1.0, 0.0); - camera.rel_position += forward * (self.position_pos_delta.z - self.position_neg_delta.z) * speed * dt; - camera.rel_position += right * (self.position_pos_delta.x - self.position_neg_delta.x) * speed * dt; - camera.rel_position += up * (self.position_pos_delta.y - self.position_neg_delta.y) * speed * dt; + camera.offset_position += forward * (self.position_pos_delta.z - self.position_neg_delta.z) * speed * dt; + camera.offset_position += right * (self.position_pos_delta.x - self.position_neg_delta.x) * speed * dt; + camera.offset_position += up * (self.position_pos_delta.y - self.position_neg_delta.y) * speed * dt; camera.pitch.0 += (self.rotation_pos_delta.x - self.rotation_neg_delta.x) * speed * dt; camera.yaw.0 += (self.rotation_pos_delta.y - self.rotation_neg_delta.y) * speed * dt; @@ -330,20 +322,20 @@ impl CameraController pub fn update( &mut self, camera: &mut Camera, - solar_system: &SolarSystem, - ui_state: &mut ui::State, + star_system: &SolarSystem, + fleets_man: &FleetsManager, time: Second, dt: Duration) { - match ui_state.camera_target { - Some(body_id) => { - - let body = &solar_system.bodies()[body_id]; + match camera.target { + Some(target) => { + let target_origin = target.origin_position(star_system, fleets_man, time); + let target_offset = target.offset_position(star_system, fleets_man, time); + self.update_orbit( camera, - solar_system, - body, - time, + target_origin, + target_offset, dt); } None => self.update_pan(camera, dt) |
