2 #include <Scenario/Document/Interval/IntervalModel.hpp>
4 #include <Effect/EffectLayout.hpp>
5 #include <Engine/Node/SimpleApi.hpp>
7 #include <ossia/detail/math.hpp>
8 #include <ossia/math/safe_math.hpp>
9 #include <ossia/network/value/format_value.hpp>
19 namespace SignalDisplay
25 static const constexpr
auto prettyName =
"Signal display";
26 static const constexpr
auto objectKey =
"SignalDisplay";
27 static const constexpr
auto category =
"Monitoring";
28 static const constexpr
auto author =
"ossia score";
29 static const constexpr
auto tags = std::array<const char*, 0>{};
30 static const constexpr
auto kind = Process::ProcessCategory::Analyzer;
31 static const constexpr
auto description =
"Visualize an input signal";
32 static const constexpr
auto flags = Process::ProcessFlags::SupportsTemporal;
33 static const uuid_constexpr
auto uuid
34 = make_uuid(
"9906e563-ddeb-4ecd-908c-952baee2a0a5");
36 static const constexpr value_in value_ins[]{
"in"};
37 static const constexpr
auto control_outs
46 using control_policy = ossia::safe_nodes::default_tick_controls;
49 run(
const ossia::value_port& in, ossia::timed_vec<ossia::value>& out_value,
50 ossia::token_request tk, ossia::exec_state_facade st)
52 if(!in.get_data().empty())
54 const auto& v = in.get_data().back();
55 const float val = ossia::convert<float>(v.value);
56 if(ossia::safe_isnan(val) || ossia::safe_isinf(val))
58 out_value[0] = std::vector<ossia::value>{
59 double(tk.prev_date.impl) / tk.parent_duration.impl,
60 ossia::convert<float>(v.value)};
68 std::vector<std::pair<double, float>> m_values;
74 QGraphicsItem* parent)
76 , m_interval{Scenario::closestParentInterval(process.parent())}
81 m_interval, &Scenario::IntervalModel::executionEvent,
this,
82 [
this](Scenario::IntervalExecutionEvent ev) {
85 case Scenario::IntervalExecutionEvent::Playing:
86 case Scenario::IntervalExecutionEvent::Stopped:
97 out, &Process::ControlOutlet::executionValueChanged,
this,
98 [
this](
const ossia::value& v) {
99 auto& val = *v.target<std::vector<ossia::value>>();
100 float float_time = *val[0].target<
float>();
101 float float_val = *val[1].target<
float>();
104 if(!m_values.empty())
105 if(float_time < m_values.back().first)
108 m_values.emplace_back(float_time, float_val);
112 else if(float_val > max)
128 void paint_impl(QPainter* p)
const override
130 if(m_values.size() < 2)
133 p->setRenderHint(QPainter::Antialiasing,
true);
134 p->setPen(score::Skin::instance().Light.main.pen1_solid_flat_miter);
136 const auto w = width();
137 const auto h = height();
139 const auto to_01 = [&](
float v) {
return 1. - (v - min) / (max - min); };
140 QPointF p0 = {m_values[0].first * w, to_01(m_values[0].second) * h};
141 for(std::size_t i = 1; i < m_values.size(); i++)
143 const auto& value = m_values[i];
144 QPointF p1 = {value.first * w, to_01(value.second) * h};
146 if(QLineF l{p0, p1}; l.length() > 2)
153 p->setRenderHint(QPainter::Antialiasing,
false);
165 static const constexpr
auto prettyName =
"Value display";
166 static const constexpr
auto objectKey =
"Display";
167 static const constexpr
auto category =
"Monitoring";
168 static const constexpr
auto author =
"ossia score";
169 static const constexpr
auto tags = std::array<const char*, 0>{};
170 static const constexpr
auto kind = Process::ProcessCategory::Analyzer;
171 static const constexpr
auto description =
"Visualize an input value";
172 static const constexpr
auto flags = Process::ProcessFlags::TimeIndependent
173 | Process::ProcessFlags::FullyCustomItem;
174 static const uuid_constexpr
auto uuid
175 = make_uuid(
"3f4a41f2-fa39-420f-ab0f-0af6b8409edb");
177 static const constexpr
auto controls
181 using control_policy = ossia::safe_nodes::last_tick;
184 run(
const ossia::value& in, ossia::token_request tk, ossia::exec_state_facade st)
191 ossia::value m_value;
195 QGraphicsItem* parent)
198 setAcceptedMouseButtons({});
205 auto fact = portFactory.get(inl->concreteKey());
206 auto port = fact->makePortItem(*inl, doc,
this,
this);
210 inl, &Process::ControlInlet::executionValueChanged,
this,
211 [
this](
const ossia::value& v) {
219 m_value = ossia::value{};
223 void paint_impl(QPainter* p)
const override
228 p->setRenderHint(QPainter::Antialiasing,
true);
229 p->setPen(score::Skin::instance().Light.main.pen1_solid_flat_miter);
231 p->drawText(boundingRect(), QString::fromStdString(fmt::format(
"{}", m_value)));
233 p->setRenderHint(QPainter::Antialiasing,
false);
Definition: score-lib-process/Process/Dataflow/Port.hpp:202
Definition: score-lib-process/Process/Dataflow/Port.hpp:415
Definition: EffectLayer.hpp:16
Definition: PortFactory.hpp:65
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
Definition: IntervalModel.hpp:50
Definition: score-lib-process/Control/Widgets.hpp:45
Definition: score-lib-process/Control/Widgets.hpp:18
Definition: ProcessContext.hpp:12
Definition: SignalDisplay.hpp:189
Definition: SignalDisplay.hpp:162
Definition: SignalDisplay.hpp:65
Definition: SignalDisplay.hpp:22
const T & interfaces() const
Access to a specific interface list.
Definition: ApplicationContext.hpp:67