Add interfaces for getting textures from ar frames

This commit is contained in:
2024-07-05 14:08:04 +02:00
parent 86e7681a8d
commit 7e9c568779
7 changed files with 65 additions and 2 deletions

View File

@@ -22,4 +22,20 @@ namespace OpenVulkano::AR
else
m_session->GetRecorder().Save(shared_from_this());
}
void ArFrame::SaveToFile(const std::filesystem::path& path, bool downsample)
{
m_session->GetRecorder().SaveToFile(shared_from_this(), path, downsample);
}
const Scene::Texture* ArFrame::GetImageTexture()
{
if (!m_texture) m_texture = m_session->MakeTexture(this);
return m_texture;
}
ArFrame::~ArFrame()
{
if (m_texture) m_session->ReturnTexture(m_texture);
}
}

View File

@@ -13,8 +13,14 @@
#include "ArDepthFormat.hpp"
#include "ArTrackingState.hpp"
#include "ArFrameMetadata.hpp"
#include <memory>
#include <functional>
#include <filesystem>
#include <memory>
namespace OpenVulkano::Scene
{
class Texture;
}
namespace OpenVulkano::AR
{
@@ -89,6 +95,7 @@ namespace OpenVulkano::AR
{
std::shared_ptr<ArSession> m_session;
size_t m_frameId;
Scene::Texture* m_texture = nullptr;
bool m_saved = false;
bool m_highRes = false;
@@ -99,7 +106,7 @@ namespace OpenVulkano::AR
{}
public:
virtual ~ArFrame() = default;
virtual ~ArFrame();
[[nodiscard]] size_t GetFrameId() const { return m_frameId; }
@@ -139,8 +146,12 @@ namespace OpenVulkano::AR
[[nodiscard]] bool IsSaved() const { return m_saved; };
[[nodiscard]] const Scene::Texture* GetImageTexture();
void Save();
void SaveToFile(const std::filesystem::path& path, bool downsample = false);
void SetSaved() { m_saved = true; }
void MarkHighRes() { m_highRes = true; }

View File

@@ -19,6 +19,11 @@
#include <optional>
#include <future>
namespace OpenVulkano::Scene
{
class Texture;
}
namespace OpenVulkano::AR
{
class ArSession;
@@ -75,9 +80,15 @@ namespace OpenVulkano::AR
class ArSession
{
friend ArFrame;
protected:
ArSession(const ArSessionMetadata& metadata) : metadata(metadata), recorder(metadata.playback ? nullptr : this) {}
virtual Scene::Texture* MakeTexture(ArFrame* frame) = 0;
virtual void ReturnTexture(Scene::Texture* texture) = 0;
public:
/**
* Creates a platform native AR session. nullptr if failed to create session.

View File

@@ -47,6 +47,11 @@ namespace OpenVulkano::AR::ArKit
void OnArAnchorsUpdate(NSArray<__kindof ARAnchor*>* anchors);
bool ArShouldAttemptRelocalization();
protected:
Scene::Texture * MakeTexture(OpenVulkano::AR::ArFrame *frame) override;
void ReturnTexture(Scene::Texture *texture) override;
private:
ArKitDelegate* m_arKitDelegate;
ARWorldTrackingConfiguration* m_arConfig;

View File

@@ -12,6 +12,11 @@ namespace OpenVulkano::AR::Network
{
class ArSessionStream final : public ArSession
{
protected:
Scene::Texture * MakeTexture(OpenVulkano::AR::ArFrame *frame) override { return nullptr; } //TODO
void ReturnTexture(Scene::Texture *texture) override {} // TODO
public:
ArSessionStream(const std::string& serverAddress, std::optional<ArSessionConfig> requestConfig = std::nullopt);

View File

@@ -88,4 +88,14 @@ namespace OpenVulkano::AR::Playback
Stop();
OnSessionInterruptionChange(true);
}
Scene::Texture* ArSessionPlayback::MakeTexture(OpenVulkano::AR::ArFrame* frame)
{
return nullptr; //TODO
}
void ArSessionPlayback::ReturnTexture(Scene::Texture* texture)
{
//TODO
}
}

View File

@@ -31,6 +31,11 @@ class ArSessionPlayback final : public ArSession, public std::enable_shared_from
[[nodiscard]] ArType GetArType() override;
protected:
Scene::Texture * MakeTexture(OpenVulkano::AR::ArFrame *frame) override;
void ReturnTexture(Scene::Texture *texture) override;
private:
void ReadWorker();