@lumen5/lottie-web 5.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc.json +3 -0
- package/.eslintrc.json +46 -0
- package/.gitattributes +1 -0
- package/.github/FUNDING.yml +1 -0
- package/.github/ISSUE_TEMPLATE.md +22 -0
- package/.github/workflows/publish.yml +26 -0
- package/.github/workflows/testAnimations.yml +29 -0
- package/.github/workflows/updateScreenshots.yml +34 -0
- package/CHANGELOG.md +601 -0
- package/History.md +1230 -0
- package/LICENSE.md +21 -0
- package/README.md +351 -0
- package/bower.json +31 -0
- package/build/old_parser/bodymovin_parser.jsx +3023 -0
- package/build/old_parser/helperProject.aep +0 -0
- package/build/player/cjs/lottie.min.js +18229 -0
- package/build/player/cjs/lottie_canvas.min.js +16465 -0
- package/build/player/cjs/lottie_html.min.js +16312 -0
- package/build/player/cjs/lottie_light.min.js +11584 -0
- package/build/player/cjs/lottie_light_canvas.min.js +13518 -0
- package/build/player/cjs/lottie_light_html.min.js +12843 -0
- package/build/player/cjs/lottie_svg.min.js +15053 -0
- package/build/player/esm/lottie.min.js +18225 -0
- package/build/player/esm/lottie_canvas.min.js +16461 -0
- package/build/player/esm/lottie_html.min.js +16308 -0
- package/build/player/esm/lottie_light.min.js +11580 -0
- package/build/player/esm/lottie_light_canvas.min.js +13514 -0
- package/build/player/esm/lottie_light_html.min.js +12839 -0
- package/build/player/esm/lottie_svg.min.js +15049 -0
- package/build/player/lottie.d.ts +5 -0
- package/build/player/lottie.js +17151 -0
- package/build/player/lottie.min.js +1 -0
- package/build/player/lottie_canvas.js +15506 -0
- package/build/player/lottie_canvas.min.js +1 -0
- package/build/player/lottie_canvas_worker.js +18196 -0
- package/build/player/lottie_canvas_worker.min.js +15 -0
- package/build/player/lottie_html.d.ts +5 -0
- package/build/player/lottie_html.js +15354 -0
- package/build/player/lottie_html.min.js +1 -0
- package/build/player/lottie_light.d.ts +5 -0
- package/build/player/lottie_light.js +10854 -0
- package/build/player/lottie_light.min.js +1 -0
- package/build/player/lottie_light_canvas.d.ts +5 -0
- package/build/player/lottie_light_canvas.js +12666 -0
- package/build/player/lottie_light_canvas.min.js +1 -0
- package/build/player/lottie_light_html.d.ts +5 -0
- package/build/player/lottie_light_html.js +12029 -0
- package/build/player/lottie_light_html.min.js +1 -0
- package/build/player/lottie_svg.d.ts +5 -0
- package/build/player/lottie_svg.js +14179 -0
- package/build/player/lottie_svg.min.js +1 -0
- package/build/player/lottie_worker.js +18196 -0
- package/build/player/lottie_worker.min.js +15 -0
- package/docs/json/animation.json +101 -0
- package/docs/json/effects/angle.json +40 -0
- package/docs/json/effects/checkBox.json +40 -0
- package/docs/json/effects/color.json +40 -0
- package/docs/json/effects/customValue.json +4 -0
- package/docs/json/effects/dropDown.json +40 -0
- package/docs/json/effects/fill.json +55 -0
- package/docs/json/effects/group.json +41 -0
- package/docs/json/effects/index.json +51 -0
- package/docs/json/effects/layer.json +33 -0
- package/docs/json/effects/noValue.json +1 -0
- package/docs/json/effects/point.json +43 -0
- package/docs/json/effects/proLevels.json +130 -0
- package/docs/json/effects/slider.json +40 -0
- package/docs/json/effects/stroke.json +64 -0
- package/docs/json/effects/tint.json +43 -0
- package/docs/json/effects/tritone.json +46 -0
- package/docs/json/helpers/blendMode.json +71 -0
- package/docs/json/helpers/boolean.json +14 -0
- package/docs/json/helpers/composite.json +15 -0
- package/docs/json/helpers/lineCap.json +19 -0
- package/docs/json/helpers/lineJoin.json +19 -0
- package/docs/json/helpers/mask.json +80 -0
- package/docs/json/helpers/textBased.json +23 -0
- package/docs/json/helpers/textGrouping.json +23 -0
- package/docs/json/helpers/textShape.json +31 -0
- package/docs/json/helpers/transform.json +146 -0
- package/docs/json/layers/image.json +113 -0
- package/docs/json/layers/null.json +87 -0
- package/docs/json/layers/preComp.json +118 -0
- package/docs/json/layers/shape.json +157 -0
- package/docs/json/layers/solid.json +120 -0
- package/docs/json/layers/text.json +523 -0
- package/docs/json/properties/doubleKeyframe.json +50 -0
- package/docs/json/properties/multiDimensional.json +21 -0
- package/docs/json/properties/multiDimensionalKeyframed.json +35 -0
- package/docs/json/properties/offsetKeyframe.json +53 -0
- package/docs/json/properties/shape.json +27 -0
- package/docs/json/properties/shapeKeyframed.json +35 -0
- package/docs/json/properties/shapeProp.json +50 -0
- package/docs/json/properties/shapePropKeyframe.json +54 -0
- package/docs/json/properties/value.json +21 -0
- package/docs/json/properties/valueKeyframe.json +33 -0
- package/docs/json/properties/valueKeyframed.json +25 -0
- package/docs/json/shapes/ellipse.json +54 -0
- package/docs/json/shapes/fill.json +48 -0
- package/docs/json/shapes/gFill.json +107 -0
- package/docs/json/shapes/gStroke.json +137 -0
- package/docs/json/shapes/group.json +89 -0
- package/docs/json/shapes/merge.json +27 -0
- package/docs/json/shapes/rect.json +66 -0
- package/docs/json/shapes/repeater.json +63 -0
- package/docs/json/shapes/round.json +35 -0
- package/docs/json/shapes/shape.json +40 -0
- package/docs/json/shapes/star.json +133 -0
- package/docs/json/shapes/stroke.json +78 -0
- package/docs/json/shapes/transform.json +102 -0
- package/docs/json/shapes/trim.json +61 -0
- package/docs/json/sources/chars.json +61 -0
- package/docs/json/sources/image.json +31 -0
- package/docs/json/sources/precomp.json +39 -0
- package/index.d.ts +197 -0
- package/package.json +54 -0
- package/player/index.html +115 -0
- package/player/js/3rd_party/BezierEaser.js +158 -0
- package/player/js/3rd_party/howler.js +5 -0
- package/player/js/3rd_party/seedrandom.js +237 -0
- package/player/js/3rd_party/transformation-matrix.js +449 -0
- package/player/js/EffectsManager.js +83 -0
- package/player/js/animation/AnimationItem.js +809 -0
- package/player/js/animation/AnimationItemWorkerOverride.js +157 -0
- package/player/js/animation/AnimationManager.js +248 -0
- package/player/js/animation/AnimationManagerWorkerOverride.js +201 -0
- package/player/js/effects/EffectsManagerPlaceholder.js +5 -0
- package/player/js/effects/SliderEffect.js +37 -0
- package/player/js/effects/TransformEffect.js +44 -0
- package/player/js/elements/AudioElement.js +102 -0
- package/player/js/elements/BaseElement.js +78 -0
- package/player/js/elements/BaseTextElement.js +4 -0
- package/player/js/elements/CompElement.js +107 -0
- package/player/js/elements/FootageElement.js +47 -0
- package/player/js/elements/ImageElement.js +42 -0
- package/player/js/elements/NullElement.js +39 -0
- package/player/js/elements/ShapeElement.js +76 -0
- package/player/js/elements/SolidElement.js +23 -0
- package/player/js/elements/TextElement.js +94 -0
- package/player/js/elements/canvasElements/CVBaseElement.js +167 -0
- package/player/js/elements/canvasElements/CVCompBaseElement.js +11 -0
- package/player/js/elements/canvasElements/CVCompElement.js +57 -0
- package/player/js/elements/canvasElements/CVContextData.js +239 -0
- package/player/js/elements/canvasElements/CVEffects.js +57 -0
- package/player/js/elements/canvasElements/CVImageElement.js +58 -0
- package/player/js/elements/canvasElements/CVMaskElement.js +72 -0
- package/player/js/elements/canvasElements/CVShapeElement.js +521 -0
- package/player/js/elements/canvasElements/CVSolidElement.js +30 -0
- package/player/js/elements/canvasElements/CVTextElement.js +244 -0
- package/player/js/elements/canvasElements/effects/CVGaussianBlurEffect.js +29 -0
- package/player/js/elements/canvasElements/effects/CVTransformEffect.js +9 -0
- package/player/js/elements/helpers/FrameElement.js +54 -0
- package/player/js/elements/helpers/HierarchyElement.js +52 -0
- package/player/js/elements/helpers/RenderableDOMElement.js +72 -0
- package/player/js/elements/helpers/RenderableElement.js +87 -0
- package/player/js/elements/helpers/TransformElement.js +140 -0
- package/player/js/elements/helpers/shapes/CVShapeData.js +33 -0
- package/player/js/elements/helpers/shapes/ProcessedElement.js +6 -0
- package/player/js/elements/helpers/shapes/SVGElementsRenderer.js +239 -0
- package/player/js/elements/helpers/shapes/SVGFillStyleData.js +18 -0
- package/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js +100 -0
- package/player/js/elements/helpers/shapes/SVGGradientStrokeStyleData.js +20 -0
- package/player/js/elements/helpers/shapes/SVGNoStyleData.js +15 -0
- package/player/js/elements/helpers/shapes/SVGShapeData.js +28 -0
- package/player/js/elements/helpers/shapes/SVGStrokeStyleData.js +21 -0
- package/player/js/elements/helpers/shapes/SVGStyleData.js +19 -0
- package/player/js/elements/helpers/shapes/SVGTransformData.js +11 -0
- package/player/js/elements/helpers/shapes/ShapeElement.js +5 -0
- package/player/js/elements/helpers/shapes/ShapeGroupData.js +9 -0
- package/player/js/elements/helpers/shapes/ShapeTransformManager.js +61 -0
- package/player/js/elements/htmlElements/HBaseElement.js +88 -0
- package/player/js/elements/htmlElements/HCameraElement.js +170 -0
- package/player/js/elements/htmlElements/HCompElement.js +61 -0
- package/player/js/elements/htmlElements/HEffects.js +3 -0
- package/player/js/elements/htmlElements/HImageElement.js +42 -0
- package/player/js/elements/htmlElements/HShapeElement.js +261 -0
- package/player/js/elements/htmlElements/HSolidElement.js +36 -0
- package/player/js/elements/htmlElements/HTextElement.js +290 -0
- package/player/js/elements/svgElements/SVGBaseElement.js +181 -0
- package/player/js/elements/svgElements/SVGCompElement.js +28 -0
- package/player/js/elements/svgElements/SVGEffects.js +70 -0
- package/player/js/elements/svgElements/SVGEffectsPlaceholder.js +3 -0
- package/player/js/elements/svgElements/SVGShapeElement.js +366 -0
- package/player/js/elements/svgElements/SVGTextElement.js +322 -0
- package/player/js/elements/svgElements/effects/SVGComposableEffect.js +22 -0
- package/player/js/elements/svgElements/effects/SVGDropShadowEffect.js +83 -0
- package/player/js/elements/svgElements/effects/SVGFillFilter.js +22 -0
- package/player/js/elements/svgElements/effects/SVGGaussianBlurEffect.js +44 -0
- package/player/js/elements/svgElements/effects/SVGMatte3Effect.js +101 -0
- package/player/js/elements/svgElements/effects/SVGProLevelsFilter.js +108 -0
- package/player/js/elements/svgElements/effects/SVGStrokeEffect.js +119 -0
- package/player/js/elements/svgElements/effects/SVGTintEffect.js +47 -0
- package/player/js/elements/svgElements/effects/SVGTransformEffect.js +10 -0
- package/player/js/elements/svgElements/effects/SVGTritoneFilter.js +43 -0
- package/player/js/main.js +21 -0
- package/player/js/mask.js +239 -0
- package/player/js/module.js +153 -0
- package/player/js/modules/canvas.js +22 -0
- package/player/js/modules/canvas_light.js +25 -0
- package/player/js/modules/full.js +70 -0
- package/player/js/modules/full_worker.js +0 -0
- package/player/js/modules/html.js +37 -0
- package/player/js/modules/html_light.js +25 -0
- package/player/js/modules/main.js +162 -0
- package/player/js/modules/svg.js +37 -0
- package/player/js/modules/svg_light.js +25 -0
- package/player/js/renderers/BaseRenderer.js +187 -0
- package/player/js/renderers/CanvasRenderer.js +67 -0
- package/player/js/renderers/CanvasRendererBase.js +318 -0
- package/player/js/renderers/CanvasRendererWorkerOverride.js +54 -0
- package/player/js/renderers/HybridRenderer.js +47 -0
- package/player/js/renderers/HybridRendererBase.js +344 -0
- package/player/js/renderers/SVGRenderer.js +82 -0
- package/player/js/renderers/SVGRendererBase.js +255 -0
- package/player/js/renderers/renderersManager.js +29 -0
- package/player/js/utils/BaseEvent.js +42 -0
- package/player/js/utils/DataManager.js +676 -0
- package/player/js/utils/DataManagerWorkerOverrides.js +13 -0
- package/player/js/utils/FontManager.js +443 -0
- package/player/js/utils/FontManagerWorkerOverride.js +16 -0
- package/player/js/utils/PolynomialBezier.js +253 -0
- package/player/js/utils/PropertyFactory.js +489 -0
- package/player/js/utils/SlotManager.js +17 -0
- package/player/js/utils/TransformProperty.js +251 -0
- package/player/js/utils/animationFramePolyFill.js +25 -0
- package/player/js/utils/asset_loader.js +53 -0
- package/player/js/utils/asset_loader_worker_override.js +3 -0
- package/player/js/utils/audio/AudioController.js +85 -0
- package/player/js/utils/audio/AudioElement.js +6 -0
- package/player/js/utils/bez.js +251 -0
- package/player/js/utils/common.js +280 -0
- package/player/js/utils/expressions/CompInterface.js +28 -0
- package/player/js/utils/expressions/EffectInterface.js +111 -0
- package/player/js/utils/expressions/ExpressionManager.js +752 -0
- package/player/js/utils/expressions/ExpressionPropertyDecorator.js +463 -0
- package/player/js/utils/expressions/ExpressionTextPropertyDecorator.js +40 -0
- package/player/js/utils/expressions/ExpressionValue.js +61 -0
- package/player/js/utils/expressions/ExpressionValueFactory.js +102 -0
- package/player/js/utils/expressions/Expressions.js +48 -0
- package/player/js/utils/expressions/FootageInterface.js +60 -0
- package/player/js/utils/expressions/InterfacesProvider.js +21 -0
- package/player/js/utils/expressions/LayerInterface.js +179 -0
- package/player/js/utils/expressions/MaskInterface.js +50 -0
- package/player/js/utils/expressions/ProjectInterface.js +31 -0
- package/player/js/utils/expressions/PropertyGroupFactory.js +13 -0
- package/player/js/utils/expressions/PropertyInterface.js +19 -0
- package/player/js/utils/expressions/ShapeInterface.js +543 -0
- package/player/js/utils/expressions/TextInterface.js +35 -0
- package/player/js/utils/expressions/TextSelectorPropertyDecorator.js +44 -0
- package/player/js/utils/expressions/TransformInterface.js +126 -0
- package/player/js/utils/expressions/expressionHelpers.js +86 -0
- package/player/js/utils/expressions/shapes/ShapePathInterface.js +47 -0
- package/player/js/utils/featureSupport.js +16 -0
- package/player/js/utils/filters.js +32 -0
- package/player/js/utils/functionExtensions.js +27 -0
- package/player/js/utils/getFontProperties.js +42 -0
- package/player/js/utils/helpers/arrays.js +43 -0
- package/player/js/utils/helpers/assetManager.js +96 -0
- package/player/js/utils/helpers/blendModes.js +26 -0
- package/player/js/utils/helpers/bufferManager.js +61 -0
- package/player/js/utils/helpers/dynamicProperties.js +29 -0
- package/player/js/utils/helpers/effectTypes.js +3 -0
- package/player/js/utils/helpers/html_elements.js +6 -0
- package/player/js/utils/helpers/propTypes.js +3 -0
- package/player/js/utils/helpers/shapeEnums.js +16 -0
- package/player/js/utils/helpers/svg_elements.js +8 -0
- package/player/js/utils/imagePreloader.js +213 -0
- package/player/js/utils/imagePreloaderWorkerOverride.js +3 -0
- package/player/js/utils/markers/markerParser.js +47 -0
- package/player/js/utils/pooling/bezier_length_pool.js +20 -0
- package/player/js/utils/pooling/point_pool.js +13 -0
- package/player/js/utils/pooling/pool_factory.js +44 -0
- package/player/js/utils/pooling/pooling.js +15 -0
- package/player/js/utils/pooling/segments_length_pool.js +24 -0
- package/player/js/utils/pooling/shapeCollection_pool.js +48 -0
- package/player/js/utils/pooling/shape_pool.js +44 -0
- package/player/js/utils/shapes/DashProperty.js +63 -0
- package/player/js/utils/shapes/GradientProperty.js +93 -0
- package/player/js/utils/shapes/MouseModifier.js +222 -0
- package/player/js/utils/shapes/OffsetPathModifier.js +306 -0
- package/player/js/utils/shapes/PuckerAndBloatModifier.js +80 -0
- package/player/js/utils/shapes/RepeaterModifier.js +232 -0
- package/player/js/utils/shapes/RoundCornersModifier.js +122 -0
- package/player/js/utils/shapes/ShapeCollection.js +29 -0
- package/player/js/utils/shapes/ShapeModifiers.js +71 -0
- package/player/js/utils/shapes/ShapePath.js +100 -0
- package/player/js/utils/shapes/ShapeProperty.js +546 -0
- package/player/js/utils/shapes/TrimModifier.js +359 -0
- package/player/js/utils/shapes/ZigZagModifier.js +174 -0
- package/player/js/utils/shapes/shapePathBuilder.js +20 -0
- package/player/js/utils/text/LetterProps.js +60 -0
- package/player/js/utils/text/TextAnimatorDataProperty.js +34 -0
- package/player/js/utils/text/TextAnimatorProperty.js +610 -0
- package/player/js/utils/text/TextProperty.js +461 -0
- package/player/js/utils/text/TextSelectorProperty.js +179 -0
- package/player/js/worker_wrapper.js +1029 -0
- package/rollup.config.js +215 -0
- package/tasks/build.js +773 -0
- package/tasks/build_worker.js +164 -0
- package/tasks/watch.js +34 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import {
|
|
2
|
+
degToRads,
|
|
3
|
+
} from './common';
|
|
4
|
+
import {
|
|
5
|
+
extendPrototype,
|
|
6
|
+
} from './functionExtensions';
|
|
7
|
+
import DynamicPropertyContainer from './helpers/dynamicProperties';
|
|
8
|
+
import Matrix from '../3rd_party/transformation-matrix';
|
|
9
|
+
import PropertyFactory from './PropertyFactory';
|
|
10
|
+
|
|
11
|
+
const TransformPropertyFactory = (function () {
|
|
12
|
+
var defaultVector = [0, 0];
|
|
13
|
+
|
|
14
|
+
function applyToMatrix(mat) {
|
|
15
|
+
var _mdf = this._mdf;
|
|
16
|
+
this.iterateDynamicProperties();
|
|
17
|
+
this._mdf = this._mdf || _mdf;
|
|
18
|
+
if (this.a) {
|
|
19
|
+
mat.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);
|
|
20
|
+
}
|
|
21
|
+
if (this.s) {
|
|
22
|
+
mat.scale(this.s.v[0], this.s.v[1], this.s.v[2]);
|
|
23
|
+
}
|
|
24
|
+
if (this.sk) {
|
|
25
|
+
mat.skewFromAxis(-this.sk.v, this.sa.v);
|
|
26
|
+
}
|
|
27
|
+
if (this.r) {
|
|
28
|
+
mat.rotate(-this.r.v);
|
|
29
|
+
} else {
|
|
30
|
+
mat.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2])
|
|
31
|
+
.rotateY(this.or.v[1])
|
|
32
|
+
.rotateX(this.or.v[0]);
|
|
33
|
+
}
|
|
34
|
+
if (this.data.p.s) {
|
|
35
|
+
if (this.data.p.z) {
|
|
36
|
+
mat.translate(this.px.v, this.py.v, -this.pz.v);
|
|
37
|
+
} else {
|
|
38
|
+
mat.translate(this.px.v, this.py.v, 0);
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
mat.translate(this.p.v[0], this.p.v[1], -this.p.v[2]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function processKeys(forceRender) {
|
|
45
|
+
if (this.elem.globalData.frameId === this.frameId) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (this._isDirty) {
|
|
49
|
+
this.precalculateMatrix();
|
|
50
|
+
this._isDirty = false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
this.iterateDynamicProperties();
|
|
54
|
+
|
|
55
|
+
if (this._mdf || forceRender) {
|
|
56
|
+
var frameRate;
|
|
57
|
+
this.v.cloneFromProps(this.pre.props);
|
|
58
|
+
if (this.appliedTransformations < 1) {
|
|
59
|
+
this.v.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);
|
|
60
|
+
}
|
|
61
|
+
if (this.appliedTransformations < 2) {
|
|
62
|
+
this.v.scale(this.s.v[0], this.s.v[1], this.s.v[2]);
|
|
63
|
+
}
|
|
64
|
+
if (this.sk && this.appliedTransformations < 3) {
|
|
65
|
+
this.v.skewFromAxis(-this.sk.v, this.sa.v);
|
|
66
|
+
}
|
|
67
|
+
if (this.r && this.appliedTransformations < 4) {
|
|
68
|
+
this.v.rotate(-this.r.v);
|
|
69
|
+
} else if (!this.r && this.appliedTransformations < 4) {
|
|
70
|
+
this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2])
|
|
71
|
+
.rotateY(this.or.v[1])
|
|
72
|
+
.rotateX(this.or.v[0]);
|
|
73
|
+
}
|
|
74
|
+
if (this.autoOriented) {
|
|
75
|
+
var v1;
|
|
76
|
+
var v2;
|
|
77
|
+
frameRate = this.elem.globalData.frameRate;
|
|
78
|
+
if (this.p && this.p.keyframes && this.p.getValueAtTime) {
|
|
79
|
+
if (this.p._caching.lastFrame + this.p.offsetTime <= this.p.keyframes[0].t) {
|
|
80
|
+
v1 = this.p.getValueAtTime((this.p.keyframes[0].t + 0.01) / frameRate, 0);
|
|
81
|
+
v2 = this.p.getValueAtTime(this.p.keyframes[0].t / frameRate, 0);
|
|
82
|
+
} else if (this.p._caching.lastFrame + this.p.offsetTime >= this.p.keyframes[this.p.keyframes.length - 1].t) {
|
|
83
|
+
v1 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t / frameRate), 0);
|
|
84
|
+
v2 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t - 0.05) / frameRate, 0);
|
|
85
|
+
} else {
|
|
86
|
+
v1 = this.p.pv;
|
|
87
|
+
v2 = this.p.getValueAtTime((this.p._caching.lastFrame + this.p.offsetTime - 0.01) / frameRate, this.p.offsetTime);
|
|
88
|
+
}
|
|
89
|
+
} else if (this.px && this.px.keyframes && this.py.keyframes && this.px.getValueAtTime && this.py.getValueAtTime) {
|
|
90
|
+
v1 = [];
|
|
91
|
+
v2 = [];
|
|
92
|
+
var px = this.px;
|
|
93
|
+
var py = this.py;
|
|
94
|
+
if (px._caching.lastFrame + px.offsetTime <= px.keyframes[0].t) {
|
|
95
|
+
v1[0] = px.getValueAtTime((px.keyframes[0].t + 0.01) / frameRate, 0);
|
|
96
|
+
v1[1] = py.getValueAtTime((py.keyframes[0].t + 0.01) / frameRate, 0);
|
|
97
|
+
v2[0] = px.getValueAtTime((px.keyframes[0].t) / frameRate, 0);
|
|
98
|
+
v2[1] = py.getValueAtTime((py.keyframes[0].t) / frameRate, 0);
|
|
99
|
+
} else if (px._caching.lastFrame + px.offsetTime >= px.keyframes[px.keyframes.length - 1].t) {
|
|
100
|
+
v1[0] = px.getValueAtTime((px.keyframes[px.keyframes.length - 1].t / frameRate), 0);
|
|
101
|
+
v1[1] = py.getValueAtTime((py.keyframes[py.keyframes.length - 1].t / frameRate), 0);
|
|
102
|
+
v2[0] = px.getValueAtTime((px.keyframes[px.keyframes.length - 1].t - 0.01) / frameRate, 0);
|
|
103
|
+
v2[1] = py.getValueAtTime((py.keyframes[py.keyframes.length - 1].t - 0.01) / frameRate, 0);
|
|
104
|
+
} else {
|
|
105
|
+
v1 = [px.pv, py.pv];
|
|
106
|
+
v2[0] = px.getValueAtTime((px._caching.lastFrame + px.offsetTime - 0.01) / frameRate, px.offsetTime);
|
|
107
|
+
v2[1] = py.getValueAtTime((py._caching.lastFrame + py.offsetTime - 0.01) / frameRate, py.offsetTime);
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
v2 = defaultVector;
|
|
111
|
+
v1 = v2;
|
|
112
|
+
}
|
|
113
|
+
this.v.rotate(-Math.atan2(v1[1] - v2[1], v1[0] - v2[0]));
|
|
114
|
+
}
|
|
115
|
+
if (this.data.p && this.data.p.s) {
|
|
116
|
+
if (this.data.p.z) {
|
|
117
|
+
this.v.translate(this.px.v, this.py.v, -this.pz.v);
|
|
118
|
+
} else {
|
|
119
|
+
this.v.translate(this.px.v, this.py.v, 0);
|
|
120
|
+
}
|
|
121
|
+
} else {
|
|
122
|
+
this.v.translate(this.p.v[0], this.p.v[1], -this.p.v[2]);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
this.frameId = this.elem.globalData.frameId;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function precalculateMatrix() {
|
|
129
|
+
this.appliedTransformations = 0;
|
|
130
|
+
this.pre.reset();
|
|
131
|
+
|
|
132
|
+
if (!this.a.effectsSequence.length) {
|
|
133
|
+
this.pre.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);
|
|
134
|
+
this.appliedTransformations = 1;
|
|
135
|
+
} else {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (!this.s.effectsSequence.length) {
|
|
139
|
+
this.pre.scale(this.s.v[0], this.s.v[1], this.s.v[2]);
|
|
140
|
+
this.appliedTransformations = 2;
|
|
141
|
+
} else {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (this.sk) {
|
|
145
|
+
if (!this.sk.effectsSequence.length && !this.sa.effectsSequence.length) {
|
|
146
|
+
this.pre.skewFromAxis(-this.sk.v, this.sa.v);
|
|
147
|
+
this.appliedTransformations = 3;
|
|
148
|
+
} else {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (this.r) {
|
|
153
|
+
if (!this.r.effectsSequence.length) {
|
|
154
|
+
this.pre.rotate(-this.r.v);
|
|
155
|
+
this.appliedTransformations = 4;
|
|
156
|
+
}
|
|
157
|
+
} else if (!this.rz.effectsSequence.length && !this.ry.effectsSequence.length && !this.rx.effectsSequence.length && !this.or.effectsSequence.length) {
|
|
158
|
+
this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2])
|
|
159
|
+
.rotateY(this.or.v[1])
|
|
160
|
+
.rotateX(this.or.v[0]);
|
|
161
|
+
this.appliedTransformations = 4;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function autoOrient() {
|
|
166
|
+
//
|
|
167
|
+
// var prevP = this.getValueAtTime();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function addDynamicProperty(prop) {
|
|
171
|
+
this._addDynamicProperty(prop);
|
|
172
|
+
this.elem.addDynamicProperty(prop);
|
|
173
|
+
this._isDirty = true;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function TransformProperty(elem, data, container) {
|
|
177
|
+
this.elem = elem;
|
|
178
|
+
this.frameId = -1;
|
|
179
|
+
this.propType = 'transform';
|
|
180
|
+
this.data = data;
|
|
181
|
+
this.v = new Matrix();
|
|
182
|
+
// Precalculated matrix with non animated properties
|
|
183
|
+
this.pre = new Matrix();
|
|
184
|
+
this.appliedTransformations = 0;
|
|
185
|
+
this.initDynamicPropertyContainer(container || elem);
|
|
186
|
+
if (data.p && data.p.s) {
|
|
187
|
+
this.px = PropertyFactory.getProp(elem, data.p.x, 0, 0, this);
|
|
188
|
+
this.py = PropertyFactory.getProp(elem, data.p.y, 0, 0, this);
|
|
189
|
+
if (data.p.z) {
|
|
190
|
+
this.pz = PropertyFactory.getProp(elem, data.p.z, 0, 0, this);
|
|
191
|
+
}
|
|
192
|
+
} else {
|
|
193
|
+
this.p = PropertyFactory.getProp(elem, data.p || { k: [0, 0, 0] }, 1, 0, this);
|
|
194
|
+
}
|
|
195
|
+
if (data.rx) {
|
|
196
|
+
this.rx = PropertyFactory.getProp(elem, data.rx, 0, degToRads, this);
|
|
197
|
+
this.ry = PropertyFactory.getProp(elem, data.ry, 0, degToRads, this);
|
|
198
|
+
this.rz = PropertyFactory.getProp(elem, data.rz, 0, degToRads, this);
|
|
199
|
+
if (data.or.k[0].ti) {
|
|
200
|
+
var i;
|
|
201
|
+
var len = data.or.k.length;
|
|
202
|
+
for (i = 0; i < len; i += 1) {
|
|
203
|
+
data.or.k[i].to = null;
|
|
204
|
+
data.or.k[i].ti = null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this.or = PropertyFactory.getProp(elem, data.or, 1, degToRads, this);
|
|
208
|
+
// sh Indicates it needs to be capped between -180 and 180
|
|
209
|
+
this.or.sh = true;
|
|
210
|
+
} else {
|
|
211
|
+
this.r = PropertyFactory.getProp(elem, data.r || { k: 0 }, 0, degToRads, this);
|
|
212
|
+
}
|
|
213
|
+
if (data.sk) {
|
|
214
|
+
this.sk = PropertyFactory.getProp(elem, data.sk, 0, degToRads, this);
|
|
215
|
+
this.sa = PropertyFactory.getProp(elem, data.sa, 0, degToRads, this);
|
|
216
|
+
}
|
|
217
|
+
this.a = PropertyFactory.getProp(elem, data.a || { k: [0, 0, 0] }, 1, 0, this);
|
|
218
|
+
this.s = PropertyFactory.getProp(elem, data.s || { k: [100, 100, 100] }, 1, 0.01, this);
|
|
219
|
+
// Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes.
|
|
220
|
+
if (data.o) {
|
|
221
|
+
this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, elem);
|
|
222
|
+
} else {
|
|
223
|
+
this.o = { _mdf: false, v: 1 };
|
|
224
|
+
}
|
|
225
|
+
this._isDirty = true;
|
|
226
|
+
if (!this.dynamicProperties.length) {
|
|
227
|
+
this.getValue(true);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
TransformProperty.prototype = {
|
|
232
|
+
applyToMatrix: applyToMatrix,
|
|
233
|
+
getValue: processKeys,
|
|
234
|
+
precalculateMatrix: precalculateMatrix,
|
|
235
|
+
autoOrient: autoOrient,
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
extendPrototype([DynamicPropertyContainer], TransformProperty);
|
|
239
|
+
TransformProperty.prototype.addDynamicProperty = addDynamicProperty;
|
|
240
|
+
TransformProperty.prototype._addDynamicProperty = DynamicPropertyContainer.prototype.addDynamicProperty;
|
|
241
|
+
|
|
242
|
+
function getTransformProperty(elem, data, container) {
|
|
243
|
+
return new TransformProperty(elem, data, container);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return {
|
|
247
|
+
getTransformProperty: getTransformProperty,
|
|
248
|
+
};
|
|
249
|
+
}());
|
|
250
|
+
|
|
251
|
+
export default TransformPropertyFactory;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
var lastTime = 0;
|
|
3
|
+
var vendors = ['ms', 'moz', 'webkit', 'o'];
|
|
4
|
+
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { // eslint-disable-line no-plusplus
|
|
5
|
+
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
|
|
6
|
+
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
|
|
7
|
+
}
|
|
8
|
+
if (!window.requestAnimationFrame) {
|
|
9
|
+
window.requestAnimationFrame = function (callback) {
|
|
10
|
+
var currTime = new Date().getTime();
|
|
11
|
+
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
|
|
12
|
+
var id = setTimeout(function () {
|
|
13
|
+
callback(currTime + timeToCall);
|
|
14
|
+
},
|
|
15
|
+
timeToCall);
|
|
16
|
+
lastTime = currTime + timeToCall;
|
|
17
|
+
return id;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (!window.cancelAnimationFrame) {
|
|
21
|
+
window.cancelAnimationFrame = function (id) {
|
|
22
|
+
clearTimeout(id);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}());
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const assetLoader = (function () {
|
|
2
|
+
function formatResponse(xhr) {
|
|
3
|
+
// using typeof doubles the time of execution of this method,
|
|
4
|
+
// so if available, it's better to use the header to validate the type
|
|
5
|
+
var contentTypeHeader = xhr.getResponseHeader('content-type');
|
|
6
|
+
if (contentTypeHeader && xhr.responseType === 'json' && contentTypeHeader.indexOf('json') !== -1) {
|
|
7
|
+
return xhr.response;
|
|
8
|
+
}
|
|
9
|
+
if (xhr.response && typeof xhr.response === 'object') {
|
|
10
|
+
return xhr.response;
|
|
11
|
+
} if (xhr.response && typeof xhr.response === 'string') {
|
|
12
|
+
return JSON.parse(xhr.response);
|
|
13
|
+
} if (xhr.responseText) {
|
|
14
|
+
return JSON.parse(xhr.responseText);
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function loadAsset(path, callback, errorCallback) {
|
|
20
|
+
var response;
|
|
21
|
+
var xhr = new XMLHttpRequest();
|
|
22
|
+
// set responseType after calling open or IE will break.
|
|
23
|
+
try {
|
|
24
|
+
// This crashes on Android WebView prior to KitKat
|
|
25
|
+
xhr.responseType = 'json';
|
|
26
|
+
} catch (err) {} // eslint-disable-line no-empty
|
|
27
|
+
xhr.onreadystatechange = function () {
|
|
28
|
+
if (xhr.readyState === 4) {
|
|
29
|
+
if (xhr.status === 200) {
|
|
30
|
+
response = formatResponse(xhr);
|
|
31
|
+
callback(response);
|
|
32
|
+
} else {
|
|
33
|
+
try {
|
|
34
|
+
response = formatResponse(xhr);
|
|
35
|
+
callback(response);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
if (errorCallback) {
|
|
38
|
+
errorCallback(err);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
// Hack to workaround banner validation
|
|
45
|
+
xhr.open(['G', 'E', 'T'].join(''), path, true);
|
|
46
|
+
xhr.send();
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
load: loadAsset,
|
|
50
|
+
};
|
|
51
|
+
}());
|
|
52
|
+
|
|
53
|
+
export default assetLoader;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// import Howl from '../../3rd_party/howler';
|
|
2
|
+
|
|
3
|
+
const audioControllerFactory = (function () {
|
|
4
|
+
function AudioController(audioFactory) {
|
|
5
|
+
this.audios = [];
|
|
6
|
+
this.audioFactory = audioFactory;
|
|
7
|
+
this._volume = 1;
|
|
8
|
+
this._isMuted = false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
AudioController.prototype = {
|
|
12
|
+
addAudio: function (audio) {
|
|
13
|
+
this.audios.push(audio);
|
|
14
|
+
},
|
|
15
|
+
pause: function () {
|
|
16
|
+
var i;
|
|
17
|
+
var len = this.audios.length;
|
|
18
|
+
for (i = 0; i < len; i += 1) {
|
|
19
|
+
this.audios[i].pause();
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
resume: function () {
|
|
23
|
+
var i;
|
|
24
|
+
var len = this.audios.length;
|
|
25
|
+
for (i = 0; i < len; i += 1) {
|
|
26
|
+
this.audios[i].resume();
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
setRate: function (rateValue) {
|
|
30
|
+
var i;
|
|
31
|
+
var len = this.audios.length;
|
|
32
|
+
for (i = 0; i < len; i += 1) {
|
|
33
|
+
this.audios[i].setRate(rateValue);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
createAudio: function (assetPath) {
|
|
37
|
+
if (this.audioFactory) {
|
|
38
|
+
return this.audioFactory(assetPath);
|
|
39
|
+
} if (window.Howl) {
|
|
40
|
+
return new window.Howl({
|
|
41
|
+
src: [assetPath],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
isPlaying: false,
|
|
46
|
+
play: function () { this.isPlaying = true; },
|
|
47
|
+
seek: function () { this.isPlaying = false; },
|
|
48
|
+
playing: function () {},
|
|
49
|
+
rate: function () {},
|
|
50
|
+
setVolume: function () {},
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
setAudioFactory: function (audioFactory) {
|
|
54
|
+
this.audioFactory = audioFactory;
|
|
55
|
+
},
|
|
56
|
+
setVolume: function (value) {
|
|
57
|
+
this._volume = value;
|
|
58
|
+
this._updateVolume();
|
|
59
|
+
},
|
|
60
|
+
mute: function () {
|
|
61
|
+
this._isMuted = true;
|
|
62
|
+
this._updateVolume();
|
|
63
|
+
},
|
|
64
|
+
unmute: function () {
|
|
65
|
+
this._isMuted = false;
|
|
66
|
+
this._updateVolume();
|
|
67
|
+
},
|
|
68
|
+
getVolume: function () {
|
|
69
|
+
return this._volume;
|
|
70
|
+
},
|
|
71
|
+
_updateVolume: function () {
|
|
72
|
+
var i;
|
|
73
|
+
var len = this.audios.length;
|
|
74
|
+
for (i = 0; i < len; i += 1) {
|
|
75
|
+
this.audios[i].volume(this._volume * (this._isMuted ? 0 : 1));
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return function () {
|
|
81
|
+
return new AudioController();
|
|
82
|
+
};
|
|
83
|
+
}());
|
|
84
|
+
|
|
85
|
+
export default audioControllerFactory;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import {
|
|
2
|
+
bmPow,
|
|
3
|
+
bmFloor,
|
|
4
|
+
bmSqrt,
|
|
5
|
+
getDefaultCurveSegments,
|
|
6
|
+
} from './common';
|
|
7
|
+
import {
|
|
8
|
+
createSizedArray,
|
|
9
|
+
createTypedArray,
|
|
10
|
+
} from './helpers/arrays';
|
|
11
|
+
import segmentsLengthPool from './pooling/segments_length_pool';
|
|
12
|
+
import bezierLengthPool from './pooling/bezier_length_pool';
|
|
13
|
+
|
|
14
|
+
function bezFunction() {
|
|
15
|
+
var math = Math;
|
|
16
|
+
|
|
17
|
+
function pointOnLine2D(x1, y1, x2, y2, x3, y3) {
|
|
18
|
+
var det1 = (x1 * y2) + (y1 * x3) + (x2 * y3) - (x3 * y2) - (y3 * x1) - (x2 * y1);
|
|
19
|
+
return det1 > -0.001 && det1 < 0.001;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function pointOnLine3D(x1, y1, z1, x2, y2, z2, x3, y3, z3) {
|
|
23
|
+
if (z1 === 0 && z2 === 0 && z3 === 0) {
|
|
24
|
+
return pointOnLine2D(x1, y1, x2, y2, x3, y3);
|
|
25
|
+
}
|
|
26
|
+
var dist1 = math.sqrt(math.pow(x2 - x1, 2) + math.pow(y2 - y1, 2) + math.pow(z2 - z1, 2));
|
|
27
|
+
var dist2 = math.sqrt(math.pow(x3 - x1, 2) + math.pow(y3 - y1, 2) + math.pow(z3 - z1, 2));
|
|
28
|
+
var dist3 = math.sqrt(math.pow(x3 - x2, 2) + math.pow(y3 - y2, 2) + math.pow(z3 - z2, 2));
|
|
29
|
+
var diffDist;
|
|
30
|
+
if (dist1 > dist2) {
|
|
31
|
+
if (dist1 > dist3) {
|
|
32
|
+
diffDist = dist1 - dist2 - dist3;
|
|
33
|
+
} else {
|
|
34
|
+
diffDist = dist3 - dist2 - dist1;
|
|
35
|
+
}
|
|
36
|
+
} else if (dist3 > dist2) {
|
|
37
|
+
diffDist = dist3 - dist2 - dist1;
|
|
38
|
+
} else {
|
|
39
|
+
diffDist = dist2 - dist1 - dist3;
|
|
40
|
+
}
|
|
41
|
+
return diffDist > -0.0001 && diffDist < 0.0001;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
var getBezierLength = (function () {
|
|
45
|
+
return function (pt1, pt2, pt3, pt4) {
|
|
46
|
+
var curveSegments = getDefaultCurveSegments();
|
|
47
|
+
var k;
|
|
48
|
+
var i;
|
|
49
|
+
var len;
|
|
50
|
+
var ptCoord;
|
|
51
|
+
var perc;
|
|
52
|
+
var addedLength = 0;
|
|
53
|
+
var ptDistance;
|
|
54
|
+
var point = [];
|
|
55
|
+
var lastPoint = [];
|
|
56
|
+
var lengthData = bezierLengthPool.newElement();
|
|
57
|
+
len = pt3.length;
|
|
58
|
+
for (k = 0; k < curveSegments; k += 1) {
|
|
59
|
+
perc = k / (curveSegments - 1);
|
|
60
|
+
ptDistance = 0;
|
|
61
|
+
for (i = 0; i < len; i += 1) {
|
|
62
|
+
ptCoord = bmPow(1 - perc, 3) * pt1[i] + 3 * bmPow(1 - perc, 2) * perc * pt3[i] + 3 * (1 - perc) * bmPow(perc, 2) * pt4[i] + bmPow(perc, 3) * pt2[i];
|
|
63
|
+
point[i] = ptCoord;
|
|
64
|
+
if (lastPoint[i] !== null) {
|
|
65
|
+
ptDistance += bmPow(point[i] - lastPoint[i], 2);
|
|
66
|
+
}
|
|
67
|
+
lastPoint[i] = point[i];
|
|
68
|
+
}
|
|
69
|
+
if (ptDistance) {
|
|
70
|
+
ptDistance = bmSqrt(ptDistance);
|
|
71
|
+
addedLength += ptDistance;
|
|
72
|
+
}
|
|
73
|
+
lengthData.percents[k] = perc;
|
|
74
|
+
lengthData.lengths[k] = addedLength;
|
|
75
|
+
}
|
|
76
|
+
lengthData.addedLength = addedLength;
|
|
77
|
+
return lengthData;
|
|
78
|
+
};
|
|
79
|
+
}());
|
|
80
|
+
|
|
81
|
+
function getSegmentsLength(shapeData) {
|
|
82
|
+
var segmentsLength = segmentsLengthPool.newElement();
|
|
83
|
+
var closed = shapeData.c;
|
|
84
|
+
var pathV = shapeData.v;
|
|
85
|
+
var pathO = shapeData.o;
|
|
86
|
+
var pathI = shapeData.i;
|
|
87
|
+
var i;
|
|
88
|
+
var len = shapeData._length;
|
|
89
|
+
var lengths = segmentsLength.lengths;
|
|
90
|
+
var totalLength = 0;
|
|
91
|
+
for (i = 0; i < len - 1; i += 1) {
|
|
92
|
+
lengths[i] = getBezierLength(pathV[i], pathV[i + 1], pathO[i], pathI[i + 1]);
|
|
93
|
+
totalLength += lengths[i].addedLength;
|
|
94
|
+
}
|
|
95
|
+
if (closed && len) {
|
|
96
|
+
lengths[i] = getBezierLength(pathV[i], pathV[0], pathO[i], pathI[0]);
|
|
97
|
+
totalLength += lengths[i].addedLength;
|
|
98
|
+
}
|
|
99
|
+
segmentsLength.totalLength = totalLength;
|
|
100
|
+
return segmentsLength;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function BezierData(length) {
|
|
104
|
+
this.segmentLength = 0;
|
|
105
|
+
this.points = new Array(length);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function PointData(partial, point) {
|
|
109
|
+
this.partialLength = partial;
|
|
110
|
+
this.point = point;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
var buildBezierData = (function () {
|
|
114
|
+
var storedData = {};
|
|
115
|
+
|
|
116
|
+
return function (pt1, pt2, pt3, pt4) {
|
|
117
|
+
var bezierName = (pt1[0] + '_' + pt1[1] + '_' + pt2[0] + '_' + pt2[1] + '_' + pt3[0] + '_' + pt3[1] + '_' + pt4[0] + '_' + pt4[1]).replace(/\./g, 'p');
|
|
118
|
+
if (!storedData[bezierName]) {
|
|
119
|
+
var curveSegments = getDefaultCurveSegments();
|
|
120
|
+
var k;
|
|
121
|
+
var i;
|
|
122
|
+
var len;
|
|
123
|
+
var ptCoord;
|
|
124
|
+
var perc;
|
|
125
|
+
var addedLength = 0;
|
|
126
|
+
var ptDistance;
|
|
127
|
+
var point;
|
|
128
|
+
var lastPoint = null;
|
|
129
|
+
if (pt1.length === 2 && (pt1[0] !== pt2[0] || pt1[1] !== pt2[1]) && pointOnLine2D(pt1[0], pt1[1], pt2[0], pt2[1], pt1[0] + pt3[0], pt1[1] + pt3[1]) && pointOnLine2D(pt1[0], pt1[1], pt2[0], pt2[1], pt2[0] + pt4[0], pt2[1] + pt4[1])) {
|
|
130
|
+
curveSegments = 2;
|
|
131
|
+
}
|
|
132
|
+
var bezierData = new BezierData(curveSegments);
|
|
133
|
+
len = pt3.length;
|
|
134
|
+
for (k = 0; k < curveSegments; k += 1) {
|
|
135
|
+
point = createSizedArray(len);
|
|
136
|
+
perc = k / (curveSegments - 1);
|
|
137
|
+
ptDistance = 0;
|
|
138
|
+
for (i = 0; i < len; i += 1) {
|
|
139
|
+
ptCoord = bmPow(1 - perc, 3) * pt1[i] + 3 * bmPow(1 - perc, 2) * perc * (pt1[i] + pt3[i]) + 3 * (1 - perc) * bmPow(perc, 2) * (pt2[i] + pt4[i]) + bmPow(perc, 3) * pt2[i];
|
|
140
|
+
point[i] = ptCoord;
|
|
141
|
+
if (lastPoint !== null) {
|
|
142
|
+
ptDistance += bmPow(point[i] - lastPoint[i], 2);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
ptDistance = bmSqrt(ptDistance);
|
|
146
|
+
addedLength += ptDistance;
|
|
147
|
+
bezierData.points[k] = new PointData(ptDistance, point);
|
|
148
|
+
lastPoint = point;
|
|
149
|
+
}
|
|
150
|
+
bezierData.segmentLength = addedLength;
|
|
151
|
+
storedData[bezierName] = bezierData;
|
|
152
|
+
}
|
|
153
|
+
return storedData[bezierName];
|
|
154
|
+
};
|
|
155
|
+
}());
|
|
156
|
+
|
|
157
|
+
function getDistancePerc(perc, bezierData) {
|
|
158
|
+
var percents = bezierData.percents;
|
|
159
|
+
var lengths = bezierData.lengths;
|
|
160
|
+
var len = percents.length;
|
|
161
|
+
var initPos = bmFloor((len - 1) * perc);
|
|
162
|
+
var lengthPos = perc * bezierData.addedLength;
|
|
163
|
+
var lPerc = 0;
|
|
164
|
+
if (initPos === len - 1 || initPos === 0 || lengthPos === lengths[initPos]) {
|
|
165
|
+
return percents[initPos];
|
|
166
|
+
}
|
|
167
|
+
var dir = lengths[initPos] > lengthPos ? -1 : 1;
|
|
168
|
+
var flag = true;
|
|
169
|
+
while (flag) {
|
|
170
|
+
if (lengths[initPos] <= lengthPos && lengths[initPos + 1] > lengthPos) {
|
|
171
|
+
lPerc = (lengthPos - lengths[initPos]) / (lengths[initPos + 1] - lengths[initPos]);
|
|
172
|
+
flag = false;
|
|
173
|
+
} else {
|
|
174
|
+
initPos += dir;
|
|
175
|
+
}
|
|
176
|
+
if (initPos < 0 || initPos >= len - 1) {
|
|
177
|
+
// FIX for TypedArrays that don't store floating point values with enough accuracy
|
|
178
|
+
if (initPos === len - 1) {
|
|
179
|
+
return percents[initPos];
|
|
180
|
+
}
|
|
181
|
+
flag = false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return percents[initPos] + (percents[initPos + 1] - percents[initPos]) * lPerc;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function getPointInSegment(pt1, pt2, pt3, pt4, percent, bezierData) {
|
|
188
|
+
var t1 = getDistancePerc(percent, bezierData);
|
|
189
|
+
var u1 = 1 - t1;
|
|
190
|
+
var ptX = math.round((u1 * u1 * u1 * pt1[0] + (t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1) * pt3[0] + (t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1) * pt4[0] + t1 * t1 * t1 * pt2[0]) * 1000) / 1000;
|
|
191
|
+
var ptY = math.round((u1 * u1 * u1 * pt1[1] + (t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1) * pt3[1] + (t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1) * pt4[1] + t1 * t1 * t1 * pt2[1]) * 1000) / 1000;
|
|
192
|
+
return [ptX, ptY];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
var bezierSegmentPoints = createTypedArray('float32', 8);
|
|
196
|
+
|
|
197
|
+
function getNewSegment(pt1, pt2, pt3, pt4, startPerc, endPerc, bezierData) {
|
|
198
|
+
if (startPerc < 0) {
|
|
199
|
+
startPerc = 0;
|
|
200
|
+
} else if (startPerc > 1) {
|
|
201
|
+
startPerc = 1;
|
|
202
|
+
}
|
|
203
|
+
var t0 = getDistancePerc(startPerc, bezierData);
|
|
204
|
+
endPerc = endPerc > 1 ? 1 : endPerc;
|
|
205
|
+
var t1 = getDistancePerc(endPerc, bezierData);
|
|
206
|
+
var i;
|
|
207
|
+
var len = pt1.length;
|
|
208
|
+
var u0 = 1 - t0;
|
|
209
|
+
var u1 = 1 - t1;
|
|
210
|
+
var u0u0u0 = u0 * u0 * u0;
|
|
211
|
+
var t0u0u0_3 = t0 * u0 * u0 * 3; // eslint-disable-line camelcase
|
|
212
|
+
var t0t0u0_3 = t0 * t0 * u0 * 3; // eslint-disable-line camelcase
|
|
213
|
+
var t0t0t0 = t0 * t0 * t0;
|
|
214
|
+
//
|
|
215
|
+
var u0u0u1 = u0 * u0 * u1;
|
|
216
|
+
var t0u0u1_3 = t0 * u0 * u1 + u0 * t0 * u1 + u0 * u0 * t1; // eslint-disable-line camelcase
|
|
217
|
+
var t0t0u1_3 = t0 * t0 * u1 + u0 * t0 * t1 + t0 * u0 * t1; // eslint-disable-line camelcase
|
|
218
|
+
var t0t0t1 = t0 * t0 * t1;
|
|
219
|
+
//
|
|
220
|
+
var u0u1u1 = u0 * u1 * u1;
|
|
221
|
+
var t0u1u1_3 = t0 * u1 * u1 + u0 * t1 * u1 + u0 * u1 * t1; // eslint-disable-line camelcase
|
|
222
|
+
var t0t1u1_3 = t0 * t1 * u1 + u0 * t1 * t1 + t0 * u1 * t1; // eslint-disable-line camelcase
|
|
223
|
+
var t0t1t1 = t0 * t1 * t1;
|
|
224
|
+
//
|
|
225
|
+
var u1u1u1 = u1 * u1 * u1;
|
|
226
|
+
var t1u1u1_3 = t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1; // eslint-disable-line camelcase
|
|
227
|
+
var t1t1u1_3 = t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1; // eslint-disable-line camelcase
|
|
228
|
+
var t1t1t1 = t1 * t1 * t1;
|
|
229
|
+
for (i = 0; i < len; i += 1) {
|
|
230
|
+
bezierSegmentPoints[i * 4] = math.round((u0u0u0 * pt1[i] + t0u0u0_3 * pt3[i] + t0t0u0_3 * pt4[i] + t0t0t0 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase
|
|
231
|
+
bezierSegmentPoints[i * 4 + 1] = math.round((u0u0u1 * pt1[i] + t0u0u1_3 * pt3[i] + t0t0u1_3 * pt4[i] + t0t0t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase
|
|
232
|
+
bezierSegmentPoints[i * 4 + 2] = math.round((u0u1u1 * pt1[i] + t0u1u1_3 * pt3[i] + t0t1u1_3 * pt4[i] + t0t1t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase
|
|
233
|
+
bezierSegmentPoints[i * 4 + 3] = math.round((u1u1u1 * pt1[i] + t1u1u1_3 * pt3[i] + t1t1u1_3 * pt4[i] + t1t1t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return bezierSegmentPoints;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return {
|
|
240
|
+
getSegmentsLength: getSegmentsLength,
|
|
241
|
+
getNewSegment: getNewSegment,
|
|
242
|
+
getPointInSegment: getPointInSegment,
|
|
243
|
+
buildBezierData: buildBezierData,
|
|
244
|
+
pointOnLine2D: pointOnLine2D,
|
|
245
|
+
pointOnLine3D: pointOnLine3D,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const bez = bezFunction();
|
|
250
|
+
|
|
251
|
+
export default bez;
|