use super::super::generation::{PendingDenoiseGeneration, PendingGuideGeneration};
use crate::bridge::{
frame_cache::guide_pass::{GuideCache, GuideKey},
remote::{
handoff::HandoffMachine,
remote_render::{RemoteConnectionHandle, RemoteRenderHandle},
},
render_thread::{RedrawGate, RenderContext},
};
use indicatrix_net::client::Accumulator;
use std::{
sync::{Arc, Mutex, PoisonError},
time::Instant,
};
#[derive(Debug, Clone, Copy, PartialEq)]
pub(super) struct Pose {
pub(super) yaw: f32,
pub(super) pitch: f32,
pub(super) distance: f32,
pub(super) light_yaw: f32,
pub(super) light_pitch: f32,
}
pub(super) fn current_pose(ctx: &Mutex<RenderContext>) -> Pose {
let guard = ctx
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner);
Pose {
yaw: guard.yaw,
pitch: guard.pitch,
distance: guard.distance,
light_yaw: guard.light_yaw,
light_pitch: guard.light_pitch,
}
}
pub(super) struct Orchestrator {
pub(super) handoff: HandoffMachine,
pub(super) remote_handle: Option<RemoteRenderHandle>,
pub(super) accumulator: Option<Arc<Mutex<Accumulator>>>,
pub(super) current_request_id: Option<u32>,
pub(super) remote_connection: Option<RemoteConnectionHandle>,
pub(super) last_pose: Pose,
pub(super) last_change_at: Instant,
pub(super) guide_cache: GuideCache,
pub(super) pending_guide_gen: Option<PendingGuideGeneration>,
pub(super) pending_denoise_gen: Option<PendingDenoiseGeneration>,
pub(super) last_denoised: Option<(GuideKey, Vec<u8>)>,
pub(super) redraw_gate: RedrawGate<()>,
pub(super) last_redraw_at: Option<Instant>,
}
pub(super) fn lock(state: &Arc<Mutex<Orchestrator>>) -> std::sync::MutexGuard<'_, Orchestrator> {
state.lock().unwrap_or_else(PoisonError::into_inner)
}