UNPKG

@belvo-finance/belvo-vue-components

Version:

## Project setup ``` npm install ```

606 lines (551 loc) 21.8 kB
var AnimationItem = function () { this._cbs = []; this.name = ''; this.path = ''; this.isLoaded = false; this.currentFrame = 0; this.currentRawFrame = 0; this.firstFrame = 0; this.totalFrames = 0; this.frameRate = 0; this.frameMult = 0; this.playSpeed = 1; this.playDirection = 1; this.playCount = 0; this.animationData = {}; this.assets = []; this.isPaused = true; this.autoplay = false; this.loop = true; this.renderer = null; this.animationID = createElementID(); this.assetsPath = ''; this.timeCompleted = 0; this.segmentPos = 0; this.subframeEnabled = subframeEnabled; this.segments = []; this._idle = true; this._completedLoop = false; this.projectInterface = ProjectInterface(); this.imagePreloader = new ImagePreloader(); }; extendPrototype([BaseEvent], AnimationItem); AnimationItem.prototype.setParams = function(params) { if(params.context){ this.context = params.context; } if(params.wrapper || params.container){ this.wrapper = params.wrapper || params.container; } var animType = params.animType ? params.animType : params.renderer ? params.renderer : 'svg'; switch(animType){ case 'canvas': this.renderer = new CanvasRenderer(this, params.rendererSettings); break; case 'svg': this.renderer = new SVGRenderer(this, params.rendererSettings); break; default: this.renderer = new HybridRenderer(this, params.rendererSettings); break; } this.renderer.setProjectInterface(this.projectInterface); this.animType = animType; if(params.loop === '' || params.loop === null){ }else if(params.loop === false){ this.loop = false; }else if(params.loop === true){ this.loop = true; }else{ this.loop = parseInt(params.loop); } this.autoplay = 'autoplay' in params ? params.autoplay : true; this.name = params.name ? params.name : ''; this.autoloadSegments = params.hasOwnProperty('autoloadSegments') ? params.autoloadSegments : true; this.assetsPath = params.assetsPath; if (params.animationData) { this.configAnimation(params.animationData); } else if(params.path){ if( params.path.lastIndexOf('\\') !== -1){ this.path = params.path.substr(0,params.path.lastIndexOf('\\')+1); } else { this.path = params.path.substr(0,params.path.lastIndexOf('/')+1); } this.fileName = params.path.substr(params.path.lastIndexOf('/')+1); this.fileName = this.fileName.substr(0,this.fileName.lastIndexOf('.json')); assetLoader.load(params.path, this.configAnimation.bind(this), function() { this.trigger('data_failed'); }.bind(this)); } this.initialSegment = params.initialSegment; }; AnimationItem.prototype.setData = function (wrapper, animationData) { var params = { wrapper: wrapper, animationData: animationData ? (typeof animationData === "object") ? animationData : JSON.parse(animationData) : null }; var wrapperAttributes = wrapper.attributes; params.path = wrapperAttributes.getNamedItem('data-animation-path') ? wrapperAttributes.getNamedItem('data-animation-path').value : wrapperAttributes.getNamedItem('data-bm-path') ? wrapperAttributes.getNamedItem('data-bm-path').value : wrapperAttributes.getNamedItem('bm-path') ? wrapperAttributes.getNamedItem('bm-path').value : ''; params.animType = wrapperAttributes.getNamedItem('data-anim-type') ? wrapperAttributes.getNamedItem('data-anim-type').value : wrapperAttributes.getNamedItem('data-bm-type') ? wrapperAttributes.getNamedItem('data-bm-type').value : wrapperAttributes.getNamedItem('bm-type') ? wrapperAttributes.getNamedItem('bm-type').value : wrapperAttributes.getNamedItem('data-bm-renderer') ? wrapperAttributes.getNamedItem('data-bm-renderer').value : wrapperAttributes.getNamedItem('bm-renderer') ? wrapperAttributes.getNamedItem('bm-renderer').value : 'canvas'; var loop = wrapperAttributes.getNamedItem('data-anim-loop') ? wrapperAttributes.getNamedItem('data-anim-loop').value : wrapperAttributes.getNamedItem('data-bm-loop') ? wrapperAttributes.getNamedItem('data-bm-loop').value : wrapperAttributes.getNamedItem('bm-loop') ? wrapperAttributes.getNamedItem('bm-loop').value : ''; if(loop === ''){ }else if(loop === 'false'){ params.loop = false; }else if(loop === 'true'){ params.loop = true; }else{ params.loop = parseInt(loop); } var autoplay = wrapperAttributes.getNamedItem('data-anim-autoplay') ? wrapperAttributes.getNamedItem('data-anim-autoplay').value : wrapperAttributes.getNamedItem('data-bm-autoplay') ? wrapperAttributes.getNamedItem('data-bm-autoplay').value : wrapperAttributes.getNamedItem('bm-autoplay') ? wrapperAttributes.getNamedItem('bm-autoplay').value : true; params.autoplay = autoplay !== "false"; params.name = wrapperAttributes.getNamedItem('data-name') ? wrapperAttributes.getNamedItem('data-name').value : wrapperAttributes.getNamedItem('data-bm-name') ? wrapperAttributes.getNamedItem('data-bm-name').value : wrapperAttributes.getNamedItem('bm-name') ? wrapperAttributes.getNamedItem('bm-name').value : ''; var prerender = wrapperAttributes.getNamedItem('data-anim-prerender') ? wrapperAttributes.getNamedItem('data-anim-prerender').value : wrapperAttributes.getNamedItem('data-bm-prerender') ? wrapperAttributes.getNamedItem('data-bm-prerender').value : wrapperAttributes.getNamedItem('bm-prerender') ? wrapperAttributes.getNamedItem('bm-prerender').value : ''; if(prerender === 'false'){ params.prerender = false; } this.setParams(params); }; AnimationItem.prototype.includeLayers = function(data) { if(data.op > this.animationData.op){ this.animationData.op = data.op; this.totalFrames = Math.floor(data.op - this.animationData.ip); } var layers = this.animationData.layers; var i, len = layers.length; var newLayers = data.layers; var j, jLen = newLayers.length; for(j=0;j<jLen;j+=1){ i = 0; while(i<len){ if(layers[i].id == newLayers[j].id){ layers[i] = newLayers[j]; break; } i += 1; } } if(data.chars || data.fonts){ this.renderer.globalData.fontManager.addChars(data.chars); this.renderer.globalData.fontManager.addFonts(data.fonts, this.renderer.globalData.defs); } if(data.assets){ len = data.assets.length; for(i = 0; i < len; i += 1){ this.animationData.assets.push(data.assets[i]); } } this.animationData.__complete = false; dataManager.completeData(this.animationData,this.renderer.globalData.fontManager); this.renderer.includeLayers(data.layers); if(expressionsPlugin){ expressionsPlugin.initExpressions(this); } this.loadNextSegment(); }; AnimationItem.prototype.loadNextSegment = function() { var segments = this.animationData.segments; if(!segments || segments.length === 0 || !this.autoloadSegments){ this.trigger('data_ready'); this.timeCompleted = this.totalFrames; return; } var segment = segments.shift(); this.timeCompleted = segment.time * this.frameRate; var segmentPath = this.path+this.fileName+'_' + this.segmentPos + '.json'; this.segmentPos += 1; assetLoader.load(segmentPath, this.includeLayers.bind(this), function() { this.trigger('data_failed'); }.bind(this)); }; AnimationItem.prototype.loadSegments = function() { var segments = this.animationData.segments; if(!segments) { this.timeCompleted = this.totalFrames; } this.loadNextSegment(); }; AnimationItem.prototype.imagesLoaded = function() { this.trigger('loaded_images'); this.checkLoaded() } AnimationItem.prototype.preloadImages = function() { this.imagePreloader.setAssetsPath(this.assetsPath); this.imagePreloader.setPath(this.path); this.imagePreloader.loadAssets(this.animationData.assets, this.imagesLoaded.bind(this)); } AnimationItem.prototype.configAnimation = function (animData) { if(!this.renderer){ return; } try { this.animationData = animData; if (this.initialSegment) { this.totalFrames = Math.floor(this.initialSegment[1] - this.initialSegment[0]); this.firstFrame = Math.round(this.initialSegment[0]); } else { this.totalFrames = Math.floor(this.animationData.op - this.animationData.ip); this.firstFrame = Math.round(this.animationData.ip); } this.renderer.configAnimation(animData); if(!animData.assets){ animData.assets = []; } this.assets = this.animationData.assets; this.frameRate = this.animationData.fr; this.frameMult = this.animationData.fr / 1000; this.renderer.searchExtraCompositions(animData.assets); this.trigger('config_ready'); this.preloadImages(); this.loadSegments(); this.updaFrameModifier(); this.waitForFontsLoaded(); } catch(error) { this.triggerConfigError(error); } }; AnimationItem.prototype.waitForFontsLoaded = function(){ if(!this.renderer) { return; } if(this.renderer.globalData.fontManager.loaded()){ this.checkLoaded(); }else{ setTimeout(this.waitForFontsLoaded.bind(this),20); } } AnimationItem.prototype.checkLoaded = function () { if (!this.isLoaded && this.renderer.globalData.fontManager.loaded() && (this.imagePreloader.loaded() || this.renderer.rendererType !== 'canvas')) { this.isLoaded = true; dataManager.completeData(this.animationData, this.renderer.globalData.fontManager); if(expressionsPlugin){ expressionsPlugin.initExpressions(this); } this.renderer.initItems(); setTimeout(function() { this.trigger('DOMLoaded'); }.bind(this), 0); this.gotoFrame(); if(this.autoplay){ this.play(); } } }; AnimationItem.prototype.resize = function () { this.renderer.updateContainerSize(); }; AnimationItem.prototype.setSubframe = function(flag){ this.subframeEnabled = flag ? true : false; }; AnimationItem.prototype.gotoFrame = function () { this.currentFrame = this.subframeEnabled ? this.currentRawFrame : ~~this.currentRawFrame; if(this.timeCompleted !== this.totalFrames && this.currentFrame > this.timeCompleted){ this.currentFrame = this.timeCompleted; } this.trigger('enterFrame'); this.renderFrame(); }; AnimationItem.prototype.renderFrame = function () { if(this.isLoaded === false){ return; } try { this.renderer.renderFrame(this.currentFrame + this.firstFrame); } catch(error) { this.triggerRenderFrameError(error); } }; AnimationItem.prototype.play = function (name) { if(name && this.name != name){ return; } if(this.isPaused === true){ this.isPaused = false; if(this._idle){ this._idle = false; this.trigger('_active'); } } }; AnimationItem.prototype.pause = function (name) { if(name && this.name != name){ return; } if(this.isPaused === false){ this.isPaused = true; this._idle = true; this.trigger('_idle'); } }; AnimationItem.prototype.togglePause = function (name) { if(name && this.name != name){ return; } if(this.isPaused === true){ this.play(); }else{ this.pause(); } }; AnimationItem.prototype.stop = function (name) { if(name && this.name != name){ return; } this.pause(); this.playCount = 0; this._completedLoop = false; this.setCurrentRawFrameValue(0); }; AnimationItem.prototype.goToAndStop = function (value, isFrame, name) { if(name && this.name != name){ return; } if(isFrame){ this.setCurrentRawFrameValue(value); }else{ this.setCurrentRawFrameValue(value * this.frameModifier); } this.pause(); }; AnimationItem.prototype.goToAndPlay = function (value, isFrame, name) { this.goToAndStop(value, isFrame, name); this.play(); }; AnimationItem.prototype.advanceTime = function (value) { if (this.isPaused === true || this.isLoaded === false) { return; } var nextValue = this.currentRawFrame + value * this.frameModifier; var _isComplete = false; // Checking if nextValue > totalFrames - 1 for addressing non looping and looping animations. // If animation won't loop, it should stop at totalFrames - 1. If it will loop it should complete the last frame and then loop. if (nextValue >= this.totalFrames - 1 && this.frameModifier > 0) { if (!this.loop || this.playCount === this.loop) { if (!this.checkSegments(nextValue > this.totalFrames ? nextValue % this.totalFrames : 0)) { _isComplete = true; nextValue = this.totalFrames - 1; } } else if (nextValue >= this.totalFrames) { this.playCount += 1; if (!this.checkSegments(nextValue % this.totalFrames)) { this.setCurrentRawFrameValue(nextValue % this.totalFrames); this._completedLoop = true; this.trigger('loopComplete'); } } else { this.setCurrentRawFrameValue(nextValue); } } else if(nextValue < 0) { if (!this.checkSegments(nextValue % this.totalFrames)) { if (this.loop && !(this.playCount-- <= 0 && this.loop !== true)) { this.setCurrentRawFrameValue(this.totalFrames + (nextValue % this.totalFrames)); if(!this._completedLoop) { this._completedLoop = true; } else { this.trigger('loopComplete'); } } else { _isComplete = true; nextValue = 0; } } } else { this.setCurrentRawFrameValue(nextValue); } if (_isComplete) { this.setCurrentRawFrameValue(nextValue); this.pause(); this.trigger('complete'); } }; AnimationItem.prototype.adjustSegment = function(arr, offset){ this.playCount = 0; if(arr[1] < arr[0]){ if(this.frameModifier > 0){ if(this.playSpeed < 0){ this.setSpeed(-this.playSpeed); } else { this.setDirection(-1); } } this.timeCompleted = this.totalFrames = arr[0] - arr[1]; this.firstFrame = arr[1]; this.setCurrentRawFrameValue(this.totalFrames - 0.001 - offset); } else if(arr[1] > arr[0]){ if(this.frameModifier < 0){ if(this.playSpeed < 0){ this.setSpeed(-this.playSpeed); } else { this.setDirection(1); } } this.timeCompleted = this.totalFrames = arr[1] - arr[0]; this.firstFrame = arr[0]; this.setCurrentRawFrameValue(0.001 + offset); } this.trigger('segmentStart'); }; AnimationItem.prototype.setSegment = function (init,end) { var pendingFrame = -1; if(this.isPaused) { if (this.currentRawFrame + this.firstFrame < init) { pendingFrame = init; } else if (this.currentRawFrame + this.firstFrame > end) { pendingFrame = end - init; } } this.firstFrame = init; this.timeCompleted = this.totalFrames = end - init; if(pendingFrame !== -1) { this.goToAndStop(pendingFrame,true); } }; AnimationItem.prototype.playSegments = function (arr, forceFlag) { if (forceFlag) { this.segments.length = 0; } if (typeof arr[0] === 'object') { var i, len = arr.length; for (i = 0; i < len; i += 1) { this.segments.push(arr[i]); } } else { this.segments.push(arr); } if (this.segments.length && forceFlag) { this.adjustSegment(this.segments.shift(), 0); } if (this.isPaused) { this.play(); } }; AnimationItem.prototype.resetSegments = function (forceFlag) { this.segments.length = 0; this.segments.push([this.animationData.ip,this.animationData.op]); //this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op - this.animationData.ip+this.animationData.ip*this.frameRate)]); if (forceFlag) { this.checkSegments(0); } }; AnimationItem.prototype.checkSegments = function(offset) { if (this.segments.length) { this.adjustSegment(this.segments.shift(), offset); return true; } return false; }; AnimationItem.prototype.destroy = function (name) { if ((name && this.name != name) || !this.renderer) { return; } this.renderer.destroy(); this.imagePreloader.destroy(); this.trigger('destroy'); this._cbs = null; this.onEnterFrame = this.onLoopComplete = this.onComplete = this.onSegmentStart = this.onDestroy = null; this.renderer = null; }; AnimationItem.prototype.setCurrentRawFrameValue = function(value){ this.currentRawFrame = value; this.gotoFrame(); }; AnimationItem.prototype.setSpeed = function (val) { this.playSpeed = val; this.updaFrameModifier(); }; AnimationItem.prototype.setDirection = function (val) { this.playDirection = val < 0 ? -1 : 1; this.updaFrameModifier(); }; AnimationItem.prototype.updaFrameModifier = function () { this.frameModifier = this.frameMult * this.playSpeed * this.playDirection; }; AnimationItem.prototype.getPath = function () { return this.path; }; AnimationItem.prototype.getAssetsPath = function (assetData) { var path = ''; if(assetData.e) { path = assetData.p; } else if(this.assetsPath){ var imagePath = assetData.p; if(imagePath.indexOf('images/') !== -1){ imagePath = imagePath.split('/')[1]; } path = this.assetsPath + imagePath; } else { path = this.path; path += assetData.u ? assetData.u : ''; path += assetData.p; } return path; }; AnimationItem.prototype.getAssetData = function (id) { var i = 0, len = this.assets.length; while (i < len) { if(id == this.assets[i].id){ return this.assets[i]; } i += 1; } }; AnimationItem.prototype.hide = function () { this.renderer.hide(); }; AnimationItem.prototype.show = function () { this.renderer.show(); }; AnimationItem.prototype.getDuration = function (isFrame) { return isFrame ? this.totalFrames : this.totalFrames / this.frameRate; }; AnimationItem.prototype.trigger = function(name){ if(this._cbs && this._cbs[name]){ switch(name){ case 'enterFrame': this.triggerEvent(name,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameModifier)); break; case 'loopComplete': this.triggerEvent(name,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult)); break; case 'complete': this.triggerEvent(name,new BMCompleteEvent(name,this.frameMult)); break; case 'segmentStart': this.triggerEvent(name,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames)); break; case 'destroy': this.triggerEvent(name,new BMDestroyEvent(name,this)); break; default: this.triggerEvent(name); } } if(name === 'enterFrame' && this.onEnterFrame){ this.onEnterFrame.call(this,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameMult)); } if(name === 'loopComplete' && this.onLoopComplete){ this.onLoopComplete.call(this,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult)); } if(name === 'complete' && this.onComplete){ this.onComplete.call(this,new BMCompleteEvent(name,this.frameMult)); } if(name === 'segmentStart' && this.onSegmentStart){ this.onSegmentStart.call(this,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames)); } if(name === 'destroy' && this.onDestroy){ this.onDestroy.call(this,new BMDestroyEvent(name,this)); } }; AnimationItem.prototype.triggerRenderFrameError = function(nativeError) { var error = new BMRenderFrameErrorEvent(nativeError, this.currentFrame); this.triggerEvent('error', error); if (this.onError) { this.onError.call(this, error); } } AnimationItem.prototype.triggerConfigError = function(nativeError) { var error = new BMConfigErrorEvent(nativeError, this.currentFrame); this.triggerEvent('error', error); if (this.onError) { this.onError.call(this, error); } }