diff --git a/openVulkanoCpp/AR/ArSession.hpp b/openVulkanoCpp/AR/ArSession.hpp index 616b623..fc32621 100644 --- a/openVulkanoCpp/AR/ArSession.hpp +++ b/openVulkanoCpp/AR/ArSession.hpp @@ -219,6 +219,12 @@ namespace OpenVulkano::AR * @param renderer The renderer to be used to create textures. */ virtual void SetRenderer(IRenderer* renderer) = 0; + + virtual void LockExposureTime(bool locked) {}; + + virtual void LockWhitebalance(bool locked) {}; + + virtual void SetFlashlightOn(bool on) {}; /** * Gets the capabilities for this ArSession. diff --git a/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.h b/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.h index 5fc8f8d..75c7e10 100644 --- a/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.h +++ b/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.h @@ -50,6 +50,10 @@ namespace OpenVulkano::AR::ArKit bool ArShouldAttemptRelocalization(); void SetRenderer(IRenderer* renderer) override; + + void LockExposureTime(bool locked) override; + void LockWhitebalance(bool locked) override; + void SetFlashlightOn(bool on) override; protected: Scene::Texture * MakeTexture(ArFrame *frame) override; @@ -66,6 +70,9 @@ namespace OpenVulkano::AR::ArKit #else*/ SpintexProtectedObject> m_frame; //#endif - std::atomic_size_t m_frameId; + std::atomic_size_t m_frameId = 0; + bool m_lockedConfiguration = false; + bool m_lockedExposure = false; + bool m_lockedWhitebalance = false; }; } diff --git a/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm b/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm index 0556893..07b14e3 100644 --- a/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm +++ b/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm @@ -22,6 +22,7 @@ #import #import #import +#import #import #import "ArKitDelegate.h" @@ -138,6 +139,11 @@ namespace OpenVulkano::AR::ArKit void ArSessionArKitInternal::Stop() { + if (m_lockedConfiguration) + { + m_lockedConfiguration = false; + [[ARWorldTrackingConfiguration configurableCaptureDeviceForPrimaryCamera] unlockForConfiguration]; + } OnStopped(); [m_arSession pause]; /*#if (__cplusplus >= 202002L) @@ -183,6 +189,27 @@ namespace OpenVulkano::AR::ArKit Logger::AR->warn("Failed to perform high resolution still frame capture: requires iOS 16 or later!"); } } + + void ArSessionArKitInternal::LockExposureTime(bool locked) + { + AVCaptureDevice* dev = [ARWorldTrackingConfiguration configurableCaptureDeviceForPrimaryCamera]; + if (!m_lockedConfiguration) m_lockedConfiguration |=[dev lockForConfiguration:nil]; + [dev setExposureMode: locked ? AVCaptureExposureModeLocked : AVCaptureExposureModeContinuousAutoExposure]; + } + + void ArSessionArKitInternal::LockWhitebalance(bool locked) + { + AVCaptureDevice* dev = [ARWorldTrackingConfiguration configurableCaptureDeviceForPrimaryCamera]; + if (!m_lockedConfiguration) m_lockedConfiguration |=[dev lockForConfiguration:nil]; + [dev setWhiteBalanceMode: locked ? AVCaptureWhiteBalanceModeLocked : AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance]; + } + + void ArSessionArKitInternal::SetFlashlightOn(bool on) + { + AVCaptureDevice* dev = [ARWorldTrackingConfiguration configurableCaptureDeviceForPrimaryCamera]; + if (!m_lockedConfiguration) m_lockedConfiguration |=[dev lockForConfiguration:nil]; + [dev setTorchMode: on ? AVCaptureTorchModeOn : AVCaptureTorchModeOff]; + } // AR Kit delegate events @@ -201,6 +228,7 @@ namespace OpenVulkano::AR::ArKit } OnNewFrameAvailable(); m_frame = arFrame; + Logger::AR->info("Exposure: {}; ColTemp: {}", 1.0/frame.camera.exposureDuration, frame.lightEstimate.ambientColorTemperature); } void ArSessionArKitInternal::OnArSessionInterruptedChanged(ARSession* session, bool interrupted)