diff --git a/CMakeLists.txt b/CMakeLists.txt index b14e2ba..64cd284 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ option(OPENVULKANO_ENABLE_TEST "Enable testing" ON) option(OPENVULKANO_ENABLE_EXAMPLES "Enable examples" ON) option(OPENVULKANO_ENABLE_MSDF "Enable msdf library" ON) option(OPENVULKANO_ENABLE_SHADERC "Enable runtime shader compiler" OFF) +option(OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH "Enable arkit TrueDepth (Front Depth Camera) APIs" OFF) # TrueDepth need special privacy policy treatment and must not be included in app if not used by dev # ----------------------------------------------------------------- if (IOS) diff --git a/openVulkanoCpp/AR/Provider/ArKit/ArFrameArKit.mm b/openVulkanoCpp/AR/Provider/ArKit/ArFrameArKit.mm index 3adfa61..c7e6738 100644 --- a/openVulkanoCpp/AR/Provider/ArKit/ArFrameArKit.mm +++ b/openVulkanoCpp/AR/Provider/ArKit/ArFrameArKit.mm @@ -42,10 +42,12 @@ namespace OpenVulkano::AR::ArKit { return GetSize(arKitFrame.smoothedSceneDepth.depthMap); } +#ifdef OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH if(arKitFrame.capturedDepthData) { return GetSize(arKitFrame.capturedDepthData.depthDataMap); } +#endif } return { -1, -1 }; } @@ -117,6 +119,7 @@ namespace OpenVulkano::AR::ArKit m_depthImage.format = ArDepthFormat::METER_FP32; m_depthImage.confidence.resolution = m_depthImage.depth.resolution; } +#ifdef OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH else if (m_arKitFrame.capturedDepthData) { auto depthFormat = arKitFrame.capturedDepthData.depthDataType; @@ -126,6 +129,7 @@ namespace OpenVulkano::AR::ArKit depthFormat == kCVPixelFormatType_DisparityFloat16 ? "DisparityFloat16" : (depthFormat == kCVPixelFormatType_DisparityFloat32 ? "DisparityFloat32" : "Unknown"), depthFormat); m_depthImage.confidence.resolution = { 1, 1 }; } +#endif m_depthImage.intrinsic = frameMetadata.intrinsic.GetForResolution(m_depthImage.depth.resolution); } @@ -147,10 +151,12 @@ namespace OpenVulkano::AR::ArKit CVPixelBufferUnlockBaseAddress(m_arKitFrame.smoothedSceneDepth.depthMap, kCVPixelBufferLock_ReadOnly); CVPixelBufferUnlockBaseAddress(m_arKitFrame.smoothedSceneDepth.confidenceMap, kCVPixelBufferLock_ReadOnly); } - else +#ifdef OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH + else if (m_arKitFrame.capturedDepthData) { CVPixelBufferUnlockBaseAddress(m_arKitFrame.capturedDepthData.depthDataMap, kCVPixelBufferLock_ReadOnly); } +#endif } [m_arKitFrame release]; } @@ -201,7 +207,8 @@ namespace OpenVulkano::AR::ArKit m_depthImage.confidence.data = CVPixelBufferGetBaseAddress(m_arKitFrame.smoothedSceneDepth.confidenceMap); m_lockedDepth = true; } - else if(m_arKitFrame.capturedDepthData) +#ifdef OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH + else if (m_arKitFrame.capturedDepthData) { CVPixelBufferLockBaseAddress(m_arKitFrame.capturedDepthData.depthDataMap, kCVPixelBufferLock_ReadOnly); m_depthImage.depth.data = CVPixelBufferGetBaseAddress(m_arKitFrame.capturedDepthData.depthDataMap); @@ -209,6 +216,8 @@ namespace OpenVulkano::AR::ArKit m_depthImage.confidence.data = &m_frameDepthQuality; m_lockedDepth = true; } +#endif + else Logger::AR->warn("Could not acquire depth image, because none was captured."); } } return m_depthImage; diff --git a/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm b/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm index df09743..30eacdc 100644 --- a/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm +++ b/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm @@ -32,10 +32,20 @@ namespace OpenVulkano::AR::ArKit { namespace { + NSArray* GetSupportedVideoFormats(bool frontCam) + { + if (!frontCam) return [ARWorldTrackingConfiguration supportedVideoFormats]; +#ifdef OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH + return [ARFaceTrackingConfiguration supportedVideoFormats]; +#else + return @[]; +#endif + } + std::string SupportedVideoFormatsToString(bool frontCam) { std::stringstream ss("[ "); - auto vidFormats = frontCam ? [ARFaceTrackingConfiguration supportedVideoFormats] : [ARWorldTrackingConfiguration supportedVideoFormats]; + NSArray* vidFormats = GetSupportedVideoFormats(frontCam); for (ARVideoFormat* format: vidFormats) { if (ss.tellp() > std::streampos(5)) ss << ", "; @@ -71,9 +81,13 @@ namespace OpenVulkano::AR::ArKit m_arKitDelegate = [[ArKitDelegate alloc] initWithFrameHandler:this]; if (config.useFrontCamera) { +#ifdef OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH ARFaceTrackingConfiguration* arConfig = [ARFaceTrackingConfiguration new]; arConfig.worldTrackingEnabled = true; m_arConfig = arConfig; +#else + throw std::runtime_error("TrueDepth APIs are disabled in the current build! Enable OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH to enable front tracking experiences."); +#endif } else { diff --git a/openVulkanoCpp/CMakeLists.txt b/openVulkanoCpp/CMakeLists.txt index 6875b74..2ddd42d 100644 --- a/openVulkanoCpp/CMakeLists.txt +++ b/openVulkanoCpp/CMakeLists.txt @@ -81,3 +81,7 @@ LinkMsdf(openVulkanoCpp) SetGlmDefines(openVulkanoCpp) add_compile_definitions(LIBARCHIVE_STATIC) add_compile_definitions("$<$:DEBUG>") + +if (OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH) + target_compile_definitions(openVulkanoCpp PUBLIC OPENVULKANO_ENABLE_ARKIT_TRUEDEPTH) +endif () \ No newline at end of file