Expose options to lock exposure time and white-balance and toggle flash
This commit is contained in:
@@ -219,6 +219,12 @@ namespace OpenVulkano::AR
|
|||||||
* @param renderer The renderer to be used to create textures.
|
* @param renderer The renderer to be used to create textures.
|
||||||
*/
|
*/
|
||||||
virtual void SetRenderer(IRenderer* renderer) = 0;
|
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.
|
* Gets the capabilities for this ArSession.
|
||||||
|
|||||||
@@ -50,6 +50,10 @@ namespace OpenVulkano::AR::ArKit
|
|||||||
bool ArShouldAttemptRelocalization();
|
bool ArShouldAttemptRelocalization();
|
||||||
|
|
||||||
void SetRenderer(IRenderer* renderer) override;
|
void SetRenderer(IRenderer* renderer) override;
|
||||||
|
|
||||||
|
void LockExposureTime(bool locked) override;
|
||||||
|
void LockWhitebalance(bool locked) override;
|
||||||
|
void SetFlashlightOn(bool on) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Scene::Texture * MakeTexture(ArFrame *frame) override;
|
Scene::Texture * MakeTexture(ArFrame *frame) override;
|
||||||
@@ -66,6 +70,9 @@ namespace OpenVulkano::AR::ArKit
|
|||||||
#else*/
|
#else*/
|
||||||
SpintexProtectedObject<std::shared_ptr<ArFrame>> m_frame;
|
SpintexProtectedObject<std::shared_ptr<ArFrame>> m_frame;
|
||||||
//#endif
|
//#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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#import <ARKit/ARConfiguration.h>
|
#import <ARKit/ARConfiguration.h>
|
||||||
#import <ARKit/ARCamera.h>
|
#import <ARKit/ARCamera.h>
|
||||||
#import <ARKit/ARKit.h>
|
#import <ARKit/ARKit.h>
|
||||||
|
#import <AVFoundation/AVCaptureDevice.h>
|
||||||
#import <CoreVideo/CoreVideo.h>
|
#import <CoreVideo/CoreVideo.h>
|
||||||
#import "ArKitDelegate.h"
|
#import "ArKitDelegate.h"
|
||||||
|
|
||||||
@@ -138,6 +139,11 @@ namespace OpenVulkano::AR::ArKit
|
|||||||
|
|
||||||
void ArSessionArKitInternal::Stop()
|
void ArSessionArKitInternal::Stop()
|
||||||
{
|
{
|
||||||
|
if (m_lockedConfiguration)
|
||||||
|
{
|
||||||
|
m_lockedConfiguration = false;
|
||||||
|
[[ARWorldTrackingConfiguration configurableCaptureDeviceForPrimaryCamera] unlockForConfiguration];
|
||||||
|
}
|
||||||
OnStopped();
|
OnStopped();
|
||||||
[m_arSession pause];
|
[m_arSession pause];
|
||||||
/*#if (__cplusplus >= 202002L)
|
/*#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!");
|
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
|
// AR Kit delegate events
|
||||||
@@ -201,6 +228,7 @@ namespace OpenVulkano::AR::ArKit
|
|||||||
}
|
}
|
||||||
OnNewFrameAvailable();
|
OnNewFrameAvailable();
|
||||||
m_frame = arFrame;
|
m_frame = arFrame;
|
||||||
|
Logger::AR->info("Exposure: {}; ColTemp: {}", 1.0/frame.camera.exposureDuration, frame.lightEstimate.ambientColorTemperature);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArSessionArKitInternal::OnArSessionInterruptedChanged(ARSession* session, bool interrupted)
|
void ArSessionArKitInternal::OnArSessionInterruptedChanged(ARSession* session, bool interrupted)
|
||||||
|
|||||||
Reference in New Issue
Block a user