65 lines
3.1 KiB
C++
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;
|
|
}
|