builder 和 运行时修改隔离开
This commit is contained in:
@@ -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
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user