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.rs33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/tacmap/camera.rs b/src/tacmap/camera.rs
index 895fa1e..ae9bcfa 100644
--- a/src/tacmap/camera.rs
+++ b/src/tacmap/camera.rs
@@ -3,7 +3,7 @@ use std::{cell::RefCell, time::Duration};
use cgmath::{EuclideanSpace, InnerSpace, Point2, Point3, Rad, Vector2, Vector3, Vector4, Zero, perspective};
use winit::{event::ElementState, keyboard::KeyCode};
-use crate::{GameState, solar_system::{self, Kilometers}, ui, wgpuctx::WgpuCtx};
+use crate::{GameState, solar_system::{self, Kilometers, SolarSystem}, ui, wgpuctx::WgpuCtx};
pub const OPENGL_TO_WGPU_MATRIX: cgmath::Matrix4<f32> = cgmath::Matrix4::from_cols(
Vector4::new(1.0, 0.0, 0.0, 0.0),
@@ -42,6 +42,7 @@ pub struct CameraUniform
{
view: [[f32;4];4],
proj: [[f32;4];4],
+ pos: [f32;3],
scale: f32
}
@@ -68,7 +69,7 @@ impl Camera
let buffer = wgpuctx.create_buffer(
&wgpu::BufferDescriptor {
label: Some("Camera buffer"),
- size: 144,
+ size: size_of::<CameraUniform>() as _,
usage: BufferUsages::UNIFORM | BufferUsages::COPY_DST,
mapped_at_creation: false
}
@@ -77,7 +78,7 @@ impl Camera
let staging_buffer = wgpuctx.create_buffer(
&wgpu::wgt::BufferDescriptor {
label: Some("Camera staging buffer"),
- size: 144,
+ size: size_of::<CameraUniform>() as _,
usage: BufferUsages::COPY_SRC | BufferUsages::COPY_DST,
mapped_at_creation: false
}
@@ -212,6 +213,9 @@ impl Camera
CameraUniform {
view: (self.view_matrix()).into(),
proj: projection.projection_matrix().into(),
+ pos: [ self.abs_position.x as f32,
+ self.abs_position.y as f32,
+ self.abs_position.z as f32 ],
scale: self.scale
}
}
@@ -256,6 +260,9 @@ impl CameraController
target_radius: f32,
dt: Duration)
{
+ 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));
+
camera.abs_position = target;
let dt = dt.as_secs_f32();
@@ -294,6 +301,9 @@ impl CameraController
let dt = dt.as_secs_f32();
let speed = 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, camera.scale));
+
let (yaw_sin, yaw_cos) = camera.yaw.0.sin_cos();
let forward = Vector3::new(yaw_cos, 0.0, yaw_sin).normalize();
let right = Vector3::new(-yaw_sin, 0.0, yaw_cos).normalize();
@@ -313,26 +323,17 @@ impl CameraController
pub fn update(
&mut self,
camera: &mut Camera,
- game_state: &RefCell<GameState>,
+ solar_system: &SolarSystem,
ui_state: &mut ui::State,
dt: Duration)
{
- camera.scale *= 1.0 + ((self.scale_delta.y - self.scale_delta.x) * 0.1);
- camera.scale = f32::max(1e-16, f32::min(1e-6, camera.scale));
-
match ui_state.camera_info.target {
Some(body_id) => {
- let game_state = game_state.borrow();
- let solar_systems = game_state.solar_systems();
- let current_system = match ui_state.current_system {
- Some(id) => &solar_systems[id],
- None => return
-};
-
- let body = &current_system.bodies()[body_id];
+
+ let body = &solar_system.bodies()[body_id];
self.update_orbit(
camera,
- current_system.body_position(body).cast().unwrap(),
+ solar_system.body_position(body).cast().unwrap(),
(body.radius() * 2.0).max(1.0),
dt);
}