LOTGroupData *root = reinterpret_cast<LOTGroupData *>(mData->mChildren[0].get());
assert(root);
- for (int i= 0; i < mData->copies(0); i++) {
+ mCopies = mData->maxCopies();
+
+ for (int i= 0; i < mCopies; i++) {
auto content = std::make_unique<LOTContentGroupItem>(static_cast<LOTGroupData *>(root));
content->setParent(this);
mContents.push_back(std::move(content));
DirtyFlag newFlag = flag;
+ float copies = mData->copies(frameNo);
+ int visibleCopies = int(copies);
+
+ if (visibleCopies == 0) {
+ mHidden = true;
+ return;
+ } else {
+ mHidden = false;
+ }
+
if (mData->hasMtrixChange(frameNo)) {
newFlag |= DirtyFlagBit::Matrix;
}
- float multiplier = mData->offset(frameNo);
+ float offset = mData->offset(frameNo);
float startOpacity = mData->mTransform->startOpacity(frameNo);
float endOpacity = mData->mTransform->endOpacity(frameNo);
- float index = 0;
- float copies = mData->copies(frameNo);
- if (!vCompare(copies, 1)) copies -=1;
newFlag |= DirtyFlagBit::Alpha;
- for (const auto &content : mContents) {
- float newAlpha = parentAlpha * lerp(startOpacity, endOpacity, index / copies);
- VMatrix result = mData->mTransform->matrixForRepeater(frameNo, multiplier) * parentMatrix;
- content->update(frameNo, result, newAlpha, newFlag);
- multiplier += 1;
- index +=1;
+
+ for (int i = 0; i < mCopies; ++i) {
+ float newAlpha = parentAlpha * lerp(startOpacity, endOpacity, i / copies);
+
+ // hide rest of the copies , @TODO find a better solution.
+ if ( i >= visibleCopies) newAlpha = 0;
+
+ VMatrix result = mData->mTransform->matrixForRepeater(frameNo, i + offset) * parentMatrix;
+ mContents[i]->update(frameNo, result, newAlpha, newFlag);
}
}
+void LOTRepeaterItem::renderList(std::vector<VDrawable *> &list)
+{
+ if (mHidden) return;
+ return LOTContentGroupItem::renderList(list);
+}
+
static void updateGStops(LOTNode *n, const VGradient *grad)
{
if (grad->mStops.size() != n->mGradient.stopCount) {
void applyTrim();
void processTrimItems(std::vector<LOTPathDataItem *> &list);
void processPaintItems(std::vector<LOTPathDataItem *> &list);
- void renderList(std::vector<VDrawable *> &list) final;
+ void renderList(std::vector<VDrawable *> &list);
const VMatrix & matrix() const { return mMatrix;}
protected:
LOTGroupData *mData{nullptr};
public:
LOTRepeaterItem(LOTRepeaterData *data);
void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
+ void renderList(std::vector<VDrawable *> &list) final;
private:
LOTRepeaterData *mData;
+ bool mHidden{false};
+ int mCopies{0};
};
scale.setY(std::pow(scale.y(), multiplier));
VMatrix m;
m.translate(mPosition.value(frameNo) * multiplier)
- .rotate(mRotation.value(frameNo) * multiplier)
.scale(scale)
- .translate(mAnchor.value(frameNo));
+ .translate(mAnchor.value(frameNo))
+ .rotate(mRotation.value(frameNo) * multiplier)
+ .translate(-mAnchor.value(frameNo));
return m;
}
bool hasMtrixChange(int /*frameNo*/) const {
return !(mTransform->isStatic() && mOffset.isStatic());
}
+ int maxCopies() const { return int(mMaxCopies);}
float copies(int frameNo) const {return mCopies.value(frameNo);}
float offset(int frameNo) const {return mOffset.value(frameNo);}
public:
LOTAnimatable<float> mCopies{0};
LOTAnimatable<float> mOffset{0};
+ float mMaxCopies{0.0};
};
class LOTModel
while (const char *key = NextObjectKey()) {
if (0 == strcmp(key, "c")) {
parseProperty(obj->mCopies);
+ float maxCopy= 0.0;
+ if (!obj->mCopies.isStatic()) {
+ for(auto &keyFrame : obj->mCopies.mAnimInfo->mKeyFrames) {
+ if (maxCopy < keyFrame.mValue.mStartValue)
+ maxCopy = keyFrame.mValue.mStartValue;
+ if (maxCopy < keyFrame.mValue.mEndValue)
+ maxCopy = keyFrame.mValue.mEndValue;
+ }
+ } else {
+ maxCopy = obj->mCopies.mValue;
+ }
+ obj->mMaxCopies = maxCopy;
} else if (0 == strcmp(key, "o")) {
parseProperty(obj->mOffset);
} else if (0 == strcmp(key, "tr")) {
case LOTData::Type::Repeater: {
auto r = static_cast<LOTRepeaterData *>(obj);
vDebug << level << "{ Repeater: a:" << !obj->isStatic()
- << ", copies:" << r->copies(0)
+ << ", copies:" << r->maxCopies()
<< ", offset:" << r->offset(0);
visitChildren(static_cast<LOTGroupData *>(obj), level);
vDebug << level << "} Repeater";