/*
* ParameterGroup.js
* Keynote HTML Player
*
* Created by Tungwei Cheng
* Copyright (c) 2018-2019 Apple Inc. All rights reserved.
*/
var KNAnimParameterGroup = Class.create({
initialize: function(name) {
this.parameterGroup = ParameterGroup[name];
this.animationCurves = {};
},
doubleForKey: function(key) {
var result = this.parameterGroup[key].dblValue;
if (!result) {
result = this.parameterGroup[key];
}
return result;
},
boolForKey: function(key) {
var result = this.parameterGroup[key].dblValue;
if (!result) {
result = this.parameterGroup[key];
}
return result > 0;
},
doubleForAnimationCurve: function(key, percent) {
var path = this.pathForAnimationCurve(key);
var result = path.yValueFromXValue(percent);
return result;
},
pathForAnimationCurve: function(key) {
var bezierCurve = this.animationCurves[key];
if (!bezierCurve) {
var parameter = this.parameterGroup[key];
bezierCurve = new CubicBezierPath(parameter.controlPoints[0], parameter.controlPoints[1]);
this.animationCurves[key] = bezierCurve;
}
return bezierCurve;
}
});
// Bezier Curve with Newton's method for solving
var CubicBezierPath = Class.create({
initialize: function(p1, p2) {
var cx = this.cx = 3 * p1.x;
var bx = this.bx = 3 * (p2.x - p1.x) - cx;
var ax = this.ax = 1 - cx - bx;
var cy = this.cy = 3 * p1.y;
var by = this.by = 3 * (p2.y - p1.y) - cy;
var ay = this.ay = 1 - cy - by;
// loop 5 times maximum
this.iteration = 5;
// the tolerance accepted
this.epsilon = 1e-4;
},
bezierCurveX: function(t) {
return t * (this.cx + t * (this.bx + t * this.ax));
},
bezierCurveY: function(t) {
return t * (this.cy + t * (this.by + t * this.ay));
},
bezierCurveDerivativeX: function(t) {
return this.cx + t * (2 * this.bx + 3 * this.ax * t);
},
solveXForT: function(t) {
var epsilon = this.epsilon;
var x0 = t;
var x1;
for (var i = 0, length = this.iteration; i < length; i++) {
x1 = this.bezierCurveX(x0) - t;
if (Math.abs(x1) < epsilon) {
break;
}
x0 = x0 - (x1 / this.bezierCurveDerivativeX(x0));
}
return x0;
},
yValueFromXValue: function(xValue) {
return this.bezierCurveY(this.solveXForT(xValue));
}
});
var ParameterGroup = {
"Fireworks": {
"FireworkSizeMax": 0.3,
"FireworkDurationMax": 2,
"ParticleTrailsDitherMax": 2,
"SparkleStartTime": 0.5,
"TextOpacityEndTime": 0.6,
"ParticleTransparency": {
"dblValue": 0,
"controlPoints": [{"x": 1, "y": 0}, {"x": 0.718446, "y": 1}]
},
"TextOpacityTiming": {
"dblValue": 0,
"controlPoints": [{"x": 1, "y": 0}, {"x": 0.825627, "y": 1}]
},
"BloomBlurScale":4,
"Gravity": 20,
"ParticleBurstTiming": {
"dblValue": 0,
"controlPoints": [{"x": 0, "y": 1}, {"x": 0.551894, "y": 0.993738}]
},
"ParticleSizeStart": 0.5,
"ParticleTrailsDitherAmount": 0.5,
"CenterBurstOpacity": 1,
"BloomPower": 3,
"ParticleSizeMax": 0.5,
"ParticleSizeMin": 3,
"CenterBurstScaleMin": 0.15,
"TrailsFadeOutMax": 0.1,
"CenterBurstScaleMax": 0.3,
"TrailsFadeOutMin": 0.03,
"TextOpacityBeginTime": 0.1,
"ParticleCount": 200,
"SparklePeriod": 13,
"ParticleColorRandomness": 0.09,
"FireworkSpeedMax": 1,
"FireworkDurationMin": 1,
"FireworkSizeMin": 0.15,
"ParticleLifeSpanMinDuration": 0.5,
"FireworkSpeedMin": 0.8,
"FireworksCount": 2
},
"timingFunction": {
"EaseIn": {
"controlPoints": [{"x": 0.42, "y": 0}, {"x": 1, "y": 1}]
},
"EaseOut": {
"controlPoints": [{"x": 0, "y": 0}, {"x": 0.58, "y": 1}]
},
"EaseInEaseOut": {
"controlPoints": [{"x": 0.42, "y": 0}, {"x": 0.58, "y": 1}]
}
}
};