Loading...
Searching...
No Matches
EasingSegment.hpp
1#pragma once
2#include <Curve/Segment/CurveSegmentFactory.hpp>
3#include <Curve/Segment/CurveSegmentModel.hpp>
4
5#include <ossia/editor/curve/curve_segment/easing.hpp>
6
7#include <algorithm>
8
9namespace Curve
10{
12{
13 bool operator==(const EasingData&) const noexcept = default;
14};
15
16template <typename Easing_T>
18{
19public:
20 key_type concreteKey() const noexcept final override
21 {
23 }
24
25 void serialize_impl(const VisitorVariant& vis) const override { }
26
27 using data_type = EasingData;
28 EasingSegment(const Id<SegmentModel>& id, QObject* parent)
29 : Curve::SegmentModel{id, parent}
30 {
31 }
32 EasingSegment(const Curve::SegmentData& dat, QObject* parent)
33 : Curve::SegmentModel{dat, parent}
34 {
35 }
36
38 const EasingSegment& other, const Curve::SegmentModel::id_type& id,
39 QObject* parent)
40 : Curve::SegmentModel{other.start(), other.end(), id, parent}
41 {
42 }
43
44 EasingSegment(DataStream::Deserializer& vis, QObject* parent)
45 : Curve::SegmentModel{vis, parent}
46 {
47 }
48 EasingSegment(JSONObject::Deserializer& vis, QObject* parent)
49 : Curve::SegmentModel{vis, parent}
50 {
51 }
52
53 void on_startChanged() override { dataChanged(); }
54 void on_endChanged() override { dataChanged(); }
55
56 void updateData(int numInterp) const override
57 {
58 numInterp = std::clamp(numInterp, 2, 75);
59 if(std::size_t(numInterp + 1) != m_data.size())
60 m_valid = false;
61 if(!m_valid)
62 {
63 m_data.resize(numInterp + 1);
64
65 double start_x = start().x();
66 double end_x = end().x();
67
68 double start_y = start().y();
69 double end_y = end().y();
70 for(int j = 0; j <= numInterp; j++)
71 {
72 QPointF& pt = m_data[j];
73 pt.setX(start_x + (double(j) / numInterp) * (end_x - start_x));
74 pt.setY(start_y + (end_y - start_y) * Easing_T{}(double(j) / numInterp));
75 }
76 }
77 }
78
79 double valueAt(double x) const override
80 {
81 if(end().x() <= start().x())
82 return end().y();
83 const double ratio = (x - start().x()) / (end().x() - start().x());
84 return start().y() + (end().y() - start().y()) * Easing_T{}(ratio);
85 }
86
87 std::optional<double> verticalParameter() const override { return {}; }
88 std::optional<double> horizontalParameter() const override { return {}; }
89 void setVerticalParameter(double p) override { }
90 void setHorizontalParameter(double p) override { }
91
92 QVariant toSegmentSpecificData() const override
93 {
94 return QVariant::fromValue(EasingData{});
95 }
96
97 template <typename Y>
98 ossia::curve_segment<Y> makeFunction() const
99 {
100 return ossia::curve_segment_ease<Y, Easing_T>{};
101 }
102 ossia::curve_segment<double> makeDoubleFunction() const override
103 {
104 return makeFunction<double>();
105 }
106 ossia::curve_segment<float> makeFloatFunction() const override
107 {
108 return makeFunction<float>();
109 }
110 ossia::curve_segment<int> makeIntFunction() const override
111 {
112 return makeFunction<int>();
113 }
114};
146}
147
148template <>
149inline void DataStreamReader::read(const Curve::EasingData& segmt)
150{
151}
152
153template <>
155{
156}
157
158template <>
159inline void JSONReader::read(const Curve::EasingData& segmt)
160{
161}
162
163template <>
164inline void JSONWriter::write(Curve::EasingData& segmt)
165{
166}
167
168SCORE_SERIALIZE_DATASTREAM_DECLARE(SCORE_PLUGIN_CURVE_EXPORT, Curve::EasingData)
169Q_DECLARE_METATYPE(Curve::EasingData)
170W_REGISTER_ARGTYPE(Curve::EasingData)
171
172// cat easings | xargs -L1 bash -c 'echo $(uuidgen)' | paste - easings | sed
173// 's/\t/ /' > easings2
174// cat easings2 | awk '{ print
175// "CURVE_SEGMENT_METADATA(,
176// Curve::Segment_" $2 ">, \"" $1 "\", \"" $2 "\", \"" $2 "\")";}
177// '
178
179CURVE_SEGMENT_METADATA(
180 , Curve::Segment_backIn, "fb5cb6c1-47fd-497c-9d69-7a87adbaf3b3", "backIn", "backIn",
181 "Easing")
182CURVE_SEGMENT_METADATA(
183 , Curve::Segment_backOut, "0edbd8f5-67c2-41f2-ae80-f014e5c24aa6", "backOut",
184 "backOut", "Easing")
185CURVE_SEGMENT_METADATA(
186 , Curve::Segment_backInOut, "3825c351-698d-4930-9862-28c5f7f51c61", "backInOut",
187 "backInOut", "Easing")
188CURVE_SEGMENT_METADATA(
189 , Curve::Segment_bounceIn, "51fafa98-aa8e-48f0-adae-c21c3eeb63ca", "bounceIn",
190 "bounceIn", "Easing")
191CURVE_SEGMENT_METADATA(
192 , Curve::Segment_bounceOut, "75ce6961-22b3-4a9e-b989-3131098bd092", "bounceOut",
193 "bounceOut", "Easing")
194CURVE_SEGMENT_METADATA(
195 , Curve::Segment_bounceInOut, "30d5c3dc-5a8c-44a8-95b4-67ca3ff5088b", "bounceInOut",
196 "bounceInOut", "Easing")
197CURVE_SEGMENT_METADATA(
198 , Curve::Segment_quadraticIn, "a2f38b24-f2c9-42d7-bb5e-a51a821d2ffd", "quadraticIn",
199 "quadraticIn", "Easing")
200CURVE_SEGMENT_METADATA(
201 , Curve::Segment_quadraticOut, "9717560b-fae1-4035-afbf-031f3581d132",
202 "quadraticOut", "quadraticOut", "Easing")
203CURVE_SEGMENT_METADATA(
204 , Curve::Segment_quadraticInOut, "fc333d55-064a-4af8-b4a8-23fe16e80ecc",
205 "quadraticInOut", "quadraticInOut", "Easing")
206CURVE_SEGMENT_METADATA(
207 , Curve::Segment_cubicIn, "b6bddf8b-b2cb-46d6-8d90-31b3029317e8", "cubicIn",
208 "cubicIn", "Easing")
209CURVE_SEGMENT_METADATA(
210 , Curve::Segment_cubicOut, "ff9a7726-2d8f-43f2-a95c-e395fdbd5aa9", "cubicOut",
211 "cubicOut", "Easing")
212CURVE_SEGMENT_METADATA(
213 , Curve::Segment_cubicInOut, "21556d2a-ac8a-4acf-bf42-5eca9795047c", "cubicInOut",
214 "cubicInOut", "Easing")
215CURVE_SEGMENT_METADATA(
216 , Curve::Segment_quarticIn, "72678775-535f-438e-b4bb-1077af3fab99", "quarticIn",
217 "quarticIn", "Easing")
218CURVE_SEGMENT_METADATA(
219 , Curve::Segment_quarticOut, "bd6f4867-2c30-4267-aa97-0ed767883d22", "quarticOut",
220 "quarticOut", "Easing")
221CURVE_SEGMENT_METADATA(
222 , Curve::Segment_quarticInOut, "93cac01a-dedc-4cb4-ad2d-d81b31e6187c",
223 "quarticInOut", "quarticInOut", "Easing")
224CURVE_SEGMENT_METADATA(
225 , Curve::Segment_quinticIn, "cd08eabe-51a4-429e-8740-c097c1b34b83", "quinticIn",
226 "quinticIn", "Easing")
227CURVE_SEGMENT_METADATA(
228 , Curve::Segment_quinticOut, "cb6e340b-faee-440c-8ef5-05ec6f7f4791", "quinticOut",
229 "quinticOut", "Easing")
230CURVE_SEGMENT_METADATA(
231 , Curve::Segment_quinticInOut, "b2cce6a7-c651-429f-ae46-d322991e92d4",
232 "quinticInOut", "quinticInOut", "Easing")
233CURVE_SEGMENT_METADATA(
234 , Curve::Segment_sineIn, "e8a44b49-4d91-4066-8e25-7669d8927792", "sineIn", "sineIn",
235 "Easing")
236CURVE_SEGMENT_METADATA(
237 , Curve::Segment_sineOut, "e5d2dea4-061e-4139-8da2-1d21b0414273", "sineOut",
238 "sineOut", "Easing")
239CURVE_SEGMENT_METADATA(
240 , Curve::Segment_sineInOut, "61bd1bb4-353b-435f-8b4c-ed61ed43bcf9", "sineInOut",
241 "sineInOut", "Easing")
242CURVE_SEGMENT_METADATA(
243 , Curve::Segment_circularIn, "45b06858-2e16-4cdc-82cc-70f8545bab03", "circularIn",
244 "circularIn", "Easing")
245CURVE_SEGMENT_METADATA(
246 , Curve::Segment_circularOut, "32a67b2a-61f5-49cd-b1c4-37419350fca8", "circularOut",
247 "circularOut", "Easing")
248CURVE_SEGMENT_METADATA(
249 , Curve::Segment_circularInOut, "b70a58f2-2fff-4fda-b1fa-cad6c7c11b88",
250 "circularInOut", "circularInOut", "Easing")
251CURVE_SEGMENT_METADATA(
252 , Curve::Segment_exponentialIn, "8db88491-bed5-4a0d-bcb6-45811c5a7722",
253 "exponentialIn", "exponentialIn", "Easing")
254CURVE_SEGMENT_METADATA(
255 , Curve::Segment_exponentialOut, "40f17c1a-9611-4468-b114-c6338fb0fbb7",
256 "exponentialOut", "exponentialOut", "Easing")
257CURVE_SEGMENT_METADATA(
258 , Curve::Segment_exponentialInOut, "46224c2f-f60d-4f60-93b8-a0ebe6931d00",
259 "exponentialInOut", "exponentialInOut", "Easing")
260CURVE_SEGMENT_METADATA(
261 , Curve::Segment_elasticIn, "6e301164-e079-466b-a518-12fe89048283", "elasticIn",
262 "elasticIn", "Easing")
263CURVE_SEGMENT_METADATA(
264 , Curve::Segment_elasticOut, "1f1fddd4-7a23-4c15-a3ec-6e88e9787a97", "elasticOut",
265 "elasticOut", "Easing")
266CURVE_SEGMENT_METADATA(
267 , Curve::Segment_elasticInOut, "8bad1486-b616-4ebe-aa5e-844162545f8b",
268 "elasticInOut", "elasticInOut", "Easing")
269CURVE_SEGMENT_METADATA(
270 , Curve::Segment_perlinInOut, "66cf32a5-86c5-4747-89d4-523e26dcc1fc", "perlinInOut",
271 "perlinInOut", "Easing")
Definition EasingSegment.hpp:18
Definition CurveSegmentModel.hpp:32
void read(const T &)
Definition DataStreamVisitor.hpp:202
Definition JSONVisitor.hpp:423
Definition UuidKey.hpp:345
The id_base_t class.
Definition Identifier.hpp:59
Utilities and base classes for 1D curves.
Definition FocusDispatcher.hpp:12
Definition EasingSegment.hpp:12
Definition CurveSegmentData.hpp:66
Static metadata implementation.
Definition lib/score/tools/Metadata.hpp:36
The VisitorVariant struct.
Definition VisitorInterface.hpp:26