From 82f0f28ed9180b7adbf41f13e673823c61cbe371 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sat, 18 Jul 2026 14:58:51 +0400 Subject: feat(render): support per-frame camera updates --- adapters/fparkan-render-vulkan/src/ffi/smoke.rs | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'adapters/fparkan-render-vulkan/src/ffi/smoke.rs') diff --git a/adapters/fparkan-render-vulkan/src/ffi/smoke.rs b/adapters/fparkan-render-vulkan/src/ffi/smoke.rs index 5db7e3b..63066b4 100644 --- a/adapters/fparkan-render-vulkan/src/ffi/smoke.rs +++ b/adapters/fparkan-render-vulkan/src/ffi/smoke.rs @@ -314,6 +314,32 @@ impl VulkanSmokeRenderer { self.swapchain_recreate_count } + /// Returns the camera that will be uploaded for the next recorded frame. + #[must_use] + pub const fn camera(&self) -> super::VulkanStaticCamera { + self.camera + } + + /// Replaces the camera for subsequent frames without recreating GPU resources. + /// + /// # Errors + /// + /// Returns [`VulkanSmokeRendererError::InvalidStaticCamera`] when a matrix + /// element is non-finite. The caller must update only between + /// [`Self::draw_frame`] calls on the renderer-owning thread. + pub fn set_camera( + &mut self, + camera: super::VulkanStaticCamera, + ) -> Result<(), VulkanSmokeRendererError> { + if !camera.is_finite() { + return Err(VulkanSmokeRendererError::InvalidStaticCamera { + context: "non-finite clip_from_world matrix", + }); + } + self.camera = camera; + Ok(()) + } + /// Explicitly idles and tears down the renderer while the native window is still alive. /// /// # Errors -- cgit v1.2.3