#include "Render_Frame_Snapshot.h" #include "../architecture/Renderable.h" #include "../architecture/Timeline_Stream.h" #include namespace renderive { bool Render_Frame_Snapshot::destroying() const { return !destroying_token || destroying_token->load(std::memory_order_acquire); } const Renderable_Frame_Node* Render_Frame_Snapshot::frame_node_for(const Renderable* renderable) const { if (!renderable || !frame_tree) return nullptr; if (const auto* node = find_node(renderable->node_id())) return node; for (const auto& node : *frame_tree) { if (node.renderable.get() == renderable) return &node; } return nullptr; } const Renderable_Frame_Node* Render_Frame_Snapshot::find_node(Renderable_Id id) const { if (!id || !frame_tree) return nullptr; for (const auto& node : *frame_tree) { if (node.node_id == id) return &node; } return nullptr; } std::shared_ptr Render_Frame_Snapshot::timeline_snapshot( const std::shared_ptr& stream, int time_point_size, int label_tick_interval, bool start_coord_to_end_coord) const { if (!stream) return {}; time_point_size = std::max(1, time_point_size); label_tick_interval = std::max(1, label_tick_interval); if (!timeline_cache) timeline_cache = std::make_shared(); for (auto& item : timeline_cache->items) { if (item.stream.lock() == stream && item.time_point_size == time_point_size && item.tick_space == label_tick_interval && item.start_coord_to_end_coord == start_coord_to_end_coord) return item.snapshot; } auto snapshot = std::make_shared(stream->capture(time_point_size, label_tick_interval, start_coord_to_end_coord)); timeline_cache->items.push_back({stream, time_point_size, label_tick_interval, start_coord_to_end_coord, snapshot}); return snapshot; } } // namespace renderive