Expose options to lock exposure time and white-balance and toggle flash

This commit is contained in:
Georg Hagen
2024-07-31 23:30:28 +02:00
parent 9f9e916110
commit 91ac458e18
3 changed files with 42 additions and 1 deletions

View File

@@ -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<std::shared_ptr<ArFrame>> 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;
};
}

View File

@@ -22,6 +22,7 @@
#import <ARKit/ARConfiguration.h>
#import <ARKit/ARCamera.h>
#import <ARKit/ARKit.h>
#import <AVFoundation/AVCaptureDevice.h>
#import <CoreVideo/CoreVideo.h>
#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)