改链式调用

This commit is contained in:
2026-08-22 01:25:50 +08:00
parent a8f102bdb1
commit 424784f47d
6 changed files with 535 additions and 554 deletions
@@ -9,8 +9,7 @@ namespace aethera::render_2d {
/* 执行二维 Renderable 图、合成颜色层并发布最终像素帧。 */
struct Render_Scene_2D : Def<Render_Scene_2D, Scene,
Dependency_Graph_Type<Paint_Tag, Renderable_2D_Base>,
Dependency_Graph_Type<Paint_Cache_Tag, Renderable_2D_Base>
> {
Dependency_Graph_Type<Paint_Cache_Tag, Renderable_2D_Base>> {
struct Prop : Prev_Prop {
Size viewport{}; /* 最终帧的像素尺寸;空尺寸不执行渲染。 */
Color background{Color::black()}; /* 每帧合成前写入的背景颜色。 */
@@ -25,10 +24,11 @@ struct Render_Scene_2D : Def<Render_Scene_2D, Scene,
template <typename Object>
struct Builder : Prev_Builder<Object> {
using Base = Prev_Builder<Object>;
using Final_Builder = typename Object::Builder;
Builder();
template <Attached Renderable_Object>
requires std::derived_from<Renderable_Object, Renderable_2D_Base>
Builder& add_renderable(Renderable_Object* renderable);
Final_Builder& add_renderable(Renderable_Object* renderable);
[[nodiscard]] std::expected<std::unique_ptr<Object>, Dependency_Graph_Error> build();
private:
std::vector<std::function<std::expected<void, Dependency_Graph_Error>(Object*)>> attachments{}; /* 仅在 build 期间绑定已构造 Renderable。 */
@@ -10,7 +10,7 @@ Render_Scene_2D::Builder<Object>::Builder() : Base() {}
template <typename Object>
template <Attached Renderable_Object>
requires std::derived_from<Renderable_Object, Renderable_2D_Base>
Render_Scene_2D::Builder<Object>& Render_Scene_2D::Builder<Object>::add_renderable(Renderable_Object* renderable) {
typename Render_Scene_2D::Builder<Object>::Final_Builder& Render_Scene_2D::Builder<Object>::add_renderable(Renderable_Object* renderable) {
attachments.emplace_back([renderable](Object* scene) {
auto& data = Base::private_access(renderable).template get<Renderable_2D_Base::Base_Tag>();
if (!data.scene_attach)
@@ -18,7 +18,7 @@ Render_Scene_2D::Builder<Object>& Render_Scene_2D::Builder<Object>::add_renderab
auto attach = std::move(data.scene_attach);
return attach(scene);
});
return *this;
return static_cast<Final_Builder&>(*this);
}
template <typename Object>
std::expected<std::unique_ptr<Object>, Dependency_Graph_Error> Render_Scene_2D::Builder<Object>::build() {