核心第一版

This commit is contained in:
2026-08-20 17:03:24 +08:00
parent b8a8470ced
commit a5cfb4baa9
21 changed files with 1510 additions and 1400 deletions
+37 -10
View File
@@ -1,9 +1,9 @@
#include "render.hpp"
#include "scene.hpp"
#include <gtest/gtest.h>
namespace {
struct Direct_State_Tag {};
struct Graph_State_Tag {};
struct Direct_Renderable : double_buffer::Impl<Direct_Renderable, aethera::Renderable, double_buffer::State_Type<Direct_State_Tag>> {
struct Direct_Renderable : double_buffer::Def<Direct_Renderable, aethera::Renderable, double_buffer::State_Type<Direct_State_Tag>> {
struct Prop : Prev_Prop {};
struct State : Prev_State<Direct_State_Tag> {
bool operator==(const State&) const = default;
@@ -19,7 +19,7 @@ struct Direct_Renderable : double_buffer::Impl<Direct_Renderable, aethera::Rende
}
};
};
struct Graph_Renderable : double_buffer::Impl<Graph_Renderable, aethera::Renderable, double_buffer::State_Type<Graph_State_Tag>> {
struct Graph_Renderable : double_buffer::Def<Graph_Renderable, aethera::Renderable, double_buffer::State_Type<Graph_State_Tag>> {
struct Prop : Prev_Prop {};
struct State : Prev_State<Graph_State_Tag> {
bool operator==(const State&) const = default;
@@ -43,11 +43,11 @@ struct Graph_Renderable : double_buffer::Impl<Graph_Renderable, aethera::Rendera
}
};
};
using Direct = double_buffer::Attach_Object<Direct_Renderable>;
using Graph = double_buffer::Attach_Object<Graph_Renderable>;
using Scene = double_buffer::Attach_Object<aethera::Scene>;
using Direct = double_buffer::Impl<Direct_Renderable>;
using Graph = double_buffer::Impl<Graph_Renderable>;
using Scene = double_buffer::Impl<aethera::Scene>;
struct Dependency_State_Tag {};
struct Dependency_Renderable : double_buffer::Impl<Dependency_Renderable, aethera::Renderable, double_buffer::State_Type<Dependency_State_Tag>> {
struct Dependency_Renderable : double_buffer::Def<Dependency_Renderable, aethera::Renderable, double_buffer::State_Type<Dependency_State_Tag>> {
struct Prop : Prev_Prop {};
struct State : Prev_State<Dependency_State_Tag> {
int revision{};
@@ -66,10 +66,10 @@ struct Dependency_Renderable : double_buffer::Impl<Dependency_Renderable, aether
}
};
};
using Dependency = double_buffer::Attach_Object<Dependency_Renderable>;
using Dependency = double_buffer::Impl<Dependency_Renderable>;
template <typename Renderable>
void add_renderable(Scene& scene, Renderable* renderable) {
ASSERT_TRUE((scene.edit_rely<aethera::Prepare_Data_Tag, aethera::Paint_Tag>(
ASSERT_TRUE((scene.edit_dependency_graph<aethera::Prepare_Data_Tag, aethera::Paint_Tag>(
[&](auto& prepare, auto& paint) {
prepare.add(renderable);
paint.add(renderable);
@@ -142,12 +142,39 @@ TEST(renderable_state, scene_and_renderable_callbacks_publish_at_stage_boundarie
EXPECT_EQ(runtime_updates, 1);
aethera::clear_runtime_state_callback<aethera::Task_Runtime_State_Tag>();
}
TEST(scene_state, structural_statistics_survive_a_process_without_rebuild) {
aethera::initialize_runtime(2);
Direct renderable;
Scene scene;
add_renderable(scene, &renderable);
std::size_t task_count{};
std::size_t dependency_count{};
int updates{};
scene.set_state_callback<aethera::Scene_State_Tag>([&](const auto& state) {
EXPECT_EQ(state.renderable_count, 1u);
EXPECT_GT(state.taskflow_task_count, 0u);
if (updates == 0) {
EXPECT_TRUE(state.taskflow_rebuilt);
task_count = state.taskflow_task_count;
dependency_count = state.taskflow_dependency_count;
}
else {
EXPECT_FALSE(state.taskflow_rebuilt);
EXPECT_EQ(state.taskflow_task_count, task_count);
EXPECT_EQ(state.taskflow_dependency_count, dependency_count);
}
++updates;
});
scene.process([](const auto&) {});
scene.process([](const auto&) {});
EXPECT_EQ(updates, 2);
}
TEST(scene_condition, upstream_change_makes_downstream_run_in_same_taskflow) {
aethera::initialize_runtime(2);
Dependency source;
Dependency target;
Scene scene;
ASSERT_TRUE((scene.edit_rely<aethera::Prepare_Data_Tag, aethera::Paint_Tag>(
ASSERT_TRUE((scene.edit_dependency_graph<aethera::Prepare_Data_Tag, aethera::Paint_Tag>(
[&](auto& prepare, auto& paint) {
prepare.add(&source);
prepare.add(&target);