summaryrefslogtreecommitdiffstats
path: root/src/tacmap/camera.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tacmap/camera.rs')
-rw-r--r--src/tacmap/camera.rs68
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)