From 2504d4ee240fbea0f918c2bb1a214f4d63e6d475 Mon Sep 17 00:00:00 2001 From: hodasemi Date: Tue, 17 Jan 2023 07:57:56 +0100 Subject: [PATCH] Create gui handler --- Cargo.toml | 2 + src/overlay/elements/mod.rs | 0 src/overlay/elements/pedals.rs | 0 src/overlay/elements/radar.rs | 0 src/overlay/mod.rs | 93 ++++++++++++++++++++++++++++++++-- src/overlay/rendering.rs | 6 +++ src/overlay/rfactor_data.rs | 8 +-- 7 files changed, 100 insertions(+), 9 deletions(-) create mode 100644 src/overlay/elements/mod.rs create mode 100644 src/overlay/elements/pedals.rs create mode 100644 src/overlay/elements/radar.rs diff --git a/Cargo.toml b/Cargo.toml index 9e877bf..0891f89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,9 @@ crate-type = ["cdylib"] [dependencies] vulkan-rs = { git = "https://gavania.de/hodasemi/vulkan_lib.git" } +assetpath = { git = "https://gavania.de/hodasemi/vulkan_lib.git" } rfactor_sm_reader = { git = "https://gavania.de/hodasemi/rfactor_sm_reader.git" } +ui = { git = "https://gavania.de/hodasemi/ui.git" } anyhow = { version = "1.0.68", features = ["backtrace"] } cgmath = { version = "0.18.0", features = ["swizzle", "serde"] } diff --git a/src/overlay/elements/mod.rs b/src/overlay/elements/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/overlay/elements/pedals.rs b/src/overlay/elements/pedals.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/overlay/elements/radar.rs b/src/overlay/elements/radar.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/overlay/mod.rs b/src/overlay/mod.rs index ab05a89..48460ba 100644 --- a/src/overlay/mod.rs +++ b/src/overlay/mod.rs @@ -2,7 +2,7 @@ use crate::write_log; use self::{ rendering::Rendering, - rfactor_data::{DataConfig, RFactorData}, + rfactor_data::{RFactorData, RadarConfig}, }; mod pipeline; @@ -10,20 +10,24 @@ mod rendering; mod rfactor_data; use anyhow::Result; +use assetpath::AssetPath; use std::sync::{Arc, Mutex}; +use ui::prelude::*; use vulkan_rs::prelude::*; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] pub struct OverlayConfig { - pub data_config: DataConfig, + pub radar_config: RadarConfig, + pub font_path: String, } impl OverlayConfig { pub const fn new() -> Self { Self { - data_config: DataConfig::new(), + radar_config: RadarConfig::new(), + font_path: String::new(), } } } @@ -35,6 +39,7 @@ pub struct Overlay { device: Option>, queue: Option>>, rendering: Option, + gui_handler: Option>, rfactor_data: Option, } @@ -48,6 +53,7 @@ impl Overlay { device: None, queue: None, rendering: None, + gui_handler: None, rfactor_data: None, } @@ -98,9 +104,29 @@ impl Overlay { write_log!("-> create rendering: old cleared"); - self.rendering = Some(Rendering::new(self.device(), self.queue(), swapchain)?); + let rendering = Rendering::new(self.device(), self.queue(), swapchain.clone())?; + + // only font is used + let mut create_info = GuiHandlerCreateInfo::default(); + create_info.font_path = AssetPath::from(self.config.font_path.clone()); + create_info.font_path.assume_prefix_free(); + + let ctx = Arc::new(ContextImpl::new( + self.device(), + self.queue(), + swapchain, + rendering.images().clone(), + )); + + self.gui_handler = Some(GuiHandler::new( + create_info, + &(ctx as Arc), + )?); + + self.rendering = Some(rendering); write_log!("-> create rendering: new created"); + write_log!("-> create rendering: end"); Ok(()) @@ -111,7 +137,7 @@ impl Overlay { if self.rfactor_data.is_none() { self.rfactor_data = RFactorData::new( - self.config.data_config, + self.config.radar_config, self.device(), self.rendering .as_mut() @@ -139,3 +165,60 @@ impl Overlay { self.rendering.as_mut().unwrap().render(swapchain, &objects) } } + +struct ContextImpl { + device: Arc, + queue: Arc>, + swapchain: Arc, + images: Vec>, +} + +impl ContextImpl { + fn new( + device: Arc, + queue: Arc>, + swapchain: Arc, + images: Vec>, + ) -> Self { + Self { + device, + queue, + swapchain, + images, + } + } +} + +impl ContextInterface for ContextImpl { + fn device(&self) -> &Arc { + &self.device + } + + fn queue(&self) -> &Arc> { + &self.queue + } + + fn format(&self) -> VkFormat { + self.swapchain.format() + } + + fn image_layout(&self) -> VkImageLayout { + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR + } + + fn image_count(&self) -> usize { + self.images.len() + } + + fn images(&self) -> TargetMode>> { + TargetMode::Mono(self.images.clone()) + } + + fn width(&self) -> u32 { + self.swapchain.width() + } + + fn height(&self) -> u32 { + self.swapchain.height() + } +} diff --git a/src/overlay/rendering.rs b/src/overlay/rendering.rs index d36ba66..1637652 100644 --- a/src/overlay/rendering.rs +++ b/src/overlay/rendering.rs @@ -51,6 +51,7 @@ pub struct Rendering { pipeline: SingleColorPipeline, render_target: RenderTarget, command_buffer: Arc, + images: Vec>, queue: Arc>, } @@ -97,6 +98,7 @@ impl Rendering { pipeline: SingleColorPipeline::new(device.clone(), render_target.render_pass())?, render_target, command_buffer: CommandBuffer::new_primary().build(device.clone(), queue.clone())?, + images, queue, }) @@ -165,4 +167,8 @@ impl Rendering { Ok(()) } + + pub fn images(&self) -> &Vec> { + &self.images + } } diff --git a/src/overlay/rfactor_data.rs b/src/overlay/rfactor_data.rs index 919fd49..05835e7 100644 --- a/src/overlay/rfactor_data.rs +++ b/src/overlay/rfactor_data.rs @@ -20,7 +20,7 @@ pub trait RenderObject { } #[derive(Deserialize, Serialize, Clone, Copy, Debug)] -pub struct DataConfig { +pub struct RadarConfig { pub radar_scale: f32, pub radar_center_factor: f32, pub radar_transparency: f32, @@ -31,7 +31,7 @@ pub struct DataConfig { pub danger_color: Vector3, } -impl DataConfig { +impl RadarConfig { pub const fn new() -> Self { Self { radar_scale: 1.0, @@ -48,7 +48,7 @@ impl DataConfig { pub struct RFactorData { // config - config: DataConfig, + config: RadarConfig, // rf2 memory mapped data telemetry_reader: TelemetryReader, @@ -82,7 +82,7 @@ pub struct RFactorData { impl RFactorData { pub fn new( - config: DataConfig, + config: RadarConfig, device: Arc, descriptor_layout: &Arc, width: u32,