33 if ( mKeyframes.isEmpty() )
36 if ( time < mKeyframes.constFirst().time )
38 return mKeyframes.first();
40 else if ( time >= mKeyframes.constLast().time )
42 return mKeyframes.last();
50 for (
int i = 0; i < mKeyframes.size() - 1; i++ )
52 const Keyframe &k0 = mKeyframes.at( i );
53 const Keyframe &k1 = mKeyframes.at( i + 1 );
54 if ( time >= k0.
time && time <= k1.
time )
56 const float ip = ( time - k0.
time ) / ( k1.
time - k0.
time );
57 const float eIp = mEasingCurve.valueForProgress( ip );
58 const float eIip = 1.0f - eIp;
67 float yaw0 = fmod( k0.
yaw, 360 ), yaw1 = fmod( k1.
yaw, 360 );
68 if ( std::abs( yaw0 - yaw1 ) > 180 )
76 kf.
yaw = yaw0 * eIip + yaw1 * eIp;
87 mEasingCurve = QEasingCurve( ( QEasingCurve::Type ) elem.attribute( u
"interpolation"_s, u
"0"_s ).toInt() );
91 const QDomElement elemKeyframes = elem.firstChildElement( u
"keyframes"_s );
92 QDomElement elemKeyframe = elemKeyframes.firstChildElement( u
"keyframe"_s );
93 while ( !elemKeyframe.isNull() )
96 kf.
time = elemKeyframe.attribute( u
"time"_s ).toFloat();
97 kf.
point.
set( elemKeyframe.attribute( u
"x"_s ).toDouble(), elemKeyframe.attribute( u
"y"_s ).toDouble(), elemKeyframe.attribute( u
"z"_s ).toDouble() );
98 kf.
dist = elemKeyframe.attribute( u
"dist"_s ).toFloat();
99 kf.
pitch = elemKeyframe.attribute( u
"pitch"_s ).toFloat();
100 kf.
yaw = elemKeyframe.attribute( u
"yaw"_s ).toFloat();
101 mKeyframes.append( kf );
102 elemKeyframe = elemKeyframe.nextSiblingElement( u
"keyframe"_s );
108 QDomElement elem = doc.createElement( u
"animation3d"_s );
109 elem.setAttribute( u
"interpolation"_s, mEasingCurve.type() );
111 QDomElement elemKeyframes = doc.createElement( u
"keyframes"_s );
113 for (
const Keyframe &keyframe : mKeyframes )
115 QDomElement elemKeyframe = doc.createElement( u
"keyframe"_s );
116 elemKeyframe.setAttribute( u
"time"_s, keyframe.time );
117 elemKeyframe.setAttribute( u
"x"_s, keyframe.point.x() );
118 elemKeyframe.setAttribute( u
"y"_s, keyframe.point.y() );
119 elemKeyframe.setAttribute( u
"z"_s, keyframe.point.z() );
120 elemKeyframe.setAttribute( u
"dist"_s, keyframe.dist );
121 elemKeyframe.setAttribute( u
"pitch"_s, keyframe.pitch );
122 elemKeyframe.setAttribute( u
"yaw"_s, keyframe.yaw );
123 elemKeyframes.appendChild( elemKeyframe );
126 elem.appendChild( elemKeyframes );