From 0b428d94e751dc4a5fbe19418bfb5994cebfa54c Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Sun, 24 May 2026 13:04:10 -0400 Subject: major ui rework --- src/tacmap/body_render.rs | 4 +-- src/tacmap/camera.rs | 68 +++++++++++++++++++++-------------------------- 2 files changed, 32 insertions(+), 40 deletions(-) (limited to 'src/tacmap') diff --git a/src/tacmap/body_render.rs b/src/tacmap/body_render.rs index 23a04c9..1d23a62 100644 --- a/src/tacmap/body_render.rs +++ b/src/tacmap/body_render.rs @@ -103,11 +103,11 @@ impl BodyRenderer let bodies = solar_system.bodies(); let body_instances = bodies.iter().map(|body| { - let position = body.relative_position(time); + let position = body.offset_position(time); let origin = match body.get_orbit() { Some(orbit) => { let origin_body = &bodies[orbit.parent()]; - origin_body.relative_position(time) + origin_body.offset_position(time) }, None => cgmath::Vector3::new(0.0, 0.0, 0.0) }; 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, - rel_position: Vector3, + offset_position: Vector3, pitch: Rad, yaw: Rad, scale: f32, - target: Option, + target: Option, 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 { - 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> @@ -170,12 +172,12 @@ impl Camera pub fn set_target( &mut self, - target: Option) + target: Option) { 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, + target_offset: cgmath::Vector3, 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) -- cgit v1.2.3