summaryrefslogtreecommitdiffstats
path: root/src/tacmap/render.rs
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-04-22 10:51:13 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-04-22 10:51:13 -0400
commit3d3864171785c589872bf23faaaa3a421f56ee4e (patch)
tree4c4a927473ee1a58f23fff1e8ece8327a31d719a /src/tacmap/render.rs
parent3dc92fad981e28c760f3c6e95f5a8153ea6c9be4 (diff)
downloadsystemic4x-3d3864171785c589872bf23faaaa3a421f56ee4e.tar.gz
systemic4x-3d3864171785c589872bf23faaaa3a421f56ee4e.tar.bz2
systemic4x-3d3864171785c589872bf23faaaa3a421f56ee4e.zip
complete orbit camera. add most large solar bodies
Diffstat (limited to 'src/tacmap/render.rs')
-rw-r--r--src/tacmap/render.rs21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/tacmap/render.rs b/src/tacmap/render.rs
index 0f6b409..26d6977 100644
--- a/src/tacmap/render.rs
+++ b/src/tacmap/render.rs
@@ -9,7 +9,7 @@ use crate::{solar_system::{SolarSystem, SystemId}, timeman::Second, vertex::{sel
struct BodyInstance
{
- position: cgmath::Point3<Kilometers>,
+ position: cgmath::Vector3<Kilometers>,
radius: f32
}
@@ -36,6 +36,7 @@ pub struct BodyRenderer
{
needs_rebuild: bool,
last_time: Option<Second>,
+ last_pos: Option<cgmath::Vector3<Kilometers>>,
pipeline: wgpu::RenderPipeline,
@@ -73,6 +74,7 @@ impl BodyRenderer
Self {
needs_rebuild: true,
last_time: None,
+ last_pos: None,
pipeline: render_pipeline,
body_vertex_buffer,
body_instance_buffer: None
@@ -113,6 +115,7 @@ impl BodyRenderer
);
self.last_time = None;
+ self.last_pos = None;
self.body_instance_buffer = Some((bodies.len(), buffer));
}
@@ -120,21 +123,21 @@ impl BodyRenderer
&mut self,
wgpuctx: &WgpuCtx,
solar_system: &SolarSystem,
+ camera: &Camera,
time: Second)
-> Result<(), Box<dyn Error>>
{
//If the last updated time is the same, we don't need to update
//the positions of all the bodies.
- match self.last_time {
- Some(last_time) => {
- if last_time == time {
- return Ok(());
- }
+ if self.last_time.is_some_and(|last_time| { last_time == time }) {
+ if self.last_pos.is_some_and(|last_pos| { last_pos == camera.get_abs_position() }) {
+ return Ok(())
}
- None => {}
}
self.last_time = Some(time);
+ self.last_pos = Some(camera.get_abs_position());
+
let (_, bodies_buffer) = match &self.body_instance_buffer {
Some(tuple) => tuple,
None => return Err(Box::new(NeedsRebuildError))
@@ -142,9 +145,9 @@ impl BodyRenderer
let bodies = solar_system.bodies();
let body_instances = bodies.iter().map(|body| {
- let position = body.position();
+ let position = solar_system.body_position(body);
BodyInstance {
- position: position,
+ position: (position - self.last_pos.unwrap()),
radius: body.radius()
}.raw()
}).collect::<Vec<_>>();