#pragma once #include "../Renderable.h" #include "../Axis/Frequent_Axis.h" namespace YSG { class Frequent_Axis; class Afterglow_Plot; struct Afterglow_Private; class LIB_DECL Afterglow : public Renderable { public: Afterglow_Private* d(); Render_Data* create_render_data() override; Render_State* create_render_state() override; Input_Data* create_input_data() override; protected: Afterglow(); friend struct Afterglow_Private; friend struct Afterglow_Render_State; friend struct Afterglow_Input_Data; public: PROP(Frequent_Axis*, frequent_axis) PROP(Axis*, power_axis) PROP(Range, frequent_range) PROP(Range, power_range) PROP(int, frequent_point_size) PROP(int, power_point_size) PROP(int, buffer_size) PROP(bool, interpolate) PROP(double, attenuation_rate) PROP(int, init_strong_value) void give_data(const QVector& powerRangeData); template struct BuilderT; struct Builder; }; struct Afterglow_Prop { Frequent_Axis* frequent_axis{}; Axis* power_axis{}; Range frequent_range{0, 10}; Range power_range{0, 10}; int frequent_point_size{}; int power_point_size{}; int buffer_size{}; bool interpolate = true; //线性插值 double attenuation_rate = 0.2; //衰减率 衰减率为 1.0代表 不使用衰减 int init_strong_value = 100; //初始强度 }; template struct Afterglow::BuilderT { PROP_BT(Frequent_Axis*, frequent_axis) PROP_BT(Axis*, power_axis) PROP_BT(Range, frequent_range) PROP_BT(Range, power_range) PROP_BT(int, frequent_point_size) PROP_BT(int, power_point_size) PROP_BT(int, buffer_size) PROP_BT(bool, interpolate) PROP_BT(double, attenuation_rate) PROP_BT(int, init_strong_value) SETTER_T(QString, layerName, "plottable") void init(Frequent_Axis* frequent_axis, Axis* power_axis); void set(Afterglow* t); protected: Plot* plot{}; }; struct LIB_DECL Afterglow::Builder : Afterglow::BuilderT, Afterglow_Prop{ Afterglow * build(); Builder(Frequent_Axis * frequent_axis, Axis * power_axis); }; }