public:
LOTShapeItem(LOTShapeData *data);
private:
+ struct Cache {
+ int mFrameNo{-1};
+ };
+ Cache mCache;
void updatePath(VPath& path, int frameNo) final;
LOTShapeData *mData;
- bool hasChanged(int) final { return true; }
+ bool hasChanged(int frameNo) final {
+ int prevFrame = mCache.mFrameNo;
+ mCache.mFrameNo = frameNo;
+ if (prevFrame == -1) return true;
+ if (prevFrame == frameNo) return false;
+
+ return mData->mShape.changed(prevFrame, frameNo);
+ }
};
class LOTPolystarItem: public LOTPathDataItem
return 0;
}
+ bool changed(int prevFrame, int curFrame) {
+ int first = mKeyFrames.front().mStartFrame;
+ int last = mKeyFrames.back().mEndFrame;
+
+ if ((first > prevFrame && first > curFrame) ||
+ (last < prevFrame && last < curFrame)) {
+ return false;
+ }
+
+ return true;
+ }
+
public:
std::vector<LOTKeyFrame<T>> mKeyFrames;
};
float angle(int frameNo) const {
return isStatic() ? 0 : mAnimInfo->angle(frameNo);
}
+ bool changed(int prevFrame, int curFrame) {
+ return isStatic() ? false : mAnimInfo->changed(prevFrame, curFrame);
+ }
public:
T mValue;
int mPropertyIndex; /* "ix" */