所有权添加完成

This commit is contained in:
2026-08-13 06:20:13 +08:00
parent 3e9b924776
commit a517804d27
51 changed files with 1961 additions and 1108 deletions
+15 -39
View File
@@ -3,8 +3,7 @@
#include "../render/Blend2D_Cache.h"
#include <algorithm>
#include <renderive/scene/base/Scene_Render_Context.hpp>
#include <renderive/scene/base/Render_Contexts.hpp>
namespace renderive {
@@ -29,18 +28,6 @@ Renderable::Renderable(::Scene_Base& scene, bool cache_enabled)
Renderable::~Renderable() = default;
void attach_renderable_child(::Scene_Base& scene, const std::shared_ptr<Renderable>& renderable, const std::shared_ptr<Renderable>& parent) {
scene.attach_renderable(renderable);
try {
scene.set_display_parent(*renderable, parent.get());
scene.set_dependency_parent(*renderable, parent.get());
} catch (...) {
scene.detach_renderable(*renderable);
throw;
}
scene.notify_model_dirty();
}
Renderable_Cache_Mode Renderable::get_cache_mode() const noexcept {
return configuration().cache_enabled
? Renderable_Cache_Mode::Local_Pixel
@@ -48,8 +35,9 @@ Renderable_Cache_Mode Renderable::get_cache_mode() const noexcept {
}
void Renderable::set_cache_mode(Renderable_Cache_Mode mode) {
scene().set_renderable_configuration(*this, {.cache_enabled = mode == Renderable_Cache_Mode::Local_Pixel});
scene().notify_model_dirty();
scene().set_renderable_configuration(
shared_from_this(),
{.cache_enabled = mode == Renderable_Cache_Mode::Local_Pixel});
}
std::string Renderable::object_name() const {
@@ -62,15 +50,6 @@ void Renderable::set_object_name(std::string name) {
object_name_ = std::move(name);
}
bool Renderable::is_visible() const noexcept {
return visible_.load(std::memory_order_acquire);
}
void Renderable::set_visible(bool visible) {
if (visible_.exchange(visible, std::memory_order_acq_rel) != visible)
changed();
}
Renderable_Observation Renderable::observation() const noexcept {
return observer_.observation();
}
@@ -84,14 +63,14 @@ void Renderable::observe_state(Renderable_Observer_Event event,
void Renderable::build_prepare_graph(Renderable_Graph_Builder& builder) {
add_prepare_task(builder, "prepare", "Prepare",
[this](const Render_State_View& state, const Scene_Render_Context& context) {
prepare_frame(state, context);
[this](const Prepare_Render_Context& context) {
prepare_frame(context);
});
}
void Renderable::build_paint_graph(Renderable_Graph_Builder& builder) {
const auto paint_task = add_paint_task(builder, "paint", "Paint",
[this](detail::Painter& painter, const Scene_Render_Context& context) {
[this](detail::Painter& painter, const Paint_Render_Context& context) {
paint(painter, context);
});
builder.precede(builder.find("prepare"), paint_task);
@@ -100,13 +79,10 @@ void Renderable::build_paint_graph(Renderable_Graph_Builder& builder) {
Renderable_Graph_Builder::Task Renderable::add_prepare_task(
Renderable_Graph_Builder& builder,
std::string logical_key,
std::string name,
Prepare_Task_Function function) {
std::string name,
Prepare_Task_Function function) {
return builder.emplace(std::move(logical_key), std::move(name),
Render_Node_Kind::prepare,
[this, function = std::move(function)](const Scene_Render_Context& context) {
function(render_state_view(), context);
});
std::move(function));
}
Renderable_Graph_Builder::Task Renderable::add_paint_task(
@@ -115,14 +91,14 @@ Renderable_Graph_Builder::Task Renderable::add_paint_task(
std::string name,
Paint_Task_Function function) {
return builder.emplace(std::move(logical_key), std::move(name),
Render_Node_Kind::paint,
[this, function = std::move(function)](const Scene_Render_Context& context) {
if (!is_visible() || context.color_cache == nullptr)
[function = std::move(function)](const Paint_Render_Context& context) {
if (!context.renderable.visible)
return;
auto* cache = dynamic_cast<detail::Blend2D_Color_Cache*>(context.color_cache);
auto* cache = dynamic_cast<detail::Blend2D_Color_Cache*>(&context.color_cache);
if (!cache)
return;
detail::Painter painter(*cache, {context.viewport.width, context.viewport.height});
detail::Painter painter(*cache, {context.frame.viewport.width,
context.frame.viewport.height});
if (painter)
function(painter, context);
});