builder 和 运行时修改隔离开

This commit is contained in:
2026-08-13 11:25:38 +08:00
parent 9e598a0318
commit 4a48e62aea
57 changed files with 1512 additions and 2592 deletions
+2 -2
View File
@@ -11,8 +11,8 @@ private:
void paint(Painter&, const Paint_Render_Context&) override {}
};
}
std::shared_ptr<Renderable> make_renderable_group(::Scene_Base& scene, bool cache_enabled) {
return scene.make_renderable<Renderable_Group>(cache_enabled);
renderive_Owner<Renderable> make_renderable_group(bool cache_enabled) {
return renderive_Owner<Renderable_Group>::make(cache_enabled);
}
void record_performance_frame(Performance_Overlay& overlay, double duration_ms, const Low_Latency_Diagnostics& diagnostics, std::size_t renderable_count, Size viewport) {
overlay.record_frame(duration_ms, diagnostics, renderable_count, viewport);
+8 -40
View File
@@ -171,7 +171,7 @@ constexpr Frame_Control_Mode frame_control_mode() noexcept {
return Frame_Control_Mode::Low_Latency;
return Frame_Control_Mode::Playback;
}
LIB_DECL std::shared_ptr<Renderable> make_renderable_group(::Scene_Base& scene, bool cache_enabled);
LIB_DECL renderive_Owner<Renderable> make_renderable_group(bool cache_enabled);
LIB_DECL void record_performance_frame(Performance_Overlay& overlay, double duration_ms, const Low_Latency_Diagnostics& diagnostics, std::size_t renderable_count, Size viewport);
inline std::string observer_event_name(Frame_Control_Mode mode, std::uint32_t event) {
if (mode == Frame_Control_Mode::Manual) {
@@ -207,40 +207,22 @@ public:
std::lock_guard lock(initialization_mutex_);
if (root_renderable())
return;
auto root = detail::make_renderable_group(*this, true);
auto root = detail::make_renderable_group(true);
root->set_object_name("root");
auto builder = this->attach_builder();
builder.attach(root);
}
[[nodiscard]] std::shared_ptr<Renderable> root_renderable() const {
[[nodiscard]] renderive_Owner<Renderable> root_renderable() const {
const auto topology = this->topology_snapshot();
for (const auto& relationship : topology.display) {
if (relationship.parent)
continue;
auto base = std::const_pointer_cast<::Renderable_Base>(relationship.child);
if (auto renderable = std::dynamic_pointer_cast<Renderable>(base))
auto base = renderive_const_owner_cast<::Renderable_Base>(relationship.child);
if (auto renderable = renderive_dynamic_owner_cast<Renderable>(base))
return renderable;
}
return {};
}
[[nodiscard]] std::shared_ptr<Renderable> create_renderable_node(const std::shared_ptr<Renderable>& parent, std::string object_name = {}) {
auto renderable = detail::make_renderable_group(*this, true);
renderable->set_object_name(std::move(object_name));
attach_renderable_node(renderable, parent);
return renderable;
}
template <class T, class... Args>
requires std::derived_from<T, Renderable> && std::constructible_from<T, ::Scene_Base&, Args&&...>
std::shared_ptr<T> make_renderable(const std::shared_ptr<Renderable>& parent, Args&&... args) {
auto renderable = Kernel_Scene::template make_renderable<T>(std::forward<Args>(args)...);
attach_renderable_node(renderable, parent);
return renderable;
}
::Scene_Base::Mutation remove_renderable(const std::shared_ptr<Renderable>& renderable) {
if (!renderable || renderable == root_renderable())
return {};
return this->detach_renderable(renderable);
}
void set_background_color(Color color) {
if (background_color() == color)
return;
@@ -269,10 +251,10 @@ public:
void dispatch_event(const Event& event) {
const auto paint_order = this->paint_order_snapshot();
for (auto iterator = paint_order.rbegin(); iterator != paint_order.rend(); ++iterator) {
auto base = std::const_pointer_cast<::Renderable_Base>(*iterator);
if (auto renderable = std::dynamic_pointer_cast<Renderable>(base)) {
auto base = renderive_const_owner_cast<::Renderable_Base>(*iterator);
if (auto renderable = renderive_dynamic_owner_cast<Renderable>(base)) {
if (renderable->is_visible()) {
if (auto handler = std::dynamic_pointer_cast<Event_Handler>(base))
if (auto handler = renderive_dynamic_owner_cast<Event_Handler>(base))
handler->handle_event(event);
}
if (event.is_accepted())
@@ -475,20 +457,6 @@ public:
private:
explicit Basic_Scene2D(std::shared_ptr<detail::Frame_Observer_Data> observer)
: Kernel_Scene(*memory_resource(Memory_Domain::Plot_Frame), detail::Frame_Observer_State(detail::Frame_Observer{observer})), observer_(std::move(observer)) {}
void attach_renderable_node(const std::shared_ptr<Renderable>& renderable, const std::shared_ptr<Renderable>& parent) {
if (!renderable)
throw std::invalid_argument("renderable is null");
auto actual_parent = parent;
if (!actual_parent) {
actual_parent = root_renderable();
if (!actual_parent)
throw std::logic_error("Scene2D::init must be called before adding renderables");
}
this->attach_renderable(renderable, {
.display_parents = {actual_parent},
.dependency_parents = {actual_parent}
});
}
std::shared_ptr<detail::Frame_Observer_Data> observer_;
mutable std::mutex control_mutex_;
std::mutex initialization_mutex_;