parser: cache some comutaion during parsing
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Thu, 6 Aug 2020 03:56:48 +0000 (12:56 +0900)
committerJongmin Lee <jm105.lee@samsung.com>
Sun, 9 Aug 2020 21:35:27 +0000 (06:35 +0900)
src/lottie/lottiemodel.h
src/lottie/lottieparser.cpp

index 7342344..fa48c93 100644 (file)
@@ -152,6 +152,7 @@ struct Value {
     T     mEndValue;
     T     at(float t) const { return lerp(mStartValue, mEndValue, t); }
     float angle(float) const { return 0; }
+    void cache(){}
 };
 
 template <>
@@ -160,8 +161,16 @@ struct Value<VPointF> {
     VPointF mEndValue;
     VPointF mInTangent;
     VPointF mOutTangent;
+    float   mBezierLength;
     bool    mPathKeyFrame = false;
 
+    void cache() {
+        mInTangent = mEndValue + mInTangent;
+        mOutTangent = mStartValue + mOutTangent;
+        mBezierLength = VBezier::fromPoints(mStartValue, mOutTangent,
+                                            mInTangent, mEndValue).length();
+
+    }
     VPointF at(float t) const
     {
         if (mPathKeyFrame) {
@@ -170,9 +179,9 @@ struct Value<VPointF> {
              * using bezier at progress length (t * bezlen)
              */
             VBezier b =
-                VBezier::fromPoints(mStartValue, mStartValue + mOutTangent,
-                                    mEndValue + mInTangent, mEndValue);
-            return b.pointAt(b.tAtLength(t * b.length()));
+                VBezier::fromPoints(mStartValue, mOutTangent,
+                                    mInTangent, mEndValue);
+            return b.pointAt(b.tAtLength(t * mBezierLength));
         }
         return lerp(mStartValue, mEndValue, t);
     }
@@ -181,9 +190,9 @@ struct Value<VPointF> {
     {
         if (mPathKeyFrame) {
             VBezier b =
-                VBezier::fromPoints(mStartValue, mStartValue + mOutTangent,
-                                    mEndValue + mInTangent, mEndValue);
-            return b.angleAt(b.tAtLength(t * b.length()));
+                VBezier::fromPoints(mStartValue, mOutTangent,
+                                    mInTangent, mEndValue);
+            return b.angleAt(b.tAtLength(t * mBezierLength));
         }
         return 0;
     }
index 32abd42..0889a49 100644 (file)
@@ -2052,6 +2052,9 @@ void LottieParserImpl::parseKeyFrame(model::DynamicProperty<T> &obj)
         }
     }
 
+    // hooks to cache some computaion
+    keyframe.mValue.cache();
+
     if (!obj.mKeyFrames.empty()) {
         // update the endFrame value of current keyframe
         obj.mKeyFrames.back().mEndFrame = keyframe.mStartFrame;