From 171cedf18110f27c8678c15bf83cdd3f55e96a4e Mon Sep 17 00:00:00 2001 From: hodasemi Date: Mon, 4 Dec 2023 19:34:51 +0100 Subject: [PATCH] Get watermark working in first stage --- src/overlay/elements/watermark/mod.rs | 2 +- src/overlay/mod.rs | 2 +- src/overlay/rendering.rs | 7 +- src/overlay/rfactor_data.rs | 99 ++++++++++++--------------- 4 files changed, 52 insertions(+), 58 deletions(-) diff --git a/src/overlay/elements/watermark/mod.rs b/src/overlay/elements/watermark/mod.rs index 7305498..9ab440e 100644 --- a/src/overlay/elements/watermark/mod.rs +++ b/src/overlay/elements/watermark/mod.rs @@ -28,7 +28,7 @@ impl UiOverlay for Watermark {} impl DataReceiver for Watermark { fn game_phase_change(&mut self, phase: GamePhase) -> Result<()> { match phase { - GamePhase::None => self.gui.enable()?, + GamePhase::None | GamePhase::TestDay => self.gui.enable()?, _ => self.gui.disable()?, } diff --git a/src/overlay/mod.rs b/src/overlay/mod.rs index 9b9ea5b..1723339 100644 --- a/src/overlay/mod.rs +++ b/src/overlay/mod.rs @@ -378,7 +378,7 @@ impl Overlay { write_log!("created RFactorData"); for receiver in self.ui_elements.iter() { - data.add_receiver(receiver.clone()); + data.add_receiver(receiver.clone())?; } } } diff --git a/src/overlay/rendering.rs b/src/overlay/rendering.rs index 881882f..51938af 100644 --- a/src/overlay/rendering.rs +++ b/src/overlay/rendering.rs @@ -12,6 +12,7 @@ pub struct Rendering { queue: Arc>, signal_semaphore: Arc, + fence: Arc, render_callbacks: Vec Result> + Send + Sync>>, } @@ -45,6 +46,7 @@ impl Rendering { Ok(Self { signal_semaphore: Semaphore::new(swapchain.device().clone())?, + fence: Fence::builder().build(swapchain.device().clone())?, swapchain, images, @@ -95,7 +97,10 @@ impl Rendering { wait_semaphores.len() )); - self.queue.lock().unwrap().submit(None, &[submit])?; + self.queue + .lock() + .unwrap() + .submit(Some(&self.fence), &[submit])?; write_log!("submitted layer queue"); diff --git a/src/overlay/rfactor_data.rs b/src/overlay/rfactor_data.rs index 952af24..6a3df6e 100644 --- a/src/overlay/rfactor_data.rs +++ b/src/overlay/rfactor_data.rs @@ -88,8 +88,15 @@ impl RFactorData { }) } - pub fn add_receiver(&mut self, receiver: Arc>) { + pub fn add_receiver(&mut self, receiver: Arc>) -> Result<()> { + receiver + .lock() + .unwrap() + .game_phase_change(self.previous_game_phase)?; + self.receivers.push(receiver); + + Ok(()) } fn now(&self) -> f32 { @@ -100,67 +107,49 @@ impl RFactorData { write_log!(" =================== update RFactorData ==================="); // get scoring info - match self.scoring_reader.vehicle_scoring(self.now()) { - Some((scoring_info, vehicle_scorings)) => { - self.last_scoring_read = self.start_time.elapsed(); + if let Some((scoring_info, vehicle_scorings)) = + self.scoring_reader.vehicle_scoring(self.now()) + { + self.last_scoring_read = self.start_time.elapsed(); - write_log!(format!( - "new scoring info: vehicles: {}", - scoring_info.mNumVehicles - )); + write_log!(format!( + "new scoring info: vehicles: {}", + scoring_info.mNumVehicles + )); - // check for player id - if scoring_info.mNumVehicles == 0 { - self.player_id = None; - } else if self.player_id.is_none() { - for vehicle_scoring in vehicle_scorings.iter() { - if vehicle_scoring.mIsPlayer != 0 { - write_log!(format!("player found: {}", vehicle_scoring.mID)); - self.player_id = Some(vehicle_scoring.mID); - break; - } - } - } - - { - let phase = GamePhase::try_from(scoring_info.mSession)?; - - if self.previous_game_phase != phase { - self.previous_game_phase = phase; - - for receiver in self.receivers.iter() { - receiver - .lock() - .unwrap() - .game_phase_change(self.previous_game_phase)?; - } - } - - write_log!(format!("GamePhase: {:?}", self.previous_game_phase)); - } - - for receiver in self.receivers.iter() { - let mut rec_mut = receiver.lock().unwrap(); - - if rec_mut.update_for_phase(self.previous_game_phase) { - rec_mut.scoring_update(self.previous_game_phase, &vehicle_scorings)?; + // check for player id + if scoring_info.mNumVehicles == 0 { + self.player_id = None; + } else if self.player_id.is_none() { + for vehicle_scoring in vehicle_scorings.iter() { + if vehicle_scoring.mIsPlayer != 0 { + write_log!(format!("player found: {}", vehicle_scoring.mID)); + self.player_id = Some(vehicle_scoring.mID); + break; } } } - None => { - let now = self.start_time.elapsed(); - if now > (self.last_scoring_read + GAME_PHASE_TIME_OUT) { - if self.previous_game_phase != GamePhase::None { - self.previous_game_phase = GamePhase::None; + let phase = GamePhase::try_from(scoring_info.mSession)?; - for receiver in self.receivers.iter() { - receiver - .lock() - .unwrap() - .game_phase_change(self.previous_game_phase)?; - } - } + if self.previous_game_phase != phase { + self.previous_game_phase = phase; + + for receiver in self.receivers.iter() { + receiver + .lock() + .unwrap() + .game_phase_change(self.previous_game_phase)?; + } + } + + write_log!(format!("GamePhase: {:?}", self.previous_game_phase)); + + for receiver in self.receivers.iter() { + let mut rec_mut = receiver.lock().unwrap(); + + if rec_mut.update_for_phase(self.previous_game_phase) { + rec_mut.scoring_update(self.previous_game_phase, &vehicle_scorings)?; } } }