60 lines
2.8 KiB
C++
60 lines
2.8 KiB
C++
#include "../Axis/Time_Axis.h"
|
|
#include "Frequency_Trace_p.h"
|
|
#include "../base/Memory.h"
|
|
namespace renderive {
|
|
RENDERIVE_DEFINE_RENDERABLE_BINDING(Frequency_Trace, Frequency_Trace_Private, Frequency_Trace_Render_State, Frequency_Trace_Input_Data, "Frequency_Trace")
|
|
std::shared_ptr<Time_Axis> Frequency_Trace::time_axis() {
|
|
return d()->edit_state_value(&Frequency_Trace_Render_State::time_axis).lock();
|
|
}
|
|
void Frequency_Trace::set_time_axis(std::shared_ptr<Time_Axis> value) {
|
|
d()->set_state_value(&Frequency_Trace_Render_State::time_axis, std::weak_ptr<Time_Axis>(value));
|
|
}
|
|
std::shared_ptr<Axis> Frequency_Trace::value_axis() {
|
|
return d()->edit_state_value(&Frequency_Trace_Render_State::value_axis).lock();
|
|
}
|
|
void Frequency_Trace::set_value_axis(std::shared_ptr<Axis> value) {
|
|
d()->set_state_value(&Frequency_Trace_Render_State::value_axis, std::weak_ptr<Axis>(value));
|
|
}
|
|
Frequency_Trace::Builder::Builder(std::shared_ptr<Renderable> parent, std::shared_ptr<Time_Axis> time_axis, std::shared_ptr<Axis> value_axis) {
|
|
ASSERT(parent && parent->attached_to_plot(), "Audio_Frequency build error! parent invalid");
|
|
ASSERT(time_axis && value_axis, "Audio_Frequency build error! axis == nullptr");
|
|
ASSERT(time_axis->attached_to_plot(), "Audio_Frequency build error! time_axis->plot == nullptr");
|
|
ASSERT(time_axis->shares_plot_with(*value_axis), "Audio_Frequency build error! time_axis->plot != value_axis->plot");
|
|
ASSERT(parent->shares_plot_with(*time_axis), "Audio_Frequency build error! parent->plot != time_axis->plot");
|
|
ASSERT(time_axis->orientation() != value_axis->orientation(), "Audio_Frequency build error! axes must be orthogonal");
|
|
this->parent = parent;
|
|
this->time_axis = time_axis;
|
|
this->value_axis = value_axis;
|
|
}
|
|
std::shared_ptr<Frequency_Trace> Frequency_Trace::Builder::build() {
|
|
auto ret = renderive::make_shared<Frequency_Trace>();
|
|
ret->init(parent);
|
|
Frequency_Trace_Private* pd = ret->d();
|
|
Render_Edit_Lease<Frequency_Trace_Private, Frequency_Trace_Render_State> edit(pd);
|
|
Frequency_Trace_Render_State* sc = edit.operator->();
|
|
PROP_R(std::weak_ptr<Time_Axis>, time_axis)
|
|
PROP_R(std::weak_ptr<Axis>, value_axis)
|
|
sc->pen = Pen{.color = color, .width = 1.0};
|
|
return ret;
|
|
}
|
|
void Frequency_Trace::append_sample(int tick, double data) {
|
|
if (!ok())
|
|
return;
|
|
Render_Input_Lease<Frequency_Trace_Private, Frequency_Trace_Input_Data> input(d());
|
|
input->push(tick, data);
|
|
}
|
|
void Frequency_Trace::append_sample(Time_Of_Day time, double data) {
|
|
if (!ok())
|
|
return;
|
|
auto axis = time_axis();
|
|
if (!axis)
|
|
return;
|
|
auto stream = axis->timeline_stream();
|
|
if (!stream)
|
|
return;
|
|
int tick = stream->append_time(time);
|
|
Render_Input_Lease<Frequency_Trace_Private, Frequency_Trace_Input_Data> input(d());
|
|
input->push(tick, data);
|
|
}
|
|
} // namespace renderive
|