添加外部内存数据源
This commit is contained in:
@@ -1,10 +1,13 @@
|
||||
#pragma once
|
||||
#include <algorithm>
|
||||
#include <concepts>
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include <memory_resource>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "renderive/base/memory/Memory_Resource.hpp"
|
||||
#include "renderive/base/observer/Observer.hpp"
|
||||
#include "renderive/frame_control/Frame_Control.hpp"
|
||||
#include "renderive/renderable/color/Concepts.hpp"
|
||||
@@ -14,6 +17,8 @@ struct Scene2D_Frame_Data {};
|
||||
struct Scene2D_State {
|
||||
std::uint64_t revision{};
|
||||
};
|
||||
template <class Frame_Control, class... Args>
|
||||
concept Scene2D_Frame_Control_Constructible = std::constructible_from<Frame_Control, Args...> || std::constructible_from<Frame_Control, std::pmr::memory_resource&, Args...>;
|
||||
template <class Strategy = Low_Latency_Strategy<Scene2D_Frame_Data>, Color_Cache_Type Cache = Recording_Color_Cache, class State = Scene2D_State, class State_Observer = Observer_State<>, class Scene_Observer = Observer_State<>>
|
||||
requires Frame_Control_Strategy_For<Strategy, Scene2D_Frame_Data> && State_Value<State>
|
||||
class Scene2D_Context : public Triple_State_Strategy<Scene_2D_Base, State, Atomic_Spin_Mutex, State_Observer> {
|
||||
@@ -27,14 +32,22 @@ public:
|
||||
using Painter_Lease = typename Frame_Control::Painter_Lease;
|
||||
using Render_Lease = typename Frame_Control::Render_Lease;
|
||||
template <class... Args>
|
||||
requires std::constructible_from<Frame_Control, Args&&...>
|
||||
explicit Scene2D_Context(Args&&... args) : Scene_State_Strategy(), frame_control(std::forward<Args>(args)...), display_root(nullptr), dependency_root(nullptr) {
|
||||
requires Scene2D_Frame_Control_Constructible<Frame_Control, Args&&...>
|
||||
explicit Scene2D_Context(Args&&... args) : Scene2D_Context(*std::pmr::get_default_resource(), std::forward<Args>(args)...) {}
|
||||
template <class... Args>
|
||||
requires Scene2D_Frame_Control_Constructible<Frame_Control, Args&&...>
|
||||
explicit Scene2D_Context(std::pmr::memory_resource& memory_resource, Args&&... args)
|
||||
: Scene_State_Strategy(State{}, memory_resource), frame_control(make_frame_control(this->memory_resource(), std::forward<Args>(args)...)), display_root(nullptr, this->memory_resource()), dependency_root(nullptr, this->memory_resource()), final_color_cache(make_cache(this->memory_resource())), color_caches_(&this->memory_resource()) {
|
||||
this->frame_control_strategy = &frame_control;
|
||||
}
|
||||
template <class... Args>
|
||||
requires std::constructible_from<Frame_Control, Args&&...>
|
||||
requires Scene2D_Frame_Control_Constructible<Frame_Control, Args&&...>
|
||||
Scene2D_Context(With_Observer<State_Observer> state_observer, With_Observer<Scene_Observer> scene_observer, Args&&... args)
|
||||
: Scene_State_Strategy(std::move(state_observer)), frame_control(std::forward<Args>(args)...), display_root(nullptr), dependency_root(nullptr), scene_observer_(std::move(scene_observer.observer)) {
|
||||
: Scene2D_Context(*std::pmr::get_default_resource(), std::move(state_observer), std::move(scene_observer), std::forward<Args>(args)...) {}
|
||||
template <class... Args>
|
||||
requires Scene2D_Frame_Control_Constructible<Frame_Control, Args&&...>
|
||||
Scene2D_Context(std::pmr::memory_resource& memory_resource, With_Observer<State_Observer> state_observer, With_Observer<Scene_Observer> scene_observer, Args&&... args)
|
||||
: Scene_State_Strategy(State{}, std::move(state_observer), memory_resource), frame_control(make_frame_control(this->memory_resource(), std::forward<Args>(args)...)), display_root(nullptr, this->memory_resource()), dependency_root(nullptr, this->memory_resource()), final_color_cache(make_cache(this->memory_resource())), scene_observer_(std::move(scene_observer.observer)), color_caches_(&this->memory_resource()) {
|
||||
this->frame_control_strategy = &frame_control;
|
||||
}
|
||||
~Scene2D_Context() override {
|
||||
@@ -53,7 +66,7 @@ protected:
|
||||
if (!renderable.dependency_node.parent) {
|
||||
dependency_root.append_child(renderable.dependency_node);
|
||||
}
|
||||
color_caches_.try_emplace(&renderable, std::make_unique<Cache>());
|
||||
color_caches_.try_emplace(&renderable, make_cache_pointer(this->memory_resource()));
|
||||
}
|
||||
void on_renderable_detached(Renderable_Base& renderable) override {
|
||||
promote_children(renderable.layer_node);
|
||||
@@ -87,22 +100,45 @@ protected:
|
||||
return scene_observer_.now_ns();
|
||||
}
|
||||
private:
|
||||
using Cache_Pointer = Memory_Resource_Unique_Ptr<Cache>;
|
||||
template <class... Args>
|
||||
static Frame_Control make_frame_control(std::pmr::memory_resource& memory_resource, Args&&... args) {
|
||||
if constexpr (std::constructible_from<Frame_Control, std::pmr::memory_resource&, Args&&...>) {
|
||||
return Frame_Control(memory_resource, std::forward<Args>(args)...);
|
||||
} else {
|
||||
return Frame_Control(std::forward<Args>(args)...);
|
||||
}
|
||||
}
|
||||
static Cache make_cache(std::pmr::memory_resource& memory_resource) {
|
||||
if constexpr (std::constructible_from<Cache, std::pmr::memory_resource&>) {
|
||||
return Cache(memory_resource);
|
||||
} else {
|
||||
return Cache();
|
||||
}
|
||||
}
|
||||
static Cache_Pointer make_cache_pointer(std::pmr::memory_resource& memory_resource) {
|
||||
if constexpr (std::constructible_from<Cache, std::pmr::memory_resource&>) {
|
||||
return make_memory_resource_unique<Cache>(memory_resource, memory_resource);
|
||||
} else {
|
||||
return make_memory_resource_unique<Cache>(memory_resource);
|
||||
}
|
||||
}
|
||||
template <class Node>
|
||||
static void promote_children(Node& node) {
|
||||
void promote_children(Node& node) {
|
||||
if (!node.parent) {
|
||||
return;
|
||||
}
|
||||
Node* parent = node.parent;
|
||||
const auto iterator = std::find(parent->children.begin(), parent->children.end(), &node);
|
||||
std::size_t index = static_cast<std::size_t>(iterator - parent->children.begin());
|
||||
const auto children = node.children;
|
||||
std::pmr::vector<Node*> children(node.children.begin(), node.children.end(), &this->memory_resource());
|
||||
node.detach();
|
||||
for (Node* child : children) {
|
||||
parent->insert_child(index++, *child);
|
||||
}
|
||||
}
|
||||
template <class Node>
|
||||
static void append_tree_order(Node& node, const std::unordered_map<Renderable_Base*, Renderable>& attached, std::unordered_set<Renderable_Base*>& visited, Renderable_List& order) {
|
||||
template <class Node, class Attached, class Visited>
|
||||
static void append_tree_order(Node& node, const Attached& attached, Visited& visited, Renderable_List& order) {
|
||||
if (node.owner) {
|
||||
auto iterator = attached.find(node.owner);
|
||||
if (iterator != attached.end() && visited.insert(node.owner).second) {
|
||||
@@ -114,14 +150,15 @@ private:
|
||||
}
|
||||
}
|
||||
template <class Node>
|
||||
static Renderable_List tree_order(Node& root, const Renderable_List& renderables) {
|
||||
std::unordered_map<Renderable_Base*, Renderable> attached;
|
||||
Renderable_List tree_order(Node& root, const Renderable_List& renderables) {
|
||||
std::pmr::monotonic_buffer_resource scratch_resource(&this->memory_resource());
|
||||
std::pmr::unordered_map<Renderable_Base*, Renderable> attached(&scratch_resource);
|
||||
attached.reserve(renderables.size());
|
||||
for (const Renderable& renderable : renderables) {
|
||||
attached.emplace(renderable.get(), renderable);
|
||||
}
|
||||
std::unordered_set<Renderable_Base*> visited;
|
||||
Renderable_List order;
|
||||
std::pmr::unordered_set<Renderable_Base*> visited(&scratch_resource);
|
||||
Renderable_List order(&this->memory_resource());
|
||||
order.reserve(renderables.size());
|
||||
append_tree_order(root, attached, visited, order);
|
||||
for (const Renderable& renderable : renderables) {
|
||||
@@ -132,5 +169,5 @@ private:
|
||||
return order;
|
||||
}
|
||||
Scene_Observer scene_observer_;
|
||||
std::unordered_map<Renderable_Base*, std::unique_ptr<Cache>> color_caches_;
|
||||
std::pmr::unordered_map<Renderable_Base*, Cache_Pointer> color_caches_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user