13 std::unique_ptr<SequenceTrackCurve<T>> sequence_track = std::make_unique<SequenceTrackCurve<T>>();
17 sequence_track->mName = sequence_track->mID;
30 const std::string& trackID,
double time)
32 static std::unordered_map<rttr::type, int> s_curve_count_map
35 {RTTI_OF(glm::vec2), 2},
36 {RTTI_OF(glm::vec3), 3},
37 {RTTI_OF(glm::vec4), 4}
44 auto it = s_curve_count_map.find(RTTI_OF(T));
45 assert(it != s_curve_count_map.end());
47 int curve_count = it->second;
49 assert(curve_count > 0);
54 for(
auto &track: sequence.
mTracks)
56 if(track->mID == trackID)
61 int segment_count = 1;
62 for(
auto &segment: track->mSegments)
65 if(segment_curve->mStartTime < time &&
66 segment_curve->mStartTime + segment_curve->mDuration > time)
71 std::unique_ptr<SequenceTrackSegmentCurve<T>> new_segment = std::make_unique<SequenceTrackSegmentCurve<T>>();
73 new_segment->mDuration = segment_curve->mStartTime + segment_curve->mDuration - time;
74 new_segment->mCurves.resize(curve_count);
75 new_segment->mCurveTypes.resize(curve_count);
76 new_segment->mLocked = segment_curve->mLocked;
77 for(
int i = 0; i < curve_count; i++)
79 std::unique_ptr<math::FCurve<float, float>> fcurve = std::make_unique<math::FCurve<float, float>>();
80 fcurve->mPoints[1].mInTan.mTime = -0.4f;
81 fcurve->mPoints[1].mOutTan.mTime = 0.4f;
85 new_segment->mCurves[i] = { fcurve.get() };
94 new_segment->setStartValue(segment_curve->getValue((segment->mStartTime + segment_curve->mDuration - time) / segment_curve->mDuration));
97 if(segment_count < track->mSegments.size())
102 new_segment->
setEndValue(next_segment_curve.getEndValue());
106 new_segment->setEndValue(segment_curve->getEndValue());
110 segment_curve->mLocked =
false;
113 segment_curve->setEndValue(new_segment->getStartValue());
116 segment_curve->mDuration = new_segment->mStartTime - segment->mStartTime;
123 track->mSegments.insert(
124 track->mSegments.begin() + segment_count, new_segment_resource_ptr);
126 return_ptr = new_segment.get();
132 updateCurveSegments<T>(*(track.get()));
135 }
else if(segment_count == track->mSegments.size())
140 std::unique_ptr<SequenceTrackSegmentCurve<T>> new_segment = std::make_unique<SequenceTrackSegmentCurve<T>>();
141 new_segment->mStartTime = segment->mStartTime + segment_curve->mDuration;
142 new_segment->mDuration = time - new_segment->mStartTime;
143 new_segment->mCurves.resize(curve_count);
144 new_segment->mCurveTypes.resize(curve_count);
145 for(
int v = 0; v < curve_count; v++)
147 std::unique_ptr<math::FCurve<float, float>> new_curve = std::make_unique<math::FCurve<float, float>>();
149 new_curve->mPoints[1].mInTan.mTime = -0.4f;
150 new_curve->mPoints[1].mOutTan.mTime = 0.4f;
161 track->mSegments.emplace_back(new_segment_resource_ptr);
163 return_ptr = new_segment.get();
169 updateCurveSegments<T>(*(track.get()));
178 if(track->mSegments.empty())
181 std::unique_ptr<SequenceTrackSegmentCurve<T>> new_segment = std::make_unique<SequenceTrackSegmentCurve<T>>();
182 new_segment->mStartTime = 0.0;
183 new_segment->mDuration = time - new_segment->mStartTime;
186 new_segment->mCurves.resize(curve_count);
187 new_segment->mCurveTypes.resize(curve_count);
188 for(
int v = 0; v < curve_count; v++)
190 std::unique_ptr<math::FCurve<float, float>> new_curve = std::make_unique<math::FCurve<float, float>>();
192 new_curve->mPoints[1].mInTan.mTime = -0.4f;
193 new_curve->mPoints[1].mOutTan.mTime = 0.4f;
204 track->mSegments.emplace_back(new_segment_resource_ptr);
207 return_ptr = new_segment.get();
213 updateCurveSegments<T>(*(track.get()));
232 assert(curve_segment.mCurveTypes.size() > curveIndex);
234 curve_segment.mCurveTypes[curveIndex] = type;
235 for(
int j = 0; j < curve_segment.mCurves[curveIndex]->mPoints.size(); j++)
237 curve_segment.mCurves[curveIndex]->mPoints[j].mInterp = type;
254 curve_segment.mCurves[curveIndex]->mPoints[0].mPos.mValue = newValue;
255 curve_segment.mCurves[curveIndex]->mPoints[0].mPos.mValue =
math::clamp(curve_segment.mCurves[curveIndex]->mPoints[0].mPos.mValue, 0.0f, 1.0f);
260 int lastPoint = curve_segment.mCurves[curveIndex]->mPoints.size() - 1;
261 curve_segment.mCurves[curveIndex]->mPoints[lastPoint].mPos.mValue = newValue;
262 curve_segment.mCurves[curveIndex]->mPoints[lastPoint].mPos.mValue =
math::clamp(curve_segment.mCurves[curveIndex]->mPoints[lastPoint].mPos.mValue, 0.0f, 1.0f);
268 updateCurveSegments<T>(track);
278 assert(curveIndex < curve_segment.mCurves.size());
281 for(
int i = 0; i < curve_segment.mCurves[curveIndex]->mPoints.size() - 1; i++)
284 if(curve_segment.mCurves[curveIndex]->mPoints[i].mPos.mTime <= pos &&
285 curve_segment.mCurves[curveIndex]->mPoints[i + 1].mPos.mTime > pos)
290 p.
mPos.mValue = curve_segment.mCurves[curveIndex]->evaluate(pos);
296 p.
mInterp = curve_segment.mCurveTypes[curveIndex];
299 curve_segment.mCurves[curveIndex]->mPoints.insert(
300 curve_segment.mCurves[curveIndex]->mPoints.begin() + i + 1, p);
301 curve_segment.mCurves[curveIndex]->invalidate();
315 assert(curveIndex < curve_segment.mCurves.size());
317 if(index < curve_segment.mCurves[curveIndex]->mPoints.size())
319 curve_segment.mCurves[curveIndex]->mPoints.erase(
320 curve_segment.mCurves[curveIndex]->mPoints.begin() + index);
321 curve_segment.mCurves[curveIndex]->invalidate();
328 const int pointIndex,
const int curveIndex,
float time,
float value)
333 assert(curveIndex < curve_segment.mCurves.size());
334 assert(pointIndex < curve_segment.mCurves[curveIndex]->mPoints.size());
338 curve_point.
mPos.mTime = time;
339 curve_point.
mPos.mValue = value;
341 curve_segment.mCurves[curveIndex]->invalidate();
347 const int curveIndex,
float time,
float value)
353 assert(curveIndex < curve_segment.mCurves.size());
355 int point_index = curve_segment.mCurves[curveIndex]->mPoints.size() - 1;
359 curve_point.
mPos.mTime = time;
360 curve_point.
mPos.mValue = value;
362 curve_segment.mCurves[curveIndex]->invalidate();
368 const std::string& trackID,
const int pointIndex,
const int curveIndex,
373 assert(curveIndex < curve_segment.mCurves.size());
374 assert(pointIndex < curve_segment.mCurves[curveIndex]->mPoints.size());
377 bool flipped =
false;
380 auto &curve_point = curve_segment.mCurves[curveIndex]->mPoints[pointIndex];
383 case sequencecurveenums::ETanPointTypes::IN:
386 if(curve_point.mTangentsAligned && time > 0.0f)
393 curve_point.mInTan.mTime = time;
394 curve_point.mInTan.mValue = value;
396 if(curve_point.mTangentsAligned)
398 curve_point.mOutTan.mTime = -curve_point.mInTan.mTime;
399 curve_point.mOutTan.mValue = -curve_point.mInTan.mValue;
403 case sequencecurveenums::ETanPointTypes::OUT:
405 if(curve_point.mTangentsAligned && time < 0.0f)
412 curve_point.mOutTan.mTime = time;
413 curve_point.mOutTan.mValue = value;
415 if(curve_point.mTangentsAligned)
417 curve_point.mInTan.mTime = -curve_point.mOutTan.mTime;
418 curve_point.mInTan.mValue = -curve_point.mOutTan.mValue;
426 if(pointIndex == curve_segment.mCurves[curveIndex]->mPoints.size() - 1)
429 assert(track !=
nullptr);
431 for(
int i = 0; i < track->
mSegments.size(); i++)
436 1]).mCurves[curveIndex]->mPoints[0];
438 next_segment_curve_point.mInTan.mTime = curve_point.mInTan.mTime;
439 next_segment_curve_point.mInTan.mValue = curve_point.mInTan.mValue;
440 next_segment_curve_point.mOutTan.mTime = curve_point.mOutTan.mTime;
441 next_segment_curve_point.mOutTan.mValue = curve_point.mOutTan.mValue;
446 curve_segment.
mCurves[curveIndex]->invalidate();
459 if(prev_segment ==
nullptr)
461 track_segment->mStartTime = 0.0;
464 track_segment->mStartTime = prev_segment->mStartTime + prev_segment->mDuration;
465 prev_segment->mDuration = track_segment->mStartTime - prev_segment->mStartTime;
471 prev_segment =
nullptr;
476 if(prev_segment !=
nullptr)
481 prev_segment = &segment_curve;
492 assert(track !=
nullptr);
496 for(
auto &segment: track_curve->mSegments)
500 for(
auto &curve: curve_segment.mCurves)
502 for(
auto &point: curve->mPoints)
504 if(minimum[curve_count]!=maximum[curve_count])
506 float value = point.mPos.mValue * (track_curve->mMaximum[curve_count] -
507 track_curve->mMinimum[curve_count]) +
508 track_curve->mMinimum[curve_count];
510 point.mPos.mValue = (value - minimum[curve_count]) /
511 (maximum[curve_count] - minimum[curve_count]);
512 point.mPos.mValue = math::clamp<float>(point.mPos.mValue, 0, 1);
515 point.mPos.mValue = 0.0f;
522 track_curve->mMinimum = minimum;
523 track_curve->mMaximum = maximum;