diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-04-30 10:06:32 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-04-30 10:06:32 -0400 |
| commit | 961f8c6d405c9c6fcf9aaf4fb6f199b0e5c60d88 (patch) | |
| tree | a26797d6314fa8c193a459e988427c7bfe7f19a7 /src/tacmap/camera.rs | |
| parent | 25255a8b9147d27aa40b28d6aadb62c0ab275d32 (diff) | |
| download | systemic4x-961f8c6d405c9c6fcf9aaf4fb6f199b0e5c60d88.tar.gz systemic4x-961f8c6d405c9c6fcf9aaf4fb6f199b0e5c60d88.tar.bz2 systemic4x-961f8c6d405c9c6fcf9aaf4fb6f199b0e5c60d88.zip | |
add orbit rendering for bodies
Diffstat (limited to 'src/tacmap/camera.rs')
| -rw-r--r-- | src/tacmap/camera.rs | 33 |
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 = ¤t_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); } |
