diff --git a/openVulkanoCpp/AR/Provider/Playback/ArPlaybackReader.hpp b/openVulkanoCpp/AR/Provider/Playback/ArPlaybackReader.hpp index 7644ee6..495297e 100644 --- a/openVulkanoCpp/AR/Provider/Playback/ArPlaybackReader.hpp +++ b/openVulkanoCpp/AR/Provider/Playback/ArPlaybackReader.hpp @@ -32,13 +32,15 @@ namespace OpenVulkano::AR::Playback static constexpr std::string_view TAR_EXTENSIONS_REGEX = R"(\.(tar(\.gz|\.bz2)?|tgz|tbz|tb2|tbz2))"; ArchiveReader m_archiveMetadata, m_archiveColor, m_archiveDepth, m_archiveConfidence; + size_t m_depthTotalSize = 0, m_depthReadSize = 0; + public: ArPlaybackReader(const std::string& recDir) { std::string extensions = R"((_\d+|\.part\d+)?)" + std::string(TAR_EXTENSIONS_REGEX); m_archiveMetadata.Open(recDir, ".*meta(data)?" + extensions); m_archiveColor.Open(recDir, ".*(color|image)" + extensions); - m_archiveDepth.Open(recDir, ".*depth" + extensions); + m_archiveDepth.Open(recDir, ".*depth" + extensions, &m_depthTotalSize); m_archiveConfidence.Open(recDir, ".*conf(idence)?" + extensions); } @@ -58,10 +60,17 @@ namespace OpenVulkano::AR::Playback DepthImage ReadDepthImage() { DepthImage img; - m_archiveDepth.GetNextFileAsStream([&img](const FileDescription&, std::istream& stream) { img.depth.Read(stream); }); + size_t& depthRead = m_depthReadSize; + m_archiveDepth.GetNextFileAsStream([&img, &depthRead](const FileDescription& desc, std::istream& stream) { img.depth.Read(stream); depthRead += desc.size + 1000; }); m_archiveConfidence.GetNextFileAsStream([&img](const FileDescription&, std::istream& stream) { img.confidence.Read(stream); }); + return img; } + + [[nodiscard]] double GetProgress() const + { + return static_cast(m_depthReadSize) / static_cast(m_depthTotalSize); + } [[nodiscard]] bool HasNext() const { diff --git a/openVulkanoCpp/AR/Provider/Playback/ArSessionPlayback.cpp b/openVulkanoCpp/AR/Provider/Playback/ArSessionPlayback.cpp index 480708e..d7604ac 100644 --- a/openVulkanoCpp/AR/Provider/Playback/ArSessionPlayback.cpp +++ b/openVulkanoCpp/AR/Provider/Playback/ArSessionPlayback.cpp @@ -88,6 +88,7 @@ namespace OpenVulkano::AR::Playback auto view = frame->GetCameraViewForCurrentDeviceOrientation(); OnNewCameraViewMatrix(view); } + OnPlaybackProgress(playbackReader.GetProgress()); } catch (const std::exception& e) { diff --git a/openVulkanoCpp/AR/Provider/Playback/ArSessionPlayback.hpp b/openVulkanoCpp/AR/Provider/Playback/ArSessionPlayback.hpp index 6681124..49b4090 100644 --- a/openVulkanoCpp/AR/Provider/Playback/ArSessionPlayback.hpp +++ b/openVulkanoCpp/AR/Provider/Playback/ArSessionPlayback.hpp @@ -32,6 +32,8 @@ class ArSessionPlayback final : public ArSession, public std::enable_shared_from [[nodiscard]] ArType GetArType() override; void SetRenderer(IRenderer* renderer) override; + + Event OnPlaybackProgress; protected: Scene::Texture * MakeTexture(OpenVulkano::AR::ArFrame *frame) override;