diff options
| author | Valentin Popov <valentin@popov.link> | 2026-07-18 07:46:16 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-07-18 07:46:16 +0300 |
| commit | b1408b0907db19033771bd03cdf1b9184250e9d6 (patch) | |
| tree | 4eb9658a0b37cbdcc5c77be371c9997d03cc2e07 /apps/fparkan-vulkan-smoke/src | |
| parent | 4feada1bf4e2cb14f1be4f35bb789b8902e88926 (diff) | |
| download | fparkan-b1408b0907db19033771bd03cdf1b9184250e9d6.tar.xz fparkan-b1408b0907db19033771bd03cdf1b9184250e9d6.zip | |
feat(vulkan): draw original terrain geometry
Diffstat (limited to 'apps/fparkan-vulkan-smoke/src')
| -rw-r--r-- | apps/fparkan-vulkan-smoke/src/main.rs | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/apps/fparkan-vulkan-smoke/src/main.rs b/apps/fparkan-vulkan-smoke/src/main.rs index 48bd766..2b7e00b 100644 --- a/apps/fparkan-vulkan-smoke/src/main.rs +++ b/apps/fparkan-vulkan-smoke/src/main.rs @@ -14,10 +14,10 @@ use fparkan_platform::RenderRequest; use fparkan_platform_winit::{window_native_handles, WinitWindowPlan}; use fparkan_render_vulkan::{ - project_msh_to_static_mesh, VulkanSmokeBootstrapProgress, VulkanSmokeFrameOutcome, - VulkanSmokeRenderer, VulkanSmokeRendererCreateInfo, VulkanSmokeRendererReport, - VulkanSmokeShutdownReport, VulkanStaticMaterial, VulkanStaticMesh, VulkanStaticTexture, - VulkanValidationReport, + project_land_msh_to_static_mesh, project_msh_to_static_mesh, VulkanSmokeBootstrapProgress, + VulkanSmokeFrameOutcome, VulkanSmokeRenderer, VulkanSmokeRendererCreateInfo, + VulkanSmokeRendererReport, VulkanSmokeShutdownReport, VulkanStaticMaterial, VulkanStaticMesh, + VulkanStaticTexture, VulkanValidationReport, }; use serde::Serialize; use std::path::PathBuf; @@ -179,6 +179,9 @@ enum MeshInput { archive: String, name: String, }, + LandMsh { + path: PathBuf, + }, } impl MeshInput { @@ -186,13 +189,14 @@ impl MeshInput { match self { Self::SmokeTriangle => "synthetic-smoke-triangle", Self::Msh { .. } => "original-msh", + Self::LandMsh { .. } => "original-land-msh", } } fn archive(&self) -> &str { match self { - Self::SmokeTriangle => "", Self::Msh { archive, .. } => archive, + Self::SmokeTriangle | Self::LandMsh { .. } => "", } } @@ -200,6 +204,7 @@ impl MeshInput { match self { Self::SmokeTriangle => "", Self::Msh { name, .. } => name, + Self::LandMsh { .. } => "Land.msh", } } } @@ -214,6 +219,7 @@ impl SmokeOptions { let mut model_root = None; let mut model_archive = None; let mut model_name = None; + let mut terrain_path = None; let mut texture_root = None; let mut texture_archive = None; let mut texture_name = None; @@ -273,6 +279,13 @@ impl SmokeOptions { .ok_or_else(|| "--model-name requires a value".to_string())?, ); } + "--terrain-path" => { + terrain_path = Some( + iter.next() + .map(PathBuf::from) + .ok_or_else(|| "--terrain-path requires a path".to_string())?, + ); + } "--texture-root" => { texture_root = Some( iter.next() @@ -335,19 +348,21 @@ impl SmokeOptions { if timeout_seconds == 0 { return Err("native smoke requires --timeout-seconds >= 1".to_string()); } - let mesh_input = match (model_root, model_archive, model_name) { - (None, None, None) => MeshInput::SmokeTriangle, - (Some(root), Some(archive), Some(name)) => MeshInput::Msh { + let mesh_input = match (terrain_path, model_root, model_archive, model_name) { + (Some(path), None, None, None) => MeshInput::LandMsh { path }, + (None, None, None, None) => MeshInput::SmokeTriangle, + (None, Some(root), Some(archive), Some(name)) => MeshInput::Msh { root, archive, name, }, - _ => { + (None, _, _, _) => { return Err( "--model-root, --model-archive and --model-name must be supplied together" .to_string(), ); } + _ => return Err("--terrain-path cannot be combined with --model-*".to_string()), }; let texture_input = match (texture_root, texture_archive, texture_name) { (None, None, None) => None, @@ -414,6 +429,10 @@ impl SmokeOptions { let model = fparkan_inspection::load_model_from_root(root, archive, name)?; project_msh_to_static_mesh(&model).map_err(|err| err.to_string()) } + MeshInput::LandMsh { path } => { + let terrain = fparkan_inspection::load_land_msh_from_path(path)?; + project_land_msh_to_static_mesh(&terrain).map_err(|err| err.to_string()) + } } } @@ -1488,6 +1507,24 @@ mod tests { } #[test] + fn parses_original_land_msh_as_direct_terrain_input() { + let parsed = SmokeOptions::parse(&[ + "--out".to_string(), + "target/report.json".to_string(), + "--terrain-path".to_string(), + "C:/GOG/DATA/MAPS/11/Land.msh".to_string(), + ]); + + assert!(matches!( + parsed, + Ok(SmokeOptions { + mesh_input: MeshInput::LandMsh { path }, + .. + }) if path == std::path::Path::new("C:/GOG/DATA/MAPS/11/Land.msh") + )); + } + + #[test] fn rejects_partial_original_msh_input() { let parsed = SmokeOptions::parse(&[ "--out".to_string(), |
