import Matrix from '../../3rd_party/transformation-matrix'; import TransformPropertyFactory from '../../utils/TransformProperty'; import effectTypes from '../../utils/helpers/effectTypes'; function TransformElement() {} TransformElement.prototype = { initTransform: function () { var mat = new Matrix(); this.finalTransform = { mProp: this.data.ks ? TransformPropertyFactory.getTransformProperty(this, this.data.ks, this) : { o: 0 }, _matMdf: false, _localMatMdf: false, _opMdf: false, mat: mat, localMat: mat, localOpacity: 1, }; if (this.data.ao) { this.finalTransform.mProp.autoOriented = true; } // TODO: check TYPE 11: Guided elements if (this.data.ty !== 11) { // this.createElements(); } }, renderTransform: function () { this.finalTransform._opMdf = this.finalTransform.mProp.o._mdf || this._isFirstFrame; this.finalTransform._matMdf = this.finalTransform.mProp._mdf || this._isFirstFrame; if (this.hierarchy) { var mat; var finalMat = this.finalTransform.mat; var i = 0; var len = this.hierarchy.length; // Checking if any of the transformation matrices in the hierarchy chain has changed. if (!this.finalTransform._matMdf) { while (i < len) { if (this.hierarchy[i].finalTransform.mProp._mdf) { this.finalTransform._matMdf = true; break; } i += 1; } } if (this.finalTransform._matMdf) { mat = this.finalTransform.mProp.v.props; finalMat.cloneFromProps(mat); for (i = 0; i < len; i += 1) { finalMat.multiply(this.hierarchy[i].finalTransform.mProp.v); } } } if (this.finalTransform._matMdf) { this.finalTransform._localMatMdf = this.finalTransform._matMdf; } if (this.finalTransform._opMdf) { this.finalTransform.localOpacity = this.finalTransform.mProp.o.v; } }, renderLocalTransform: function () { if (this.localTransforms) { var i = 0; var len = this.localTransforms.length; this.finalTransform._localMatMdf = this.finalTransform._matMdf; if (!this.finalTransform._localMatMdf || !this.finalTransform._opMdf) { while (i < len) { if (this.localTransforms[i]._mdf) { this.finalTransform._localMatMdf = true; } if (this.localTransforms[i]._opMdf && !this.finalTransform._opMdf) { this.finalTransform.localOpacity = this.finalTransform.mProp.o.v; this.finalTransform._opMdf = true; } i += 1; } } if (this.finalTransform._localMatMdf) { var localMat = this.finalTransform.localMat; this.localTransforms[0].matrix.clone(localMat); for (i = 1; i < len; i += 1) { var lmat = this.localTransforms[i].matrix; localMat.multiply(lmat); } localMat.multiply(this.finalTransform.mat); } if (this.finalTransform._opMdf) { var localOp = this.finalTransform.localOpacity; for (i = 0; i < len; i += 1) { localOp *= this.localTransforms[i].opacity * 0.01; } this.finalTransform.localOpacity = localOp; } } }, searchEffectTransforms: function () { if (this.renderableEffectsManager) { var transformEffects = this.renderableEffectsManager.getEffects(effectTypes.TRANSFORM_EFFECT); if (transformEffects.length) { this.localTransforms = []; this.finalTransform.localMat = new Matrix(); var i = 0; var len = transformEffects.length; for (i = 0; i < len; i += 1) { this.localTransforms.push(transformEffects[i]); } } } }, globalToLocal: function (pt) { var transforms = []; transforms.push(this.finalTransform); var flag = true; var comp = this.comp; while (flag) { if (comp.finalTransform) { if (comp.data.hasMask) { transforms.splice(0, 0, comp.finalTransform); } comp = comp.comp; } else { flag = false; } } var i; var len = transforms.length; var ptNew; for (i = 0; i < len; i += 1) { ptNew = transforms[i].mat.applyToPointArray(0, 0, 0); // ptNew = transforms[i].mat.applyToPointArray(pt[0],pt[1],pt[2]); pt = [pt[0] - ptNew[0], pt[1] - ptNew[1], 0]; } return pt; }, mHelper: new Matrix(), }; export default TransformElement;