Files
Renderive/Core/render/Render_Frame_Snapshot.cpp
T
2026-08-02 18:58:35 +08:00

55 lines
2.0 KiB
C++

#include "Render_Frame_Snapshot.h"
#include "../architecture/Renderable.h"
#include "../architecture/Timeline_Stream.h"
#include <algorithm>
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<const Timeline_Stream_Snapshot> Render_Frame_Snapshot::timeline_snapshot(
const std::shared_ptr<Timeline_Stream>& 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<Timeline_Stream_Frame_Cache>();
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<Timeline_Stream_Snapshot>(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