Start design of AR abstraction layer
This commit is contained in:
132
openVulkanoCpp/AR/ArSession.cpp
Normal file
132
openVulkanoCpp/AR/ArSession.cpp
Normal file
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
* 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<std::weak_ptr<ArSession>> ArSession::sessions;
|
||||
std::weak_ptr<ArSession> 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<Playback::ArSessionPlayback>(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<ArSessionConfig> requestConfig)
|
||||
{
|
||||
return { nullptr, ArCreateResult::FAILED_NOT_SUPPORTED, "not yet implemented" };
|
||||
try
|
||||
{
|
||||
const auto session = std::make_shared<Network::ArSessionStream>(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<ArCreateResult> ArSession::CreateNetworkAsync(const std::string& serverAddress, std::optional<ArSessionConfig> requestConfig)
|
||||
{
|
||||
return std::async(&CreateNetwork, serverAddress, requestConfig);
|
||||
}
|
||||
|
||||
std::shared_ptr<ArSession> ArSession::GetPrimarySession()
|
||||
{
|
||||
const auto activeSessions = GetActiveSessions();
|
||||
if (activeSessions.empty()) return nullptr;
|
||||
return activeSessions[0];
|
||||
}
|
||||
|
||||
std::vector<std::shared_ptr<ArSession>> ArSession::GetActiveSessions()
|
||||
{
|
||||
std::vector<std::shared_ptr<ArSession>> 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user