From 76e5737b1dd047aede7712a6143fef61654df669 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sun, 18 Oct 2026 14:29:24 +0400 Subject: Support parented camera capture matrices --- apps/fparkan-game/src/main.rs | 98 +++++++++++++++++++++- .../testdata/legacy-camera-parented.json | 14 ++++ 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 apps/fparkan-game/testdata/legacy-camera-parented.json (limited to 'apps') diff --git a/apps/fparkan-game/src/main.rs b/apps/fparkan-game/src/main.rs index 0c4c7eb..e25ee38 100644 --- a/apps/fparkan-game/src/main.rs +++ b/apps/fparkan-game/src/main.rs @@ -6599,6 +6599,9 @@ struct LegacyCameraCapture { schema: String, render_input_usable: Option, selector0_words: [u32; 16], + parented_camera: Option, + effective_world_matrix_space: Option, + effective_world_matrix_words: Option<[u32; 16]>, viewport: [i32; 4], near_plane: f32, far_plane: f32, @@ -6614,6 +6617,26 @@ fn selected_atmosphere_seconds( } impl LegacyCameraCapture { + fn preview_matrix_words(&self) -> Result<[u32; 16], String> { + match ( + self.effective_world_matrix_space.as_deref(), + self.effective_world_matrix_words, + ) { + (Some("world"), Some(words)) => Ok(words), + (Some(_), _) => Err( + "legacy camera effective_world_matrix_space must be 'world'".to_string(), + ), + (None, Some(_)) => Err( + "legacy camera effective_world_matrix_words requires an explicit world-space marker" + .to_string(), + ), + (None, None) if self.parented_camera == Some(true) => Err( + "parented legacy camera requires an effective world-space matrix".to_string(), + ), + (None, None) => Ok(self.selector0_words), + } + } + fn captured_viewport(&self) -> Result { let width = self.viewport[2] .checked_sub(self.viewport[0]) @@ -6637,7 +6660,7 @@ impl LegacyCameraCapture { fn preview_camera_frame(&self) -> Result { let frame = PreviewCameraFrame::from_legacy_d3d7( RawCameraTransform { - words: self.selector0_words, + words: self.preview_matrix_words()?, }, LegacyD3d7Projection { viewport: self.viewport, @@ -6668,6 +6691,14 @@ fn parse_legacy_camera_capture(bytes: &[u8]) -> Result