From 3c0d6786bc56c5cb896e892d6027024b9509a722 Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 9 Jan 2024 11:37:23 -0800 Subject: [PATCH] Adjusted renderer for new architecture --- crates/render/Cargo.toml | 1 + crates/render/src/gpustate/hud.rs | 27 +++++++++++++++++++-------- crates/render/src/gpustate/world.rs | 12 ++++++++---- crates/render/src/renderstate.rs | 10 +++++++--- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/crates/render/Cargo.toml b/crates/render/Cargo.toml index e24189d..125a157 100644 --- a/crates/render/Cargo.toml +++ b/crates/render/Cargo.toml @@ -21,6 +21,7 @@ galactica-content = { workspace = true } galactica-constants = { workspace = true } galactica-packer = { workspace = true } galactica-world = { workspace = true } +galactica-gameobject = { workspace = true } anyhow = { workspace = true } cgmath = { workspace = true } diff --git a/crates/render/src/gpustate/hud.rs b/crates/render/src/gpustate/hud.rs index b5c027b..c101039 100644 --- a/crates/render/src/gpustate/hud.rs +++ b/crates/render/src/gpustate/hud.rs @@ -22,7 +22,12 @@ impl GPUState { //let system_object_scale = 1.0 / 600.0; let ship_scale = 1.0 / 10.0; - let (_, player_body) = state.world.get_ship_body(*state.player).unwrap(); + let player_world_object = state.world.get_ship(state.player_data).unwrap(); + let player_body = state + .world + .get_rigid_body(player_world_object.rigid_body) + .unwrap(); + let player_position = util::rigidbody_position(player_body); //let planet_sprite = state.content.get_sprite_handle("ui::planetblip"); let ship_sprite = state.content.get_sprite_handle("ui::shipblip"); @@ -88,7 +93,8 @@ impl GPUState { // Draw ships for (s, r) in state.world.iter_ship_body() { - let ship = state.content.get_ship(s.ship.handle); + let data = state.data.get_ship(s.data_handle).unwrap(); + let ship = state.content.get_ship(s.data_handle.content_handle()); let size = (ship.size * ship.sprite.aspect) * ship_scale; let p = util::rigidbody_position(r); let d = (p - player_position) / radar_range; @@ -99,7 +105,7 @@ impl GPUState { continue; } let angle = util::rigidbody_rotation(r).angle(Vector2 { x: 0.0, y: 1.0 }); - let f = state.content.get_faction(s.ship.faction).color; + let f = state.content.get_faction(data.get_faction()).color; let f = [f[0], f[1], f[2], 1.0]; let position = Point2 { @@ -264,11 +270,16 @@ impl GPUState { panic!("UI limit exceeded!") } - let (s, _) = state.world.get_ship_body(*state.player).unwrap(); - let max_shields = s.ship.outfits.stat_sum().shield_strength; - let current_shields = s.ship.shields; - let current_hull = s.ship.hull; - let max_hull = state.content.get_ship(s.ship.handle).hull; + let player_world_object = state.world.get_ship(state.player_data).unwrap(); + + let data = state + .data + .get_ship(player_world_object.data_handle) + .unwrap(); + let max_shields = data.get_outfits().get_shield_strength(); + let current_shields = data.get_shields(); + let current_hull = data.get_hull(); + let max_hull = state.content.get_ship(data.get_content()).hull; self.queue.write_buffer( &self.vertex_buffers.ui.instances, diff --git a/crates/render/src/gpustate/world.rs b/crates/render/src/gpustate/world.rs index acc4bb8..11353e1 100644 --- a/crates/render/src/gpustate/world.rs +++ b/crates/render/src/gpustate/world.rs @@ -21,11 +21,12 @@ impl GPUState { screen_clip: (Point2, Point2), s: &ShipWorldObject, ) { - let (_, r) = state.world.get_ship_body(s.physics_handle).unwrap(); + let r = state.world.get_rigid_body(s.rigid_body).unwrap(); + let ship = state.data.get_ship(s.data_handle); let ship_pos = util::rigidbody_position(&r); let ship_rot = util::rigidbody_rotation(r); let ship_ang = -ship_rot.angle(Vector2 { x: 0.0, y: 1.0 }); // TODO: inconsistent angles. Fix! - let ship_cnt = state.content.get_ship(s.ship.handle); + let ship_cnt = state.content.get_ship(s.data_handle.content_handle()); // Position adjusted for parallax // TODO: adjust parallax for zoom? @@ -84,8 +85,10 @@ impl GPUState { ); self.vertex_buffers.object_counter += 1; + /* // Draw engine flares if necessary - if s.controls.thrust && !s.ship.is_dead() { + //if s.controls.thrust && !s.ship.is_dead() { + if s.controls.thrust { for f in s.ship.outfits.iter_enginepoints() { let flare = match s.ship.outfits.get_flare_sprite() { None => continue, @@ -126,6 +129,7 @@ impl GPUState { self.vertex_buffers.object_counter += 1; } } + */ } pub(super) fn world_push_projectile( @@ -139,7 +143,7 @@ impl GPUState { let proj_pos = util::rigidbody_position(&r); let proj_rot = util::rigidbody_rotation(r); let proj_ang = -proj_rot.angle(Vector2 { x: 1.0, y: 0.0 }); - let proj_cnt = &p.projectile.content; // TODO: don't clone this? + let proj_cnt = &p.content; // TODO: don't clone this? // Position adjusted for parallax // TODO: adjust parallax for zoom? diff --git a/crates/render/src/renderstate.rs b/crates/render/src/renderstate.rs index 1d93c21..09de124 100644 --- a/crates/render/src/renderstate.rs +++ b/crates/render/src/renderstate.rs @@ -1,14 +1,15 @@ use cgmath::Point2; use galactica_content::Content; -use galactica_world::{ParticleBuilder, ShipPhysicsHandle, World}; +use galactica_gameobject::{GameData, GameShipHandle}; +use galactica_world::{ParticleBuilder, World}; /// Bundles parameters passed to a single call to GPUState::render pub struct RenderState<'a> { /// Camera position, in world units pub camera_pos: Point2, - /// Player ship - pub player: &'a ShipPhysicsHandle, + /// Player ship data + pub player_data: GameShipHandle, /// Height of screen, in world units pub camera_zoom: f32, @@ -23,6 +24,9 @@ pub struct RenderState<'a> { /// Game content pub content: &'a Content, + /// Game data + pub data: &'a GameData, + /// Particles to spawn during this frame pub particles: &'a mut Vec, }