--- /dev/null
+{"v":"5.2.1","fr":60,"ip":0,"op":60,"w":500,"h":500,"nm":"Comp 1","ddd":1,"assets":[],"layers":[{"ddd":1,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8},"ry":{"a":0,"k":0,"ix":9},"rz":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"t":55}],"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[75,384,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.075893886387,0.175385013223,0.921568632126,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":1,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8},"ry":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"t":55}],"ix":9},"rz":{"a":0,"k":0,"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[76,234,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.025943866,0.945098042488,0.134079754353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":1,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"t":55}],"ix":8},"ry":{"a":0,"k":0,"ix":9},"rz":{"a":0,"k":0,"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[76,72,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
return frameNo / mTimeStreatch;
}
+struct LOT3DData
+{
+ LOTAnimatable<float> mRx{0};
+ LOTAnimatable<float> mRy{0};
+ LOTAnimatable<float> mRz{0};
+};
+
class LOTTransformData : public LOTData
{
public:
float opacity(int frameNo) const;
void cacheMatrix();
bool staticMatrix() const {return mStaticMatrix;}
+ bool ddd() const {return m3D ? true : false;}
private:
VMatrix computeMatrix(int frameNo, bool autoOrient = false) const;
public:
- LOTAnimatable<float> mRotation{0}; /* "r" */
- LOTAnimatable<VPointF> mScale; /* "s" */
- LOTAnimatable<VPointF> mPosition; /* "p" */
- LOTAnimatable<float> mX{0};
- LOTAnimatable<float> mY{0};
- LOTAnimatable<VPointF> mAnchor; /* "a" */
- LOTAnimatable<float> mOpacity{100}; /* "o" */
- LOTAnimatable<float> mSkew{0}; /* "sk" */
- LOTAnimatable<float> mSkewAxis{0}; /* "sa" */
- bool mStaticMatrix{true};
- bool mSeparate{false};
- VMatrix mCachedMatrix;
+ std::unique_ptr<LOT3DData> m3D;
+ LOTAnimatable<float> mRotation{0}; /* "r" */
+ LOTAnimatable<VPointF> mScale; /* "s" */
+ LOTAnimatable<VPointF> mPosition; /* "p" */
+ LOTAnimatable<float> mX{0};
+ LOTAnimatable<float> mY{0};
+ LOTAnimatable<VPointF> mAnchor; /* "a" */
+ LOTAnimatable<float> mOpacity{100}; /* "o" */
+ LOTAnimatable<float> mSkew{0}; /* "sk" */
+ LOTAnimatable<float> mSkewAxis{0}; /* "sa" */
+ bool mStaticMatrix{true};
+ bool mSeparate{false};
+ VMatrix mCachedMatrix;
};
class LOTFillData : public LOTData
std::shared_ptr<LOTData> parseShapeObject();
std::shared_ptr<LOTData> parsePolystarObject();
- std::shared_ptr<LOTTransformData> parseTransformObject();
+ std::shared_ptr<LOTTransformData> parseTransformObject(bool ddd = false);
std::shared_ptr<LOTData> parseFillObject();
std::shared_ptr<LOTData> parseGFillObject();
std::shared_ptr<LOTData> parseStrokeObject();
LOTLayerData *layer = sharedLayer.get();
curLayerRef = layer;
bool hasLayerRef = false;
+ bool ddd = true;
EnterObject();
while (const char *key = NextObjectKey()) {
if (0 == strcmp(key, "ty")) { /* Type of layer*/
parenting and expressions.*/
RAPIDJSON_ASSERT(PeekType() == kNumberType);
layer->mId = GetInt();
+ } else if (0 == strcmp(key, "ddd")) { /*3d layer */
+ RAPIDJSON_ASSERT(PeekType() == kNumberType);
+ ddd = GetInt();
} else if (0 == strcmp(key, "parent")) { /*Layer Parent. Uses "ind" of parent.*/
RAPIDJSON_ASSERT(PeekType() == kNumberType);
layer->mParentId = GetInt();
} else if (0 == strcmp(key, "ks")) {
RAPIDJSON_ASSERT(PeekType() == kObjectType);
EnterObject();
- layer->mTransform = parseTransformObject();
+ layer->mTransform = parseTransformObject(ddd);
} else if (0 == strcmp(key, "shapes")) {
parseShapesAttr(layer);
} else if (0 == strcmp(key, "sw")) {
/*
* https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/transform.json
*/
-std::shared_ptr<LOTTransformData> LottieParserImpl::parseTransformObject()
+std::shared_ptr<LOTTransformData> LottieParserImpl::parseTransformObject(bool ddd)
{
std::shared_ptr<LOTTransformData> sharedTransform =
std::make_shared<LOTTransformData>();
LOTTransformData *obj = sharedTransform.get();
+ if (ddd) obj->m3D = std::make_unique<LOT3DData>();
+
while (const char *key = NextObjectKey()) {
if (0 == strcmp(key, "a")) {
parseProperty(obj->mAnchor);
parseProperty(obj->mOpacity);
} else if (0 == strcmp(key, "hd")) {
obj->mHidden = GetBool();
+ } else if (0 == strcmp(key, "rx")) {
+ parseProperty(obj->m3D->mRx);
+ } else if (0 == strcmp(key, "ry")) {
+ parseProperty(obj->m3D->mRy);
+ } else if (0 == strcmp(key, "rz")) {
+ parseProperty(obj->m3D->mRz);
} else {
Skip(key);
}
obj->mRotation.isStatic() && obj->mScale.isStatic() &&
obj->mSkew.isStatic() && obj->mSkewAxis.isStatic() &&
obj->mX.isStatic() && obj->mY.isStatic();
+ if (obj->m3D) {
+ obj->mStaticMatrix = obj->mStaticMatrix && obj->m3D->mRx.isStatic() &&
+ obj->m3D->mRy.isStatic() && obj->m3D->mRz.isStatic();
+ }
obj->setStatic(obj->mStaticMatrix && obj->mOpacity.isStatic());
<< ", stFm:" << obj->mStartFrame
<< ", ts:" << obj->mTimeStreatch
<< ", ao:" << obj->autoOrient()
+ << ", ddd:" << obj->mTransform->ddd()
<< "\n";
visitChildren(static_cast<LOTGroupData *>(obj), level);
vDebug << level