Files
Aethera/render_2D/tests/Async_Render_Contract_Test.cpp
T
2026-09-03 16:57:18 +08:00

65 lines
3.1 KiB
C++

#include <render_2D/module/plottable/Spectrum.hpp>
#include <render_2D/module/scene/Render_Scene_2D.hpp>
#include "task_flow/src/Task_Runtime.hpp"
#include <process.h>
#include <cstdlib>
#include <memory>
namespace {
/* The process exits only from the asynchronous Scene completion boundary. */
using namespace aethera;
using namespace aethera::render_2d;
bool contains_color(Image_View image) {
for (const auto value : image.data)
if (value != std::byte{}) return true;
return false;
}
} // namespace
int main() {
if (initialize_task_runtime(2) != Initialize_Task_Runtime_Result::initialized) return 2;
Frequency_Axis::Builder frequency_builder;
frequency_builder
.set<Prop_Tag>(&Abs_Axis::Prop::position, Point_F{10.0, 90.0})
.set<Prop_Tag>(&Abs_Axis::Prop::pixel_length, 100.0)
.set<Prop_Tag>(&Numeric_Axis::Prop::coordinate_range, Axis_Range{0.0, 100.0});
Numeric_Axis::Builder power_builder;
power_builder
.set<Prop_Tag>(&Abs_Axis::Prop::position, Point_F{10.0, 90.0})
.set<Prop_Tag>(&Abs_Axis::Prop::pixel_length, -80.0)
.set<Prop_Tag>(&Abs_Axis::Prop::orientation, Axis_Orientation::vertical)
.set<Prop_Tag>(&Numeric_Axis::Prop::coordinate_range, Axis_Range{-100.0, 0.0});
auto frequency = frequency_builder.build();
auto power = power_builder.build();
Spectrum::Builder spectrum_builder(*frequency, *power);
spectrum_builder
.set<Prop_Tag>(&Spectrum::Prop::frequency_range, Axis_Range{0.0, 100.0})
.set<Prop_Tag>(&Spectrum::Prop::partition_count, 4U)
.set<Spectrum_Frame_Tag>([](Spectrum::Frame& frame) { frame.samples = {-100.0, -50.0, -10.0}; });
auto spectrum = spectrum_builder.build();
/* 两根轴并行完成后再进入 Spectrum 的四分区子图。 */
Dag_Relation<aethera::render_2d::scene::Renderable>::Builder dag_builder;
dag_builder
.add({1}, model_proxy<aethera::render_2d::scene::Renderable>(std::move(frequency)))
.add({2}, model_proxy<aethera::render_2d::scene::Renderable>(std::move(power)))
.add({3}, model_proxy<aethera::render_2d::scene::Renderable>(std::move(spectrum)))
.add_dependency({3}, {1})
.add_dependency({3}, {2});
auto dag = dag_builder.build();
if (!dag) return 2;
Render_Scene_2D::Builder scene_builder;
scene_builder
.set<Prop_Tag>(&Render_Scene_2D::Prop::viewport, Size{120, 100})
.set<Prop_Tag>(&Render_Scene_2D::Prop::background, Color::transparent())
.set<Prop_Tag>(&Render_Scene_2D::Prop::view_active, true)
.relation<aethera::scene::Renderable>([graph = std::move(*dag)](auto& relation) mutable { relation = std::move(graph); });
auto* scene = scene_builder.build().release(); /* completion 前保持存活;随后随进程退出回收。 */
auto* frame = new Frame_2D{{1, 0}}; /* completion 前保持存活;随后随进程退出回收。 */
const auto submitted = scene->render(frame, [frame](Frame_2D* completed, std::exception_ptr failure) {
std::_Exit(!failure && completed == frame && contains_color(completed->image()) ? 0 : 1);
});
if (!submitted) return 2;
_endthreadex(3);
return 3;
}