use crate::write_log; use self::{rendering::Rendering, rfactor_data::RFactorData}; mod pipeline; mod rendering; mod rfactor_data; use anyhow::Result; use std::sync::{Arc, Mutex}; use vulkan_rs::prelude::*; pub struct Overlay { instance: Option>, device: Option>, queue: Option>>, rendering: Option, rfactor_data: RFactorData, } impl Overlay { pub const fn new() -> Self { Self { instance: None, device: None, queue: None, rendering: None, rfactor_data: RFactorData::default(), } } pub fn set_instance(&mut self, instance: Arc) { self.instance = Some(instance); } pub fn instance(&self) -> Arc { self.instance.as_ref().unwrap().clone() } pub fn set_device(&mut self, device: Arc) { self.device = Some(device); } pub fn device(&self) -> Arc { self.device.as_ref().unwrap().clone() } pub fn has_queue(&self) -> bool { self.queue.is_some() } pub fn add_queue(&mut self, queue: Arc>) { self.queue = Some(queue); } pub fn queue(&self) -> Arc> { self.queue.as_ref().unwrap().clone() } pub fn swapchain(&self) -> &Arc { self.rendering.as_ref().unwrap().swapchain() } pub fn create_rendering(&mut self, swapchain: Arc) -> Result<()> { write_log("-> create rendering: start"); self.rendering = None; write_log("-> create rendering: old cleared"); self.rendering = Some(Rendering::new(self.device(), self.queue(), swapchain)?); write_log("-> create rendering: new created"); write_log("-> create rendering: end"); Ok(()) } pub fn render(&mut self) -> Result { self.rfactor_data.update()?; let device = self.device(); let queue = self.queue(); let swapchain = self.swapchain().clone(); self.rendering .as_mut() .unwrap() .render(device, queue, swapchain, &self.rfactor_data) } }