From 9d0965fe318afce537ef204b1f153529ede1ddb1 Mon Sep 17 00:00:00 2001 From: airnan Date: Sun, 21 Mar 2021 17:04:30 -0400 Subject: [PATCH] added markers support --- player/index.html | 1 + player/js/animation/AnimationItem.js | 40 +++++++++++++++++++-- player/js/utils/markers/markerParser.js | 47 +++++++++++++++++++++++++ tasks/build.js | 4 +++ 4 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 player/js/utils/markers/markerParser.js diff --git a/player/index.html b/player/index.html index 63e079ff7..b09e35f8d 100644 --- a/player/index.html +++ b/player/index.html @@ -75,6 +75,7 @@ + diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js index c3e0ef7c6..9f1598165 100644 --- a/player/js/animation/AnimationItem.js +++ b/player/js/animation/AnimationItem.js @@ -1,7 +1,7 @@ /* global createElementID, subframeEnabled, ProjectInterface, ImagePreloader, audioControllerFactory, extendPrototype, BaseEvent, CanvasRenderer, SVGRenderer, HybridRenderer, assetLoader, dataManager, expressionsPlugin, BMEnterFrameEvent, BMCompleteLoopEvent, BMCompleteEvent, BMSegmentStartEvent, BMDestroyEvent, BMEnterFrameEvent, BMCompleteLoopEvent, BMCompleteEvent, BMSegmentStartEvent, -BMDestroyEvent, BMRenderFrameErrorEvent, BMConfigErrorEvent */ +BMDestroyEvent, BMRenderFrameErrorEvent, BMConfigErrorEvent, markerParser */ var AnimationItem = function () { this._cbs = []; @@ -34,6 +34,7 @@ var AnimationItem = function () { this.projectInterface = ProjectInterface(); this.imagePreloader = new ImagePreloader(); this.audioController = audioControllerFactory(); + this.markers = []; }; extendPrototype([BaseEvent], AnimationItem); @@ -270,6 +271,7 @@ AnimationItem.prototype.configAnimation = function (animData) { this.frameRate = this.animationData.fr; this.frameMult = this.animationData.fr / 1000; this.renderer.searchExtraCompositions(animData.assets); + this.markers = markerParser(animData.markers || []); this.trigger('config_ready'); this.preloadImages(); this.loadSegments(); @@ -391,11 +393,28 @@ AnimationItem.prototype.stop = function (name) { this.setCurrentRawFrameValue(0); }; +AnimationItem.prototype.getMarkerData = function (markerName) { + var marker; + for (var i = 0; i < this.markers.length; i += 1) { + marker = this.markers[i]; + if (marker.payload && marker.payload.name === markerName) { + return marker; + } + } + return null; +}; + AnimationItem.prototype.goToAndStop = function (value, isFrame, name) { if (name && this.name !== name) { return; } - if (isFrame) { + var numValue = Number(value); + if (isNaN(numValue)) { + var marker = this.getMarkerData(value); + if (marker) { + this.goToAndStop(marker.time, true); + } + } else if (isFrame) { this.setCurrentRawFrameValue(value); } else { this.setCurrentRawFrameValue(value * this.frameModifier); @@ -404,7 +423,22 @@ AnimationItem.prototype.goToAndStop = function (value, isFrame, name) { }; AnimationItem.prototype.goToAndPlay = function (value, isFrame, name) { - this.goToAndStop(value, isFrame, name); + if (name && this.name !== name) { + return; + } + var numValue = Number(value); + if (isNaN(numValue)) { + var marker = this.getMarkerData(value); + if (marker) { + if (!marker.duration) { + this.goToAndStop(marker.time, true); + } else { + this.playSegments([marker.time, marker.time + marker.duration], true); + } + } + } else { + this.goToAndStop(numValue, isFrame, name); + } this.play(); }; diff --git a/player/js/utils/markers/markerParser.js b/player/js/utils/markers/markerParser.js new file mode 100644 index 000000000..89d6ea42b --- /dev/null +++ b/player/js/utils/markers/markerParser.js @@ -0,0 +1,47 @@ +/* exported markerParser */ + +var markerParser = ( + + function () { + function parsePayloadLines(payload) { + var lines = payload.split('\r\n'); + var keys = {}; + var line; + var keysCount = 0; + for (var i = 0; i < lines.length; i += 1) { + line = lines[i].split(':'); + if (line.length === 2) { + keys[line[0]] = line[1].trim(); + keysCount += 1; + } + } + if (keysCount === 0) { + throw new Error(); + } + return keys; + } + + return function (_markers) { + var markers = []; + for (var i = 0; i < _markers.length; i += 1) { + var _marker = _markers[i]; + var markerData = { + time: _marker.tm, + duration: _marker.dr, + }; + try { + markerData.payload = JSON.parse(_markers[i].cm); + } catch (_) { + try { + markerData.payload = parsePayloadLines(_markers[i].cm); + } catch (__) { + markerData.payload = { + name: _markers[i], + }; + } + } + markers.push(markerData); + } + return markers; + }; + }()); diff --git a/tasks/build.js b/tasks/build.js index d4720daf0..940966d25 100644 --- a/tasks/build.js +++ b/tasks/build.js @@ -211,6 +211,10 @@ const scripts = [ src: 'js/utils/pooling/bezier_length_pool.js', builds: defaultBuilds }, + { + src: 'js/utils/markers/markerParser.js', + builds: defaultBuilds + }, { src: 'js/renderers/BaseRenderer.js', builds: defaultBuilds