/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "ArSession.h" #ifndef __APPLE__ #include "Provider/Playback/ArSessionPlayback.h" #endif #include "Provider/Network/ArSessionStream.h" #ifdef __APPLE__ #include "Provider/ArKit/ArSessionArKit.h" #else #ifdef ANDROID #include "Provider/ArCore/ArSessionArCore.h" #else #include "Provider/ArSessionNull.hpp" #endif #endif namespace openVulkanoCpp::AR { std::vector> ArSession::sessions; std::weak_ptr ArSession::nativeSession; ArCreateResult ArSession::Create(const ArSessionConfig& config) { if (!IsNativeArAvailable()) { return { nullptr, ArCreateResult::FAILED_NOT_SUPPORTED, "No native AR implementation available for current system." }; } if (auto session = nativeSession.lock()) { return { session, ArCreateResult::FAILED_ALREADY_CREATED, "Session has already been created. Return existing session." }; } if (!GetNativeCapabilities().IsDepthSupported() && config.enableDepth) { return { nullptr, ArCreateResult::FAILED_INCOMPATIBLE_CONFIG, "AR depth is not supported on the current system." }; } try { if (auto session = NATIVE_AR_SESSION_CLASS::Create(config)) { return {session, ArCreateResult::SUCCESS, ""}; } return { nullptr, ArCreateResult::FAILED_NOT_SUPPORTED, "No implementation for current system." }; } catch (const std::exception& e) { return { nullptr, ArCreateResult::FAILED_UNKNOWN, e.what() }; } catch (...) {} return { nullptr, ArCreateResult::FAILED_UNKNOWN, "Unknown exception while initializing AR system." }; } ArCreateResult ArSession::CreatePlayback(const std::string& recordingPath, bool autoAdvance) { return { nullptr, ArCreateResult::FAILED_NOT_SUPPORTED, "not yet implemented" }; try { /*const auto session = std::make_shared(recordingPath, autoAdvance); sessions.push_back(session); return { session, ArCreateResult::SUCCESS, "" };*/ } catch (const std::exception& e) { // TODO error handling return { nullptr, ArCreateResult::FAILED_INVALID_PATH, e.what() }; } catch (...) {} return { nullptr, ArCreateResult::FAILED_UNKNOWN, "Unknown exception while initializing AR system." }; } ArCreateResult ArSession::CreateNetwork(const std::string& serverAddress, std::optional requestConfig) { return { nullptr, ArCreateResult::FAILED_NOT_SUPPORTED, "not yet implemented" }; try { const auto session = std::make_shared(serverAddress, requestConfig); sessions.push_back(session); return { session, ArCreateResult::SUCCESS, "" }; } catch (std::exception& e) {} // TODO error handling catch (...) {} return { nullptr, ArCreateResult::FAILED_UNKNOWN, "Unknown exception while initializing networked AR system." }; } std::future ArSession::CreateNetworkAsync(const std::string& serverAddress, std::optional requestConfig) { return std::async(&CreateNetwork, serverAddress, requestConfig); } std::shared_ptr ArSession::GetPrimarySession() { const auto activeSessions = GetActiveSessions(); if (activeSessions.empty()) return nullptr; return activeSessions[0]; } std::vector> ArSession::GetActiveSessions() { std::vector> activeSessions; auto it = sessions.begin(); while(it != sessions.end()) { if (auto activeSession = (*it).lock()) { activeSessions.push_back(std::move(activeSession)); } else { it = sessions.erase(it); } } return activeSessions; } bool ArSession::IsNativeArAvailable() { return NATIVE_AR_SESSION_CLASS::IsAvailable(); } const ArSessionCapabilities& ArSession::GetNativeCapabilities() { return NATIVE_AR_SESSION_CLASS::GetCapabilities(); } }