feat(All):Initial

This commit is contained in:
mlt131220 committed 2025-10-04 23:36:07 +08:00
commit 2b4e5d2668
1321 files changed
+415958

No files matched your search

@@ -0,0 +1,134 @@
import { MathUtils, createSpan } from '../math';
import Behaviour from './Behaviour';
import { PARTICLE_ALPHA_THRESHOLD } from './constants';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_ALPHA as type } from './types';
/**
* Behaviour that applies an alpha transition effect to particles.
*
*/
export default class Alpha extends Behaviour {
/**
* Constructs an Alpha behaviour instance.
*
* @param {number} alphaA - The starting alpha value
* @param {?number} alphaB - The ending alpha value
* @param {number} life - The life of the behaviour
* @param {function} easing - The easing equation to use for transforms
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(alphaA = 1, alphaB = null, life = Infinity, easing, isEnabled = true) {
super(life, easing, type, isEnabled);
/**
* @desc The starting alpha value
* @type {number|Span}
*/
this.alphaA = alphaA;
/**
* @desc The ending alpha value
* @type {number|Span}
*/
this.alphaB = alphaB;
this.reset(alphaA, alphaB);
}
/**
* Gets the _same property which determines if the alpha are the same.
*
* @return {boolean}
*/
get same() {
return this._same;
}
/**
* Sets the _same property which determines if the alpha are the same.
*
* @param {boolean} same
* @return {boolean}
*/
set same(same) {
/**
* @type {boolean}
*/
this._same = same;
}
/**
* Resets the behaviour properties.
*
* @param {number} alphaA - the starting alpha value
* @param {?number} alphaB - the ending alpha value
* @param {number} life - the life of the behaviour
* @param {function} easing - the easing equation to use for transforms
* @return void
*/
reset(alphaA = 1, alphaB = null, life, easing) {
this.same = alphaB === null || alphaB === undefined ? true : false;
this.alphaA = createSpan(alphaA);
this.alphaB = createSpan(alphaB);
life && super.reset(life, easing);
}
/**
* Initializes the behaviour on a particle.
*
* @param {object} particle - the particle to initialize the behaviour on
* @return void
*/
initialize(particle) {
particle.useAlpha = true;
particle.transform.alphaA = this.alphaA.getValue();
particle.transform.alphaB = this.same ? particle.transform.alphaA : this.alphaB.getValue();
}
/**
* Mutates the target's alpha/opacity property.
*
* @param {object} particle - the particle to apply the behaviour to
* @param {number} time - engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
this.energize(particle, time, index);
particle.alpha = MathUtils.lerp(particle.transform.alphaA, particle.transform.alphaB, this.energy);
if (particle.alpha < PARTICLE_ALPHA_THRESHOLD) {
particle.alpha = 0;
}
}
/**
* Creates a Body initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @property {number} json.alphaA - The starting alpha value
* @property {number} json.alphaB - The ending alpha value
* @property {number} json.life - The life of the behaviour
* @property {string} json.easing - The easing equation to use for transforms
* @return {Body}
*/
static fromJSON(json) {
const {
alphaA,
alphaB,
life,
easing,
isEnabled = true
} = json;
return new Alpha(alphaA, alphaB, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQWxwaGEuanMiXSwibmFtZXMiOlsiTWF0aFV0aWxzIiwiY3JlYXRlU3BhbiIsIkJlaGF2aW91ciIsIlBBUlRJQ0xFX0FMUEhBX1RIUkVTSE9MRCIsImdldEVhc2luZ0J5TmFtZSIsIkJFSEFWSU9VUl9UWVBFX0FMUEhBIiwidHlwZSIsIkFscGhhIiwiY29uc3RydWN0b3IiLCJhbHBoYUEiLCJhbHBoYUIiLCJsaWZlIiwiZWFzaW5nIiwiaXNFbmFibGVkIiwicmVzZXQiLCJzYW1lIiwiX3NhbWUiLCJ1bmRlZmluZWQiLCJpbml0aWFsaXplIiwicGFydGljbGUiLCJ1c2VBbHBoYSIsInRyYW5zZm9ybSIsImdldFZhbHVlIiwibXV0YXRlIiwidGltZSIsImluZGV4IiwiZW5lcmdpemUiLCJhbHBoYSIsImxlcnAiLCJlbmVyZ3kiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFNBQVQsRUFBb0JDLFVBQXBCLFFBQXNDLFNBQXRDO0FBRUEsT0FBT0MsU0FBUCxNQUFzQixhQUF0QjtBQUNBLFNBQVNDLHdCQUFULFFBQXlDLGFBQXpDO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQyxTQUFoQztBQUNBLFNBQVNDLG9CQUFvQixJQUFJQyxJQUFqQyxRQUE2QyxTQUE3QztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsS0FBTixTQUFvQkwsU0FBcEIsQ0FBOEI7QUFDM0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRU0sRUFBQUEsV0FBVyxDQUFDQyxNQUFNLEdBQUcsQ0FBVixFQUFhQyxNQUFNLEdBQUcsSUFBdEIsRUFBNEJDLElBQTVCLEVBQWtDQyxNQUFsQyxFQUEwQ0MsU0FBUyxHQUFHLElBQXRELEVBQTREO0FBQ3JFLFVBQU1GLElBQU4sRUFBWUMsTUFBWixFQUFvQk4sSUFBcEIsRUFBMEJPLFNBQTFCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0osTUFBTCxHQUFjQSxNQUFkO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0MsTUFBTCxHQUFjQSxNQUFkO0FBRUEsU0FBS0ksS0FBTCxDQUFXTCxNQUFYLEVBQW1CQyxNQUFuQjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ1UsTUFBSkssSUFBSSxHQUFHO0FBQ1QsV0FBTyxLQUFLQyxLQUFaO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNVLE1BQUpELElBQUksQ0FBQ0EsSUFBRCxFQUFPO0FBQ2I7QUFDSjtBQUNBO0FBQ0ksU0FBS0MsS0FBTCxHQUFhRCxJQUFiO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRCxFQUFBQSxLQUFLLENBQUNMLE1BQU0sR0FBRyxDQUFWLEVBQWFDLE1BQU0sR0FBRyxJQUF0QixFQUE0QkMsSUFBNUIsRUFBa0NDLE1BQWxDLEVBQTBDO0FBQzdDLFNBQUtHLElBQUwsR0FBWUwsTUFBTSxLQUFLLElBQVgsSUFBbUJBLE1BQU0sS0FBS08sU0FBOUIsR0FBMEMsSUFBMUMsR0FBaUQsS0FBN0Q7QUFDQSxTQUFLUixNQUFMLEdBQWNSLFVBQVUsQ0FBQ1EsTUFBRCxDQUF4QjtBQUNBLFNBQUtDLE1BQUwsR0FBY1QsVUFBVSxDQUFDUyxNQUFELENBQXhCO0FBRUFDLElBQUFBLElBQUksSUFBSSxNQUFNRyxLQUFOLENBQVlILElBQVosRUFBa0JDLE1BQWxCLENBQVI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VNLEVBQUFBLFVBQVUsQ0FBQ0MsUUFBRCxFQUFXO0FBQ25CQSxJQUFBQSxRQUFRLENBQUNDLFFBQVQsR0FBb0IsSUFBcEI7QUFDQUQsSUFBQUEsUUFBUSxDQUFDRSxTQUFULENBQW1CWixNQUFuQixHQUE0QixLQUFLQSxNQUFMLENBQVlhLFFBQVosRUFBNUI7QUFFQUgsSUFBQUEsUUFBUSxDQUFDRSxTQUFULENBQW1CWCxNQUFuQixHQUE0QixLQUFLSyxJQUFMLEdBQ3hCSSxRQUFRLENBQUNFLFNBQVQsQ0FBbUJaLE1BREssR0FFeEIsS0FBS0MsTUFBTCxDQUFZWSxRQUFaLEVBRko7QUFHRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFQyxFQUFBQSxNQUFNLENBQUNKLFFBQUQsRUFBV0ssSUFBWCxFQUFpQkMsS0FBakIsRUFBd0I7QUFDNUIsU0FBS0MsUUFBTCxDQUFjUCxRQUFkLEVBQXdCSyxJQUF4QixFQUE4QkMsS0FBOUI7QUFFQU4sSUFBQUEsUUFBUSxDQUFDUSxLQUFULEdBQWlCM0IsU0FBUyxDQUFDNEIsSUFBVixDQUNmVCxRQUFRLENBQUNFLFNBQVQsQ0FBbUJaLE1BREosRUFFZlUsUUFBUSxDQUFDRSxTQUFULENBQW1CWCxNQUZKLEVBR2YsS0FBS21CLE1BSFUsQ0FBakI7O0FBTUEsUUFBSVYsUUFBUSxDQUFDUSxLQUFULEdBQWlCeEIsd0JBQXJCLEVBQStDO0FBQzdDZ0IsTUFBQUEsUUFBUSxDQUFDUSxLQUFULEdBQWlCLENBQWpCO0FBQ0Q7QUFDRjtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDaUIsU0FBUkcsUUFBUSxDQUFDQyxJQUFELEVBQU87QUFDcEIsVUFBTTtBQUFFdEIsTUFBQUEsTUFBRjtBQUFVQyxNQUFBQSxNQUFWO0FBQWtCQyxNQUFBQSxJQUFsQjtBQUF3QkMsTUFBQUEsTUFBeEI7QUFBZ0NDLE1BQUFBLFNBQVMsR0FBRztBQUE1QyxRQUFxRGtCLElBQTNEO0FBRUEsV0FBTyxJQUFJeEIsS0FBSixDQUFVRSxNQUFWLEVBQWtCQyxNQUFsQixFQUEwQkMsSUFBMUIsRUFBZ0NQLGVBQWUsQ0FBQ1EsTUFBRCxDQUEvQyxFQUF5REMsU0FBekQsQ0FBUDtBQUNEOztBQXZIMEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXRoVXRpbHMsIGNyZWF0ZVNwYW4gfSBmcm9tICcuLi9tYXRoJztcblxuaW1wb3J0IEJlaGF2aW91ciBmcm9tICcuL0JlaGF2aW91cic7XG5pbXBvcnQgeyBQQVJUSUNMRV9BTFBIQV9USFJFU0hPTEQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRFYXNpbmdCeU5hbWUgfSBmcm9tICcuLi9lYXNlJztcbmltcG9ydCB7IEJFSEFWSU9VUl9UWVBFX0FMUEhBIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBCZWhhdmlvdXIgdGhhdCBhcHBsaWVzIGFuIGFscGhhIHRyYW5zaXRpb24gZWZmZWN0IHRvIHBhcnRpY2xlcy5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFscGhhIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYW4gQWxwaGEgYmVoYXZpb3VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gYWxwaGFBIC0gVGhlIHN0YXJ0aW5nIGFscGhhIHZhbHVlXG4gICAqIEBwYXJhbSB7P251bWJlcn0gYWxwaGFCIC0gVGhlIGVuZGluZyBhbHBoYSB2YWx1ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBiZWhhdmlvdXJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWFzaW5nIC0gVGhlIGVhc2luZyBlcXVhdGlvbiB0byB1c2UgZm9yIHRyYW5zZm9ybXNcbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNFbmFibGVkPXRydWVdIC0gRGV0ZXJtaW5lcyBpZiB0aGUgYmVoYXZpb3VyIHdpbGwgYmUgYXBwbGllZCBvciBub3RcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhbHBoYUEgPSAxLCBhbHBoYUIgPSBudWxsLCBsaWZlLCBlYXNpbmcsIGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcsIHR5cGUsIGlzRW5hYmxlZCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgc3RhcnRpbmcgYWxwaGEgdmFsdWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfFNwYW59XG4gICAgICovXG4gICAgdGhpcy5hbHBoYUEgPSBhbHBoYUE7XG5cbiAgICAvKipcbiAgICAgKiBAZGV Line truncated
@@ -0,0 +1,135 @@
import { DEFAULT_ATTRACITON_RADIUS, DEFAULT_ATTRACTION_FORCE_SCALAR, DEFAULT_BEHAVIOUR_EASING, DEFAULT_LIFE, PARTICLE_LENGTH_SQ_THRESHOLD } from './constants';
import Behaviour from './Behaviour';
import { Vector3D } from '../math';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_ATTRACTION as type } from './types';
/**
* Behaviour that causes particles to be attracted to a target position.
*
*/
export default class Attraction extends Behaviour {
/**
* Constructs an Attraction behaviour instance.
*
* @param {Vector3D} targetPosition - The position the particles will be attracted to
* @param {number} force - The attraction force scalar multiplier
* @param {number} radius - The attraction radius
* @param {number} [life=DEFAULT_LIFE] - The life of the particle
* @param {function} [easing=DEFAULT_BEHAVIOUR_EASING] - The behaviour's decaying trend
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(targetPosition = new Vector3D(), force = DEFAULT_ATTRACTION_FORCE_SCALAR, radius = DEFAULT_ATTRACITON_RADIUS, life = DEFAULT_LIFE, easing = DEFAULT_BEHAVIOUR_EASING, isEnabled = true) {
super(life, easing, type, isEnabled);
/**
* @desc The position the particles will be attracted to
* @type {Vector3D}
*/
this.targetPosition = targetPosition;
/**
* @desc The attraction radius
* @type {number} - the attraction radius
*/
this.radius = radius;
/**
* @desc The attraction force scalar multiplier
* @type {number}
*/
this.force = this.normalizeValue(force);
/**
* @desc The radius of the attraction squared
* @type {number}
*/
this.radiusSq = this.radius * this.radius;
/**
* @desc The attraction force in 3D space
* @type {Vector3D}
*/
this.attractionForce = new Vector3D();
/**
* @desc The linear attraction force
* @type {number}
*/
this.lengthSq = 0;
}
/**
* Resets the behaviour properties.
*
* @param {Vector3D} targetPosition - the position the particles will be attracted to
* @param {number} force - the attraction force multiplier
* @param {number} radius - the attraction radius
* @param {number} life - the life of the particle
* @param {function} easing - The behaviour's decaying trend
* @return void
*/
reset(targetPosition = new Vector3D(), force = DEFAULT_ATTRACTION_FORCE_SCALAR, radius = DEFAULT_ATTRACITON_RADIUS, life, easing) {
this.targetPosition = targetPosition;
this.radius = radius;
this.force = this.normalizeValue(force);
this.radiusSq = this.radius * this.radius;
this.attractionForce = new Vector3D();
this.lengthSq = 0;
life && super.reset(life, easing);
}
/**
* Mutates particle acceleration.
*
* @param {Particle} particle - the particle to apply the behaviour to
* @param {number} time - particle engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
this.energize(particle, time, index);
this.attractionForce.copy(this.targetPosition);
this.attractionForce.sub(particle.position);
this.lengthSq = this.attractionForce.lengthSq();
if (this.lengthSq > PARTICLE_LENGTH_SQ_THRESHOLD && this.lengthSq < this.radiusSq) {
this.attractionForce.normalize();
this.attractionForce.scalar(1 - this.lengthSq / this.radiusSq);
this.attractionForce.scalar(this.force);
particle.acceleration.add(this.attractionForce);
}
}
/**
* Creates a Body initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @property {number} json.x - The target position x value
* @property {number} json.y - The target position y value
* @property {number} json.z - The target position z value
* @property {number} json.force - The attraction force scalar multiplier
* @property {number} json.life - The life of the particle
* @property {string} json.easing - The behaviour's decaying trend
* @return {Body}
*/
static fromJSON(json) {
const {
x,
y,
z,
force,
radius,
life,
easing,
isEnabled = true
} = json;
return new Attraction(new Vector3D(x, y, z), force, radius, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQXR0cmFjdGlvbi5qcyJdLCJuYW1lcyI6WyJERUZBVUxUX0FUVFJBQ0lUT05fUkFESVVTIiwiREVGQVVMVF9BVFRSQUNUSU9OX0ZPUkNFX1NDQUxBUiIsIkRFRkFVTFRfQkVIQVZJT1VSX0VBU0lORyIsIkRFRkFVTFRfTElGRSIsIlBBUlRJQ0xFX0xFTkdUSF9TUV9USFJFU0hPTEQiLCJCZWhhdmlvdXIiLCJWZWN0b3IzRCIsImdldEVhc2luZ0J5TmFtZSIsIkJFSEFWSU9VUl9UWVBFX0FUVFJBQ1RJT04iLCJ0eXBlIiwiQXR0cmFjdGlvbiIsImNvbnN0cnVjdG9yIiwidGFyZ2V0UG9zaXRpb24iLCJmb3JjZSIsInJhZGl1cyIsImxpZmUiLCJlYXNpbmciLCJpc0VuYWJsZWQiLCJub3JtYWxpemVWYWx1ZSIsInJhZGl1c1NxIiwiYXR0cmFjdGlvbkZvcmNlIiwibGVuZ3RoU3EiLCJyZXNldCIsIm11dGF0ZSIsInBhcnRpY2xlIiwidGltZSIsImluZGV4IiwiZW5lcmdpemUiLCJjb3B5Iiwic3ViIiwicG9zaXRpb24iLCJub3JtYWxpemUiLCJzY2FsYXIiLCJhY2NlbGVyYXRpb24iLCJhZGQiLCJmcm9tSlNPTiIsImpzb24iLCJ4IiwieSIsInoiXSwibWFwcGluZ3MiOiJBQUFBLFNBQ0VBLHlCQURGLEVBRUVDLCtCQUZGLEVBR0VDLHdCQUhGLEVBSUVDLFlBSkYsRUFLRUMsNEJBTEYsUUFNTyxhQU5QO0FBUUEsT0FBT0MsU0FBUCxNQUFzQixhQUF0QjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsU0FBekI7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFNBQWhDO0FBQ0EsU0FBU0MseUJBQXlCLElBQUlDLElBQXRDLFFBQWtELFNBQWxEO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxVQUFOLFNBQXlCTCxTQUF6QixDQUFtQztBQUNoRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QVI7QUFBVzFCLE1BQUFBLEtBQVg7QUFBa0JDLE1BQUFBLE1BQWxCO0FBQTBCQyxNQUFBQSxJQUExQjtBQUFnQ0MsTUFBQUEsTUFBaEM7QUFBd0NDLE1BQUFBLFNBQVMsR0FBRztBQUFwRCxRQUE2RG1CLElBQW5FO0FBRUEsV0FBTyxJQUFJMUIsVUFBSixDQUNMLElBQUlKLFFBQUosQ0FBYStCLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CQyxDQUFuQixDQURLLEVBRUwxQixLQUZLLEVBR0xDLE1BSEssRUFJTEMsSUFKSyxFQUtMUixlQUFlLENBQUNTLE1BQUQsQ0FMVixFQU1MQyxTQU5LLENBQVA7QUFRRDs7QUF6SStDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgREVGQVVMVF9BVFRSQUNJVE9OX1JBRElVUyxcbiAgREVGQVVMVF9BVFRSQUNUSU9OX0ZPUkNFX1NDQUxBUixcbiAgREVGQVVMVF9CRUhBVklPVVJfRUFTSU5HLFxuICBERUZBVUxUX0xJRkUsXG4gIFBBUlRJQ0xFX0xFTkdUSF9TUV9USFJFU0hPTEQsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuaW1wb3J0IEJlaGF2aW91ciBmcm9tICcuL0JlaGF2aW91cic7XG5pbXBvcnQgeyBWZWN0b3IzRCB9IGZyb20gJy4uL21hdGgnO1xuaW1wb3J0IHsgZ2V0RWFzaW5nQnlOYW1lIH0gZnJvbSAnLi4vZWFzZSc7XG5pbXBvcnQgeyBCRUhBVklPVVJfVFlQRV9BVFRSQUNUSU9OIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBCZWhhdmlvdXIgdGhhdCBjYXVzZXMgcGFydGljbGVzIHRvIGJlIGF0dHJhY3RlZCB0byBhIHRhcmdldCBwb3NpdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dHJhY3Rpb24gZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBBdHRyYWN0aW9uIGJlaGF2aW91ciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3IzRH0gdGFyZ2V0UG9zaXRpb24gLSBUaGUgcG9zaXRpb24gdGhlIHBhcnRpY2xlcyB3aWxsIGJlIGF0dHJhY3RlZCB0b1xuICAgKiBAcGFyYW0ge251bWJlcn0gZm9yY2UgLSBUaGU Line truncated
@@ -0,0 +1,215 @@
import { DEFAULT_BEHAVIOUR_EASING, DEFAULT_LIFE } from './constants';
import { BEHAVIOUR_TYPE_ABSTRACT } from './types';
import { MEASURE } from '../constants';
import isNumber from '../utils/isNumber.js';
import { uid } from '../utils';
/**
* The base behaviour class.
* Behaviours manage a particle's behaviour after they have been emitted.
*
*/
export default class Behaviour {
/**
* Constructs a Behaviour instance.
*
* @param {number} [life=Infinity] - The life of the behaviour
* @param {function} [easing=DEFAULT_BEHAVIOUR_EASING] - The behaviour's decaying trend
* @param {string} [type=BEHAVIOUR_TYPE_ABSTRACT] - The behaviour type
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(life = Infinity, easing = DEFAULT_BEHAVIOUR_EASING, type = BEHAVIOUR_TYPE_ABSTRACT, isEnabled = true) {
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
/**
* @desc Determines if the behaviour will be applied or not
* @type {boolean}
*/
this.isEnabled = isEnabled;
/**
* @desc The behaviour's id
* @type {string} id
*/
this.id = `behaviour-${uid()}`;
/**
* @desc The life of the behaviour
* @type {number}
*/
this.life = life;
/**
* @desc The behaviour's decaying trend
* @type {function}
*/
this.easing = easing;
/**
* @desc The age of the behaviour
* @type {number}
*/
this.age = 0;
/**
* @desc The energy of the behaviour
* @type {number}
*/
this.energy = 1;
/**
* Determines if the behaviour is dead or not
* @type {boolean}
*/
this.dead = false;
}
/**
* Reset this behaviour's parameters
*
* @param {number} [life=DEFAULT_LIFE] - The life of the behaviour
* @param {function} [easing=DEFAULT_BEHAVIOUR_EASING] - The behaviour's decaying trend
*/
reset(life = DEFAULT_LIFE, easing = DEFAULT_BEHAVIOUR_EASING) {
this.life = life;
this.easing = easing || DEFAULT_BEHAVIOUR_EASING;
}
/**
* Ensures that life is infinity if an invalid value is supplied.
*
* @return void
*/
set life(life) {
this._life = isNumber(life) ? life : DEFAULT_LIFE;
}
/**
* Gets the behaviour's life.
*
* @return {Number}
*/
get life() {
return this._life;
}
/**
* Normalize a force by 1:100;
*
* @param {Vector3D} force - The force to normalize.
* @return {Vector3D}
*/
normalizeForce(force) {
return force.scalar(MEASURE);
}
/**
* Normalize a value by 1:100;
*
* @param {number} value - The value to normalize
* @return {number}
*/
normalizeValue(value) {
return value * MEASURE;
}
/**
* Set the behaviour's initial properties on the particle.
*
* @param {Particle} particle
* @abstract
*/
initialize(particle) {} // eslint-disable-line
/**
* Apply behaviour to the target as a factor of time.
* Internally calls the mutate method to change properties on the target
* Will not do so if the behaviour is disabled
*
* @abstract
* @param {Particle|Emitter} target - The particle or emitter to apply the behaviour to
* @param {Number} time - the system integration time
* @param {integer} index - the target index
* @return mixed
*/
applyBehaviour(target, time, index) {
if (!this.isEnabled) {
return;
}
this.mutate(target, time, index);
}
/**
* Change the target's properties according to specific behaviour logic.
*
* @abstract
* @param {Particle|Emitter} target - The particle or emitter to apply the behaviour to
* @param {Number} time - the system integration time
* @return mixed
*/
mutate(target, time, index) {} // eslint-disable-line
/**
* Compares the age of the behaviour vs integration time and determines
* if the behaviour should be set to dead or not.
* Sets the behaviour energy as a factor of particle age and life.
*
* @param {Particle} particle - The particle to apply the behaviour to
* @param {Number} time - the system integration time
* @return void
*/
energize(particle, time) {
if (this.dead) {
return;
}
this.age += time;
if (this.age >= this.life) {
this.energy = 0;
this.dead = true;
return;
}
const scale = this.easing(particle.age / particle.life);
this.energy = Math.max(1 - scale, 0);
}
/**
* Destory this behaviour.
*
* @abstract
*/
destroy() {}
/**
* Returns a new instance of the behaviour from the JSON object passed.
*
* @abstract
* @param {object} json - JSON object containing the required constructor properties
* @return {Behaviour}
*/
fromJSON(json) {} // eslint-disable-line
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQmVoYXZpb3VyLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQkVIQVZJT1VSX0VBU0lORyIsIkRFRkFVTFRfTElGRSIsIkJFSEFWSU9VUl9UWVBFX0FCU1RSQUNUIiwiTUVBU1VSRSIsImlzTnVtYmVyIiwidWlkIiwiQmVoYXZpb3VyIiwiY29uc3RydWN0b3IiLCJsaWZlIiwiSW5maW5pdHkiLCJlYXNpbmciLCJ0eXBlIiwiaXNFbmFibGVkIiwiaWQiLCJhZ2UiLCJlbmVyZ3kiLCJkZWFkIiwicmVzZXQiLCJfbGlmZSIsIm5vcm1hbGl6ZUZvcmNlIiwiZm9yY2UiLCJzY2FsYXIiLCJub3JtYWxpemVWYWx1ZSIsInZhbHVlIiwiaW5pdGlhbGl6ZSIsInBhcnRpY2xlIiwiYXBwbHlCZWhhdmlvdXIiLCJ0YXJnZXQiLCJ0aW1lIiwiaW5kZXgiLCJtdXRhdGUiLCJlbmVyZ2l6ZSIsInNjYWxlIiwiTWF0aCIsIm1heCIsImRlc3Ryb3kiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLHdCQUFULEVBQW1DQyxZQUFuQyxRQUF1RCxhQUF2RDtBQUVBLFNBQVNDLHVCQUFULFFBQXdDLFNBQXhDO0FBQ0EsU0FBU0MsT0FBVCxRQUF3QixjQUF4QjtBQUNBLE9BQU9DLFFBQVAsTUFBcUIsaUJBQXJCO0FBQ0EsU0FBU0MsR0FBVCxRQUFvQixVQUFwQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxTQUFOLENBQWdCO0FBQzdCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFQyxFQUFBQSxXQUFXLENBQ1RDLElBQUksR0FBR0MsUUFERSxFQUVUQyxNQUFNLEdBQUdWLHdCQUZBLEVBR1RXLElBQUksR0FBR1QsdUJBSEUsRUFJVFUsU0FBUyxHQUFHLElBSkgsRUFLVDtBQUNBO0FBQ0o7QUFDQTtBQUNBO0FBQ0ksU0FBS0QsSUFBTCxHQUFZQSxJQUFa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RDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRyxFQUFBQSxPQUFPLEdBQUcsQ0FBRTtBQUVaO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUMsRUFBQUEsUUFBUSxDQUFDQyxJQUFELEVBQU8sQ0FBRSxDQWpNWSxDQWlNWDs7O0FBak1XIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVGQVVMVF9CRUhBVklPVVJfRUFTSU5HLCBERUZBVUxUX0xJRkUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmltcG9ydCB7IEJFSEFWSU9VUl9UWVBFX0FCU1RSQUNUIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBNRUFTVVJFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBpc051bWJlciBmcm9tICdsb2Rhc2gvaXNOdW1iZXInO1xuaW1wb3J0IHsgdWlkIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGJlaGF2aW91ciBjbGFzcy5cbiAqIEJlaGF2aW91cnMgbWFuYWdlIGEgcGFydGljbGUncyBiZWhhdmlvdXIgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZW1pdHRlZC5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgQmVoYXZpb3VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmU9SW5maW5pdHldIC0gVGhlIGxpZmUgb2YgdGhlIGJlaGF2aW91clxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZWFzaW5nPURFRkFVTFRfQkVIQVZJT1VSX0VBU0lOR10gLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPUJFSEFWSU9VUl9UWVBFX0FCU1RSQUNUXSAtIFRoZSBiZWhhdmlvdXIgdHlwZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0VuYWJsZWQ9dHJ1ZV0gLSBEZXRlcm1pbmVzIGlmIHRoZSBiZWhhdmlvdXIgd2lsbCBiZSBhcHBsaWVkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGxpZmUgPSBJbmZpbml Line truncated
@@ -0,0 +1,100 @@
import Behaviour from './Behaviour';
import { Vector3D } from '../math';
import { BEHAVIOUR_TYPE_COLLISION as type } from './types';
/**
* Behaviour that causes particles to move away from other particles they collide with.
*/
export default class Collision extends Behaviour {
/**
* Constructs a Collision behaviour instance.
*
* @param {Emitter} emitter - The emitter containing the particles to detect collisions against
* @param {boolean} useMass - Determiens whether to use mass or not
* @param {function} onCollide - Function to call when particles collide
* @param {number} life - The life of the particle
* @param {function} easing - The behaviour's decaying trend
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(emitter, useMass, onCollide, life, easing, isEnabled = true) {
super(life, easing, type, isEnabled);
this.reset(emitter, useMass, onCollide);
}
/**
* Resets the behaviour properties.
*
* @param {Emitter} emitter - The emitter containing the particles to detect collisions against
* @param {boolean} useMass - Determiens whether to use mass or not
* @param {function} onCollide - Function to call when particles collide
* @param {number} life - The life of the particle
* @param {function} easing - The behaviour's decaying trend
* @return void
*/
reset(emitter, useMass, onCollide, life, easing) {
this.emitter = emitter;
this.useMass = useMass;
this.onCollide = onCollide;
this.particles = [];
this.delta = new Vector3D();
life && super.reset(life, easing);
}
/**
* Detects collisions with other particles and calls the
* onCollide function on colliding particles.
*
* @param {Particle} particle - the particle to apply the behaviour to
* @param {number} time - particle engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
const particles = this.emitter ? this.emitter.particles.slice(index) : this.particles.slice(index);
let otherParticle, lengthSq, overlap, distance, averageMass1, averageMass2;
let i = particles.length;
while (i--) {
otherParticle = particles[i];
if (otherParticle == particle) {
continue;
}
this.delta.copy(otherParticle.position).sub(particle.position);
lengthSq = this.delta.lengthSq();
distance = particle.radius + otherParticle.radius;
if (lengthSq <= distance * distance) {
overlap = distance - Math.sqrt(lengthSq);
overlap += 0.5;
averageMass1 = this._getAverageMass(particle, otherParticle);
averageMass2 = this._getAverageMass(otherParticle, particle);
particle.position.add(this.delta.clone().normalize().scalar(overlap * -averageMass1));
otherParticle.position.add(this.delta.normalize().scalar(overlap * averageMass2));
this.onCollide && this.onCollide(particle, otherParticle);
}
}
}
/**
* Gets the average mass of both particles.
*
* @param {Particle} particleA - The first particle
* @param {Particle} particleB - The second particle
* @return {number}
*/
_getAverageMass(particleA, particleB) {
return this.useMass ? particleB.mass / (particleA.mass + particleB.mass) : 0.5;
} // TODO
fromJSON(json) {} // eslint-disable-line
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQ29sbGlzaW9uLmpzIl0sIm5hbWVzIjpbIkJlaGF2aW91ciIsIlZlY3RvcjNEIiwiQkVIQVZJT1VSX1RZUEVfQ09MTElTSU9OIiwidHlwZSIsIkNvbGxpc2lvbiIsImNvbnN0cnVjdG9yIiwiZW1pdHRlciIsInVzZU1hc3MiLCJvbkNvbGxpZGUiLCJsaWZlIiwiZWFzaW5nIiwiaXNFbmFibGVkIiwicmVzZXQiLCJwYXJ0aWNsZXMiLCJkZWx0YSIsIm11dGF0ZSIsInBhcnRpY2xlIiwidGltZSIsImluZGV4Iiwic2xpY2UiLCJvdGhlclBhcnRpY2xlIiwibGVuZ3RoU3EiLCJvdmVybGFwIiwiZGlzdGFuY2UiLCJhdmVyYWdlTWFzczEiLCJhdmVyYWdlTWFzczIiLCJpIiwibGVuZ3RoIiwiY29weSIsInBvc2l0aW9uIiwic3ViIiwicmFkaXVzIiwiTWF0aCIsInNxcnQiLCJfZ2V0QXZlcmFnZU1hc3MiLCJhZGQiLCJjbG9uZSIsIm5vcm1hbGl6ZSIsInNjYWxhciIsInBhcnRpY2xlQSIsInBhcnRpY2xlQiIsIm1hc3MiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFNBQVAsTUFBc0IsYUFBdEI7QUFDQSxTQUFTQyxRQUFULFFBQXlCLFNBQXpCO0FBQ0EsU0FBU0Msd0JBQXdCLElBQUlDLElBQXJDLFFBQWlELFNBQWpEO0FBRUE7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsU0FBTixTQUF3QkosU0FBeEIsQ0FBa0M7QUFDL0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSyxFQUFBQSxXQUFXLENBQUNDLE9BQUQsRUFBVUMsT0FBVixFQUFtQkMsU0FBbkIsRUFBOEJDLElBQTlCLEVBQW9DQyxNQUFwQyxFQUE0Q0MsU0FBUyxHQUFHLElBQXhELEVBQThEO0FBQ3ZFLFVBQU1GLElBQU4sRUFBWUMsTUFBWixFQUFvQlAsSUFBcEIsRUFB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U0FBUyxDQUFDQyxJQUFWLElBQWtCRixTQUFTLENBQUNFLElBQVYsR0FBaUJELFNBQVMsQ0FBQ0MsSUFBN0MsQ0FERyxHQUVILEdBRko7QUFHRCxHQXRHOEMsQ0F3Ry9DOzs7QUFDQUMsRUFBQUEsUUFBUSxDQUFDQyxJQUFELEVBQU8sQ0FBRSxDQXpHOEIsQ0F5RzdCOzs7QUF6RzZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJlaGF2aW91ciBmcm9tICcuL0JlaGF2aW91cic7XG5pbXBvcnQgeyBWZWN0b3IzRCB9IGZyb20gJy4uL21hdGgnO1xuaW1wb3J0IHsgQkVIQVZJT1VSX1RZUEVfQ09MTElTSU9OIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBCZWhhdmlvdXIgdGhhdCBjYXVzZXMgcGFydGljbGVzIHRvIG1vdmUgYXdheSBmcm9tIG90aGVyIHBhcnRpY2xlcyB0aGV5IGNvbGxpZGUgd2l0aC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGlzaW9uIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBDb2xsaXNpb24gYmVoYXZpb3VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0VtaXR0ZXJ9IGVtaXR0ZXIgLSBUaGUgZW1pdHRlciBjb250YWluaW5nIHRoZSBwYXJ0aWNsZXMgdG8gZGV0ZWN0IGNvbGxpc2lvbnMgYWdhaW5zdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZU1hc3MgLSBEZXRlcm1pZW5zIHdoZXRoZXIgdG8gdXNlIG1hc3Mgb3Igbm90XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uQ29sbGlkZSAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwYXJ0aWNsZXMgY29sbGlkZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlYXNpbmcgLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmRcbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNFbmFibGVkPXRydWVdIC0gRGV0ZXJtaW5lcyBpZiB0aGUgYmVoYXZpb3VyIHdpbGwgYmUgYXBwbGllZCBvciBub3RcbiAgICogQHJldHVybiB Line truncated
@@ -0,0 +1,101 @@
import { MathUtils, createColorSpan } from '../math';
import Behaviour from './Behaviour';
import { ColorUtil } from '../utils';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_COLOR as type } from './types';
/**
* A behaviour which mutates the color of a particle over time.
*
*/
export default class Color extends Behaviour {
/**
* Constructs a Color behaviour instance.
*
* @param {number|string} colorA - the starting color
* @param {number|string} colorB - the ending color
* @param {number} life - the life of the particle
* @param {function} easing - The behaviour's decaying trend
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(colorA, colorB, life=Infinity, easing, isEnabled = true) {
super(life, easing, type, isEnabled);
this.reset(colorA, colorB);
}
/**
* Gets the _same property which determines if the alpha are the same.
*
* @return {boolean}
*/
get same() {
return this._same;
}
/**
* Sets the _same property which determines if the alpha are the same.
*
* @param {boolean} same
* @return {boolean}
*/
set same(same) {
/**
* @type {boolean}
*/
this._same = same;
}
reset(colorA, colorB, life, easing) {
this.same = colorB === null || colorB === undefined ? true : false;
this.colorA = createColorSpan(colorA);
this.colorB = createColorSpan(colorB);
life && super.reset(life, easing);
}
initialize(particle) {
particle.transform.colorA = ColorUtil.getRGB(this.colorA.getValue());
particle.useColor = true;
particle.transform.colorB = this.same ? particle.transform.colorA : ColorUtil.getRGB(this.colorB.getValue());
}
mutate(particle, time, index) {
this.energize(particle, time, index);
if (!this._same) {
particle.color.r = MathUtils.lerp(particle.transform.colorA.r, particle.transform.colorB.r, this.energy);
particle.color.g = MathUtils.lerp(particle.transform.colorA.g, particle.transform.colorB.g, this.energy);
particle.color.b = MathUtils.lerp(particle.transform.colorA.b, particle.transform.colorB.b, this.energy);
} else {
particle.color.r = particle.transform.colorA.r;
particle.color.g = particle.transform.colorA.g;
particle.color.b = particle.transform.colorA.b;
}
}
/**
* Creates a Color initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @property {number} json.colorA - The starting color
* @property {number} json.colorB - The ending color
* @property {number} json.life - The life of the particle
* @property {string} json.easing - The behaviour's decaying trend
* @return {Color}
*/
static fromJSON(json) {
const {
colorA,
colorB,
life,
easing,
isEnabled = true
} = json;
return new Color(colorA, colorB, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQ29sb3IuanMiXSwibmFtZXMiOlsiTWF0aFV0aWxzIiwiY3JlYXRlQ29sb3JTcGFuIiwiQmVoYXZpb3VyIiwiQ29sb3JVdGlsIiwiZ2V0RWFzaW5nQnlOYW1lIiwiQkVIQVZJT1VSX1RZUEVfQ09MT1IiLCJ0eXBlIiwiQ29sb3IiLCJjb25zdHJ1Y3RvciIsImNvbG9yQSIsImNvbG9yQiIsImxpZmUiLCJlYXNpbmciLCJpc0VuYWJsZWQiLCJyZXNldCIsInNhbWUiLCJfc2FtZSIsInVuZGVmaW5lZCIsImluaXRpYWxpemUiLCJwYXJ0aWNsZSIsInRyYW5zZm9ybSIsImdldFJHQiIsImdldFZhbHVlIiwidXNlQ29sb3IiLCJtdXRhdGUiLCJ0aW1lIiwiaW5kZXgiLCJlbmVyZ2l6ZSIsImNvbG9yIiwiciIsImxlcnAiLCJlbmVyZ3kiLCJnIiwiYiIsImZyb21KU09OIiwianNvbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBVCxFQUFvQkMsZUFBcEIsUUFBMkMsU0FBM0M7QUFFQSxPQUFPQyxTQUFQLE1BQXNCLGFBQXRCO0FBQ0EsU0FBU0MsU0FBVCxRQUEwQixVQUExQjtBQUNBLFNBQVNDLGVBQVQsUUFBZ0MsU0FBaEM7QUFDQSxTQUFTQyxvQkFBb0IsSUFBSUMsSUFBakMsUUFBNkMsU0FBN0M7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxlQUFlLE1BQU1DLEtBQU4sU0FBb0JMLFNBQXBCLENBQThCO0FBQzNDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VNLEVBQUFBLFdBQVcsQ0FBQ0MsTUFBRCxFQUFTQyxNQUFULEVBQWlCQyxJQUFqQixFQUF1QkMsTUFBdkIsRUFBK0JDLFNBQVMsR0FBRyxJQUEzQyxFQUFpRDtBQUMxRCxVQUFNRixJQUFOLEVBQVlDLE1BQVosRUFBb0JOLElBQXBCLEVBQTBCTyxTQUExQjtBQUVBLFNBQUtDLEtBQUwsQ0FBV0wsTUFBWCxFQUFt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Q0FBQ0MsU0FBVCxDQUFtQlgsTUFBbkIsQ0FBMEJ3QixDQUE3QztBQUNEO0FBQ0Y7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJDLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFVBQU07QUFBRTFCLE1BQUFBLE1BQUY7QUFBVUMsTUFBQUEsTUFBVjtBQUFrQkMsTUFBQUEsSUFBbEI7QUFBd0JDLE1BQUFBLE1BQXhCO0FBQWdDQyxNQUFBQSxTQUFTLEdBQUc7QUFBNUMsUUFBcURzQixJQUEzRDtBQUVBLFdBQU8sSUFBSTVCLEtBQUosQ0FBVUUsTUFBVixFQUFrQkMsTUFBbEIsRUFBMEJDLElBQTFCLEVBQWdDUCxlQUFlLENBQUNRLE1BQUQsQ0FBL0MsRUFBeURDLFNBQXpELENBQVA7QUFDRDs7QUFoRzBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWF0aFV0aWxzLCBjcmVhdGVDb2xvclNwYW4gfSBmcm9tICcuLi9tYXRoJztcblxuaW1wb3J0IEJlaGF2aW91ciBmcm9tICcuL0JlaGF2aW91cic7XG5pbXBvcnQgeyBDb2xvclV0aWwgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBnZXRFYXNpbmdCeU5hbWUgfSBmcm9tICcuLi9lYXNlJztcbmltcG9ydCB7IEJFSEFWSU9VUl9UWVBFX0NPTE9SIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBBIGJlaGF2aW91ciB3aGljaCBtdXRhdGVzIHRoZSBjb2xvciBvZiBhIHBhcnRpY2xlIG92ZXIgdGltZS5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9yIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBDb2xvciBiZWhhdmlvdXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gY29sb3JBIC0gdGhlIHN0YXJ0aW5nIGNvbG9yXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gY29sb3JCIC0gdGhlIGVuZGluZyBjb2xvclxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIHRoZSBsaWZlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge2Z Line truncated
@@ -0,0 +1,82 @@
import * as Zone from '../zone';
import Behaviour from './Behaviour';
import { DEFAULT_CROSS_TYPE } from './constants';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_CROSS_ZONE as type } from './types';
/**
* Behaviour that allows for specific functions to be called on particles when
* they interact with a zone.
*
*/
export default class CrossZone extends Behaviour {
/**
* Constructs a CrossZone behaviour instance.
*
* @param {Zone} zone - the zone used to apply to particles with this behaviour
* @param {string} [crossType=DEFAULT_CROSS_TYPE] - enum of cross types, valid strings include 'dead', 'bound', 'cross'
* @param {number} life - The life of the particle
* @param {function} easing - The behaviour's decaying trend
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
*/
constructor(zone, crossType, life, easing, isEnabled) {
super(life, easing, type, isEnabled);
this.reset(zone, crossType);
}
/**
* Resets the behaviour properties.
*
* @param {Zone} zone - the zone used to apply to particles with this behaviour
* @param {string} [crossType=DEFAULT_CROSS_TYPE] - enum of cross types, valid strings include 'dead', 'bound', 'cross'
* @param {number} life - The life of the particle
* @param {function} easing - The behaviour's decaying trend
*/
reset(zone, crossType = DEFAULT_CROSS_TYPE, life, easing) {
/**
* @desc The zone used to apply to particles with this behaviour
* @type {Zone}
*/
this.zone = zone;
this.zone.crossType = crossType;
life && super.reset(life, easing);
}
/**
* Applies the behaviour to the particle.
*
* @see {@link '../zone/Zone.js'} crossing
* @param {object} particle - the particle to apply the behaviour to
* @param {number} time - engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
this.energize(particle, time, index);
this.zone.crossing.call(this.zone, particle);
}
/**
* Creates a CrossZone initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @return {CrossZone}
*/
static fromJSON(json) {
const {
zoneType,
zoneParams,
crossType,
life,
easing,
isEnabled = true
} = json;
const zone = new Zone[zoneType](...Object.values(zoneParams));
return new CrossZone(zone, crossType, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQ3Jvc3Nab25lLmpzIl0sIm5hbWVzIjpbIlpvbmUiLCJCZWhhdmlvdXIiLCJERUZBVUxUX0NST1NTX1RZUEUiLCJnZXRFYXNpbmdCeU5hbWUiLCJCRUhBVklPVVJfVFlQRV9DUk9TU19aT05FIiwidHlwZSIsIkNyb3NzWm9uZSIsImNvbnN0cnVjdG9yIiwiem9uZSIsImNyb3NzVHlwZSIsImxpZmUiLCJlYXNpbmciLCJpc0VuYWJsZWQiLCJyZXNldCIsIm11dGF0ZSIsInBhcnRpY2xlIiwidGltZSIsImluZGV4IiwiZW5lcmdpemUiLCJjcm9zc2luZyIsImNhbGwiLCJmcm9tSlNPTiIsImpzb24iLCJ6b25lVHlwZSIsInpvbmVQYXJhbXMiLCJPYmplY3QiLCJ2YWx1ZXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBS0EsSUFBWixNQUFzQixTQUF0QjtBQUVBLE9BQU9DLFNBQVAsTUFBc0IsYUFBdEI7QUFDQSxTQUFTQyxrQkFBVCxRQUFtQyxhQUFuQztBQUNBLFNBQVNDLGVBQVQsUUFBZ0MsU0FBaEM7QUFDQSxTQUFTQyx5QkFBeUIsSUFBSUMsSUFBdEMsUUFBa0QsU0FBbEQ7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsU0FBTixTQUF3QkwsU0FBeEIsQ0FBa0M7QUFDL0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VNLEVBQUFBLFdBQVcsQ0FBQ0MsSUFBRCxFQUFPQyxTQUFQLEVBQWtCQyxJQUFsQixFQUF3QkMsTUFBeEIsRUFBZ0NDLFNBQWhDLEVBQTJDO0FBQ3BELFVBQU1GLElBQU4sRUFBWUMsTUFBWixFQUFvQk4sSUFBcEIsRUFBMEJPLFNBQTFCO0FBRUEsU0FBS0MsS0FBTCxDQUFXTCxJQUFYLEVBQWlCQyxTQUFqQjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VJLEVBQUFBLEtBQUssQ0FBQ0wsSUFBRCxFQUFPQyxTQUFTLEdBQUdQLGtCQUFuQixFQUF1Q1EsSUFBdkMsRUFBNkNDLE1BQTdDLEVBQXFEO0FBQ3hEO0FBQ0o7QUFDQTtBQUNBO0FBQ0ksU0FBS0gsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0EsSUFBTCxDQUFVQyxTQUFWLEdBQXNCQSxTQUF0QjtBQUVBQyxJQUFBQSxJQUFJLElBQUksTUFBTUcsS0FBTixDQUFZSCxJQUFaLEVBQWtCQyxNQUFsQixDQUFSO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRyxFQUFBQSxNQUFNLENBQUNDLFFBQUQsRUFBV0MsSUFBWCxFQUFpQkMsS0FBakIsRUFBd0I7QUFDNUIsU0FBS0MsUUFBTCxDQUFjSCxRQUFkLEVBQXdCQyxJQUF4QixFQUE4QkMsS0FBOUI7QUFFQSxTQUFLVCxJQUFMLENBQVVXLFFBQVYsQ0FBbUJDLElBQW5CLENBQXdCLEtBQUtaLElBQTdCLEVBQW1DTyxRQUFuQztBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDaUIsU0FBUk0sUUFBUSxDQUFDQyxJQUFELEVBQU87QUFDcEIsVUFBTTtBQUNKQyxNQUFBQSxRQURJO0FBRUpDLE1BQUFBLFVBRkk7QUFHSmYsTUFBQUEsU0FISTtBQUlKQyxNQUFBQSxJQUpJO0FBS0pDLE1BQUFBLE1BTEk7QUFNSkMsTUFBQUEsU0FBUyxHQUFHO0FBTlIsUUFPRlUsSUFQSjtBQVNBLFVBQU1kLElBQUksR0FBRyxJQUFJUixJQUFJLENBQUN1QixRQUFELENBQVIsQ0FBbUIsR0FBR0UsTUFBTSxDQUFDQyxNQUFQLENBQWNGLFVBQWQsQ0FBdEIsQ0FBYjtBQUVBLFdBQU8sSUFBSWxCLFNBQUosQ0FDTEUsSUFESyxFQUVMQyxTQUZLLEVBR0xDLElBSEssRUFJTFAsZUFBZSxDQUFDUSxNQUFELENBSlYsRUFLTEMsU0FMSyxDQUFQO0FBT0Q7O0FBM0U4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFpvbmUgZnJvbSAnLi4vem9uZSc7XG5cbmltcG9ydCBCZWhhdmlvdXIgZnJvbSAnLi9CZWhhdmlvdXInO1xuaW1wb3J0IHsgREVGQVVMVF9DUk9TU19UWVBFIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0RWFzaW5nQnlOYW1lIH0gZnJvbSAnLi4vZWFzZSc7XG5pbXBvcnQgeyBCRUhBVklPVVJfVFlQRV9DUk9TU19aT05FIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBCZWhhdmlvdXIgdGhhdCBhbGxvd3MgZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgb24gcGFydGljbGVzIHdoZW5cbiAqIHRoZXkgaW50ZXJhY3Qgd2l0aCBhIHpvbmUuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcm9zc1pvbmUgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIENyb3NzWm9uZSBiZWhhdmlvdXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Wm9uZX0gem9uZSAtIHRoZSB6b25lIHVzZWQgdG8gYXBwbHkgdG8gcGFydGljbGVzIHdpdGggdGhpcyBiZWhhdmlvdXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjcm9zc1R5cGU9REVGQVVMVF9DUk9TU19UWVBFXSAtIGVudW0gb2YgY3Jvc3MgdHlwZXMsIHZhbGlkIHN0cmluZ3MgaW5jbHVkZSAnZGVhZCcsICdib3VuZCcsICdjcm9zcydcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpZmUgLSBUaGUgbGlmZSBvZiB0aGUgcGFydGljbGVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWFzaW5nIC0gVGhlIGJlaGF2aW91cidzIGRlY2F5aW5nIHRyZW5kXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRW5hYmxlZD10cnVlXSAtIERldGVybWluZXMgaWYgdGhlIGJlaGF2aW91ciB3aWxsIGJlIGFwcGxpZWQgb3Igbm90XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih6b25lLCBjcm9zc1R5cGUsIGxpZmUsIGVhc2luZywgaXNFbmFibGVkKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nLCB0eXBlLCBpc0VuYWJsZWQpO1xuXG4gICAgdGhpcy5yZXNldCh6b25lLCBjcm9zc1R5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYmVoYXZpb3VyIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Wm9uZX0gem9uZSAtIHRoZSB6b25lIHVzZWQgdG8gYXBwbHkgdG8gcGFydGljbGVzIHdpdGggdGhpcyBiZWhhdmlvdXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjcm9zc1R5cGU9REVGQVVMVF9DUk9TU19UWVBFXSAtIGVudW0gb2YgY3Jvc3MgdHlwZXMsIHZhbGlkIHN0cmluZ3MgaW5jbHVkZSAnZGVhZCcsICdib3VuZCcsICdjcm9zcydcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpZmUgLSBUaGUgbGlmZSBvZiB0aGUgcGFydGljbGVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWFzaW5nIC0gVGhlIGJlaGF2aW91cidzIGRlY2F5aW5nIHRyZW5kXG4gICAqL1xuICByZXNldCh6b25lLCBjcm9zc1R5cGUgPSBERUZBVUxUX0NST1NTX1RZUEUsIGxpZmUsIGVhc2luZykge1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSB6b25lIHVzZWQgdG8gYXBwbHkgdG8gcGFydGljbGVzIHdpdGggdGhpcyBiZWhhdmlvdXJcbiAgICAgKiBAdHlwZSB7Wm9uZX1cbiAgICAgKi9cbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIHRoaXMuem9uZS5jcm9zc1R5cGUgPSBjcm9zc1R5cGU7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgYmVoYXZpb3VyIHRvIHRoZSBwYXJ0aWNsZS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgJy4uL3pvbmUvWm9uZS5qcyd9IGNyb3NzaW5nXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWNsZSAtIHRoZSBwYXJ0aWNsZSB0byBhcHBseSB0aGUgYmVoYXZpb3VyIHRvXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gZW5naW5lIHR Line truncated
@@ -0,0 +1,83 @@
import Behaviour from './Behaviour';
import { Vector3D } from '../math';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_FORCE as type } from './types';
/**
* Behaviour that forces particles along a specific axis.
*
*/
export default class Force extends Behaviour {
/**
* Constructs a Force behaviour instance.
*
* @param {number} fx - the x axis force
* @param {number} fy - the y axis force
* @param {number} fz - the z axis force
* @param {number} life - the life of the particle
* @param {function} easing - The behaviour's decaying trend
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(fx, fy, fz, life = Infinity, easing, isEnabled = true) {
super(life, easing, type, isEnabled);
this.reset(fx, fy, fz);
}
/**
* Resets the behaviour properties.
*
* @param {number} fx - the x axis force
* @param {number} fy - the y axis force
* @param {number} fz - the z axis force
*/
reset(fx, fy, fz) {
/**
* @desc The normalized force to exert on the particle in
* @type {Vector3D}
*/
this.force = this.normalizeForce(new Vector3D(fx, fy, fz));
/**
* @desc The id of the force vector
* @property {number} this.force.id
*/
this.force.id = Math.random();
}
/**
* Mutates the particle.acceleration property.
*
* @param {object} particle - the particle to apply the behaviour to
* @param {number} time - engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
this.energize(particle, time, index);
particle.acceleration.add(this.force);
}
/**
* Creates a Force initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @return {Force}
*/
static fromJSON(json) {
const {
fx,
fy,
fz,
life,
easing,
isEnabled = true
} = json;
return new Force(fx, fy, fz, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvRm9yY2UuanMiXSwibmFtZXMiOlsiQmVoYXZpb3VyIiwiVmVjdG9yM0QiLCJnZXRFYXNpbmdCeU5hbWUiLCJCRUhBVklPVVJfVFlQRV9GT1JDRSIsInR5cGUiLCJGb3JjZSIsImNvbnN0cnVjdG9yIiwiZngiLCJmeSIsImZ6IiwibGlmZSIsImVhc2luZyIsImlzRW5hYmxlZCIsInJlc2V0IiwiZm9yY2UiLCJub3JtYWxpemVGb3JjZSIsImlkIiwiTWF0aCIsInJhbmRvbSIsIm11dGF0ZSIsInBhcnRpY2xlIiwidGltZSIsImluZGV4IiwiZW5lcmdpemUiLCJhY2NlbGVyYXRpb24iLCJhZGQiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFNBQVAsTUFBc0IsYUFBdEI7QUFDQSxTQUFTQyxRQUFULFFBQXlCLFNBQXpCO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQyxTQUFoQztBQUNBLFNBQVNDLG9CQUFvQixJQUFJQyxJQUFqQyxRQUE2QyxTQUE3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsS0FBTixTQUFvQkwsU0FBcEIsQ0FBOEI7QUFDM0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFTSxFQUFBQSxXQUFXLENBQUNDLEVBQUQsRUFBS0MsRUFBTCxFQUFTQyxFQUFULEVBQWFDLElBQWIsRUFBbUJDLE1BQW5CLEVBQTJCQyxTQUFTLEdBQUcsSUFBdkMsRUFBNkM7QUFDdEQsVUFBTUYsSUFBTixFQUFZQyxNQUFaLEVBQW9CUCxJQUFwQixFQUEwQlEsU0FBMUI7QUFFQSxTQUFLQyxLQUFMLENBQVdOLEVBQVgsRUFBZUMsRUFBZixFQUFtQkMsRUFBbkI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUksRUFBQUEsS0FBSyxDQUFDTixFQUFELEVBQUtDLEVBQUwsRUFBU0MsRUFBVCxFQUFhO0FBQ2hCO0FBQ0o7QUFDQTtBQUNBO0FBQ0ksU0FBS0ssS0FBTCxHQUFhLEtBQUtDLGNBQUwsQ0FBb0IsSUFBSWQsUUFBSixDQUFhTSxFQUFiLEVBQWlCQyxFQUFqQixFQUFxQkMsRUFBckIsQ0FBcEIsQ0FBYjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtLLEtBQUwsQ0FBV0UsRUFBWCxHQUFnQkMsSUFBSSxDQUFDQyxNQUFMLEVBQWhCO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUMsRUFBQUEsTUFBTSxDQUFDQyxRQUFELEVBQVdDLElBQVgsRUFBaUJDLEtBQWpCLEVBQXdCO0FBQzVCLFNBQUtDLFFBQUwsQ0FBY0gsUUFBZCxFQUF3QkMsSUFBeEIsRUFBOEJDLEtBQTlCO0FBRUFGLElBQUFBLFFBQVEsQ0FBQ0ksWUFBVCxDQUFzQkMsR0FBdEIsQ0FBMEIsS0FBS1gsS0FBL0I7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJZLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFVBQU07QUFBRXBCLE1BQUFBLEVBQUY7QUFBTUMsTUFBQUEsRUFBTjtBQUFVQyxNQUFBQSxFQUFWO0FBQWNDLE1BQUFBLElBQWQ7QUFBb0JDLE1BQUFBLE1BQXBCO0FBQTRCQyxNQUFBQSxTQUFTLEdBQUc7QUFBeEMsUUFBaURlLElBQXZEO0FBRUEsV0FBTyxJQUFJdEIsS0FBSixDQUFVRSxFQUFWLEVBQWNDLEVBQWQsRUFBa0JDLEVBQWxCLEVBQXNCQyxJQUF0QixFQUE0QlIsZUFBZSxDQUFDUyxNQUFELENBQTNDLEVBQXFEQyxTQUFyRCxDQUFQO0FBQ0Q7O0FBL0QwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCZWhhdmlvdXIgZnJvbSAnLi9CZWhhdmlvdXInO1xuaW1wb3J0IHsgVmVjdG9yM0QgfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IGdldEVhc2luZ0J5TmFtZSB9IGZyb20gJy4uL2Vhc2UnO1xuaW1wb3J0IHsgQkVIQVZJT1VSX1RZUEVfRk9SQ0UgYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuLyoqXG4gKiBCZWhhdmlvdXIgdGhhdCBmb3JjZXMgcGFydGljbGVzIGFsb25nIGEgc3BlY2lmaWMgYXhpcy5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcmNlIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBGb3JjZSBiZWhhdmlvdXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmeCAtIHRoZSB4IGF4aXMgZm9yY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZ5IC0gdGhlIHkgYXhpcyBmb3JjZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZnogLSB0aGUgeiBheGlzIGZvcmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsaWZlIC0gdGhlIGxpZmUgb2YgdGhlIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVhc2luZyAtIFRoZSBiZWhhdmlvdXIncyBkZWNheWluZyB0cmVuZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0VuYWJsZWQ9dHJ1ZV0gLSBEZXRlcm1pbmVzIGlmIHRoZSBiZWhhdmlvdXIgd2lsbCBiZSBhcHBsaWVkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGZ4LCBmeSwgZnosIGxpZmUsIGVhc2luZywgaXNFbmFibGVkID0gdHJ1ZSkge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZywgdHlwZSwgaXNFbmFibGVkKTtcblxuICAgIHRoaXMucmVzZXQoZngsIGZ5LCBmeik7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBiZWhhdmlvdXIgcHJvcGVydGllcy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZ4IC0gdGhlIHggYXhpcyBmb3JjZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZnkgLSB0aGUgeSBheGlzIGZvcmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmeiAtIHRoZSB6IGF4aXMgZm9yY2VcbiAgICovXG4gIHJlc2V0KGZ4LCBmeSwgZnopIHtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgbm9ybWFsaXplZCBmb3JjZSB0byBleGVydCBvbiB0aGUgcGFydGljbGUgaW5cbiAgICAgKiBAdHlwZSB7VmVjdG9yM0R9XG4gICAgICovXG4gICAgdGhpcy5mb3JjZSA9IHRoaXMubm9ybWFsaXplRm9yY2UobmV3IFZlY3RvcjNEKGZ4LCBmeSwgZnopKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBpZCBvZiB0aGUgZm9yY2UgdmVjdG9yXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHRoaXMuZm9yY2UuaWRcbiAgICAgKi9cbiAgICB0aGlzLmZvcmNlLmlkID0gTWF0aC5yYW5kb20oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNdXRhdGVzIHRoZSBwYXJ0aWNsZS5hY2NlbGVyYXRpb24gcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWNsZSAtIHRoZSBwYXJ0aWNsZSB0byBhcHBseSB0aGUgYmVoYXZpb3VyIHRvXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gZW5naW5lIHRpbWVcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIG11dGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmVuZXJnaXplKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICBwYXJ0aWNsZS5hY2NlbGVyYXRpb24uYWRkKHRoaXMuZm9yY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBGb3JjZSBpbml0aWFsaXplciBmcm9tIEpTT04uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gVGhlIEpTT04gdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZSBmcm9tLlxuICAgKiBAcmV0dXJuIHtGb3JjZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgY29uc3QgeyBmeCwgZnksIGZ6LCBsaWZlLCBlYXNpbmcsIGlzRW5hYmxlZCA9IHRydWUgfSA9IGp Line truncated
@@ -0,0 +1,40 @@
import Force from './Force';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_GRAVITY as type } from './types';
/**
* Behaviour that forces particles down the y axis.
*
*/
export default class Gravity extends Force {
/**
* Constructs a Gravity behaviour instance.
*
* @param {number} gravity - the force to pull the particle down the y axis
* @param {number} life - the life of the particle
* @param {function} easing - The behaviour's decaying trend
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(gravity, life, easing, isEnabled = true) {
super(0, -gravity, 0, life, easing, isEnabled);
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
}
static fromJSON(json) {
const {
gravity,
life,
easing,
isEnabled = true
} = json;
return new Gravity(gravity, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvR3Jhdml0eS5qcyJdLCJuYW1lcyI6WyJGb3JjZSIsImdldEVhc2luZ0J5TmFtZSIsIkJFSEFWSU9VUl9UWVBFX0dSQVZJVFkiLCJ0eXBlIiwiR3Jhdml0eSIsImNvbnN0cnVjdG9yIiwiZ3Jhdml0eSIsImxpZmUiLCJlYXNpbmciLCJpc0VuYWJsZWQiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLEtBQVAsTUFBa0IsU0FBbEI7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFNBQWhDO0FBQ0EsU0FBU0Msc0JBQXNCLElBQUlDLElBQW5DLFFBQStDLFNBQS9DO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxPQUFOLFNBQXNCSixLQUF0QixDQUE0QjtBQUN6QztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUssRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLElBQVYsRUFBZ0JDLE1BQWhCLEVBQXdCQyxTQUFTLEdBQUcsSUFBcEMsRUFBMEM7QUFDbkQsVUFBTSxDQUFOLEVBQVMsQ0FBQ0gsT0FBVixFQUFtQixDQUFuQixFQUFzQkMsSUFBdEIsRUFBNEJDLE1BQTVCLEVBQW9DQyxTQUFwQztBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtOLElBQUwsR0FBWUEsSUFBWjtBQUNEOztBQUVjLFNBQVJPLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFVBQU07QUFBRUwsTUFBQUEsT0FBRjtBQUFXQyxNQUFBQSxJQUFYO0FBQWlCQyxNQUFBQSxNQUFqQjtBQUF5QkMsTUFBQUEsU0FBUyxHQUFHO0FBQXJDLFFBQThDRSxJQUFwRDtBQUVBLFdBQU8sSUFBSVAsT0FBSixDQUFZRSxPQUFaLEVBQXFCQyxJQUFyQixFQUEyQk4sZUFBZSxDQUFDTyxNQUFELENBQTFDLEVBQW9EQyxTQUFwRCxDQUFQO0FBQ0Q7O0FBeEJ3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBGb3JjZSBmcm9tICcuL0ZvcmNlJztcbmltcG9ydCB7IGdldEVhc2luZ0J5TmFtZSB9IGZyb20gJy4uL2Vhc2UnO1xuaW1wb3J0IHsgQkVIQVZJT1VSX1RZUEVfR1JBVklUWSBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQmVoYXZpb3VyIHRoYXQgZm9yY2VzIHBhcnRpY2xlcyBkb3duIHRoZSB5IGF4aXMuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmF2aXR5IGV4dGVuZHMgRm9yY2Uge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIEdyYXZpdHkgYmVoYXZpb3VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gZ3Jhdml0eSAtIHRoZSBmb3JjZSB0byBwdWxsIHRoZSBwYXJ0aWNsZSBkb3duIHRoZSB5IGF4aXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpZmUgLSB0aGUgbGlmZSBvZiB0aGUgcGFydGljbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVhc2luZyAtIHRoZSBlYXNpbmcgZXF1YXRpb24gdG8gdXNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRW5hYmxlZD10cnVlXSAtIERldGVybWluZXMgaWYgdGhlIGJlaGF2aW91ciB3aWxsIGJlIGFwcGxpZWQgb3Igbm90XG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IoZ3Jhdml0eSwgbGlmZSwgZWFzaW5nLCBpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIoMCwgLWdyYXZpdHksIDAsIGxpZmUsIGVhc2luZywgaXNFbmFibGVkKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBjbGFzcyB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgY29uc3QgeyBncmF2aXR5LCBsaWZlLCBlYXNpbmcsIGlzRW5hYmxlZCA9IHRydWUgfSA9IGpzb247XG5cbiAgICByZXR1cm4gbmV3IEdyYXZpdHkoZ3Jhdml0eSwgbGlmZSwgZ2V0RWFzaW5nQnlOYW1lKGVhc2luZyksIGlzRW5hYmxlZCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,97 @@
import { MathUtils, Vector3D, createSpan } from '../math';
import Behaviour from './Behaviour';
import { DEFAULT_RANDOM_DRIFT_DELAY } from './constants';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_RANDOM_DRIFT as type } from './types';
/**
* Behaviour that causes particles to drift to random coordinates in 3D space.
*
*/
export default class RandomDrift extends Behaviour {
/**
* Constructs a RandomDrift behaviour instance.
*
* @param {number} driftX - x axis drift
* @param {number} driftY - y axis drift
* @param {number} driftZ - z axis drift
* @param {number} [delay=DEFAULT_RANDOM_DRIFT_DELAY] - drift delay
* @param {number} life - The life of the particle
* @param {function} easing - The behaviour's decaying trend
* @return void
*/
constructor(driftX, driftY, driftZ, delay = DEFAULT_RANDOM_DRIFT_DELAY, life = Infinity, easing, isEnabled = true) {
super(life, easing, type, isEnabled);
this.reset(driftX, driftY, driftZ, delay);
/**
* @desc Internal time used for calculating drift vs internal delay.
* @type {number}
*/
this.time = 0;
}
/**
* Resets the behaviour properties.
*
* @param {number} driftX - x axis drift
* @param {number} driftY - y axis drift
* @param {number} driftZ - z axis drift
* @param {number} [delay=DEFAULT_RANDOM_DRIFT_DELAY] - drift delay
* @param {number} life - The life of the particle
* @param {function} easing - The behaviour's decaying trend
*/
reset(driftX, driftY, driftZ, delay = DEFAULT_RANDOM_DRIFT_DELAY, life, easing) {
/**
* @desc A Vector3D that stores the drift properties.
* @type {Vector3D}
*/
this.randomForce = this.normalizeForce(new Vector3D(driftX, driftY, driftZ));
/**
* @desc A Span containing the delay supplied.
* @type {Span}
*/
this.delayPan = createSpan(delay);
this.time = 0;
life && super.reset(life, easing);
}
/**
* Mutates the particle.acceleration property.
*
* @param {object} particle - the particle to apply the behaviour to
* @param {number} time - engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
this.energize(particle, time, index);
this.time += time;
if (this.time >= this.delayPan.getValue()) {
const ax = MathUtils.randomAToB(-this.randomForce.x, this.randomForce.x);
const ay = MathUtils.randomAToB(-this.randomForce.y, this.randomForce.y);
const az = MathUtils.randomAToB(-this.randomForce.z, this.randomForce.z);
particle.acceleration.addValue(ax, ay, az);
this.time = 0;
}
}
static fromJSON(json) {
const {
x,
y,
z,
delay,
life,
easing,
isEnabled = true
} = json;
return new RandomDrift(x, y, z, delay, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvUmFuZG9tRHJpZnQuanMiXSwibmFtZXMiOlsiTWF0aFV0aWxzIiwiVmVjdG9yM0QiLCJjcmVhdGVTcGFuIiwiQmVoYXZpb3VyIiwiREVGQVVMVF9SQU5ET01fRFJJRlRfREVMQVkiLCJnZXRFYXNpbmdCeU5hbWUiLCJCRUhBVklPVVJfVFlQRV9SQU5ET01fRFJJRlQiLCJ0eXBlIiwiUmFuZG9tRHJpZnQiLCJjb25zdHJ1Y3RvciIsImRyaWZ0WCIsImRyaWZ0WSIsImRyaWZ0WiIsImRlbGF5IiwibGlmZSIsImVhc2luZyIsImlzRW5hYmxlZCIsInJlc2V0IiwidGltZSIsInJhbmRvbUZvcmNlIiwibm9ybWFsaXplRm9yY2UiLCJkZWxheVBhbiIsIm11dGF0ZSIsInBhcnRpY2xlIiwiaW5kZXgiLCJlbmVyZ2l6ZSIsImdldFZhbHVlIiwiYXgiLCJyYW5kb21BVG9CIiwieCIsImF5IiwieSIsImF6IiwieiIsImFjY2VsZXJhdGlvbiIsImFkZFZhbHVlIiwiZnJvbUpTT04iLCJqc29uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxTQUFULEVBQW9CQyxRQUFwQixFQUE4QkMsVUFBOUIsUUFBZ0QsU0FBaEQ7QUFFQSxPQUFPQyxTQUFQLE1BQXNCLGFBQXRCO0FBQ0EsU0FBU0MsMEJBQVQsUUFBMkMsYUFBM0M7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFNBQWhDO0FBQ0EsU0FBU0MsMkJBQTJCLElBQUlDLElBQXhDLFFBQW9ELFNBQXBEO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxXQUFOLFNBQTBCTCxTQUExQixDQUFvQztBQUNqRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VNLEVBQUFBLFdBQVcsQ0FDVEMsTUFEUyxFQUVUQyxNQUZTLEVBR1RDLE1BSFMsRUFJVEMsS0FBSyxHQUFHVCwwQkFKQyxFQUtUVSxJQUxTLEVBTVRDLE1BTlMsRUFPVEMsU0FBUyxHQUFHLElBUEgsRUFRVDtBQUNBLFVBQU1GLElBQU4sRUFBWUMsTUFBWixFQUFvQlIsSUFBcEIsRUFBMEJTLFNBQTFCO0FBRUEsU0FBS0MsS0FBTCxDQUFXUCxNQUFYLEVBQW1CQyxNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNDLEtBQW5DO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0ssSUFBTCxHQUFZLENBQVo7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUQsRUFBQUEsS0FBSyxDQUNIUCxNQURHLEVBRUhDLE1BRkcsRUFHSEMsTUFIRyxFQUlIQyxLQUFLLEdBQUdULDBCQUpMLEVBS0hVLElBTEcsRUFNSEMsTUFORyxFQU9IO0FBQ0E7QUFDSjtBQUNBO0FBQ0E7QUFDSSxTQUFLSSxXQUFMLEdBQW1CLEtBQUtDLGNBQUwsQ0FDakIsSUFBSW5CLFFBQUosQ0FBYVMsTUFBYixFQUFxQkMsTUFBckIsRUFBNkJDLE1BQTdCLENBRGlCLENBQW5CO0FBR0E7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS1MsUUFBTCxHQUFnQm5CLFVBQVUsQ0FBQ1csS0FBRCxDQUExQjtBQUNBLFNBQUtLLElBQUwsR0FBWSxDQUFaO0FBRUFKLElBQUFBLElBQUksSUFBSSxNQUFNRyxLQUFOLENBQVlILElBQVosRUFBa0JDLE1BQWxCLENBQVI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFTyxFQUFBQSxNQUFNLENBQUNDLFFBQUQsRUFBV0wsSUFBWCxFQUFpQk0sS0FBakIsRUFBd0I7QUFDNUIsU0FBS0MsUUFBTCxDQUFjRixRQUFkLEVBQXdCTCxJQUF4QixFQUE4Qk0sS0FBOUI7QUFFQSxTQUFLTixJQUFMLElBQWFBLElBQWI7O0FBRUEsUUFBSSxLQUFLQSxJQUFMLElBQWEsS0FBS0csUUFBTCxDQUFjSyxRQUFkLEVBQWpCLEVBQTJDO0FBQ3pDLFlBQU1DLEVBQUUsR0FBRzNCLFNBQVMsQ0FBQzRCLFVBQVYsQ0FBcUIsQ0FBQyxLQUFLVCxXQUFMLENBQWlCVSxDQUF2QyxFQUEwQyxLQUFLVixXQUFMLENBQWlCVSxDQUEzRCxDQUFYO0FBQ0EsWUFBTUMsRUFBRSxHQUFHOUIsU0FBUyxDQUFDNEIsVUFBVixDQUFxQixDQUFDLEtBQUtULFdBQUwsQ0FBaUJZLENBQXZDLEVBQTBDLEtBQUtaLFdBQUwsQ0FBaUJZLENBQTNELENBQVg7QUFDQSxZQUFNQyxFQUFFLEdBQUdoQyxTQUFTLENBQUM0QixVQUFWLENBQXFCLENBQUMsS0FBS1QsV0FBTCxDQUFpQmMsQ0FBdkMsRUFBMEMsS0FBS2QsV0FBTCxDQUFpQmMsQ0FBM0QsQ0FBWDtBQUVBVixNQUFBQSxRQUFRLENBQUNXLFlBQVQsQ0FBc0JDLFFBQXRCLENBQStCUixFQUEvQixFQUFtQ0csRUFBbkMsRUFBdUNFLEVBQXZDO0FBRUEsV0FBS2QsSUFBTCxHQUFZLENBQVo7QUFDRDtBQUNGOztBQUVjLFNBQVJrQixRQUFRLENBQUNDLElBQUQsRUFBTztBQUNwQixVQUFNO0FBQUVSLE1BQUFBLENBQUY7QUFBS0UsTUFBQUEsQ0FBTDtBQUFRRSxNQUFBQSxDQUFSO0FBQVdwQixNQUFBQSxLQUFYO0FBQWtCQyxNQUFBQSxJQUFsQjtBQUF3QkMsTUFBQUEsTUFBeEI7QUFBZ0NDLE1BQUFBLFNBQVMsR0FBRztBQUE1QyxRQUFxRHFCLElBQTNEO0FBRUEsV0FBTyxJQUFJN0IsV0FBSixDQUNMcUIsQ0FESyxFQUVMRSxDQUZLLEVBR0xFLENBSEssRUFJTHBCLEtBSkssRUFLTEMsSUFMSyxFQU1MVCxlQUFlLENBQUNVLE1BQUQsQ0FOVixFQU9MQyxTQVBLLENBQVA7QUFTRDs7QUF2R2dEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWF0aFV0aWxzLCBWZWN0b3IzRCwgY3JlYXRlU3BhbiB9IGZyb20gJy4uL21hdGgnO1xuXG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gJy4vQmVoYXZpb3VyJztcbmltcG9ydCB7IERFRkFVTFRfUkFORE9NX0RSSUZUX0RFTEFZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0RWFzaW5nQnlOYW1lIH0gZnJvbSAnLi4vZWFzZSc7XG5pbXBvcnQgeyBCRUhBVklPVVJfVFlQRV9SQU5ET01fRFJJRlQgYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEJlaGF2aW91ciB0aGF0IGNhdXNlcyBwYXJ0aWNsZXMgdG8gZHJpZnQgdG8gcmFuZG9tIGNvb3JkaW5hdGVzIGluIDNEIHNwYWNlLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZG9tRHJpZnQgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFJhbmRvbURyaWZ0IGJlaGF2aW91ciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRyaWZ0WCAtIHggYXhpcyBkcmlmdFxuICAgKiBAcGFyYW0ge251bWJlcn0gZHJpZnRZIC0geSBheGlzIGRyaWZ0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkcmlmdFogLSB6IGF4aXMgZHJpZnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheT1ERUZBVUxUX1JBTkRPTV9EUklGVF9ERUxBWV0gLSBkcmlmdCBkZWxheVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlYXNpbmcgLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmRcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBkcmlmdFgsXG4gICAgZHJpZnRZLFxuICAgIGRyaWZ0WixcbiAgICBkZWxheSA9IERFRkFVTFRfUkFORE9NX0RSSUZUX0RFTEFZLFxuICAgIGxpZmUsXG4gICAgZWFzaW5nLFxuICAgIGlzRW5hYmxlZCA9IHRydWVcbiAgKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nLCB0eXBlLCBpc0VuYWJsZWQpO1xuXG4gICAgdGhpcy5yZXNldChkcmlmdFgsIGRyaWZ0WSwgZHJpZnRaLCBkZWxheSk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBJbnRlcm5hbCB0aW1lIHVzZWQgZm9yIGNhbGN1bGF0aW5nIGRyaWZ0IHZzIGl Line truncated
@@ -0,0 +1,81 @@
import Attraction from './Attraction';
import { Vector3D } from '../math';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_REPULSION as type } from './types';
/**
* Behaviour that causes particles to be repelled from a target position.
*
*/
export default class Repulsion extends Attraction {
/**
* Constructs an Repulsion behaviour instance.
*
* @param {Vector3D} targetPosition - The position the particles will be repelled from
* @param {number} force - The repulsion force scalar multiplier
* @param {number} radius - The repulsion radius
* @param {number} life - The life of the particle
* @param {function} easing - The behaviour's decaying trend
* @return void
*/
constructor(targetPosition, force, radius, life, easing, isEnabled = true) {
super(targetPosition, force, radius, life, easing, isEnabled);
/**
* @desc Repulsion is attraction with negative force.
* @type {number}
*/
this.force *= -1;
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
}
/**
* Resets the behaviour properties.
*
* @param {Vector3D} targetPosition - the position the particles will be attracted to
* @param {number} force - the attraction force multiplier
* @param {number} radius - the attraction radius
* @param {number} life - the life of the particle
* @param {function} easing - The behaviour's decaying trend
* @return void
*/
reset(targetPosition, force, radius, life, easing) {
super.reset(targetPosition, force, radius, life, easing);
this.force *= -1;
}
/**
* Creates a Body initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @property {number} json.x - The target position x value
* @property {number} json.y - The target position y value
* @property {number} json.z - The target position z value
* @property {number} json.force - The attraction force scalar multiplier
* @property {number} json.life - The life of the particle
* @property {string} json.easing - The behaviour's decaying trend
* @return {Body}
*/
static fromJSON(json) {
const {
x,
y,
z,
force,
radius,
life,
easing,
isEnabled = true
} = json;
return new Repulsion(new Vector3D(x, y, z), force, radius, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvUmVwdWxzaW9uLmpzIl0sIm5hbWVzIjpbIkF0dHJhY3Rpb24iLCJWZWN0b3IzRCIsImdldEVhc2luZ0J5TmFtZSIsIkJFSEFWSU9VUl9UWVBFX1JFUFVMU0lPTiIsInR5cGUiLCJSZXB1bHNpb24iLCJjb25zdHJ1Y3RvciIsInRhcmdldFBvc2l0aW9uIiwiZm9yY2UiLCJyYWRpdXMiLCJsaWZlIiwiZWFzaW5nIiwiaXNFbmFibGVkIiwicmVzZXQiLCJmcm9tSlNPTiIsImpzb24iLCJ4IiwieSIsInoiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFVBQVAsTUFBdUIsY0FBdkI7QUFDQSxTQUFTQyxRQUFULFFBQXlCLFNBQXpCO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQyxTQUFoQztBQUNBLFNBQVNDLHdCQUF3QixJQUFJQyxJQUFyQyxRQUFpRCxTQUFqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsU0FBTixTQUF3QkwsVUFBeEIsQ0FBbUM7QUFDaEQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRU0sRUFBQUEsV0FBVyxDQUFDQyxjQUFELEVBQWlCQyxLQUFqQixFQUF3QkMsTUFBeEIsRUFBZ0NDLElBQWhDLEVBQXNDQyxNQUF0QyxFQUE4Q0MsU0FBUyxHQUFHLElBQTFELEVBQWdFO0FBQ3pFLFVBQU1MLGNBQU4sRUFBc0JDLEtBQXRCLEVBQTZCQyxNQUE3QixFQUFxQ0MsSUFBckMsRUFBMkNDLE1BQTNDLEVBQW1EQyxTQUFuRDtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtKLEtBQUwsSUFBYyxDQUFDLENBQWY7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLSixJQUFMLEdBQVlBLElBQVo7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRVMsRUFBQUEsS0FBSyxDQUFDTixjQUFELEVBQWlCQyxLQUFqQixFQUF3QkMsTUFBeEIsRUFBZ0NDLElBQWhDLEVBQXNDQyxNQUF0QyxFQUE4QztBQUNqRCxVQUFNRSxLQUFOLENBQVlOLGNBQVosRUFBNEJDLEtBQTVCLEVBQW1DQyxNQUFuQyxFQUEyQ0MsSUFBM0MsRUFBaURDLE1BQWpEO0FBQ0EsU0FBS0gsS0FBTCxJQUFjLENBQUMsQ0FBZjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDaUIsU0FBUk0sUUFBUSxDQUFDQyxJQUFELEVBQU87QUFDcEIsVUFBTTtBQUFFQyxNQUFBQSxDQUFGO0FBQUtDLE1BQUFBLENBQUw7QUFBUUMsTUFBQUEsQ0FBUjtBQUFXVixNQUFBQSxLQUFYO0FBQWtCQyxNQUFBQSxNQUFsQjtBQUEwQkMsTUFBQUEsSUFBMUI7QUFBZ0NDLE1BQUFBLE1BQWhDO0FBQXdDQyxNQUFBQSxTQUFTLEdBQUc7QUFBcEQsUUFBNkRHLElBQW5FO0FBRUEsV0FBTyxJQUFJVixTQUFKLENBQ0wsSUFBSUosUUFBSixDQUFhZSxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQkMsQ0FBbkIsQ0FESyxFQUVMVixLQUZLLEVBR0xDLE1BSEssRUFJTEMsSUFKSyxFQUtMUixlQUFlLENBQUNTLE1BQUQsQ0FMVixFQU1MQyxTQU5LLENBQVA7QUFRRDs7QUFqRStDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEF0dHJhY3Rpb24gZnJvbSAnLi9BdHRyYWN0aW9uJztcbmltcG9ydCB7IFZlY3RvcjNEIH0gZnJvbSAnLi4vbWF0aCc7XG5pbXBvcnQgeyBnZXRFYXNpbmdCeU5hbWUgfSBmcm9tICcuLi9lYXNlJztcbmltcG9ydCB7IEJFSEFWSU9VUl9UWVBFX1JFUFVMU0lPTiBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIEJlaGF2aW91ciB0aGF0IGNhdXNlcyBwYXJ0aWNsZXMgdG8gYmUgcmVwZWxsZWQgZnJvbSBhIHRhcmdldCBwb3NpdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcHVsc2lvbiBleHRlbmRzIEF0dHJhY3Rpb24ge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBSZXB1bHNpb24gYmVoYXZpb3VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcjNEfSB0YXJnZXRQb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB0aGUgcGFydGljbGVzIHdpbGwgYmUgcmVwZWxsZWQgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gZm9yY2UgLSBUaGUgcmVwdWxzaW9uIGZvcmNlIHNjYWxhciBtdWx0aXBsaWVyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmVwdWxzaW9uIHJhZGl1c1xuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlYXNpbmcgLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmRcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nLCBpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZywgaXNFbmFibGVkKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFJlcHVsc2lvbiBpcyBhdHRyYWN0aW9uIHdpdGggbmVnYXRpdmUgZm9yY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmZvcmNlICo9IC0xO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNsYXNzIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYmVoYXZpb3VyIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yM0R9IHRhcmdldFBvc2l0aW9uIC0gdGhlIHBvc2l0aW9uIHRoZSBwYXJ0aWNsZXMgd2lsbCBiZSBhdHRyYWN0ZWQgdG9cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZvcmNlIC0gdGhlIGF0dHJhY3Rpb24gZm9yY2UgbXVsdGlwbGllclxuICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gdGhlIGF0dHJhY3Rpb24gcmFkaXVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsaWZlIC0gdGhlIGxpZmUgb2YgdGhlIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVhc2luZyAtIFRoZSBiZWhhdmlvdXIncyBkZWNheWluZyB0cmVuZFxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIHJlc2V0KHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlci5yZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKTtcbiAgICB0aGlzLmZvcmNlICo9IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBCb2R5IGluaXRpYWxpemVyIGZyb20gSlNPTi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgSlNPTiB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlIGZyb20uXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLnggLSBUaGUgdGFyZ2V0IHBvc2l0aW9uIHggdmFsdWVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGpzb24ueSAtIFRoZSB0YXJnZXQgcG9zaXRpb24geSB2YWx1ZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0ganNvbi56IC0gVGhlIHRhcmdldCBwb3NpdGlvbiB6IHZhbHVlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLmZvcmNlIC0gVGhlIGF0dHJhY3Rpb24gZm9yY2Ugc2NhbGFyIG11bHRpcGxpZXJcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGpzb24ubGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30ganNvbi5lYXNpbmcgLSBUaGUgYmVoYXZ Line truncated
@@ -0,0 +1,214 @@
import { DR, PI } from '../constants';
import { MathUtils, Vector3D, createSpan } from '../math';
import Behaviour from './Behaviour';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_ROTATE as type } from './types';
/**
* Behaviour that rotates particles.
*/
export default class Rotate extends Behaviour {
/**
* Constructs a Rotate behaviour instance.
*
* @param {number} x - X axis rotation
* @param {number} y - Y axis rotation
* @param {number} z - Z axis rotation
* @param {number} life - The life of the behaviour
* @param {function} easing - The easing equation to use for transforms
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(x, y, z, life = Infinity, easing, isEnabled = true) {
super(life, easing, type, isEnabled);
this.reset(x, y, z);
}
/**
* Gets the rotation type.
*
* @return {string}
*/
get rotationType() {
return this._rotationType;
}
/**
* Sets the rotation type.
*
* @param {string}
* @return void
*/
set rotationType(rotationType) {
/**
* @desc The rotation type. ENUM of ['same', 'set', 'to', 'add'].
* @type {string}
*/
this._rotationType = rotationType;
}
/**
* Resets the behaviour properties.
*
* @param {number} x - X axis rotation
* @param {number} y - Y axis rotation
* @param {number} z - Z axis rotation
* @param {number} life - the life of the behaviour
* @param {function} easing - the easing equation to use for transforms
* @return void
*/
reset(x, y, z, life, easing) {
/**
* @desc X axis rotation.
* @type {number|Span}
*/
this.x = x || 0;
/**
* @desc Y axis rotation.
* @type {number|Span}
*/
this.y = y || 0;
/**
* @desc Z axis rotation.
* @type {number|Span}
*/
this.z = z || 0;
if (x === undefined || x == 'same') {
this.rotationType = 'same';
} else if (y == undefined) {
this.rotationType = 'set';
} else if (z === undefined) {
this.rotationType = 'to';
} else {
this.rotationType = 'add';
this.x = createSpan(this.x * DR);
this.y = createSpan(this.y * DR);
this.z = createSpan(this.z * DR);
}
life && super.reset(life, easing);
}
/**
* Initializes the behaviour on a particle.
*
* @param {object} particle - the particle to initialize the behaviour on
* @return void
*/
initialize(particle) {
switch (this.rotationType) {
case 'same':
break;
case 'set':
this._setRotation(particle.rotation, this.x);
break;
case 'to':
particle.transform.fR = particle.transform.fR || new Vector3D();
particle.transform.tR = particle.transform.tR || new Vector3D();
this._setRotation(particle.transform.fR, this.x);
this._setRotation(particle.transform.tR, this.y);
break;
case 'add':
particle.transform.addR = new Vector3D(this.x.getValue(), this.y.getValue(), this.z.getValue());
break;
}
}
/**
* Sets the particle's rotation prior to the behaviour being applied.
*
* NOTE It's hard to see here, but this is mutating the particle's rotation
* even though the particle is not being passed in directly.
*
* NOTE the else if below will never be reached because the value being passed in
* will never be of type Vector3D.
*
* @param {Vector3D} particleRotation - the particle's rotation vector
* @param {string|number} value - the value to set the rotation value to, if 'random'
* rotation is randomised
* @return void
*/
_setRotation(particleRotation, value) {
particleRotation = particleRotation || new Vector3D();
if (value == 'random') {
var x = MathUtils.randomAToB(-PI, PI);
var y = MathUtils.randomAToB(-PI, PI);
var z = MathUtils.randomAToB(-PI, PI);
particleRotation.set(x, y, z);
} // we can't ever get here because value will never be a Vector3D!
// consider refactoring to
// if (value instance of Span) { vec3.add(value.getValue()); }
else if (value instanceof Vector3D) {
particleRotation.copy(value);
}
}
/**
* Mutates the particle.rotation property.
*
* @see http://stackoverflow.com/questions/21622956/how-to-convert-direction-vector-to-euler-angles
* @param {object} particle - the particle to apply the behaviour to
* @param {number} time - engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
this.energize(particle, time, index);
switch (this.rotationType) {
// orients the particle in the direction it is moving
case 'same':
if (!particle.rotation) {
particle.rotation = new Vector3D();
}
particle.rotation.copy(particle.velocity);
break;
case 'set':
//
break;
case 'to':
particle.rotation.x = MathUtils.lerp(particle.transform.fR.x, particle.transform.tR.x, this.energy);
particle.rotation.y = MathUtils.lerp(particle.transform.fR.y, particle.transform.tR.y, this.energy);
particle.rotation.z = MathUtils.lerp(particle.transform.fR.z, particle.transform.tR.z, this.energy);
break;
case 'add':
particle.rotation.add(particle.transform.addR);
break;
}
}
static fromJSON(json) {
const {
x,
y,
z,
life,
easing,
isEnabled = true
} = json;
return new Rotate(x, y, z, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvUm90YXRlLmpzIl0sIm5hbWVzIjpbIkRSIiwiUEkiLCJNYXRoVXRpbHMiLCJWZWN0b3IzRCIsImNyZWF0ZVNwYW4iLCJCZWhhdmlvdXIiLCJnZXRFYXNpbmdCeU5hbWUiLCJCRUhBVklPVVJfVFlQRV9ST1RBVEUiLCJ0eXBlIiwiUm90YXRlIiwiY29uc3RydWN0b3IiLCJ4IiwieSIsInoiLCJsaWZlIiwiZWFzaW5nIiwiaXNFbmFibGVkIiwicmVzZXQiLCJyb3RhdGlvblR5cGUiLCJfcm90YXRpb25UeXBlIiwidW5kZWZpbmVkIiwiaW5pdGlhbGl6ZSIsInBhcnRpY2xlIiwiX3NldFJvdGF0aW9uIiwicm90YXRpb24iLCJ0cmFuc2Zvcm0iLCJmUiIsInRSIiwiYWRkUiIsImdldFZhbHVlIiwicGFydGljbGVSb3RhdGlvbiIsInZhbHVlIiwicmFuZG9tQVRvQiIsInNldCIsImNvcHkiLCJtdXRhdGUiLCJ0aW1lIiwiaW5kZXgiLCJlbmVyZ2l6ZSIsInZlbG9jaXR5IiwibGVycCIsImVuZXJneSIsImFkZCIsImZyb21KU09OIiwianNvbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsRUFBVCxFQUFhQyxFQUFiLFFBQXVCLGNBQXZCO0FBQ0EsU0FBU0MsU0FBVCxFQUFvQkMsUUFBcEIsRUFBOEJDLFVBQTlCLFFBQWdELFNBQWhEO0FBRUEsT0FBT0MsU0FBUCxNQUFzQixhQUF0QjtBQUNBLFNBQVNDLGVBQVQsUUFBZ0MsU0FBaEM7QUFDQSxTQUFTQyxxQkFBcUIsSUFBSUMsSUFBbEMsUUFBOEMsU0FBOUM7QUFFQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxNQUFOLFNBQXFCSixTQUFyQixDQUErQjtBQUM1QztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VLLEVBQUFBLFdBQVcsQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKLEVBQU9DLENBQVAsRUFBVUMsSUFBVixFQUFn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 Line truncated
@@ -0,0 +1,131 @@
import { MathUtils, createSpan } from '../math';
import Behaviour from './Behaviour';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_SCALE as type } from './types';
/**
* Behaviour that scales particles.
*
*/
export default class Scale extends Behaviour {
/**
* Constructs a Scale behaviour instance.
*
* @param {number | Span} scaleA - the starting scale value
* @param {?number} scaleB - the ending scale value
* @param {number} life - the life of the behaviour
* @param {function} easing - the easing equation to use for transforms
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(scaleA, scaleB, life=Infinity, easing, isEnabled = true) {
super(life, easing, type, isEnabled);
this.reset(scaleA, scaleB);
}
/**
* Gets the _same property which determines if the scale props are the same.
*
* @return {boolean}
*/
get same() {
return this._same;
}
/**
* Sets the _same property which determines if the scale props are the same.
*
* @param {boolean} same
* @return {boolean}
*/
set same(same) {
/**
* @type {boolean}
*/
this._same = same;
}
/**
* Resets the behaviour properties.
*
* @param {number} scaleA - the starting scale value
* @param {?number} scaleB - the ending scale value
* @param {number} life - the life of the behaviour
* @param {function} easing - the easing equation to use for transforms
* @return void
*/
reset(scaleA, scaleB, life, easing) {
this.same = scaleB === null || scaleB === undefined ? true : false;
/**
* @desc The starting scale.
* @type {Span}
*/
this.scaleA = createSpan(scaleA || 1);
/**
* @desc The ending scale.
* @type {Span}
*/
this.scaleB = createSpan(scaleB);
life && super.reset(life, easing);
}
/**
* Initializes the behaviour on a particle.
* Stores initial values for comparison and mutation in the applyBehaviour method.
*
* @param {object} particle - the particle to initialize the behaviour on
* @return void
*/
initialize(particle) {
particle.transform.scaleA = this.scaleA.getValue();
particle.transform.oldRadius = particle.radius;
particle.transform.scaleB = this.same ? particle.transform.scaleA : this.scaleB.getValue();
}
/**
* Applies the behaviour to the particle.
* Mutates the particle's scale and its radius according to this scale.
*
* @param {object} particle - the particle to apply the behaviour to
* @param {number} time - engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
this.energize(particle, time, index);
particle.scale = MathUtils.lerp(particle.transform.scaleA, particle.transform.scaleB, this.energy);
if (particle.scale < 0.0005) {
particle.scale = 0;
}
particle.radius = particle.transform.oldRadius * particle.scale;
}
/**
* Returns a new instance of the behaviour from the JSON object passed.
*
* @param {object} json - JSON object containing the required constructor properties
* @return {Spring}
*/
static fromJSON(json) {
const {
scaleA,
scaleB,
life,
easing,
isEnabled = true
} = json;
return new Scale(scaleA, scaleB, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvU2NhbGUuanMiXSwibmFtZXMiOlsiTWF0aFV0aWxzIiwiY3JlYXRlU3BhbiIsIkJlaGF2aW91ciIsImdldEVhc2luZ0J5TmFtZSIsIkJFSEFWSU9VUl9UWVBFX1NDQUxFIiwidHlwZSIsIlNjYWxlIiwiY29uc3RydWN0b3IiLCJzY2FsZUEiLCJzY2FsZUIiLCJsaWZlIiwiZWFzaW5nIiwiaXNFbmFibGVkIiwicmVzZXQiLCJzYW1lIiwiX3NhbWUiLCJ1bmRlZmluZWQiLCJpbml0aWFsaXplIiwicGFydGljbGUiLCJ0cmFuc2Zvcm0iLCJnZXRWYWx1ZSIsIm9sZFJhZGl1cyIsInJhZGl1cyIsIm11dGF0ZSIsInRpbWUiLCJpbmRleCIsImVuZXJnaXplIiwic2NhbGUiLCJsZXJwIiwiZW5lcmd5IiwiZnJvbUpTT04iLCJqc29uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxTQUFULEVBQW9CQyxVQUFwQixRQUFzQyxTQUF0QztBQUVBLE9BQU9DLFNBQVAsTUFBc0IsYUFBdEI7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFNBQWhDO0FBQ0EsU0FBU0Msb0JBQW9CLElBQUlDLElBQWpDLFFBQTZDLFNBQTdDO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxLQUFOLFNBQW9CSixTQUFwQixDQUE4QjtBQUMzQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSyxFQUFBQSxXQUFXLENBQUNDLE1BQUQsRUFBU0MsTUFBVCxFQUFpQkMsSUFBakIsRUFBdUJDLE1BQXZCLEVBQStCQyxTQUFTLEdBQUcsSUFBM0MsRUFBaUQ7QUFDMUQsVUFBTUYsSUFBTixFQUFZQyxNQUFaLEVBQW9CTixJQUFwQixFQUEwQk8sU0FBMUI7QUFFQSxTQUFLQyxLQUFMLENBQVdMLE1BQVgsRUFBbUJDLE1BQW5CO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFDVSxNQUFKSyxJQUFJLEdBQUc7QUFDVCxXQUFPLEtBQUtDLEtBQVo7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ1UsTUFBSkQsSUFBSSxDQUFDQSxJQUFELEVBQU87QUFDYjtBQUNKO0FBQ0E7QUFDSSxTQUFLQyxLQUFMLEdBQWFELElBQWI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VELEVBQUFBLEtBQUssQ0FBQ0wsTUFBRCxFQUFTQyxNQUFULEVBQWlCQyxJQUFqQixFQUF1QkMsTUFBdkIsRUFBK0I7QUFDbEMsU0FBS0csSUFBTCxHQUFZTCxNQUFNLEtBQUssSUFBWCxJQUFtQkEsTUFBTSxLQUFLTyxTQUE5QixHQUEwQyxJQUExQyxHQUFpRCxLQUE3RDtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtSLE1BQUwsR0FBY1AsVUFBVSxDQUFDTyxNQUFNLElBQUksQ0FBWCxDQUF4QjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtDLE1BQUwsR0FBY1IsVUFBVSxDQUFDUSxNQUFELENBQXhCO0FBRUFDLElBQUFBLElBQUksSUFBSSxNQUFNRyxLQUFOLENBQVlILElBQVosRUFBa0JDLE1BQWxCLENBQVI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRU0sRUFBQUEsVUFBVSxDQUFDQyxRQUFELEVBQVc7QUFDbkJBLElBQUFBLFFBQVEsQ0FBQ0MsU0FBVCxDQUFtQlgsTUFBbkIsR0FBNEIsS0FBS0EsTUFBTCxDQUFZWSxRQUFaLEVBQTVCO0FBQ0FGLElBQUFBLFFBQVEsQ0FBQ0MsU0FBVCxDQUFtQkUsU0FBbkIsR0FBK0JILFFBQVEsQ0FBQ0ksTUFBeEM7QUFFQUosSUFBQUEsUUFBUSxDQUFDQyxTQUFULENBQW1CVixNQUFuQixHQUE0QixLQUFLSyxJQUFMLEdBQ3hCSSxRQUFRLENBQUNDLFNBQVQsQ0FBbUJYLE1BREssR0FFeEIsS0FBS0MsTUFBTCxDQUFZVyxRQUFaLEVBRko7QUFHRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VHLEVBQUFBLE1BQU0sQ0FBQ0wsUUFBRCxFQUFXTSxJQUFYLEVBQWlCQyxLQUFqQixFQUF3QjtBQUM1QixTQUFLQyxRQUFMLENBQWNSLFFBQWQsRUFBd0JNLElBQXhCLEVBQThCQyxLQUE5QjtBQUVBUCxJQUFBQSxRQUFRLENBQUNTLEtBQVQsR0FBaUIzQixTQUFTLENBQUM0QixJQUFWLENBQ2ZWLFFBQVEsQ0FBQ0MsU0FBVCxDQUFtQlgsTUFESixFQUVmVSxRQUFRLENBQUNDLFNBQVQsQ0FBbUJWLE1BRkosRUFHZixLQUFLb0IsTUFIVSxDQUFqQjs7QUFNQSxRQUFJWCxRQUFRLENBQUNTLEtBQVQsR0FBaUIsTUFBckIsRUFBNkI7QUFDM0JULE1BQUFBLFFBQVEsQ0FBQ1MsS0FBVCxHQUFpQixDQUFqQjtBQUNEOztBQUVEVCxJQUFBQSxRQUFRLENBQUNJLE1BQVQsR0FBa0JKLFFBQVEsQ0FBQ0MsU0FBVCxDQUFtQkUsU0FBbkIsR0FBK0JILFFBQVEsQ0FBQ1MsS0FBMUQ7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJHLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFVBQU07QUFBRXZCLE1BQUFBLE1BQUY7QUFBVUMsTUFBQUEsTUFBVjtBQUFrQkMsTUFBQUEsSUFBbEI7QUFBd0JDLE1BQUFBLE1BQXhCO0FBQWdDQyxNQUFBQSxTQUFTLEdBQUc7QUFBNUMsUUFBcURtQixJQUEzRDtBQUVBLFdBQU8sSUFBSXpCLEtBQUosQ0FBVUUsTUFBVixFQUFrQkMsTUFBbEIsRUFBMEJDLElBQTFCLEVBQWdDUCxlQUFlLENBQUNRLE1BQUQsQ0FBL0MsRUFBeURDLFNBQXpELENBQVA7QUFDRDs7QUFySDBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWF0aFV0aWxzLCBjcmVhdGVTcGFuIH0gZnJvbSAnLi4vbWF0aCc7XG5cbmltcG9ydCBCZWhhdmlvdXIgZnJvbSAnLi9CZWhhdmlvdXInO1xuaW1wb3J0IHsgZ2V0RWFzaW5nQnlOYW1lIH0gZnJvbSAnLi4vZWFzZSc7XG5pbXBvcnQgeyBCRUhBVklPVVJfVFlQRV9TQ0FMRSBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQmVoYXZpb3VyIHRoYXQgc2NhbGVzIHBhcnRpY2xlcy5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjYWxlIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBTY2FsZSBiZWhhdmlvdXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZUEgLSB0aGUgc3RhcnRpbmcgc2NhbGUgdmFsdWVcbiAgICogQHBhcmFtIHs/bnVtYmVyfSBzY2FsZUIgLSB0aGUgZW5kaW5nIHNjYWxlIHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsaWZlIC0gdGhlIGxpZmUgb2YgdGhlIGJlaGF2aW91clxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlYXNpbmcgLSB0aGUgZWFzaW5nIGVxdWF0aW9uIHRvIHVzZSBmb3IgdHJhbnNmb3Jtc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0VuYWJsZWQ9dHJ1ZV0gLSBEZXRlcm1pbmVzIGlmIHRoZSBiZWhhdmlvdXIgd2lsbCBiZSBhcHBsaWVkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjYWxlQSwgc2NhbGVCLCBsaWZlLCBlYXNpbmcsIGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcsIHR5cGUsIGlzRW5hYmxlZCk7XG5cbiAgICB0aGlzLnJlc2V0KHNjYWxlQSwgc2NhbGVCKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBfc2FtZSBwcm9wZXJ0eSB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZSBzY2FsZSBwcm9wcyBhcmUgdGhlIHNhbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgc2FtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2FtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBfc2FtZSBwcm9wZXJ0eSB3aGljaCBkZXRlcm1pbmVzIGl Line truncated
@@ -0,0 +1,90 @@
import Behaviour from './Behaviour';
import { Vector3D } from '../math';
import { getEasingByName } from '../ease';
import { BEHAVIOUR_TYPE_SPRING as type } from './types';
/**
* Behaviour that causes particles to spring.
*
*/
export default class Spring extends Behaviour {
/**
* Constructs a Spring behaviour instance.
*
* @param {number} x - X axis spring
* @param {number} y - Y axis spring
* @param {number} z - Z axis spring
* @param {number} spring - Spring factor
* @param {number} friction - Spring friction
* @param {number} life - The life of the behaviour
* @param {function} easing - The easing equation to use for transforms
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
* @return void
*/
constructor(x, y, z, spring, friction, life = Infinity, easing, isEnabled = true) {
super(life, easing, type, isEnabled);
this.reset(x, y, z, spring, friction);
}
/**
* Resets the behaviour properties.
*
* @param {number} x - X axis spring
* @param {number} y - Y axis spring
* @param {number} z - Z axis spring
* @param {number} spring - Spring factor
* @param {number} friction - Spring friction
* @return void
*/
reset(x, y, z, spring, friction) {
if (!this.pos) {
this.pos = new Vector3D(x, y, z);
} else {
this.pos.set(x, y, z);
}
this.spring = spring || 0.1;
this.friction = friction || 0.98;
}
/**
* Applies the behaviour to the particle.
* Mutates the particle's velocity according to this.pos and this.spring.
*
* @param {object} particle - the particle to apply the behaviour to
* @param {number} time - engine time
* @param {integer} index - the particle index
* @return void
*/
mutate(particle, time, index) {
this.energize(particle, time, index);
particle.velocity.x += (this.pos.x - particle.position.x) * this.spring;
particle.velocity.y += (this.pos.y - particle.position.y) * this.spring;
particle.velocity.z += (this.pos.z - particle.position.z) * this.spring;
}
/**
* Returns a new instance of the behaviour from the JSON object passed.
*
* @param {object} json - JSON object containing the required constructor properties
* @return {Spring}
*/
static fromJSON(json) {
const {
x,
y,
z,
spring,
friction,
life,
easing,
isEnabled = true
} = json;
return new Spring(x, y, z, spring, friction, life, getEasingByName(easing), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvU3ByaW5nLmpzIl0sIm5hbWVzIjpbIkJlaGF2aW91ciIsIlZlY3RvcjNEIiwiZ2V0RWFzaW5nQnlOYW1lIiwiQkVIQVZJT1VSX1RZUEVfU1BSSU5HIiwidHlwZSIsIlNwcmluZyIsImNvbnN0cnVjdG9yIiwieCIsInkiLCJ6Iiwic3ByaW5nIiwiZnJpY3Rpb24iLCJsaWZlIiwiZWFzaW5nIiwiaXNFbmFibGVkIiwicmVzZXQiLCJwb3MiLCJzZXQiLCJtdXRhdGUiLCJwYXJ0aWNsZSIsInRpbWUiLCJpbmRleCIsImVuZXJnaXplIiwidmVsb2NpdHkiLCJwb3NpdGlvbiIsImZyb21KU09OIiwianNvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsU0FBUCxNQUFzQixhQUF0QjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsU0FBekI7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFNBQWhDO0FBQ0EsU0FBU0MscUJBQXFCLElBQUlDLElBQWxDLFFBQThDLFNBQTlDO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxNQUFOLFNBQXFCTCxTQUFyQixDQUErQjtBQUM1QztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFTSxFQUFBQSxXQUFXLENBQUNDLENBQUQsRUFBSUMsQ0FBSixFQUFPQyxDQUFQLEVBQVVDLE1BQVYsRUFBa0JDLFFBQWxCLEVBQTRCQyxJQUE1QixFQUFrQ0MsTUFBbEMsRUFBMENDLFNBQVMsR0FBRyxJQUF0RCxFQUE0RDtBQUNyRSxVQUFNRixJQUFOLEVBQVlDLE1BQVosRUFBb0JULElBQXBCLEVBQTBCVSxTQUExQjtBQUVBLFNBQUtDLEtBQUwsQ0FBV1IsQ0FBWCxFQUFjQyxDQUFkLEVBQWlCQyxDQUFqQixFQUFvQkMsTUFBcEIsRUFBNEJDLFFBQTVCO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VJLEVBQUFBLEtBQUssQ0FBQ1IsQ0FBRCxFQUFJQyxDQUFKLEVBQU9DLENBQVAsRUFBVUMsTUFBVixFQUFrQkMsUUFBbEIsRUFBNEI7QUFDL0IsUUFBSSxDQUFDLEtBQUtLLEdBQVYsRUFBZTtBQUNiLFdBQUtBLEdBQUwsR0FBVyxJQUFJZixRQUFKLENBQWFNLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CQyxDQUFuQixDQUFYO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsV0FBS08sR0FBTCxDQUFTQyxHQUFULENBQWFWLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CQyxDQUFuQjtBQUNEOztBQUVELFNBQUtDLE1BQUwsR0FBY0EsTUFBTSxJQUFJLEdBQXhCO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQkEsUUFBUSxJQUFJLElBQTVCO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFTyxFQUFBQSxNQUFNLENBQUNDLFFBQUQsRUFBV0MsSUFBWCxFQUFpQkMsS0FBakIsRUFBd0I7QUFDNUIsU0FBS0MsUUFBTCxDQUFjSCxRQUFkLEVBQXdCQyxJQUF4QixFQUE4QkMsS0FBOUI7QUFFQUYsSUFBQUEsUUFBUSxDQUFDSSxRQUFULENBQWtCaEIsQ0FBbEIsSUFBdUIsQ0FBQyxLQUFLUyxHQUFMLENBQVNULENBQVQsR0FBYVksUUFBUSxDQUFDSyxRQUFULENBQWtCakIsQ0FBaEMsSUFBcUMsS0FBS0csTUFBakU7QUFDQVMsSUFBQUEsUUFBUSxDQUFDSSxRQUFULENBQWtCZixDQUFsQixJQUF1QixDQUFDLEtBQUtRLEdBQUwsQ0FBU1IsQ0FBVCxHQUFhVyxRQUFRLENBQUNLLFFBQVQsQ0FBa0JoQixDQUFoQyxJQUFxQyxLQUFLRSxNQUFqRTtBQUNBUyxJQUFBQSxRQUFRLENBQUNJLFFBQVQsQ0FBa0JkLENBQWxCLElBQXVCLENBQUMsS0FBS08sR0FBTCxDQUFTUCxDQUFULEdBQWFVLFFBQVEsQ0FBQ0ssUUFBVCxDQUFrQmYsQ0FBaEMsSUFBcUMsS0FBS0MsTUFBakU7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJlLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFVBQU07QUFBRW5CLE1BQUFBLENBQUY7QUFBS0MsTUFBQUEsQ0FBTDtBQUFRQyxNQUFBQSxDQUFSO0FBQVdDLE1BQUFBLE1BQVg7QUFBbUJDLE1BQUFBLFFBQW5CO0FBQTZCQyxNQUFBQSxJQUE3QjtBQUFtQ0MsTUFBQUEsTUFBbkM7QUFBMkNDLE1BQUFBLFNBQVMsR0FBRztBQUF2RCxRQUFnRVksSUFBdEU7QUFFQSxXQUFPLElBQUlyQixNQUFKLENBQ0xFLENBREssRUFFTEMsQ0FGSyxFQUdMQyxDQUhLLEVBSUxDLE1BSkssRUFLTEMsUUFMSyxFQU1MQyxJQU5LLEVBT0xWLGVBQWUsQ0FBQ1csTUFBRCxDQVBWLEVBUUxDLFNBUkssQ0FBUDtBQVVEOztBQTdFMkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmVoYXZpb3VyIGZyb20gJy4vQmVoYXZpb3VyJztcbmltcG9ydCB7IFZlY3RvcjNEIH0gZnJvbSAnLi4vbWF0aCc7XG5pbXBvcnQgeyBnZXRFYXNpbmdCeU5hbWUgfSBmcm9tICcuLi9lYXNlJztcbmltcG9ydCB7IEJFSEFWSU9VUl9UWVBFX1NQUklORyBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQmVoYXZpb3VyIHRoYXQgY2F1c2VzIHBhcnRpY2xlcyB0byBzcHJpbmcuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcHJpbmcgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFNwcmluZyBiZWhhdmlvdXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gWCBheGlzIHNwcmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFkgYXhpcyBzcHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBaIGF4aXMgc3ByaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzcHJpbmcgLSBTcHJpbmcgZmFjdG9yXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcmljdGlvbiAtIFNwcmluZyBmcmljdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBiZWhhdmlvdXJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWFzaW5nIC0gVGhlIGVhc2luZyBlcXVhdGlvbiB0byB1c2UgZm9yIHRyYW5zZm9ybXNcbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNFbmFibGVkPXRydWVdIC0gRGV0ZXJtaW5lcyBpZiB0aGUgYmVoYXZpb3VyIHdpbGwgYmUgYXBwbGllZCBvciBub3RcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih4LCB5LCB6LCBzcHJpbmcsIGZyaWN0aW9uLCBsaWZlLCBlYXNpbmcsIGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcsIHR5cGUsIGlzRW5hYmxlZCk7XG5cbiAgICB0aGlzLnJlc2V0KHgsIHksIHosIHNwcmluZywgZnJpY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYmVoYXZpb3VyIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gWCBheGlzIHNwcmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFkgYXhpcyBzcHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBaIGF4aXMgc3ByaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzcHJpbmcgLSBTcHJpbmcgZmFjdG9yXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcmljdGlvbiAtIFNwcmluZyBmcmljdGlvblxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIHJlc2V0KHgsIHksIHosIHNwcmluZywgZnJpY3Rpb24pIHtcbiAgICBpZiAoIXRoaXMucG9zKSB7XG4gICAgICB0aGlzLnBvcyA9IG5ldyBWZWN0b3IzRCh4LCB5LCB6KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb3Muc2V0KHgsIHksIHopO1xuICAgIH1cblxuICAgIHRoaXMuc3ByaW5nID0gc3ByaW5nIHx8IDAuMTtcbiAgICB0aGlzLmZyaWN0aW9 Line truncated
@@ -0,0 +1,11 @@
import { easeLinear } from '../ease';
export const DEFAULT_LIFE = Infinity;
export const DEFAULT_ATTRACITON_RADIUS = 1000;
export const DEFAULT_ATTRACTION_FORCE_SCALAR = 100;
export const DEFAULT_BEHAVIOUR_EASING = easeLinear;
export const DEFAULT_BEHAVIOUR_EASING_TYPE = 'easeLinear';
export const DEFAULT_RANDOM_DRIFT_DELAY = 0.03;
export const PARTICLE_ALPHA_THRESHOLD = 0.002;
export const PARTICLE_LENGTH_SQ_THRESHOLD = 0.000004;
export const DEFAULT_CROSS_TYPE = 'dead';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvY29uc3RhbnRzLmpzIl0sIm5hbWVzIjpbImVhc2VMaW5lYXIiLCJERUZBVUxUX0xJRkUiLCJJbmZpbml0eSIsIkRFRkFVTFRfQVRUUkFDSVRPTl9SQURJVVMiLCJERUZBVUxUX0FUVFJBQ1RJT05fRk9SQ0VfU0NBTEFSIiwiREVGQVVMVF9CRUhBVklPVVJfRUFTSU5HIiwiREVGQVVMVF9CRUhBVklPVVJfRUFTSU5HX1RZUEUiLCJERUZBVUxUX1JBTkRPTV9EUklGVF9ERUxBWSIsIlBBUlRJQ0xFX0FMUEhBX1RIUkVTSE9MRCIsIlBBUlRJQ0xFX0xFTkdUSF9TUV9USFJFU0hPTEQiLCJERUZBVUxUX0NST1NTX1RZUEUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVQsUUFBMkIsU0FBM0I7QUFFQSxPQUFPLE1BQU1DLFlBQVksR0FBR0MsUUFBckI7QUFDUCxPQUFPLE1BQU1DLHlCQUF5QixHQUFHLElBQWxDO0FBQ1AsT0FBTyxNQUFNQywrQkFBK0IsR0FBRyxHQUF4QztBQUNQLE9BQU8sTUFBTUMsd0JBQXdCLEdBQUdMLFVBQWpDO0FBQ1AsT0FBTyxNQUFNTSw2QkFBNkIsR0FBRyxZQUF0QztBQUNQLE9BQU8sTUFBTUMsMEJBQTBCLEdBQUcsSUFBbkM7QUFDUCxPQUFPLE1BQU1DLHdCQUF3QixHQUFHLEtBQWpDO0FBQ1AsT0FBTyxNQUFNQyw0QkFBNEIsR0FBRyxRQUFyQztBQUNQLE9BQU8sTUFBTUMsa0JBQWtCLEdBQUcsTUFBM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlYXNlTGluZWFyIH0gZnJvbSAnLi4vZWFzZSc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xJRkUgPSBJbmZpbml0eTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0FUVFJBQ0lUT05fUkFESVVTID0gMTAwMDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0FUVFJBQ1RJT05fRk9SQ0VfU0NBTEFSID0gMTAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkVIQVZJT1VSX0VBU0lORyA9IGVhc2VMaW5lYXI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9CRUhBVklPVVJfRUFTSU5HX1RZUEUgPSAnZWFzZUxpbmVhcic7XG5leHBvcnQgY29uc3QgREVGQVVMVF9SQU5ET01fRFJJRlRfREVMQVkgPSAwLjAzO1xuZXhwb3J0IGNvbnN0IFBBUlRJQ0xFX0FMUEhBX1RIUkVTSE9MRCA9IDAuMDAyO1xuZXhwb3J0IGNvbnN0IFBBUlRJQ0xFX0xFTkdUSF9TUV9USFJFU0hPTEQgPSAwLjAwMDAwNDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0NST1NTX1RZUEUgPSAnZGVhZCc7XG4iXX0=
@@ -0,0 +1,14 @@
export { default as Alpha } from './Alpha';
export { default as Attraction } from './Attraction';
export { default as Collision } from './Collision';
export { default as Color } from './Color';
export { default as CrossZone } from './CrossZone';
export { default as Force } from './Force';
export { default as Gravity } from './Gravity';
export { default as RandomDrift } from './RandomDrift';
export { default as Repulsion } from './Repulsion';
export { default as Rotate } from './Rotate';
export { default as Scale } from './Scale';
export { default as Spring } from './Spring';
export { default as Behaviour } from './Behaviour';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvaW5kZXguanMiXSwibmFtZXMiOlsiZGVmYXVsdCIsIkFscGhhIiwiQXR0cmFjdGlvbiIsIkNvbGxpc2lvbiIsIkNvbG9yIiwiQ3Jvc3Nab25lIiwiRm9yY2UiLCJHcmF2aXR5IiwiUmFuZG9tRHJpZnQiLCJSZXB1bHNpb24iLCJSb3RhdGUiLCJTY2FsZSIsIlNwcmluZyIsIkJlaGF2aW91ciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsT0FBTyxJQUFJQyxLQUFwQixRQUFpQyxTQUFqQztBQUNBLFNBQVNELE9BQU8sSUFBSUUsVUFBcEIsUUFBc0MsY0FBdEM7QUFDQSxTQUFTRixPQUFPLElBQUlHLFNBQXBCLFFBQXFDLGFBQXJDO0FBQ0EsU0FBU0gsT0FBTyxJQUFJSSxLQUFwQixRQUFpQyxTQUFqQztBQUNBLFNBQVNKLE9BQU8sSUFBSUssU0FBcEIsUUFBcUMsYUFBckM7QUFDQSxTQUFTTCxPQUFPLElBQUlNLEtBQXBCLFFBQWlDLFNBQWpDO0FBQ0EsU0FBU04sT0FBTyxJQUFJTyxPQUFwQixRQUFtQyxXQUFuQztBQUNBLFNBQVNQLE9BQU8sSUFBSVEsV0FBcEIsUUFBdUMsZUFBdkM7QUFDQSxTQUFTUixPQUFPLElBQUlTLFNBQXBCLFFBQXFDLGFBQXJDO0FBQ0EsU0FBU1QsT0FBTyxJQUFJVSxNQUFwQixRQUFrQyxVQUFsQztBQUNBLFNBQVNWLE9BQU8sSUFBSVcsS0FBcEIsUUFBaUMsU0FBakM7QUFDQSxTQUFTWCxPQUFPLElBQUlZLE1BQXBCLFFBQWtDLFVBQWxDO0FBQ0EsU0FBU1osT0FBTyxJQUFJYSxTQUFwQixRQUFxQyxhQUFyQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgQWxwaGEgfSBmcm9tICcuL0FscGhhJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQXR0cmFjdGlvbiB9IGZyb20gJy4vQXR0cmFjdGlvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENvbGxpc2lvbiB9IGZyb20gJy4vQ29sbGlzaW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ29sb3IgfSBmcm9tICcuL0NvbG9yJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3Jvc3Nab25lIH0gZnJvbSAnLi9Dcm9zc1pvbmUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JjZSB9IGZyb20gJy4vRm9yY2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBHcmF2aXR5IH0gZnJvbSAnLi9HcmF2aXR5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmFuZG9tRHJpZnQgfSBmcm9tICcuL1JhbmRvbURyaWZ0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmVwdWxzaW9uIH0gZnJvbSAnLi9SZXB1bHNpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBSb3RhdGUgfSBmcm9tICcuL1JvdGF0ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNjYWxlIH0gZnJvbSAnLi9TY2FsZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNwcmluZyB9IGZyb20gJy4vU3ByaW5nJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQmVoYXZpb3VyIH0gZnJvbSAnLi9CZWhhdmlvdXInO1xuIl19
@@ -0,0 +1,14 @@
export const BEHAVIOUR_TYPE_ABSTRACT = 'Behaviour';
export const BEHAVIOUR_TYPE_ALPHA = 'Alpha';
export const BEHAVIOUR_TYPE_ATTRACTION = 'Attraction';
export const BEHAVIOUR_TYPE_COLLISION = 'Collision';
export const BEHAVIOUR_TYPE_COLOR = 'Color';
export const BEHAVIOUR_TYPE_CROSS_ZONE = 'CrossZone';
export const BEHAVIOUR_TYPE_FORCE = 'Force';
export const BEHAVIOUR_TYPE_GRAVITY = 'Gravity';
export const BEHAVIOUR_TYPE_RANDOM_DRIFT = 'RandomDrift';
export const BEHAVIOUR_TYPE_REPULSION = 'Repulsion';
export const BEHAVIOUR_TYPE_ROTATE = 'Rotate';
export const BEHAVIOUR_TYPE_SCALE = 'Scale';
export const BEHAVIOUR_TYPE_SPRING = 'Spring';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvdHlwZXMuanMiXSwibmFtZXMiOlsiQkVIQVZJT1VSX1RZUEVfQUJTVFJBQ1QiLCJCRUhBVklPVVJfVFlQRV9BTFBIQSIsIkJFSEFWSU9VUl9UWVBFX0FUVFJBQ1RJT04iLCJCRUhBVklPVVJfVFlQRV9DT0xMSVNJT04iLCJCRUhBVklPVVJfVFlQRV9DT0xPUiIsIkJFSEFWSU9VUl9UWVBFX0NST1NTX1pPTkUiLCJCRUhBVklPVVJfVFlQRV9GT1JDRSIsIkJFSEFWSU9VUl9UWVBFX0dSQVZJVFkiLCJCRUhBVklPVVJfVFlQRV9SQU5ET01fRFJJRlQiLCJCRUhBVklPVVJfVFlQRV9SRVBVTFNJT04iLCJCRUhBVklPVVJfVFlQRV9ST1RBVEUiLCJCRUhBVklPVVJfVFlQRV9TQ0FMRSIsIkJFSEFWSU9VUl9UWVBFX1NQUklORyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSx1QkFBdUIsR0FBRyxXQUFoQztBQUNQLE9BQU8sTUFBTUMsb0JBQW9CLEdBQUcsT0FBN0I7QUFDUCxPQUFPLE1BQU1DLHlCQUF5QixHQUFHLFlBQWxDO0FBQ1AsT0FBTyxNQUFNQyx3QkFBd0IsR0FBRyxXQUFqQztBQUNQLE9BQU8sTUFBTUMsb0JBQW9CLEdBQUcsT0FBN0I7QUFDUCxPQUFPLE1BQU1DLHlCQUF5QixHQUFHLFdBQWxDO0FBQ1AsT0FBTyxNQUFNQyxvQkFBb0IsR0FBRyxPQUE3QjtBQUNQLE9BQU8sTUFBTUMsc0JBQXNCLEdBQUcsU0FBL0I7QUFDUCxPQUFPLE1BQU1DLDJCQUEyQixHQUFHLGFBQXBDO0FBQ1AsT0FBTyxNQUFNQyx3QkFBd0IsR0FBRyxXQUFqQztBQUNQLE9BQU8sTUFBTUMscUJBQXFCLEdBQUcsUUFBOUI7QUFDUCxPQUFPLE1BQU1DLG9CQUFvQixHQUFHLE9BQTdCO0FBQ1AsT0FBTyxNQUFNQyxxQkFBcUIsR0FBRyxRQUE5QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBCRUhBVklPVVJfVFlQRV9BQlNUUkFDVCA9ICdCZWhhdmlvdXInO1xuZXhwb3J0IGNvbnN0IEJFSEFWSU9VUl9UWVBFX0FMUEhBID0gJ0FscGhhJztcbmV4cG9ydCBjb25zdCBCRUhBVklPVVJfVFlQRV9BVFRSQUNUSU9OID0gJ0F0dHJhY3Rpb24nO1xuZXhwb3J0IGNvbnN0IEJFSEFWSU9VUl9UWVBFX0NPTExJU0lPTiA9ICdDb2xsaXNpb24nO1xuZXhwb3J0IGNvbnN0IEJFSEFWSU9VUl9UWVBFX0NPTE9SID0gJ0NvbG9yJztcbmV4cG9ydCBjb25zdCBCRUhBVklPVVJfVFlQRV9DUk9TU19aT05FID0gJ0Nyb3NzWm9uZSc7XG5leHBvcnQgY29uc3QgQkVIQVZJT1VSX1RZUEVfRk9SQ0UgPSAnRm9yY2UnO1xuZXhwb3J0IGNvbnN0IEJFSEFWSU9VUl9UWVBFX0dSQVZJVFkgPSAnR3Jhdml0eSc7XG5leHBvcnQgY29uc3QgQkVIQVZJT1VSX1RZUEVfUkFORE9NX0RSSUZUID0gJ1JhbmRvbURyaWZ0JztcbmV4cG9ydCBjb25zdCBCRUhBVklPVVJfVFlQRV9SRVBVTFNJT04gPSAnUmVwdWxzaW9uJztcbmV4cG9ydCBjb25zdCBCRUhBVklPVVJfVFlQRV9ST1RBVEUgPSAnUm90YXRlJztcbmV4cG9ydCBjb25zdCBCRUhBVklPVVJfVFlQRV9TQ0FMRSA9ICdTY2FsZSc7XG5leHBvcnQgY29uc3QgQkVIQVZJT1VSX1RZUEVfU1BSSU5HID0gJ1NwcmluZyc7XG4iXX0=
@@ -0,0 +1,43 @@
// export const PI = 3.142;
export const PI = Math.PI;
/**
* The max particle number in pool.
*
* @const {integer}
*/
export const POOL_MAX = 500;
export const TIME_STEP = 60;
export const DR = PI / 180;
/**
* 1:100
*
* @const {integer}
*/
export const MEASURE = 100;
export const EULER = 'euler';
export const RK2 = 'runge-kutta2';
export const RK4 = 'runge-kutta4';
export const VERLET = 'verlet';
export const BIND_EMITTER_EVENT = false;
export const __DEV__ = () => {
if (!process) {
return false;
}
if (!process.env) {
return false;
}
if (!process.env.NODE_ENV) {
return false;
}
if (process.env.NODE_ENV !== 'development') {
return false;
}
return true;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb25zdGFudHMvaW5kZXguanMiXSwibmFtZXMiOlsiUEkiLCJQT09MX01BWCIsIlRJTUVfU1RFUCIsIkRSIiwiTUVBU1VSRSIsIkVVTEVSIiwiUksyIiwiUks0IiwiVkVSTEVUIiwiQklORF9FTUlUVEVSX0VWRU5UIiwiX19ERVZfXyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxFQUFFLEdBQUcsS0FBWDtBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxRQUFRLEdBQUcsR0FBakI7QUFDUCxPQUFPLE1BQU1DLFNBQVMsR0FBRyxFQUFsQjtBQUNQLE9BQU8sTUFBTUMsRUFBRSxHQUFHSCxFQUFFLEdBQUcsR0FBaEI7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTUksT0FBTyxHQUFHLEdBQWhCO0FBQ1AsT0FBTyxNQUFNQyxLQUFLLEdBQUcsT0FBZDtBQUNQLE9BQU8sTUFBTUMsR0FBRyxHQUFHLGNBQVo7QUFDUCxPQUFPLE1BQU1DLEdBQUcsR0FBRyxjQUFaO0FBQ1AsT0FBTyxNQUFNQyxNQUFNLEdBQUcsUUFBZjtBQUNQLE9BQU8sTUFBTUMsa0JBQWtCLEdBQUcsS0FBM0I7QUFFUCxPQUFPLE1BQU1DLE9BQU8sR0FBRyxNQUFNO0FBQzNCLE1BQUksQ0FBQ0MsT0FBTCxFQUFjO0FBQ1osV0FBTyxLQUFQO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDQSxPQUFPLENBQUNDLEdBQWIsRUFBa0I7QUFDaEIsV0FBTyxLQUFQO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDRCxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsUUFBakIsRUFBMkI7QUFDekIsV0FBTyxLQUFQO0FBQ0Q7O0FBRUQsTUFBSUYsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFFBQVosS0FBeUIsYUFBN0IsRUFBNEM7QUFDMUMsV0FBTyxLQUFQO0FBQ0Q7O0FBRUQsU0FBTyxJQUFQO0FBQ0QsQ0FsQk0iLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUEkgPSAzLjE0MjtcblxuLyoqXG4gKiBUaGUgbWF4IHBhcnRpY2xlIG51bWJlciBpbiBwb29sLlxuICpcbiAqIEBjb25zdCB7aW50ZWdlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IFBPT0xfTUFYID0gNTAwO1xuZXhwb3J0IGNvbnN0IFRJTUVfU1RFUCA9IDYwO1xuZXhwb3J0IGNvbnN0IERSID0gUEkgLyAxODA7XG5cbi8qKlxuICogMToxMDBcbiAqXG4gKiBAY29uc3Qge2ludGVnZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBNRUFTVVJFID0gMTAwO1xuZXhwb3J0IGNvbnN0IEVVTEVSID0gJ2V1bGVyJztcbmV4cG9ydCBjb25zdCBSSzIgPSAncnVuZ2Uta3V0dGEyJztcbmV4cG9ydCBjb25zdCBSSzQgPSAncnVuZ2Uta3V0dGE0JztcbmV4cG9ydCBjb25zdCBWRVJMRVQgPSAndmVybGV0JztcbmV4cG9ydCBjb25zdCBCSU5EX0VNSVRURVJfRVZFTlQgPSBmYWxzZTtcblxuZXhwb3J0IGNvbnN0IF9fREVWX18gPSAoKSA9PiB7XG4gIGlmICghcHJvY2Vzcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghcHJvY2Vzcy5lbnYpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIXByb2Nlc3MuZW52Lk5PREVfRU5WKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIl19
@@ -0,0 +1,357 @@
import { DEFAULT_AGE, DEFAULT_ALPHA, DEFAULT_BODY, DEFAULT_DEAD, DEFAULT_EASING, DEFAULT_ENERGY, DEFAULT_LIFE, DEFAULT_MASS, DEFAULT_PARENT, DEFAULT_RADIUS, DEFAULT_SCALE, DEFAULT_SLEEP, DEFAULT_USE_ALPHA, DEFAULT_USE_COLOR } from './constants';
import { Util, uid } from '../utils';
import { PI } from '../constants';
import { Vector3D } from '../math';
import { CORE_TYPE_PARTICLE as type } from './types';
/**
* A Particle is an object that is emitted by an emitter.
*
*/
export default class Particle {
/**
* Constructs a Particle instance.
*
* @param {object} properties - The properties to instantiate the particle with
* @property {number} properties.life - The particle's life
* @property {number} properties.age - The particle's age
* @property {number} properties.energy - The particle's energy loss
* @property {boolean} properties.dead - Determines if the particle is dead or not
* @property {boolean} properties.sleep - Determines if the particle is sleeping or not
* @property {object} properties.target - The particle's target
* @property {object} properties.body - The particle's body
* @property {number} properties.mass - The particle's mass
* @property {number} properties.radius - The particle's radius
* @property {number} properties.alpha - The particle's alpha
* @property {number} properties.scale - The particle's scale
* @property {Vector3D} properties.rotation - The particle's rotation
* @property {string|number} properties.color - The particle's color
* @property {function} properties.easing - The particle's easing
* @property {Vector3D} properties.position - The particle's position
* @property {Vector3D} properties.velocity - The particle's velocity
* @property {Vector3D} properties.acceleration - The particle's acceleration
* @property {array} properties.behaviours - The particle's behaviours array
* @property {object} properties.transform - The particle's transform collection
* @return void
*/
constructor(properties) {
/**
* @desc The particle's unique id
* @type {number}
*/
this.id = `particle-${uid()}`;
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
/**
* @desc The particle's life
* @type {number}
*/
this.life = DEFAULT_LIFE;
/**
* @desc The particle's age
* @type {number}
*/
this.age = DEFAULT_AGE;
/**
* @desc The particle's energy loss
* @type {number}
*/
this.energy = DEFAULT_ENERGY;
/**
* @desc Determines if the particle is dead or not
* @type {number}
*/
this.dead = DEFAULT_DEAD;
/**
* @desc Determines if the particle is sleeping or not
* @type {number}
*/
this.sleep = DEFAULT_SLEEP;
/**
* @desc The particle's body
* @type {object}
*/
this.body = DEFAULT_BODY;
/**
* @desc The particle's parent
* @type {?Emitter}
*/
this.parent = DEFAULT_PARENT;
/**
* @desc The particle's mass
* @type {number}
*/
this.mass = DEFAULT_MASS;
/**
* @desc The particle's radius
* @type {number}
*/
this.radius = DEFAULT_RADIUS;
/**
* @desc The particle's alpha
* @type {number}
*/
this.alpha = DEFAULT_ALPHA;
/**
* @desc The particle's scale
* @type {number}
*/
this.scale = DEFAULT_SCALE;
/**
* @desc Determines whether to use color or not
* @type {boolean}
*/
this.useColor = DEFAULT_USE_COLOR;
/**
* @desc Determines whether to use alpha or not
* @type {boolean}
*/
this.useAlpha = DEFAULT_USE_ALPHA;
/**
* @desc The particle's easing
* @type {string}
*/
this.easing = DEFAULT_EASING;
/**
* @desc The particle's position
* @type {Vector3D}
*/
this.position = new Vector3D();
/**
* @desc The particle's velocity
* @type {Vector3D}
*/
this.velocity = new Vector3D();
/**
* @desc The particle's acceleration
* @type {Vector3D}
*/
this.acceleration = new Vector3D();
/**
* @desc The particle's last position, velocity and acceleration
* @type {Vector3D}
*/
this.old = {};
/**
* @desc The particle's old position
* @type {Vector3D}
*/
this.old.position = this.position.clone();
/**
* @desc The particle's old velocity
* @type {Vector3D}
*/
this.old.velocity = this.velocity.clone();
/**
* @desc The particle's old acceleration
* @type {Vector3D}
*/
this.old.acceleration = this.acceleration.clone();
/**
* @desc The particle's behaviours array
* @type {array}
*/
this.behaviours = [];
/**
* @desc The particle's transform collection
* @type {object}
*/
this.transform = {};
/**
* @desc The particle's color store
* @type {object}
*/
this.color = {
r: 0,
g: 0,
b: 0
};
/**
* @desc The particle's rotation
* @type {Vector3D}
*/
this.rotation = new Vector3D();
/**
* @desc The particle's distance to the camera, only set by the GPURenderer for depth sorting purposes.
* @type {number}
*/
this.distanceToCamera = 0; // override constructor props with passed properties.
Util.setPrototypeByObj(this, properties);
}
/**
* Gets the particle's current direction.
*
* @return {number}
*/
getDirection() {
return Math.atan2(this.velocity.x, -this.velocity.y) * (180 / PI);
}
/**
* Resets the particle's default properties and clear's its particle's position,
* velocity, acceleration, color and rotation. Also destroy's the particle's
* transform collection & removes all behaviours.
*
* @return {Particle}
*/
reset() {
this.life = DEFAULT_LIFE;
this.age = DEFAULT_AGE;
this.energy = DEFAULT_ENERGY;
this.dead = DEFAULT_DEAD;
this.sleep = DEFAULT_SLEEP;
this.body = DEFAULT_BODY;
this.parent = DEFAULT_PARENT;
this.mass = DEFAULT_MASS;
this.radius = DEFAULT_RADIUS;
this.alpha = DEFAULT_ALPHA;
this.scale = DEFAULT_SCALE;
this.useColor = DEFAULT_USE_COLOR;
this.useAlpha = DEFAULT_USE_ALPHA;
this.easing = DEFAULT_EASING;
this.position.set(0, 0, 0);
this.velocity.set(0, 0, 0);
this.acceleration.set(0, 0, 0);
this.old.position.set(0, 0, 0);
this.old.velocity.set(0, 0, 0);
this.old.acceleration.set(0, 0, 0);
this.color.r = 0;
this.color.g = 0;
this.color.b = 0;
this.rotation.clear();
Util.destroyObject(this.transform);
this.removeAllBehaviours();
return this;
}
/**
* Updates the particle's properties by applying each behaviour to the particle.
* Will also update the particle's energy, unless it's age is greater than it's life
* in which case it will be destroyed.
*
* @param {number} time - Integration time
* @param {integer} index - Particle index
* @return void
*/
update(time, index) {
if (!this.sleep) {
this.age += time;
let i = this.behaviours.length;
while (i--) {
let behaviour = this.behaviours[i]; //behaviour &&
behaviour.applyBehaviour(this, time, index);
}
}
if (this.age >= this.life) {
this.destroy();
} else {
const scale = this.easing(this.age / this.life);
this.energy = Math.max(1 - scale, 0);
}
}
/**
* Adds a behaviour to the particle.
*
* @param {Behaviour} behaviour - The behaviour to add to the particle
* @return void
*/
addBehaviour(behaviour) {
this.behaviours.push(behaviour);
behaviour.initialize(this);
}
/**
* Adds multiple behaviours to the particle.
*
* @param {array<Behaviour>} behaviours - An array of behaviours to add to the particle
* @return void
*/
addBehaviours(behaviours) {
let i = behaviours.length;
while (i--) {
this.addBehaviour(behaviours[i]);
}
}
/**
* Removes the behaviour from the particle.
*
* @param {Behaviour} behaviour - The behaviour to remove from the particle
* @return void
*/
removeBehaviour(behaviour) {
const index = this.behaviours.indexOf(behaviour);
if (index > -1) {
this.behaviours.splice(index, 1);
}
}
/**
* Removes all behaviours from the particle.
*
* @return void
*/
removeAllBehaviours() {
Util.destroyArray(this.behaviours);
}
/**
* Destroys the particle.
*
* @return void
*/
destroy() {
this.removeAllBehaviours();
this.energy = 0;
this.dead = true;
this.parent = null;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL1BhcnRpY2xlLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQUdFIiwiREVGQVVMVF9BTFBIQSIsIkRFRkFVTFRfQk9EWSIsIkRFRkFVTFRfREVBRCIsIkRFRkFVTFRfRUFTSU5HIiwiREVGQVVMVF9FTkVSR1kiLCJERUZBVUxUX0xJRkUiLCJERUZBVUxUX01BU1MiLCJERUZBVUxUX1BBUkVOVCIsIkRFRkFVTFRfUkFESVVTIiwiREVGQVVMVF9TQ0FMRSIsIkRFRkFVTFRfU0xFRVAiLCJERUZBVUxUX1VTRV9BTFBIQSIsIkRFRkFVTFRfVVNFX0NPTE9SIiwiVXRpbCIsInVpZCIsIlBJIiwiVmVjdG9yM0QiLCJDT1JFX1RZUEVfUEFSVElDTEUiLCJ0eXBlIiwiUGFydGljbGUiLCJjb25zdHJ1Y3RvciIsInByb3BlcnRpZXMiLCJpZCIsImxpZmUiLCJhZ2UiLCJlbmVyZ3kiLCJkZWFkIiwic2xlZXAiLCJib2R5IiwicGFyZW50IiwibWFzcyIsInJhZGl1cyIsImFscGhhIiwic2NhbGUiLCJ1c2VDb2xvciIsInVzZUFscGhhIiwiZWFzaW5nIiwicG9zaXRpb24iLCJ2ZWxvY2l0eSIsImFjY2VsZXJhdGlvbiIsIm9sZCIsImNsb25lIiwiYmVoYXZpb3VycyIsInRyYW5zZm9ybSIsImNvbG9yIiwiciIsImciLCJiIiwicm90YXRpb24iLCJkaXN0YW5jZVRvQ2FtZXJhIiwic2V0UHJvdG90eXBlQnlPYmoiLCJnZXREaXJlY3Rpb24iLCJNYXRoIiwiYXRhbjIiLCJ4IiwieSIsInJlc2V0Iiwic2V0IiwiY2xlYXIiLCJkZXN0cm95T2JqZWN0IiwicmVtb3ZlQWxsQmVoYXZpb3VycyIsInVwZGF0ZSIsInRpbWUiLCJpbmRleCIsImkiLCJsZW5ndGgiLCJiZWhhdmlvdXIiLCJhcHBseUJlaGF2aW91ciIsImRlc3Ryb3kiLCJtYXgiLCJhZGRCZWhhdmlvdXIiLCJwdXNoIiwiaW5pdGlhbGl6ZSIsImFkZEJlaGF2aW91cnMiLCJyZW1vdmVCZWhh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 Line truncated
@@ -0,0 +1,161 @@
import PUID from '../utils/PUID';
import { CORE_TYPE_POOL as type } from './types';
/**
* An object pool implementation. Used for pooling objects to avoid unnecessary
* garbage collection.
*
*/
export default class Pool {
/**
* Constructs a Pool instance.
*
* @return void
*/
constructor() {
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
/**
* @desc Incrementing id that keeps a count of the number of objects created
* @type {integer}
*/
this.cID = 0;
/**
* @desc Map of pools in the format of PUID<String>: pool<Array>
* @type {object}
*/
this.list = {};
}
/**
* Attempts to create a new object either by creating a new instance or calling its
* clone method.
*
* TODO COVERAGE - for the constructorArgs
* @param {function|object} functionOrObject - The object to instantiate or clone
* @return {object|undefined}
*/
create(functionOrObject, ...constructorArgs) {
if (!this.canCreateNewObject(functionOrObject)) {
throw new Error('The pool is unable to create or clone the object supplied');
}
this.cID++;
if (this.canInstantiateObject(functionOrObject)) {
return new functionOrObject(...constructorArgs);
}
if (this.canCloneObject(functionOrObject)) {
return functionOrObject.clone();
}
}
/**
* Determines if the object is able to be instantiated or not.
*
* @param {object} object - The object to check
* @return {boolean}
*/
canInstantiateObject(object) {
return typeof object === 'function';
}
/**
* Determines if the object is able to be cloned or not.
*
* @param {object} object - The object to check
* @return {boolean}
*/
canCloneObject(object) {
return object.clone && typeof object.clone === 'function';
}
/**
* Determines if a new object is able to be created.
*
* @param {object} object - The object to check
* @return {boolean}
*/
canCreateNewObject(object) {
return this.canInstantiateObject(object) || this.canCloneObject(object) ? true : false;
}
/**
* Gets a count of all objects in the pool.
*
* @return {integer}
*/
getCount() {
var count = 0;
for (var id in this.list) count += this.list[id].length;
return count++;
}
/**
* Gets an object either by creating a new one or retrieving it from the pool.
*
* @param {function|object} obj - The function or object to get
* @param {array} args - The args to pass to the function on creation
* @return {object}
*/
get(obj, ...args) {
var p,
puid = obj.__puid || PUID.id(obj);
if (this.list[puid] && this.list[puid].length > 0) p = this.list[puid].pop();else p = this.create(obj, ...args);
p.__puid = obj.__puid || puid;
return p;
}
/**
* Pushes an object into the pool.
*
* @param {object} obj - The object to expire
* @return {integer}
*/
expire(obj) {
return this._getList(obj.__puid).push(obj);
}
/**
* Destroys all pools.
*
* @return void
*/
destroy() {
for (var id in this.list) {
this.list[id].length = 0;
delete this.list[id];
}
}
/**
* Gets the pool mapped to the UID.
*
* @param {string} uid - The pool uid
* @return {array}
*/
_getList(uid) {
uid = uid || 'default';
if (!this.list[uid]) this.list[uid] = [];
return this.list[uid];
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL1Bvb2wuanMiXSwibmFtZXMiOlsiUFVJRCIsIkNPUkVfVFlQRV9QT09MIiwidHlwZSIsIlBvb2wiLCJjb25zdHJ1Y3RvciIsImNJRCIsImxpc3QiLCJjcmVhdGUiLCJmdW5jdGlvbk9yT2JqZWN0IiwiY29uc3RydWN0b3JBcmdzIiwiY2FuQ3JlYXRlTmV3T2JqZWN0IiwiRXJyb3IiLCJjYW5JbnN0YW50aWF0ZU9iamVjdCIsImNhbkNsb25lT2JqZWN0IiwiY2xvbmUiLCJvYmplY3QiLCJnZXRDb3VudCIsImNvdW50IiwiaWQiLCJsZW5ndGgiLCJnZXQiLCJvYmoiLCJhcmdzIiwicCIsInB1aWQiLCJfX3B1aWQiLCJwb3AiLCJleHBpcmUiLCJfZ2V0TGlzdCIsInB1c2giLCJkZXN0cm95IiwidWlkIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxJQUFQLE1BQWlCLGVBQWpCO0FBQ0EsU0FBU0MsY0FBYyxJQUFJQyxJQUEzQixRQUF1QyxTQUF2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxJQUFOLENBQVc7QUFDeEI7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNFQyxFQUFBQSxXQUFXLEdBQUc7QUFDWjtBQUNKO0FBQ0E7QUFDQTtBQUNJLFNBQUtGLElBQUwsR0FBWUEsSUFBWjtBQUNBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtHLEdBQUwsR0FBVyxDQUFYO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0MsSUFBTCxHQUFZLEVBQVo7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFQyxFQUFBQSxNQUFNLENBQUNDLGdCQUFELEVBQW1CLEdBQUdDLGVBQXRCLEVBQXVDO0FBQzNDLFFBQUksQ0FBQyxLQUFLQyxrQkFBTCxDQUF3QkYsZ0JBQXhCLENBQUwsRUFBZ0Q7QUFDOUMsWUFBTSxJQUFJRyxLQUFKLENBQ0osMkRBREksQ0FBTjtBQUdEOztB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QUFpQixFQUFqQjtBQUVyQixXQUFPLEtBQUt6QixJQUFMLENBQVV5QixHQUFWLENBQVA7QUFDRDs7QUFySnVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBVSUQgZnJvbSAnLi4vdXRpbHMvUFVJRCc7XG5pbXBvcnQgeyBDT1JFX1RZUEVfUE9PTCBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIEFuIG9iamVjdCBwb29sIGltcGxlbWVudGF0aW9uLiBVc2VkIGZvciBwb29saW5nIG9iamVjdHMgdG8gYXZvaWQgdW5uZWNlc3NhcnlcbiAqIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvb2wge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBvb2wgaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNsYXNzIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIEluY3JlbWVudGluZyBpZCB0aGF0IGtlZXBzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBvYmplY3RzIGNyZWF0ZWRcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cbiAgICAgKi9cbiAgICB0aGlzLmNJRCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBNYXAgb2YgcG9vbHMgaW4gdGhlIGZvcm1hdCBvZiBQVUlEPFN0cmluZz46IHBvb2w8QXJyYXk+XG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmxpc3QgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGVpdGhlciBieSBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvciBjYWxsaW5nIGl0c1xuICAgKiBjbG9uZSBtZXRob2QuXG4gICAqXG4gICAqIFRPRE8gQ09WRVJBR0UgLSBmb3IgdGhlIGNvbnN0cnVjdG9yQXJnc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufG9iamVjdH0gZnVuY3Rpb25Pck9iamVjdCA Line truncated
@@ -0,0 +1,324 @@
import EventDispatcher, { EMITTER_ADDED, EMITTER_REMOVED, SYSTEM_UPDATE, SYSTEM_UPDATE_AFTER } from '../events';
import { DEFAULT_SYSTEM_DELTA } from './constants';
import Emitter from '../emitter/Emitter';
import { INTEGRATION_TYPE_EULER } from '../math/constants';
import { POOL_MAX } from '../constants';
import Pool from './Pool';
import fromJSON from './fromJSON';
import fromJSONAsync from './fromJSONAsync';
import { CORE_TYPE_SYSTEM as type } from './types';
/**
* The core of the three-system particle engine.
* A System instance can contain multiple emitters, each with their own initializers
* and behaviours.
*
*/
export default class System {
/**
* Constructs a System instance.
*
* @param {object} THREE - ThreeJs
* @param {number} [preParticles=POOL_MAX] - The number of particles to start with
* @param {string} [integrationType=INTEGRATION_TYPE_EULER] - The integration type to use
* @return void
*/
constructor(preParticles = POOL_MAX, integrationType = INTEGRATION_TYPE_EULER) {
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
/**
* @desc The system name.
* @type {string}
*/
this.name = '';
/**
* @desc Determines if the system can update or not. Set to false when destroying
* to ensure that external calls to update do not throw errors.
* @type {boolean}
*/
this.canUpdate = true;
/**
* @desc The number of particles to start with.
* @type {number}
*/
this.preParticles = preParticles;
/**
* @desc The integration algorithm type to use.
* @param {string}
*/
this.integrationType = integrationType;
/**
* @desc The emitters in the particle system.
* @type {array<Emitter>}
*/
this.emitters = [];
/**
* @desc The renderers for the system.
* @type {array<Renderer>}
*/
this.renderers = [];
/**
* @desc A pool used to manage the internal system cache of objects
* @type {Pool}
*/
this.pool = new Pool();
/**
* @desc Internal event dispatcher
* @type {EventDispatcher}
*/
this.eventDispatcher = new EventDispatcher();
}
/**
* Creates a System instance from a JSON object.
*
* @param {object} json - The JSON to create the System instance from
* @param {object} THREE - The Web GL Api to use eg., THREE
* @return {System}
*
* @deprecated use fromJSONAsync instead
*/
static fromJSON(json, THREE) {
return fromJSON(json, THREE, System, Emitter);
}
/**
* Loads a System instance from JSON asynchronously. Ensures all textures are
* fully loaded before resolving with the instantiated System instance.
*
* @param {object} json - The JSON to create the System instance from
* @param {object} THREE - The Web GL Api to use eg., THREE
* @param {?object} options - Optional config options
* @return {Promise<System>}
*/
static fromJSONAsync(json, THREE, options) {
return fromJSONAsync(json, THREE, System, Emitter, options);
}
/**
* Proxy method for the internal event dispatcher's dispatchEvent method.
*
* @param {string} event - The event to dispatch
* @param {object<System|Emitter|Particle>} [target=this] - The event target
*/
dispatch(event, target = this) {
this.eventDispatcher.dispatchEvent(event, target);
}
/**
* Adds a renderer to the System instance and initializes it.
*
* @param {Renderer} renderer - The renderer to add
* @return {System}
*/
addRenderer(renderer) {
this.renderers.push(renderer);
renderer.init(this);
return this;
}
/**
* Removes a renderer from the System instance.
*
* @param {Renderer} renderer
* @return {System}
*/
removeRenderer(renderer) {
this.renderers.splice(this.renderers.indexOf(renderer), 1);
renderer.remove(this);
return this;
}
/**
* Adds an emitter to the System instance.
* Dispatches the EMITTER_ADDED event.
*
* @param {Emitter} emitter - The emitter to add
* @return {System}
*/
addEmitter(emitter) {
const index = this.emitters.length;
emitter.parent = this;
emitter.index = index;
this.emitters.push(emitter);
this.dispatch(EMITTER_ADDED, emitter);
return this;
}
/**
* Removes an emitter from the System instance.
* Dispatches the EMITTER_REMOVED event.
*
* @param {Emitter} emitter - The emitter to remove
* @return {System}
*/
removeEmitter(emitter) {
if (emitter.parent !== this) {
return this;
}
emitter.parent = null;
emitter.index = undefined;
this.emitters.splice(this.emitters.indexOf(emitter), 1);
this.dispatch(EMITTER_REMOVED, emitter);
return this;
}
/**
* Wires up life cycle methods and causes a system's emitters to emit particles.
* Expects emitters to have their totalEmitTimes and life set already.
* Inifnite systems will resolve immediately.
*
* @param {object} hooks - Functions to hook into the life cycle API
* @param {function} hooks.onStart - Called when the system starts to emit particles
* @param {function} hooks.onUpdate - Called each time the system updates
* @param {function} hooks.onEnd - Called when the system's emitters have all died
* @return {Promise}
*/
emit({
onStart,
onUpdate,
onEnd
}) {
if (onStart) {
onStart();
}
if (onUpdate) {
this.eventDispatcher.addEventListener(SYSTEM_UPDATE, onUpdate);
}
const emitters = this.emitters.map(emitter => {
const {
life
} = emitter;
if (life === Infinity) {
if (onEnd) {
onEnd();
}
emitter.experimental_emit();
return Promise.resolve();
}
return new Promise(resolve => {
emitter.addOnEmitterDeadEventListener(() => {
if (onEnd) {
onEnd();
}
resolve();
});
emitter.experimental_emit();
});
});
try {
return Promise.all(emitters);
} catch (e) {
console.warn(e);
}
}
/**
* Updates the particle system based on the delta passed.
*
* @example
* animate = () => {
* threeRenderer.render(threeScene, threeCamera);
* system.update();
* requestAnimationFrame(animate);
* }
* animate();
*
* @param {number} delta - Delta time
* @return {Promise}
*/
update(delta = DEFAULT_SYSTEM_DELTA) {
const d = delta || DEFAULT_SYSTEM_DELTA;
if (this.canUpdate) {
if (d > 0) {
let i = this.emitters.length;
while (i--) {
const emitter = this.emitters[i];
emitter.update(d);
emitter.particles.length && this.dispatch(SYSTEM_UPDATE);
}
}
this.dispatch(SYSTEM_UPDATE_AFTER);
}
return Promise.resolve();
}
/**
* Gets a count of the total number of particles in the system.
*
* @return {integer}
*/
getCount() {
const length = this.emitters.length;
let total = 0;
let i;
for (i = 0; i < length; i++) {
total += this.emitters[i].particles.length;
}
return total;
}
/**
* Destroys all emitters, renderers and the Nebula pool.
* Ensures that this.update will not perform any operations while the system
* is being destroyed.
*
* @return void
*/
destroy() {
const length = this.emitters.length;
this.canUpdate = false;
for (let e = 0; e < length; e++) {
this.emitters[e] && this.emitters[e].destroy();
delete this.emitters[e];
}
for (let r = 0; r < length; r++) {
if (this.renderers[r] && this.renderers[r].destroy) {
this.renderers[r].destroy();
delete this.renderers[r];
}
}
this.emitters.length = 0;
this.pool.destroy();
this.canUpdate = true;
}
}
@@ -0,0 +1,127 @@
import { BEHAVIOUR_TYPE_ALPHA, BEHAVIOUR_TYPE_ATTRACTION, BEHAVIOUR_TYPE_COLOR, BEHAVIOUR_TYPE_CROSS_ZONE, BEHAVIOUR_TYPE_FORCE, BEHAVIOUR_TYPE_GRAVITY, BEHAVIOUR_TYPE_RANDOM_DRIFT, BEHAVIOUR_TYPE_REPULSION, BEHAVIOUR_TYPE_ROTATE, BEHAVIOUR_TYPE_SCALE, BEHAVIOUR_TYPE_SPRING } from '../behaviour/types';
import { INITIALIZER_TYPE_BODY, INITIALIZER_TYPE_BODY_SPRITE, INITIALIZER_TYPE_LIFE, INITIALIZER_TYPE_MASS, INITIALIZER_TYPE_POLAR_VELOCITY, INITIALIZER_TYPE_POSITION, INITIALIZER_TYPE_ROTATION, INITIALIZER_TYPE_RADIAL_VELOCITY, INITIALIZER_TYPE_RADIUS, INITIALIZER_TYPE_TEXTURE, INITIALIZER_TYPE_VECTOR_VELOCITY } from '../initializer/types';
import { ZONE_TYPE_BOX, ZONE_TYPE_LINE, ZONE_TYPE_MESH, ZONE_TYPE_POINT, ZONE_TYPE_SPHERE } from '../zone/types';
import { RENDERER_TYPE_SPRITE } from '../renderer/types';
import { easeLinear } from '../ease';
/**
* @desc Default particle life
* @type {number}
*/
export const DEFAULT_LIFE = Infinity;
/**
* @desc Default particle age
* @type {number}
*/
export const DEFAULT_AGE = 0;
/**
* @desc Default particle energy
* @type {number}
*/
export const DEFAULT_ENERGY = 1;
/**
* @desc Default particle dead
* @type {boolean}
*/
export const DEFAULT_DEAD = false;
/**
* @desc Default particle sleep
* @type {boolean}
*/
export const DEFAULT_SLEEP = false;
/**
* @desc Default particle index
* @type {number}
*/
export const DEFAULT_INDEX = 0;
/**
* @desc Default particle body
* @type {?object}
*/
export const DEFAULT_BODY = null;
/**
* @desc Default particle parent
* @type {?Emitter}
*/
export const DEFAULT_PARENT = null;
/**
* @desc Default particle mass
* @type {number}
*/
export const DEFAULT_MASS = 1;
/**
* @desc Default particle radius
* @type {number}
*/
export const DEFAULT_RADIUS = 10;
/**
* @desc Default particle alpha
* @type {number}
*/
export const DEFAULT_ALPHA = 1;
/**
* @desc Default particle scale
* @type {number}
*/
export const DEFAULT_SCALE = 1;
/**
* @desc Default particle useColor
* @type {boolean}
*/
export const DEFAULT_USE_COLOR = false;
/**
* @desc Default particle useAlpha
* @type {boolean}
*/
export const DEFAULT_USE_ALPHA = false;
/**
* @desc Default particle easing
* @type {function}
*/
export const DEFAULT_EASING = easeLinear;
/**
* @desc The default delta provided to the System instance
* @type {number}
*/
export const DEFAULT_SYSTEM_DELTA = 0.0167;
/**
* @desc The types of initializers supported by the System.fromJSON method.
* @type {array<string>}
*/
export const SUPPORTED_JSON_INITIALIZER_TYPES = [INITIALIZER_TYPE_POSITION, INITIALIZER_TYPE_ROTATION, INITIALIZER_TYPE_LIFE, INITIALIZER_TYPE_RADIUS, INITIALIZER_TYPE_MASS, INITIALIZER_TYPE_BODY, INITIALIZER_TYPE_BODY_SPRITE, INITIALIZER_TYPE_TEXTURE, INITIALIZER_TYPE_POLAR_VELOCITY, INITIALIZER_TYPE_RADIAL_VELOCITY, INITIALIZER_TYPE_VECTOR_VELOCITY];
/**
* @desc The types of behaviours supported by the System.fromJSON method.
* @type {array<string>}
*/
export const SUPPORTED_JSON_BEHAVIOUR_TYPES = [BEHAVIOUR_TYPE_ALPHA, BEHAVIOUR_TYPE_ATTRACTION, BEHAVIOUR_TYPE_COLOR, BEHAVIOUR_TYPE_CROSS_ZONE, BEHAVIOUR_TYPE_FORCE, BEHAVIOUR_TYPE_GRAVITY, BEHAVIOUR_TYPE_RANDOM_DRIFT, BEHAVIOUR_TYPE_REPULSION, BEHAVIOUR_TYPE_ROTATE, BEHAVIOUR_TYPE_SCALE, BEHAVIOUR_TYPE_SPRING];
/**
* @desc The types of renderers supported by the System.fromJSON method.
* @type {array<string>}
*/
export const SUPPORTED_JSON_RENDERER_TYPES = [RENDERER_TYPE_SPRITE];
/**
* @desc The types of zones supported by the System.fromJSON method.
* @type {array<string>}
*/
export const SUPPORTED_JSON_ZONE_TYPES = [ZONE_TYPE_BOX, ZONE_TYPE_LINE, ZONE_TYPE_MESH, ZONE_TYPE_POINT, ZONE_TYPE_SPHERE];
export { INITIALIZER_TYPES_THAT_REQUIRE_THREE } from '../initializer/types';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2NvbnN0YW50cy5qcyJdLCJuYW1lcyI6WyJCRUhBVklPVVJfVFlQRV9BTFBIQSIsIkJFSEFWSU9VUl9UWVBFX0FUVFJBQ1RJT04iLCJCRUhBVklPVVJfVFlQRV9DT0xPUiIsIkJFSEFWSU9VUl9UWVBFX0NST1NTX1pPTkUiLCJCRUhBVklPVVJfVFlQRV9GT1JDRSIsIkJFSEFWSU9VUl9UWVBFX0dSQVZJVFkiLCJCRUhBVklPVVJfVFlQRV9SQU5ET01fRFJJRlQiLCJCRUhBVklPVVJfVFlQRV9SRVBVTFNJT04iLCJCRUhBVklPVVJfVFlQRV9ST1RBVEUiLCJCRUhBVklPVVJfVFlQRV9TQ0FMRSIsIkJFSEFWSU9VUl9UWVBFX1NQUklORyIsIklOSVRJQUxJWkVSX1RZUEVfQk9EWSIsIklOSVRJQUxJWkVSX1RZUEVfQk9EWV9TUFJJVEUiLCJJTklUSUFMSVpFUl9UWVBFX0xJRkUiLCJJTklUSUFMSVpFUl9UWVBFX01BU1MiLCJJTklUSUFMSVpFUl9UWVBFX1BPTEFSX1ZFTE9DSVRZIiwiSU5JVElBTElaRVJfVFlQRV9QT1NJVElPTiIsIklOSVRJQUxJWkVSX1RZUEVfUk9UQVRJT04iLCJJTklUSUFMSVpFUl9UWVBFX1JBRElBTF9WRUxPQ0lUWSIsIklOSVRJQUxJWkVSX1RZUEVfUkFESVVTIiwiSU5JVElBTElaRVJfVFlQRV9URVhUVVJFIiwiSU5JVElBTElaRVJfVFlQRV9WRUNUT1JfVkVMT0NJVFkiLCJaT05FX1RZUEVfQk9YIiwiWk9ORV9UWVBFX0xJTkUiLCJaT05FX1RZUEVfTUVTSCIsIlpPTkVfVFlQRV9QT0lOVCIsIlpPTkVfVFlQRV9TUEhFUkUiLCJSRU5ERVJFUl9UWVBFX1NQUklURSIsImVhc2VMaW5lYXIiLCJERUZBVUxUX0xJRkUiLCJJbmZpbml0eSIsIkRFRkFVTFRfQUdFIiwiREVGQVVMVF9FTkVSR1kiLCJERUZBVUxUX0RFQUQiLCJERUZBVUxUX1NMRUVQIiwiREVGQVVMVF9JTkRFWCIsIkRFRkFVTFRfQk9EWSIsIkRFRkFVTFRfUEFSRU5UIiwiREVGQVVMVF9NQVNTIiwiREVGQVVMVF9SQURJVVMiLCJERUZBVUxUX0FMUEhBIiwiREVGQVVMVF9TQ0FMRSIsIkRFRkFVTFRfVVNFX0NPTE9SIiwiREVGQVVMVF9VU0VfQUxQSEEiLCJERUZBVUxUX0VBU0lORyIsIkRFRkFVTFRfU1lTVEVNX0RFTFRBIiwiU1VQUE9SVEVEX0pTT05fSU5JVElBTElaRVJfVFlQRVMiLCJTVVBQT1JURURfSlNPTl9CRUhBVklPVVJfVFlQRVMiLCJTVVBQT1JURURfSlNPTl9SRU5ERVJFUl9UWVBFUyIsIlNVUFBPUlRFRF9KU09OX1pPTkVfVFlQRVMiLCJJTklUSUFMSVpFUl9UWVBFU19USEFUX1JFUVVJUkVfVEhSRUUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQ0VBLG9CQURGLEVBRUVDLHlCQUZGLEVBR0VDLG9CQUhGLEVBSUVDLHlCQUpGLEVBS0VDLG9CQUxGLEVBTUVDLHNCQU5GLEVBT0VDLDJCQVBGLEVBUUVDLHdCQVJGLEVBU0VDLHFCQVRGLEVBVUVDLG9CQVZGLEVBV0VDLHFCQVhGLFFBWU8sb0JBWlA7QUFhQSxTQUNFQyxxQkFERixFQUVFQyw0QkFGRixFQUdFQyxxQkFIRixFQUlFQyxxQkFKRixFQUtFQywrQkFMRixFQU1FQyx5QkFORixFQU9FQyx5QkFQRixFQVFFQyxnQ0FSRixFQVNFQyx1QkFURixFQVVFQyx3QkFWRixFQVdFQyxnQ0FYRixRQVlPLHNCQVpQO0FBYUEsU0FDRUMsYUFERixFQUVFQyxjQUZGLEVBR0VDLGNBSEYsRUFJRUMsZUFKRixFQUtFQyxnQkFMRixRQU1PLGVBTlA7QUFRQSxTQUFTQyxvQkFBVCxRQUFxQyxtQkFBckM7QUFDQSxTQUFTQyxVQUFULFFBQTJCLFNBQTNCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxZQUFZLEdBQUdDLFFBQXJCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxXQUFXLEdBQUcsQ0FBcEI7QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1DLGNBQWMsR0FBRyxDQUF2QjtBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTUMsWUFBWSxHQUFHLEtBQXJCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxhQUFhLEdBQUcsS0FBdEI7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1DLGFBQWEsR0FBRyxDQUF0QjtBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxjQUFjLEdBQUcsSUFBdkI7QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1DLFlBQVksR0FBRyxDQUFyQjtBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTUMsY0FBYyxHQUFHLEVBQXZCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxhQUFhLEdBQUcsQ0FBdEI7QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1DLGFBQWEsR0FBRyxDQUF0QjtBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTUMsaUJBQWlCLEdBQUcsS0FBMUI7QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1DLGlCQUFpQixHQUFHLEtBQTFCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxjQUFjLEdBQUdoQixVQUF2QjtBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTWlCLG9CQUFvQixHQUFHLE1BQTdCO0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxnQ0FBZ0MsR0FBRyxDQUM5QzlCLHlCQUQ4QyxFQUU5Q0MseUJBRjhDLEVBRzlDSixxQkFIOEMsRUFJOUNNLHVCQUo4QyxFQUs5Q0wscUJBTDhDLEVBTTlDSCxxQkFOOEMsRUFPOUNDLDRCQVA4QyxFQVE5Q1Esd0JBUjhDLEVBUzlDTCwrQkFUOEMsRUFVOUNHLGdDQVY4QyxFQVc5Q0csZ0NBWDhDLENBQXpDO0FBY1A7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNMEIsOEJBQThCLEdBQUcsQ0FDNUMvQyxvQkFENEMsRUFFNUNDLHlCQUY0QyxFQUc1Q0Msb0JBSDRDLEVBSTVDQyx5QkFKNEMsRUFLNUNDLG9CQUw0QyxFQU01Q0Msc0JBTjRDLEVBTzVDQywyQkFQNEMsRUFRNUNDLHdCQVI0QyxFQVM1Q0MscUJBVDRDLEVBVTVDQyxvQkFWNEMsRUFXNUNDLHFCQVg0QyxDQUF2QztBQWNQO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTXNDLDZCQUE2QixHQUFHLENBQUNyQixvQkFBRCxDQUF0QztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTXNCLHlCQUF5QixHQUFHLENBQ3ZDM0IsYUFEdUMsRUFFdkNDLGNBRnVDLEVBR3ZDQyxjQUh1QyxFQUl2Q0MsZUFKdUMsRUFLdkNDLGdCQUx1QyxDQUFsQztBQVFQLFNBQVN3QixvQ0FBVCxRQUFxRCxzQkFBckQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCRUhBVklPVVJfVFlQRV9BTFBIQSxcbiAgQkVIQVZJT1VSX1RZUEVfQVRUUkFDVElPTixcbiAgQkVIQVZJT1VSX1RZUEVfQ09MT1IsXG4gIEJFSEFWSU9VUl9UWVBFX0NST1NTX1pPTkUsXG4gIEJFSEFWSU9VUl9UWVBFX0ZPUkNFLFxuICBCRUhBVklPVVJfVFlQRV9HUkFWSVRZLFxuICBCRUhBVklPVVJfVFlQRV9SQU5ET01fRFJJRlQsXG4gIEJFSEFWSU9VUl9UWVBFX1JFUFVMU0lPTixcbiAgQkVIQVZJT1VSX1RZUEVfUk9UQVRFLFxuICBCRUhBVklPVVJfVFlQRV9TQ0FMRSxcbiAgQkVIQVZJT1VSX1RZUEVfU1BSSU5HLFxufSBmcm9tICcuLi9iZWhhdmlvdXIvdHlwZXMnO1xuaW1wb3J0IHtcbiAgSU5JVElBTElaRVJfVFlQRV9CT0RZLFxuICBJTklUSUFMSVpFUl9UWVBFX0JPRFlfU1BSSVRFLFxuICBJTklUSUFMSVpFUl9UWVBFX0xJRkUsXG4gIElOSVRJQUxJWkVSX1RZUEVfTUFTUyxcbiAgSU5JVElBTElaRVJfVFlQRV9QT0xBUl9WRUxPQ0lUWSxcbiAgSU5JVElBTElaRVJ Line truncated
@@ -0,0 +1,107 @@
import * as Behaviour from '../behaviour';
import * as Initializer from '../initializer';
import { EULER, POOL_MAX } from '../constants';
import { INITIALIZER_TYPES_THAT_REQUIRE_THREE, SUPPORTED_JSON_BEHAVIOUR_TYPES, SUPPORTED_JSON_INITIALIZER_TYPES } from './constants';
import Rate from '../initializer/Rate';
/**
* Makes a rate instance.
*
* @param {object} json - The data required to construct a Rate instance
* @return {Rate}
*/
const makeRate = json => Rate.fromJSON(json);
/**
* Makes initializers from json items.
*
* @param {array<object>} items - An array of objects which provide initializer constructor params
* @param {object} THREE - The Web GL Api to use
* @return {array<Initializer>}
*/
const makeInitializers = (items, THREE) => {
const initializers = [];
items.forEach(data => {
const {
type,
properties
} = data;
if (!SUPPORTED_JSON_INITIALIZER_TYPES.includes(type)) {
throw new Error(`The initializer type ${type} is invalid or not yet supported`);
}
if (INITIALIZER_TYPES_THAT_REQUIRE_THREE.includes(type)) {
initializers.push(Initializer[type].fromJSON(properties, THREE));
} else {
initializers.push(Initializer[type].fromJSON(properties));
}
});
return initializers;
};
/**
* Makes behaviours from json items.
*
* @param {array<object>} items - An array of objects which provide behaviour constructor params
* @return {array<Behaviour>}
*/
const makeBehaviours = items => {
const behaviours = [];
items.forEach(data => {
const {
type,
properties
} = data;
if (!SUPPORTED_JSON_BEHAVIOUR_TYPES.includes(type)) {
throw new Error(`The behaviour type ${type} is invalid or not yet supported`);
}
behaviours.push(Behaviour[type].fromJSON(properties));
});
return behaviours;
};
/**
* Creates a System instance from a JSON object.
*
* @deprecated Use fromJSONAsync instead.
*
* @param {object} json - The JSON to create the System instance from
* @param {object} THREE - The Web GL Api to use
* @param {function} System - The system class
* @param {function} Emitter - The emitter class
* @param {number} json.preParticles - The predetermined number of particles
* @param {string} json.integrationType - The integration algorithm to use
* @param {array<object>} json.emitters - The emitters for the system instance
* @return {System}
*/
export default ((json, THREE, System, Emitter) => {
const {
preParticles = POOL_MAX,
integrationType = EULER,
emitters = []
} = json;
const system = new System(THREE, preParticles, integrationType);
emitters.forEach(data => {
const emitter = new Emitter();
const {
rate,
rotation,
initializers,
behaviours,
emitterBehaviours = [],
position,
totalEmitTimes = Infinity,
life = Infinity
} = data;
emitter.setRate(makeRate(rate)).setRotation(rotation).setInitializers(makeInitializers(initializers, THREE)).setBehaviours(makeBehaviours(behaviours)).setEmitterBehaviours(makeBehaviours(emitterBehaviours)).setPosition(position).emit(totalEmitTimes, life);
system.addEmitter(emitter);
});
return system;
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2Zyb21KU09OLmpzIl0sIm5hbWVzIjpbIkJlaGF2aW91ciIsIkluaXRpYWxpemVyIiwiRVVMRVIiLCJQT09MX01BWCIsIklOSVRJQUxJWkVSX1RZUEVTX1RIQVRfUkVRVUlSRV9USFJFRSIsIlNVUFBPUlRFRF9KU09OX0JFSEFWSU9VUl9UWVBFUyIsIlNVUFBPUlRFRF9KU09OX0lOSVRJQUxJWkVSX1RZUEVTIiwiUmF0ZSIsIm1ha2VSYXRlIiwianNvbiIsImZyb21KU09OIiwibWFrZUluaXRpYWxpemVycyIsIml0ZW1zIiwiVEhSRUUiLCJpbml0aWFsaXplcnMiLCJmb3JFYWNoIiwiZGF0YSIsInR5cGUiLCJwcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJFcnJvciIsInB1c2giLCJtYWtlQmVoYXZpb3VycyIsImJlaGF2aW91cnMiLCJTeXN0ZW0iLCJFbWl0dGVyIiwicHJlUGFydGljbGVzIiwiaW50ZWdyYXRpb25UeXBlIiwiZW1pdHRlcnMiLCJzeXN0ZW0iLCJlbWl0dGVyIiwicmF0ZSIsInJvdGF0aW9uIiwiZW1pdHRlckJlaGF2aW91cnMiLCJwb3NpdGlvbiIsInRvdGFsRW1pdFRpbWVzIiwiSW5maW5pdHkiLCJsaWZlIiwic2V0UmF0ZSIsInNldFJvdGF0aW9uIiwic2V0SW5pdGlhbGl6ZXJzIiwic2V0QmVoYXZpb3VycyIsInNldEVtaXR0ZXJCZWhhdmlvdXJzIiwic2V0UG9zaXRpb24iLCJlbWl0IiwiYWRkRW1pdHRlciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLQSxTQUFaLE1BQTJCLGNBQTNCO0FBQ0EsT0FBTyxLQUFLQyxXQUFaLE1BQTZCLGdCQUE3QjtBQUVBLFNBQVNDLEtBQVQsRUFBZ0JDLFFBQWhCLFFBQWdDLGNBQWhDO0FBQ0EsU0FDRUMsb0NBREYsRUFFRUMsOEJBRkYsRUFHRUMsZ0NBSEYsUUFJTyxhQUpQO0FBTUEsT0FBT0MsSUFBUCxNQUFpQixxQkFBakI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUMsUUFBUSxHQUFHQyxJQUFJLElBQUlGLElBQUksQ0FBQ0csUUFBTCxDQUFjRCxJQUFkLENBQXpCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLE1BQU1FLGdCQUFnQixHQUFHLENBQUNDLEtBQUQsRUFBUUMsS0FBUixLQUFrQjtBQUN6QyxRQUFNQyxZQUFZLEdBQUcsRUFBckI7QUFFQUYsRUFBQUEsS0FBSyxDQUFDRyxPQUFOLENBQWNDLElBQUksSUFBSTtBQUNwQixVQUFNO0FBQUVDLE1BQUFBLElBQUY7QUFBUUMsTUFBQUE7QUFBUixRQUF1QkYsSUFBN0I7O0FBRUEsUUFBSSxDQUFDVixnQ0FBZ0MsQ0FBQ2EsUUFBakMsQ0FBMENGLElBQTFDLENBQUwsRUFBc0Q7QUFDcEQsWUFBTSxJQUFJRyxLQUFKLENBQ0gsd0JBQXVCSCxJQUFLLGtDQUR6QixDQUFOO0FBR0Q7O0FBRUQsUUFBSWIsb0NBQW9DLENBQUNlLFFBQXJDLENBQThDRixJQUE5QyxDQUFKLEVBQXlEO0FBQ3ZESCxNQUFBQSxZQUFZLENBQUNPLElBQWIsQ0FBa0JwQixXQUFXLENBQUNnQixJQUFELENBQVgsQ0FBa0JQLFFBQWxCLENBQTJCUSxVQUEzQixFQUF1Q0wsS0FBdkMsQ0FBbEI7QUFDRCxLQUZELE1BRU87QUFDTEMsTUFBQUEsWUFBWSxDQUFDTyxJQUFiLENBQWtCcEIsV0FBVyxDQUFDZ0IsSUFBRCxDQUFYLENBQWtCUCxRQUFsQixDQUEyQlEsVUFBM0IsQ0FBbEI7QUFDRDtBQUNGLEdBZEQ7QUFnQkEsU0FBT0osWUFBUDtBQUNELENBcEJEO0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsTUFBTVEsY0FBYyxHQUFHVixLQUFLLElBQUk7QUFDOUIsUUFBTVcsVUFBVSxHQUFHLEVBQW5CO0FBRUFYLEVBQUFBLEtBQUssQ0FBQ0csT0FBTixDQUFjQyxJQUFJLElBQUk7QUFDcEIsVUFBTTtBQUFFQyxNQUFBQSxJQUFGO0FBQVFDLE1BQUFBO0FBQVIsUUFBdUJGLElBQTdCOztBQUVBLFFBQUksQ0FBQ1gsOEJBQThCLENBQUNjLFFBQS9CLENBQXdDRixJQUF4QyxDQUFMLEVBQW9EO0FBQ2xELFlBQU0sSUFBSUcsS0FBSixDQUNILHNCQUFxQkgsSUFBSyxrQ0FEdkIsQ0FBTjtBQUdEOztBQUVETSxJQUFBQSxVQUFVLENBQUNGLElBQVgsQ0FBZ0JyQixTQUFTLENBQUNpQixJQUFELENBQVQsQ0FBZ0JQLFFBQWhCLENBQXlCUSxVQUF6QixDQUFoQjtBQUNELEdBVkQ7QUFZQSxTQUFPSyxVQUFQO0FBQ0QsQ0FoQkQ7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsZ0JBQWUsQ0FBQ2QsSUFBRCxFQUFPSSxLQUFQLEVBQWNXLE1BQWQsRUFBc0JDLE9BQXRCLEtBQWtDO0FBQy9DLFFBQU07QUFDSkMsSUFBQUEsWUFBWSxHQUFHdkIsUUFEWDtBQUVKd0IsSUFBQUEsZUFBZSxHQUFHekIsS0FGZDtBQUdKMEIsSUFBQUEsUUFBUSxHQUFHO0FBSFAsTUFJRm5CLElBSko7QUFLQSxRQUFNb0IsTUFBTSxHQUFHLElBQUlMLE1BQUosQ0FBV1gsS0FBWCxFQUFrQmEsWUFBbEIsRUFBZ0NDLGVBQWhDLENBQWY7QUFFQUMsRUFBQUEsUUFBUSxDQUFDYixPQUFULENBQWlCQyxJQUFJLElBQUk7QUFDdkIsVUFBTWMsT0FBTyxHQUFHLElBQUlMLE9BQUosRUFBaEI7QUFDQSxVQUFNO0FBQ0pNLE1BQUFBLElBREk7QUFFSkMsTUFBQUEsUUFGSTtBQUdKbEIsTUFBQUEsWUFISTtBQUlKUyxNQUFBQSxVQUpJO0FBS0pVLE1BQUFBLGlCQUFpQixHQUFHLEVBTGhCO0FBTUpDLE1BQUFBLFFBTkk7QUFPSkMsTUFBQUEsY0FBYyxHQUFHQyxRQVBiO0FBUUpDLE1BQUFBLElBQUksR0FBR0Q7QUFSSCxRQVNGcEIsSUFUSjtBQVdBYyxJQUFBQSxPQUFPLENBQ0pRLE9BREgsQ0FDVzlCLFFBQVEsQ0FBQ3VCLElBQUQsQ0FEbkIsRUFFR1EsV0FGSCxDQUVlUCxRQUZmLEVBR0dRLGVBSEgsQ0FHbUI3QixnQkFBZ0IsQ0FBQ0csWUFBRCxFQUFlRCxLQUFmLENBSG5DLEVBSUc0QixhQUpILENBSWlCbkIsY0FBYyxDQUFDQyxVQUFELENBSi9CLEVBS0dtQixvQkFMSCxDQUt3QnBCLGNBQWMsQ0FBQ1csaUJBQUQsQ0FMdEMsRUFNR1UsV0FOSCxDQU1lVCxRQU5mLEVBT0dVLElBUEgsQ0FPUVQsY0FQUixFQU93QkUsSUFQeEI7QUFTQVIsSUFBQUEsTUFBTSxDQUFDZ0IsVUFBUCxDQUFrQmYsT0FBbEI7QUFDRCxHQXZCRDtBQXlCQSxTQUFPRCxNQUFQO0FBQ0QsQ0FsQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBCZWhhdmlvdXIgZnJvbSAnLi4vYmVoYXZpb3VyJztcbmltcG9ydCAqIGFzIEluaXRpYWxpemVyIGZyb20gJy4uL2luaXRpYWxpemVyJztcblxuaW1wb3J0IHsgRVVMRVIsIFBPT0xfTUFYIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIElOSVRJQUxJWkVSX1RZUEVTX1RIQVRfUkVRVUlSRV9USFJFRSxcbiAgU1VQUE9SVEVEX0pTT05fQkVIQVZJT1VSX1RZUEVTLFxuICBTVVBQT1JURURfSlNPTl9JTklUSUFMSVpFUl9UWVBFUyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5pbXBvcnQgUmF0ZSBmcm9tICcuLi9pbml0aWFsaXplci9SYXRlJztcblxuLyoqXG4gKiBNYWtlcyBhIHJhdGUgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgZGF0YSByZXF1aXJlZCB0byBjb25zdHJ1Y3QgYSBSYXRlIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtSYXRlfVxuICovXG5jb25zdCBtYWtlUmF0ZSA9IGpzb24gPT4gUmF0ZS5mcm9tSlNPTihqc29uKTtcblxuLyoqXG4gKiBNYWtlcyBpbml0aWFsaXplcnMgZnJvbSBqc29uIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7YXJyYXk8b2JqZWN0Pn0gaXRlbXMgLSBBbiBhcnJheSBvZiBvYmplY3RzIHdoaWNoIHByb3ZpZGUgaW5pdGlhbGl6ZXIgY29uc3RydWN0b3IgcGFyYW1zXG4 Line truncated
@@ -0,0 +1,210 @@
import _defineProperty from "@babel/runtime/helpers/defineProperty";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import * as Behaviour from '../behaviour';
import * as Initializer from '../initializer';
import { EULER, POOL_MAX } from '../constants';
import { INITIALIZER_TYPES_THAT_REQUIRE_THREE, SUPPORTED_JSON_BEHAVIOUR_TYPES, SUPPORTED_JSON_INITIALIZER_TYPES } from './constants';
import Rate from '../initializer/Rate';
import TextureInitializer from '../initializer/Texture';
const DEFAULT_OPTIONS = {
shouldAutoEmit: true
};
/**
* Makes a rate instance.
*
* @param {object} json - The data required to construct a Rate instance
* @return {Rate}
*/
const makeRate = json => Rate.fromJSON(json);
/**
* Makes initializers from json items.
*
* @param {array<object>} items - An array of objects which provide initializer constructor params
* @param {object} THREE - The Web GL Api to use
* @return {array<Initializer>}
*/
const makeInitializers = (items, THREE) => new Promise((resolve, reject) => {
if (!items.length) {
return resolve([]);
}
const numberOfInitializers = items.length;
const madeInitializers = [];
const doNotRequireTextureLoading = items.filter(({
properties
}) => !properties.texture);
const doRequireTextureLoading = items.filter(({
properties
}) => properties.texture);
doNotRequireTextureLoading.forEach(data => {
const {
type,
properties
} = data;
if (!SUPPORTED_JSON_INITIALIZER_TYPES.includes(type)) {
return reject(`The initializer type ${type} is invalid or not yet supported`);
}
if (INITIALIZER_TYPES_THAT_REQUIRE_THREE.includes(type)) {
madeInitializers.push(Initializer[type].fromJSON(properties, THREE));
} else {
madeInitializers.push(Initializer[type].fromJSON(properties));
}
if (madeInitializers.length === numberOfInitializers) {
return resolve(madeInitializers);
}
});
doRequireTextureLoading.forEach(data => {
const {
type,
properties,
properties: {
texture
}
} = data;
const textureLoader = new THREE.TextureLoader();
if (!SUPPORTED_JSON_INITIALIZER_TYPES.includes(type)) {
return reject(`The initializer type ${type} is invalid or not yet supported`);
}
textureLoader.load(texture, loadedTexture => {
madeInitializers.push(TextureInitializer.fromJSON(_objectSpread(_objectSpread({}, properties), {}, {
loadedTexture
}), THREE));
if (madeInitializers.length === numberOfInitializers) {
return resolve(madeInitializers);
}
}, undefined, reject);
});
});
/**
* Makes behaviours from json items.
*
* @param {array<object>} items - An array of objects which provide behaviour constructor params
* @return {Promise<array>}
*/
const makeBehaviours = items => new Promise((resolve, reject) => {
if (!items.length) {
return resolve([]);
}
const numberOfBehaviours = items.length;
const madeBehaviours = [];
items.forEach(data => {
const {
type,
properties
} = data;
if (!SUPPORTED_JSON_BEHAVIOUR_TYPES.includes(type)) {
return reject(`The behaviour type ${type} is invalid or not yet supported`);
}
madeBehaviours.push(Behaviour[type].fromJSON(properties));
if (madeBehaviours.length === numberOfBehaviours) {
return resolve(madeBehaviours);
}
});
});
const makeEmitters = (emitters, Emitter, THREE, shouldAutoEmit) => new Promise((resolve, reject) => {
if (!emitters.length) {
return resolve([]);
}
const madeEmitters = [];
const numberOfEmitters = emitters.length;
if (!numberOfEmitters) {
return resolve(madeEmitters);
}
emitters.forEach(data => {
const emitter = new Emitter();
const {
rate,
rotation,
initializers,
behaviours,
emitterBehaviours = [],
position,
totalEmitTimes = Infinity,
life = Infinity
} = data;
emitter.setRate(makeRate(rate)).setRotation(rotation).setPosition(position);
makeInitializers(initializers, THREE).then(madeInitializers => {
emitter.setInitializers(madeInitializers);
return makeBehaviours(behaviours);
}).then(madeBehaviours => {
emitter.setBehaviours(madeBehaviours);
return makeBehaviours(emitterBehaviours);
}).then(madeEmitterBehaviours => {
emitter.setEmitterBehaviours(madeEmitterBehaviours);
return Promise.resolve(emitter);
}).then(emitter => {
madeEmitters.push(shouldAutoEmit ? emitter.emit(totalEmitTimes, life) : emitter.setTotalEmitTimes(totalEmitTimes).setLife(life));
if (madeEmitters.length === numberOfEmitters) {
return resolve(madeEmitters);
}
}).catch(reject);
});
});
/**
* Creates a System instance from a JSON object.
*
* @param {object} json - The JSON to create the System instance from
* @param {number} json.preParticles - The predetermined number of particles
* @param {string} json.integrationType - The integration algorithm to use
* @param {array<object>} json.emitters - The emitters for the system instance
* @param {object} THREE - The Web GL Api to use
* @param {function} System - The system class
* @param {function} Emitter - The emitter class
* @param {object} [options={}] - Optional config options
* @return {Promise<System>}
*/
export default ((json, THREE, System, Emitter, options = {}) => new Promise((resolve, reject) => {
const {
preParticles = POOL_MAX,
integrationType = EULER,
emitters = []
} = json;
const system = new System(preParticles, integrationType);
const {
shouldAutoEmit
} = _objectSpread(_objectSpread({}, DEFAULT_OPTIONS), options);
makeEmitters(emitters, Emitter, THREE, shouldAutoEmit).then(madeEmitters => {
const numberOfEmitters = madeEmitters.length;
if (!numberOfEmitters) {
return resolve(system);
}
madeEmitters.forEach(madeEmitter => {
system.addEmitter(madeEmitter);
if (system.emitters.length === numberOfEmitters) {
resolve(system);
}
});
}).catch(reject);
}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2Zyb21KU09OQXN5bmMuanMiXSwibmFtZXMiOlsiQmVoYXZpb3VyIiwiSW5pdGlhbGl6ZXIiLCJFVUxFUiIsIlBPT0xfTUFYIiwiSU5JVElBTElaRVJfVFlQRVNfVEhBVF9SRVFVSVJFX1RIUkVFIiwiU1VQUE9SVEVEX0pTT05fQkVIQVZJT1VSX1RZUEVTIiwiU1VQUE9SVEVEX0pTT05fSU5JVElBTElaRVJfVFlQRVMiLCJSYXRlIiwiVGV4dHVyZUluaXRpYWxpemVyIiwiREVGQVVMVF9PUFRJT05TIiwic2hvdWxkQXV0b0VtaXQiLCJtYWtlUmF0ZSIsImpzb24iLCJmcm9tSlNPTiIsIm1ha2VJbml0aWFsaXplcnMiLCJpdGVtcyIsIlRIUkVFIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJsZW5ndGgiLCJudW1iZXJPZkluaXRpYWxpemVycyIsIm1hZGVJbml0aWFsaXplcnMiLCJkb05vdFJlcXVpcmVUZXh0dXJlTG9hZGluZyIsImZpbHRlciIsInByb3BlcnRpZXMiLCJ0ZXh0dXJlIiwiZG9SZXF1aXJlVGV4dHVyZUxvYWRpbmciLCJmb3JFYWNoIiwiZGF0YSIsInR5cGUiLCJpbmNsdWRlcyIsInB1c2giLCJ0ZXh0dXJlTG9hZGVyIiwiVGV4dHVyZUxvYWRlciIsImxvYWQiLCJsb2FkZWRUZXh0dXJlIiwidW5kZWZpbmVkIiwibWFrZUJlaGF2aW91cnMiLCJudW1iZXJPZkJlaGF2aW91cnMiLCJtYWRlQmVoYXZpb3VycyIsIm1ha2VFbWl0dGVycyIsImVtaXR0ZXJzIiwiRW1pdHRlciIsIm1hZGVFbWl0dGVycyIsIm51bWJlck9mRW1pdHRlcnMiLCJlbWl0dGVyIiwicmF0ZSIsInJvdGF0aW9uIiwiaW5pdGlhbGl6ZXJzIiwiYmVoYXZpb3VycyIsImVtaXR0ZXJCZWhhdmlvdXJzIiwicG9zaXRpb24iLCJ0b3RhbEVtaXRUaW1lcyIsIkluZmluaXR5IiwibGlmZSIsInNldFJhdGUiLCJzZXRSb3RhdGlvbiIsInNldFBvc2l0aW9uIiwidGhlbiIsInNldEluaXRpYWxpemVycyIsInNldEJlaGF2aW91cnMiLCJtYWRlRW1pdHRlckJlaGF2aW91cnMiLCJzZXRFbWl0dGVyQmVoYXZpb3VycyIsImVtaXQiLCJzZXRUb3RhbEVtaXRUaW1lcyIsInNldExpZmUiLCJjYXRjaCIsIlN5c3RlbSIsIm9wdGlvbnMiLCJwcmVQYXJ0aWNsZXMiLCJpbnRlZ3JhdGlvblR5cGUiLCJzeXN0ZW0iLCJtYWRlRW1pdHRlciIsImFkZEVtaXR0ZXIiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sS0FBS0EsU0FBWixNQUEyQixjQUEzQjtBQUNBLE9BQU8sS0FBS0MsV0FBWixNQUE2QixnQkFBN0I7QUFFQSxTQUFTQyxLQUFULEVBQWdCQyxRQUFoQixRQUFnQyxjQUFoQztBQUNBLFNBQ0VDLG9DQURGLEVBRUVDLDhCQUZGLEVBR0VDLGdDQUhGLFFBSU8sYUFKUDtBQU1BLE9BQU9DLElBQVAsTUFBaUIscUJBQWpCO0FBQ0EsT0FBT0Msa0JBQVAsTUFBK0Isd0JBQS9CO0FBRUEsTUFBTUMsZUFBZSxHQUFHO0FBQUVDLEVBQUFBLGNBQWMsRUFBRTtBQUFsQixDQUF4QjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxNQUFNQyxRQUFRLEdBQUdDLElBQUksSUFBSUwsSUFBSSxDQUFDTSxRQUFMLENBQWNELElBQWQsQ0FBekI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsTUFBTUUsZ0JBQWdCLEdBQUcsQ0FBQ0MsS0FBRCxFQUFRQyxLQUFSLEtBQ3ZCLElBQUlDLE9BQUosQ0FBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7QUFDL0IsTUFBSSxDQUFDSixLQUFLLENBQUNLLE1BQVgsRUFBbUI7QUFDakIsV0FBT0YsT0FBTyxDQUFDLEVBQUQsQ0FBZDtBQUNEOztBQUVELFFBQU1HLG9CQUFvQixHQUFHTixLQUFLLENBQUNLLE1BQW5DO0FBQ0EsUUFBTUUsZ0JBQWdCLEdBQUcsRUFBekI7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 Line truncated
@@ -0,0 +1,4 @@
export { default as Particle } from './Particle';
export { default as Pool } from './Pool';
export { default as System } from './System';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2luZGV4LmpzIl0sIm5hbWVzIjpbImRlZmF1bHQiLCJQYXJ0aWNsZSIsIlBvb2wiLCJTeXN0ZW0iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sSUFBSUMsUUFBcEIsUUFBb0MsWUFBcEM7QUFDQSxTQUFTRCxPQUFPLElBQUlFLElBQXBCLFFBQWdDLFFBQWhDO0FBQ0EsU0FBU0YsT0FBTyxJQUFJRyxNQUFwQixRQUFrQyxVQUFsQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgUGFydGljbGUgfSBmcm9tICcuL1BhcnRpY2xlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9vbCB9IGZyb20gJy4vUG9vbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN5c3RlbSB9IGZyb20gJy4vU3lzdGVtJztcbiJdfQ==
@@ -0,0 +1,224 @@
import { Quaternion } from './Quaternion.js';
import { Vector3 } from './Vector3.js';
import { Matrix4 } from './Matrix4.js';
import { _Math } from './Math.js';
/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/
function Euler(x, y, z, order) {
this._x = x || 0;
this._y = y || 0;
this._z = z || 0;
this._order = order || Euler.DefaultOrder;
}
Euler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX'];
Euler.DefaultOrder = 'XYZ';
Object.defineProperties(Euler.prototype, {
x: {
get: function () {
return this._x;
},
set: function (value) {
this._x = value;
this._onChangeCallback();
}
},
y: {
get: function () {
return this._y;
},
set: function (value) {
this._y = value;
this._onChangeCallback();
}
},
z: {
get: function () {
return this._z;
},
set: function (value) {
this._z = value;
this._onChangeCallback();
}
},
order: {
get: function () {
return this._order;
},
set: function (value) {
this._order = value;
this._onChangeCallback();
}
}
});
Object.assign(Euler.prototype, {
isEuler: true,
set: function (x, y, z, order) {
this._x = x;
this._y = y;
this._z = z;
this._order = order || this._order;
this._onChangeCallback();
return this;
},
clone: function () {
return new this.constructor(this._x, this._y, this._z, this._order);
},
copy: function (euler) {
this._x = euler._x;
this._y = euler._y;
this._z = euler._z;
this._order = euler._order;
this._onChangeCallback();
return this;
},
setFromRotationMatrix: function (m, order, update) {
var clamp = _Math.clamp; // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te = m.elements;
var m11 = te[0],
m12 = te[4],
m13 = te[8];
var m21 = te[1],
m22 = te[5],
m23 = te[9];
var m31 = te[2],
m32 = te[6],
m33 = te[10];
order = order || this._order;
if (order === 'XYZ') {
this._y = Math.asin(clamp(m13, -1, 1));
if (Math.abs(m13) < 0.99999) {
this._x = Math.atan2(-m23, m33);
this._z = Math.atan2(-m12, m11);
} else {
this._x = Math.atan2(m32, m22);
this._z = 0;
}
} else if (order === 'YXZ') {
this._x = Math.asin(-clamp(m23, -1, 1));
if (Math.abs(m23) < 0.99999) {
this._y = Math.atan2(m13, m33);
this._z = Math.atan2(m21, m22);
} else {
this._y = Math.atan2(-m31, m11);
this._z = 0;
}
} else if (order === 'ZXY') {
this._x = Math.asin(clamp(m32, -1, 1));
if (Math.abs(m32) < 0.99999) {
this._y = Math.atan2(-m31, m33);
this._z = Math.atan2(-m12, m22);
} else {
this._y = 0;
this._z = Math.atan2(m21, m11);
}
} else if (order === 'ZYX') {
this._y = Math.asin(-clamp(m31, -1, 1));
if (Math.abs(m31) < 0.99999) {
this._x = Math.atan2(m32, m33);
this._z = Math.atan2(m21, m11);
} else {
this._x = 0;
this._z = Math.atan2(-m12, m22);
}
} else if (order === 'YZX') {
this._z = Math.asin(clamp(m21, -1, 1));
if (Math.abs(m21) < 0.99999) {
this._x = Math.atan2(-m23, m22);
this._y = Math.atan2(-m31, m11);
} else {
this._x = 0;
this._y = Math.atan2(m13, m33);
}
} else if (order === 'XZY') {
this._z = Math.asin(-clamp(m12, -1, 1));
if (Math.abs(m12) < 0.99999) {
this._x = Math.atan2(m32, m22);
this._y = Math.atan2(m13, m11);
} else {
this._x = Math.atan2(-m23, m33);
this._y = 0;
}
} else {
console.warn('THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order);
}
this._order = order;
if (update !== false) this._onChangeCallback();
return this;
},
setFromQuaternion: function () {
var matrix = new Matrix4();
return function setFromQuaternion(q, order, update) {
matrix.makeRotationFromQuaternion(q);
return this.setFromRotationMatrix(matrix, order, update);
};
}(),
setFromVector3: function (v, order) {
return this.set(v.x, v.y, v.z, order || this._order);
},
reorder: function () {
// WARNING: this discards revolution information -bhouston
var q = new Quaternion();
return function reorder(newOrder) {
q.setFromEuler(this);
return this.setFromQuaternion(q, newOrder);
};
}(),
equals: function (euler) {
return euler._x === this._x && euler._y === this._y && euler._z === this._z && euler._order === this._order;
},
fromArray: function (array) {
this._x = array[0];
this._y = array[1];
this._z = array[2];
if (array[3] !== undefined) this._order = array[3];
this._onChangeCallback();
return this;
},
toArray: function (array, offset) {
if (array === undefined) array = [];
if (offset === undefined) offset = 0;
array[offset] = this._x;
array[offset + 1] = this._y;
array[offset + 2] = this._z;
array[offset + 3] = this._order;
return array;
},
toVector3: function (optionalResult) {
if (optionalResult) {
return optionalResult.set(this._x, this._y, this._z);
} else {
return new Vector3(this._x, this._y, this._z);
}
},
_onChange: function (callback) {
this._onChangeCallback = callback;
return this;
},
_onChangeCallback: function () {}
});
export { Euler };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL0V1bGVyLmpzIl0sIm5hbWVzIjpbIlF1YXRlcm5pb24iLCJWZWN0b3IzIiwiTWF0cml4NCIsIl9NYXRoIiwiRXVsZXIiLCJ4IiwieSIsInoiLCJvcmRlciIsIl94IiwiX3kiLCJfeiIsIl9vcmRlciIsIkRlZmF1bHRPcmRlciIsIlJvdGF0aW9uT3JkZXJzIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydGllcyIsInByb3RvdHlwZSIsImdldCIsInNldCIsInZhbHVlIiwiX29uQ2hhbmdlQ2FsbGJhY2siLCJhc3NpZ24iLCJpc0V1bGVyIiwiY2xvbmUiLCJjb25zdHJ1Y3RvciIsImNvcHkiLCJldWxlciIsInNldEZyb21Sb3RhdGlvbk1hdHJpeCIsIm0iLCJ1cGRhdGUiLCJjbGFtcCIsInRlIiwiZWxlbWVudHMiLCJtMTEiLCJtMTIiLCJtMTMiLCJtMjEiLCJtMjIiLCJtMjMiLCJtMzEiLCJtMzIiLCJtMzMiLCJNYXRoIiwiYXNpbiIsImFicyIsImF0YW4yIiwiY29uc29sZSIsIndhcm4iLCJzZXRGcm9tUXVhdGVybmlvbiIsIm1hdHJpeCIsInEiLCJtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiIsInNldEZyb21WZWN0b3IzIiwidiIsInJlb3JkZXIiLCJuZXdPcmRlciIsInNldEZyb21FdWxlciIsImVxdWFscyIsImZyb21BcnJheSIsImFycmF5IiwidW5kZWZpbmVkIiwidG9BcnJheSIsIm9mZnNldCIsInRvVmVjdG9yMyIsIm9wdGlvbmFsUmVzdWx0IiwiX29uQ2hhbmdlIiwiY2FsbGJhY2siXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVQsUUFBMkIsaUJBQTNCO0FBQ0EsU0FBU0MsT0FBVCxRQUF3QixjQUF4QjtBQUNBLFNBQVNDLE9BQVQsUUFBd0IsY0FBeEI7QUFDQSxTQUFTQyxLQUFULFFBQXNCLFdBQXRCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTQyxLQUFULENBQWdCQyxD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 Line truncated
@@ -0,0 +1,84 @@
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/
var _Math = {
DEG2RAD: Math.PI / 180,
RAD2DEG: 180 / Math.PI,
generateUUID: function () {
// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
var lut = [];
for (var i = 0; i < 256; i++) {
lut[i] = (i < 16 ? '0' : '') + i.toString(16);
}
return function generateUUID() {
var d0 = Math.random() * 0xffffffff | 0;
var d1 = Math.random() * 0xffffffff | 0;
var d2 = Math.random() * 0xffffffff | 0;
var d3 = Math.random() * 0xffffffff | 0;
var uuid = lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; // .toUpperCase() here flattens concatenated strings to save heap memory space.
return uuid.toUpperCase();
};
}(),
clamp: function (value, min, max) {
return Math.max(min, Math.min(max, value));
},
// compute euclidian modulo of m % n
// https://en.wikipedia.org/wiki/Modulo_operation
euclideanModulo: function (n, m) {
return (n % m + m) % m;
},
// Linear mapping from range <a1, a2> to range <b1, b2>
mapLinear: function (x, a1, a2, b1, b2) {
return b1 + (x - a1) * (b2 - b1) / (a2 - a1);
},
// https://en.wikipedia.org/wiki/Linear_interpolation
lerp: function (x, y, t) {
return (1 - t) * x + t * y;
},
// http://en.wikipedia.org/wiki/Smoothstep
smoothstep: function (x, min, max) {
if (x <= min) return 0;
if (x >= max) return 1;
x = (x - min) / (max - min);
return x * x * (3 - 2 * x);
},
smootherstep: function (x, min, max) {
if (x <= min) return 0;
if (x >= max) return 1;
x = (x - min) / (max - min);
return x * x * x * (x * (x * 6 - 15) + 10);
},
// Random integer from <low, high> interval
randInt: function (low, high) {
return low + Math.floor(Math.random() * (high - low + 1));
},
// Random float from <low, high> interval
randFloat: function (low, high) {
return low + Math.random() * (high - low);
},
// Random float from <-range/2, range/2> interval
randFloatSpread: function (range) {
return range * (0.5 - Math.random());
},
degToRad: function (degrees) {
return degrees * _Math.DEG2RAD;
},
radToDeg: function (radians) {
return radians * _Math.RAD2DEG;
},
isPowerOfTwo: function (value) {
return (value & value - 1) === 0 && value !== 0;
},
ceilPowerOfTwo: function (value) {
return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));
},
floorPowerOfTwo: function (value) {
return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));
}
};
export { _Math };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL01hdGguanMiXSwibmFtZXMiOlsiX01hdGgiLCJERUcyUkFEIiwiTWF0aCIsIlBJIiwiUkFEMkRFRyIsImdlbmVyYXRlVVVJRCIsImx1dCIsImkiLCJ0b1N0cmluZyIsImQwIiwicmFuZG9tIiwiZDEiLCJkMiIsImQzIiwidXVpZCIsInRvVXBwZXJDYXNlIiwiY2xhbXAiLCJ2YWx1ZSIsIm1pbiIsIm1heCIsImV1Y2xpZGVhbk1vZHVsbyIsIm4iLCJtIiwibWFwTGluZWFyIiwieCIsImExIiwiYTIiLCJiMSIsImIyIiwibGVycCIsInkiLCJ0Iiwic21vb3Roc3RlcCIsInNtb290aGVyc3RlcCIsInJhbmRJbnQiLCJsb3ciLCJoaWdoIiwiZmxvb3IiLCJyYW5kRmxvYXQiLCJyYW5kRmxvYXRTcHJlYWQiLCJyYW5nZSIsImRlZ1RvUmFkIiwiZGVncmVlcyIsInJhZFRvRGVnIiwicmFkaWFucyIsImlzUG93ZXJPZlR3byIsImNlaWxQb3dlck9mVHdvIiwicG93IiwiY2VpbCIsImxvZyIsIkxOMiIsImZsb29yUG93ZXJPZlR3byJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxLQUFLLEdBQUc7QUFFWEMsRUFBQUEsT0FBTyxFQUFFQyxJQUFJLENBQUNDLEVBQUwsR0FBVSxHQUZSO0FBR1hDLEVBQUFBLE9BQU8sRUFBRSxNQUFNRixJQUFJLENBQUNDLEVBSFQ7QUFLWEUsRUFBQUEsWUFBWSxFQUFJLFlBQVk7QUFFM0I7QUFFQSxRQUFJQyxHQUFHLEdBQUcsRUFBVjs7QUFFQSxTQUFNLElBQUlDLENBQUMsR0FBRyxDQUFkLEVBQWlCQSxDQUFDLEdBQUcsR0FBckIsRUFBMEJBLENBQUMsRUFBM0IsRUFBaUM7QUFFaENELE1BQUFBLEdBQUcsQ0FBRUMsQ0FBRixDQUFILEdBQVcsQ0FBRUEsQ0FBQyxHQUFHLEVBQUosR0FBUyxHQUFULEdBQWUsRUFBakIsSUFBMEJBLENBQUYsQ0FBTUMs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 Line truncated
@@ -0,0 +1,739 @@
import { Vector3 } from './Vector3.js';
/**
* @author mrdoob / http://mrdoob.com/
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author philogb / http://blog.thejit.org/
* @author jordi_ros / http://plattsoft.com
* @author D1plo1d / http://github.com/D1plo1d
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author timknip / http://www.floorplanner.com/
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*/
function Matrix4() {
this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
if (arguments.length > 0) {
console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.');
}
}
Object.assign(Matrix4.prototype, {
isMatrix4: true,
set: function (n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {
var te = this.elements;
te[0] = n11;
te[4] = n12;
te[8] = n13;
te[12] = n14;
te[1] = n21;
te[5] = n22;
te[9] = n23;
te[13] = n24;
te[2] = n31;
te[6] = n32;
te[10] = n33;
te[14] = n34;
te[3] = n41;
te[7] = n42;
te[11] = n43;
te[15] = n44;
return this;
},
identity: function () {
this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
return this;
},
clone: function () {
return new Matrix4().fromArray(this.elements);
},
copy: function (m) {
var te = this.elements;
var me = m.elements;
te[0] = me[0];
te[1] = me[1];
te[2] = me[2];
te[3] = me[3];
te[4] = me[4];
te[5] = me[5];
te[6] = me[6];
te[7] = me[7];
te[8] = me[8];
te[9] = me[9];
te[10] = me[10];
te[11] = me[11];
te[12] = me[12];
te[13] = me[13];
te[14] = me[14];
te[15] = me[15];
return this;
},
copyPosition: function (m) {
var te = this.elements,
me = m.elements;
te[12] = me[12];
te[13] = me[13];
te[14] = me[14];
return this;
},
extractBasis: function (xAxis, yAxis, zAxis) {
xAxis.setFromMatrixColumn(this, 0);
yAxis.setFromMatrixColumn(this, 1);
zAxis.setFromMatrixColumn(this, 2);
return this;
},
makeBasis: function (xAxis, yAxis, zAxis) {
this.set(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1);
return this;
},
extractRotation: function () {
var v1 = new Vector3();
return function extractRotation(m) {
// this method does not support reflection matrices
var te = this.elements;
var me = m.elements;
var scaleX = 1 / v1.setFromMatrixColumn(m, 0).length();
var scaleY = 1 / v1.setFromMatrixColumn(m, 1).length();
var scaleZ = 1 / v1.setFromMatrixColumn(m, 2).length();
te[0] = me[0] * scaleX;
te[1] = me[1] * scaleX;
te[2] = me[2] * scaleX;
te[3] = 0;
te[4] = me[4] * scaleY;
te[5] = me[5] * scaleY;
te[6] = me[6] * scaleY;
te[7] = 0;
te[8] = me[8] * scaleZ;
te[9] = me[9] * scaleZ;
te[10] = me[10] * scaleZ;
te[11] = 0;
te[12] = 0;
te[13] = 0;
te[14] = 0;
te[15] = 1;
return this;
};
}(),
makeRotationFromEuler: function (euler) {
if (!(euler && euler.isEuler)) {
console.error('THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.');
}
var te = this.elements;
var x = euler.x,
y = euler.y,
z = euler.z;
var a = Math.cos(x),
b = Math.sin(x);
var c = Math.cos(y),
d = Math.sin(y);
var e = Math.cos(z),
f = Math.sin(z);
if (euler.order === 'XYZ') {
var ae = a * e,
af = a * f,
be = b * e,
bf = b * f;
te[0] = c * e;
te[4] = -c * f;
te[8] = d;
te[1] = af + be * d;
te[5] = ae - bf * d;
te[9] = -b * c;
te[2] = bf - ae * d;
te[6] = be + af * d;
te[10] = a * c;
} else if (euler.order === 'YXZ') {
var ce = c * e,
cf = c * f,
de = d * e,
df = d * f;
te[0] = ce + df * b;
te[4] = de * b - cf;
te[8] = a * d;
te[1] = a * f;
te[5] = a * e;
te[9] = -b;
te[2] = cf * b - de;
te[6] = df + ce * b;
te[10] = a * c;
} else if (euler.order === 'ZXY') {
var ce = c * e,
cf = c * f,
de = d * e,
df = d * f;
te[0] = ce - df * b;
te[4] = -a * f;
te[8] = de + cf * b;
te[1] = cf + de * b;
te[5] = a * e;
te[9] = df - ce * b;
te[2] = -a * d;
te[6] = b;
te[10] = a * c;
} else if (euler.order === 'ZYX') {
var ae = a * e,
af = a * f,
be = b * e,
bf = b * f;
te[0] = c * e;
te[4] = be * d - af;
te[8] = ae * d + bf;
te[1] = c * f;
te[5] = bf * d + ae;
te[9] = af * d - be;
te[2] = -d;
te[6] = b * c;
te[10] = a * c;
} else if (euler.order === 'YZX') {
var ac = a * c,
ad = a * d,
bc = b * c,
bd = b * d;
te[0] = c * e;
te[4] = bd - ac * f;
te[8] = bc * f + ad;
te[1] = f;
te[5] = a * e;
te[9] = -b * e;
te[2] = -d * e;
te[6] = ad * f + bc;
te[10] = ac - bd * f;
} else if (euler.order === 'XZY') {
var ac = a * c,
ad = a * d,
bc = b * c,
bd = b * d;
te[0] = c * e;
te[4] = -f;
te[8] = d * e;
te[1] = ac * f + bd;
te[5] = a * e;
te[9] = ad * f - bc;
te[2] = bc * f - ad;
te[6] = b * e;
te[10] = bd * f + ac;
} // bottom row
te[3] = 0;
te[7] = 0;
te[11] = 0; // last column
te[12] = 0;
te[13] = 0;
te[14] = 0;
te[15] = 1;
return this;
},
makeRotationFromQuaternion: function () {
var zero = new Vector3(0, 0, 0);
var one = new Vector3(1, 1, 1);
return function makeRotationFromQuaternion(q) {
return this.compose(zero, q, one);
};
}(),
lookAt: function () {
var x = new Vector3();
var y = new Vector3();
var z = new Vector3();
return function lookAt(eye, target, up) {
var te = this.elements;
z.subVectors(eye, target);
if (z.lengthSq() === 0) {
// eye and target are in the same position
z.z = 1;
}
z.normalize();
x.crossVectors(up, z);
if (x.lengthSq() === 0) {
// up and z are parallel
if (Math.abs(up.z) === 1) {
z.x += 0.0001;
} else {
z.z += 0.0001;
}
z.normalize();
x.crossVectors(up, z);
}
x.normalize();
y.crossVectors(z, x);
te[0] = x.x;
te[4] = y.x;
te[8] = z.x;
te[1] = x.y;
te[5] = y.y;
te[9] = z.y;
te[2] = x.z;
te[6] = y.z;
te[10] = z.z;
return this;
};
}(),
multiply: function (m, n) {
if (n !== undefined) {
console.warn('THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.');
return this.multiplyMatrices(m, n);
}
return this.multiplyMatrices(this, m);
},
premultiply: function (m) {
return this.multiplyMatrices(m, this);
},
multiplyMatrices: function (a, b) {
var ae = a.elements;
var be = b.elements;
var te = this.elements;
var a11 = ae[0],
a12 = ae[4],
a13 = ae[8],
a14 = ae[12];
var a21 = ae[1],
a22 = ae[5],
a23 = ae[9],
a24 = ae[13];
var a31 = ae[2],
a32 = ae[6],
a33 = ae[10],
a34 = ae[14];
var a41 = ae[3],
a42 = ae[7],
a43 = ae[11],
a44 = ae[15];
var b11 = be[0],
b12 = be[4],
b13 = be[8],
b14 = be[12];
var b21 = be[1],
b22 = be[5],
b23 = be[9],
b24 = be[13];
var b31 = be[2],
b32 = be[6],
b33 = be[10],
b34 = be[14];
var b41 = be[3],
b42 = be[7],
b43 = be[11],
b44 = be[15];
te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
return this;
},
multiplyScalar: function (s) {
var te = this.elements;
te[0] *= s;
te[4] *= s;
te[8] *= s;
te[12] *= s;
te[1] *= s;
te[5] *= s;
te[9] *= s;
te[13] *= s;
te[2] *= s;
te[6] *= s;
te[10] *= s;
te[14] *= s;
te[3] *= s;
te[7] *= s;
te[11] *= s;
te[15] *= s;
return this;
},
applyToBufferAttribute: function () {
var v1 = new Vector3();
return function applyToBufferAttribute(attribute) {
for (var i = 0, l = attribute.count; i < l; i++) {
v1.x = attribute.getX(i);
v1.y = attribute.getY(i);
v1.z = attribute.getZ(i);
v1.applyMatrix4(this);
attribute.setXYZ(i, v1.x, v1.y, v1.z);
}
return attribute;
};
}(),
determinant: function () {
var te = this.elements;
var n11 = te[0],
n12 = te[4],
n13 = te[8],
n14 = te[12];
var n21 = te[1],
n22 = te[5],
n23 = te[9],
n24 = te[13];
var n31 = te[2],
n32 = te[6],
n33 = te[10],
n34 = te[14];
var n41 = te[3],
n42 = te[7],
n43 = te[11],
n44 = te[15]; //TODO: make this more efficient
//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
return n41 * (+n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34) + n42 * (+n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31) + n43 * (+n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31) + n44 * (-n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31);
},
transpose: function () {
var te = this.elements;
var tmp;
tmp = te[1];
te[1] = te[4];
te[4] = tmp;
tmp = te[2];
te[2] = te[8];
te[8] = tmp;
tmp = te[6];
te[6] = te[9];
te[9] = tmp;
tmp = te[3];
te[3] = te[12];
te[12] = tmp;
tmp = te[7];
te[7] = te[13];
te[13] = tmp;
tmp = te[11];
te[11] = te[14];
te[14] = tmp;
return this;
},
setPosition: function (x, y, z) {
var te = this.elements;
if (x.isVector3) {
te[12] = x.x;
te[13] = x.y;
te[14] = x.z;
} else {
te[12] = x;
te[13] = y;
te[14] = z;
}
return this;
},
getInverse: function (m, throwOnDegenerate) {
// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
var te = this.elements,
me = m.elements,
n11 = me[0],
n21 = me[1],
n31 = me[2],
n41 = me[3],
n12 = me[4],
n22 = me[5],
n32 = me[6],
n42 = me[7],
n13 = me[8],
n23 = me[9],
n33 = me[10],
n43 = me[11],
n14 = me[12],
n24 = me[13],
n34 = me[14],
n44 = me[15],
t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
if (det === 0) {
var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";
if (throwOnDegenerate === true) {
throw new Error(msg);
} else {
console.warn(msg);
}
return this.identity();
}
var detInv = 1 / det;
te[0] = t11 * detInv;
te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv;
te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv;
te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv;
te[4] = t12 * detInv;
te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv;
te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv;
te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv;
te[8] = t13 * detInv;
te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv;
te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv;
te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv;
te[12] = t14 * detInv;
te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv;
te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv;
te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv;
return this;
},
scale: function (v) {
var te = this.elements;
var x = v.x,
y = v.y,
z = v.z;
te[0] *= x;
te[4] *= y;
te[8] *= z;
te[1] *= x;
te[5] *= y;
te[9] *= z;
te[2] *= x;
te[6] *= y;
te[10] *= z;
te[3] *= x;
te[7] *= y;
te[11] *= z;
return this;
},
getMaxScaleOnAxis: function () {
var te = this.elements;
var scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];
var scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];
var scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];
return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));
},
makeTranslation: function (x, y, z) {
this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);
return this;
},
makeRotationX: function (theta) {
var c = Math.cos(theta),
s = Math.sin(theta);
this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);
return this;
},
makeRotationY: function (theta) {
var c = Math.cos(theta),
s = Math.sin(theta);
this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);
return this;
},
makeRotationZ: function (theta) {
var c = Math.cos(theta),
s = Math.sin(theta);
this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
return this;
},
makeRotationAxis: function (axis, angle) {
// Based on http://www.gamedev.net/reference/articles/article1199.asp
var c = Math.cos(angle);
var s = Math.sin(angle);
var t = 1 - c;
var x = axis.x,
y = axis.y,
z = axis.z;
var tx = t * x,
ty = t * y;
this.set(tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1);
return this;
},
makeScale: function (x, y, z) {
this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);
return this;
},
makeShear: function (x, y, z) {
this.set(1, y, z, 0, x, 1, z, 0, x, y, 1, 0, 0, 0, 0, 1);
return this;
},
compose: function (position, quaternion, scale) {
var te = this.elements;
var x = quaternion._x,
y = quaternion._y,
z = quaternion._z,
w = quaternion._w;
var x2 = x + x,
y2 = y + y,
z2 = z + z;
var xx = x * x2,
xy = x * y2,
xz = x * z2;
var yy = y * y2,
yz = y * z2,
zz = z * z2;
var wx = w * x2,
wy = w * y2,
wz = w * z2;
var sx = scale.x,
sy = scale.y,
sz = scale.z;
te[0] = (1 - (yy + zz)) * sx;
te[1] = (xy + wz) * sx;
te[2] = (xz - wy) * sx;
te[3] = 0;
te[4] = (xy - wz) * sy;
te[5] = (1 - (xx + zz)) * sy;
te[6] = (yz + wx) * sy;
te[7] = 0;
te[8] = (xz + wy) * sz;
te[9] = (yz - wx) * sz;
te[10] = (1 - (xx + yy)) * sz;
te[11] = 0;
te[12] = position.x;
te[13] = position.y;
te[14] = position.z;
te[15] = 1;
return this;
},
decompose: function () {
var vector = new Vector3();
var matrix = new Matrix4();
return function decompose(position, quaternion, scale) {
var te = this.elements;
var sx = vector.set(te[0], te[1], te[2]).length();
var sy = vector.set(te[4], te[5], te[6]).length();
var sz = vector.set(te[8], te[9], te[10]).length(); // if determine is negative, we need to invert one scale
var det = this.determinant();
if (det < 0) sx = -sx;
position.x = te[12];
position.y = te[13];
position.z = te[14]; // scale the rotation part
matrix.copy(this);
var invSX = 1 / sx;
var invSY = 1 / sy;
var invSZ = 1 / sz;
matrix.elements[0] *= invSX;
matrix.elements[1] *= invSX;
matrix.elements[2] *= invSX;
matrix.elements[4] *= invSY;
matrix.elements[5] *= invSY;
matrix.elements[6] *= invSY;
matrix.elements[8] *= invSZ;
matrix.elements[9] *= invSZ;
matrix.elements[10] *= invSZ;
quaternion.setFromRotationMatrix(matrix);
scale.x = sx;
scale.y = sy;
scale.z = sz;
return this;
};
}(),
makePerspective: function (left, right, top, bottom, near, far) {
if (far === undefined) {
console.warn('THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.');
}
var te = this.elements;
var x = 2 * near / (right - left);
var y = 2 * near / (top - bottom);
var a = (right + left) / (right - left);
var b = (top + bottom) / (top - bottom);
var c = -(far + near) / (far - near);
var d = -2 * far * near / (far - near);
te[0] = x;
te[4] = 0;
te[8] = a;
te[12] = 0;
te[1] = 0;
te[5] = y;
te[9] = b;
te[13] = 0;
te[2] = 0;
te[6] = 0;
te[10] = c;
te[14] = d;
te[3] = 0;
te[7] = 0;
te[11] = -1;
te[15] = 0;
return this;
},
makeOrthographic: function (left, right, top, bottom, near, far) {
var te = this.elements;
var w = 1.0 / (right - left);
var h = 1.0 / (top - bottom);
var p = 1.0 / (far - near);
var x = (right + left) * w;
var y = (top + bottom) * h;
var z = (far + near) * p;
te[0] = 2 * w;
te[4] = 0;
te[8] = 0;
te[12] = -x;
te[1] = 0;
te[5] = 2 * h;
te[9] = 0;
te[13] = -y;
te[2] = 0;
te[6] = 0;
te[10] = -2 * p;
te[14] = -z;
te[3] = 0;
te[7] = 0;
te[11] = 0;
te[15] = 1;
return this;
},
equals: function (matrix) {
var te = this.elements;
var me = matrix.elements;
for (var i = 0; i < 16; i++) {
if (te[i] !== me[i]) return false;
}
return true;
},
fromArray: function (array, offset) {
if (offset === undefined) offset = 0;
for (var i = 0; i < 16; i++) {
this.elements[i] = array[i + offset];
}
return this;
},
toArray: function (array, offset) {
if (array === undefined) array = [];
if (offset === undefined) offset = 0;
var te = this.elements;
array[offset] = te[0];
array[offset + 1] = te[1];
array[offset + 2] = te[2];
array[offset + 3] = te[3];
array[offset + 4] = te[4];
array[offset + 5] = te[5];
array[offset + 6] = te[6];
array[offset + 7] = te[7];
array[offset + 8] = te[8];
array[offset + 9] = te[9];
array[offset + 10] = te[10];
array[offset + 11] = te[11];
array[offset + 12] = te[12];
array[offset + 13] = te[13];
array[offset + 14] = te[14];
array[offset + 15] = te[15];
return array;
}
});
export { Matrix4 };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL01hdHJpeDQuanMiXSwibmFtZXMiOlsiVmVjdG9yMyIsIk1hdHJpeDQiLCJlbGVtZW50cyIsImFyZ3VtZW50cyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsIk9iamVjdCIsImFzc2lnbiIsInByb3RvdHlwZSIsImlzTWF0cml4NCIsInNldCIsIm4xMSIsIm4xMiIsIm4xMyIsIm4xNCIsIm4yMSIsIm4yMiIsIm4yMyIsIm4yNCIsIm4zMSIsIm4zMiIsIm4zMyIsIm4zNCIsIm40MSIsIm40MiIsIm40MyIsIm40NCIsInRlIiwiaWRlbnRpdHkiLCJjbG9uZSIsImZyb21BcnJheSIsImNvcHkiLCJtIiwibWUiLCJjb3B5UG9zaXRpb24iLCJleHRyYWN0QmFzaXMiLCJ4QXhpcyIsInlBeGlzIiwiekF4aXMiLCJzZXRGcm9tTWF0cml4Q29sdW1uIiwibWFrZUJhc2lzIiwieCIsInkiLCJ6IiwiZXh0cmFjdFJvdGF0aW9uIiwidjEiLCJzY2FsZVgiLCJzY2FsZVkiLCJzY2FsZVoiLCJtYWtlUm90YXRpb25Gcm9tRXVsZXIiLCJldWxlciIsImlzRXVsZXIiLCJhIiwiTWF0aCIsImNvcyIsImIiLCJzaW4iLCJjIiwiZCIsImUiLCJmIiwib3JkZXIiLCJhZSIsImFmIiwiYmUiLCJiZiIsImNlIiwiY2YiLCJkZSIsImRmIiwiYWMiLCJhZCIsImJjIiwiYmQiLCJtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiIsInplcm8iLCJvbmUiLCJxIiwiY29tcG9zZSIsImxvb2tBdCIsImV5ZSIsInRhcmdldCIsInVwIiwic3ViVmVjdG9ycyIsImxlbmd0aFNxIiwibm9ybWFsaXplIiwiY3Jvc3NWZWN0b3JzIiwiYWJzIiwibXVsdGlwbHkiLCJuIiwidW5kZWZpbmVkIiwid2FybiIsIm11bHRpcGx5TWF0cmljZXMiLCJwcmVtdWx0aXBseSIsImExMSIsImExMiIsImExMyIsImExNCIsImEyMSIsImEyMiIsImEyMyIsImEyNCIsImEzMSIsImEzMiIsImEzMyIsImEzNCIsImE0MSIsImE0MiIsImE0MyIsImE0NCIsImIxMSIsImIxMiIsImIxMyIsImIxNCIsImIyMSIsImIyMiIsImIyMyIsImIyNCIsImIzMSIsImIzMiIsImIzMyIsImIzNCIsImI0MSIsImI0MiIsImI0MyIsImI0NCIsIm11bHRpcGx5U2NhbGFyIiwicyIsImFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJpIiwibCIsImNvdW50IiwiZ2V0WCIsImdldFkiLCJnZXRaIiwiYXBwbHlNYXRyaXg0Iiwic2V0WFlaIiwiZGV0ZXJtaW5hbnQiLCJ0cmFuc3Bvc2UiLCJ0bXAiLCJzZXRQb3NpdGlvbiIsImlzVmVjdG9yMyIsImdldEludmVyc2UiLCJ0aHJvd09uRGVnZW5lcmF0ZSIsInQxMSIsInQxMiIsInQxMyIsInQxNCIsImRldCIsIm1zZyIsIkVycm9yIiwiZGV0SW52Iiwic2NhbGUiLCJ2IiwiZ2V0TWF4U2NhbGVPbkF4aXMiLCJzY2FsZVhTcSIsInNjYWxlWVNxIiwic2NhbGVaU3EiLCJzcXJ0IiwibWF4IiwibWFrZVRyYW5zbGF0aW9uIiwibWFrZVJvdGF0aW9uWCIsInRoZXRhIiwibWFrZVJvdGF0aW9uWSIsIm1ha2VSb3RhdGlvbloiLCJtYWtlUm90YXRpb25BeGlzIiwiYXhpcyIsImFuZ2xlIiwidCIsInR4IiwidHkiLCJtYWtlU2NhbGUiLCJtYWtlU2hlYXIiLCJwb3NpdGlvbiIsInF1YXRlcm5pb24iLCJfeCIsIl95IiwiX3oiLCJ3IiwiX3ciLCJ4MiIsInkyIiwiejIiLCJ4eCIsInh5IiwieHoiLCJ5eSIsInl6IiwienoiLCJ3eCIsInd5Iiwid3oiLCJzeCIsInN5Iiwic3oiLCJkZWNvbXBvc2UiLCJ2ZWN0b3IiLCJtYXRyaXgiLCJpbnZTWCIsImludlNZIiwiaW52U1oiLCJzZXRGcm9tUm90YXRpb25NYXRyaXgiLCJtYWtlUGVyc3BlY3RpdmUiLCJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iLCJuZWFyIiwiZmFyIiwibWFrZU9y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 Line truncated
@@ -0,0 +1,445 @@
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/
import { _Math } from './Math.js';
function Quaternion(x, y, z, w) {
this._x = x || 0;
this._y = y || 0;
this._z = z || 0;
this._w = w !== undefined ? w : 1;
}
Object.assign(Quaternion, {
slerp: function (qa, qb, qm, t) {
return qm.copy(qa).slerp(qb, t);
},
slerpFlat: function (dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {
// fuzz-free, array-based Quaternion SLERP operation
var x0 = src0[srcOffset0 + 0],
y0 = src0[srcOffset0 + 1],
z0 = src0[srcOffset0 + 2],
w0 = src0[srcOffset0 + 3],
x1 = src1[srcOffset1 + 0],
y1 = src1[srcOffset1 + 1],
z1 = src1[srcOffset1 + 2],
w1 = src1[srcOffset1 + 3];
if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {
var s = 1 - t,
cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
dir = cos >= 0 ? 1 : -1,
sqrSin = 1 - cos * cos; // Skip the Slerp for tiny steps to avoid numeric problems:
if (sqrSin > Number.EPSILON) {
var sin = Math.sqrt(sqrSin),
len = Math.atan2(sin, cos * dir);
s = Math.sin(s * len) / sin;
t = Math.sin(t * len) / sin;
}
var tDir = t * dir;
x0 = x0 * s + x1 * tDir;
y0 = y0 * s + y1 * tDir;
z0 = z0 * s + z1 * tDir;
w0 = w0 * s + w1 * tDir; // Normalize in case we just did a lerp:
if (s === 1 - t) {
var f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);
x0 *= f;
y0 *= f;
z0 *= f;
w0 *= f;
}
}
dst[dstOffset] = x0;
dst[dstOffset + 1] = y0;
dst[dstOffset + 2] = z0;
dst[dstOffset + 3] = w0;
}
});
Object.defineProperties(Quaternion.prototype, {
x: {
get: function () {
return this._x;
},
set: function (value) {
this._x = value;
this._onChangeCallback();
}
},
y: {
get: function () {
return this._y;
},
set: function (value) {
this._y = value;
this._onChangeCallback();
}
},
z: {
get: function () {
return this._z;
},
set: function (value) {
this._z = value;
this._onChangeCallback();
}
},
w: {
get: function () {
return this._w;
},
set: function (value) {
this._w = value;
this._onChangeCallback();
}
}
});
Object.assign(Quaternion.prototype, {
isQuaternion: true,
set: function (x, y, z, w) {
this._x = x;
this._y = y;
this._z = z;
this._w = w;
this._onChangeCallback();
return this;
},
clone: function () {
return new this.constructor(this._x, this._y, this._z, this._w);
},
copy: function (quaternion) {
this._x = quaternion.x;
this._y = quaternion.y;
this._z = quaternion.z;
this._w = quaternion.w;
this._onChangeCallback();
return this;
},
setFromEuler: function (euler, update) {
if (!(euler && euler.isEuler)) {
throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.');
}
var x = euler._x,
y = euler._y,
z = euler._z,
order = euler.order; // http://www.mathworks.com/matlabcentral/fileexchange/
// 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
// content/SpinCalc.m
var cos = Math.cos;
var sin = Math.sin;
var c1 = cos(x / 2);
var c2 = cos(y / 2);
var c3 = cos(z / 2);
var s1 = sin(x / 2);
var s2 = sin(y / 2);
var s3 = sin(z / 2);
if (order === 'XYZ') {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if (order === 'YXZ') {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
} else if (order === 'ZXY') {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if (order === 'ZYX') {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
} else if (order === 'YZX') {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if (order === 'XZY') {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
}
if (update !== false) this._onChangeCallback();
return this;
},
setFromAxisAngle: function (axis, angle) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
// assumes axis is normalized
var halfAngle = angle / 2,
s = Math.sin(halfAngle);
this._x = axis.x * s;
this._y = axis.y * s;
this._z = axis.z * s;
this._w = Math.cos(halfAngle);
this._onChangeCallback();
return this;
},
setFromRotationMatrix: function (m) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te = m.elements,
m11 = te[0],
m12 = te[4],
m13 = te[8],
m21 = te[1],
m22 = te[5],
m23 = te[9],
m31 = te[2],
m32 = te[6],
m33 = te[10],
trace = m11 + m22 + m33,
s;
if (trace > 0) {
s = 0.5 / Math.sqrt(trace + 1.0);
this._w = 0.25 / s;
this._x = (m32 - m23) * s;
this._y = (m13 - m31) * s;
this._z = (m21 - m12) * s;
} else if (m11 > m22 && m11 > m33) {
s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);
this._w = (m32 - m23) / s;
this._x = 0.25 * s;
this._y = (m12 + m21) / s;
this._z = (m13 + m31) / s;
} else if (m22 > m33) {
s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);
this._w = (m13 - m31) / s;
this._x = (m12 + m21) / s;
this._y = 0.25 * s;
this._z = (m23 + m32) / s;
} else {
s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);
this._w = (m21 - m12) / s;
this._x = (m13 + m31) / s;
this._y = (m23 + m32) / s;
this._z = 0.25 * s;
}
this._onChangeCallback();
return this;
},
setFromUnitVectors: function (vFrom, vTo) {
// assumes direction vectors vFrom and vTo are normalized
var EPS = 0.000001;
var r = vFrom.dot(vTo) + 1;
if (r < EPS) {
r = 0;
if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {
this._x = -vFrom.y;
this._y = vFrom.x;
this._z = 0;
this._w = r;
} else {
this._x = 0;
this._y = -vFrom.z;
this._z = vFrom.y;
this._w = r;
}
} else {
// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3
this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;
this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;
this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;
this._w = r;
}
return this.normalize();
},
angleTo: function (q) {
return 2 * Math.acos(Math.abs(_Math.clamp(this.dot(q), -1, 1)));
},
rotateTowards: function (q, step) {
var angle = this.angleTo(q);
if (angle === 0) return this;
var t = Math.min(1, step / angle);
this.slerp(q, t);
return this;
},
inverse: function () {
// quaternion is assumed to have unit length
return this.conjugate();
},
conjugate: function () {
this._x *= -1;
this._y *= -1;
this._z *= -1;
this._onChangeCallback();
return this;
},
dot: function (v) {
return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
},
lengthSq: function () {
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
},
length: function () {
return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
},
normalize: function () {
var l = this.length();
if (l === 0) {
this._x = 0;
this._y = 0;
this._z = 0;
this._w = 1;
} else {
l = 1 / l;
this._x = this._x * l;
this._y = this._y * l;
this._z = this._z * l;
this._w = this._w * l;
}
this._onChangeCallback();
return this;
},
multiply: function (q, p) {
if (p !== undefined) {
console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.');
return this.multiplyQuaternions(q, p);
}
return this.multiplyQuaternions(this, q);
},
premultiply: function (q) {
return this.multiplyQuaternions(q, this);
},
multiplyQuaternions: function (a, b) {
// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
var qax = a._x,
qay = a._y,
qaz = a._z,
qaw = a._w;
var qbx = b._x,
qby = b._y,
qbz = b._z,
qbw = b._w;
this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
this._onChangeCallback();
return this;
},
slerp: function (qb, t) {
if (t === 0) return this;
if (t === 1) return this.copy(qb);
var x = this._x,
y = this._y,
z = this._z,
w = this._w; // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
if (cosHalfTheta < 0) {
this._w = -qb._w;
this._x = -qb._x;
this._y = -qb._y;
this._z = -qb._z;
cosHalfTheta = -cosHalfTheta;
} else {
this.copy(qb);
}
if (cosHalfTheta >= 1.0) {
this._w = w;
this._x = x;
this._y = y;
this._z = z;
return this;
}
var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;
if (sqrSinHalfTheta <= Number.EPSILON) {
var s = 1 - t;
this._w = s * w + t * this._w;
this._x = s * x + t * this._x;
this._y = s * y + t * this._y;
this._z = s * z + t * this._z;
this.normalize();
this._onChangeCallback();
return this;
}
var sinHalfTheta = Math.sqrt(sqrSinHalfTheta);
var halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);
var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta,
ratioB = Math.sin(t * halfTheta) / sinHalfTheta;
this._w = w * ratioA + this._w * ratioB;
this._x = x * ratioA + this._x * ratioB;
this._y = y * ratioA + this._y * ratioB;
this._z = z * ratioA + this._z * ratioB;
this._onChangeCallback();
return this;
},
equals: function (quaternion) {
return quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w;
},
fromArray: function (array, offset) {
if (offset === undefined) offset = 0;
this._x = array[offset];
this._y = array[offset + 1];
this._z = array[offset + 2];
this._w = array[offset + 3];
this._onChangeCallback();
return this;
},
toArray: function (array, offset) {
if (array === undefined) array = [];
if (offset === undefined) offset = 0;
array[offset] = this._x;
array[offset + 1] = this._y;
array[offset + 2] = this._z;
array[offset + 3] = this._w;
return array;
},
_onChange: function (callback) {
this._onChangeCallback = callback;
return this;
},
_onChangeCallback: function () {}
});
export { Quaternion };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL1F1YXRlcm5pb24uanMiXSwibmFtZXMiOlsiX01hdGgiLCJRdWF0ZXJuaW9uIiwieCIsInkiLCJ6IiwidyIsIl94IiwiX3kiLCJfeiIsIl93IiwidW5kZWZpbmVkIiwiT2JqZWN0IiwiYXNzaWduIiwic2xlcnAiLCJxYSIsInFiIiwicW0iLCJ0IiwiY29weSIsInNsZXJwRmxhdCIsImRzdCIsImRzdE9mZnNldCIsInNyYzAiLCJzcmNPZmZzZXQwIiwic3JjMSIsInNyY09mZnNldDEiLCJ4MCIsInkwIiwiejAiLCJ3MCIsIngxIiwieTEiLCJ6MSIsIncxIiwicyIsImNvcyIsImRpciIsInNxclNpbiIsIk51bWJlciIsIkVQU0lMT04iLCJzaW4iLCJNYXRoIiwic3FydCIsImxlbiIsImF0YW4yIiwidERpciIsImYiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvdG90eXBlIiwiZ2V0Iiwic2V0IiwidmFsdWUiLCJfb25DaGFuZ2VDYWxsYmFjayIsImlzUXVhdGVybmlvbiIsImNsb25lIiwiY29uc3RydWN0b3IiLCJxdWF0ZXJuaW9uIiwic2V0RnJvbUV1bGVyIiwiZXVsZXIiLCJ1cGRhdGUiLCJpc0V1bGVyIiwiRXJyb3IiLCJvcmRlciIsImMxIiwiYzIiLCJjMyIsInMxIiwiczIiLCJzMyIsInNldEZyb21BeGlzQW5nbGUiLCJheGlzIiwiYW5nbGUiLCJoYWxmQW5nbGUiLCJzZXRGcm9tUm90YXRpb25NYXRyaXgiLCJtIiwidGUiLCJlbGVtZW50cyIsIm0xMSIsIm0xMiIsIm0xMyIsIm0yMSIsIm0yMiIsIm0yMyIsIm0zMSIsIm0zMiIsIm0zMyIsInRyYWNlIiwic2V0RnJvbVVuaXRWZWN0b3JzIiwidkZyb20iLCJ2VG8iLCJFUFMiLCJyIiwiZG90IiwiYWJzIiwibm9ybWFsaXplIiwiYW5nbGVUbyIsInEiLCJhY29zIiwiY2xhbXAiLCJyb3RhdGVUb3dhcmRzIiwic3RlcCIsIm1pbiIsImludmVyc2UiLCJjb25qdWdhdGUiLCJ2IiwibGVuZ3RoU3EiLCJsZW5ndGgiLCJsIiwibXVsdGlwbHkiLCJwIiwiY29uc29sZSIsIndhcm4iLCJtdWx0aXBseVF1YXRlcm5pb25zIiwicHJlbXVsdGlwbHkiLCJhIiwiYiIsInFheCIsInFheSIsInFheiIsInFhdyIsInFieCIsInFieSIsInFieiIsInFidyIsImNvc0hhbGZUaGV0YSIsInNxclNpbkhhbGZUaGV0YSIsInNpbkhhbGZUaGV0YSIsImhhbGZUaGV0YSIsInJhdGlvQSIsInJhdGlvQiIsImVxdWFscyIsImZyb21BcnJheSIsImFycmF5Iiwib2Zmc2V0IiwidG9BcnJheSIsIl9vbkNoYW5nZSIsImNhbGxiYWNrIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxTQUFTQSxLQUFULFFBQXNCLFdBQXRCOztBQUVBLFNBQVNDLFVBQVQsQ0FBcUJDLENBQXJCLEVBQXdCQyxDQUF4QixFQUEyQkMsQ0FBM0IsRUFBOEJDLENBQTlCLEVBQWtDO0FBRWpDLE9BQUtDLEVBQUwsR0FBVUosQ0FBQyxJQUFJLENBQWY7QUFDQSxPQUFLSyxFQUFMLEdBQVVKLENBQUMsSUFBSSxDQUFmO0FBQ0EsT0FBS0ssRUFBTCxHQUFVSixDQUFDLElBQUksQ0FBZjtBQUNBLE9BQUtLLEVBQUwsR0FBWUosQ0FBQyxLQUFLSyxTQUFSLEdBQXNCTCxDQUF0QixHQUEwQixDQUFwQztBQUVBOztBQUVETSxNQUFNLENBQUNDLE1BQVAsQ0FBZVgsVUFBZixFQUEyQjtBQUUxQlksRUFBQUEsS0FBSyxFQUFFLFVBQVdDLEVBQVgsRUFBZUMsRUFBZixFQUFtQkMsRUFBbkIsRUFBdUJDLENBQXZCLEVBQTJCO0FBRWpDLFdBQU9ELEVBQUUsQ0FBQ0UsSUFBSCxDQUFTSixFQUFULEVBQWNELEtBQWQsQ0FBcUJFLEVBQXJCLEVBQXlCRSxDQUF6QixDQUFQO0FBRUEsR0FOeUI7QUFRMUJFLEVBQUFBLFNBQVMsRUFBRSxVQUFXQyxHQUFYLEVBQWdCQyxTQUFoQixFQUEyQkMsSUFB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 Line truncated
@@ -0,0 +1,457 @@
import { _Math } from './Math.js';
import { Quaternion } from './Quaternion.js';
/**
* @author mrdoob / http://mrdoob.com/
* @author kile / http://kile.stravaganza.org/
* @author philogb / http://blog.thejit.org/
* @author mikael emtinger / http://gomo.se/
* @author egraether / http://egraether.com/
* @author WestLangley / http://github.com/WestLangley
*/
function Vector3(x, y, z) {
this.x = x || 0;
this.y = y || 0;
this.z = z || 0;
}
Object.assign(Vector3.prototype, {
isVector3: true,
set: function (x, y, z) {
this.x = x;
this.y = y;
this.z = z;
return this;
},
setScalar: function (scalar) {
this.x = scalar;
this.y = scalar;
this.z = scalar;
return this;
},
setX: function (x) {
this.x = x;
return this;
},
setY: function (y) {
this.y = y;
return this;
},
setZ: function (z) {
this.z = z;
return this;
},
setComponent: function (index, value) {
switch (index) {
case 0:
this.x = value;
break;
case 1:
this.y = value;
break;
case 2:
this.z = value;
break;
default:
throw new Error('index is out of range: ' + index);
}
return this;
},
getComponent: function (index) {
switch (index) {
case 0:
return this.x;
case 1:
return this.y;
case 2:
return this.z;
default:
throw new Error('index is out of range: ' + index);
}
},
clone: function () {
return new this.constructor(this.x, this.y, this.z);
},
copy: function (v) {
this.x = v.x;
this.y = v.y;
this.z = v.z;
return this;
},
add: function (v, w) {
if (w !== undefined) {
console.warn('THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
return this.addVectors(v, w);
}
this.x += v.x;
this.y += v.y;
this.z += v.z;
return this;
},
addScalar: function (s) {
this.x += s;
this.y += s;
this.z += s;
return this;
},
addVectors: function (a, b) {
this.x = a.x + b.x;
this.y = a.y + b.y;
this.z = a.z + b.z;
return this;
},
addScaledVector: function (v, s) {
this.x += v.x * s;
this.y += v.y * s;
this.z += v.z * s;
return this;
},
sub: function (v, w) {
if (w !== undefined) {
console.warn('THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
return this.subVectors(v, w);
}
this.x -= v.x;
this.y -= v.y;
this.z -= v.z;
return this;
},
subScalar: function (s) {
this.x -= s;
this.y -= s;
this.z -= s;
return this;
},
subVectors: function (a, b) {
this.x = a.x - b.x;
this.y = a.y - b.y;
this.z = a.z - b.z;
return this;
},
multiply: function (v, w) {
if (w !== undefined) {
console.warn('THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.');
return this.multiplyVectors(v, w);
}
this.x *= v.x;
this.y *= v.y;
this.z *= v.z;
return this;
},
multiplyScalar: function (scalar) {
this.x *= scalar;
this.y *= scalar;
this.z *= scalar;
return this;
},
multiplyVectors: function (a, b) {
this.x = a.x * b.x;
this.y = a.y * b.y;
this.z = a.z * b.z;
return this;
},
applyEuler: function () {
var quaternion = new Quaternion();
return function applyEuler(euler) {
if (!(euler && euler.isEuler)) {
console.error('THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.');
}
return this.applyQuaternion(quaternion.setFromEuler(euler));
};
}(),
applyAxisAngle: function () {
var quaternion = new Quaternion();
return function applyAxisAngle(axis, angle) {
return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle));
};
}(),
applyMatrix3: function (m) {
var x = this.x,
y = this.y,
z = this.z;
var e = m.elements;
this.x = e[0] * x + e[3] * y + e[6] * z;
this.y = e[1] * x + e[4] * y + e[7] * z;
this.z = e[2] * x + e[5] * y + e[8] * z;
return this;
},
applyMatrix4: function (m) {
var x = this.x,
y = this.y,
z = this.z;
var e = m.elements;
var w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);
this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;
this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;
this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;
return this;
},
applyQuaternion: function (q) {
var x = this.x,
y = this.y,
z = this.z;
var qx = q.x,
qy = q.y,
qz = q.z,
qw = q.w; // calculate quat * vector
var ix = qw * x + qy * z - qz * y;
var iy = qw * y + qz * x - qx * z;
var iz = qw * z + qx * y - qy * x;
var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat
this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
return this;
},
project: function (camera) {
return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix);
},
unproject: function (camera) {
return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.matrixWorld);
},
transformDirection: function (m) {
// input: THREE.Matrix4 affine matrix
// vector interpreted as a direction
var x = this.x,
y = this.y,
z = this.z;
var e = m.elements;
this.x = e[0] * x + e[4] * y + e[8] * z;
this.y = e[1] * x + e[5] * y + e[9] * z;
this.z = e[2] * x + e[6] * y + e[10] * z;
return this.normalize();
},
divide: function (v) {
this.x /= v.x;
this.y /= v.y;
this.z /= v.z;
return this;
},
divideScalar: function (scalar) {
return this.multiplyScalar(1 / scalar);
},
min: function (v) {
this.x = Math.min(this.x, v.x);
this.y = Math.min(this.y, v.y);
this.z = Math.min(this.z, v.z);
return this;
},
max: function (v) {
this.x = Math.max(this.x, v.x);
this.y = Math.max(this.y, v.y);
this.z = Math.max(this.z, v.z);
return this;
},
clamp: function (min, max) {
// assumes min < max, componentwise
this.x = Math.max(min.x, Math.min(max.x, this.x));
this.y = Math.max(min.y, Math.min(max.y, this.y));
this.z = Math.max(min.z, Math.min(max.z, this.z));
return this;
},
clampScalar: function (minVal, maxVal) {
this.x = Math.max(minVal, Math.min(maxVal, this.x));
this.y = Math.max(minVal, Math.min(maxVal, this.y));
this.z = Math.max(minVal, Math.min(maxVal, this.z));
return this;
},
clampLength: function (min, max) {
var length = this.length();
return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
},
floor: function () {
this.x = Math.floor(this.x);
this.y = Math.floor(this.y);
this.z = Math.floor(this.z);
return this;
},
ceil: function () {
this.x = Math.ceil(this.x);
this.y = Math.ceil(this.y);
this.z = Math.ceil(this.z);
return this;
},
round: function () {
this.x = Math.round(this.x);
this.y = Math.round(this.y);
this.z = Math.round(this.z);
return this;
},
roundToZero: function () {
this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x);
this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y);
this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z);
return this;
},
negate: function () {
this.x = -this.x;
this.y = -this.y;
this.z = -this.z;
return this;
},
dot: function (v) {
return this.x * v.x + this.y * v.y + this.z * v.z;
},
// TODO lengthSquared?
lengthSq: function () {
return this.x * this.x + this.y * this.y + this.z * this.z;
},
length: function () {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
},
manhattanLength: function () {
return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);
},
normalize: function () {
return this.divideScalar(this.length() || 1);
},
setLength: function (length) {
return this.normalize().multiplyScalar(length);
},
lerp: function (v, alpha) {
this.x += (v.x - this.x) * alpha;
this.y += (v.y - this.y) * alpha;
this.z += (v.z - this.z) * alpha;
return this;
},
lerpVectors: function (v1, v2, alpha) {
return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1);
},
cross: function (v, w) {
if (w !== undefined) {
console.warn('THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.');
return this.crossVectors(v, w);
}
return this.crossVectors(this, v);
},
crossVectors: function (a, b) {
var ax = a.x,
ay = a.y,
az = a.z;
var bx = b.x,
by = b.y,
bz = b.z;
this.x = ay * bz - az * by;
this.y = az * bx - ax * bz;
this.z = ax * by - ay * bx;
return this;
},
projectOnVector: function (vector) {
var scalar = vector.dot(this) / vector.lengthSq();
return this.copy(vector).multiplyScalar(scalar);
},
projectOnPlane: function () {
var v1 = new Vector3();
return function projectOnPlane(planeNormal) {
v1.copy(this).projectOnVector(planeNormal);
return this.sub(v1);
};
}(),
reflect: function () {
// reflect incident vector off plane orthogonal to normal
// normal is assumed to have unit length
var v1 = new Vector3();
return function reflect(normal) {
return this.sub(v1.copy(normal).multiplyScalar(2 * this.dot(normal)));
};
}(),
angleTo: function (v) {
var theta = this.dot(v) / Math.sqrt(this.lengthSq() * v.lengthSq()); // clamp, to handle numerical problems
return Math.acos(_Math.clamp(theta, -1, 1));
},
distanceTo: function (v) {
return Math.sqrt(this.distanceToSquared(v));
},
distanceToSquared: function (v) {
var dx = this.x - v.x,
dy = this.y - v.y,
dz = this.z - v.z;
return dx * dx + dy * dy + dz * dz;
},
manhattanDistanceTo: function (v) {
return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z);
},
setFromSpherical: function (s) {
return this.setFromSphericalCoords(s.radius, s.phi, s.theta);
},
setFromSphericalCoords: function (radius, phi, theta) {
var sinPhiRadius = Math.sin(phi) * radius;
this.x = sinPhiRadius * Math.sin(theta);
this.y = Math.cos(phi) * radius;
this.z = sinPhiRadius * Math.cos(theta);
return this;
},
setFromCylindrical: function (c) {
return this.setFromCylindricalCoords(c.radius, c.theta, c.y);
},
setFromCylindricalCoords: function (radius, theta, y) {
this.x = radius * Math.sin(theta);
this.y = y;
this.z = radius * Math.cos(theta);
return this;
},
setFromMatrixPosition: function (m) {
var e = m.elements;
this.x = e[12];
this.y = e[13];
this.z = e[14];
return this;
},
setFromMatrixScale: function (m) {
var sx = this.setFromMatrixColumn(m, 0).length();
var sy = this.setFromMatrixColumn(m, 1).length();
var sz = this.setFromMatrixColumn(m, 2).length();
this.x = sx;
this.y = sy;
this.z = sz;
return this;
},
setFromMatrixColumn: function (m, index) {
return this.fromArray(m.elements, index * 4);
},
equals: function (v) {
return v.x === this.x && v.y === this.y && v.z === this.z;
},
fromArray: function (array, offset) {
if (offset === undefined) offset = 0;
this.x = array[offset];
this.y = array[offset + 1];
this.z = array[offset + 2];
return this;
},
toArray: function (array, offset) {
if (array === undefined) array = [];
if (offset === undefined) offset = 0;
array[offset] = this.x;
array[offset + 1] = this.y;
array[offset + 2] = this.z;
return array;
},
fromBufferAttribute: function (attribute, index, offset) {
if (offset !== undefined) {
console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().');
}
this.x = attribute.getX(index);
this.y = attribute.getY(index);
this.z = attribute.getZ(index);
return this;
}
});
export { Vector3 };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL1ZlY3RvcjMuanMiXSwibmFtZXMiOlsiX01hdGgiLCJRdWF0ZXJuaW9uIiwiVmVjdG9yMyIsIngiLCJ5IiwieiIsIk9iamVjdCIsImFzc2lnbiIsInByb3RvdHlwZSIsImlzVmVjdG9yMyIsInNldCIsInNldFNjYWxhciIsInNjYWxhciIsInNldFgiLCJzZXRZIiwic2V0WiIsInNldENvbXBvbmVudCIsImluZGV4IiwidmFsdWUiLCJFcnJvciIsImdldENvbXBvbmVudCIsImNsb25lIiwiY29uc3RydWN0b3IiLCJjb3B5IiwidiIsImFkZCIsInciLCJ1bmRlZmluZWQiLCJjb25zb2xlIiwid2FybiIsImFkZFZlY3RvcnMiLCJhZGRTY2FsYXIiLCJzIiwiYSIsImIiLCJhZGRTY2FsZWRWZWN0b3IiLCJzdWIiLCJzdWJWZWN0b3JzIiwic3ViU2NhbGFyIiwibXVsdGlwbHkiLCJtdWx0aXBseVZlY3RvcnMiLCJtdWx0aXBseVNjYWxhciIsImFwcGx5RXVsZXIiLCJxdWF0ZXJuaW9uIiwiZXVsZXIiLCJpc0V1bGVyIiwiZXJyb3IiLCJhcHBseVF1YXRlcm5pb24iLCJzZXRGcm9tRXVsZXIiLCJhcHBseUF4aXNBbmdsZSIsImF4aXMiLCJhbmdsZSIsInNldEZyb21BeGlzQW5nbGUiLCJhcHBseU1hdHJpeDMiLCJtIiwiZSIsImVsZW1lbnRzIiwiYXBwbHlNYXRyaXg0IiwicSIsInF4IiwicXkiLCJxeiIsInF3IiwiaXgiLCJpeSIsIml6IiwiaXciLCJwcm9qZWN0IiwiY2FtZXJhIiwibWF0cml4V29ybGRJbnZlcnNlIiwicHJvamVjdGlvbk1hdHJpeCIsInVucHJvamVjdCIsInByb2plY3Rpb25NYXRyaXhJbnZlcnNlIiwibWF0cml4V29ybGQiLCJ0cmFuc2Zvcm1EaXJlY3Rpb24iLCJub3JtYWxpemUiLCJkaXZpZGUiLCJkaXZpZGVTY2FsYXIiLCJtaW4iLCJNYXRoIiwibWF4IiwiY2xhbXAiLCJjbGFtcFNjYWxhciIsIm1pblZhbCIsIm1heFZhbCIsImNsYW1wTGVuZ3RoIiwibGVuZ3RoIiwiZmxvb3IiLCJjZWlsIiwicm91bmQiLCJyb3VuZFRvWmVybyIsIm5lZ2F0ZSIsImRvdCIsImxlbmd0aFNxIiwic3FydCIsIm1hbmhhdHRhbkxlbmd0aCIsImFicyIsInNldExlbmd0aCIsImxlcnAiLCJhbHBoYSIsImxlcnBWZWN0b3JzIiwidjEiLCJ2MiIsImNyb3NzIiwiY3Jvc3NWZWN0b3JzIiwiYXgiLCJheSIsImF6IiwiYngiLCJieSIsImJ6IiwicHJvamVjdE9uVmVjdG9yIiwidmVjdG9yIiwicHJvamVjdE9uUGxhbmUiLCJwbGFuZU5vcm1hbCIsInJlZmxlY3QiLCJub3JtYWwiLCJhbmdsZVRvIiwidGhldGEiLCJhY29zIiwiZGlzdGFuY2VUbyIsImRpc3RhbmNlVG9TcXVhcmVkIiwiZHgiLCJkeSIsImR6IiwibWFuaGF0dGFuRGlzdGFuY2VUbyIsInNldEZyb21TcGhlcmljYWwiLCJzZXRGcm9tU3BoZXJpY2FsQ29vcmRzIiwicmFkaXVzIiwicGhpIiwic2luUGhpUmFkaXVzIiwic2luIiwiY29zIiwic2V0RnJvbUN5bGluZHJpY2FsIiwiYyIsInNldEZyb21DeWxpbmRyaWNhbENvb3JkcyIsInNldEZyb21NYXRyaXhQb3NpdGlvbiIsInNldEZyb21NYXRyaXhTY2FsZSIsInN4Iiwic2V0RnJvbU1hdHJpeENvbHVtbiIsInN5Iiwic3oiLCJmcm9tQXJyYXkiLCJlcXVhbHMiLCJhcnJheSIsIm9mZnNldCIsInRvQXJyYXkiLCJmcm9tQnVmZmVyQXR0cmlidXRlIiwiYXR0cmlidXRlIiwiZ2V0WCIsImdldFkiLCJnZXRaIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxLQUFULFFBQXNCLFdBQXRCO0FBQ0EsU0FBU0MsVUFBVCxRQUEyQixpQkFBM0I7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVNDLE9BQVQsQ0FBa0JDLENBQWxCLEVBQXFCQyxDQUFyQixFQUF3QkMsQ0FB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 Line truncated
@@ -0,0 +1,148 @@
export var REVISION = '106';
export var MOUSE = {
LEFT: 0,
MIDDLE: 1,
RIGHT: 2
};
export var CullFaceNone = 0;
export var CullFaceBack = 1;
export var CullFaceFront = 2;
export var CullFaceFrontBack = 3;
export var FrontFaceDirectionCW = 0;
export var FrontFaceDirectionCCW = 1;
export var BasicShadowMap = 0;
export var PCFShadowMap = 1;
export var PCFSoftShadowMap = 2;
export var FrontSide = 0;
export var BackSide = 1;
export var DoubleSide = 2;
export var FlatShading = 1;
export var SmoothShading = 2;
export var NoColors = 0;
export var FaceColors = 1;
export var VertexColors = 2;
export var NoBlending = 0;
export var NormalBlending = 1;
export var AdditiveBlending = 2;
export var SubtractiveBlending = 3;
export var MultiplyBlending = 4;
export var CustomBlending = 5;
export var AddEquation = 100;
export var SubtractEquation = 101;
export var ReverseSubtractEquation = 102;
export var MinEquation = 103;
export var MaxEquation = 104;
export var ZeroFactor = 200;
export var OneFactor = 201;
export var SrcColorFactor = 202;
export var OneMinusSrcColorFactor = 203;
export var SrcAlphaFactor = 204;
export var OneMinusSrcAlphaFactor = 205;
export var DstAlphaFactor = 206;
export var OneMinusDstAlphaFactor = 207;
export var DstColorFactor = 208;
export var OneMinusDstColorFactor = 209;
export var SrcAlphaSaturateFactor = 210;
export var NeverDepth = 0;
export var AlwaysDepth = 1;
export var LessDepth = 2;
export var LessEqualDepth = 3;
export var EqualDepth = 4;
export var GreaterEqualDepth = 5;
export var GreaterDepth = 6;
export var NotEqualDepth = 7;
export var MultiplyOperation = 0;
export var MixOperation = 1;
export var AddOperation = 2;
export var NoToneMapping = 0;
export var LinearToneMapping = 1;
export var ReinhardToneMapping = 2;
export var Uncharted2ToneMapping = 3;
export var CineonToneMapping = 4;
export var ACESFilmicToneMapping = 5;
export var UVMapping = 300;
export var CubeReflectionMapping = 301;
export var CubeRefractionMapping = 302;
export var EquirectangularReflectionMapping = 303;
export var EquirectangularRefractionMapping = 304;
export var SphericalReflectionMapping = 305;
export var CubeUVReflectionMapping = 306;
export var CubeUVRefractionMapping = 307;
export var RepeatWrapping = 1000;
export var ClampToEdgeWrapping = 1001;
export var MirroredRepeatWrapping = 1002;
export var NearestFilter = 1003;
export var NearestMipMapNearestFilter = 1004;
export var NearestMipMapLinearFilter = 1005;
export var LinearFilter = 1006;
export var LinearMipMapNearestFilter = 1007;
export var LinearMipMapLinearFilter = 1008;
export var UnsignedByteType = 1009;
export var ByteType = 1010;
export var ShortType = 1011;
export var UnsignedShortType = 1012;
export var IntType = 1013;
export var UnsignedIntType = 1014;
export var FloatType = 1015;
export var HalfFloatType = 1016;
export var UnsignedShort4444Type = 1017;
export var UnsignedShort5551Type = 1018;
export var UnsignedShort565Type = 1019;
export var UnsignedInt248Type = 1020;
export var AlphaFormat = 1021;
export var RGBFormat = 1022;
export var RGBAFormat = 1023;
export var LuminanceFormat = 1024;
export var LuminanceAlphaFormat = 1025;
export var RGBEFormat = RGBAFormat;
export var DepthFormat = 1026;
export var DepthStencilFormat = 1027;
export var RedFormat = 1028;
export var RGB_S3TC_DXT1_Format = 33776;
export var RGBA_S3TC_DXT1_Format = 33777;
export var RGBA_S3TC_DXT3_Format = 33778;
export var RGBA_S3TC_DXT5_Format = 33779;
export var RGB_PVRTC_4BPPV1_Format = 35840;
export var RGB_PVRTC_2BPPV1_Format = 35841;
export var RGBA_PVRTC_4BPPV1_Format = 35842;
export var RGBA_PVRTC_2BPPV1_Format = 35843;
export var RGB_ETC1_Format = 36196;
export var RGBA_ASTC_4x4_Format = 37808;
export var RGBA_ASTC_5x4_Format = 37809;
export var RGBA_ASTC_5x5_Format = 37810;
export var RGBA_ASTC_6x5_Format = 37811;
export var RGBA_ASTC_6x6_Format = 37812;
export var RGBA_ASTC_8x5_Format = 37813;
export var RGBA_ASTC_8x6_Format = 37814;
export var RGBA_ASTC_8x8_Format = 37815;
export var RGBA_ASTC_10x5_Format = 37816;
export var RGBA_ASTC_10x6_Format = 37817;
export var RGBA_ASTC_10x8_Format = 37818;
export var RGBA_ASTC_10x10_Format = 37819;
export var RGBA_ASTC_12x10_Format = 37820;
export var RGBA_ASTC_12x12_Format = 37821;
export var LoopOnce = 2200;
export var LoopRepeat = 2201;
export var LoopPingPong = 2202;
export var InterpolateDiscrete = 2300;
export var InterpolateLinear = 2301;
export var InterpolateSmooth = 2302;
export var ZeroCurvatureEnding = 2400;
export var ZeroSlopeEnding = 2401;
export var WrapAroundEnding = 2402;
export var TrianglesDrawMode = 0;
export var TriangleStripDrawMode = 1;
export var TriangleFanDrawMode = 2;
export var LinearEncoding = 3000;
export var sRGBEncoding = 3001;
export var GammaEncoding = 3007;
export var RGBEEncoding = 3002;
export var LogLuvEncoding = 3003;
export var RGBM7Encoding = 3004;
export var RGBM16Encoding = 3005;
export var RGBDEncoding = 3006;
export var BasicDepthPacking = 3200;
export var RGBADepthPacking = 3201;
export var TangentSpaceNormalMap = 0;
export var ObjectSpaceNormalMap = 1;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL2NvbnN0YW50cy5qcyJdLCJuYW1lcyI6WyJSRVZJU0lPTiIsIk1PVVNFIiwiTEVGVCIsIk1JRERMRSIsIlJJR0hUIiwiQ3VsbEZhY2VOb25lIiwiQ3VsbEZhY2VCYWNrIiwiQ3VsbEZhY2VGcm9udCIsIkN1bGxGYWNlRnJvbnRCYWNrIiwiRnJvbnRGYWNlRGlyZWN0aW9uQ1ciLCJGcm9udEZhY2VEaXJlY3Rpb25DQ1ciLCJCYXNpY1NoYWRvd01hcCIsIlBDRlNoYWRvd01hcCIsIlBDRlNvZnRTaGFkb3dNYXAiLCJGcm9udFNpZGUiLCJCYWNrU2lkZSIsIkRvdWJsZVNpZGUiLCJGbGF0U2hhZGluZyIsIlNtb290aFNoYWRpbmciLCJOb0NvbG9ycyIsIkZhY2VDb2xvcnMiLCJWZXJ0ZXhDb2xvcnMiLCJOb0JsZW5kaW5nIiwiTm9ybWFsQmxlbmRpbmciLCJBZGRpdGl2ZUJsZW5kaW5nIiwiU3VidHJhY3RpdmVCbGVuZGluZyIsIk11bHRpcGx5QmxlbmRpbmciLCJDdXN0b21CbGVuZGluZyIsIkFkZEVxdWF0aW9uIiwiU3VidHJhY3RFcXVhdGlvbiIsIlJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uIiwiTWluRXF1YXRpb24iLCJNYXhFcXVhdGlvbiIsIlplcm9GYWN0b3IiLCJPbmVGYWN0b3IiLCJTcmNDb2xvckZhY3RvciIsIk9uZU1pbnVzU3JjQ29sb3JGYWN0b3IiLCJTcmNBbHBoYUZhY3RvciIsIk9uZU1pbnVzU3JjQWxwaGFGYWN0b3IiLCJEc3RBbHBoYUZhY3RvciIsIk9uZU1pbnVzRHN0QWxwaGFGYWN0b3IiLCJEc3RDb2xvckZhY3RvciIsIk9uZU1pbnVzRHN0Q29sb3JGYWN0b3IiLCJTcmNBbHBoYVNhdHVyYXRlRmFjdG9yIiwiTmV2ZXJEZXB0aCIsIkFsd2F5c0RlcHRoIiwiTGVzc0RlcHRoIiwiTGVzc0VxdWFsRGVwdGgiLCJFcXVhbERlcHRoIiwiR3JlYXRlckVxdWFsRGVwdGgiLCJHcmVhdGVyRGVwdGgiLCJOb3RFcXVhbERlcHRoIiwiTXVsdGlwbHlPcGVyYXRpb24iLCJNaXhPcGVyYXRpb24iLCJBZGRPcGVyYXRpb24iLCJOb1RvbmVNYXBwaW5nIiwiTGluZWFyVG9uZU1hcHBpbmciLCJSZWluaGFyZFRvbmVNYXBwaW5nIiwiVW5jaGFydGVkMlRvbmVNYXBwaW5nIiwiQ2luZW9uVG9uZU1hcHBpbmciLCJBQ0VTRmlsbWljVG9uZU1hcHBpbmciLCJVVk1hcHBpbmciLCJDdWJlUmVmbGVjdGlvbk1hcHBpbmciLCJDdWJlUmVmcmFjdGlvbk1hcHBpbmciLCJFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyIsIkVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nIiwiU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmciLCJDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyIsIkN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nIiwiUmVwZWF0V3JhcHBpbmciLCJDbGFtcFRvRWRnZVdyYXBwaW5nIiwiTWlycm9yZWRSZXBlYXRXcmFwcGluZyIsIk5lYXJlc3RGaWx0ZXIiLCJOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciIsIk5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIiLCJMaW5lYXJGaWx0ZXIiLCJMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyIiwiTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyIiwiVW5zaWduZWRCeXRlVHlwZSIsIkJ5dGVUeXBlIiwiU2hvcnRUeXBlIiwiVW5zaWduZWRTaG9ydFR5cGUiLCJJbnRUeXBlIiwiVW5zaWduZWRJbnRUeXBlIiwiRmxvYXRUeXBlIiwiSGFsZkZsb2F0VHlwZSIsIlVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSIsIlVuc2lnbmVkU2hvcnQ1NTUxVHlwZSIsIlVuc2lnbmVkU2hvcnQ1NjVUeXBlIiwiVW5zaWduZWRJbnQyNDhUeXBlIiwiQWxwaGFGb3JtYXQiLCJSR0JGb3JtYXQiLCJSR0JBRm9ybWF0IiwiTHVtaW5hbmNlRm9ybWF0IiwiTHVtaW5hbmNlQWxwaGFGb3JtYXQiLCJSR0JFRm9ybWF0IiwiRGVwdGhGb3JtYXQiLCJEZXB0aFN0ZW5jaWxGb3JtYXQiLCJSZWRGb3JtYXQiLCJSR0JfUzNUQ19EWFQxX0Zvcm1hdCIsIlJHQkFfUzNUQ19EWFQxX0Zvcm1hdCIsIlJHQkFfUzNUQ19EWFQzX0Zvcm1hdCIsIlJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCIsIlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IiwiUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQiLCJSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQiLCJSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQiLCJSR0JfRVRDMV9Gb3JtYXQiLCJSR0JBX0FTVENfNHg0X0Zvcm1hdCIsIlJHQkFfQVNUQ181eDRfRm9ybWF0IiwiUkdCQV9BU1RDXzV4NV9Gb3JtYXQiLCJSR0JBX0FTVENfNng1X0Zvcm1hdCIsIlJHQkFfQVNUQ182eDZfRm9ybWF0IiwiUkdCQV9BU1RDXzh4NV9Gb3JtYXQiLCJSR0JBX0FTVENfOHg2X0Zvcm1hdCIsIlJHQkFfQVNUQ184eDhfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDVfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDZfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDhfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCIsIlJHQkFfQVNUQ18xMngxMF9Gb3JtYXQiLCJSR0JBX0FTVENfMTJ4MTJfRm9ybWF0IiwiTG9vcE9uY2UiLCJMb29wUmVwZWF0IiwiTG9vcFBpbmdQb25nIiwiSW50ZXJwb2xhdGVEaXNjcmV0ZSIsIkludGVycG9sYXRlTGluZWFyIiwiSW50ZXJwb2xhdGVTbW9vdGgiLCJaZXJvQ3VydmF0dXJlRW5kaW5nIiwiWmVyb1Nsb3BlRW5kaW5nIiwiV3JhcEFyb3VuZEVuZGluZyIsIlRyaWFuZ2xlc0RyYXdNb2RlIiwiVHJpYW5nbGVTdHJpcERyYXdNb2RlIiwiVHJpYW5nbGVGYW5EcmF3TW9kZSIsIkxpbmVhckVuY29kaW5nIiwic1JHQkVuY29kaW5nIiwiR2FtbWFFbmNvZGluZyIsIlJHQkVFbmNvZGluZyIsIkxvZ0x1dkVuY29kaW5nIiwiUkdCTTdFbmNvZGluZyIsIlJHQk0xNkVuY29kaW5nIiwiUkdCREVuY29kaW5nIiwiQmFzaWNEZXB0aFBhY2tpbmciLCJSR0JBRGVwdGhQYWNraW5nIiwiVGFuZ2VudFNwYWNlTm9ybWFsTWFwIiwiT2JqZWN0U3BhY2VOb3JtYWxNYXAiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSUEsUUFBUSxHQUFHLEtBQWY7QUFDUCxPQUFPLElBQUlDLEtBQUssR0FBRztBQUFFQyxFQUFBQSxJQUFJLEVBQUUsQ0FBUjtBQUFXQyxFQUFBQSxNQUFNLEVBQUUsQ0FBbkI7QUFBc0JDLEVBQUFBLEtBQUssRUFBRTtBQUE3QixDQUFaO0FBQ1AsT0FBTyxJQUFJQyxZQUFZLEdBQUcsQ0FBbkI7QUFDUCxPQUFPLElBQUlDLFlBQVksR0FBRyxDQUFuQjtBQUNQLE9BQU8sSUFBSUMsYUFBYSxHQUFHLENBQXBCO0FBQ1AsT0FBTyxJQUFJQyxpQkFBaUIsR0FBRyxDQUF4QjtBQUNQLE9BQU8sSUFBSUMsb0JBQW9CLEdBQUcsQ0FBM0I7QUFDUCxPQUFPLElBQUlDLHFCQUFxQixHQUFHLENBQTVCO0FBQ1AsT0FBTyxJQUFJQyxjQUFjLEdBQUcsQ0FBckI7QUFDUCxPQUFPLElBQUlDLFlBQVksR0FBRyxDQUFuQjtBQUNQLE9BQU8sSUFBSUMsZ0JBQWdCLEdBQUcsQ0FBdkI7QUFDUCxPQUFPLElBQUlDLFNBQVMsR0FBRyxDQUFoQjtBQUNQLE9BQU8sSUFBSUMsUUFBUSxHQUFHLENBQWY7QUFDUCxPQUFPLElBQUlDLFVBQVUsR0FBRyxDQUFqQjtBQUNQLE9BQU8sSUFBSUMsV0FBVyxHQUFHLENBQWxCO0FBQ1AsT0FBTyxJQUFJQyxhQUFhLEdBQUcsQ0FBcEI7QUFDUCxPQUFPLElBQUlDLFFBQVEsR0FBRyxDQUFmO0FBQ1AsT0FBTyxJQUFJQyxVQUFVLEdBQUcsQ0FBakI7QUFDUCxPQUFPLElBQUlDLFlBQVksR0FBRyxDQUFuQjtBQUNQLE9BQU8sSUFBSUMsVUFBVSxHQUFHLENBQWpCO0FBQ1AsT0FBTyxJQUFJQyxjQUFjLEdBQUcsQ0FBckI7QUFDUCxPQUFPLElBQUlDLGdCQUFnQixHQUFHLENBQXZCO0FBQ1AsT0FBTyxJQUFJQyxtQkFBbUIsR0FBRyxDQUExQjtBQUNQLE9 Line truncated
@@ -0,0 +1,5 @@
export { Vector3 } from './Vector3';
export { Quaternion } from './Quaternion';
export { Euler } from './Euler';
export * from './constants';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL2luZGV4LmpzIl0sIm5hbWVzIjpbIlZlY3RvcjMiLCJRdWF0ZXJuaW9uIiwiRXVsZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQVQsUUFBd0IsV0FBeEI7QUFDQSxTQUFTQyxVQUFULFFBQTJCLGNBQTNCO0FBQ0EsU0FBU0MsS0FBVCxRQUFzQixTQUF0QjtBQUNBLGNBQWMsYUFBZCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMnO1xuZXhwb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbic7XG5leHBvcnQgeyBFdWxlciB9IGZyb20gJy4vRXVsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuIl19
@@ -0,0 +1,4 @@
export const CORE_TYPE_PARTICLE = 'Particle';
export const CORE_TYPE_POOL = 'Pool';
export const CORE_TYPE_SYSTEM = 'System';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3R5cGVzLmpzIl0sIm5hbWVzIjpbIkNPUkVfVFlQRV9QQVJUSUNMRSIsIkNPUkVfVFlQRV9QT09MIiwiQ09SRV9UWVBFX1NZU1RFTSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxrQkFBa0IsR0FBRyxVQUEzQjtBQUNQLE9BQU8sTUFBTUMsY0FBYyxHQUFHLE1BQXZCO0FBQ1AsT0FBTyxNQUFNQyxnQkFBZ0IsR0FBRyxRQUF6QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBDT1JFX1RZUEVfUEFSVElDTEUgPSAnUGFydGljbGUnO1xuZXhwb3J0IGNvbnN0IENPUkVfVFlQRV9QT09MID0gJ1Bvb2wnO1xuZXhwb3J0IGNvbnN0IENPUkVfVFlQRV9TWVNURU0gPSAnU3lzdGVtJztcbiJdfQ==
@@ -0,0 +1,195 @@
import { DEFAULT_POSITION, DEFAULT_SIZE as size } from './constants';
/**
* @exports Debug - methods and helpers for debugging System emitters, zones and particles.
* @requires THREE - { SphereGeometry, BoxGeometry, MeshBasicMaterial, OctahedronGeometry, Mesh }
*/
export default {
/**
* Adds an event listener to the system instance's SYSTEM_UPDATE event.
*
* @param {System} system - the system instance
* @param {function} onSystemUpdated - the function to call when system has been updated
* @return {Debug}
*/
addEventListener: function (system, onSystemUpdated) {
system.eventDispatcher.addEventListener('SYSTEM_UPDATE', onSystemUpdated);
return this;
},
/**
* Draws a wireframe mesh around the zone for debugging purposes.
*
* @param {System} system - the system instance
* @param {object} container - a three Object3D (usually the scene)
* @param {Zone} zone - a Zone instance
* @return void
*/
drawZone: function (THREE, system, container, zone = {}) {
const color = '#2194ce';
const wireframe = true;
const {
width = size,
height = size,
depth = size,
radius = size,
x = DEFAULT_POSITION,
y = DEFAULT_POSITION,
z = DEFAULT_POSITION
} = zone;
let geometry;
if (zone.isPointZone()) {
geometry = new THREE.SphereGeometry(15);
}
if (zone.isLineZone()) {// TODO
}
if (zone.isBoxZone()) {
geometry = new THREE.BoxGeometry(width, height, depth);
}
if (zone.isSphereZone()) {
geometry = new THREE.SphereGeometry(radius, size, size);
}
if (zone.isMeshZone()) {
geometry = zone.geometry.geometry ? zone.geometry.geometry.clone() : zone.geometry.clone();
}
if (!geometry) {
geometry = new THREE.BoxGeometry(width, height, depth);
}
const material = new THREE.MeshBasicMaterial({
color,
wireframe
}); // NOTE! geometry.clone is required for UNKNOWN reasons,
// three does not render the mesh correctly without doing this since r88
const mesh = new THREE.Mesh(geometry.clone(), material);
container.add(mesh);
this.addEventListener(system, function () {
mesh.position.set(x, y, z);
});
},
/**
* Draws a mesh for each particle emitted in order to help debug particles.
*
* @param {object} system - the system instance
* @param {object} container - a three Object3D (usually the scene)
* @param {object} emitter - the emitter to debug
* @param {string} color - the color for the debug mesh material
* @return void
*/
drawEmitter: function (THREE, system, container, emitter, color) {
const geometry = new THREE.OctahedronGeometry(size);
const material = new THREE.MeshBasicMaterial({
color: color || '#aaa',
wireframe: true
}); // NOTE! geometry.clone is required for UNKNOWN reasons,
// three does not render the mesh correctly without doing this since r88
const mesh = new THREE.Mesh(geometry.clone(), material);
container.add(mesh);
this.addEventListener(system, function () {
mesh.position.copy(emitter.position);
mesh.rotation.set(emitter.rotation.x, emitter.rotation.y, emitter.rotation.z);
});
},
/**
* Renders emitter / particle information into the info element.
*
* @param {object} system - the system instance
* @param {integer} style - style to apply (see the addInfo method's switch statement)
* @return void
*/
renderInfo: function () {
function getCreatedNumber(type, system) {
var pool = type == 'material' ? '_materialPool' : '_targetPool';
var renderer = system.renderers[0];
return renderer[pool].cID;
}
function getEmitterPos(system) {
var e = system.emitters[0];
return Math.round(e.p.x) + ',' + Math.round(e.p.y) + ',' + Math.round(e.p.z);
}
return function (system, style) {
this.addInfo(style);
var str = '';
switch (this._infoType) {
case 2:
str += 'emitter:' + system.emitters.length + '<br>';
str += 'em speed:' + system.emitters[0].cID + '<br>';
str += 'pos:' + getEmitterPos(system);
break;
case 3:
str += system.renderers[0].name + '<br>';
str += 'target:' + getCreatedNumber('target') + '<br>';
str += 'material:' + getCreatedNumber('material');
break;
default:
str += 'particles:' + system.getCount() + '<br>';
str += 'pool:' + system.pool.getCount() + '<br>';
str += 'total:' + (system.getCount() + system.pool.getCount());
}
this._infoCon.innerHTML = str;
};
}(),
/**
* Appends the info element into the dom.
*
* @param {integer} style - the style type to apply
* @return void
*/
addInfo: function () {
return function (style) {
var self = this;
if (!this._infoCon) {
this._infoCon = document.createElement('div');
this._infoCon.style.cssText = ['position:fixed;bottom:0px;left:0;cursor:pointer;', 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;', 'width:120px;height:50px;background-color:#002;color:#0ff;'].join('');
this._infoType = 1;
this._infoCon.addEventListener('click', function () {
self._infoType++;
if (self._infoType > 3) self._infoType = 1;
}, false);
var bg, color;
switch (style) {
case 2:
bg = '#201';
color = '#f08';
break;
case 3:
bg = '#020';
color = '#0f0';
break;
default:
bg = '#002';
color = '#0ff';
}
this._infoCon.style['background-color'] = bg;
this._infoCon.style['color'] = color;
}
if (!this._infoCon.parentNode) document.body.appendChild(this._infoCon);
};
}()
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWJ1Zy9EZWJ1Zy5qcyJdLCJuYW1lcyI6WyJERUZBVUxUX1BPU0lUSU9OIiwiREVGQVVMVF9TSVpFIiwic2l6ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJzeXN0ZW0iLCJvblN5c3RlbVVwZGF0ZWQiLCJldmVudERpc3BhdGNoZXIiLCJkcmF3Wm9uZSIsIlRIUkVFIiwiY29udGFpbmVyIiwiem9uZSIsImNvbG9yIiwid2lyZWZyYW1lIiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsInJhZGl1cyIsIngiLCJ5IiwieiIsImdlb21ldHJ5IiwiaXNQb2ludFpvbmUiLCJTcGhlcmVHZW9tZXRyeSIsImlzTGluZVpvbmUiLCJpc0JveFpvbmUiLCJCb3hHZW9tZXRyeSIsImlzU3BoZXJlWm9uZSIsImlzTWVzaFpvbmUiLCJjbG9uZSIsIm1hdGVyaWFsIiwiTWVzaEJhc2ljTWF0ZXJpYWwiLCJtZXNoIiwiTWVzaCIsImFkZCIsInBvc2l0aW9uIiwic2V0IiwiZHJhd0VtaXR0ZXIiLCJlbWl0dGVyIiwiT2N0YWhlZHJvbkdlb21ldHJ5IiwiY29weSIsInJvdGF0aW9uIiwicmVuZGVySW5mbyIsImdldENyZWF0ZWROdW1iZXIiLCJ0eXBlIiwicG9vbCIsInJlbmRlcmVyIiwicmVuZGVyZXJzIiwiY0lEIiwiZ2V0RW1pdHRlclBvcyIsImUiLCJlbWl0dGVycyIsIk1hdGgiLCJyb3VuZCIsInAiLCJzdHlsZSIsImFkZEluZm8iLCJzdHIiLCJfaW5mb1R5cGUiLCJsZW5ndGgiLCJuYW1lIiwiZ2V0Q291bnQiLCJfaW5mb0NvbiIsImlubmVySFRNTCIsInNlbGYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjc3NUZXh0Iiwiam9pbiIsImJnIiwicGFyZW50Tm9kZSIsImJvZHkiLCJhcHBlbmRDaGlsZCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZ0JBQVQsRUFBMkJDLFlBQVksSUFBSUMsSUFBM0MsUUFBdUQsYUFBdkQ7QUFFQTtBQUNBO0FB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 Line truncated
@@ -0,0 +1,7 @@
export const DEFAULT_WIDTH = 10;
export const DEFAULT_HEIGHT = 10;
export const DEFAULT_DEPTH = 10;
export const DEFAULT_RADIUS = 15;
export const DEFAULT_SIZE = 15;
export const DEFAULT_POSITION = 0;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWJ1Zy9jb25zdGFudHMuanMiXSwibmFtZXMiOlsiREVGQVVMVF9XSURUSCIsIkRFRkFVTFRfSEVJR0hUIiwiREVGQVVMVF9ERVBUSCIsIkRFRkFVTFRfUkFESVVTIiwiREVGQVVMVF9TSVpFIiwiREVGQVVMVF9QT1NJVElPTiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxhQUFhLEdBQUcsRUFBdEI7QUFDUCxPQUFPLE1BQU1DLGNBQWMsR0FBRyxFQUF2QjtBQUNQLE9BQU8sTUFBTUMsYUFBYSxHQUFHLEVBQXRCO0FBQ1AsT0FBTyxNQUFNQyxjQUFjLEdBQUcsRUFBdkI7QUFDUCxPQUFPLE1BQU1DLFlBQVksR0FBRyxFQUFyQjtBQUNQLE9BQU8sTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBekIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgREVGQVVMVF9XSURUSCA9IDEwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSEVJR0hUID0gMTA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9ERVBUSCA9IDEwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkFESVVTID0gMTU7XG5leHBvcnQgY29uc3QgREVGQVVMVF9TSVpFID0gMTU7XG5leHBvcnQgY29uc3QgREVGQVVMVF9QT1NJVElPTiA9IDA7XG4iXX0=
@@ -0,0 +1,3 @@
export { default as Debug } from './Debug';
export { default as log } from './log';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWJ1Zy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0IiwiRGVidWciLCJsb2ciXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sSUFBSUMsS0FBcEIsUUFBaUMsU0FBakM7QUFDQSxTQUFTRCxPQUFPLElBQUlFLEdBQXBCLFFBQStCLE9BQS9CIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBEZWJ1ZyB9IGZyb20gJy4vRGVidWcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsb2cgfSBmcm9tICcuL2xvZyc7XG4iXX0=
@@ -0,0 +1,31 @@
/**
* You can use this emit particles.
*
* This method will console.log the fixed number of your info in updata or requestAnimationFrame
*
* use like this log('+12',mc); log 12 times
*
* @return void
*/
export default function () {
let once = 0;
if (window.console && window.console.trace) {
var arg = Array.prototype.slice.call(arguments);
var s1 = arguments[0] + '';
if (s1.indexOf('+') == 0) {
var n = parseInt(arguments[0]);
if (once < n) {
arg.shift();
console.trace.apply(console, arg);
once++;
}
} else {
arg.unshift('+15');
this.apply(console, arg);
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWJ1Zy9sb2cuanMiXSwibmFtZXMiOlsib25jZSIsIndpbmRvdyIsImNvbnNvbGUiLCJ0cmFjZSIsImFyZyIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiczEiLCJpbmRleE9mIiwibiIsInBhcnNlSW50Iiwic2hpZnQiLCJhcHBseSIsInVuc2hpZnQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsWUFBVztBQUN4QixNQUFJQSxJQUFJLEdBQUcsQ0FBWDs7QUFFQSxNQUFJQyxNQUFNLENBQUNDLE9BQVAsSUFBa0JELE1BQU0sQ0FBQ0MsT0FBUCxDQUFlQyxLQUFyQyxFQUE0QztBQUMxQyxRQUFJQyxHQUFHLEdBQUdDLEtBQUssQ0FBQ0MsU0FBTixDQUFnQkMsS0FBaEIsQ0FBc0JDLElBQXRCLENBQTJCQyxTQUEzQixDQUFWO0FBQ0EsUUFBSUMsRUFBRSxHQUFHRCxTQUFTLENBQUMsQ0FBRCxDQUFULEdBQWUsRUFBeEI7O0FBRUEsUUFBSUMsRUFBRSxDQUFDQyxPQUFILENBQVcsR0FBWCxLQUFtQixDQUF2QixFQUEwQjtBQUN4QixVQUFJQyxDQUFDLEdBQUdDLFFBQVEsQ0FBQ0osU0FBUyxDQUFDLENBQUQsQ0FBVixDQUFoQjs7QUFFQSxVQUFJVCxJQUFJLEdBQUdZLENBQVgsRUFBYztBQUNaUixRQUFBQSxHQUFHLENBQUNVLEtBQUo7QUFDQVosUUFBQUEsT0FBTyxDQUFDQyxLQUFSLENBQWNZLEtBQWQsQ0FBb0JiLE9BQXBCLEVBQTZCRSxHQUE3QjtBQUNBSixRQUFBQSxJQUFJO0FBQ0w7QUFDRixLQVJELE1BUU87QUFDTEksTUFBQUEsR0FBRyxDQUFDWSxPQUFKLENBQVksS0FBWjtBQUNBLFdBQUtELEtBQUwsQ0FBV2IsT0FBWCxFQUFvQkUsR0FBcEI7QUFDRDtBQUNGO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFlvdSBjYW4gdXNlIHRoaXMgZW1pdCBwYXJ0aWNsZXMuXG4gKlxuICogVGhpcyBtZXRob2Qgd2lsbCBjb25zb2xlLmxvZyB0aGUgZml4ZWQgbnVtYmVyIG9mIHlvdXIgaW5mbyAgaW4gdXBkYXRhIG9yIHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICpcbiAqIHVzZSBsaWtlIHRoaXMgbG9nKCcrMTInLG1jKTsgbG9nIDEyIHRpbWVzXG4gKlxuICogQHJldHVybiB2b2lkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBsZXQgb25jZSA9IDA7XG5cbiAgaWYgKHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLnRyYWNlKSB7XG4gICAgdmFyIGFyZyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgdmFyIHMxID0gYXJndW1lbnRzWzBdICsgJyc7XG5cbiAgICBpZiAoczEuaW5kZXhPZignKycpID09IDApIHtcbiAgICAgIHZhciBuID0gcGFyc2VJbnQoYXJndW1lbnRzWzBdKTtcblxuICAgICAgaWYgKG9uY2UgPCBuKSB7XG4gICAgICAgIGFyZy5zaGlmdCgpO1xuICAgICAgICBjb25zb2xlLnRyYWNlLmFwcGx5KGNvbnNvbGUsIGFyZyk7XG4gICAgICAgIG9uY2UrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJnLnVuc2hpZnQoJysxNScpO1xuICAgICAgdGhpcy5hcHBseShjb25zb2xlLCBhcmcpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,113 @@
import { PI } from '../constants';
/**
* The Ease class provides a collection of easing functions for use with System
*/
export const ease = {
easeLinear: function (value) {
return value;
},
easeInQuad: function (value) {
return Math.pow(value, 2);
},
easeOutQuad: function (value) {
return -(Math.pow(value - 1, 2) - 1);
},
easeInOutQuad: function (value) {
if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);
return -0.5 * ((value -= 2) * value - 2);
},
easeInCubic: function (value) {
return Math.pow(value, 3);
},
easeOutCubic: function (value) {
return Math.pow(value - 1, 3) + 1;
},
easeInOutCubic: function (value) {
if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);
return 0.5 * (Math.pow(value - 2, 3) + 2);
},
easeInQuart: function (value) {
return Math.pow(value, 4);
},
easeOutQuart: function (value) {
return -(Math.pow(value - 1, 4) - 1);
},
easeInOutQuart: function (value) {
if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);
return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);
},
easeInSine: function (value) {
return -Math.cos(value * (PI / 2)) + 1;
},
easeOutSine: function (value) {
return Math.sin(value * (PI / 2));
},
easeInOutSine: function (value) {
return -0.5 * (Math.cos(PI * value) - 1);
},
easeInExpo: function (value) {
return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));
},
easeOutExpo: function (value) {
return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;
},
easeInOutExpo: function (value) {
if (value === 0) return 0;
if (value === 1) return 1;
if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));
return 0.5 * (-Math.pow(2, -10 * --value) + 2);
},
easeInCirc: function (value) {
return -(Math.sqrt(1 - value * value) - 1);
},
easeOutCirc: function (value) {
return Math.sqrt(1 - Math.pow(value - 1, 2));
},
easeInOutCirc: function (value) {
if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);
return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);
},
easeInBack: function (value) {
var s = 1.70158;
return value * value * ((s + 1) * value - s);
},
easeOutBack: function (value) {
var s = 1.70158;
return (value = value - 1) * value * ((s + 1) * value + s) + 1;
},
easeInOutBack: function (value) {
var s = 1.70158;
if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));
return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);
}
};
export const {
easeLinear,
easeInQuad,
easeOutQuad,
easeInOutQuad,
easeInCubic,
easeOutCubic,
easeInOutCubic,
easeInQuart,
easeOutQuart,
easeInOutQuart,
easeInSine,
easeOutSine,
easeInOutSine,
easeInExpo,
easeOutExpo,
easeInOutExpo,
easeInCirc,
easeOutCirc,
easeInOutCirc,
easeInBack,
easeOutBack,
easeInOutBack
} = ease;
export const setEasingByName = easeName => {
if (ease[easeName]) return ease[easeName];else return ease.easeLinear;
};
export const getEasingByName = name => ease[name] ? ease[name] : ease.easeLinear;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lYXNlL2luZGV4LmpzIl0sIm5hbWVzIjpbIlBJIiwiZWFzZSIsImVhc2VMaW5lYXIiLCJ2YWx1ZSIsImVhc2VJblF1YWQiLCJNYXRoIiwicG93IiwiZWFzZU91dFF1YWQiLCJlYXNlSW5PdXRRdWFkIiwiZWFzZUluQ3ViaWMiLCJlYXNlT3V0Q3ViaWMiLCJlYXNlSW5PdXRDdWJpYyIsImVhc2VJblF1YXJ0IiwiZWFzZU91dFF1YXJ0IiwiZWFzZUluT3V0UXVhcnQiLCJlYXNlSW5TaW5lIiwiY29zIiwiZWFzZU91dFNpbmUiLCJzaW4iLCJlYXNlSW5PdXRTaW5lIiwiZWFzZUluRXhwbyIsImVhc2VPdXRFeHBvIiwiZWFzZUluT3V0RXhwbyIsImVhc2VJbkNpcmMiLCJzcXJ0IiwiZWFzZU91dENpcmMiLCJlYXNlSW5PdXRDaXJjIiwiZWFzZUluQmFjayIsInMiLCJlYXNlT3V0QmFjayIsImVhc2VJbk91dEJhY2siLCJzZXRFYXNpbmdCeU5hbWUiLCJlYXNlTmFtZSIsImdldEVhc2luZ0J5TmFtZSIsIm5hbWUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEVBQVQsUUFBbUIsY0FBbkI7QUFFQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxJQUFJLEdBQUc7QUFDbEJDLEVBQUFBLFVBQVUsRUFBRSxVQUFTQyxLQUFULEVBQWdCO0FBQzFCLFdBQU9BLEtBQVA7QUFDRCxHQUhpQjtBQUtsQkMsRUFBQUEsVUFBVSxFQUFFLFVBQVNELEtBQVQsRUFBZ0I7QUFDMUIsV0FBT0UsSUFBSSxDQUFDQyxHQUFMLENBQVNILEtBQVQsRUFBZ0IsQ0FBaEIsQ0FBUDtBQUNELEdBUGlCO0FBU2xCSSxFQUFBQSxXQUFXLEVBQUUsVUFBU0osS0FBVCxFQUFnQjtBQUMzQixXQUFPLEVBQUVFLElBQUksQ0FBQ0MsR0FBTCxDQUFTSCxLQUFLLEdBQUcsQ0FBakIsRUFBb0IsQ0FBcEIsSUFBeUIsQ0FBM0IsQ0FBUDtBQUNELEdBWGlCO0FBYWxCSyxFQUFBQSxh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 Line truncated
@@ -0,0 +1,707 @@
import { DEFAULT_BIND_EMITTER, DEFAULT_BIND_EMITTER_EVENT, DEFAULT_DAMPING, DEFAULT_EMITTER_INDEX, DEFAULT_EMITTER_RATE } from './constants';
import EventDispatcher, { EMITTER_DEAD, PARTICLE_CREATED, PARTICLE_DEAD, PARTICLE_UPDATE, SYSTEM_UPDATE } from '../events';
import { INTEGRATION_TYPE_EULER, integrate } from '../math';
import { Util, uid } from '../utils';
import { InitializerUtil } from '../initializer';
import Particle from '../core/Particle';
import isNumber from '../utils/isNumber.js';
import { EMITTER_TYPE_EMITTER as type } from './types';
/**
* Emitters are the System engine's particle factories. They cause particles to
* be rendered by emitting them, and store all particle initializers and behaviours.
*
*/
export default class Emitter extends Particle {
/**
* Constructs an Emitter instance.
*
* @param {object} properties - The properties to instantiate the emitter with
* @return void
*/
constructor(properties = {}) {
super(properties);
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
/**
* @desc The particles emitted by this emitter.
* @type {array}
*/
this.particles = [];
/**
* @desc The initializers for particles emitted by this emitter.
* @type {array}
*/
this.initializers = [];
/**
* @desc The behaviours for particles emitted by this emitter.
* @type {array}
*/
this.behaviours = [];
/**
* @desc The behaviours for the emitter.
* @type {array}
*/
this.emitterBehaviours = [];
/**
* @desc The current emit iteration.
* @type {integer}
*/
this.currentEmitTime = 0;
/**
* @desc The total number of times the emitter should emit particles.
* @type {integer}
*/
this.totalEmitTimes = -1;
/**
* @desc The friction coefficient for all particle to emit by.
* @type {number}
*/
this.damping = DEFAULT_DAMPING;
/**
* @desc Ensures that particles emitted by this emitter are positioned
* according to the emitter's properties.
* @type {boolean}
*/
this.bindEmitter = DEFAULT_BIND_EMITTER;
/**
* @desc Determines if the emitter will dispatch internal events. Defaults
* to false
* @type {boolean}
*/
this.bindEmitterEvent = DEFAULT_BIND_EMITTER_EVENT;
/**
* @desc The number of particles to emit per second (a [particle]/b [s])
* @type {Rate}
*/
this.rate = DEFAULT_EMITTER_RATE;
/**
* @desc Determines if the emitter is emitting particles or not.
* @type {boolean}
*/
this.isEmitting = false;
/**
* @desc The emitter's id.
* @type {string}
*/
this.id = `emitter-${uid()}`;
this.cID = 0;
this.name = 'Emitter';
/**
* @desc The index of the emitter as it is added to the system.
* @type {number|undefined}
*/
this.index = DEFAULT_EMITTER_INDEX;
/**
* @desc The emitter's internal event dispatcher.
* @type {EventDispatcher}
*/
this.eventDispatcher = new EventDispatcher();
}
/**
* Proxy method for the internal event dispatcher's dispatchEvent method.
*
* @param {string} event - The event to dispatch
* @param {object<Particle>} [target=this] - The event target
*/
dispatch(event, target = this) {
this.eventDispatcher.dispatchEvent(event, target);
}
/**
* Sets the emitter rate.
*
* @param {Rate} rate - a rate initializer object
* @return {Emitter}
*/
setRate(rate) {
this.rate = rate;
return this;
}
/**
* Sets the position of the emitter.
*
* @param {object} newPosition - an object the new x, y and z props
* @return {Emitter}
*/
setPosition(newPosition = {}) {
const {
position
} = this;
const {
x = position.x,
y = position.y,
z = position.z
} = newPosition;
this.position.set(x, y, z);
return this;
}
/**
* Sets the rotation of the emitter.
*
* @param {object} newRotation - an object the new x, y and z props
* @return {Emitter}
*/
setRotation(newRotation = {}) {
const {
rotation
} = this;
const {
x = rotation.x,
y = rotation.y,
z = rotation.z
} = newRotation;
this.rotation.set(x, y, z);
return this;
}
/**
* Sets the total number of times the emitter should emit particles as well as
* the emitter's life. Also intializes the emitter rate.
* This enables the emitter to emit particles.
*
* @param {number} [totalEmitTimes=Infinity] - the total number of times to emit particles
* @param {number} [life=Infinity] - the life of this emitter in milliseconds
* @return {Emitter}
*/
emit(totalEmitTimes = Infinity, life = Infinity) {
this.currentEmitTime = 0;
this.totalEmitTimes = isNumber(totalEmitTimes) ? totalEmitTimes : Infinity;
if (totalEmitTimes === 1) {
this.life = totalEmitTimes;
} else {
this.life = isNumber(life) ? life : Infinity;
}
this.rate.init();
this.isEmitting = true;
return this;
}
/**
* Experimental emit method that is designed to be called from the System.emit method.
*
* @return {Emitter}
*/
experimental_emit() {
const {
isEmitting,
totalEmitTimes,
life
} = this;
if (!isEmitting) {
this.currentEmitTime = 0;
if (!totalEmitTimes) {
this.setTotalEmitTimes(Infinity);
}
if (!life) {
this.setLife(Infinity);
}
this.rate.init();
this.isEmitting = true;
}
return this;
}
/**
* Sets the total emit times for the emitter.
*
* @param {number} [totalEmitTimes=Infinity] - the total number of times to emit particles
* @return {Emitter}
*/
setTotalEmitTimes(totalEmitTimes = Infinity) {
this.totalEmitTimes = isNumber(totalEmitTimes) ? totalEmitTimes : Infinity;
return this;
}
/**
* Sets the life of the emitter.
*
* @param {number} [life=Infinity] - the life of this emitter in milliseconds
* @return {Emitter}
*/
setLife(life = Infinity) {
if (this.totalEmitTimes === 1) {
this.life = this.totalEmitTimes;
} else {
this.life = isNumber(life) ? life : Infinity;
}
return this;
}
/**
* Stops the emitter from emitting particles.
*
* @return void
*/
stopEmit() {
this.totalEmitTimes = -1;
this.currentEmitTime = 0;
this.isEmitting = false;
}
/**
* Kills all of the emitter's particles.
*
* @return void
*/
removeAllParticles() {
let i = this.particles.length;
while (i--) {
this.particles[i].dead = true;
}
}
/**
* Adds a particle initializer to the emitter.
* Each initializer is run on each particle when they are created.
*
* @param {Initializer} initializer - The initializer to add
* @return {Emitter}
*/
addInitializer(initializer) {
this.initializers.push(initializer);
return this;
}
/**
* Adds multiple particle initializers to the emitter.
*
* @param {array<Initializer>} initializers - an array of particle initializers
* @return {Emitter}
*/
addInitializers(initializers) {
let i = initializers.length;
while (i--) {
this.addInitializer(initializers[i]);
}
return this;
}
/**
* Sets the emitter's particle initializers.
*
* @param {array<Initializer>} initializers - an array of particle initializers
* @return {Emitter}
*/
setInitializers(initializers) {
this.initializers = initializers;
return this;
}
/**
* Removes an initializer from the emitter's initializers array.
*
* @param {Initializer} initializer - The initializer to remove
* @return {Emitter}
*/
removeInitializer(initializer) {
const index = this.initializers.indexOf(initializer);
if (index > -1) {
this.initializers.splice(index, 1);
}
return this;
}
/**
* Removes all initializers.
*
* @return {Emitter}
*/
removeAllInitializers() {
Util.destroyArray(this.initializers);
return this;
}
/**
* Adds a behaviour to the emitter. All emitter behaviours are added to each particle when
* they are emitted.
*
* @param {Behaviour} behaviour - The behaviour to add to the emitter
* @return {Emitter}
*/
addBehaviour(behaviour) {
this.behaviours.push(behaviour);
return this;
}
/**
* Adds multiple behaviours to the emitter.
*
* @param {array<Behaviour>} behaviours - an array of emitter behaviours
* @return {Emitter}
*/
addBehaviours(behaviours) {
let i = behaviours.length;
while (i--) {
this.addBehaviour(behaviours[i]);
}
return this;
}
/**
* Sets the emitter's behaviours.
*
* @param {array<Behaviour>} behaviours - an array of emitter behaviours
* @return {Emitter}
*/
setBehaviours(behaviours) {
this.behaviours = behaviours;
return this;
}
/**
* Removes the behaviour from the emitter's behaviours array.
*
* @param {Behaviour} behaviour - The behaviour to remove
* @return {Emitter}
*/
removeBehaviour(behaviour) {
const index = this.behaviours.indexOf(behaviour);
if (index > -1) {
this.behaviours.splice(index, 1);
}
return this;
}
/**
* Removes all behaviours from the emitter.
*
* @return {Emitter}
*/
removeAllBehaviours() {
Util.destroyArray(this.behaviours);
return this;
}
/**
* Adds an emitter behaviour to the emitter.
*
* @param {Behaviour} behaviour - The behaviour to add to the emitter
* @return {Emitter}
*/
addEmitterBehaviour(behaviour) {
this.emitterBehaviours.push(behaviour);
behaviour.initialize(this);
return this;
}
/**
* Adds multiple behaviours to the emitter.
*
* @param {array<Behaviour>} behaviours - an array of emitter behaviours
* @return {Emitter}
*/
addEmitterBehaviours(behaviours) {
let i = behaviours.length;
while (i--) {
this.addEmitterBehaviour(behaviours[i]);
}
return this;
}
/**
* Sets the emitter's behaviours.
*
* @param {array<Behaviour>} behaviours - an array of emitter behaviours
* @return {Emitter}
*/
setEmitterBehaviours(behaviours) {
const length = behaviours.length;
this.emitterBehaviours = behaviours;
for (let i = 0; i < length; i++) {
this.emitterBehaviours[i].initialize(this);
}
return this;
}
/**
* Removes the behaviour from the emitter's behaviours array.
*
* @param {Behaviour} behaviour - The behaviour to remove
* @return {Emitter}
*/
removeEmitterBehaviour(behaviour) {
const index = this.emitterBehaviours.indexOf(behaviour);
if (index > -1) {
this.emitterBehaviours.splice(index, 1);
}
return this;
}
/**
* Removes all behaviours from the emitter.
*
* @return {Emitter}
*/
removeAllEmitterBehaviours() {
Util.destroyArray(this.emitterBehaviours);
return this;
}
/**
* Adds the event listener for the EMITTER_DEAD event.
*
* @param {onEmitterDead} - The function to call when the EMITTER_DEAD is dispatched.
* @return {Emitter}
*/
addOnEmitterDeadEventListener(onEmitterDead) {
this.eventDispatcher.addEventListener(`${this.id}_${EMITTER_DEAD}`, () => onEmitterDead());
return this;
}
/**
* Creates a particle by retreiving one from the pool and setting it up with
* the supplied initializer and behaviour.
*
* @return {Emitter}
*/
createParticle() {
const particle = this.parent.pool.get(Particle);
const index = this.particles.length;
this.setupParticle(particle, index);
this.parent && this.parent.dispatch(PARTICLE_CREATED, particle);
this.bindEmitterEvent && this.dispatch(PARTICLE_CREATED, particle);
return particle;
}
/**
* Sets up a particle by running all initializers on it and setting its behaviours.
* Also adds the particle to this.particles.
*
* @param {Particle} particle - The particle to setup
* @return void
*/
setupParticle(particle, index) {
const {
initializers,
behaviours
} = this;
InitializerUtil.initialize(this, particle, initializers);
particle.addBehaviours(behaviours);
particle.parent = this;
particle.index = index;
this.particles.push(particle);
}
/**
* Updates the emitter according to the time passed by calling the generate
* and integrate methods. The generate method creates particles, the integrate
* method updates existing particles.
*
* If the emitter age is greater than time, the emitter is killed.
*
* This method also indexes/deindexes particles.
*
* @param {number} time - System engine time
* @return void
*/
update(time) {
if (!this.isEmitting && this.particles.length === 0) {
return;
}
this.age += time;
if (this.dead || this.age >= this.life) {
this.destroy();
}
if (this.isEmitting) {
this.generate(time);
}
this.integrate(time);
let i = this.particles.length;
while (i--) {
const particle = this.particles[i];
if (particle.dead) {
this.parent && this.parent.dispatch(PARTICLE_DEAD, particle);
this.bindEmitterEvent && this.dispatch(PARTICLE_DEAD, particle);
this.parent.pool.expire(particle.reset());
this.particles.splice(i, 1);
if (this.particles.length === 0) {
this.parent && this.parent.dispatch(SYSTEM_UPDATE);
}
}
}
this.updateEmitterBehaviours(time);
}
/**
* Updates the emitter's emitter behaviours.
*
* @param {number} time - System engine time
* @return void
*/
updateEmitterBehaviours(time) {
if (this.sleep) {
return;
}
const length = this.emitterBehaviours.length;
for (let i = 0; i < length; i++) {
this.emitterBehaviours[i].applyBehaviour(this, time, i);
}
}
/**
* Runs the integration algorithm on the emitter and all particles.
* Updates the particles with the timstamp passed.
*
* @param {number} time - System engine time
* @return void
*/
integrate(time) {
const integrationType = this.parent ? this.parent.integrationType : INTEGRATION_TYPE_EULER;
const damping = 1 - this.damping;
integrate(this, time, damping, integrationType);
let index = this.particles.length;
while (index--) {
const particle = this.particles[index];
particle.update(time, index);
integrate(particle, time, damping, integrationType);
this.parent && this.parent.dispatch(PARTICLE_UPDATE, particle);
this.bindEmitterEvent && this.dispatch(PARTICLE_UPDATE, particle);
}
}
/**
* Generates new particles.
*
* @param {number} time - System engine time
* @return void
*/
generate(time) {
if (this.totalEmitTimes === 1) {
let i = this.rate.getValue(99999);
if (i > 0) {
this.cID = i;
}
while (i--) {
this.createParticle();
}
this.totalEmitTimes = 0;
return;
}
this.currentEmitTime += time;
if (this.currentEmitTime < this.totalEmitTimes) {
let i = this.rate.getValue(time);
if (i > 0) {
this.cID = i;
}
while (i--) {
this.createParticle();
}
}
}
/**
* Kills the emitter.
*
* @return void
*/
destroy() {
this.dead = true;
this.energy = 0;
this.totalEmitTimes = -1;
if (this.particles.length == 0) {
this.isEmitting = false;
this.removeAllInitializers();
this.removeAllBehaviours();
this.dispatch(`${this.id}_${EMITTER_DEAD}`);
this.parent && this.parent.removeEmitter(this);
}
}
}
@@ -0,0 +1,97 @@
import Emitter from './Emitter';
import THREEUtil from '../utils/THREEUtil';
import Util from '../utils/Util';
import { EMITTER_TYPE_FOLLOW as type } from './types';
export default class FollowEmitter extends Emitter {
/**
* The FollowEmitter class inherits from System.Emitter
*
* use the FollowEmitter will emit particle when mousemoving
*
* @class System.FollowEmitter
* @constructor
* @param {Element} mouseTarget mouseevent's target;
* @param {Number} ease the easing of following speed;
* @default 0.7
* @param {Object} pObj the parameters object;
*/
constructor(mouseTarget, ease, pObj) {
super(pObj);
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
this.mouseTarget = Util.initValue(mouseTarget, window);
this.ease = Util.initValue(ease, 0.7);
this._allowEmitting = false;
this.initEventHandler();
}
initEventHandler() {
var self = this;
this.mousemoveHandler = function (e) {
self.mousemove.call(self, e);
};
this.mousedownHandler = function (e) {
self.mousedown.call(self, e);
};
this.mouseupHandler = function (e) {
self.mouseup.call(self, e);
};
this.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);
}
/**
* start emit particle
* @method emit
*/
emit() {
this._allowEmitting = true;
}
/**
* stop emiting
* @method stopEmit
*/
stopEmit() {
this._allowEmitting = false;
}
setCameraAndCanvas(camera, canvas) {
this.camera = camera;
this.canvas = canvas;
}
mousemove(e) {
if (e.layerX || e.layerX == 0) {
this.position.x += (e.layerX - this.position.x) * this.ease;
this.position.y += (e.layerY - this.position.y) * this.ease;
} else if (e.offsetX || e.offsetX == 0) {
this.position.x += (e.offsetX - this.position.x) * this.ease;
this.position.y += (e.offsetY - this.position.y) * this.ease;
}
this.position.copy(THREEUtil.toSpacePos(this.position, this.camera, this.canvas));
if (this._allowEmitting) super.emit('once');
}
/**
* Destory this Emitter
* @method destroy
*/
destroy() {
super.destroy();
this.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbWl0dGVyL0ZvbGxvd0VtaXR0ZXIuanMiXSwibmFtZXMiOlsiRW1pdHRlciIsIlRIUkVFVXRpbCIsIlV0aWwiLCJFTUlUVEVSX1RZUEVfRk9MTE9XIiwidHlwZSIsIkZvbGxvd0VtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsIm1vdXNlVGFyZ2V0IiwiZWFzZSIsInBPYmoiLCJpbml0VmFsdWUiLCJ3aW5kb3ciLCJfYWxsb3dFbWl0dGluZyIsImluaXRFdmVudEhhbmRsZXIiLCJzZWxmIiwibW91c2Vtb3ZlSGFuZGxlciIsImUiLCJtb3VzZW1vdmUiLCJjYWxsIiwibW91c2Vkb3duSGFuZGxlciIsIm1vdXNlZG93biIsIm1vdXNldXBIYW5kbGVyIiwibW91c2V1cCIsImFkZEV2ZW50TGlzdGVuZXIiLCJlbWl0Iiwic3RvcEVtaXQiLCJzZXRDYW1lcmFBbmRDYW52YXMiLCJjYW1lcmEiLCJjYW52YXMiLCJsYXllclgiLCJwb3NpdGlvbiIsIngiLCJ5IiwibGF5ZXJZIiwib2Zmc2V0WCIsIm9mZnNldFkiLCJjb3B5IiwidG9TcGFjZVBvcyIsImRlc3Ryb3kiLCJyZW1vdmVFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxPQUFQLE1BQW9CLFdBQXBCO0FBQ0EsT0FBT0MsU0FBUCxNQUFzQixvQkFBdEI7QUFDQSxPQUFPQyxJQUFQLE1BQWlCLGVBQWpCO0FBQ0EsU0FBU0MsbUJBQW1CLElBQUlDLElBQWhDLFFBQTRDLFNBQTVDO0FBRUEsZUFBZSxNQUFNQyxhQUFOLFNBQTRCTCxPQUE1QixDQUFvQztBQUNqRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRU0sRUFBQUEsV0FBVyxDQUFDQyxXQUFELEVBQWNDLElBQWQsRUFBb0JDLElBQXBCLEVBQTBCO0FBQ25DLFVBQU1BLElBQU47QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLTCxJQUFMLEdBQVlBLElB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QUt4QixnQkFGUCxFQUdFLEtBSEY7QUFLRDs7QUFqR2dEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVtaXR0ZXIgZnJvbSAnLi9FbWl0dGVyJztcbmltcG9ydCBUSFJFRVV0aWwgZnJvbSAnLi4vdXRpbHMvVEhSRUVVdGlsJztcbmltcG9ydCBVdGlsIGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgRU1JVFRFUl9UWVBFX0ZPTExPVyBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvbGxvd0VtaXR0ZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgLyoqXG4gICAqIFRoZSBGb2xsb3dFbWl0dGVyIGNsYXNzIGluaGVyaXRzIGZyb20gU3lzdGVtLkVtaXR0ZXJcbiAgICpcbiAgICogdXNlIHRoZSBGb2xsb3dFbWl0dGVyIHdpbGwgZW1pdCBwYXJ0aWNsZSB3aGVuIG1vdXNlbW92aW5nXG4gICAqXG4gICAqIEBjbGFzcyBTeXN0ZW0uRm9sbG93RW1pdHRlclxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtb3VzZVRhcmdldCBtb3VzZWV2ZW50J3MgdGFyZ2V0O1xuICAgKiBAcGFyYW0ge051bWJlcn0gZWFzZSB0aGUgZWFzaW5nIG9mIGZvbGxvd2luZyBzcGVlZDtcbiAgICogQGRlZmF1bHQgMC43XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwT2JqIHRoZSBwYXJhbWV0ZXJzIG9iamVjdDtcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vdXNlVGFyZ2V0LCBlYXNlLCBwT2JqKSB7XG4gICAgc3VwZXIocE9iaik7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgY2xhc3MgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5tb3VzZVRhcmdldCA9IFV0aWwuaW5pdFZhbHVlKG1vdXNlVGFyZ2V0LCB3aW5kb3cpO1xuICAgIHRoaXMuZWFzZSA9IFV0aWwuaW5pdFZhbHVlKGVhc2UsIDAuNyk7XG4gICAgdGhpcy5fYWxsb3dFbWl0dGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaW5pdEV2ZW50SGFuZGxlcigpO1xuICB9XG5cbiAgaW5 Line truncated
@@ -0,0 +1,7 @@
import { Rate } from '../initializer';
export const DEFAULT_DAMPING = 0.006;
export const DEFAULT_BIND_EMITTER = true;
export const DEFAULT_EMITTER_RATE = new Rate(1, 0.1);
export const DEFAULT_BIND_EMITTER_EVENT = false;
export const DEFAULT_EMITTER_INDEX = undefined;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbWl0dGVyL2NvbnN0YW50cy5qcyJdLCJuYW1lcyI6WyJSYXRlIiwiREVGQVVMVF9EQU1QSU5HIiwiREVGQVVMVF9CSU5EX0VNSVRURVIiLCJERUZBVUxUX0VNSVRURVJfUkFURSIsIkRFRkFVTFRfQklORF9FTUlUVEVSX0VWRU5UIiwiREVGQVVMVF9FTUlUVEVSX0lOREVYIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxJQUFULFFBQXFCLGdCQUFyQjtBQUVBLE9BQU8sTUFBTUMsZUFBZSxHQUFHLEtBQXhCO0FBQ1AsT0FBTyxNQUFNQyxvQkFBb0IsR0FBRyxJQUE3QjtBQUNQLE9BQU8sTUFBTUMsb0JBQW9CLEdBQUcsSUFBSUgsSUFBSixDQUFTLENBQVQsRUFBWSxHQUFaLENBQTdCO0FBQ1AsT0FBTyxNQUFNSSwwQkFBMEIsR0FBRyxLQUFuQztBQUNQLE9BQU8sTUFBTUMscUJBQXFCLEdBQUdDLFNBQTlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmF0ZSB9IGZyb20gJy4uL2luaXRpYWxpemVyJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfREFNUElORyA9IDAuMDA2O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQklORF9FTUlUVEVSID0gdHJ1ZTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0VNSVRURVJfUkFURSA9IG5ldyBSYXRlKDEsIDAuMSk7XG5leHBvcnQgY29uc3QgREVGQVVMVF9CSU5EX0VNSVRURVJfRVZFTlQgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0VNSVRURVJfSU5ERVggPSB1bmRlZmluZWQ7XG4iXX0=
@@ -0,0 +1,3 @@
export { default as FollowEmitter } from './FollowEmitter';
export { default as Emitter } from './Emitter';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbWl0dGVyL2luZGV4LmpzIl0sIm5hbWVzIjpbImRlZmF1bHQiLCJGb2xsb3dFbWl0dGVyIiwiRW1pdHRlciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsT0FBTyxJQUFJQyxhQUFwQixRQUF5QyxpQkFBekM7QUFDQSxTQUFTRCxPQUFPLElBQUlFLE9BQXBCLFFBQW1DLFdBQW5DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBGb2xsb3dFbWl0dGVyIH0gZnJvbSAnLi9Gb2xsb3dFbWl0dGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRW1pdHRlciB9IGZyb20gJy4vRW1pdHRlcic7XG4iXX0=
@@ -0,0 +1,3 @@
export const EMITTER_TYPE_EMITTER = 'Emitter';
export const EMITTER_TYPE_FOLLOW = 'FollowEmitter';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbWl0dGVyL3R5cGVzLmpzIl0sIm5hbWVzIjpbIkVNSVRURVJfVFlQRV9FTUlUVEVSIiwiRU1JVFRFUl9UWVBFX0ZPTExPVyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxvQkFBb0IsR0FBRyxTQUE3QjtBQUNQLE9BQU8sTUFBTUMsbUJBQW1CLEdBQUcsZUFBNUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgRU1JVFRFUl9UWVBFX0VNSVRURVIgPSAnRW1pdHRlcic7XG5leHBvcnQgY29uc3QgRU1JVFRFUl9UWVBFX0ZPTExPVyA9ICdGb2xsb3dFbWl0dGVyJztcbiJdfQ==
@@ -0,0 +1,95 @@
/*
* EventDispatcher
* Visit http://createjs.com/ for documentation, updates and examples.
*
**/
export default class EventDispatcher {
constructor() {
this.listeners = null;
}
set listeners(listeners) {
this._listeners = listeners;
}
get listeners() {
return this._listeners;
}
/**
* 添加事件监听器
* @param {*} type 事件类型
* @param {*} listener 事件监听器
* @param {*} toTop 是否在顶部添加(因为监听的事件在触发时安装反序执行,添加到顶部会最后执行)
* @returns
*/
addEventListener(type, listener,toTop = false) {
if (!this.listeners) {
this.listeners = {};
} else {
this.removeEventListener(type, listener);
}
if (!this.listeners[type]) this.listeners[type] = [];
if(toTop){
this.listeners[type].unshift(listener);
}else{
this.listeners[type].push(listener);
}
return listener;
}
removeEventListener(type, listener) {
if (!this.listeners) return;
if (!this.listeners[type]) return;
var arr = this.listeners[type];
for (var i = 0, l = arr.length; i < l; i++) {
if (arr[i] == listener) {
if (l == 1) {
delete this.listeners[type];
} // allows for faster checks.
else {
arr.splice(i, 1);
}
break;
}
}
}
removeAllEventListeners(type) {
if (!type) this.listeners = null;else if (this.listeners) delete this.listeners[type];
}
dispatchEvent(eventName, eventTarget) {
var ret = false,
listeners = this.listeners;
if (eventName && listeners) {
var arr = listeners[eventName];
if (!arr) return ret;
arr = arr.slice(); //Should use a copy into a temporary here instead...
// to avoid issues with items being removed or added during the dispatch
var handler,
i = arr.length;
while (i--) {
handler = arr[i];
ret = ret || handler(eventTarget);
}
}
return !!ret;
}
hasEventListener(type) {
var listeners = this.listeners;
return !!(listeners && listeners[type]);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ldmVudHMvRXZlbnREaXNwYXRjaGVyLmpzIl0sIm5hbWVzIjpbIkV2ZW50RGlzcGF0Y2hlciIsImNvbnN0cnVjdG9yIiwibGlzdGVuZXJzIiwiX2xpc3RlbmVycyIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0eXBlIiwibGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicHVzaCIsImFyciIsImkiLCJsIiwibGVuZ3RoIiwic3BsaWNlIiwicmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMiLCJkaXNwYXRjaEV2ZW50IiwiZXZlbnROYW1lIiwiZXZlbnRUYXJnZXQiLCJyZXQiLCJzbGljZSIsImhhbmRsZXIiLCJoYXNFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsZUFBZSxNQUFNQSxlQUFOLENBQXNCO0FBQ25DQyxFQUFBQSxXQUFXLEdBQUc7QUFDWixTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0Q7O0FBRVksTUFBVEEsU0FBUyxDQUFDQSxTQUFELEVBQVk7QUFDdkIsU0FBS0MsVUFBTCxHQUFrQkQsU0FBbEI7QUFDRDs7QUFFWSxNQUFUQSxTQUFTLEdBQUc7QUFDZCxXQUFPLEtBQUtDLFVBQVo7QUFDRDs7QUFFREMsRUFBQUEsZ0JBQWdCLENBQUNDLElBQUQsRUFBT0MsUUFBUCxFQUFpQjtBQUMvQixRQUFJLENBQUMsS0FBS0osU0FBVixFQUFxQjtBQUNuQixXQUFLQSxTQUFMLEdBQWlCLEVBQWpCO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsV0FBS0ssbUJBQUwsQ0FBeUJGLElBQXpCLEVBQStCQyxRQUEvQjtBQUNEOztBQUVELFFBQUksQ0FBQyxLQUFLSixTQUFMLENBQWVHLElBQWYsQ0FBTCxFQUEyQixLQUFLSCxTQUFMLENBQWVHLElBQWYsSUFBdUIsRUFBdkI7QUFDM0IsU0FBS0gsU0FBTCxDQUFlRyxJQUFmLEVBQXFCRyxJQUFyQixDQUEwQkYsUUFBMUI7QUFFQSxXQUFPQSxRQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLG1CQUFtQixDQUFDRixJQUFELEVBQU9DLFFBQVAsRUFBaUI7QUFDbEMsUUFBSSxDQUFDLEtBQUtKLFNBQVYsRUFBcUI7QUFDckIsUUFBSSxDQUFDLEtBQUtBLFNBQUwsQ0FBZUcsSUFBZixDQUFMLEVBQTJCO0FBRTNCLFFBQUlJLEdBQUcsR0FBRyxLQUFLUCxTQUFMLENBQWVHLElBQWYsQ0FBVjs7QUFFQSxTQUFLLElBQUlLLENBQUMsR0FBRyxDQUFSLEVBQVdDLENBQUMsR0FBR0YsR0FBRyxDQUFDRyxNQUF4QixFQUFnQ0YsQ0FBQyxHQUFHQyxDQUFwQyxFQUF1Q0QsQ0FBQyxFQUF4QyxFQUE0QztBQUMxQyxVQUFJRCxHQUFHLENBQUNDLENBQUQsQ0FBSCxJQUFVSixRQUFkLEVBQXdCO0FBQ3RCLFlBQUlLLENBQUMsSUFBSSxDQUFULEVBQVk7QUFDVixpQkFBTyxLQUFLVCxTQUFMLENBQWVHLElBQWYsQ0FBUDtBQUNELFNBRkQsQ0FHQTtBQUhBLGFBSUs7QUFDSEksVUFBQUEsR0FBRyxDQUFDSSxNQUFKLENBQVdILENBQVgsRUFBYyxDQUFkO0FBQ0Q7O0FBQ0Q7QUFDRDtBQUNGO0FBQ0Y7O0FBRURJLEVBQUFBLHVCQUF1QixDQUFDVCxJQUFELEVBQU87QUFDNUIsUUFBSSxDQUFDQSxJQUFMLEVBQVcsS0FBS0gsU0FBTCxHQUFpQixJQUFqQixDQUFYLEtBQ0ssSUFBSSxLQUFLQSxTQUFULEVBQW9CLE9BQU8sS0FBS0EsU0FBTCxDQUFlRyxJQUFmLENBQVA7QUFDMUI7O0FBRURVLEVBQUFBLGFBQWEsQ0FBQ0MsU0FBRCxFQUFZQyxXQUFaLEVBQXlCO0FBQ3BDLFFBQUlDLEdBQUcsR0FBRyxLQUFWO0FBQUEsUUFDRWhCLFNBQVMsR0FBRyxLQUFLQSxTQURuQjs7QUFHQSxRQUFJYyxTQUFTLElBQUlkLFNBQWpCLEVBQTRCO0FBQzFCLFVBQUlPLEdBQUcsR0FBR1AsU0FBUyxDQUFDYyxTQUFELENBQW5CO0FBRUEsVUFBSSxDQUFDUCxHQUFMLEVBQVUsT0FBT1MsR0FBUDtBQUVWVCxNQUFBQSxHQUFHLEdBQUdBLEdBQUcsQ0FBQ1UsS0FBSixFQUFOLENBTDBCLENBS0E7QUFDMUI7O0FBRUEsVUFBSUMsT0FBSjtBQUFBLFVBQ0VWLENBQUMsR0FBR0QsR0FBRyxDQUFDRyxNQURWOztBQUdBLGFBQU9GLENBQUMsRUFBUixFQUFZO0FBQ1ZVLFFBQUFBLE9BQU8sR0FBR1gsR0FBRyxDQUFDQyxDQUFELENBQWI7QUFFQVEsUUFBQUEsR0FBRyxHQUFHQSxHQUFHLElBQUlFLE9BQU8sQ0FBQ0gsV0FBRCxDQUFwQjtBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxDQUFDLENBQUNDLEdBQVQ7QUFDRDs7QUFFREcsRUFBQUEsZ0JBQWdCLENBQUNoQixJQUFELEVBQU87QUFDckIsUUFBSUgsU0FBUyxHQUFHLEtBQUtBLFNBQXJCO0FBRUEsV0FBTyxDQUFDLEVBQUVBLFNBQVMsSUFBSUEsU0FBUyxDQUFDRyxJQUFELENBQXhCLENBQVI7QUFDRDs7QUFoRmtDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEV2ZW50RGlzcGF0Y2hlclxuICogVmlzaXQgaHR0cDovL2NyZWF0ZWpzLmNvbS8gZm9yIGRvY3VtZW50YXRpb24sIHVwZGF0ZXMgYW5kIGV4YW1wbGVzLlxuICpcbiAqKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXZlbnREaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBudWxsO1xuICB9XG5cbiAgc2V0IGxpc3RlbmVycyhsaXN0ZW5lcnMpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG4gIH1cblxuICBnZXQgbGlzdGVuZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0ZW5lcnM7XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycykge1xuICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzW3R5cGVdKSB0aGlzLmxpc3RlbmVyc1t0eXBlXSA9IFtdO1xuICAgIHRoaXMubGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIGxpc3RlbmVyO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5saXN0ZW5lcnMpIHJldHVybjtcbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzW3R5cGVdKSByZXR1cm47XG5cbiAgICB2YXIgYXJyID0gdGhpcy5saXN0ZW5lcnNbdHlwZV07XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhcnJbaV0gPT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGwgPT0gMSkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbGxvd3MgZm9yIGZhc3RlciBjaGVja3MuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnModHlwZSkge1xuICAgIGlmICghdHlwZSkgdGhpcy5saXN0ZW5lcnMgPSBudWxsO1xuICAgIGVsc2UgaWYgKHRoaXMubGlzdGVuZXJzKSBkZWxldGUgdGhpcy5saXN0ZW5lcnNbdHlwZV07XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50KGV2ZW50TmFtZSwgZXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgcmV0ID0gZmFsc2UsXG4gICAgICBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcblxuICAgIGlmIChldmVudE5hbWUgJiYgbGlzdGVuZXJzKSB7XG4gICAgICB2YXIgYXJyID0gbGlzdGVuZXJzW2V2ZW50TmFtZV07XG5cbiAgICAgIGlmICghYXJyKSByZXR1cm4gcmV0O1xuXG4gICAgICBhcnIgPSBhcnIuc2xpY2UoKTsgICA Line truncated
@@ -0,0 +1,9 @@
export const SYSTEM_UPDATE = 'SYSTEM_UPDATE';
export const PARTICLE_CREATED = 'PARTICLE_CREATED';
export const PARTICLE_UPDATE = 'PARTICLE_UPDATE';
export const PARTICLE_DEAD = 'PARTICLE_DEAD';
export const EMITTER_ADDED = 'EMITTER_ADDED';
export const EMITTER_REMOVED = 'EMITTER_REMOVED';
export const EMITTER_DEAD = 'EMITTER_DEAD';
export const SYSTEM_UPDATE_AFTER = 'SYSTEM_UPDATE_AFTER';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ldmVudHMvY29uc3RhbnRzLmpzIl0sIm5hbWVzIjpbIlNZU1RFTV9VUERBVEUiLCJQQVJUSUNMRV9DUkVBVEVEIiwiUEFSVElDTEVfVVBEQVRFIiwiUEFSVElDTEVfREVBRCIsIkVNSVRURVJfQURERUQiLCJFTUlUVEVSX1JFTU9WRUQiLCJFTUlUVEVSX0RFQUQiLCJTWVNURU1fVVBEQVRFX0FGVEVSIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU1BLGFBQWEsR0FBRyxlQUF0QjtBQUNQLE9BQU8sTUFBTUMsZ0JBQWdCLEdBQUcsa0JBQXpCO0FBQ1AsT0FBTyxNQUFNQyxlQUFlLEdBQUcsaUJBQXhCO0FBQ1AsT0FBTyxNQUFNQyxhQUFhLEdBQUcsZUFBdEI7QUFDUCxPQUFPLE1BQU1DLGFBQWEsR0FBRyxlQUF0QjtBQUNQLE9BQU8sTUFBTUMsZUFBZSxHQUFHLGlCQUF4QjtBQUNQLE9BQU8sTUFBTUMsWUFBWSxHQUFHLGNBQXJCO0FBQ1AsT0FBTyxNQUFNQyxtQkFBbUIsR0FBRyxxQkFBNUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgU1lTVEVNX1VQREFURSA9ICdTWVNURU1fVVBEQVRFJztcbmV4cG9ydCBjb25zdCBQQVJUSUNMRV9DUkVBVEVEID0gJ1BBUlRJQ0xFX0NSRUFURUQnO1xuZXhwb3J0IGNvbnN0IFBBUlRJQ0xFX1VQREFURSA9ICdQQVJUSUNMRV9VUERBVEUnO1xuZXhwb3J0IGNvbnN0IFBBUlRJQ0xFX0RFQUQgPSAnUEFSVElDTEVfREVBRCc7XG5leHBvcnQgY29uc3QgRU1JVFRFUl9BRERFRCA9ICdFTUlUVEVSX0FEREVEJztcbmV4cG9ydCBjb25zdCBFTUlUVEVSX1JFTU9WRUQgPSAnRU1JVFRFUl9SRU1PVkVEJztcbmV4cG9ydCBjb25zdCBFTUlUVEVSX0RFQUQgPSAnRU1JVFRFUl9ERUFEJztcbmV4cG9ydCBjb25zdCBTWVNURU1fVVBEQVRFX0FGVEVSID0gJ1NZU1RFTV9VUERBVEVfQUZURVInO1xuIl19
@@ -0,0 +1,4 @@
import EventDispatcher from './EventDispatcher';
export default EventDispatcher;
export * from './constants';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ldmVudHMvaW5kZXguanMiXSwibmFtZXMiOlsiRXZlbnREaXNwYXRjaGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxlQUFQLE1BQTRCLG1CQUE1QjtBQUVBLGVBQWVBLGVBQWY7QUFDQSxjQUFjLGFBQWQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnREaXNwYXRjaGVyIGZyb20gJy4vRXZlbnREaXNwYXRjaGVyJztcblxuZXhwb3J0IGRlZmF1bHQgRXZlbnREaXNwYXRjaGVyO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuIl19
@@ -0,0 +1,13 @@
import { System } from './core';
export * from './behaviour';
export * from './debug';
export * from './ease';
export * from './emitter';
export * from './initializer';
export * from './math';
export * from './renderer';
export * from './utils';
export * from './zone';
export { System, Particle, Pool } from './core';
export default System;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJTeXN0ZW0iLCJQYXJ0aWNsZSIsIlBvb2wiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE1BQVQsUUFBdUIsUUFBdkI7QUFFQSxjQUFjLGFBQWQ7QUFDQSxjQUFjLFNBQWQ7QUFDQSxjQUFjLFFBQWQ7QUFDQSxjQUFjLFdBQWQ7QUFDQSxjQUFjLGVBQWQ7QUFDQSxjQUFjLFFBQWQ7QUFDQSxjQUFjLFlBQWQ7QUFDQSxjQUFjLFNBQWQ7QUFDQSxjQUFjLFFBQWQ7QUFDQSxTQUFTQSxNQUFULEVBQWlCQyxRQUFqQixFQUEyQkMsSUFBM0IsUUFBdUMsUUFBdkM7QUFDQSxlQUFlRixNQUFmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3lzdGVtIH0gZnJvbSAnLi9jb3JlJztcblxuZXhwb3J0ICogZnJvbSAnLi9iZWhhdmlvdXInO1xuZXhwb3J0ICogZnJvbSAnLi9kZWJ1Zyc7XG5leHBvcnQgKiBmcm9tICcuL2Vhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9lbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW5pdGlhbGl6ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tYXRoJztcbmV4cG9ydCAqIGZyb20gJy4vcmVuZGVyZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3pvbmUnO1xuZXhwb3J0IHsgU3lzdGVtLCBQYXJ0aWNsZSwgUG9vbCB9IGZyb20gJy4vY29yZSc7XG5leHBvcnQgZGVmYXVsdCBTeXN0ZW07XG4iXX0=
@@ -0,0 +1,83 @@
import Initializer from './Initializer';
import { createArraySpan } from '../math';
import { INITIALIZER_TYPE_BODY as type } from './types';
/**
* Sets the body property on initialized particles.
*
*/
export default class Body extends Initializer {
/**
* Constructs a Body initalizer instance.
*
* @param {string|number|object} body - The content for the particle body, can
* be a color or an object (mesh)
* @param {?number} w - The width of the particle body
* @param {?number} h - The height of the particle body
* @return void
*/
constructor(body, w=null, h=null, isEnabled = true) {
super(type, isEnabled);
/**
* @desc The content for the particle body
* @type {ArraySpan}
*/
this.body = createArraySpan(body);
/**
* @desc The width of the particle Body
* @type {number}
*/
this.w = w;
/**
* @desc The height of the particle Body
* @type {number}
*/
this.h = h || w;
}
/**
* Sets the particle's initial body.
*
* @param {Particle} particle - the particle to initialize the property on
* @return void
*/
initialize(particle) {
var body = this.body.getValue();
if (this.w) {
particle.body = {
width: this.w,
height: this.h,
body: body
};
} else {
particle.body = body;
}
}
/**
* Creates a Body initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @property {number} json.body - The color for the particle body
* @property {number} json.width - The width of the particle body
* @property {number} json.height - The height of the particle body
* @return {Body}
*/
static fromJSON(json) {
const {
body,
width,
height,
isEnabled = true
} = json;
return new Body(body, width, height, isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9Cb2R5LmpzIl0sIm5hbWVzIjpbIkluaXRpYWxpemVyIiwiY3JlYXRlQXJyYXlTcGFuIiwiSU5JVElBTElaRVJfVFlQRV9CT0RZIiwidHlwZSIsIkJvZHkiLCJjb25zdHJ1Y3RvciIsImJvZHkiLCJ3IiwiaCIsImlzRW5hYmxlZCIsImluaXRpYWxpemUiLCJwYXJ0aWNsZSIsImdldFZhbHVlIiwid2lkdGgiLCJoZWlnaHQiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZUFBeEI7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFNBQWhDO0FBQ0EsU0FBU0MscUJBQXFCLElBQUlDLElBQWxDLFFBQThDLFNBQTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxJQUFOLFNBQW1CSixXQUFuQixDQUErQjtBQUM1QztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUssRUFBQUEsV0FBVyxDQUFDQyxJQUFELEVBQU9DLENBQVAsRUFBVUMsQ0FBVixFQUFhQyxTQUFTLEdBQUcsSUFBekIsRUFBK0I7QUFDeEMsVUFBTU4sSUFBTixFQUFZTSxTQUFaO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0gsSUFBTCxHQUFZTCxlQUFlLENBQUNLLElBQUQsQ0FBM0I7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxDQUFMLEdBQVNBLENBQVQ7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxDQUFMLEdBQVNBLENBQUMsSUFBSUQsQ0FBZDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUcsRUFBQUEsVUFBVSxDQUFDQyxRQUFELEVBQVc7QUFDbkIsUUFBSUwsSUFBSSxHQUFHLEtBQUtBLElBQUwsQ0FBVU0sUUFBVixFQUFYOztBQUVBLFFBQUksS0FBS0wsQ0FBVCxFQUFZO0FBQ1ZJLE1BQUFBLFFBQVEsQ0FBQ0wsSUFBVCxHQUFnQjtBQUNkTyxRQUFBQSxLQUFLLEVBQUUsS0FBS04sQ0FERTtBQUVkTyxRQUFBQSxNQUFNLEVBQUUsS0FBS04sQ0FGQztBQUdkRixRQUFBQSxJQUFJLEVBQUVBO0FBSFEsT0FBaEI7QUFLRCxLQU5ELE1BTU87QUFDTEssTUFBQUEsUUFBUSxDQUFDTCxJQUFULEdBQWdCQSxJQUFoQjtBQUNEO0FBQ0Y7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNpQixTQUFSUyxRQUFRLENBQUNDLElBQUQsRUFBTztBQUNwQixVQUFNO0FBQUVWLE1BQUFBLElBQUY7QUFBUU8sTUFBQUEsS0FBUjtBQUFlQyxNQUFBQSxNQUFmO0FBQXVCTCxNQUFBQSxTQUFTLEdBQUc7QUFBbkMsUUFBNENPLElBQWxEO0FBRUEsV0FBTyxJQUFJWixJQUFKLENBQVNFLElBQVQsRUFBZU8sS0FBZixFQUFzQkMsTUFBdEIsRUFBOEJMLFNBQTlCLENBQVA7QUFDRDs7QUFqRTJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEluaXRpYWxpemVyIGZyb20gJy4vSW5pdGlhbGl6ZXInO1xuaW1wb3J0IHsgY3JlYXRlQXJyYXlTcGFuIH0gZnJvbSAnLi4vbWF0aCc7XG5pbXBvcnQgeyBJTklUSUFMSVpFUl9UWVBFX0JPRFkgYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuLyoqXG4gKiBTZXRzIHRoZSBib2R5IHByb3BlcnR5IG9uIGluaXRpYWxpemVkIHBhcnRpY2xlcy5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvZHkgZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgQm9keSBpbml0YWxpemVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8b2JqZWN0fSBib2R5IC0gVGhlIGNvbnRlbnQgZm9yIHRoZSBwYXJ0aWNsZSBib2R5LCBjYW5cbiAgICogYmUgYSBjb2xvciBvciBhbiBvYmplY3QgKG1lc2gpXG4gICAqIEBwYXJhbSB7P251bWJlcn0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcGFydGljbGUgYm9keVxuICAgKiBAcGFyYW0gez9udW1iZXJ9IGggLSBUaGUgaGVpZ2h0IG9mIHRoZSBwYXJ0aWNsZSBib2R5XG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IoYm9keSwgdywgaCwgaXNFbmFibGVkID0gdHJ1ZSkge1xuICAgIHN1cGVyKHR5cGUsIGlzRW5hYmxlZCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgY29udGVudCBmb3IgdGhlIHBhcnRpY2xlIGJvZHlcbiAgICAgKiBAdHlwZSB7QXJyYXlTcGFufVxuICAgICAqL1xuICAgIHRoaXMuYm9keSA9IGNyZWF0ZUFycmF5U3Bhbihib2R5KTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSB3aWR0aCBvZiB0aGUgcGFydGljbGUgQm9keVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy53ID0gdztcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBoZWlnaHQgb2YgdGhlIHBhcnRpY2xlIEJvZHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuaCA9IGggfHwgdztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwYXJ0aWNsZSdzIGluaXRpYWwgYm9keS5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSB0aGUgcGFydGljbGUgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgb25cbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgdmFyIGJvZHkgPSB0aGlzLmJvZHkuZ2V0VmFsdWUoKTtcblxuICAgIGlmICh0aGlzLncpIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB7XG4gICAgICAgIHdpZHRoOiB0aGlzLncsXG4gICAgICAgIGhlaWdodDogdGhpcy5oLFxuICAgICAgICBib2R5OiBib2R5LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUuYm9keSA9IGJvZHk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBCb2R5IGluaXRpYWxpemVyIGZyb20gSlNPTi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgSlNPTiB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlIGZyb20uXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLmJvZHkgLSBUaGUgY29sb3IgZm9yIHRoZSBwYXJ0aWNsZSBib2R5XG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLndpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBwYXJ0aWNsZSBib2R5XG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLmhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHBhcnRpY2xlIGJvZHlcbiAgICogQHJldHVybiB7Qm9keX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgY29uc3QgeyBib2R5LCB3aWR0aCwgaGVpZ2h0LCBpc0VuYWJsZWQgPSB0cnVlIH0gPSBqc29uO1xuXG4gICAgcmV0dXJuIG5ldyBCb2R5KGJvZHksIHdpZHRoLCBoZWlnaHQsIGlzRW5hYmxlZCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,108 @@
import _defineProperty from "@babel/runtime/helpers/defineProperty";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import { DEFAULT_JSON_MATERIAL_PROPERTIES, DEFAULT_MATERIAL_PROPERTIES, SUPPORTED_MATERIAL_BLENDING_MODES } from './constants';
import Initializer from './Initializer';
import { INITIALIZER_TYPE_BODY_SPRITE as type } from './types';
import { withDefaults } from '../utils';
/**
* Sets the body property to be a THREE.Sprite on initialized particles.
*
* NOTE The texture map MUST be set on the SpriteMaterial in the TextureLoader.load
* callback. Not doing so will cause WebGL buffer errors.
*/
export default class BodySprite extends Initializer {
/**
* Constructs a BodySprite initializer.
*
* @param {object} THREE - The Web GL API we are using eg., THREE
* @param {string} texture - The sprite texture
* @param {object} materialProperties - The sprite material properties
* @throws {Error} If the TextureLoader fails to load the supplied texture
* @return void
*/
constructor(THREE, texture, materialProperties = DEFAULT_MATERIAL_PROPERTIES, isEnabled = true) {
super(type, isEnabled);
const {
Sprite,
SpriteMaterial,
TextureLoader
} = THREE;
/**
* @desc The material properties for this object's SpriteMaterial
* NOTE This is required for testing purposes
* @type {object}
*/
this.materialProperties = withDefaults(DEFAULT_MATERIAL_PROPERTIES, materialProperties);
new TextureLoader().load(texture, map => {
/**
* @desc The texture for the THREE.SpriteMaterial map.
* @type {Texture}
*/
this.texture = map;
/**
* @desc THREE.SpriteMaterial instance.
* @type {SpriteMaterial}
*/
this.material = new SpriteMaterial(_objectSpread(_objectSpread({}, {
map
}), this.materialProperties));
/**
* @desc THREE.Sprite instance.
* @type {Sprite}
*/
this.sprite = new Sprite(this.material);
}, undefined, error => {
throw new Error(error);
});
}
/**
* Sets the particle body to the sprite.
*
* @param {Particle} particle - The particle to set the body of
* @return void
*/
initialize(particle) {
particle.body = this.sprite;
}
/**
* Creates a BodySprite initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from
* @param {object} THREE - The Web GL API we are using eg., THREE
* @param {string} json.texture - The sprite texture
* @param {object} json.materialProperties - The sprite material properties
* @return {BodySprite}
*/
static fromJSON(json, THREE) {
const {
texture,
materialProperties = DEFAULT_JSON_MATERIAL_PROPERTIES,
isEnabled = true
} = json;
const ensureMappedBlendingMode = properties => {
const {
blending
} = properties;
return _objectSpread(_objectSpread({}, properties), {}, {
blending: blending ? SUPPORTED_MATERIAL_BLENDING_MODES[blending] : SUPPORTED_MATERIAL_BLENDING_MODES[DEFAULT_JSON_MATERIAL_PROPERTIES.blending]
});
};
return new BodySprite(THREE, texture, withDefaults(DEFAULT_JSON_MATERIAL_PROPERTIES, ensureMappedBlendingMode(materialProperties)), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9Cb2R5U3ByaXRlLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfSlNPTl9NQVRFUklBTF9QUk9QRVJUSUVTIiwiREVGQVVMVF9NQVRFUklBTF9QUk9QRVJUSUVTIiwiU1VQUE9SVEVEX01BVEVSSUFMX0JMRU5ESU5HX01PREVTIiwiSW5pdGlhbGl6ZXIiLCJJTklUSUFMSVpFUl9UWVBFX0JPRFlfU1BSSVRFIiwidHlwZSIsIndpdGhEZWZhdWx0cyIsIkJvZHlTcHJpdGUiLCJjb25zdHJ1Y3RvciIsIlRIUkVFIiwidGV4dHVyZSIsIm1hdGVyaWFsUHJvcGVydGllcyIsImlzRW5hYmxlZCIsIlNwcml0ZSIsIlNwcml0ZU1hdGVyaWFsIiwiVGV4dHVyZUxvYWRlciIsImxvYWQiLCJtYXAiLCJtYXRlcmlhbCIsInNwcml0ZSIsInVuZGVmaW5lZCIsImVycm9yIiwiRXJyb3IiLCJpbml0aWFsaXplIiwicGFydGljbGUiLCJib2R5IiwiZnJvbUpTT04iLCJqc29uIiwiZW5zdXJlTWFwcGVkQmxlbmRpbmdNb2RlIiwicHJvcGVydGllcyIsImJsZW5kaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxTQUNFQSxnQ0FERixFQUVFQywyQkFGRixFQUdFQyxpQ0FIRixRQUlPLGFBSlA7QUFNQSxPQUFPQyxXQUFQLE1BQXdCLGVBQXhCO0FBQ0EsU0FBU0MsNEJBQTRCLElBQUlDLElBQXpDLFFBQXFELFNBQXJEO0FBQ0EsU0FBU0MsWUFBVCxRQUE2QixVQUE3QjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxlQUFlLE1BQU1DLFVBQU4sU0FBeUJKLFdBQXpCLENBQXFDO0FBQ2xEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSyxFQUFBQSxXQUFXLENBQ1RDLEtBRFMsRUFFVEMsT0FGUyxFQUdUQyxrQkFBa0IsR0FBR1YsMkJBSFosRUFJVFcsU0FBUyxHQUFHLElBSkgsRUFLVDtBQUNBLFVBQU1QLElBQU4sRUFBWU8sU0FBWjtBQUVBLFVBQU07QUFBRUMsTUFBQUEsTUFBRjtBQUFVQyxNQUFBQSxjQUFWO0FBQTBCQyxNQUFBQTtBQUExQixRQUE0Q04sS0FBbEQ7QUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUNJLFNBQUtFLGtCQUFMLEdBQTBCTCxZQUFZLENBQ3BDTCwyQkFEb0MsRUFFcENVLGtCQUZvQyxDQUF0QztBQUtBLFFBQUlJLGFBQUosR0FBb0JDLElBQXBCLENBQ0VOLE9BREYsRUFFRU8sR0FBRyxJQUFJO0FBQ0w7QUFDUjtBQUNBO0FBQ0E7QUFDUSxXQUFLUCxPQUFMLEdBQWVPLEdBQWY7QUFFQTtBQUNSO0FBQ0E7QUFDQTs7QUFDUSxXQUFLQyxRQUFMLEdBQWdCLElBQUlKLGNBQUosaUNBQ1g7QUFBRUcsUUFBQUE7QUFBRixPQURXLEdBRVgsS0FBS04sa0JBRk0sRUFBaEI7QUFLQTtBQUNSO0FBQ0E7QUFDQTs7QUFDUSxXQUFLUSxNQUFMLEdBQWMsSUFBSU4sTUFBSixDQUFXLEtBQUtLLFFBQWhCLENBQWQ7QUFDRCxLQXZCSCxFQXdCRUUsU0F4QkYsRUF5QkVDLEtBQUssSUFBSTtBQUNQLFlBQU0sSUFBSUMsS0FBSixDQUFVRCxLQUFWLENBQU47QUFDRCxLQTNCSDtBQTZCRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VFLEVBQUFBLFVBQVUsQ0FBQ0MsUUFBRCxFQUFXO0FBQ25CQSxJQUFBQSxRQUFRLENBQUNDLElBQVQsR0FBZ0IsS0FBS04sTUFBckI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJPLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPbEIsS0FBUCxFQUFjO0FBQzNCLFVBQU07QUFDSkMsTUFBQUEsT0FESTtBQUVKQyxNQUFBQSxrQkFBa0IsR0FBR1gsZ0NBRmpCO0FBR0pZLE1BQUFBLFNBQVMsR0FBRztBQUhSLFFBSUZlLElBSko7O0FBTUEsVUFBTUMsd0JBQXdCLEdBQUdDLFVBQVUsSUFBSTtBQUM3QyxZQUFNO0FBQUVDLFFBQUFBO0FBQUYsVUFBZUQsVUFBckI7QUFFQSw2Q0FDS0EsVUFETDtBQUVFQyxRQUFBQSxRQUFRLEVBQUVBLFFBQVEsR0FDZDVCLGlDQUFpQyxDQUFDNEIsUUFBRCxDQURuQixHQUVkNUIsaUNBQWlDLENBQ2pDRixnQ0FBZ0MsQ0FBQzhCLFFBREE7QUFKdkM7QUFRRCxLQVhEOztBQWFBLFdBQU8sSUFBSXZCLFVBQUosQ0FDTEUsS0FESyxFQUVMQyxPQUZLLEVBR0xKLFlBQVksQ0FDVk4sZ0NBRFUsRUFFVjRCLHdCQUF3QixDQUFDakIsa0JBQUQsQ0FGZCxDQUhQLEVBT0xDLFNBUEssQ0FBUDtBQVNEOztBQTdHaUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBERUZBVUxUX0pTT05fTUFURVJJQUxfUFJPUEVSVElFUyxcbiAgREVGQVVMVF9NQVRFUklBTF9QUk9QRVJUSUVTLFxuICBTVVBQT1JURURfTUFURVJJQUxfQkxFTkRJTkdfTU9ERVMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuaW1wb3J0IEluaXRpYWxpemVyIGZyb20gJy4vSW5pdGlhbGl6ZXInO1xuaW1wb3J0IHsgSU5JVElBTElaRVJfVFlQRV9CT0RZX1NQUklURSBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyB3aXRoRGVmYXVsdHMgfSBmcm9tICcuLi91dGlscyc7XG5cbi8qKlxuICogU2V0cyB0aGUgYm9keSBwcm9wZXJ0eSB0byBiZSBhIFRIUkVFLlNwcml0ZSBvbiBpbml0aWFsaXplZCBwYXJ0aWNsZXMuXG4gKlxuICogTk9URSBUaGUgdGV4dHVyZSBtYXAgTVVTVCBiZSBzZXQgb24gdGhlIFNwcml0ZU1hdGVyaWFsIGluIHRoZSBUZXh0dXJlTG9hZGVyLmxvYWRcbiAqIGNhbGxiYWNrLiBOb3QgZG9pbmcgc28gd2lsbCBjYXVzZSBXZWJHTCBidWZmZXIgZXJyb3JzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb2R5U3ByaXRlIGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIEJvZHlTcHJpdGUgaW5pdGlhbGl6ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBUSFJFRSAtIFRoZSBXZWIgR0wgQVBJIHdlIGFyZSB1c2luZyBlZy4sIFRIUkVFXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIHNwcml0ZSB0ZXh0dXJlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYXRlcmlhbFByb3BlcnRpZXMgLSBUaGUgc3ByaXRlIG1hdGVyaWFsIHByb3BlcnRpZXNcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBUZXh0dXJlTG9hZGVyIGZhaWxzIHRvIGxvYWQgdGhlIHN1cHBsaWVkIHRleHR1cmVcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBUSFJFRSxcbiAgICB0ZXh0dXJlLFxuICAgIG1hdGVyaWFsUHJvcGVydGllcyA9IERFRkFVTFRfTUFURVJJQUxfUFJPUEVSVElFUyxcbiAgICBpc0VuYWJsZWQgPSB0cnVlXG4gICkge1xuICAgIHN1cGVyKHR5cGUsIGlzRW5hYmxlZCk7XG5cbiAgICBjb25zdCB7IFNwcml0ZSwgU3ByaXRlTWF0ZXJpYWwsIFRleHR1cmVMb2FkZXIgfSA9IFRIUkVFO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIG1hdGVyaWFsIHByb3BlcnRpZXMgZm9yIHRoaXMgb2JqZWN0J3MgU3ByaXRlTWF0ZXJpYWxcbiAgICAgKiBOT1RFIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMubWF0ZXJpYWxQcm9wZXJ0aWVzID0gd2l0aERlZmF1bHRzKFxuICAgICAgREVGQVVMVF9NQVRFUklBTF9QUk9QRVJUSUVTLFxuICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzXG4gICAgKTtcblxuICAgIG5ldyBUZXh0dXJlTG9hZGVyKCkubG9hZChcbiAgICAgIHRleHR1cmUsXG4gICAgICBtYXAgPT4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2MgVGhlIHRleHR1cmUgZm9yIHRoZSBUSFJFRS5TcHJpdGVNYXR Line truncated
@@ -0,0 +1,84 @@
import { INITIALIZER_TYPE_ABSTRACT } from './types';
/**
* The base Emitter / Particle property class.
*
* @abstract
*/
export default class Initializer {
/**
* Constructs an Initializer instance.
*
* @param {string} [type=INITIALIZER_TYPE_ABSTRACT] - The intiializer type
* @param {boolean} [isEnabled=true] - Determines if the initializer should be enabled or not
* @return void
*/
constructor(type = INITIALIZER_TYPE_ABSTRACT, isEnabled = true) {
this.type = type;
this.isEnabled = isEnabled;
}
/**
* Initializes the property on the emitter or particle.
*
* @see {@link '../emitter/emitter.js'} setupParticle
* @param {Emitter} emitter - the emitter to initialize the property on
* @param {Particle} particle - the particle to intiialize the property on
* @return void
*/
init(emitter, particle) {
if (!this.isEnabled) {
return;
}
if (particle) {
this.initialize(particle);
particle.hasBeenInitialized = true;
} else {
this.initialize(emitter);
emitter.hasBeenInitialized = true;
}
}
/**
* @abstract
*/
reset() {}
/**
* Place custom property initialization code in this method in the subclass.
*
* @param {object} target - either an Emitter or a Particle
* @abstract
*/
initialize(target) {} // eslint-disable-line
/**
* Determines if the initializer requires a Web GL API to be provided to its constructor.
* If true, the WebGL API will need to be provided as the first argument to the constructor
* and fromJSON methods.
*
* @return {boolean}
*/
static requiresWebGlApi() {
return false;
}
/**
* Returns a new instance of the initializer from the JSON object passed.
*
* @abstract
* @param {object} json - JSON object containing the required constructor properties
* @return {Behaviour}
*/
static fromJSON(json) {} // eslint-disable-line
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9Jbml0aWFsaXplci5qcyJdLCJuYW1lcyI6WyJJTklUSUFMSVpFUl9UWVBFX0FCU1RSQUNUIiwiSW5pdGlhbGl6ZXIiLCJjb25zdHJ1Y3RvciIsInR5cGUiLCJpc0VuYWJsZWQiLCJpbml0IiwiZW1pdHRlciIsInBhcnRpY2xlIiwiaW5pdGlhbGl6ZSIsImhhc0JlZW5Jbml0aWFsaXplZCIsInJlc2V0IiwidGFyZ2V0IiwicmVxdWlyZXNXZWJHbEFwaSIsImZyb21KU09OIiwianNvbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EseUJBQVQsUUFBMEMsU0FBMUM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsV0FBTixDQUFrQjtBQUMvQjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVFQyxFQUFBQSxXQUFXLENBQUNDLElBQUksR0FBR0gseUJBQVIsRUFBbUNJLFNBQVMsR0FBRyxJQUEvQyxFQUFxRDtBQUM5RCxTQUFLRCxJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxTQUFMLEdBQWlCQSxTQUFqQjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VDLEVBQUFBLElBQUksQ0FBQ0MsT0FBRCxFQUFVQyxRQUFWLEVBQW9CO0FBQ3RCLFFBQUksQ0FBQyxLQUFLSCxTQUFWLEVBQXFCO0FBQ25CO0FBQ0Q7O0FBRUQsUUFBSUcsUUFBSixFQUFjO0FBQ1osV0FBS0MsVUFBTCxDQUFnQkQsUUFBaEI7QUFDQUEsTUFBQUEsUUFBUSxDQUFDRSxrQkFBVCxHQUE4QixJQUE5QjtBQUNELEtBSEQsTUFHTztBQUNMLFdBQUtELFVBQUwsQ0FBZ0JGLE9BQWhCO0FBQ0FBLE1BQUFBLE9BQU8sQ0FBQ0csa0JBQVIsR0FBNkIsSUFBN0I7QUFDRDtBQUNGO0FBRUQ7QUFDRjtBQUNBOzs7QUFDRUMsRUFBQUEsS0FBSyxHQUFHLENBQUU7QUFFVjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRixFQUFBQSxVQUFVLENBQUNHLE1BQUQsRUFBUyxDQUFFLENBL0NVLENBK0NUOztBQUV0QjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ3lCLFNBQWhCQyxnQkFBZ0IsR0FBRztBQUN4QixXQUFPLEtBQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDaUIsU0FBUkMsUUFBUSxDQUFDQyxJQUFELEVBQU8sQ0FBRSxDQW5FTyxDQW1FTjs7O0FBbkVNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSU5JVElBTElaRVJfVFlQRV9BQlNUUkFDVCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIEVtaXR0ZXIgLyBQYXJ0aWNsZSBwcm9wZXJ0eSBjbGFzcy5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5pdGlhbGl6ZXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBJbml0aWFsaXplciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPUlOSVRJQUxJWkVSX1RZUEVfQUJTVFJBQ1RdIC0gVGhlIGludGlpYWxpemVyIHR5cGVcbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNFbmFibGVkPXRydWVdIC0gRGV0ZXJtaW5lcyBpZiB0aGUgaW5pdGlhbGl6ZXIgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90XG5cbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlID0gSU5JVElBTElaRVJfVFlQRV9BQlNUUkFDVCwgaXNFbmFibGVkID0gdHJ1ZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5pc0VuYWJsZWQgPSBpc0VuYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnR5IG9uIHRoZSBlbWl0dGVyIG9yIHBhcnRpY2xlLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayAnLi4vZW1pdHRlci9lbWl0dGVyLmpzJ30gc2V0dXBQYXJ0aWNsZVxuICAgKiBAcGFyYW0ge0VtaXR0ZXJ9IGVtaXR0ZXIgLSB0aGUgZW1pdHRlciB0byBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvblxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIHRoZSBwYXJ0aWNsZSB0byBpbnRpaWFsaXplIHRoZSBwcm9wZXJ0eSBvblxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGluaXQoZW1pdHRlciwgcGFydGljbGUpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcnRpY2xlKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemUocGFydGljbGUpO1xuICAgICAgcGFydGljbGUuaGFzQmVlbkluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0aWFsaXplKGVtaXR0ZXIpO1xuICAgICAgZW1pdHRlci5oYXNCZWVuSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHJlc2V0KCkge31cblxuICAvKipcbiAgICogUGxhY2UgY3VzdG9tIHByb3BlcnR5IGluaXRpYWxpemF0aW9uIGNvZGUgaW4gdGhpcyBtZXRob2QgaW4gdGhlIHN1YmNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IC0gZWl0aGVyIGFuIEVtaXR0ZXIgb3IgYSBQYXJ0aWNsZVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGluaXRpYWxpemVyIHJlcXVpcmVzIGEgV2ViIEdMIEFQSSB0byBiZSBwcm92aWRlZCB0byBpdHMgY29uc3RydWN0b3IuXG4gICAqIElmIHRydWUsIHRoZSBXZWJHTCBBUEkgd2lsbCBuZWVkIHRvIGJlIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3JcbiAgICogYW5kIGZyb21KU09OIG1ldGhvZHMuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgcmVxdWlyZXNXZWJHbEFwaSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgZnJvbSB0aGUgSlNPTiBvYmplY3QgcGFzc2VkLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBKU09OIG9iamVjdCBjb250YWluaW5nIHRoZSByZXF1aXJlZCBjb25zdHJ1Y3RvciBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm4ge0JlaGF2aW91cn1cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG59XG4iXX0=
@@ -0,0 +1,48 @@
import { Euler } from '../core/three/';
const particleEuler = new Euler();
export default {
particleEuler: null,
/**
* Loops through the initializers array and calls each initializer's initialize method
* on the supplied particle. This sets the particle's initial properties.
*
* @see {@link '../emitter/Emitter'} setupParticle
* @param {Emitter} emitter - The emitter that has called this method
* @param {Particle} particle - The particle that has just been created
* @param {array<Initializer>} initializers - All of the emitter's initializers
* @return void
*/
initialize: function (emitter, particle, initializers) {
let i = initializers.length;
while (i--) {
initializers[i].init(emitter, particle);
}
emitter.bindEmitter && this.bindEmitter(emitter, particle);
},
/**
* Ensures that the emitter's position, velocity and accleration are added
* to each created particle.
*
* @param {Emitter} emitter - The emitter that is emitting the particles
* @param {Particle} particle - The newly created particle
* @return void
*/
bindEmitter: function (emitter, particle) {
const {
rotation: {
x,
y,
z
}
} = emitter;
particle.position.add(emitter.position);
particle.velocity.add(emitter.velocity);
particle.acceleration.add(emitter.acceleration);
particle.velocity.applyEuler(particleEuler.set(x, y, z));
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9Jbml0aWFsaXplclV0aWwuanMiXSwibmFtZXMiOlsiRXVsZXIiLCJwYXJ0aWNsZUV1bGVyIiwiaW5pdGlhbGl6ZSIsImVtaXR0ZXIiLCJwYXJ0aWNsZSIsImluaXRpYWxpemVycyIsImkiLCJsZW5ndGgiLCJpbml0IiwiYmluZEVtaXR0ZXIiLCJyb3RhdGlvbiIsIngiLCJ5IiwieiIsInBvc2l0aW9uIiwiYWRkIiwidmVsb2NpdHkiLCJhY2NlbGVyYXRpb24iLCJhcHBseUV1bGVyIiwic2V0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxLQUFULFFBQXNCLGdCQUF0QjtBQUVBLE1BQU1DLGFBQWEsR0FBRyxJQUFJRCxLQUFKLEVBQXRCO0FBRUEsZUFBZTtBQUNiQyxFQUFBQSxhQUFhLEVBQUUsSUFERjs7QUFFYjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFQyxFQUFBQSxVQUFVLEVBQUUsVUFBU0MsT0FBVCxFQUFrQkMsUUFBbEIsRUFBNEJDLFlBQTVCLEVBQTBDO0FBQ3BELFFBQUlDLENBQUMsR0FBR0QsWUFBWSxDQUFDRSxNQUFyQjs7QUFFQSxXQUFPRCxDQUFDLEVBQVIsRUFBWTtBQUNWRCxNQUFBQSxZQUFZLENBQUNDLENBQUQsQ0FBWixDQUFnQkUsSUFBaEIsQ0FBcUJMLE9BQXJCLEVBQThCQyxRQUE5QjtBQUNEOztBQUVERCxJQUFBQSxPQUFPLENBQUNNLFdBQVIsSUFBdUIsS0FBS0EsV0FBTCxDQUFpQk4sT0FBakIsRUFBMEJDLFFBQTFCLENBQXZCO0FBQ0QsR0FwQlk7O0FBc0JiO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUssRUFBQUEsV0FBVyxFQUFFLFVBQVNOLE9BQVQsRUFBa0JDLFFBQWxCLEVBQTRCO0FBQ3ZDLFVBQU07QUFDSk0sTUFBQUEsUUFBUSxFQUFFO0FBQUVDLFFBQUFBLENBQUY7QUFBS0MsUUFBQUEsQ0FBTDtBQUFRQyxRQUFBQTtBQUFSO0FBRE4sUUFFRlYsT0FGSjtBQUlBQyxJQUFBQSxRQUFRLENBQUNVLFFBQVQsQ0FBa0JDLEdBQWxCLENBQXNCWixPQUFPLENBQUNXLFFBQTlCO0FBQ0FWLElBQUFBLFFBQVEsQ0FBQ1ksUUFBVCxDQUFrQkQsR0FBbEIsQ0FBc0JaLE9BQU8sQ0FBQ2EsUUFBOUI7QUFDQVosSUFBQUEsUUFBUSxDQUFDYSxZQUFULENBQXNCRixHQUF0QixDQUEwQlosT0FBTyxDQUFDYyxZQUFsQztBQUNBYixJQUFBQSxRQUFRLENBQUNZLFFBQVQsQ0FBa0JFLFVBQWxCLENBQTZCakIsYUFBYSxDQUFDa0IsR0FBZCxDQUFrQlIsQ0FBbEIsRUFBcUJDLENBQXJCLEVBQXdCQyxDQUF4QixDQUE3QjtBQUNEO0FBdkNZLENBQWYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uL2NvcmUvdGhyZWUvJztcblxuY29uc3QgcGFydGljbGVFdWxlciA9IG5ldyBFdWxlcigpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHBhcnRpY2xlRXVsZXI6IG51bGwsXG4gIC8qKlxuICAgKiBMb29wcyB0aHJvdWdoIHRoZSBpbml0aWFsaXplcnMgYXJyYXkgYW5kIGNhbGxzIGVhY2ggaW5pdGlhbGl6ZXIncyBpbml0aWFsaXplIG1ldGhvZFxuICAgKiBvbiB0aGUgc3VwcGxpZWQgcGFydGljbGUuIFRoaXMgc2V0cyB0aGUgcGFydGljbGUncyBpbml0aWFsIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rICcuLi9lbWl0dGVyL0VtaXR0ZXInfSBzZXR1cFBhcnRpY2xlXG4gICAqIEBwYXJhbSB7RW1pdHRlcn0gZW1pdHRlciAtIFRoZSBlbWl0dGVyIHRoYXQgaGFzIGNhbGxlZCB0aGlzIG1ldGhvZFxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0aGF0IGhhcyBqdXN0IGJlZW4gY3JlYXRlZFxuICAgKiBAcGFyYW0ge2FycmF5PEluaXRpYWxpemVyPn0gaW5pdGlhbGl6ZXJzIC0gQWxsIG9mIHRoZSBlbWl0dGVyJ3MgaW5pdGlhbGl6ZXJzXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZW1pdHRlciwgcGFydGljbGUsIGluaXRpYWxpemVycykge1xuICAgIGxldCBpID0gaW5pdGlhbGl6ZXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGluaXRpYWxpemVyc1tpXS5pbml0KGVtaXR0ZXIsIHBhcnRpY2xlKTtcbiAgICB9XG5cbiAgICBlbWl0dGVyLmJpbmRFbWl0dGVyICYmIHRoaXMuYmluZEVtaXR0ZXIoZW1pdHRlciwgcGFydGljbGUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgdGhlIGVtaXR0ZXIncyBwb3NpdGlvbiwgdmVsb2NpdHkgYW5kIGFjY2xlcmF0aW9uIGFyZSBhZGRlZFxuICAgKiB0byBlYWNoIGNyZWF0ZWQgcGFydGljbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RW1pdHRlcn0gZW1pdHRlciAtIFRoZSBlbWl0dGVyIHRoYXQgaXMgZW1pdHRpbmcgdGhlIHBhcnRpY2xlc1xuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBuZXdseSBjcmVhdGVkIHBhcnRpY2xlXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgYmluZEVtaXR0ZXI6IGZ1bmN0aW9uKGVtaXR0ZXIsIHBhcnRpY2xlKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm90YXRpb246IHsgeCwgeSwgeiB9LFxuICAgIH0gPSBlbWl0dGVyO1xuXG4gICAgcGFydGljbGUucG9zaXRpb24uYWRkKGVtaXR0ZXIucG9zaXRpb24pO1xuICAgIHBhcnRpY2xlLnZlbG9jaXR5LmFkZChlbWl0dGVyLnZlbG9jaXR5KTtcbiAgICBwYXJ0aWNsZS5hY2NlbGVyYXRpb24uYWRkKGVtaXR0ZXIuYWNjZWxlcmF0aW9uKTtcbiAgICBwYXJ0aWNsZS52ZWxvY2l0eS5hcHBseUV1bGVyKHBhcnRpY2xlRXVsZXIuc2V0KHgsIHksIHopKTtcbiAgfSxcbn07XG4iXX0=
@@ -0,0 +1,66 @@
import Initializer from './Initializer';
import { createSpan } from '../math';
import { INITIALIZER_TYPE_LIFE as type } from './types';
/**
* Sets the life property on initialized particles.
*
*/
export default class Life extends Initializer {
/**
* Constructs a Life property instance.
*
* @param {number} min - The minimum life
* @param {number} max - The maximum life
* @param {boolean} [center] - Determines whether to average the life value
* @param {boolean} [isEnabled=true] - Determines if the initializer should be enabled or not
* @return void
*/
constructor(min, max, center, isEnabled = true) {
super(type, isEnabled);
/**
* @desc The life span of the particle.
* @type {Span}
*/
this.lifePan = createSpan(min, max, center);
}
/**
* Sets the particle's initial life.
*
* @param {Particle} particle - the particle to initialize the property on
* @return void
*/
initialize(particle) {
if (this.lifePan.a == Infinity || this.lifePan.a == 'infi') {
particle.life = Infinity;
} else {
particle.life = this.lifePan.getValue();
}
}
/**
* Creates a Life initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @param {number} json.min - The minimum life time
* @param {number} json.max - The maximum life time
* @param {number} json.center - The center of the life time
* @param {boolean} [json.isEnabled=true] - Determines if the initializer should be enabled or not
* @return {Life}
*/
static fromJSON(json) {
const {
min,
max,
center = false,
isEnabled = true
} = json;
return new Life(min, max, center, isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9MaWZlLmpzIl0sIm5hbWVzIjpbIkluaXRpYWxpemVyIiwiY3JlYXRlU3BhbiIsIklOSVRJQUxJWkVSX1RZUEVfTElGRSIsInR5cGUiLCJMaWZlIiwiY29uc3RydWN0b3IiLCJtaW4iLCJtYXgiLCJjZW50ZXIiLCJpc0VuYWJsZWQiLCJsaWZlUGFuIiwiaW5pdGlhbGl6ZSIsInBhcnRpY2xlIiwiYSIsIkluZmluaXR5IiwibGlmZSIsImdldFZhbHVlIiwiZnJvbUpTT04iLCJqc29uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGVBQXhCO0FBQ0EsU0FBU0MsVUFBVCxRQUEyQixTQUEzQjtBQUNBLFNBQVNDLHFCQUFxQixJQUFJQyxJQUFsQyxRQUE4QyxTQUE5QztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsSUFBTixTQUFtQkosV0FBbkIsQ0FBK0I7QUFDNUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VLLEVBQUFBLFdBQVcsQ0FBQ0MsR0FBRCxFQUFNQyxHQUFOLEVBQVdDLE1BQVgsRUFBbUJDLFNBQVMsR0FBRyxJQUEvQixFQUFxQztBQUM5QyxVQUFNTixJQUFOLEVBQVlNLFNBQVo7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxPQUFMLEdBQWVULFVBQVUsQ0FBQ0ssR0FBRCxFQUFNQyxHQUFOLEVBQVdDLE1BQVgsQ0FBekI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VHLEVBQUFBLFVBQVUsQ0FBQ0MsUUFBRCxFQUFXO0FBQ25CLFFBQUksS0FBS0YsT0FBTCxDQUFhRyxDQUFiLElBQWtCQyxRQUFsQixJQUE4QixLQUFLSixPQUFMLENBQWFHLENBQWIsSUFBa0IsTUFBcEQsRUFBNEQ7QUFDMURELE1BQUFBLFFBQVEsQ0FBQ0csSUFBVCxHQUFnQkQsUUFBaEI7QUFDRCxLQUZELE1BRU87QUFDTEYsTUFBQUEsUUFBUSxDQUFDRyxJQUFULEdBQWdCLEtBQUtMLE9BQUwsQ0FBYU0sUUFBYixFQUFoQjtBQUNEO0FBQ0Y7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJDLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFVBQU07QUFBRVosTUFBQUEsR0FBRjtBQUFPQyxNQUFBQSxHQUFQO0FBQVlDLE1BQUFBLE1BQU0sR0FBRyxLQUFyQjtBQUE0QkMsTUFBQUEsU0FBUyxHQUFHO0FBQXhDLFFBQWlEUyxJQUF2RDtBQUVBLFdBQU8sSUFBSWQsSUFBSixDQUFTRSxHQUFULEVBQWNDLEdBQWQsRUFBbUJDLE1BQW5CLEVBQTJCQyxTQUEzQixDQUFQO0FBQ0Q7O0FBaEQyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJbml0aWFsaXplciBmcm9tICcuL0luaXRpYWxpemVyJztcbmltcG9ydCB7IGNyZWF0ZVNwYW4gfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IElOSVRJQUxJWkVSX1RZUEVfTElGRSBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogU2V0cyB0aGUgbGlmZSBwcm9wZXJ0eSBvbiBpbml0aWFsaXplZCBwYXJ0aWNsZXMuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlIGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIExpZmUgcHJvcGVydHkgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluaW11bSBsaWZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSBsaWZlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NlbnRlcl0gLSBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gYXZlcmFnZSB0aGUgbGlmZSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0VuYWJsZWQ9dHJ1ZV0gLSBEZXRlcm1pbmVzIGlmIHRoZSBpbml0aWFsaXplciBzaG91bGQgYmUgZW5hYmxlZCBvciBub3RcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtaW4sIG1heCwgY2VudGVyLCBpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIodHlwZSwgaXNFbmFibGVkKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBsaWZlIHNwYW4gb2YgdGhlIHBhcnRpY2xlLlxuICAgICAqIEB0eXBlIHtTcGFufVxuICAgICAqL1xuICAgIHRoaXMubGlmZVBhbiA9IGNyZWF0ZVNwYW4obWluLCBtYXgsIGNlbnRlcik7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGFydGljbGUncyBpbml0aWFsIGxpZmUuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gdGhlIHBhcnRpY2xlIHRvIGluaXRpYWxpemUgdGhlIHByb3BlcnR5IG9uXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmxpZmVQYW4uYSA9PSBJbmZpbml0eSB8fCB0aGlzLmxpZmVQYW4uYSA9PSAnaW5maScpIHtcbiAgICAgIHBhcnRpY2xlLmxpZmUgPSBJbmZpbml0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUubGlmZSA9IHRoaXMubGlmZVBhbi5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgTGlmZSBpbml0aWFsaXplciBmcm9tIEpTT04uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gVGhlIEpTT04gdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZSBmcm9tLlxuICAgKiBAcGFyYW0ge251bWJlcn0ganNvbi5taW4gLSBUaGUgbWluaW11bSBsaWZlIHRpbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGpzb24ubWF4IC0gVGhlIG1heGltdW0gbGlmZSB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBqc29uLmNlbnRlciAtIFRoZSBjZW50ZXIgb2YgdGhlIGxpZmUgdGltZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtqc29uLmlzRW5hYmxlZD10cnVlXSAtIERldGVybWluZXMgaWYgdGhlIGluaXRpYWxpemVyIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHtMaWZlfVxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICBjb25zdCB7IG1pbiwgbWF4LCBjZW50ZXIgPSBmYWxzZSwgaXNFbmFibGVkID0gdHJ1ZSB9ID0ganNvbjtcblxuICAgIHJldHVybiBuZXcgTGlmZShtaW4sIG1heCwgY2VudGVyLCBpc0VuYWJsZWQpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,60 @@
import Initializer from './Initializer';
import { createSpan } from '../math';
import { INITIALIZER_TYPE_MASS as type } from './types';
/**
* Sets the mass property on initialized particles.
*
*/
export default class Mass extends Initializer {
/**
* Constructs a Mass initializer instance.
*
* @param {number} min - The minumum mass for the particle
* @param {number} max - The maximum mass for the particle
* @param {boolean} [center] - Determines whether to average the mass value
* @return void
*/
constructor(min, max, center = false, isEnabled = true) {
super(type, isEnabled);
/**
* @desc The mass span which is used to set the particle mass value.
* @type {Span}
*/
this.massPan = createSpan(min, max, center);
}
/**
* Sets the particle's initial mass.
*
* @param {Particle} particle - the particle to initialize the property on
* @return void
*/
initialize(particle) {
particle.mass = this.massPan.getValue();
}
/**
* Creates a Mass initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @property {number} json.min - The minimum mass
* @property {number} json.max - The maximum mass
* @property {number} json.center - The center of the mass
* @return {Mass}
*/
static fromJSON(json) {
const {
min,
max,
center = false,
isEnabled = true
} = json;
return new Mass(min, max, center, isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9NYXNzLmpzIl0sIm5hbWVzIjpbIkluaXRpYWxpemVyIiwiY3JlYXRlU3BhbiIsIklOSVRJQUxJWkVSX1RZUEVfTUFTUyIsInR5cGUiLCJNYXNzIiwiY29uc3RydWN0b3IiLCJtaW4iLCJtYXgiLCJjZW50ZXIiLCJpc0VuYWJsZWQiLCJtYXNzUGFuIiwiaW5pdGlhbGl6ZSIsInBhcnRpY2xlIiwibWFzcyIsImdldFZhbHVlIiwiZnJvbUpTT04iLCJqc29uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGVBQXhCO0FBQ0EsU0FBU0MsVUFBVCxRQUEyQixTQUEzQjtBQUNBLFNBQVNDLHFCQUFxQixJQUFJQyxJQUFsQyxRQUE4QyxTQUE5QztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsSUFBTixTQUFtQkosV0FBbkIsQ0FBK0I7QUFDNUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSyxFQUFBQSxXQUFXLENBQUNDLEdBQUQsRUFBTUMsR0FBTixFQUFXQyxNQUFNLEdBQUcsS0FBcEIsRUFBMkJDLFNBQVMsR0FBRyxJQUF2QyxFQUE2QztBQUN0RCxVQUFNTixJQUFOLEVBQVlNLFNBQVo7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxPQUFMLEdBQWVULFVBQVUsQ0FBQ0ssR0FBRCxFQUFNQyxHQUFOLEVBQVdDLE1BQVgsQ0FBekI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VHLEVBQUFBLFVBQVUsQ0FBQ0MsUUFBRCxFQUFXO0FBQ25CQSxJQUFBQSxRQUFRLENBQUNDLElBQVQsR0FBZ0IsS0FBS0gsT0FBTCxDQUFhSSxRQUFiLEVBQWhCO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNpQixTQUFSQyxRQUFRLENBQUNDLElBQUQsRUFBTztBQUNwQixVQUFNO0FBQUVWLE1BQUFBLEdBQUY7QUFBT0MsTUFBQUEsR0FBUDtBQUFZQyxNQUFBQSxNQUFNLEdBQUcsS0FBckI7QUFBNEJDLE1BQUFBLFNBQVMsR0FBRztBQUF4QyxRQUFpRE8sSUFBdkQ7QUFFQSxXQUFPLElBQUlaLElBQUosQ0FBU0UsR0FBVCxFQUFjQyxHQUFkLEVBQW1CQyxNQUFuQixFQUEyQkMsU0FBM0IsQ0FBUDtBQUNEOztBQTFDMkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSW5pdGlhbGl6ZXIgZnJvbSAnLi9Jbml0aWFsaXplcic7XG5pbXBvcnQgeyBjcmVhdGVTcGFuIH0gZnJvbSAnLi4vbWF0aCc7XG5pbXBvcnQgeyBJTklUSUFMSVpFUl9UWVBFX01BU1MgYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hc3MgcHJvcGVydHkgb24gaW5pdGlhbGl6ZWQgcGFydGljbGVzLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFzcyBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBNYXNzIGluaXRpYWxpemVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbnVtdW0gbWFzcyBmb3IgdGhlIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSBtYXNzIGZvciB0aGUgcGFydGljbGVcbiAgICogQHBhcmFtIHtib29sZWFufSBbY2VudGVyXSAtIERldGVybWluZXMgd2hldGhlciB0byBhdmVyYWdlIHRoZSBtYXNzIHZhbHVlXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IobWluLCBtYXgsIGNlbnRlciA9IGZhbHNlLCBpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIodHlwZSwgaXNFbmFibGVkKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBtYXNzIHNwYW4gd2hpY2ggaXMgdXNlZCB0byBzZXQgdGhlIHBhcnRpY2xlIG1hc3MgdmFsdWUuXG4gICAgICogQHR5cGUge1NwYW59XG4gICAgICovXG4gICAgdGhpcy5tYXNzUGFuID0gY3JlYXRlU3BhbihtaW4sIG1heCwgY2VudGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwYXJ0aWNsZSdzIGluaXRpYWwgbWFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSB0aGUgcGFydGljbGUgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgb25cbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUubWFzcyA9IHRoaXMubWFzc1Bhbi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBNYXNzIGluaXRpYWxpemVyIGZyb20gSlNPTi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgSlNPTiB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlIGZyb20uXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLm1pbiAtIFRoZSBtaW5pbXVtIG1hc3NcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGpzb24ubWF4IC0gVGhlIG1heGltdW0gbWFzc1xuICAgKiBAcHJvcGVydHkge251bWJlcn0ganNvbi5jZW50ZXIgLSBUaGUgY2VudGVyIG9mIHRoZSBtYXNzXG4gICAqIEByZXR1cm4ge01hc3N9XG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgIGNvbnN0IHsgbWluLCBtYXgsIGNlbnRlciA9IGZhbHNlLCBpc0VuYWJsZWQgPSB0cnVlIH0gPSBqc29uO1xuXG4gICAgcmV0dXJuIG5ldyBNYXNzKG1pbiwgbWF4LCBjZW50ZXIsIGlzRW5hYmxlZCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,98 @@
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
const _excluded = ["zoneType"];
import * as Zone from '../zone';
import Initializer from './Initializer';
import { SUPPORTED_JSON_ZONE_TYPES } from '../core/constants';
import { INITIALIZER_TYPE_POSITION as type } from './types';
/**
* Sets the starting position property for initialized particles.
* This is derived from a zone randomly chosen from those supplied to the constructor.
*
*/
export default class Position extends Initializer {
/**
* Constructs a Position initializer instance.
*
* @param {Zone|array<Zone>}
* @return void
*/
constructor() {
super(type);
this.reset.apply(this, arguments);
}
/**
* Resets the initializer properties.
* Clears all previously set zones and resets the zones according to args passed.
*
* @param {Zone|array<Zone>}
* @return void
*/
reset() {
if (!this.zones) {
this.zones = [];
} else {
this.zones.length = 0;
}
/**
* @desc The zones to use as bounds for calculating the particle's starting position.
* @type {array<Zone>}
*/
this.zones = this.zones.concat(Array.prototype.slice.call(arguments));
}
/**
* Adds a zone or zones to this.zones.
*
* @param {Zone|array<Zone>}
* @return void
*/
addZone() {
this.zones = this.zones.concat(Array.prototype.slice.call(arguments));
}
/**
* Creates a Position initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @param {string} json.zoneType - The type of zone to use for initial position
* @return {Position}
*/
static fromJSON(json) {
const {
zoneType
} = json,
params = _objectWithoutProperties(json, _excluded);
if (!SUPPORTED_JSON_ZONE_TYPES.includes(zoneType)) {
throw new Error(`The zone type ${zoneType} is invalid or not yet supported`);
}
return new Position(new Zone[zoneType](...Object.values(params)));
}
}
/**
* Sets the particle's initial position.
*
* @param {Particle} particle - the particle to initialize the property on
* @return void
*/
Position.prototype.initialize = function () {
let zone;
return function (target) {
zone = this.zones[Math.random() * this.zones.length >> 0];
zone.getPosition();
target.position.x = zone.vector.x;
target.position.y = zone.vector.y;
target.position.z = zone.vector.z;
};
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9Qb3NpdGlvbi5qcyJdLCJuYW1lcyI6WyJab25lIiwiSW5pdGlhbGl6ZXIiLCJTVVBQT1JURURfSlNPTl9aT05FX1RZUEVTIiwiSU5JVElBTElaRVJfVFlQRV9QT1NJVElPTiIsInR5cGUiLCJQb3NpdGlvbiIsImNvbnN0cnVjdG9yIiwicmVzZXQiLCJhcHBseSIsImFyZ3VtZW50cyIsInpvbmVzIiwibGVuZ3RoIiwiY29uY2F0IiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJhZGRab25lIiwiZnJvbUpTT04iLCJqc29uIiwiem9uZVR5cGUiLCJwYXJhbXMiLCJpbmNsdWRlcyIsIkVycm9yIiwiT2JqZWN0IiwidmFsdWVzIiwiaW5pdGlhbGl6ZSIsInpvbmUiLCJ0YXJnZXQiLCJNYXRoIiwicmFuZG9tIiwiZ2V0UG9zaXRpb24iLCJwb3NpdGlvbiIsIngiLCJ2ZWN0b3IiLCJ5IiwieiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEtBQUtBLElBQVosTUFBc0IsU0FBdEI7QUFFQSxPQUFPQyxXQUFQLE1BQXdCLGVBQXhCO0FBQ0EsU0FBU0MseUJBQVQsUUFBMEMsbUJBQTFDO0FBQ0EsU0FBU0MseUJBQXlCLElBQUlDLElBQXRDLFFBQWtELFNBQWxEO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxlQUFlLE1BQU1DLFFBQU4sU0FBdUJKLFdBQXZCLENBQW1DO0FBQ2hEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSyxFQUFBQSxXQUFXLEdBQUc7QUFDWixVQUFNRixJQUFOO0FBRUEsU0FBS0csS0FBTCxDQUFXQyxLQUFYLENBQWlCLElBQWpCLEVBQXVCQyxTQUF2QjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRixFQUFBQSxLQUFLLEdBQUc7QUFDTixRQUFJLENBQUMsS0FBS0csS0FBVixFQUFpQjtBQUNmLFdBQUtBLEtBQUwsR0FBYSxFQUFiO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsV0FBS0EsS0FBTCxDQUFXQyxNQUFYLEdBQW9CLENBQXBCO0FBQ0Q7QUFFRDtBQUNKO0FBQ0E7QUFDQTs7O0FBQ0ksU0FBS0QsS0FBTCxHQUFhLEtBQUtBLEtBQUwsQ0FBV0UsTUFBWCxDQUFrQkMsS0FBSyxDQUFDQyxTQUFOLENBQWdCQyxLQUFoQixDQUFzQkMsSUFBdEIsQ0FBMkJQLFNBQTNCLENBQWxCLENBQWI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VRLEVBQUFBLE9BQU8sR0FBRztBQUNSLFNBQUtQLEtBQUwsR0FBYSxLQUFLQSxLQUFMLENBQVdFLE1BQVgsQ0FBa0JDLEtBQUssQ0FBQ0MsU0FBTixDQUFnQkMsS0FBaEIsQ0FBc0JDLElBQXRCLENBQTJCUCxTQUEzQixDQUFsQixDQUFiO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJTLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFVBQU07QUFBRUMsTUFBQUE7QUFBRixRQUEwQkQsSUFBaEM7QUFBQSxVQUFxQkUsTUFBckIsNEJBQWdDRixJQUFoQzs7QUFFQSxRQUFJLENBQUNqQix5QkFBeUIsQ0FBQ29CLFFBQTFCLENBQW1DRixRQUFuQyxDQUFMLEVBQW1EO0FBQ2pELFlBQU0sSUFBSUcsS0FBSixDQUNILGlCQUFnQkgsUUFBUyxrQ0FEdEIsQ0FBTjtBQUdEOztBQUVELFdBQU8sSUFBSWYsUUFBSixDQUFhLElBQUlMLElBQUksQ0FBQ29CLFFBQUQsQ0FBUixDQUFtQixHQUFHSSxNQUFNLENBQUNDLE1BQVAsQ0FBY0osTUFBZCxDQUF0QixDQUFiLENBQVA7QUFDRDs7QUE3RCtDO0FBZ0VsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0FoQixRQUFRLENBQUNTLFNBQVQsQ0FBbUJZLFVBQW5CLEdBQWlDLFlBQVc7QUFDMUMsTUFBSUMsSUFBSjtBQUVBLFNBQU8sVUFBU0MsTUFBVCxFQUFpQjtBQUN0QkQsSUFBQUEsSUFBSSxHQUFHLEtBQUtqQixLQUFMLENBQVltQixJQUFJLENBQUNDLE1BQUwsS0FBZ0IsS0FBS3BCLEtBQUwsQ0FBV0MsTUFBNUIsSUFBdUMsQ0FBbEQsQ0FBUDtBQUVBZ0IsSUFBQUEsSUFBSSxDQUFDSSxXQUFMO0FBRUFILElBQUFBLE1BQU0sQ0FBQ0ksUUFBUCxDQUFnQkMsQ0FBaEIsR0FBb0JOLElBQUksQ0FBQ08sTUFBTCxDQUFZRCxDQUFoQztBQUNBTCxJQUFBQSxNQUFNLENBQUNJLFFBQVAsQ0FBZ0JHLENBQWhCLEdBQW9CUixJQUFJLENBQUNPLE1BQUwsQ0FBWUMsQ0FBaEM7QUFDQVAsSUFBQUEsTUFBTSxDQUFDSSxRQUFQLENBQWdCSSxDQUFoQixHQUFvQlQsSUFBSSxDQUFDTyxNQUFMLENBQVlFLENBQWhDO0FBQ0QsR0FSRDtBQVNELENBWitCLEVBQWhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgWm9uZSBmcm9tICcuLi96b25lJztcblxuaW1wb3J0IEluaXRpYWxpemVyIGZyb20gJy4vSW5pdGlhbGl6ZXInO1xuaW1wb3J0IHsgU1VQUE9SVEVEX0pTT05fWk9ORV9UWVBFUyB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzJztcbmltcG9ydCB7IElOSVRJQUxJWkVSX1RZUEVfUE9TSVRJT04gYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIHByb3BlcnR5IGZvciBpbml0aWFsaXplZCBwYXJ0aWNsZXMuXG4gKiBUaGlzIGlzIGRlcml2ZWQgZnJvbSBhIHpvbmUgcmFuZG9tbHkgY2hvc2VuIGZyb20gdGhvc2Ugc3VwcGxpZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9zaXRpb24gZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUG9zaXRpb24gaW5pdGlhbGl6ZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Wm9uZXxhcnJheTxab25lPn1cbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXMucmVzZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGluaXRpYWxpemVyIHByb3BlcnRpZXMuXG4gICAqIENsZWFycyBhbGwgcHJldmlvdXNseSBzZXQgem9uZXMgYW5kIHJlc2V0cyB0aGUgem9uZXMgYWNjb3JkaW5nIHRvIGFyZ3MgcGFzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge1pvbmV8YXJyYXk8Wm9uZT59XG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgaWYgKCF0aGlzLnpvbmVzKSB7XG4gICAgICB0aGlzLnpvbmVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuem9uZXMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgem9uZXMgdG8gdXNlIGFzIGJvdW5kcyBmb3IgY2FsY3VsYXRpbmcgdGhlIHBhcnRpY2xlJ3Mgc3RhcnRpbmcgcG9zaXRpb24uXG4gICAgICogQHR5cGUge2FycmF5PFpvbmU+fVxuICAgICAqL1xuICAgIHRoaXMuem9uZXMgPSB0aGlzLnpvbmVzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgem9uZSBvciB6b25lcyB0byB0aGlzLnpvbmVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1pvbmV8YXJyYXk8Wm9uZT59XG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgYWRkWm9uZSgpIHtcbiAgICB0aGlzLnpvbmVzID0gdGhpcy56b25lcy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFBvc2l0aW9uIGluaXRpYWxpemVyIGZyb20gSlNPTi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgSlNPTiB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlIGZ Line truncated
@@ -0,0 +1,75 @@
import Initializer from './Initializer';
import { createSpan } from '../math';
import { INITIALIZER_TYPE_RADIUS as type } from './types';
/**
* Sets the radius property on initialized particles.
*
*/
export default class Radius extends Initializer {
/**
* Constructs a Radius initializer instance.
*
* @param {number} width - The width of the particle radius
* @param {number} height - The height of the particle radius
* @param {boolean} [center=false] - Determines whether to average the radius value
* @return void
*/
constructor(width, height, center = false, isEnabled = true) {
super(type, isEnabled);
/**
* @desc The radius span which is used to set the particle radius value.
* @type {Span}
*/
this.radius = createSpan(width, height, center);
}
/**
* Resets the initializer properties.
* Clears all previously set zones and resets the zones according to args passed.
*
* @param {number} width - The width of the particle radius
* @param {number} height - The height of the particle radius
* @param {boolean} [center=false] - Determines whether to average the radius value
* @return void
*/
reset(width, height, center = false) {
this.radius = createSpan(width, height, center);
}
/**
* Sets the particle's initial radius.
*
* @param {Particle} particle - the particle to initialize the property on
* @return void
*/
initialize(particle) {
particle.radius = this.radius.getValue();
particle.transform.oldRadius = particle.radius;
}
/**
* Creates a Radius initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @property {number} json.width - The width of the particle radius
* @property {number} json.height - The height of the particle radius
* @property {number} json.center - The center of the particle radius
* @return {Radius}
*/
static fromJSON(json) {
const {
width,
height,
center = false,
isEnabled = true
} = json;
return new Radius(width, height, center, isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9SYWRpdXMuanMiXSwibmFtZXMiOlsiSW5pdGlhbGl6ZXIiLCJjcmVhdGVTcGFuIiwiSU5JVElBTElaRVJfVFlQRV9SQURJVVMiLCJ0eXBlIiwiUmFkaXVzIiwiY29uc3RydWN0b3IiLCJ3aWR0aCIsImhlaWdodCIsImNlbnRlciIsImlzRW5hYmxlZCIsInJhZGl1cyIsInJlc2V0IiwiaW5pdGlhbGl6ZSIsInBhcnRpY2xlIiwiZ2V0VmFsdWUiLCJ0cmFuc2Zvcm0iLCJvbGRSYWRpdXMiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZUFBeEI7QUFDQSxTQUFTQyxVQUFULFFBQTJCLFNBQTNCO0FBQ0EsU0FBU0MsdUJBQXVCLElBQUlDLElBQXBDLFFBQWdELFNBQWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxNQUFOLFNBQXFCSixXQUFyQixDQUFpQztBQUM5QztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VLLEVBQUFBLFdBQVcsQ0FBQ0MsS0FBRCxFQUFRQyxNQUFSLEVBQWdCQyxNQUFNLEdBQUcsS0FBekIsRUFBZ0NDLFNBQVMsR0FBRyxJQUE1QyxFQUFrRDtBQUMzRCxVQUFNTixJQUFOLEVBQVlNLFNBQVo7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxNQUFMLEdBQWNULFVBQVUsQ0FBQ0ssS0FBRCxFQUFRQyxNQUFSLEVBQWdCQyxNQUFoQixDQUF4QjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUcsRUFBQUEsS0FBSyxDQUFDTCxLQUFELEVBQVFDLE1BQVIsRUFBZ0JDLE1BQU0sR0FBRyxLQUF6QixFQUFnQztBQUNuQyxTQUFLRSxNQUFMLEdBQWNULFVBQVUsQ0FBQ0ssS0FBRCxFQUFRQyxNQUFSLEVBQWdCQyxNQUFoQixDQUF4QjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUksRUFBQUEsVUFBVSxDQUFDQyxRQUFELEVBQVc7QUFDbkJBLElBQUFBLFFBQVEsQ0FBQ0gsTUFBVCxHQUFrQixLQUFLQSxNQUFMLENBQVlJLFFBQVosRUFBbEI7QUFDQUQsSUFBQUEsUUFBUSxDQUFDRSxTQUFULENBQW1CQyxTQUFuQixHQUErQkgsUUFBUSxDQUFDSCxNQUF4QztBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDaUIsU0FBUk8sUUFBUSxDQUFDQyxJQUFELEVBQU87QUFDcEIsVUFBTTtBQUFFWixNQUFBQSxLQUFGO0FBQVNDLE1BQUFBLE1BQVQ7QUFBaUJDLE1BQUFBLE1BQU0sR0FBRyxLQUExQjtBQUFpQ0MsTUFBQUEsU0FBUyxHQUFHO0FBQTdDLFFBQXNEUyxJQUE1RDtBQUVBLFdBQU8sSUFBSWQsTUFBSixDQUFXRSxLQUFYLEVBQWtCQyxNQUFsQixFQUEwQkMsTUFBMUIsRUFBa0NDLFNBQWxDLENBQVA7QUFDRDs7QUF4RDZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEluaXRpYWxpemVyIGZyb20gJy4vSW5pdGlhbGl6ZXInO1xuaW1wb3J0IHsgY3JlYXRlU3BhbiB9IGZyb20gJy4uL21hdGgnO1xuaW1wb3J0IHsgSU5JVElBTElaRVJfVFlQRV9SQURJVVMgYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuLyoqXG4gKiBTZXRzIHRoZSByYWRpdXMgcHJvcGVydHkgb24gaW5pdGlhbGl6ZWQgcGFydGljbGVzLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaXVzIGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFJhZGl1cyBpbml0aWFsaXplciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBwYXJ0aWNsZSByYWRpdXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHBhcnRpY2xlIHJhZGl1c1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjZW50ZXI9ZmFsc2VdIC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF2ZXJhZ2UgdGhlIHJhZGl1cyB2YWx1ZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQsIGNlbnRlciA9IGZhbHNlLCBpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIodHlwZSwgaXNFbmFibGVkKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSByYWRpdXMgc3BhbiB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgcGFydGljbGUgcmFkaXVzIHZhbHVlLlxuICAgICAqIEB0eXBlIHtTcGFufVxuICAgICAqL1xuICAgIHRoaXMucmFkaXVzID0gY3JlYXRlU3Bhbih3aWR0aCwgaGVpZ2h0LCBjZW50ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgaW5pdGlhbGl6ZXIgcHJvcGVydGllcy5cbiAgICogQ2xlYXJzIGFsbCBwcmV2aW91c2x5IHNldCB6b25lcyBhbmQgcmVzZXRzIHRoZSB6b25lcyBhY2NvcmRpbmcgdG8gYXJncyBwYXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcGFydGljbGUgcmFkaXVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBwYXJ0aWNsZSByYWRpdXNcbiAgICogQHBhcmFtIHtib29sZWFufSBbY2VudGVyPWZhbHNlXSAtIERldGVybWluZXMgd2hldGhlciB0byBhdmVyYWdlIHRoZSByYWRpdXMgdmFsdWVcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICByZXNldCh3aWR0aCwgaGVpZ2h0LCBjZW50ZXIgPSBmYWxzZSkge1xuICAgIHRoaXMucmFkaXVzID0gY3JlYXRlU3Bhbih3aWR0aCwgaGVpZ2h0LCBjZW50ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBhcnRpY2xlJ3MgaW5pdGlhbCByYWRpdXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gdGhlIHBhcnRpY2xlIHRvIGluaXRpYWxpemUgdGhlIHByb3BlcnR5IG9uXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnJhZGl1cyA9IHRoaXMucmFkaXVzLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUudHJhbnNmb3JtLm9sZFJhZGl1cyA9IHBhcnRpY2xlLnJhZGl1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgUmFkaXVzIGluaXRpYWxpemVyIGZyb20gSlNPTi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgSlNPTiB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlIGZyb20uXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLndpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBwYXJ0aWNsZSByYWRpdXNcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGpzb24uaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgcGFydGljbGUgcmFkaXVzXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLmNlbnRlciAtIFRoZSBjZW50ZXIgb2YgdGhlIHBhcnRpY2xlIHJhZGl1c1xuICAgKiBAcmV0dXJuIHtSYWRpdXN9XG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgY2VudGVyID0gZmFsc2UsIGlzRW5hYmxlZCA9IHRydWUgfSA9IGpzb247XG5cbiAgICByZXR1cm4gbmV3IFJhZGl1cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXIsIGlzRW5hYmxlZCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,107 @@
import { DEFAULT_RATE_NUM_PAN, DEFAULT_RATE_TIME_PAN } from './constants';
import { Span, createSpan } from '../math';
import Initializer from './Initializer';
import { INITIALIZER_TYPE_RATE as type } from './types';
/**
* Calculates the rate of particle emission.
*
* NOTE This doesn't need to be an initializer, it doesn't have an initialize
* method, it overrides the base init method and it is only relevent to the Emitter class.
* It would be better to move this to the Emitter module itself as a standalone class.
*
*/
export default class Rate extends Initializer {
/**
* Constructs a Rate instance.
*
* @param {number|array|Span} numPan - The number of particles to emit
* @param {number|array|Span} timePan - The time between each particle emission
* @return void
*/
constructor(numPan = DEFAULT_RATE_NUM_PAN, timePan = DEFAULT_RATE_TIME_PAN) {
super(type);
/**
* @desc Sets the number of particles to emit.
* @type {Span}
*/
this.numPan = createSpan(numPan);
/**
* @desc Sets the time between each particle emission.
* @type {Span}
*/
this.timePan = createSpan(timePan);
/**
* @desc The rate's start time.
* @type {number}
*/
this.startTime = 0;
/**
* @desc The rate's next time.
* @type {number}
*/
this.nextTime = 0;
this.init();
}
/**
* Sets the startTime and nextTime properties.
*
* @return void
*/
init() {
this.startTime = 0;
this.nextTime = this.timePan.getValue();
}
/**
* Gets the number of particles to emit.
*
* @param {number} time - Current particle engine time
* @return {number}
*/
getValue(time) {
this.startTime += time;
if (this.startTime >= this.nextTime) {
this.init();
if (this.numPan.b == 1) {
if (this.numPan.getValue('Float') > 0.5) return 1;else return 0;
} else {
return this.numPan.getValue('Int');
}
}
return 0;
}
/**
* Creates a Rate initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @property {number} json.particlesMin - The minimum number of particles to emit
* @property {number} json.particlesMax - The maximum number of particles to emit
* @property {number} json.perSecondMin - The minimum per second emit rate
* @property {number} json.perSecondMax - The maximum per second emit rate
* @return {Rate}
*/
static fromJSON(json) {
const {
particlesMin,
particlesMax,
perSecondMin,
perSecondMax
} = json;
return new Rate(new Span(particlesMin, particlesMax), new Span(perSecondMin, perSecondMax));
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9SYXRlLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfUkFURV9OVU1fUEFOIiwiREVGQVVMVF9SQVRFX1RJTUVfUEFOIiwiU3BhbiIsImNyZWF0ZVNwYW4iLCJJbml0aWFsaXplciIsIklOSVRJQUxJWkVSX1RZUEVfUkFURSIsInR5cGUiLCJSYXRlIiwiY29uc3RydWN0b3IiLCJudW1QYW4iLCJ0aW1lUGFuIiwic3RhcnRUaW1lIiwibmV4dFRpbWUiLCJpbml0IiwiZ2V0VmFsdWUiLCJ0aW1lIiwiYiIsImZyb21KU09OIiwianNvbiIsInBhcnRpY2xlc01pbiIsInBhcnRpY2xlc01heCIsInBlclNlY29uZE1pbiIsInBlclNlY29uZE1heCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0Esb0JBQVQsRUFBK0JDLHFCQUEvQixRQUE0RCxhQUE1RDtBQUNBLFNBQVNDLElBQVQsRUFBZUMsVUFBZixRQUFpQyxTQUFqQztBQUVBLE9BQU9DLFdBQVAsTUFBd0IsZUFBeEI7QUFDQSxTQUFTQyxxQkFBcUIsSUFBSUMsSUFBbEMsUUFBOEMsU0FBOUM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsSUFBTixTQUFtQkgsV0FBbkIsQ0FBK0I7QUFDNUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUksRUFBQUEsV0FBVyxDQUFDQyxNQUFNLEdBQUdULG9CQUFWLEVBQWdDVSxPQUFPLEdBQUdULHFCQUExQyxFQUFpRTtBQUMxRSxVQUFNSyxJQUFOO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0csTUFBTCxHQUFjTixVQUFVLENBQUNNLE1BQUQsQ0FBeEI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxPQUFMLEdBQWVQLFVBQVUsQ0FBQ08sT0FBRCxDQUF6QjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtDLFNBQUwsR0FBaUIsQ0FBakI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxRQUFMLEdBQWdCLENBQWhCO0FBRUEsU0FBS0MsSUFBTDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VBLEVBQUFBLElBQUksR0FBRztBQUNMLFNBQUtGLFNBQUwsR0FBaUIsQ0FBakI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLEtBQUtGLE9BQUwsQ0FBYUksUUFBYixFQUFoQjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUEsRUFBQUEsUUFBUSxDQUFDQyxJQUFELEVBQU87QUFDYixTQUFLSixTQUFMLElBQWtCSSxJQUFsQjs7QUFFQSxRQUFJLEtBQUtKLFNBQUwsSUFBa0IsS0FBS0MsUUFBM0IsRUFBcUM7QUFDbkMsV0FBS0MsSUFBTDs7QUFFQSxVQUFJLEtBQUtKLE1BQUwsQ0FBWU8sQ0FBWixJQUFpQixDQUFyQixFQUF3QjtBQUN0QixZQUFJLEtBQUtQLE1BQUwsQ0FBWUssUUFBWixDQUFxQixPQUFyQixJQUFnQyxHQUFwQyxFQUF5QyxPQUFPLENBQVAsQ0FBekMsS0FDSyxPQUFPLENBQVA7QUFDTixPQUhELE1BR087QUFDTCxlQUFPLEtBQUtMLE1BQUwsQ0FBWUssUUFBWixDQUFxQixLQUFyQixDQUFQO0FBQ0Q7QUFDRjs7QUFFRCxXQUFPLENBQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDaUIsU0FBUkcsUUFBUSxDQUFDQyxJQUFELEVBQU87QUFDcEIsVUFBTTtBQUFFQyxNQUFBQSxZQUFGO0FBQWdCQyxNQUFBQSxZQUFoQjtBQUE4QkMsTUFBQUEsWUFBOUI7QUFBNENDLE1BQUFBO0FBQTVDLFFBQTZESixJQUFuRTtBQUVBLFdBQU8sSUFBSVgsSUFBSixDQUNMLElBQUlMLElBQUosQ0FBU2lCLFlBQVQsRUFBdUJDLFlBQXZCLENBREssRUFFTCxJQUFJbEIsSUFBSixDQUFTbUIsWUFBVCxFQUF1QkMsWUFBdkIsQ0FGSyxDQUFQO0FBSUQ7O0FBeEYyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERFRkFVTFRfUkFURV9OVU1fUEFOLCBERUZBVUxUX1JBVEVfVElNRV9QQU4gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTcGFuLCBjcmVhdGVTcGFuIH0gZnJvbSAnLi4vbWF0aCc7XG5cbmltcG9ydCBJbml0aWFsaXplciBmcm9tICcuL0luaXRpYWxpemVyJztcbmltcG9ydCB7IElOSVRJQUxJWkVSX1RZUEVfUkFURSBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcmF0ZSBvZiBwYXJ0aWNsZSBlbWlzc2lvbi5cbiAqXG4gKiBOT1RFIFRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIGFuIGluaXRpYWxpemVyLCBpdCBkb2Vzbid0IGhhdmUgYW4gaW5pdGlhbGl6ZVxuICogbWV0aG9kLCBpdCBvdmVycmlkZXMgdGhlIGJhc2UgaW5pdCBtZXRob2QgYW5kIGl0IGlzIG9ubHkgcmVsZXZlbnQgdG8gdGhlIEVtaXR0ZXIgY2xhc3MuXG4gKiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gbW92ZSB0aGlzIHRvIHRoZSBFbWl0dGVyIG1vZHVsZSBpdHNlbGYgYXMgYSBzdGFuZGFsb25lIGNsYXNzLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmF0ZSBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBSYXRlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcnxhcnJheXxTcGFufSBudW1QYW4gLSBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB0byBlbWl0XG4gICAqIEBwYXJhbSB7bnVtYmVyfGFycmF5fFNwYW59IHRpbWVQYW4gLSBUaGUgdGltZSBiZXR3ZWVuIGVhY2ggcGFydGljbGUgZW1pc3Npb25cbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihudW1QYW4gPSBERUZBVUxUX1JBVEVfTlVNX1BBTiwgdGltZVBhbiA9IERFRkFVTFRfUkFURV9USU1FX1BBTikge1xuICAgIHN1cGVyKHR5cGUpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgU2V0cyB0aGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB0byBlbWl0LlxuICAgICAqIEB0eXBlIHtTcGFufVxuICAgICAqL1xuICAgIHRoaXMubnVtUGFuID0gY3JlYXRlU3BhbihudW1QYW4pO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgU2V0cyB0aGUgdGltZSBiZXR3ZWVuIGVhY2ggcGFydGljbGUgZW1pc3Npb24uXG4gICAgICogQHR5cGUge1NwYW59XG4gICAgICovXG4gICAgdGhpcy50aW1lUGFuID0gY3JlYXRlU3Bhbih0aW1lUGFuKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSByYXRlJ3Mgc3RhcnQgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSByYXRlJ3MgbmV4dCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5uZXh0VGltZSA9IDA7XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdGFydFRpbWUgYW5kIG5leHRUaW1lIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgaW5pdCgpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5uZXh0VGltZSA9IHRoaXMudGltZVBhbi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgdG8gZW1pdC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBDdXJyZW50IHBhcnRpY2xlIGVuZ2luZSB0aW1lXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldFZhbHVlKHRpbWUpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuc3RhcnRUaW1lID49IHRoaXMubmV4dFRpbWUpIHtcbiAgICAgIHRoaXMuaW5 Line truncated
@@ -0,0 +1,54 @@
import { Vector3 } from '../core/three';
import Initializer from './Initializer';
import { INITIALIZER_TYPE_ROTATION as type } from './types';
/**
* Sets the rotation property on initialized particles.
*
*/
export default class Rotation extends Initializer {
/**
* Constructs a Rotation property instance.
*
* @param {number} x - X axis rotation
* @param {number} y - Y axis rotation
* @param {number} z - Z axis rotation
* @param {boolean} [useEmitterRotation=true] - Determines if we should use the emitter's rotation as the starting rotation
* @param {boolean} [isEnabled=true] - Determines if the initializer should be enabled or not
* @return void
*/
constructor(x, y, z, useEmitterRotation = true, isEnabled = true) {
super(type, isEnabled);
this.rotation = new Vector3(x, y, z);
this.useEmitterRotation = useEmitterRotation;
}
/**
* Sets the particle's initial rotation.
*
* @param {Particle} particle - the particle to initialize the property on
* @return void
*/
initialize(particle) {
if (this.useEmitterRotation && particle.parent) {
// set initial particle rotation to that of the particle's emitter then add our set rotation
particle.rotation.copy(particle.parent.rotation).add(this.rotation);
} else {
particle.rotation.copy(this.rotation);
}
}
static fromJSON(json) {
const {
x,
y,
z,
useEmitterRotation = true,
isEnabled = true
} = json;
return new Rotation(x, y, z, useEmitterRotation, isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9Sb3RhdGlvbi5qcyJdLCJuYW1lcyI6WyJWZWN0b3IzIiwiSW5pdGlhbGl6ZXIiLCJJTklUSUFMSVpFUl9UWVBFX1JPVEFUSU9OIiwidHlwZSIsIlJvdGF0aW9uIiwiY29uc3RydWN0b3IiLCJ4IiwieSIsInoiLCJ1c2VFbWl0dGVyUm90YXRpb24iLCJpc0VuYWJsZWQiLCJyb3RhdGlvbiIsImluaXRpYWxpemUiLCJwYXJ0aWNsZSIsImNvcHkiLCJwYXJlbnQiLCJhZGQiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQVQsUUFBd0IsZUFBeEI7QUFDQSxPQUFPQyxXQUFQLE1BQXdCLGVBQXhCO0FBQ0EsU0FBU0MseUJBQXlCLElBQUlDLElBQXRDLFFBQWtELFNBQWxEO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxRQUFOLFNBQXVCSCxXQUF2QixDQUFtQztBQUNoRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSSxFQUFBQSxXQUFXLENBQUNDLENBQUQsRUFBSUMsQ0FBSixFQUFPQyxDQUFQLEVBQVVDLGtCQUFrQixHQUFDLElBQTdCLEVBQW1DQyxTQUFTLEdBQUcsSUFBL0MsRUFBcUQ7QUFDOUQsVUFBTVAsSUFBTixFQUFZTyxTQUFaO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQixJQUFJWCxPQUFKLENBQVlNLENBQVosRUFBY0MsQ0FBZCxFQUFnQkMsQ0FBaEIsQ0FBaEI7QUFDQSxTQUFLQyxrQkFBTCxHQUEwQkEsa0JBQTFCO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRyxFQUFBQSxVQUFVLENBQUNDLFFBQUQsRUFBVztBQUNuQixRQUFHLEtBQUtKLGtCQUFSLEVBQ0E7QUFDRTtBQUNBSSxNQUFBQSxRQUFRLENBQUNGLFFBQVQsQ0FBa0JHLElBQWxCLENBQXVCRCxRQUFRLENBQUNFLE1BQVQsQ0FBZ0JKLFFBQXZDLEVBQWlESyxHQUFqRCxDQUFxRCxLQUFLTCxRQUExRDtBQUNELEtBSkQsTUFNQTtBQUNFRSxNQUFBQSxRQUFRLENBQUNGLFFBQVQsQ0FBa0JHLElBQWxCLENBQXVCLEtBQUtILFFBQTVCO0FBQ0Q7QUFDRjs7QUFFYyxTQUFSTSxRQUFRLENBQUNDLElBQUQsRUFBTztBQUNwQixVQUFNO0FBQUVaLE1BQUFBLENBQUY7QUFBS0MsTUFBQUEsQ0FBTDtBQUFRQyxNQUFBQSxDQUFSO0FBQVdDLE1BQUFBLGtCQUFrQixHQUFHLElBQWhDO0FBQXNDQyxNQUFBQSxTQUFTLEdBQUc7QUFBbEQsUUFBMkRRLElBQWpFO0FBRUEsV0FBTyxJQUFJZCxRQUFKLENBQWFFLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CQyxDQUFuQixFQUFzQkMsa0JBQXRCLEVBQTBDQyxTQUExQyxDQUFQO0FBQ0Q7O0FBdkMrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9jb3JlL3RocmVlJztcbmltcG9ydCBJbml0aWFsaXplciBmcm9tICcuL0luaXRpYWxpemVyJztcbmltcG9ydCB7IElOSVRJQUxJWkVSX1RZUEVfUk9UQVRJT04gYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNldHMgdGhlIHJvdGF0aW9uIHByb3BlcnR5IG9uIGluaXRpYWxpemVkIHBhcnRpY2xlcy5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdGF0aW9uIGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFJvdGF0aW9uIHByb3BlcnR5IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFggYXhpcyByb3RhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFkgYXhpcyByb3RhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFogYXhpcyByb3RhdGlvblxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VFbWl0dGVyUm90YXRpb249dHJ1ZV0gLSBEZXRlcm1pbmVzIGlmIHdlIHNob3VsZCB1c2UgdGhlIGVtaXR0ZXIncyByb3RhdGlvbiBhcyB0aGUgc3RhcnRpbmcgcm90YXRpb25cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNFbmFibGVkPXRydWVdIC0gRGV0ZXJtaW5lcyBpZiB0aGUgaW5pdGlhbGl6ZXIgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90XG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IoeCwgeSwgeiwgdXNlRW1pdHRlclJvdGF0aW9uPXRydWUsIGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBzdXBlcih0eXBlLCBpc0VuYWJsZWQpO1xuICAgIHRoaXMucm90YXRpb24gPSBuZXcgVmVjdG9yMyh4LHkseik7XG4gICAgdGhpcy51c2VFbWl0dGVyUm90YXRpb24gPSB1c2VFbWl0dGVyUm90YXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGFydGljbGUncyBpbml0aWFsIHJvdGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIHRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvblxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBpZih0aGlzLnVzZUVtaXR0ZXJSb3RhdGlvbilcbiAgICB7XG4gICAgICAvLyBzZXQgaW5pdGlhbCBwYXJ0aWNsZSByb3RhdGlvbiB0byB0aGF0IG9mIHRoZSBwYXJ0aWNsZSdzIGVtaXR0ZXIgdGhlbiBhZGQgb3VyIHNldCByb3RhdGlvblxuICAgICAgcGFydGljbGUucm90YXRpb24uY29weShwYXJ0aWNsZS5wYXJlbnQucm90YXRpb24pLmFkZCh0aGlzLnJvdGF0aW9uKTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgIHBhcnRpY2xlLnJvdGF0aW9uLmNvcHkodGhpcy5yb3RhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICBjb25zdCB7IHgsIHksIHosIHVzZUVtaXR0ZXJSb3RhdGlvbiA9IHRydWUsIGlzRW5hYmxlZCA9IHRydWUgfSA9IGpzb247XG5cbiAgICByZXR1cm4gbmV3IFJvdGF0aW9uKHgsIHksIHosIHVzZUVtaXR0ZXJSb3RhdGlvbiwgaXNFbmFibGVkKTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,101 @@
import _defineProperty from "@babel/runtime/helpers/defineProperty";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import { DEFAULT_JSON_MATERIAL_PROPERTIES, DEFAULT_MATERIAL_PROPERTIES, SUPPORTED_MATERIAL_BLENDING_MODES } from './constants';
import Initializer from './Initializer';
import { INITIALIZER_TYPE_TEXTURE as type } from './types';
import { withDefaults } from '../utils';
/**
* Sets the body property to be a THREE.Sprite with a texture map on initialized particles.
*
*/
export default class Texture extends Initializer {
/**
* Constructs an Texture initializer.
*
* @param {object} THREE - The Web GL API we are using eg., THREE
* @param {string} texture - The sprite texture
* @param {object|undefined} materialProperties - The sprite material properties
* @param {?Texture} loadedTexture - Preloaded THREE.Texture instance
*/
constructor(THREE, loadedTexture, materialProperties = DEFAULT_MATERIAL_PROPERTIES, isEnabled = true) {
super(type, isEnabled);
const {
Sprite,
SpriteMaterial
} = THREE;
/**
* @desc The material properties for this object's SpriteMaterial
* NOTE This is required for testing purposes
* @type {object}
*/
this.materialProperties = withDefaults(DEFAULT_MATERIAL_PROPERTIES, materialProperties);
/**
* @desc The texture for the THREE.SpriteMaterial map.
* @type {Texture}
*/
this.texture = loadedTexture;
/**
* @desc THREE.SpriteMaterial instance.
* @type {SpriteMaterial}
*/
this.material = new SpriteMaterial(_objectSpread(_objectSpread({}, {
map: loadedTexture
}), this.materialProperties));
/**
* @desc THREE.Sprite instance.
* @type {Sprite}
*/
this.sprite = new Sprite(this.material);
}
/**
* Sets the particle body to the sprite.
*
* @param {Particle} particle - The particle to set the body of
* @return void
*/
initialize(particle) {
particle.body = this.sprite;
}
/**
* Creates a Texture initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from
* @param {object} THREE - The Web GL API we are using eg., THREE
* @param {Texture} json.loadedTexture - The loaded sprite texture
* @param {object} json.materialProperties - The sprite material properties
* @return {BodySprite}
*/
static fromJSON(json, THREE) {
const {
loadedTexture,
materialProperties = DEFAULT_JSON_MATERIAL_PROPERTIES,
isEnabled = true
} = json;
const ensureMappedBlendingMode = properties => {
const {
blending
} = properties;
return _objectSpread(_objectSpread({}, properties), {}, {
blending: blending ? SUPPORTED_MATERIAL_BLENDING_MODES[blending] : SUPPORTED_MATERIAL_BLENDING_MODES[DEFAULT_JSON_MATERIAL_PROPERTIES.blending]
});
};
return new Texture(THREE, loadedTexture, withDefaults(DEFAULT_JSON_MATERIAL_PROPERTIES, ensureMappedBlendingMode(materialProperties)), isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9UZXh0dXJlLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfSlNPTl9NQVRFUklBTF9QUk9QRVJUSUVTIiwiREVGQVVMVF9NQVRFUklBTF9QUk9QRVJUSUVTIiwiU1VQUE9SVEVEX01BVEVSSUFMX0JMRU5ESU5HX01PREVTIiwiSW5pdGlhbGl6ZXIiLCJJTklUSUFMSVpFUl9UWVBFX1RFWFRVUkUiLCJ0eXBlIiwid2l0aERlZmF1bHRzIiwiVGV4dHVyZSIsImNvbnN0cnVjdG9yIiwiVEhSRUUiLCJsb2FkZWRUZXh0dXJlIiwibWF0ZXJpYWxQcm9wZXJ0aWVzIiwiaXNFbmFibGVkIiwiU3ByaXRlIiwiU3ByaXRlTWF0ZXJpYWwiLCJ0ZXh0dXJlIiwibWF0ZXJpYWwiLCJtYXAiLCJzcHJpdGUiLCJpbml0aWFsaXplIiwicGFydGljbGUiLCJib2R5IiwiZnJvbUpTT04iLCJqc29uIiwiZW5zdXJlTWFwcGVkQmxlbmRpbmdNb2RlIiwicHJvcGVydGllcyIsImJsZW5kaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxTQUNFQSxnQ0FERixFQUVFQywyQkFGRixFQUdFQyxpQ0FIRixRQUlPLGFBSlA7QUFNQSxPQUFPQyxXQUFQLE1BQXdCLGVBQXhCO0FBQ0EsU0FBU0Msd0JBQXdCLElBQUlDLElBQXJDLFFBQWlELFNBQWpEO0FBQ0EsU0FBU0MsWUFBVCxRQUE2QixVQUE3QjtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsT0FBTixTQUFzQkosV0FBdEIsQ0FBa0M7QUFDL0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSyxFQUFBQSxXQUFXLENBQ1RDLEtBRFMsRUFFVEMsYUFGUyxFQUdUQyxrQkFBa0IsR0FBR1YsMkJBSFosRUFJVFcsU0FBUyxHQUFHLElBSkgsRUFLVDtBQUNBLFVBQU1QLElBQU4sRUFBWU8sU0FBWjtBQUVBLFVBQU07QUFBRUMsTUFBQUEsTUFBRjtBQUFVQyxNQUFBQTtBQUFWLFFBQTZCTCxLQUFuQztBQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0Usa0JBQUwsR0FBMEJMLFlBQVksQ0FDcENMLDJCQURvQyxFQUVwQ1Usa0JBRm9DLENBQXRDO0FBS0E7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0ksT0FBTCxHQUFlTCxhQUFmO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS00sUUFBTCxHQUFnQixJQUFJRixjQUFKLGlDQUNYO0FBQUVHLE1BQUFBLEdBQUcsRUFBRVA7QUFBUCxLQURXLEdBRVgsS0FBS0Msa0JBRk0sRUFBaEI7QUFLQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLTyxNQUFMLEdBQWMsSUFBSUwsTUFBSixDQUFXLEtBQUtHLFFBQWhCLENBQWQ7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VHLEVBQUFBLFVBQVUsQ0FBQ0MsUUFBRCxFQUFXO0FBQ25CQSxJQUFBQSxRQUFRLENBQUNDLElBQVQsR0FBZ0IsS0FBS0gsTUFBckI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJJLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPZCxLQUFQLEVBQWM7QUFDM0IsVUFBTTtBQUNKQyxNQUFBQSxhQURJO0FBRUpDLE1BQUFBLGtCQUFrQixHQUFHWCxnQ0FGakI7QUFHSlksTUFBQUEsU0FBUyxHQUFHO0FBSFIsUUFJRlcsSUFKSjs7QUFNQSxVQUFNQyx3QkFBd0IsR0FBR0MsVUFBVSxJQUFJO0FBQzdDLFlBQU07QUFBRUMsUUFBQUE7QUFBRixVQUFlRCxVQUFyQjtBQUVBLDZDQUNLQSxVQURMO0FBRUVDLFFBQUFBLFFBQVEsRUFBRUEsUUFBUSxHQUNkeEIsaUNBQWlDLENBQUN3QixRQUFELENBRG5CLEdBRWR4QixpQ0FBaUMsQ0FDakNGLGdDQUFnQyxDQUFDMEIsUUFEQTtBQUp2QztBQVFELEtBWEQ7O0FBYUEsV0FBTyxJQUFJbkIsT0FBSixDQUNMRSxLQURLLEVBRUxDLGFBRkssRUFHTEosWUFBWSxDQUNWTixnQ0FEVSxFQUVWd0Isd0JBQXdCLENBQUNiLGtCQUFELENBRmQsQ0FIUCxFQU9MQyxTQVBLLENBQVA7QUFTRDs7QUFuRzhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgREVGQVVMVF9KU09OX01BVEVSSUFMX1BST1BFUlRJRVMsXG4gIERFRkFVTFRfTUFURVJJQUxfUFJPUEVSVElFUyxcbiAgU1VQUE9SVEVEX01BVEVSSUFMX0JMRU5ESU5HX01PREVTLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmltcG9ydCBJbml0aWFsaXplciBmcm9tICcuL0luaXRpYWxpemVyJztcbmltcG9ydCB7IElOSVRJQUxJWkVSX1RZUEVfVEVYVFVSRSBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyB3aXRoRGVmYXVsdHMgfSBmcm9tICcuLi91dGlscyc7XG5cbi8qKlxuICogU2V0cyB0aGUgYm9keSBwcm9wZXJ0eSB0byBiZSBhIFRIUkVFLlNwcml0ZSB3aXRoIGEgdGV4dHVyZSBtYXAgb24gaW5pdGlhbGl6ZWQgcGFydGljbGVzLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dHVyZSBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYW4gVGV4dHVyZSBpbml0aWFsaXplci5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IFRIUkVFIC0gVGhlIFdlYiBHTCBBUEkgd2UgYXJlIHVzaW5nIGVnLiwgVEhSRUVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUgc3ByaXRlIHRleHR1cmVcbiAgICogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBtYXRlcmlhbFByb3BlcnRpZXMgLSBUaGUgc3ByaXRlIG1hdGVyaWFsIHByb3BlcnRpZXNcbiAgICogQHBhcmFtIHs/VGV4dHVyZX0gbG9hZGVkVGV4dHVyZSAtIFByZWxvYWRlZCBUSFJFRS5UZXh0dXJlIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBUSFJFRSxcbiAgICBsb2FkZWRUZXh0dXJlLFxuICAgIG1hdGVyaWFsUHJvcGVydGllcyA9IERFRkFVTFRfTUFURVJJQUxfUFJPUEVSVElFUyxcbiAgICBpc0VuYWJsZWQgPSB0cnVlXG4gICkge1xuICAgIHN1cGVyKHR5cGUsIGlzRW5hYmxlZCk7XG5cbiAgICBjb25zdCB7IFNwcml0ZSwgU3ByaXRlTWF0ZXJpYWwgfSA9IFRIUkVFO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIG1hdGVyaWFsIHByb3BlcnRpZXMgZm9yIHRoaXMgb2JqZWN0J3MgU3ByaXRlTWF0ZXJpYWxcbiAgICAgKiBOT1RFIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMubWF0ZXJpYWxQcm9wZXJ0aWVzID0gd2l0aERlZmF1bHRzKFxuICAgICAgREVGQVVMVF9NQVRFUklBTF9QUk9QRVJUSUVTLFxuICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSB0ZXh0dXJlIGZvciB0aGUgVEhSRUUuU3ByaXRlTWF0ZXJpYWwgbWFwLlxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxuICAgICAqL1xuICAgIHRoaXMudGV4dHVyZSA9IGxvYWRlZFRleHR1cmU7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUSFJFRS5TcHJpdGVNYXRlcmlhbCBpbnN0YW5jZS5cbiAgICAgKiBAdHlwZSB7U3ByaXRlTWF0ZXJpYWx9XG4gICAgICovXG4gICAgdGhpcy5tYXRlcmlhbCA9IG5ldyBTcHJpdGVNYXRlcmlhbCh7XG4gICAgICAuLi57IG1hcDogbG9hZGVkVGV4dHVyZSB9LFxuICAgICAgLi4udGhpcy5tYXRlcmlhbFByb3BlcnRpZXMsXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUSFJFRS5TcHJpdGUgaW5zdGFuY2UuXG4gICAgICogQHR5cGUge1Nwcml0ZX1cbiAgICAgKi9cbiAgICB0aGlzLnNwcml0ZSA9IG5ldyBTcHJpdGUodGhpcy5tYXRlcmlhbCk7XG4gIH1cblxuICAvKipcbiAgICogU2V Line truncated
@@ -0,0 +1,65 @@
import { DR } from '../../constants';
import { Polar3D } from '../../math';
import Velocity from './Velocity';
import { INITIALIZER_TYPE_POLAR_VELOCITY as type } from '../types';
/**
* Sets the velocity property on initialized particles.
*
*/
export default class PolarVelocity extends Velocity {
/**
* Constructs a PolarVelocity initializer.
*
* @param {Polar3D} polar3d - The polar vector for the velocity
* @param {number} theta - The theta angle to use
* @return void
*/
constructor(polar3d, theta, isEnabled = true) {
super(type, isEnabled);
/**
* @desc Theta.
* @type {number}
*/
this.tha = theta * DR;
this._polar = polar3d;
/**
* @desc Directional vector
* @type {Vector3D}
*/
this.dirVec = this._polar.toVector3D();
/**
* @desc Determines whether to use the directional vector or not.
* @type {boolean}
*/
this._useV = false;
}
/**
* Creates a PolarVelocity initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @param {number} json.polarRadius - The Polar3D radius
* @param {number} json.polarTheta - The Polar3D theta
* @param {number} json.polarPhi - The Polar3D phi
* @param {number} json.velocityTheta - The velocity theta
* @return {PolarVelocity}
*/
static fromJSON(json) {
const {
polarRadius,
polarTheta,
polarPhi,
velocityTheta,
isEnabled = true
} = json;
return new PolarVelocity(new Polar3D(polarRadius, polarTheta, polarPhi), velocityTheta, isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9WZWxvY2l0eS9Qb2xhclZlbG9jaXR5LmpzIl0sIm5hbWVzIjpbIkRSIiwiUG9sYXIzRCIsIlZlbG9jaXR5IiwiSU5JVElBTElaRVJfVFlQRV9QT0xBUl9WRUxPQ0lUWSIsInR5cGUiLCJQb2xhclZlbG9jaXR5IiwiY29uc3RydWN0b3IiLCJwb2xhcjNkIiwidGhldGEiLCJpc0VuYWJsZWQiLCJ0aGEiLCJkaXJWZWMiLCJ0b1ZlY3RvcjNEIiwiX3VzZVYiLCJmcm9tSlNPTiIsImpzb24iLCJwb2xhclJhZGl1cyIsInBvbGFyVGhldGEiLCJwb2xhclBoaSIsInZlbG9jaXR5VGhldGEiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEVBQVQsUUFBbUIsaUJBQW5CO0FBQ0EsU0FBU0MsT0FBVCxRQUF3QixZQUF4QjtBQUNBLE9BQU9DLFFBQVAsTUFBcUIsWUFBckI7QUFDQSxTQUFTQywrQkFBK0IsSUFBSUMsSUFBNUMsUUFBd0QsVUFBeEQ7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxlQUFlLE1BQU1DLGFBQU4sU0FBNEJILFFBQTVCLENBQXFDO0FBQ2xEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VJLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVQyxLQUFWLEVBQWlCQyxTQUFTLEdBQUcsSUFBN0IsRUFBbUM7QUFDNUMsVUFBTUwsSUFBTixFQUFZSyxTQUFaO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0MsR0FBTCxHQUFXRixLQUFLLEdBQUdSLEVBQW5CO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS1csTUFBTCxHQUFjSixPQUFPLENBQUNLLFVBQVIsRUFBZDtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtDLEtBQUwsR0FBYSxLQUFiO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2lCLFNBQVJDLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFVBQU07QUFDSkMsTUFBQUEsV0FESTtBQUVKQyxNQUFBQSxVQUZJO0FBR0pDLE1BQUFBLFFBSEk7QUFJSkMsTUFBQUEsYUFKSTtBQUtKVixNQUFBQSxTQUFTLEdBQUc7QUFMUixRQU1GTSxJQU5KO0FBUUEsV0FBTyxJQUFJVixhQUFKLENBQ0wsSUFBSUosT0FBSixDQUFZZSxXQUFaLEVBQXlCQyxVQUF6QixFQUFxQ0MsUUFBckMsQ0FESyxFQUVMQyxhQUZLLEVBR0xWLFNBSEssQ0FBUDtBQUtEOztBQXREaUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBQb2xhcjNEIH0gZnJvbSAnLi4vLi4vbWF0aCc7XG5pbXBvcnQgVmVsb2NpdHkgZnJvbSAnLi9WZWxvY2l0eSc7XG5pbXBvcnQgeyBJTklUSUFMSVpFUl9UWVBFX1BPTEFSX1ZFTE9DSVRZIGFzIHR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogU2V0cyB0aGUgdmVsb2NpdHkgcHJvcGVydHkgb24gaW5pdGlhbGl6ZWQgcGFydGljbGVzLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9sYXJWZWxvY2l0eSBleHRlbmRzIFZlbG9jaXR5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBQb2xhclZlbG9jaXR5IGluaXRpYWxpemVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvbGFyM0R9IHBvbGFyM2QgLSBUaGUgcG9sYXIgdmVjdG9yIGZvciB0aGUgdmVsb2NpdHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHRoZXRhIGFuZ2xlIHRvIHVzZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBvbGFyM2QsIHRoZXRhLCBpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIodHlwZSwgaXNFbmFibGVkKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZXRhLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy50aGEgPSB0aGV0YSAqIERSO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgRGlyZWN0aW9uYWwgdmVjdG9yXG4gICAgICogQHR5cGUge1ZlY3RvcjNEfVxuICAgICAqL1xuICAgIHRoaXMuZGlyVmVjID0gcG9sYXIzZC50b1ZlY3RvcjNEKCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIHRoZSBkaXJlY3Rpb25hbCB2ZWN0b3Igb3Igbm90LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuX3VzZVYgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgUG9sYXJWZWxvY2l0eSBpbml0aWFsaXplciBmcm9tIEpTT04uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gVGhlIEpTT04gdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZSBmcm9tLlxuICAgKiBAcGFyYW0ge251bWJlcn0ganNvbi5wb2xhclJhZGl1cyAtIFRoZSBQb2xhcjNEIHJhZGl1c1xuICAgKiBAcGFyYW0ge251bWJlcn0ganNvbi5wb2xhclRoZXRhIC0gVGhlIFBvbGFyM0QgdGhldGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGpzb24ucG9sYXJQaGkgLSBUaGUgUG9sYXIzRCBwaGlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGpzb24udmVsb2NpdHlUaGV0YSAtIFRoZSB2ZWxvY2l0eSB0aGV0YVxuICAgKiBAcmV0dXJuIHtQb2xhclZlbG9jaXR5fVxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICBjb25zdCB7XG4gICAgICBwb2xhclJhZGl1cyxcbiAgICAgIHBvbGFyVGhldGEsXG4gICAgICBwb2xhclBoaSxcbiAgICAgIHZlbG9jaXR5VGhldGEsXG4gICAgICBpc0VuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBqc29uO1xuXG4gICAgcmV0dXJuIG5ldyBQb2xhclZlbG9jaXR5KFxuICAgICAgbmV3IFBvbGFyM0QocG9sYXJSYWRpdXMsIHBvbGFyVGhldGEsIHBvbGFyUGhpKSxcbiAgICAgIHZlbG9jaXR5VGhldGEsXG4gICAgICBpc0VuYWJsZWRcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,72 @@
import { Vector3D, createSpan } from '../../math';
import { DR } from '../../constants';
import Velocity from './Velocity';
import { INITIALIZER_TYPE_RADIAL_VELOCITY as type } from '../types';
/**
* Sets the velocity property on initialized particles.
*
*/
export default class RadialVelocity extends Velocity {
/**
* Constructs a RadialVelocity initializer.
*
* @param {number|Span} radius - The velocity radius
* @param {Vector3D} vector3d - The directional vector for the velocity
* @param {number} theta - The theta angle to use
* @return void
*/
constructor(radius, vector3d, theta, isEnabled = true) {
super(type, isEnabled);
/**
* @desc Velocity radius span.
* @type {Span}
*/
this.radiusPan = createSpan(radius);
/**
* @desc Direction vector.
* @type {Vector3D}
*/
this.dir = vector3d.clone().normalize();
/**
* @desc Theta.
* @type {number}
*/
this.tha = theta * DR;
/**
* @desc Determines whether to use the directional vector or not.
* @type {boolean}
*/
this._useV = true;
}
/**
* Creates a RadialVelocity initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @param {number} json.radius - The velocity radius
* @param {number} json.x - The velocity x axis direction
* @param {number} json.y - The velocity y axis direction
* @param {number} json.z - The velocity z axis direction
* @param {number} json.theta - The velocity theta
* @return {RadialVelocity}
*/
static fromJSON(json) {
const {
radius,
x,
y,
z,
theta,
isEnabled = true
} = json;
return new RadialVelocity(radius, new Vector3D(x, y, z), theta, isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9WZWxvY2l0eS9SYWRpYWxWZWxvY2l0eS5qcyJdLCJuYW1lcyI6WyJWZWN0b3IzRCIsImNyZWF0ZVNwYW4iLCJEUiIsIlZlbG9jaXR5IiwiSU5JVElBTElaRVJfVFlQRV9SQURJQUxfVkVMT0NJVFkiLCJ0eXBlIiwiUmFkaWFsVmVsb2NpdHkiLCJjb25zdHJ1Y3RvciIsInJhZGl1cyIsInZlY3RvcjNkIiwidGhldGEiLCJpc0VuYWJsZWQiLCJyYWRpdXNQYW4iLCJkaXIiLCJjbG9uZSIsIm5vcm1hbGl6ZSIsInRoYSIsIl91c2VWIiwiZnJvbUpTT04iLCJqc29uIiwieCIsInkiLCJ6Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFULEVBQW1CQyxVQUFuQixRQUFxQyxZQUFyQztBQUVBLFNBQVNDLEVBQVQsUUFBbUIsaUJBQW5CO0FBQ0EsT0FBT0MsUUFBUCxNQUFxQixZQUFyQjtBQUNBLFNBQVNDLGdDQUFnQyxJQUFJQyxJQUE3QyxRQUF5RCxVQUF6RDtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsY0FBTixTQUE2QkgsUUFBN0IsQ0FBc0M7QUFDbkQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSSxFQUFBQSxXQUFXLENBQUNDLE1BQUQsRUFBU0MsUUFBVCxFQUFtQkMsS0FBbkIsRUFBMEJDLFNBQVMsR0FBRyxJQUF0QyxFQUE0QztBQUNyRCxVQUFNTixJQUFOLEVBQVlNLFNBQVo7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxTQUFMLEdBQWlCWCxVQUFVLENBQUNPLE1BQUQsQ0FBM0I7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLSyxHQUFMLEdBQVdKLFFBQVEsQ0FBQ0ssS0FBVCxHQUFpQkMsU0FBakIsRUFBWDtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtDLEdBQUwsR0FBV04sS0FBSyxHQUFHUixFQUFuQjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtlLEtBQUwsR0FBYSxJQUFiO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDaUIsU0FBUkMsUUFBUSxDQUFDQyxJQUFELEVBQU87QUFDcEIsVUFBTTtBQUFFWCxNQUFBQSxNQUFGO0FBQVVZLE1BQUFBLENBQVY7QUFBYUMsTUFBQUEsQ0FBYjtBQUFnQkMsTUFBQUEsQ0FBaEI7QUFBbUJaLE1BQUFBLEtBQW5CO0FBQTBCQyxNQUFBQSxTQUFTLEdBQUc7QUFBdEMsUUFBK0NRLElBQXJEO0FBRUEsV0FBTyxJQUFJYixjQUFKLENBQW1CRSxNQUFuQixFQUEyQixJQUFJUixRQUFKLENBQWFvQixDQUFiLEVBQWdCQyxDQUFoQixFQUFtQkMsQ0FBbkIsQ0FBM0IsRUFBa0RaLEtBQWxELEVBQXlEQyxTQUF6RCxDQUFQO0FBQ0Q7O0FBcERrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlY3RvcjNELCBjcmVhdGVTcGFuIH0gZnJvbSAnLi4vLi4vbWF0aCc7XG5cbmltcG9ydCB7IERSIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCBWZWxvY2l0eSBmcm9tICcuL1ZlbG9jaXR5JztcbmltcG9ydCB7IElOSVRJQUxJWkVSX1RZUEVfUkFESUFMX1ZFTE9DSVRZIGFzIHR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogU2V0cyB0aGUgdmVsb2NpdHkgcHJvcGVydHkgb24gaW5pdGlhbGl6ZWQgcGFydGljbGVzLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaWFsVmVsb2NpdHkgZXh0ZW5kcyBWZWxvY2l0eSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUmFkaWFsVmVsb2NpdHkgaW5pdGlhbGl6ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IHJhZGl1cyAtIFRoZSB2ZWxvY2l0eSByYWRpdXNcbiAgICogQHBhcmFtIHtWZWN0b3IzRH0gdmVjdG9yM2QgLSBUaGUgZGlyZWN0aW9uYWwgdmVjdG9yIGZvciB0aGUgdmVsb2NpdHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHRoZXRhIGFuZ2xlIHRvIHVzZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHJhZGl1cywgdmVjdG9yM2QsIHRoZXRhLCBpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIodHlwZSwgaXNFbmFibGVkKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFZlbG9jaXR5IHJhZGl1cyBzcGFuLlxuICAgICAqIEB0eXBlIHtTcGFufVxuICAgICAqL1xuICAgIHRoaXMucmFkaXVzUGFuID0gY3JlYXRlU3BhbihyYWRpdXMpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgRGlyZWN0aW9uIHZlY3Rvci5cbiAgICAgKiBAdHlwZSB7VmVjdG9yM0R9XG4gICAgICovXG4gICAgdGhpcy5kaXIgPSB2ZWN0b3IzZC5jbG9uZSgpLm5vcm1hbGl6ZSgpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhldGEuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnRoYSA9IHRoZXRhICogRFI7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIHRoZSBkaXJlY3Rpb25hbCB2ZWN0b3Igb3Igbm90LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuX3VzZVYgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBSYWRpYWxWZWxvY2l0eSBpbml0aWFsaXplciBmcm9tIEpTT04uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gVGhlIEpTT04gdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZSBmcm9tLlxuICAgKiBAcGFyYW0ge251bWJlcn0ganNvbi5yYWRpdXMgLSBUaGUgdmVsb2NpdHkgcmFkaXVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBqc29uLnggLSBUaGUgdmVsb2NpdHkgeCBheGlzIGRpcmVjdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0ganNvbi55IC0gVGhlIHZlbG9jaXR5IHkgYXhpcyBkaXJlY3Rpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGpzb24ueiAtIFRoZSB2ZWxvY2l0eSB6IGF4aXMgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBqc29uLnRoZXRhIC0gVGhlIHZlbG9jaXR5IHRoZXRhXG4gICAqIEByZXR1cm4ge1JhZGlhbFZlbG9jaXR5fVxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICBjb25zdCB7IHJhZGl1cywgeCwgeSwgeiwgdGhldGEsIGlzRW5hYmxlZCA9IHRydWUgfSA9IGpzb247XG5cbiAgICByZXR1cm4gbmV3IFJhZGlhbFZlbG9jaXR5KHJhZGl1cywgbmV3IFZlY3RvcjNEKHgsIHksIHopLCB0aGV0YSwgaXNFbmFibGVkKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,69 @@
import { Vector3D, createSpan } from '../../math';
import { DR } from '../../constants';
import Velocity from './Velocity';
import { INITIALIZER_TYPE_VECTOR_VELOCITY as type } from '../types';
/**
* Sets the velocity property on initialized particles.
*
*/
export default class VectorVelocity extends Velocity {
/**
* Constructs a VectorVelocity initializer.
*
* @param {Vector3D} vector3d - The directional vector for the velocity
* @param {number} theta - The theta angle to use
* @return void
*/
constructor(vector3d, theta, isEnabled = true) {
super(type, isEnabled);
/**
* @desc Velocity radius span.
* @type {Span}
*/
this.radiusPan = createSpan(1);
/**
* @desc Direction vector.
* @type {Vector3D}
*/
this.dir = vector3d.clone();
/**
* @desc Theta.
* @type {number}
*/
this.tha = theta * DR;
/**
* @desc Determines whether to use the directional vector or not.
* @type {boolean}
*/
this._useV = true;
}
/**
* Creates a VectorVelocity initializer from JSON.
*
* @param {object} json - The JSON to construct the instance from.
* @param {number} json.x - The velocity x axis direction
* @param {number} json.y - The velocity y axis direction
* @param {number} json.z - The velocity z axis direction
* @param {number} json.theta - The velocity theta
* @return {VectorVelocity}
*/
static fromJSON(json) {
const {
x,
y,
z,
theta,
isEnabled = true
} = json;
return new VectorVelocity(new Vector3D(x, y, z), theta, isEnabled);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9WZWxvY2l0eS9WZWN0b3JWZWxvY2l0eS5qcyJdLCJuYW1lcyI6WyJWZWN0b3IzRCIsImNyZWF0ZVNwYW4iLCJEUiIsIlZlbG9jaXR5IiwiSU5JVElBTElaRVJfVFlQRV9WRUNUT1JfVkVMT0NJVFkiLCJ0eXBlIiwiVmVjdG9yVmVsb2NpdHkiLCJjb25zdHJ1Y3RvciIsInZlY3RvcjNkIiwidGhldGEiLCJpc0VuYWJsZWQiLCJyYWRpdXNQYW4iLCJkaXIiLCJjbG9uZSIsInRoYSIsIl91c2VWIiwiZnJvbUpTT04iLCJqc29uIiwieCIsInkiLCJ6Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFULEVBQW1CQyxVQUFuQixRQUFxQyxZQUFyQztBQUVBLFNBQVNDLEVBQVQsUUFBbUIsaUJBQW5CO0FBQ0EsT0FBT0MsUUFBUCxNQUFxQixZQUFyQjtBQUNBLFNBQVNDLGdDQUFnQyxJQUFJQyxJQUE3QyxRQUF5RCxVQUF6RDtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsY0FBTixTQUE2QkgsUUFBN0IsQ0FBc0M7QUFDbkQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUksRUFBQUEsV0FBVyxDQUFDQyxRQUFELEVBQVdDLEtBQVgsRUFBa0JDLFNBQVMsR0FBRyxJQUE5QixFQUFvQztBQUM3QyxVQUFNTCxJQUFOLEVBQVlLLFNBQVo7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxTQUFMLEdBQWlCVixVQUFVLENBQUMsQ0FBRCxDQUEzQjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtXLEdBQUwsR0FBV0osUUFBUSxDQUFDSyxLQUFULEVBQVg7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxHQUFMLEdBQVdMLEtBQUssR0FBR1AsRUFBbkI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLYSxLQUFMLEdBQWEsSUFBYjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNpQixTQUFSQyxRQUFRLENBQUNDLElBQUQsRUFBTztBQUNwQixVQUFNO0FBQUVDLE1BQUFBLENBQUY7QUFBS0MsTUFBQUEsQ0FBTDtBQUFRQyxNQUFBQSxDQUFSO0FBQVdYLE1BQUFBLEtBQVg7QUFBa0JDLE1BQUFBLFNBQVMsR0FBRztBQUE5QixRQUF1Q08sSUFBN0M7QUFFQSxXQUFPLElBQUlYLGNBQUosQ0FBbUIsSUFBSU4sUUFBSixDQUFha0IsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUJDLENBQW5CLENBQW5CLEVBQTBDWCxLQUExQyxFQUFpREMsU0FBakQsQ0FBUDtBQUNEOztBQWxEa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWZWN0b3IzRCwgY3JlYXRlU3BhbiB9IGZyb20gJy4uLy4uL21hdGgnO1xuXG5pbXBvcnQgeyBEUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgVmVsb2NpdHkgZnJvbSAnLi9WZWxvY2l0eSc7XG5pbXBvcnQgeyBJTklUSUFMSVpFUl9UWVBFX1ZFQ1RPUl9WRUxPQ0lUWSBhcyB0eXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFNldHMgdGhlIHZlbG9jaXR5IHByb3BlcnR5IG9uIGluaXRpYWxpemVkIHBhcnRpY2xlcy5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlY3RvclZlbG9jaXR5IGV4dGVuZHMgVmVsb2NpdHkge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFZlY3RvclZlbG9jaXR5IGluaXRpYWxpemVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcjNEfSB2ZWN0b3IzZCAtIFRoZSBkaXJlY3Rpb25hbCB2ZWN0b3IgZm9yIHRoZSB2ZWxvY2l0eVxuICAgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgdGhldGEgYW5nbGUgdG8gdXNlXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IodmVjdG9yM2QsIHRoZXRhLCBpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIodHlwZSwgaXNFbmFibGVkKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFZlbG9jaXR5IHJhZGl1cyBzcGFuLlxuICAgICAqIEB0eXBlIHtTcGFufVxuICAgICAqL1xuICAgIHRoaXMucmFkaXVzUGFuID0gY3JlYXRlU3BhbigxKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIERpcmVjdGlvbiB2ZWN0b3IuXG4gICAgICogQHR5cGUge1ZlY3RvcjNEfVxuICAgICAqL1xuICAgIHRoaXMuZGlyID0gdmVjdG9yM2QuY2xvbmUoKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZXRhLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy50aGEgPSB0aGV0YSAqIERSO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgZGlyZWN0aW9uYWwgdmVjdG9yIG9yIG5vdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl91c2VWID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVmVjdG9yVmVsb2NpdHkgaW5pdGlhbGl6ZXIgZnJvbSBKU09OLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0ganNvbiAtIFRoZSBKU09OIHRvIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UgZnJvbS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGpzb24ueCAtIFRoZSB2ZWxvY2l0eSB4IGF4aXMgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBqc29uLnkgLSBUaGUgdmVsb2NpdHkgeSBheGlzIGRpcmVjdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0ganNvbi56IC0gVGhlIHZlbG9jaXR5IHogYXhpcyBkaXJlY3Rpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGpzb24udGhldGEgLSBUaGUgdmVsb2NpdHkgdGhldGFcbiAgICogQHJldHVybiB7VmVjdG9yVmVsb2NpdHl9XG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgIGNvbnN0IHsgeCwgeSwgeiwgdGhldGEsIGlzRW5hYmxlZCA9IHRydWUgfSA9IGpzb247XG5cbiAgICByZXR1cm4gbmV3IFZlY3RvclZlbG9jaXR5KG5ldyBWZWN0b3IzRCh4LCB5LCB6KSwgdGhldGEsIGlzRW5hYmxlZCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,52 @@
import { MEASURE, PI } from '../../constants';
import { MathUtils, Vector3D } from '../../math';
import Initializer from '../Initializer';
/**
* Abstract class for Velocity initializers.
*
*/
export default class Velocity extends Initializer {
/**
* Constructs a Velocity intitializer instance.
*
* @return void
*/
constructor(type, isEnabled = true) {
super(type, isEnabled);
/**
* @desc Directional vector
* @type {Vector3D}
*/
this.dirVec = new Vector3D(0, 0, 0);
}
normalize(vr) {
return vr * MEASURE;
}
}
/**
* Sets the particle's initial velocity.
*
* @singleton
* @param {Particle} particle - the particle to initialize the property on
* @return void
*/
Velocity.prototype.initialize = function () {
var tha;
var normal = new Vector3D(0, 0, 1);
var v = new Vector3D(0, 0, 0);
return function initialize(particle) {
tha = this.tha * Math.random();
this._useV && this.dirVec.copy(this.dir).scalar(this.radiusPan.getValue());
MathUtils.getNormal(this.dirVec, normal);
v.copy(this.dirVec).applyAxisAngle(normal, tha);
v.applyAxisAngle(this.dirVec.normalize(), Math.random() * PI * 2);
particle.velocity.copy(v);
return this;
};
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9WZWxvY2l0eS9WZWxvY2l0eS5qcyJdLCJuYW1lcyI6WyJNRUFTVVJFIiwiUEkiLCJNYXRoVXRpbHMiLCJWZWN0b3IzRCIsIkluaXRpYWxpemVyIiwiVmVsb2NpdHkiLCJjb25zdHJ1Y3RvciIsInR5cGUiLCJpc0VuYWJsZWQiLCJkaXJWZWMiLCJub3JtYWxpemUiLCJ2ciIsInByb3RvdHlwZSIsImluaXRpYWxpemUiLCJ0aGEiLCJub3JtYWwiLCJ2IiwicGFydGljbGUiLCJNYXRoIiwicmFuZG9tIiwiX3VzZVYiLCJjb3B5IiwiZGlyIiwic2NhbGFyIiwicmFkaXVzUGFuIiwiZ2V0VmFsdWUiLCJnZXROb3JtYWwiLCJhcHBseUF4aXNBbmdsZSIsInZlbG9jaXR5Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFULEVBQWtCQyxFQUFsQixRQUE0QixpQkFBNUI7QUFDQSxTQUFTQyxTQUFULEVBQW9CQyxRQUFwQixRQUFvQyxZQUFwQztBQUVBLE9BQU9DLFdBQVAsTUFBd0IsZ0JBQXhCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxRQUFOLFNBQXVCRCxXQUF2QixDQUFtQztBQUNoRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0VFLEVBQUFBLFdBQVcsQ0FBQ0MsSUFBRCxFQUFPQyxTQUFTLEdBQUcsSUFBbkIsRUFBeUI7QUFDbEMsVUFBTUQsSUFBTixFQUFZQyxTQUFaO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0MsTUFBTCxHQUFjLElBQUlOLFFBQUosQ0FBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLENBQW5CLENBQWQ7QUFDRDs7QUFFRE8sRUFBQUEsU0FBUyxDQUFDQyxFQUFELEVBQUs7QUFDWixXQUFPQSxFQUFFLEdBQUdYLE9BQVo7QUFDRDs7QUFsQitDO0FBcUJsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQUssUUFBUSxDQUFDTyxTQUFULENBQW1CQyxVQUFuQixHQUFpQyxZQUFXO0FBQzFDLE1BQUlDLEdBQUo7QUFDQSxNQUFJQyxNQUFNLEdBQUcsSUFBSVosUUFBSixDQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsQ0FBYjtBQUNBLE1BQUlhLENBQUMsR0FBRyxJQUFJYixRQUFKLENBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixDQUFuQixDQUFSO0FBRUEsU0FBTyxTQUFTVSxVQUFULENBQW9CSSxRQUFwQixFQUE4QjtBQUNuQ0gsSUFBQUEsR0FBRyxHQUFHLEtBQUtBLEdBQUwsR0FBV0ksSUFBSSxDQUFDQyxNQUFMLEVBQWpCO0FBQ0EsU0FBS0MsS0FBTCxJQUFjLEtBQUtYLE1BQUwsQ0FBWVksSUFBWixDQUFpQixLQUFLQyxHQUF0QixFQUEyQkMsTUFBM0IsQ0FBa0MsS0FBS0MsU0FBTCxDQUFlQyxRQUFmLEVBQWxDLENBQWQ7QUFFQXZCLElBQUFBLFNBQVMsQ0FBQ3dCLFNBQVYsQ0FBb0IsS0FBS2pCLE1BQXpCLEVBQWlDTSxNQUFqQztBQUNBQyxJQUFBQSxDQUFDLENBQUNLLElBQUYsQ0FBTyxLQUFLWixNQUFaLEVBQW9Ca0IsY0FBcEIsQ0FBbUNaLE1BQW5DLEVBQTJDRCxHQUEzQztBQUNBRSxJQUFBQSxDQUFDLENBQUNXLGNBQUYsQ0FBaUIsS0FBS2xCLE1BQUwsQ0FBWUMsU0FBWixFQUFqQixFQUEwQ1EsSUFBSSxDQUFDQyxNQUFMLEtBQWdCbEIsRUFBaEIsR0FBcUIsQ0FBL0Q7QUFFQWdCLElBQUFBLFFBQVEsQ0FBQ1csUUFBVCxDQUFrQlAsSUFBbEIsQ0FBdUJMLENBQXZCO0FBRUEsV0FBTyxJQUFQO0FBQ0QsR0FYRDtBQVlELENBakIrQixFQUFoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1FQVNVUkUsIFBJIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1hdGhVdGlscywgVmVjdG9yM0QgfSBmcm9tICcuLi8uLi9tYXRoJztcblxuaW1wb3J0IEluaXRpYWxpemVyIGZyb20gJy4uL0luaXRpYWxpemVyJztcblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgVmVsb2NpdHkgaW5pdGlhbGl6ZXJzLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2NpdHkgZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgVmVsb2NpdHkgaW50aXRpYWxpemVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHR5cGUsIGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBzdXBlcih0eXBlLCBpc0VuYWJsZWQpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgRGlyZWN0aW9uYWwgdmVjdG9yXG4gICAgICogQHR5cGUge1ZlY3RvcjNEfVxuICAgICAqL1xuICAgIHRoaXMuZGlyVmVjID0gbmV3IFZlY3RvcjNEKDAsIDAsIDApO1xuICB9XG5cbiAgbm9ybWFsaXplKHZyKSB7XG4gICAgcmV0dXJuIHZyICogTUVBU1VSRTtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgdGhlIHBhcnRpY2xlJ3MgaW5pdGlhbCB2ZWxvY2l0eS5cbiAqXG4gKiBAc2luZ2xldG9uXG4gKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIHRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvblxuICogQHJldHVybiB2b2lkXG4gKi9cblZlbG9jaXR5LnByb3RvdHlwZS5pbml0aWFsaXplID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdGhhO1xuICB2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjNEKDAsIDAsIDEpO1xuICB2YXIgdiA9IG5ldyBWZWN0b3IzRCgwLCAwLCAwKTtcblxuICByZXR1cm4gZnVuY3Rpb24gaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHRoYSA9IHRoaXMudGhhICogTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLl91c2VWICYmIHRoaXMuZGlyVmVjLmNvcHkodGhpcy5kaXIpLnNjYWxhcih0aGlzLnJhZGl1c1Bhbi5nZXRWYWx1ZSgpKTtcblxuICAgIE1hdGhVdGlscy5nZXROb3JtYWwodGhpcy5kaXJWZWMsIG5vcm1hbCk7XG4gICAgdi5jb3B5KHRoaXMuZGlyVmVjKS5hcHBseUF4aXNBbmdsZShub3JtYWwsIHRoYSk7XG4gICAgdi5hcHBseUF4aXNBbmdsZSh0aGlzLmRpclZlYy5ub3JtYWxpemUoKSwgTWF0aC5yYW5kb20oKSAqIFBJICogMik7XG5cbiAgICBwYXJ0aWNsZS52ZWxvY2l0eS5jb3B5KHYpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KSgpO1xuIl19
@@ -0,0 +1,4 @@
export { default as PolarVelocity } from './PolarVelocity';
export { default as RadialVelocity } from './RadialVelocity';
export { default as VectorVelocity } from './VectorVelocity';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9WZWxvY2l0eS9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0IiwiUG9sYXJWZWxvY2l0eSIsIlJhZGlhbFZlbG9jaXR5IiwiVmVjdG9yVmVsb2NpdHkiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sSUFBSUMsYUFBcEIsUUFBeUMsaUJBQXpDO0FBQ0EsU0FBU0QsT0FBTyxJQUFJRSxjQUFwQixRQUEwQyxrQkFBMUM7QUFDQSxTQUFTRixPQUFPLElBQUlHLGNBQXBCLFFBQTBDLGtCQUExQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgUG9sYXJWZWxvY2l0eSB9IGZyb20gJy4vUG9sYXJWZWxvY2l0eSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJhZGlhbFZlbG9jaXR5IH0gZnJvbSAnLi9SYWRpYWxWZWxvY2l0eSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFZlY3RvclZlbG9jaXR5IH0gZnJvbSAnLi9WZWN0b3JWZWxvY2l0eSc7XG4iXX0=
@@ -0,0 +1,26 @@
import _defineProperty from "@babel/runtime/helpers/defineProperty";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import { AdditiveBlending, CustomBlending, MultiplyBlending, NoBlending, NormalBlending, SubtractiveBlending } from '../core/three/';
export const SUPPORTED_MATERIAL_BLENDING_MODES = {
AdditiveBlending,
CustomBlending,
MultiplyBlending,
NoBlending,
NormalBlending,
SubtractiveBlending
};
export const DEFAULT_MATERIAL_PROPERTIES = {
color: 0xff0000,
blending: AdditiveBlending,
fog: true
};
export const DEFAULT_JSON_MATERIAL_PROPERTIES = _objectSpread(_objectSpread({}, DEFAULT_MATERIAL_PROPERTIES), {}, {
blending: 'AdditiveBlending'
});
export const DEFAULT_RATE_NUM_PAN = 1;
export const DEFAULT_RATE_TIME_PAN = 1;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9jb25zdGFudHMuanMiXSwibmFtZXMiOlsiQWRkaXRpdmVCbGVuZGluZyIsIkN1c3RvbUJsZW5kaW5nIiwiTXVsdGlwbHlCbGVuZGluZyIsIk5vQmxlbmRpbmciLCJOb3JtYWxCbGVuZGluZyIsIlN1YnRyYWN0aXZlQmxlbmRpbmciLCJTVVBQT1JURURfTUFURVJJQUxfQkxFTkRJTkdfTU9ERVMiLCJERUZBVUxUX01BVEVSSUFMX1BST1BFUlRJRVMiLCJjb2xvciIsImJsZW5kaW5nIiwiZm9nIiwiREVGQVVMVF9KU09OX01BVEVSSUFMX1BST1BFUlRJRVMiLCJERUZBVUxUX1JBVEVfTlVNX1BBTiIsIkRFRkFVTFRfUkFURV9USU1FX1BBTiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FDRUEsZ0JBREYsRUFFRUMsY0FGRixFQUdFQyxnQkFIRixFQUlFQyxVQUpGLEVBS0VDLGNBTEYsRUFNRUMsbUJBTkYsUUFPTyxnQkFQUDtBQVNBLE9BQU8sTUFBTUMsaUNBQWlDLEdBQUc7QUFDL0NOLEVBQUFBLGdCQUQrQztBQUUvQ0MsRUFBQUEsY0FGK0M7QUFHL0NDLEVBQUFBLGdCQUgrQztBQUkvQ0MsRUFBQUEsVUFKK0M7QUFLL0NDLEVBQUFBLGNBTCtDO0FBTS9DQyxFQUFBQTtBQU4rQyxDQUExQztBQVNQLE9BQU8sTUFBTUUsMkJBQTJCLEdBQUc7QUFDekNDLEVBQUFBLEtBQUssRUFBRSxRQURrQztBQUV6Q0MsRUFBQUEsUUFBUSxFQUFFVCxnQkFGK0I7QUFHekNVLEVBQUFBLEdBQUcsRUFBRTtBQUhvQyxDQUFwQztBQUtQLE9BQU8sTUFBTUMsZ0NBQWdDLG1DQUN4Q0osMkJBRHdDO0FBRTNDRSxFQUFBQSxRQUFRLEVBQUU7QUFGaUMsRUFBdEM7QUFJUCxPQUFPLE1BQU1HLG9CQUFvQixHQUFHLENBQTdCO0FBQ1AsT0FBTyxNQUFNQyxxQkFBcUIsR0FBRyxDQUE5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFkZGl0aXZlQmxlbmRpbmcsXG4gIEN1c3RvbUJsZW5kaW5nLFxuICBNdWx0aXBseUJsZW5kaW5nLFxuICBOb0JsZW5kaW5nLFxuICBOb3JtYWxCbGVuZGluZyxcbiAgU3VidHJhY3RpdmVCbGVuZGluZyxcbn0gZnJvbSAnLi4vY29yZS90aHJlZS8nO1xuXG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX01BVEVSSUFMX0JMRU5ESU5HX01PREVTID0ge1xuICBBZGRpdGl2ZUJsZW5kaW5nLFxuICBDdXN0b21CbGVuZGluZyxcbiAgTXVsdGlwbHlCbGVuZGluZyxcbiAgTm9CbGVuZGluZyxcbiAgTm9ybWFsQmxlbmRpbmcsXG4gIFN1YnRyYWN0aXZlQmxlbmRpbmcsXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVRFUklBTF9QUk9QRVJUSUVTID0ge1xuICBjb2xvcjogMHhmZjAwMDAsXG4gIGJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxuICBmb2c6IHRydWUsXG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSlNPTl9NQVRFUklBTF9QUk9QRVJUSUVTID0ge1xuICAuLi5ERUZBVUxUX01BVEVSSUFMX1BST1BFUlRJRVMsXG4gIGJsZW5kaW5nOiAnQWRkaXRpdmVCbGVuZGluZycsXG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkFURV9OVU1fUEFOID0gMTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1JBVEVfVElNRV9QQU4gPSAxO1xuIl19
@@ -0,0 +1,12 @@
export { default as Body } from './Body';
export { default as BodySprite } from './BodySprite';
export { default as InitializerUtil } from './InitializerUtil';
export { default as Life } from './Life';
export { default as Mass } from './Mass';
export { default as Position } from './Position';
export { default as Rotation } from './Rotation';
export { default as Radius } from './Radius';
export { default as Rate } from './Rate';
export { default as Texture } from './Texture';
export { VectorVelocity, PolarVelocity, RadialVelocity } from './Velocity';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0IiwiQm9keSIsIkJvZHlTcHJpdGUiLCJJbml0aWFsaXplclV0aWwiLCJMaWZlIiwiTWFzcyIsIlBvc2l0aW9uIiwiUm90YXRpb24iLCJSYWRpdXMiLCJSYXRlIiwiVGV4dHVyZSIsIlZlY3RvclZlbG9jaXR5IiwiUG9sYXJWZWxvY2l0eSIsIlJhZGlhbFZlbG9jaXR5Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLElBQUlDLElBQXBCLFFBQWdDLFFBQWhDO0FBQ0EsU0FBU0QsT0FBTyxJQUFJRSxVQUFwQixRQUFzQyxjQUF0QztBQUNBLFNBQVNGLE9BQU8sSUFBSUcsZUFBcEIsUUFBMkMsbUJBQTNDO0FBQ0EsU0FBU0gsT0FBTyxJQUFJSSxJQUFwQixRQUFnQyxRQUFoQztBQUNBLFNBQVNKLE9BQU8sSUFBSUssSUFBcEIsUUFBZ0MsUUFBaEM7QUFDQSxTQUFTTCxPQUFPLElBQUlNLFFBQXBCLFFBQW9DLFlBQXBDO0FBQ0EsU0FBU04sT0FBTyxJQUFJTyxRQUFwQixRQUFvQyxZQUFwQztBQUNBLFNBQVNQLE9BQU8sSUFBSVEsTUFBcEIsUUFBa0MsVUFBbEM7QUFDQSxTQUFTUixPQUFPLElBQUlTLElBQXBCLFFBQWdDLFFBQWhDO0FBQ0EsU0FBU1QsT0FBTyxJQUFJVSxPQUFwQixRQUFtQyxXQUFuQztBQUNBLFNBQVNDLGNBQVQsRUFBeUJDLGFBQXpCLEVBQXdDQyxjQUF4QyxRQUE4RCxZQUE5RCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgQm9keSB9IGZyb20gJy4vQm9keSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJvZHlTcHJpdGUgfSBmcm9tICcuL0JvZHlTcHJpdGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbml0aWFsaXplclV0aWwgfSBmcm9tICcuL0luaXRpYWxpemVyVXRpbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpZmUgfSBmcm9tICcuL0xpZmUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXNzIH0gZnJvbSAnLi9NYXNzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9zaXRpb24gfSBmcm9tICcuL1Bvc2l0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUm90YXRpb24gfSBmcm9tICcuL1JvdGF0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmFkaXVzIH0gZnJvbSAnLi9SYWRpdXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBSYXRlIH0gZnJvbSAnLi9SYXRlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZSc7XG5leHBvcnQgeyBWZWN0b3JWZWxvY2l0eSwgUG9sYXJWZWxvY2l0eSwgUmFkaWFsVmVsb2NpdHkgfSBmcm9tICcuL1ZlbG9jaXR5JztcbiJdfQ==
@@ -0,0 +1,16 @@
export const INITIALIZER_TYPE_ABSTRACT = 'Initializer';
export const INITIALIZER_TYPE_BODY = 'Body';
export const INITIALIZER_TYPE_BODY_SPRITE = 'BodySprite';
export const INITIALIZER_TYPE_TEXTURE = 'Texture';
export const INITIALIZER_TYPE_LIFE = 'Life';
export const INITIALIZER_TYPE_MASS = 'Mass';
export const INITIALIZER_TYPE_POSITION = 'Position';
export const INITIALIZER_TYPE_ROTATION = 'Rotation';
export const INITIALIZER_TYPE_RADIUS = 'Radius';
export const INITIALIZER_TYPE_ZONE = 'Zone';
export const INITIALIZER_TYPE_VECTOR_VELOCITY = 'VectorVelocity';
export const INITIALIZER_TYPE_POLAR_VELOCITY = 'PolarVelocity';
export const INITIALIZER_TYPE_RADIAL_VELOCITY = 'RadialVelocity';
export const INITIALIZER_TYPE_RATE = 'Rate';
export const INITIALIZER_TYPES_THAT_REQUIRE_THREE = [INITIALIZER_TYPE_BODY_SPRITE, INITIALIZER_TYPE_TEXTURE];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbml0aWFsaXplci90eXBlcy5qcyJdLCJuYW1lcyI6WyJJTklUSUFMSVpFUl9UWVBFX0FCU1RSQUNUIiwiSU5JVElBTElaRVJfVFlQRV9CT0RZIiwiSU5JVElBTElaRVJfVFlQRV9CT0RZX1NQUklURSIsIklOSVRJQUxJWkVSX1RZUEVfVEVYVFVSRSIsIklOSVRJQUxJWkVSX1RZUEVfTElGRSIsIklOSVRJQUxJWkVSX1RZUEVfTUFTUyIsIklOSVRJQUxJWkVSX1RZUEVfUE9TSVRJT04iLCJJTklUSUFMSVpFUl9UWVBFX1JPVEFUSU9OIiwiSU5JVElBTElaRVJfVFlQRV9SQURJVVMiLCJJTklUSUFMSVpFUl9UWVBFX1pPTkUiLCJJTklUSUFMSVpFUl9UWVBFX1ZFQ1RPUl9WRUxPQ0lUWSIsIklOSVRJQUxJWkVSX1RZUEVfUE9MQVJfVkVMT0NJVFkiLCJJTklUSUFMSVpFUl9UWVBFX1JBRElBTF9WRUxPQ0lUWSIsIklOSVRJQUxJWkVSX1RZUEVfUkFURSIsIklOSVRJQUxJWkVSX1RZUEVTX1RIQVRfUkVRVUlSRV9USFJFRSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSx5QkFBeUIsR0FBRyxhQUFsQztBQUNQLE9BQU8sTUFBTUMscUJBQXFCLEdBQUcsTUFBOUI7QUFDUCxPQUFPLE1BQU1DLDRCQUE0QixHQUFHLFlBQXJDO0FBQ1AsT0FBTyxNQUFNQyx3QkFBd0IsR0FBRyxTQUFqQztBQUNQLE9BQU8sTUFBTUMscUJBQXFCLEdBQUcsTUFBOUI7QUFDUCxPQUFPLE1BQU1DLHFCQUFxQixHQUFHLE1BQTlCO0FBQ1AsT0FBTyxNQUFNQyx5QkFBeUIsR0FBRyxVQUFsQztBQUNQLE9BQU8sTUFBTUMseUJBQXlCLEdBQUcsVUFBbEM7QUFDUCxPQUFPLE1BQU1DLHVCQUF1QixHQUFHLFFBQWhDO0FBQ1AsT0FBTyxNQUFNQyxxQkFBcUIsR0FBRyxNQUE5QjtBQUNQLE9BQU8sTUFBTUMsZ0NBQWdDLEdBQUcsZ0JBQXpDO0FBQ1AsT0FBTyxNQUFNQywrQkFBK0IsR0FBRyxlQUF4QztBQUNQLE9BQU8sTUFBTUMsZ0NBQWdDLEdBQUcsZ0JBQXpDO0FBQ1AsT0FBTyxNQUFNQyxxQkFBcUIsR0FBRyxNQUE5QjtBQUNQLE9BQU8sTUFBTUMsb0NBQW9DLEdBQUcsQ0FDbERaLDRCQURrRCxFQUVsREMsd0JBRmtELENBQTdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX1RZUEVfQUJTVFJBQ1QgPSAnSW5pdGlhbGl6ZXInO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX1RZUEVfQk9EWSA9ICdCb2R5JztcbmV4cG9ydCBjb25zdCBJTklUSUFMSVpFUl9UWVBFX0JPRFlfU1BSSVRFID0gJ0JvZHlTcHJpdGUnO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX1RZUEVfVEVYVFVSRSA9ICdUZXh0dXJlJztcbmV4cG9ydCBjb25zdCBJTklUSUFMSVpFUl9UWVBFX0xJRkUgPSAnTGlmZSc7XG5leHBvcnQgY29uc3QgSU5JVElBTElaRVJfVFlQRV9NQVNTID0gJ01hc3MnO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX1RZUEVfUE9TSVRJT04gPSAnUG9zaXRpb24nO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX1RZUEVfUk9UQVRJT04gPSAnUm90YXRpb24nO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX1RZUEVfUkFESVVTID0gJ1JhZGl1cyc7XG5leHBvcnQgY29uc3QgSU5JVElBTElaRVJfVFlQRV9aT05FID0gJ1pvbmUnO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX1RZUEVfVkVDVE9SX1ZFTE9DSVRZID0gJ1ZlY3RvclZlbG9jaXR5JztcbmV4cG9ydCBjb25zdCBJTklUSUFMSVpFUl9UWVBFX1BPTEFSX1ZFTE9DSVRZID0gJ1BvbGFyVmVsb2NpdHknO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX1RZUEVfUkFESUFMX1ZFTE9DSVRZID0gJ1JhZGlhbFZlbG9jaXR5JztcbmV4cG9ydCBjb25zdCBJTklUSUFMSVpFUl9UWVBFX1JBVEUgPSAnUmF0ZSc7XG5leHBvcnQgY29uc3QgSU5JVElBTElaRVJfVFlQRVNfVEhBVF9SRVFVSVJFX1RIUkVFID0gW1xuICBJTklUSUFMSVpFUl9UWVBFX0JPRFlfU1BSSVRFLFxuICBJTklUSUFMSVpFUl9UWVBFX1RFWFRVUkUsXG5dO1xuIl19
@@ -0,0 +1,62 @@
import Span from './Span';
import sample from '../utils/sample.js';
import { MATH_TYPE_ARRAY_SPAN as type } from './types';
/**
* Class for storing items of mixed type and fetching a randomised
* value from these items.
*
*/
export default class ArraySpan extends Span {
/**
* Constructs an ArraySpan instance.
*
* @param {mixed|array<mixed>} items - Items
* @return void
*/
constructor(items) {
super();
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
/**
* @desc An array of colors
* @type {array}
*/
this.items = Array.isArray(items) ? items : [items];
}
/**
* Gets a random item.
*
* @return {mixed}
*/
getValue() {
return sample(this.items);
}
}
/**
* Attempts to create an ArraySpan from the items provided.
*
* @param {mixed} items - Items to try and create an ArraySpan from
* @return {?ArraySpan}
*/
export const createArraySpan = items => {
if (!items) {
return null;
}
if (items instanceof ArraySpan) {
return items;
}
return new ArraySpan(items);
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL0FycmF5U3Bhbi5qcyJdLCJuYW1lcyI6WyJTcGFuIiwic2FtcGxlIiwiTUFUSF9UWVBFX0FSUkFZX1NQQU4iLCJ0eXBlIiwiQXJyYXlTcGFuIiwiY29uc3RydWN0b3IiLCJpdGVtcyIsIkFycmF5IiwiaXNBcnJheSIsImdldFZhbHVlIiwiY3JlYXRlQXJyYXlTcGFuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxJQUFQLE1BQWlCLFFBQWpCO0FBQ0EsT0FBT0MsTUFBUCxNQUFtQixlQUFuQjtBQUNBLFNBQVNDLG9CQUFvQixJQUFJQyxJQUFqQyxRQUE2QyxTQUE3QztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxTQUFOLFNBQXdCSixJQUF4QixDQUE2QjtBQUMxQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUssRUFBQUEsV0FBVyxDQUFDQyxLQUFELEVBQVE7QUFDakI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLSCxJQUFMLEdBQVlBLElBQVo7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLRyxLQUFMLEdBQWFDLEtBQUssQ0FBQ0MsT0FBTixDQUFjRixLQUFkLElBQXVCQSxLQUF2QixHQUErQixDQUFDQSxLQUFELENBQTVDO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUcsRUFBQUEsUUFBUSxHQUFHO0FBQ1QsV0FBT1IsTUFBTSxDQUFDLEtBQUtLLEtBQU4sQ0FBYjtBQUNEOztBQTlCeUM7QUFpQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1JLGVBQWUsR0FBR0osS0FBSyxJQUFJO0FBQ3RDLE1BQUksQ0FBQ0EsS0FBTCxFQUFZO0FBQ1YsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsTUFBSUEsS0FBSyxZQUFZRixTQUFyQixFQUFnQztBQUM5QixXQUFPRSxLQUFQO0FBQ0Q7O0FBRUQsU0FBTyxJQUFJRixTQUFKLENBQWNFLEtBQWQsQ0FBUDtBQUNELENBVk0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3BhbiBmcm9tICcuL1NwYW4nO1xuaW1wb3J0IHNhbXBsZSBmcm9tICdsb2Rhc2gvc2FtcGxlJztcbmltcG9ydCB7IE1BVEhfVFlQRV9BUlJBWV9TUEFOIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBDbGFzcyBmb3Igc3RvcmluZyBpdGVtcyBvZiBtaXhlZCB0eXBlIGFuZCBmZXRjaGluZyBhIHJhbmRvbWlzZWRcbiAqIHZhbHVlIGZyb20gdGhlc2UgaXRlbXMuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnJheVNwYW4gZXh0ZW5kcyBTcGFuIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYW4gQXJyYXlTcGFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge21peGVkfGFycmF5PG1peGVkPn0gaXRlbXMgLSBJdGVtc1xuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGl0ZW1zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBjbGFzcyB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gdHlwZTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIEFuIGFycmF5IG9mIGNvbG9yc1xuICAgICAqIEB0eXBlIHthcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLml0ZW1zID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJhbmRvbSBpdGVtLlxuICAgKlxuICAgKiBAcmV0dXJuIHttaXhlZH1cbiAgICovXG4gIGdldFZhbHVlKCkge1xuICAgIHJldHVybiBzYW1wbGUodGhpcy5pdGVtcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBjcmVhdGUgYW4gQXJyYXlTcGFuIGZyb20gdGhlIGl0ZW1zIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSB7bWl4ZWR9IGl0ZW1zIC0gSXRlbXMgdG8gdHJ5IGFuZCBjcmVhdGUgYW4gQXJyYXlTcGFuIGZyb21cbiAqIEByZXR1cm4gez9BcnJheVNwYW59XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBcnJheVNwYW4gPSBpdGVtcyA9PiB7XG4gIGlmICghaXRlbXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChpdGVtcyBpbnN0YW5jZW9mIEFycmF5U3Bhbikge1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHJldHVybiBuZXcgQXJyYXlTcGFuKGl0ZW1zKTtcbn07XG4iXX0=
@@ -0,0 +1,25 @@
import { MATH_TYPE_BOX as type } from './types';
export default class Box {
constructor(x, y, z, w, h, d) {
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
this.x = x;
this.y = y;
this.z = z;
this.width = w;
this.height = h;
this.depth = d;
this.bottom = this.y + this.height;
this.right = this.x + this.width;
this.right = this.x + this.width;
}
contains(x, y, z) {
if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y && z <= this.depth && z >= this.z) return true;else return false;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL0JveC5qcyJdLCJuYW1lcyI6WyJNQVRIX1RZUEVfQk9YIiwidHlwZSIsIkJveCIsImNvbnN0cnVjdG9yIiwieCIsInkiLCJ6IiwidyIsImgiLCJkIiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsImJvdHRvbSIsInJpZ2h0IiwiY29udGFpbnMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGFBQWEsSUFBSUMsSUFBMUIsUUFBc0MsU0FBdEM7QUFFQSxlQUFlLE1BQU1DLEdBQU4sQ0FBVTtBQUN2QkMsRUFBQUEsV0FBVyxDQUFDQyxDQUFELEVBQUlDLENBQUosRUFBT0MsQ0FBUCxFQUFVQyxDQUFWLEVBQWFDLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CO0FBQzVCO0FBQ0o7QUFDQTtBQUNBO0FBQ0ksU0FBS1IsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0csQ0FBTCxHQUFTQSxDQUFUO0FBQ0EsU0FBS0MsQ0FBTCxHQUFTQSxDQUFUO0FBQ0EsU0FBS0MsQ0FBTCxHQUFTQSxDQUFUO0FBQ0EsU0FBS0ksS0FBTCxHQUFhSCxDQUFiO0FBQ0EsU0FBS0ksTUFBTCxHQUFjSCxDQUFkO0FBQ0EsU0FBS0ksS0FBTCxHQUFhSCxDQUFiO0FBQ0EsU0FBS0ksTUFBTCxHQUFjLEtBQUtSLENBQUwsR0FBUyxLQUFLTSxNQUE1QjtBQUNBLFNBQUtHLEtBQUwsR0FBYSxLQUFLVixDQUFMLEdBQVMsS0FBS00sS0FBM0I7QUFDQSxTQUFLSSxLQUFMLEdBQWEsS0FBS1YsQ0FBTCxHQUFTLEtBQUtNLEtBQTNCO0FBQ0Q7O0FBRURLLEVBQUFBLFFBQVEsQ0FBQ1gsQ0FBRCxFQUFJQyxDQUFKLEVBQU9DLENBQVAsRUFBVTtBQUNoQixRQUNFRixDQUFDLElBQUksS0FBS1UsS0FBVixJQUNBVixDQUFDLElBQUksS0FBS0EsQ0FEVixJQUVBQyxDQUFDLElBQUksS0FBS1EsTUFGVixJQUdBUixDQUFDLElBQUksS0FBS0EsQ0FIVixJQUlBQyxDQUFDLElBQUksS0FBS00sS0FKVixJQUtBTixDQUFDLElBQUksS0FBS0EsQ0FOWixFQVFFLE9BQU8sSUFBUCxDQVJGLEtBU0ssT0FBTyxLQUFQO0FBQ047O0FBN0JzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1BVEhfVFlQRV9CT1ggYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb3gge1xuICBjb25zdHJ1Y3Rvcih4LCB5LCB6LCB3LCBoLCBkKSB7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNsYXNzIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLnogPSB6O1xuICAgIHRoaXMud2lkdGggPSB3O1xuICAgIHRoaXMuaGVpZ2h0ID0gaDtcbiAgICB0aGlzLmRlcHRoID0gZDtcbiAgICB0aGlzLmJvdHRvbSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnggKyB0aGlzLndpZHRoO1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnggKyB0aGlzLndpZHRoO1xuICB9XG5cbiAgY29udGFpbnMoeCwgeSwgeikge1xuICAgIGlmIChcbiAgICAgIHggPD0gdGhpcy5yaWdodCAmJlxuICAgICAgeCA+PSB0aGlzLnggJiZcbiAgICAgIHkgPD0gdGhpcy5ib3R0b20gJiZcbiAgICAgIHkgPj0gdGhpcy55ICYmXG4gICAgICB6IDw9IHRoaXMuZGVwdGggJiZcbiAgICAgIHogPj0gdGhpcy56XG4gICAgKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,71 @@
import MathUtils from './MathUtils';
import Span from './Span';
import sample from '../utils/sample.js';
import { MATH_TYPE_COLOR_SPAN as type } from './types';
/**
* Class for storing and interacting with an array of colours.
*
*/
export default class ColorSpan extends Span {
/**
* Constructs a ColorSpan instance.
*
* @param {string|array<string>} colors - A color or array of colors. If the
* string 'random' is provided, a random color will be returned from getValue
* @return void
*/
constructor(colors) {
super();
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
/**
* @desc Determines if a random color should be returned from the getValue method.
* @type {boolean}
*/
this.shouldRandomize = colors === 'random' ? true : false;
/**
* @desc An array of colors to select from
* @type {array<string>}
*/
this.colors = Array.isArray(colors) ? colors : [colors];
}
/**
* Gets a color from the color array
* or a random color if this.shouldRandomize is true.
*
* @return {string} a hex color
*/
getValue() {
return this.shouldRandomize ? MathUtils.randomColor() : sample(this.colors);
}
}
/**
* Attempts to create an ArraySpan from the colors provided.
*
* @param {mixed} colors - colors to try and create an ArraySpan from
* @return {?ColorSpan}
*/
export const createColorSpan = colors => {
if (!colors) {
console.warn(`Invalid colors argument ${colors} passed to createColorSpan. Defaulting to 'random'.`);
colors = 'random';
}
if (colors instanceof ColorSpan) {
return colors;
}
return new ColorSpan(colors);
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL0NvbG9yU3Bhbi5qcyJdLCJuYW1lcyI6WyJNYXRoVXRpbHMiLCJTcGFuIiwic2FtcGxlIiwiTUFUSF9UWVBFX0NPTE9SX1NQQU4iLCJ0eXBlIiwiQ29sb3JTcGFuIiwiY29uc3RydWN0b3IiLCJjb2xvcnMiLCJzaG91bGRSYW5kb21pemUiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRWYWx1ZSIsInJhbmRvbUNvbG9yIiwiY3JlYXRlQ29sb3JTcGFuIiwiY29uc29sZSIsIndhcm4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFNBQVAsTUFBc0IsYUFBdEI7QUFDQSxPQUFPQyxJQUFQLE1BQWlCLFFBQWpCO0FBQ0EsT0FBT0MsTUFBUCxNQUFtQixlQUFuQjtBQUNBLFNBQVNDLG9CQUFvQixJQUFJQyxJQUFqQyxRQUE2QyxTQUE3QztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsU0FBTixTQUF3QkosSUFBeEIsQ0FBNkI7QUFDMUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUssRUFBQUEsV0FBVyxDQUFDQyxNQUFELEVBQVM7QUFDbEI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLSCxJQUFMLEdBQVlBLElBQVo7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLSSxlQUFMLEdBQXVCRCxNQUFNLEtBQUssUUFBWCxHQUFzQixJQUF0QixHQUE2QixLQUFwRDtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtBLE1BQUwsR0FBY0UsS0FBSyxDQUFDQyxPQUFOLENBQWNILE1BQWQsSUFBd0JBLE1BQXhCLEdBQWlDLENBQUNBLE1BQUQsQ0FBL0M7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VJLEVBQUFBLFFBQVEsR0FBRztBQUNULFdBQU8sS0FBS0gsZUFBTCxHQUF1QlIsU0FBUyxDQUFDWSxXQUFWLEVBQXZCLEdBQWlEVixNQUFNLENBQUMsS0FBS0ssTUFBTixDQUE5RDtBQUNEOztBQXRDeUM7QUF5QzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1NLGVBQWUsR0FBR04sTUFBTSxJQUFJO0FBQ3ZDLE1BQUksQ0FBQ0EsTUFBTCxFQUFhO0FBQ1hPLElBQUFBLE9BQU8sQ0FBQ0MsSUFBUixDQUNHLDJCQUEwQlIsTUFBTyxxREFEcEM7QUFJQUEsSUFBQUEsTUFBTSxHQUFHLFFBQVQ7QUFDRDs7QUFFRCxNQUFJQSxNQUFNLFlBQVlGLFNBQXRCLEVBQWlDO0FBQy9CLFdBQU9FLE1BQVA7QUFDRDs7QUFFRCxTQUFPLElBQUlGLFNBQUosQ0FBY0UsTUFBZCxDQUFQO0FBQ0QsQ0FkTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXRoVXRpbHMgZnJvbSAnLi9NYXRoVXRpbHMnO1xuaW1wb3J0IFNwYW4gZnJvbSAnLi9TcGFuJztcbmltcG9ydCBzYW1wbGUgZnJvbSAnbG9kYXNoL3NhbXBsZSc7XG5pbXBvcnQgeyBNQVRIX1RZUEVfQ09MT1JfU1BBTiBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ2xhc3MgZm9yIHN0b3JpbmcgYW5kIGludGVyYWN0aW5nIHdpdGggYW4gYXJyYXkgb2YgY29sb3Vycy5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9yU3BhbiBleHRlbmRzIFNwYW4ge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIENvbG9yU3BhbiBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXk8c3RyaW5nPn0gY29sb3JzIC0gQSBjb2xvciBvciBhcnJheSBvZiBjb2xvcnMuIElmIHRoZVxuICAgKiBzdHJpbmcgJ3JhbmRvbScgaXMgcHJvdmlkZWQsIGEgcmFuZG9tIGNvbG9yIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSBnZXRWYWx1ZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbG9ycykge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgY2xhc3MgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIGlmIGEgcmFuZG9tIGNvbG9yIHNob3VsZCBiZSByZXR1cm5lZCBmcm9tIHRoZSBnZXRWYWx1ZSBtZXRob2QuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5zaG91bGRSYW5kb21pemUgPSBjb2xvcnMgPT09ICdyYW5kb20nID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgQW4gYXJyYXkgb2YgY29sb3JzIHRvIHNlbGVjdCBmcm9tXG4gICAgICogQHR5cGUge2FycmF5PHN0cmluZz59XG4gICAgICovXG4gICAgdGhpcy5jb2xvcnMgPSBBcnJheS5pc0FycmF5KGNvbG9ycykgPyBjb2xvcnMgOiBbY29sb3JzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgY29sb3IgZnJvbSB0aGUgY29sb3IgYXJyYXlcbiAgICogb3IgYSByYW5kb20gY29sb3IgaWYgdGhpcy5zaG91bGRSYW5kb21pemUgaXMgdHJ1ZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBhIGhleCBjb2xvclxuICAgKi9cbiAgZ2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvdWxkUmFuZG9taXplID8gTWF0aFV0aWxzLnJhbmRvbUNvbG9yKCkgOiBzYW1wbGUodGhpcy5jb2xvcnMpO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gY3JlYXRlIGFuIEFycmF5U3BhbiBmcm9tIHRoZSBjb2xvcnMgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHttaXhlZH0gY29sb3JzIC0gY29sb3JzIHRvIHRyeSBhbmQgY3JlYXRlIGFuIEFycmF5U3BhbiBmcm9tXG4gKiBAcmV0dXJuIHs/Q29sb3JTcGFufVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQ29sb3JTcGFuID0gY29sb3JzID0+IHtcbiAgaWYgKCFjb2xvcnMpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgSW52YWxpZCBjb2xvcnMgYXJndW1lbnQgJHtjb2xvcnN9IHBhc3NlZCB0byBjcmVhdGVDb2xvclNwYW4uIERlZmF1bHRpbmcgdG8gJ3JhbmRvbScuYFxuICAgICk7XG5cbiAgICBjb2xvcnMgPSAncmFuZG9tJztcbiAgfVxuXG4gIGlmIChjb2xvcnMgaW5zdGFuY2VvZiBDb2xvclNwYW4pIHtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBDb2xvclNwYW4oY29sb3JzKTtcbn07XG4iXX0=
@@ -0,0 +1,48 @@
import { PI } from '../constants';
export default {
randomAToB: function (a, b, INT) {
if (!INT) return a + Math.random() * (b - a);else return (Math.random() * (b - a) >> 0) + a;
},
randomFloating: function (center, f, INT) {
return this.randomAToB(center - f, center + f, INT);
},
randomZone: function (display) {},
//eslint-disable-line
degreeTransform: function (a) {
return a * PI / 180;
},
toColor16: function getRGB(num) {
return '#' + num.toString(16);
},
randomColor: function () {
return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
},
lerp: function (a, b, energy) {
return b + (a - b) * energy;
},
getNormal: function (v, n) {
if (v.x == 0 && v.y == 0) {
if (v.z == 0) n.set(1, 0, 1);else n.set(1, 1, -v.y / v.z);
} else {
if (v.x == 0) n.set(1, 0, 1);else n.set(-v.y / v.x, 1, 1);
}
return n.normalize();
},
/**
* Rodrigues' Rotation Formula
* https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
* v′ = vcos(θ) + k(k⋅v)(1−cos(θ)) + (k*v)sin(θ)
*/
axisRotate: function (v0, v, k, tha) {
var cos = Math.cos(tha);
var sin = Math.sin(tha);
var p = k.dot(v) * (1 - cos);
v0.copy(k);
v0.cross(v).scalar(sin);
v0.addValue(v.x * cos, v.y * cos, v.z * cos);
v0.addValue(k.x * p, k.y * p, k.z * p);
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL01hdGhVdGlscy5qcyJdLCJuYW1lcyI6WyJQSSIsInJhbmRvbUFUb0IiLCJhIiwiYiIsIklOVCIsIk1hdGgiLCJyYW5kb20iLCJyYW5kb21GbG9hdGluZyIsImNlbnRlciIsImYiLCJyYW5kb21ab25lIiwiZGlzcGxheSIsImRlZ3JlZVRyYW5zZm9ybSIsInRvQ29sb3IxNiIsImdldFJHQiIsIm51bSIsInRvU3RyaW5nIiwicmFuZG9tQ29sb3IiLCJzbGljZSIsImxlcnAiLCJlbmVyZ3kiLCJnZXROb3JtYWwiLCJ2IiwibiIsIngiLCJ5IiwieiIsInNldCIsIm5vcm1hbGl6ZSIsImF4aXNSb3RhdGUiLCJ2MCIsImsiLCJ0aGEiLCJjb3MiLCJzaW4iLCJwIiwiZG90IiwiY29weSIsImNyb3NzIiwic2NhbGFyIiwiYWRkVmFsdWUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEVBQVQsUUFBbUIsY0FBbkI7QUFFQSxlQUFlO0FBQ2JDLEVBQUFBLFVBQVUsRUFBRSxVQUFTQyxDQUFULEVBQVlDLENBQVosRUFBZUMsR0FBZixFQUFvQjtBQUM5QixRQUFJLENBQUNBLEdBQUwsRUFBVSxPQUFPRixDQUFDLEdBQUdHLElBQUksQ0FBQ0MsTUFBTCxNQUFpQkgsQ0FBQyxHQUFHRCxDQUFyQixDQUFYLENBQVYsS0FDSyxPQUFPLENBQUVHLElBQUksQ0FBQ0MsTUFBTCxNQUFpQkgsQ0FBQyxHQUFHRCxDQUFyQixDQUFELElBQTZCLENBQTlCLElBQW1DQSxDQUExQztBQUNOLEdBSlk7QUFLYkssRUFBQUEsY0FBYyxFQUFFLFVBQVNDLE1BQVQsRUFBaUJDLENBQWpCLEVBQW9CTCxHQUFwQixFQUF5QjtBQUN2QyxXQUFPLEtBQUtILFVBQUwsQ0FBZ0JPLE1BQU0sR0FBR0MsQ0FBekIsRUFBNEJELE1BQU0sR0FBR0MsQ0FBckMsRUFBd0NMLEdBQXhDLENBQVA7QUFDRCxHQVBZO0FBU2JNLEVBQUFBLFVBQVUsRUFBRSxVQUFTQyxPQUFULEVBQWtC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cm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHJhbmRvbUFUb0I6IGZ1bmN0aW9uKGEsIGIsIElOVCkge1xuICAgIGlmICghSU5UKSByZXR1cm4gYSArIE1hdGgucmFuZG9tKCkgKiAoYiAtIGEpO1xuICAgIGVsc2UgcmV0dXJuICgoTWF0aC5yYW5kb20oKSAqIChiIC0gYSkpID4+IDApICsgYTtcbiAgfSxcbiAgcmFuZG9tRmxvYXRpbmc6IGZ1bmN0aW9uKGNlbnRlciwgZiwgSU5UKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQVRvQihjZW50ZXIgLSBmLCBjZW50ZXIgKyBmLCBJTlQpO1xuICB9LFxuXG4gIHJhbmRvbVpvbmU6IGZ1bmN0aW9uKGRpc3BsYXkpIHt9LCAvL2VzbGludC1kaXNhYmxlLWxpbmVcblxuICBkZWdyZWVUcmFuc2Zvcm06IGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gKGEgKiBQSSkgLyAxODA7XG4gIH0sXG5cbiAgdG9Db2xvcjE2OiBmdW5jdGlvbiBnZXRSR0IobnVtKSB7XG4gICAgcmV0dXJuICcjJyArIG51bS50b1N0cmluZygxNik7XG4gIH0sXG5cbiAgcmFuZG9tQ29sb3I6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoXG4gICAgICAnIycgK1xuICAgICAgKCcwMDAwMCcgKyAoKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDApIDw8IDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpXG4gICAgKTtcbiAgfSxcblxuICBsZXJwOiBmdW5jdGlvbihhLCBiLCBlbmVyZ3kpIHtcbiAgICByZXR1cm4gYiArIChhIC0gYikgKiBlbmVyZ3k7XG4gIH0sXG5cbiAgZ2V0Tm9ybWFsOiBmdW5jdGlvbih2LCBuKSB7XG4gICAgaWYgKHYueCA9PSAwICYmIHYueSA9PSAwKSB7XG4gICAgICBpZiAodi56ID09IDApIG4uc2V0KDEsIDAsIDEpO1xuICAgICAgZWxzZSBuLnNldCgxLCAxLCAtdi55IC8gdi56KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHYueCA9PSAwKSBuLnNldCgxLCAwLCAxKTtcbiAgICAgIGVsc2Ugbi5zZXQoLXYueSAvIHYueCwgMSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG4ubm9ybWFsaXplKCk7XG4 Line truncated
@@ -0,0 +1,81 @@
import Vector3D from './Vector3D';
import { MATH_TYPE_POLAR_3D as type } from './types';
export default class Polar3D {
constructor(radius, theta, phi) {
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
this.radius = radius || 1;
this.phi = phi || 0;
this.theta = theta || 0;
}
set(radius, theta, phi) {
this.radius = radius || 1;
this.phi = phi || 0;
this.theta = theta || 0;
return this;
}
setRadius(radius) {
this.radius = radius;
return this;
}
setPhi(phi) {
this.phi = phi;
return this;
}
setTheta(theta) {
this.theta = theta;
return this;
}
copy(p) {
this.radius = p.radius;
this.phi = p.phi;
this.theta = p.theta;
return this;
}
toVector3D() {
return new Vector3D(this.getX(), this.getY(), this.getZ());
}
getX() {
return this.radius * Math.sin(this.theta) * Math.cos(this.phi);
}
getY() {
return -this.radius * Math.sin(this.theta) * Math.sin(this.phi);
}
getZ() {
return this.radius * Math.cos(this.theta);
}
normalize() {
this.radius = 1;
return this;
}
equals(v) {
return v.radius === this.radius && v.phi === this.phi && v.theta === this.theta;
}
clear() {
this.radius = 0.0;
this.phi = 0.0;
this.theta = 0.0;
return this;
}
clone() {
return new Polar3D(this.radius, this.phi, this.theta);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL1BvbGFyM0QuanMiXSwibmFtZXMiOlsiVmVjdG9yM0QiLCJNQVRIX1RZUEVfUE9MQVJfM0QiLCJ0eXBlIiwiUG9sYXIzRCIsImNvbnN0cnVjdG9yIiwicmFkaXVzIiwidGhldGEiLCJwaGkiLCJzZXQiLCJzZXRSYWRpdXMiLCJzZXRQaGkiLCJzZXRUaGV0YSIsImNvcHkiLCJwIiwidG9WZWN0b3IzRCIsImdldFgiLCJnZXRZIiwiZ2V0WiIsIk1hdGgiLCJzaW4iLCJjb3MiLCJub3JtYWxpemUiLCJlcXVhbHMiLCJ2IiwiY2xlYXIiLCJjbG9uZSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsUUFBUCxNQUFxQixZQUFyQjtBQUNBLFNBQVNDLGtCQUFrQixJQUFJQyxJQUEvQixRQUEyQyxTQUEzQztBQUVBLGVBQWUsTUFBTUMsT0FBTixDQUFjO0FBQzNCQyxFQUFBQSxXQUFXLENBQUNDLE1BQUQsRUFBU0MsS0FBVCxFQUFnQkMsR0FBaEIsRUFBcUI7QUFDOUI7QUFDSjtBQUNBO0FBQ0E7QUFDSSxTQUFLTCxJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLRyxNQUFMLEdBQWNBLE1BQU0sSUFBSSxDQUF4QjtBQUNBLFNBQUtFLEdBQUwsR0FBV0EsR0FBRyxJQUFJLENBQWxCO0FBQ0EsU0FBS0QsS0FBTCxHQUFhQSxLQUFLLElBQUksQ0FBdEI7QUFDRDs7QUFFREUsRUFBQUEsR0FBRyxDQUFDSCxNQUFELEVBQVNDLEtBQVQsRUFBZ0JDLEdBQWhCLEVBQXFCO0FBQ3RCLFNBQUtGLE1BQUwsR0FBY0EsTUFBTSxJQUFJLENBQXhCO0FBQ0EsU0FBS0UsR0FBTCxHQUFXQSxHQUFHLElBQUksQ0FBbEI7QUFDQSxTQUFLRCxLQUFMLEdBQWFBLEtBQUssSUFBSSxDQUF0QjtBQUVBLFdBQU8sSUFBUDtBQUNEOztBQUVERyxFQUFBQSxTQUFTLENBQUNKLE1BQUQsRUFBUztBQUNoQixTQUFLQSxNQUFMLEdBQWNBLE1BQWQ7QUFFQSxXQUFPLElBQVA7QUFDRDs7QUFFREssRUFBQUEsTUFBTSxDQUFDSCxHQUFELEVBQU07QUFDVixTQUFLQSxHQUFMLEdBQVdBLEdBQVg7QUFFQSxXQUFPLElBQVA7QUFDRDs7QUFFREksRUFBQUEsUUFBUSxDQUFDTCxLQUFELEVBQVE7QUFDZCxTQUFLQSxLQUFMLEdBQWFBLEtBQWI7QUFFQSxXQUFPLElBQVA7QUFDRDs7QUFFRE0sRUFBQUEsSUFBSSxDQUFDQyxDQUFELEVBQUk7QUFDTixTQUFLUixNQUFMLEdBQWNRLENBQUMsQ0FBQ1IsTUFBaEI7QUFDQSxTQUFLRSxHQUFMLEdBQVdNLENBQUMsQ0FBQ04sR0FBYjtBQUNBLFNBQUtELEtBQUwsR0FBYU8sQ0FBQyxDQUFDUCxLQUFmO0FBRUEsV0FBTyxJQUFQO0FBQ0Q7O0FBRURRLEVBQUFBLFVBQVUsR0FBRztBQUNYLFdBQU8sSUFBSWQsUUFBSixDQUFhLEtBQUtlLElBQUwsRUFBYixFQUEwQixLQUFLQyxJQUFMLEVBQTFCLEVBQXVDLEtBQUtDLElBQUwsRUFBdkMsQ0FBUDtBQUNEOztBQUVERixFQUFBQSxJQUFJLEdBQUc7QUFDTCxXQUFPLEtBQUtWLE1BQUwsR0FBY2EsSUFBSSxDQUFDQyxHQUFMLENBQVMsS0FBS2IsS0FBZCxDQUFkLEdBQXFDWSxJQUFJLENBQUNFLEdBQUwsQ0FBUyxLQUFLYixHQUFkLENBQTVDO0FBQ0Q7O0FBRURTLEVBQUFBLElBQUksR0FBRztBQUNMLFdBQU8sQ0FBQyxLQUFLWCxNQUFOLEdBQWVhLElBQUksQ0FBQ0MsR0FBTCxDQUFTLEtBQUtiLEtBQWQsQ0FBZixHQUFzQ1ksSUFBSSxDQUFDQyxHQUFMLENBQVMsS0FBS1osR0FBZCxDQUE3QztBQUNEOztBQUVEVSxFQUFBQSxJQUFJLEdBQUc7QUFDTCxXQUFPLEtBQUtaLE1BQUwsR0FBY2EsSUFBSSxDQUFDRSxHQUFMLENBQVMsS0FBS2QsS0FBZCxDQUFyQjtBQUNEOztBQUVEZSxFQUFBQSxTQUFTLEdBQUc7QUFDVixTQUFLaEIsTUFBTCxHQUFjLENBQWQ7QUFFQSxXQUFPLElBQVA7QUFDRDs7QUFFRGlCLEVBQUFBLE1BQU0sQ0FBQ0MsQ0FBRCxFQUFJO0FBQ1IsV0FDRUEsQ0FBQyxDQUFDbEIsTUFBRixLQUFhLEtBQUtBLE1BQWxCLElBQTRCa0IsQ0FBQyxDQUFDaEIsR0FBRixLQUFVLEtBQUtBLEdBQTNDLElBQWtEZ0IsQ0FBQyxDQUFDakIsS0FBRixLQUFZLEtBQUtBLEtBRHJFO0FBR0Q7O0FBRURrQixFQUFBQSxLQUFLLEdBQUc7QUFDTixTQUFLbkIsTUFBTCxHQUFjLEdBQWQ7QUFDQSxTQUFLRSxHQUFMLEdBQVcsR0FBWDtBQUNBLFNBQUtELEtBQUwsR0FBYSxHQUFiO0FBRUEsV0FBTyxJQUFQO0FBQ0Q7O0FBRURtQixFQUFBQSxLQUFLLEdBQUc7QUFDTixXQUFPLElBQUl0QixPQUFKLENBQVksS0FBS0UsTUFBakIsRUFBeUIsS0FBS0UsR0FBOUIsRUFBbUMsS0FBS0QsS0FBeEMsQ0FBUDtBQUNEOztBQXBGMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVmVjdG9yM0QgZnJvbSAnLi9WZWN0b3IzRCc7XG5pbXBvcnQgeyBNQVRIX1RZUEVfUE9MQVJfM0QgYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2xhcjNEIHtcbiAgY29uc3RydWN0b3IocmFkaXVzLCB0aGV0YSwgcGhpKSB7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNsYXNzIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMucmFkaXVzID0gcmFkaXVzIHx8IDE7XG4gICAgdGhpcy5waGkgPSBwaGkgfHwgMDtcbiAgICB0aGlzLnRoZXRhID0gdGhldGEgfHwgMDtcbiAgfVxuXG4gIHNldChyYWRpdXMsIHRoZXRhLCBwaGkpIHtcbiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuICAgIHRoaXMucGhpID0gcGhpIHx8IDA7XG4gICAgdGhpcy50aGV0YSA9IHRoZXRhIHx8IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFJhZGl1cyhyYWRpdXMpIHtcbiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UGhpKHBoaSkge1xuICAgIHRoaXMucGhpID0gcGhpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRUaGV0YSh0aGV0YSkge1xuICAgIHRoaXMudGhldGEgPSB0aGV0YTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29weShwKSB7XG4gICAgdGhpcy5yYWRpdXMgPSBwLnJhZGl1cztcbiAgICB0aGlzLnBoaSA9IHAucGhpO1xuICAgIHRoaXMudGhldGEgPSBwLnRoZXRhO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b1ZlY3RvcjNEKCkge1xuICAgIHJldHVybiBuZXcgVmVjdG9yM0QodGhpcy5nZXRYKCksIHRoaXMuZ2V0WSgpLCB0aGlzLmdldFooKSk7XG4gIH1cblxuICBnZXRYKCkge1xuICAgIHJldHVybiB0aGlzLnJhZGl1cyAqIE1hdGguc2luKHRoaXMudGhldGEpICogTWF0aC5jb3ModGhpcy5waGkpO1xuICB9XG5cbiAgZ2V0WSgpIHtcbiAgICByZXR1cm4gLXRoaXMucmFkaXVzICogTWF0aC5zaW4odGhpcy50aGV0YSkgKiBNYXRoLnNpbih0aGlzLnBoaSk7XG4gIH1cblxuICBnZXRaKCkge1xuICAgIHJldHVybiB0aGlzLnJhZGl1cyAqIE1hdGguY29zKHRoaXMudGhldGEpO1xuICB9XG5cbiAgbm9ybWFsaXplKCkge1xuICAgIHRoaXMucmFkaXVzID0gMTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZXF1YWxzKHYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdi5yYWRpdXMgPT09IHRoaXMucmFkaXVzICYmIHYucGhpID09PSB0aGlzLnBoaSAmJiB2LnRoZXRhID09PSB0aGlzLnRoZXRhXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMucmFkaXVzID0gMC4wO1xuICAgIHRoaXMucGhpID0gMC4wO1xuICAgIHRoaXMudGhldGEgPSAwLjA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCkge1x Line truncated
@@ -0,0 +1,63 @@
import MathUtils from './MathUtils';
import Util from '../utils/Util';
import { MATH_TYPE_SPAN as type } from './types';
export default class Span {
/**
* Span Class. Get a random Number from a to b. Or from c-a to c+b
* @param {Number|Array} a - min number
* @param {Number} b - max number
* @param {Number} center - the center's z value
* @example
* var span = new Span(0,30);
* or
* var span = new Span(["#fff","#ff0","#000"]);
* or
* var span = new Span(5,1,"center");
* @extends {Zone}
* @constructor
*/
constructor(a, b, center = false) {
this._isArray = false;
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
if (Util.isArray(a)) {
this._isArray = true;
this.a = a;
} else {
this.a = Util.initValue(a, 1);
this.b = Util.initValue(b, this.a);
this._center = Util.initValue(center, false);
}
}
/**
* Span.getValue function
* @name get a random Number from a to b. Or get a random Number from c-a to c+b
* @param {number} INT or int
* @return {number} a random Number
*/
getValue(INT) {
if (this._isArray) {
return this.a[this.a.length * Math.random() >> 0];
} else {
if (!this._center) return MathUtils.randomAToB(this.a, this.b, INT);else return MathUtils.randomFloating(this.a, this.b, INT);
}
}
}
export const createSpan = (a, b, c) => {
if (a instanceof Span) return a;
if (b === undefined) {
return new Span(a);
} else {
if (c === undefined) return new Span(a, b);else return new Span(a, b, c);
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL1NwYW4uanMiXSwibmFtZXMiOlsiTWF0aFV0aWxzIiwiVXRpbCIsIk1BVEhfVFlQRV9TUEFOIiwidHlwZSIsIlNwYW4iLCJjb25zdHJ1Y3RvciIsImEiLCJiIiwiY2VudGVyIiwiX2lzQXJyYXkiLCJpc0FycmF5IiwiaW5pdFZhbHVlIiwiX2NlbnRlciIsImdldFZhbHVlIiwiSU5UIiwibGVuZ3RoIiwiTWF0aCIsInJhbmRvbSIsInJhbmRvbUFUb0IiLCJyYW5kb21GbG9hdGluZyIsImNyZWF0ZVNwYW4iLCJjIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxTQUFQLE1BQXNCLGFBQXRCO0FBQ0EsT0FBT0MsSUFBUCxNQUFpQixlQUFqQjtBQUNBLFNBQVNDLGNBQWMsSUFBSUMsSUFBM0IsUUFBdUMsU0FBdkM7QUFFQSxlQUFlLE1BQU1DLElBQU4sQ0FBVztBQUN4QjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0VDLEVBQUFBLFdBQVcsQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKLEVBQU9DLE1BQVAsRUFBZTtBQUN4QixTQUFLQyxRQUFMLEdBQWdCLEtBQWhCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS04sSUFBTCxHQUFZQSxJQUFaOztBQUVBLFFBQUlGLElBQUksQ0FBQ1MsT0FBTCxDQUFhSixDQUFiLENBQUosRUFBcUI7QUFDbkIsV0FBS0csUUFBTCxHQUFnQixJQUFoQjtBQUNBLFdBQUtILENBQUwsR0FBU0EsQ0FBVDtBQUNELEtBSEQsTUFHTztBQUNMLFdBQUtBLENBQUwsR0FBU0wsSUFBSSxDQUFDVSxTQUFMLENBQWVMLENBQWYsRUFBa0IsQ0FBbEIsQ0FBVDtBQUNBLFdBQUtDLENBQUwsR0FBU04sSUFBSSxDQUFDVSxTQUFMLENBQWVKLENBQWYsRUFBa0IsS0FBS0QsQ0FBdkIsQ0FBVDtBQUNBLFdBQUtNLE9BQUwsR0FBZVgsSUFBSSxDQUFDVSxTQUFMLENBQWVILE1BQWYsRUFBdUIsS0FBdkIsQ0FBZjtBQUNEO0FBQ0Y7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFSyxFQUFBQSxRQUFRLENBQUNDLEdBQUQsRUFBTTtBQUNaLFFBQUksS0FBS0wsUUFBVCxFQUFtQjtBQUNqQixhQUFPLEtBQUtILENBQUwsQ0FBUSxLQUFLQSxDQUFMLENBQU9TLE1BQVAsR0FBZ0JDLElBQUksQ0FBQ0MsTUFBTCxFQUFqQixJQUFtQyxDQUExQyxDQUFQO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsVUFBSSxDQUFDLEtBQUtMLE9BQVYsRUFBbUIsT0FBT1osU0FBUyxDQUFDa0IsVUFBVixDQUFxQixLQUFLWixDQUExQixFQUE2QixLQUFLQyxDQUFsQyxFQUFxQ08sR0FBckMsQ0FBUCxDQUFuQixLQUNLLE9BQU9kLFNBQVMsQ0FBQ21CLGNBQVYsQ0FBeUIsS0FBS2IsQ0FBOUIsRUFBaUMsS0FBS0MsQ0FBdEMsRUFBeUNPLEdBQXpDLENBQVA7QUFDTjtBQUNGOztBQS9DdUI7QUFrRDFCLE9BQU8sTUFBTU0sVUFBVSxHQUFHLENBQUNkLENBQUQsRUFBSUMsQ0FBSixFQUFPYyxDQUFQLEtBQWE7QUFDckMsTUFBSWYsQ0FBQyxZQUFZRixJQUFqQixFQUF1QixPQUFPRSxDQUFQOztBQUV2QixNQUFJQyxDQUFDLEtBQUtlLFNBQVYsRUFBcUI7QUFDbkIsV0FBTyxJQUFJbEIsSUFBSixDQUFTRSxDQUFULENBQVA7QUFDRCxHQUZELE1BRU87QUFDTCxRQUFJZSxDQUFDLEtBQUtDLFNBQVYsRUFBcUIsT0FBTyxJQUFJbEIsSUFBSixDQUFTRSxDQUFULEVBQVlDLENBQVosQ0FBUCxDQUFyQixLQUNLLE9BQU8sSUFBSUgsSUFBSixDQUFTRSxDQUFULEVBQVlDLENBQVosRUFBZWMsQ0FBZixDQUFQO0FBQ047QUFDRixDQVRNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1hdGhVdGlscyBmcm9tICcuL01hdGhVdGlscyc7XG5pbXBvcnQgVXRpbCBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IE1BVEhfVFlQRV9TUEFOIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BhbiB7XG4gIC8qKlxuICAgKiBTcGFuIENsYXNzLiBHZXQgYSByYW5kb20gTnVtYmVyIGZyb20gYSB0byBiLiBPciBmcm9tIGMtYSB0byBjK2JcbiAgICogQHBhcmFtIHtOdW1iZXJ8QXJyYXl9IGEgLSBtaW4gbnVtYmVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBiIC0gbWF4IG51bWJlclxuICAgKiBAcGFyYW0ge051bWJlcn0gY2VudGVyIC0gdGhlIGNlbnRlcidzIHogdmFsdWVcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHNwYW4gPSBuZXcgU3BhbigwLDMwKTtcbiAgICogb3JcbiAgICogdmFyIHNwYW4gPSBuZXcgU3BhbihbXCIjZmZmXCIsXCIjZmYwXCIsXCIjMDAwXCJdKTtcbiAgICogb3JcbiAgICogdmFyIHNwYW4gPSBuZXcgU3Bhbig1LDEsXCJjZW50ZXJcIik7XG4gICAqIEBleHRlbmRzIHtab25lfVxuICAgKiBAY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKGEsIGIsIGNlbnRlcikge1xuICAgIHRoaXMuX2lzQXJyYXkgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBjbGFzcyB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gdHlwZTtcblxuICAgIGlmIChVdGlsLmlzQXJyYXkoYSkpIHtcbiAgICAgIHRoaXMuX2lzQXJyYXkgPSB0cnVlO1xuICAgICAgdGhpcy5hID0gYTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hID0gVXRpbC5pbml0VmFsdWUoYSwgMSk7XG4gICAgICB0aGlzLmIgPSBVdGlsLmluaXRWYWx1ZShiLCB0aGlzLmEpO1xuICAgICAgdGhpcy5fY2VudGVyID0gVXRpbC5pbml0VmFsdWUoY2VudGVyLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYW4uZ2V0VmFsdWUgZnVuY3Rpb25cbiAgICogQG5hbWUgZ2V0IGEgcmFuZG9tIE51bWJlciBmcm9tIGEgdG8gYi4gT3IgZ2V0IGEgcmFuZG9tIE51bWJlciBmcm9tIGMtYSB0byBjK2JcbiAgICogQHBhcmFtIHtudW1iZXJ9IElOVCBvciBpbnRcbiAgICogQHJldHVybiB7bnVtYmVyfSBhIHJhbmRvbSBOdW1iZXJcbiAgICovXG4gIGdldFZhbHVlKElOVCkge1xuICAgIGlmICh0aGlzLl9pc0FycmF5KSB7XG4gICAgICByZXR1cm4gdGhpcy5hWyh0aGlzLmEubGVuZ3RoICogTWF0aC5yYW5kb20oKSkgPj4gMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5fY2VudGVyKSByZXR1cm4gTWF0aFV0aWxzLnJhbmRvbUFUb0IodGhpcy5hLCB0aGlzLmIsIElOVCk7XG4gICAgICBlbHNlIHJldHVybiBNYXRoVXRpbHMucmFuZG9tRmxvYXRpbmcodGhpcy5hLCB0aGlzLmIsIElOVCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTcGFuID0gKGEsIGIsIGMpID0+IHtcbiAgaWYgKGEgaW5zdGFuY2VvZiBTcGFuKSByZXR1cm4gYTtcblxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBTcGFuKGEpO1xuICB9IGVsc2Uge1xuICAgIGlmIChjID09PSB1bmRlZmluZWQpIHJldHVybiBuZXcgU3BhbihhLCBiKTtcbiAgICBlbHNlIHJldHVybiBuZXcgU3BhbihhLCBiLCBjKTtcbiAgfVxufTtcbiJdfQ==
@@ -0,0 +1,34 @@
import { Euler, Vector3 } from '../core/three/';
export default class Vector3D extends Vector3 {
clear() {
this.x = 0.0;
this.y = 0.0;
this.z = 0.0;
return this;
}
scalar(s) {
this.x *= s;
this.y *= s;
this.z *= s;
return this;
}
addValue(a, b, c) {
this.x += a;
this.y += b;
this.z += c;
return this;
}
toString() {
return 'x:' + this.x + 'y:' + this.y + 'z:' + this.z;
}
eulerFromDir(vector3D) {
const euler = new Euler();
return euler.setFromVector3(vector3D);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL1ZlY3RvcjNELmpzIl0sIm5hbWVzIjpbIkV1bGVyIiwiVmVjdG9yMyIsIlZlY3RvcjNEIiwiY2xlYXIiLCJ4IiwieSIsInoiLCJzY2FsYXIiLCJzIiwiYWRkVmFsdWUiLCJhIiwiYiIsImMiLCJ0b1N0cmluZyIsImV1bGVyRnJvbURpciIsInZlY3RvcjNEIiwiZXVsZXIiLCJzZXRGcm9tVmVjdG9yMyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBVCxFQUFnQkMsT0FBaEIsUUFBK0IsZ0JBQS9CO0FBRUEsZUFBZSxNQUFNQyxRQUFOLFNBQXVCRCxPQUF2QixDQUErQjtBQUM1Q0UsRUFBQUEsS0FBSyxHQUFHO0FBQ04sU0FBS0MsQ0FBTCxHQUFTLEdBQVQ7QUFDQSxTQUFLQyxDQUFMLEdBQVMsR0FBVDtBQUNBLFNBQUtDLENBQUwsR0FBUyxHQUFUO0FBRUEsV0FBTyxJQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLE1BQU0sQ0FBQ0MsQ0FBRCxFQUFJO0FBQ1IsU0FBS0osQ0FBTCxJQUFVSSxDQUFWO0FBQ0EsU0FBS0gsQ0FBTCxJQUFVRyxDQUFWO0FBQ0EsU0FBS0YsQ0FBTCxJQUFVRSxDQUFWO0FBRUEsV0FBTyxJQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLFFBQVEsQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKLEVBQU9DLENBQVAsRUFBVTtBQUNoQixTQUFLUixDQUFMLElBQVVNLENBQVY7QUFDQSxTQUFLTCxDQUFMLElBQVVNLENBQVY7QUFDQSxTQUFLTCxDQUFMLElBQVVNLENBQVY7QUFFQSxXQUFPLElBQVA7QUFDRDs7QUFFREMsRUFBQUEsUUFBUSxHQUFHO0FBQ1QsV0FBTyxPQUFPLEtBQUtULENBQVosR0FBZ0IsSUFBaEIsR0FBdUIsS0FBS0MsQ0FBNUIsR0FBZ0MsSUFBaEMsR0FBdUMsS0FBS0MsQ0FBbkQ7QUFDRDs7QUFFRFEsRUFBQUEsWUFBWSxDQUFDQyxRQUFELEVBQVc7QUFDckIsVUFBTUMsS0FBSyxHQUFHLElBQUloQixLQUFKLEVBQWQ7QUFFQSxXQUFPZ0IsS0FBSyxDQUFDQyxjQUFOLENBQXFCRixRQUFyQixDQUFQO0FBQ0Q7O0FBakMyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV1bGVyLCBWZWN0b3IzIH0gZnJvbSAnLi4vY29yZS90aHJlZS8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWN0b3IzRCBleHRlbmRzIFZlY3RvcjMge1xuICBjbGVhcigpIHtcbiAgICB0aGlzLnggPSAwLjA7XG4gICAgdGhpcy55ID0gMC4wO1xuICAgIHRoaXMueiA9IDAuMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2NhbGFyKHMpIHtcbiAgICB0aGlzLnggKj0gcztcbiAgICB0aGlzLnkgKj0gcztcbiAgICB0aGlzLnogKj0gcztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkVmFsdWUoYSwgYiwgYykge1xuICAgIHRoaXMueCArPSBhO1xuICAgIHRoaXMueSArPSBiO1xuICAgIHRoaXMueiArPSBjO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ3g6JyArIHRoaXMueCArICd5OicgKyB0aGlzLnkgKyAnejonICsgdGhpcy56O1xuICB9XG5cbiAgZXVsZXJGcm9tRGlyKHZlY3RvcjNEKSB7XG4gICAgY29uc3QgZXVsZXIgPSBuZXcgRXVsZXIoKTtcblxuICAgIHJldHVybiBldWxlci5zZXRGcm9tVmVjdG9yMyh2ZWN0b3IzRCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,24 @@
/**
* @see https://en.wikipedia.org/wiki/Euler_method
* @type {string}
*/
export const INTEGRATION_TYPE_EULER = 'EULER';
/**
* @see http://web.mit.edu/10.001/Web/Course_Notes/Differential_Equations_Notes/node5.html
* @type {string}
*/
export const INTEGRATION_TYPE_RK2 = 'RUNGE_KUTTA_2';
/**
* @see http://web.mit.edu/10.001/Web/Course_Notes/Differential_Equations_Notes/node5.html
* @type {string}
*/
export const INTEGRATION_TYPE_RK4 = 'RUNGE_KUTTA_4';
/**
* @see https://en.wikipedia.org/wiki/Verlet_integration
* @type {string}
*/
export const INTEGRATION_TYPE_VERLET = 'VERLET';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL2NvbnN0YW50cy5qcyJdLCJuYW1lcyI6WyJJTlRFR1JBVElPTl9UWVBFX0VVTEVSIiwiSU5URUdSQVRJT05fVFlQRV9SSzIiLCJJTlRFR1JBVElPTl9UWVBFX1JLNCIsIklOVEVHUkFUSU9OX1RZUEVfVkVSTEVUIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTUEsc0JBQXNCLEdBQUcsT0FBL0I7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1DLG9CQUFvQixHQUFHLGVBQTdCO0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxvQkFBb0IsR0FBRyxlQUE3QjtBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTUMsdUJBQXVCLEdBQUcsUUFBaEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXVsZXJfbWV0aG9kXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgSU5URUdSQVRJT05fVFlQRV9FVUxFUiA9ICdFVUxFUic7XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd2ViLm1pdC5lZHUvMTAuMDAxL1dlYi9Db3Vyc2VfTm90ZXMvRGlmZmVyZW50aWFsX0VxdWF0aW9uc19Ob3Rlcy9ub2RlNS5odG1sXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgSU5URUdSQVRJT05fVFlQRV9SSzIgPSAnUlVOR0VfS1VUVEFfMic7XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd2ViLm1pdC5lZHUvMTAuMDAxL1dlYi9Db3Vyc2VfTm90ZXMvRGlmZmVyZW50aWFsX0VxdWF0aW9uc19Ob3Rlcy9ub2RlNS5odG1sXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgSU5URUdSQVRJT05fVFlQRV9SSzQgPSAnUlVOR0VfS1VUVEFfNCc7XG5cbi8qKlxuICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WZXJsZXRfaW50ZWdyYXRpb25cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBJTlRFR1JBVElPTl9UWVBFX1ZFUkxFVCA9ICdWRVJMRVQnO1xuIl19
@@ -0,0 +1,10 @@
export { default as ArraySpan, createArraySpan } from './ArraySpan';
export { default as ColorSpan, createColorSpan } from './ColorSpan';
export { default as Box } from './Box';
export { integrate } from './integration';
export { default as MathUtils } from './MathUtils';
export { default as Polar3D } from './Polar3D';
export { default as Span, createSpan } from './Span';
export { default as Vector3D } from './Vector3D';
export { INTEGRATION_TYPE_EULER, INTEGRATION_TYPE_RK2, INTEGRATION_TYPE_RK4, INTEGRATION_TYPE_VERLET } from './constants';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL2luZGV4LmpzIl0sIm5hbWVzIjpbImRlZmF1bHQiLCJBcnJheVNwYW4iLCJjcmVhdGVBcnJheVNwYW4iLCJDb2xvclNwYW4iLCJjcmVhdGVDb2xvclNwYW4iLCJCb3giLCJpbnRlZ3JhdGUiLCJNYXRoVXRpbHMiLCJQb2xhcjNEIiwiU3BhbiIsImNyZWF0ZVNwYW4iLCJWZWN0b3IzRCIsIklOVEVHUkFUSU9OX1RZUEVfRVVMRVIiLCJJTlRFR1JBVElPTl9UWVBFX1JLMiIsIklOVEVHUkFUSU9OX1RZUEVfUks0IiwiSU5URUdSQVRJT05fVFlQRV9WRVJMRVQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sSUFBSUMsU0FBcEIsRUFBK0JDLGVBQS9CLFFBQXNELGFBQXREO0FBQ0EsU0FBU0YsT0FBTyxJQUFJRyxTQUFwQixFQUErQkMsZUFBL0IsUUFBc0QsYUFBdEQ7QUFDQSxTQUFTSixPQUFPLElBQUlLLEdBQXBCLFFBQStCLE9BQS9CO0FBQ0EsU0FBU0MsU0FBVCxRQUEwQixlQUExQjtBQUNBLFNBQVNOLE9BQU8sSUFBSU8sU0FBcEIsUUFBcUMsYUFBckM7QUFDQSxTQUFTUCxPQUFPLElBQUlRLE9BQXBCLFFBQW1DLFdBQW5DO0FBQ0EsU0FBU1IsT0FBTyxJQUFJUyxJQUFwQixFQUEwQkMsVUFBMUIsUUFBNEMsUUFBNUM7QUFDQSxTQUFTVixPQUFPLElBQUlXLFFBQXBCLFFBQW9DLFlBQXBDO0FBQ0EsU0FDRUMsc0JBREYsRUFFRUMsb0JBRkYsRUFHRUMsb0JBSEYsRUFJRUMsdUJBSkYsUUFLTyxhQUxQIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBBcnJheVNwYW4sIGNyZWF0ZUFycmF5U3BhbiB9IGZyb20gJy4vQXJyYXlTcGFuJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ29sb3JTcGFuLCBjcmVhdGVDb2xvclNwYW4gfSBmcm9tICcuL0NvbG9yU3Bhbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJveCB9IGZyb20gJy4vQm94JztcbmV4cG9ydCB7IGludGVncmF0ZSB9IGZyb20gJy4vaW50ZWdyYXRpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXRoVXRpbHMgfSBmcm9tICcuL01hdGhVdGlscyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBvbGFyM0QgfSBmcm9tICcuL1BvbGFyM0QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTcGFuLCBjcmVhdGVTcGFuIH0gZnJvbSAnLi9TcGFuJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVmVjdG9yM0QgfSBmcm9tICcuL1ZlY3RvcjNEJztcbmV4cG9ydCB7XG4gIElOVEVHUkFUSU9OX1RZUEVfRVVMRVIsXG4gIElOVEVHUkFUSU9OX1RZUEVfUksyLFxuICBJTlRFR1JBVElPTl9UWVBFX1JLNCxcbiAgSU5URUdSQVRJT05fVFlQRV9WRVJMRVRcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuIl19
@@ -0,0 +1,47 @@
import { INTEGRATION_TYPE_EULER } from './constants';
import { DEFAULT_SYSTEM_DELTA } from '../core/constants';
/**
* Performs euler integration on the particle.
*
* @param {Particle} particle - The particle to integrate
* @param {number} time - The factor of time to use
* @param {number} damping - The damping to use
* @return void
*/
const eulerIntegration = (particle, time, damping) => {
if (particle.sleep) {
return;
}
particle.old.position.copy(particle.position);
particle.old.velocity.copy(particle.velocity);
particle.acceleration.scalar(1 / particle.mass);
particle.velocity.add(particle.acceleration.scalar(time));
particle.position.add(particle.old.velocity.scalar(time));
damping && particle.velocity.scalar(Math.pow(damping, time / DEFAULT_SYSTEM_DELTA));
particle.acceleration.clear();
};
/**
* Performs the chosen integration on the particle.
* Defaults to euler integration.
*
* @param {Particle} particle - The particle to integrate
* @param {number} time - The factor of time to use
* @param {number} damping - The damping to use
* @param {string} [type=INTEGRATION_TYPE_EULER] - The algorithm to use
* @return void
*/
export const integrate = (particle, time, damping, type = INTEGRATION_TYPE_EULER) => {
switch (type) {
case INTEGRATION_TYPE_EULER:
eulerIntegration(particle, time, damping);
break;
default:
eulerIntegration(particle, time, damping);
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL2ludGVncmF0aW9uLmpzIl0sIm5hbWVzIjpbIklOVEVHUkFUSU9OX1RZUEVfRVVMRVIiLCJERUZBVUxUX1NZU1RFTV9ERUxUQSIsImV1bGVySW50ZWdyYXRpb24iLCJwYXJ0aWNsZSIsInRpbWUiLCJkYW1waW5nIiwic2xlZXAiLCJvbGQiLCJwb3NpdGlvbiIsImNvcHkiLCJ2ZWxvY2l0eSIsImFjY2VsZXJhdGlvbiIsInNjYWxhciIsIm1hc3MiLCJhZGQiLCJNYXRoIiwicG93IiwiY2xlYXIiLCJpbnRlZ3JhdGUiLCJ0eXBlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxzQkFBVCxRQUF1QyxhQUF2QztBQUNBLFNBQVNDLG9CQUFULFFBQXFDLG1CQUFyQztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQ0MsUUFBRCxFQUFXQyxJQUFYLEVBQWlCQyxPQUFqQixLQUE2QjtBQUNwRCxNQUFJRixRQUFRLENBQUNHLEtBQWIsRUFBb0I7QUFDbEI7QUFDRDs7QUFFREgsRUFBQUEsUUFBUSxDQUFDSSxHQUFULENBQWFDLFFBQWIsQ0FBc0JDLElBQXRCLENBQTJCTixRQUFRLENBQUNLLFFBQXBDO0FBQ0FMLEVBQUFBLFFBQVEsQ0FBQ0ksR0FBVCxDQUFhRyxRQUFiLENBQXNCRCxJQUF0QixDQUEyQk4sUUFBUSxDQUFDTyxRQUFwQztBQUNBUCxFQUFBQSxRQUFRLENBQUNRLFlBQVQsQ0FBc0JDLE1BQXRCLENBQTZCLElBQUlULFFBQVEsQ0FBQ1UsSUFBMUM7QUFDQVYsRUFBQUEsUUFBUSxDQUFDTyxRQUFULENBQWtCSSxHQUFsQixDQUFzQlgsUUFBUSxDQUFDUSxZQUFULENBQXNCQyxNQUF0QixDQUE2QlIsSUFBN0IsQ0FBdEI7QUFDQUQsRUFBQUEsUUFBUSxDQUFDSyxRQUFULENBQWtCTSxHQUFsQixDQUFzQlgsUUFBUSxDQUFDSSxHQUFULENBQWFHLFFBQWIsQ0FBc0JFLE1BQXRCLENBQTZCUixJQUE3QixDQUF0QjtBQUNBQyxFQUFBQSxPQUFPLElBQ0xGLFFBQVEsQ0FBQ08sUUFBVCxDQUFrQkUsTUFBbEIsQ0FBeUJHLElBQUksQ0FBQ0MsR0FBTCxDQUFTWCxPQUFULEVBQWtCRCxJQUFJLEdBQUdILG9CQUF6QixDQUF6QixDQURGO0FBRUFFLEVBQUFBLFFBQVEsQ0FBQ1EsWUFBVCxDQUFzQk0sS0FBdEI7QUFDRCxDQWJEO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLE9BQU8sTUFBTUMsU0FBUyxHQUFHLENBQ3ZCZixRQUR1QixFQUV2QkMsSUFGdUIsRUFHdkJDLE9BSHVCLEVBSXZCYyxJQUFJLEdBQUduQixzQkFKZ0IsS0FLcEI7QUFDSCxVQUFRbUIsSUFBUjtBQUNFLFNBQUtuQixzQkFBTDtBQUNFRSxNQUFBQSxnQkFBZ0IsQ0FBQ0MsUUFBRCxFQUFXQyxJQUFYLEVBQWlCQyxPQUFqQixDQUFoQjtBQUNBOztBQUNGO0FBQ0VILE1BQUFBLGdCQUFnQixDQUFDQyxRQUFELEVBQVdDLElBQVgsRUFBaUJDLE9BQWpCLENBQWhCO0FBTEo7QUFPRCxDQWJNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSU5URUdSQVRJT05fVFlQRV9FVUxFUiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IERFRkFVTFRfU1lTVEVNX0RFTFRBIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMnO1xuXG4vKipcbiAqIFBlcmZvcm1zIGV1bGVyIGludGVncmF0aW9uIG9uIHRoZSBwYXJ0aWNsZS5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBpbnRlZ3JhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGZhY3RvciBvZiB0aW1lIHRvIHVzZVxuICogQHBhcmFtIHtudW1iZXJ9IGRhbXBpbmcgLSBUaGUgZGFtcGluZyB0byB1c2VcbiAqIEByZXR1cm4gdm9pZFxuICovXG5jb25zdCBldWxlckludGVncmF0aW9uID0gKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKSA9PiB7XG4gIGlmIChwYXJ0aWNsZS5zbGVlcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBhcnRpY2xlLm9sZC5wb3NpdGlvbi5jb3B5KHBhcnRpY2xlLnBvc2l0aW9uKTtcbiAgcGFydGljbGUub2xkLnZlbG9jaXR5LmNvcHkocGFydGljbGUudmVsb2NpdHkpO1xuICBwYXJ0aWNsZS5hY2NlbGVyYXRpb24uc2NhbGFyKDEgLyBwYXJ0aWNsZS5tYXNzKTtcbiAgcGFydGljbGUudmVsb2NpdHkuYWRkKHBhcnRpY2xlLmFjY2VsZXJhdGlvbi5zY2FsYXIodGltZSkpO1xuICBwYXJ0aWNsZS5wb3NpdGlvbi5hZGQocGFydGljbGUub2xkLnZlbG9jaXR5LnNjYWxhcih0aW1lKSk7XG4gIGRhbXBpbmcgJiZcbiAgICBwYXJ0aWNsZS52ZWxvY2l0eS5zY2FsYXIoTWF0aC5wb3coZGFtcGluZywgdGltZSAvIERFRkFVTFRfU1lTVEVNX0RFTFRBKSk7XG4gIHBhcnRpY2xlLmFjY2VsZXJhdGlvbi5jbGVhcigpO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgY2hvc2VuIGludGVncmF0aW9uIG9uIHRoZSBwYXJ0aWNsZS5cbiAqIERlZmF1bHRzIHRvIGV1bGVyIGludGVncmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGludGVncmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgZmFjdG9yIG9mIHRpbWUgdG8gdXNlXG4gKiBAcGFyYW0ge251bWJlcn0gZGFtcGluZyAtIFRoZSBkYW1waW5nIHRvIHVzZVxuICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPUlOVEVHUkFUSU9OX1RZUEVfRVVMRVJdIC0gVGhlIGFsZ29yaXRobSB0byB1c2VcbiAqIEByZXR1cm4gdm9pZFxuICovXG5leHBvcnQgY29uc3QgaW50ZWdyYXRlID0gKFxuICBwYXJ0aWNsZSxcbiAgdGltZSxcbiAgZGFtcGluZyxcbiAgdHlwZSA9IElOVEVHUkFUSU9OX1RZUEVfRVVMRVJcbikgPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIElOVEVHUkFUSU9OX1RZUEVfRVVMRVI6XG4gICAgICBldWxlckludGVncmF0aW9uKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBldWxlckludGVncmF0aW9uKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKTtcbiAgfVxufTtcbiJdfQ==
@@ -0,0 +1,7 @@
export const MATH_TYPE_ARRAY_SPAN = 'ArraySpan';
export const MATH_TYPE_COLOR_SPAN = 'ColorSpan';
export const MATH_TYPE_BOX = 'Box';
export const MATH_TYPE_POLAR_3D = 'Polar3D';
export const MATH_TYPE_SPAN = 'Span';
export const MATH_TYPE_VECTOR_3D = 'Vector3D';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXRoL3R5cGVzLmpzIl0sIm5hbWVzIjpbIk1BVEhfVFlQRV9BUlJBWV9TUEFOIiwiTUFUSF9UWVBFX0NPTE9SX1NQQU4iLCJNQVRIX1RZUEVfQk9YIiwiTUFUSF9UWVBFX1BPTEFSXzNEIiwiTUFUSF9UWVBFX1NQQU4iLCJNQVRIX1RZUEVfVkVDVE9SXzNEIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU1BLG9CQUFvQixHQUFHLFdBQTdCO0FBQ1AsT0FBTyxNQUFNQyxvQkFBb0IsR0FBRyxXQUE3QjtBQUNQLE9BQU8sTUFBTUMsYUFBYSxHQUFHLEtBQXRCO0FBQ1AsT0FBTyxNQUFNQyxrQkFBa0IsR0FBRyxTQUEzQjtBQUNQLE9BQU8sTUFBTUMsY0FBYyxHQUFHLE1BQXZCO0FBQ1AsT0FBTyxNQUFNQyxtQkFBbUIsR0FBRyxVQUE1QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBNQVRIX1RZUEVfQVJSQVlfU1BBTiA9ICdBcnJheVNwYW4nO1xuZXhwb3J0IGNvbnN0IE1BVEhfVFlQRV9DT0xPUl9TUEFOID0gJ0NvbG9yU3Bhbic7XG5leHBvcnQgY29uc3QgTUFUSF9UWVBFX0JPWCA9ICdCb3gnO1xuZXhwb3J0IGNvbnN0IE1BVEhfVFlQRV9QT0xBUl8zRCA9ICdQb2xhcjNEJztcbmV4cG9ydCBjb25zdCBNQVRIX1RZUEVfU1BBTiA9ICdTcGFuJztcbmV4cG9ydCBjb25zdCBNQVRIX1RZUEVfVkVDVE9SXzNEID0gJ1ZlY3RvcjNEJztcbiJdfQ==
@@ -0,0 +1,76 @@
import { PARTICLE_CREATED, PARTICLE_DEAD, PARTICLE_UPDATE, SYSTEM_UPDATE } from '../events/constants';
import { RENDERER_TYPE_BASE } from './types';
import { __DEV__ } from '../constants';
export default class BaseRenderer {
constructor(type = RENDERER_TYPE_BASE) {
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
}
init(system) {
var self = this;
this.system = system;
this.system.eventDispatcher.addEventListener(SYSTEM_UPDATE, function (system) {
self.onSystemUpdate.call(self, system);
});
this.system.eventDispatcher.addEventListener(PARTICLE_CREATED, function (particle) {
self.onParticleCreated.call(self, particle);
});
this.system.eventDispatcher.addEventListener(PARTICLE_UPDATE, function (particle) {
self.onParticleUpdate.call(self, particle);
});
this.system.eventDispatcher.addEventListener(PARTICLE_DEAD, function (particle) {
self.onParticleDead.call(self, particle);
});
this.logRendererType();
}
remove() {
this.system = null;
}
/**
* @abstract
*/
onParticleCreated(particle) {} // eslint-disable-line
/**
* @abstract
*/
onParticleUpdate(particle) {} // eslint-disable-line
/**
* @abstract
*/
onParticleDead(particle) {} // eslint-disable-line
/**
* @abstract
*/
onSystemUpdate(system) {} // eslint-disable-line
/**
* Logs the renderer type being used when in development mode.
*
* @return void
*/
logRendererType() {
if (!__DEV__) {
return;
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZW5kZXJlci9CYXNlUmVuZGVyZXIuanMiXSwibmFtZXMiOlsiUEFSVElDTEVfQ1JFQVRFRCIsIlBBUlRJQ0xFX0RFQUQiLCJQQVJUSUNMRV9VUERBVEUiLCJTWVNURU1fVVBEQVRFIiwiUkVOREVSRVJfVFlQRV9CQVNFIiwiX19ERVZfXyIsIkJhc2VSZW5kZXJlciIsImNvbnN0cnVjdG9yIiwidHlwZSIsImluaXQiLCJzeXN0ZW0iLCJzZWxmIiwiZXZlbnREaXNwYXRjaGVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uU3lzdGVtVXBkYXRlIiwiY2FsbCIsInBhcnRpY2xlIiwib25QYXJ0aWNsZUNyZWF0ZWQiLCJvblBhcnRpY2xlVXBkYXRlIiwib25QYXJ0aWNsZURlYWQiLCJsb2dSZW5kZXJlclR5cGUiLCJyZW1vdmUiLCJjb25zb2xlIiwibG9nIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUNFQSxnQkFERixFQUVFQyxhQUZGLEVBR0VDLGVBSEYsRUFJRUMsYUFKRixRQUtPLHFCQUxQO0FBT0EsU0FBU0Msa0JBQVQsUUFBbUMsU0FBbkM7QUFDQSxTQUFTQyxPQUFULFFBQXdCLGNBQXhCO0FBRUEsZUFBZSxNQUFNQyxZQUFOLENBQW1CO0FBQ2hDQyxFQUFBQSxXQUFXLENBQUNDLElBQUksR0FBR0osa0JBQVIsRUFBNEI7QUFDckM7QUFDSjtBQUNBO0FBQ0E7QUFDSSxTQUFLSSxJQUFMLEdBQVlBLElBQVo7QUFDRDs7QUFFREMsRUFBQUEsSUFBSSxDQUFDQyxNQUFELEVBQVM7QUFDWCxRQUFJQyxJQUFJLEdBQUcsSUFBWDtBQUVBLFNBQUtELE1BQUwsR0FBY0EsTUFBZDtBQUVBLFNBQUtBLE1BQUwsQ0FBWUUsZUFBWixDQUE0QkMsZ0JBQTVCLENBQTZDVixhQUE3QyxFQUE0RCxVQUMxRE8sTUFEMEQsRUFFMUQ7QUFDQUMsTUFBQUEsSUFBSSxDQUFDRyxjQUFMLENBQW9CQyxJQUFwQixDQUF5QkosSUFBekIsRUFBK0JELE1BQS9CO0FBQ0QsS0FKRDtBQU1BLFNBQUtBLE1BQUwsQ0FBWUUsZUFBWixDQUE0QkMsZ0JBQTVCLENBQTZDYixnQkFBN0MsRUFBK0QsVUFDN0RnQixRQUQ2RCxFQUU3RDtBQUNBTCxNQUFBQSxJQUFJLENBQUNNLGlCQUFMLENBQXVCRixJQUF2QixDQUE0QkosSUFBNUIsRUFBa0NLLFFBQWxDO0FBQ0QsS0FKRDtBQU1BLFNBQUtOLE1BQUwsQ0FBWUUsZUFBWixDQUE0QkMsZ0JBQTVCLENBQTZDWCxlQUE3QyxFQUE4RCxVQUM1RGMsUUFENEQsRUFFNUQ7QUFDQUwsTUFBQUEsSUFBSSxDQUFDTyxnQkFBTCxDQUFzQkgsSUFBdEIsQ0FBMkJKLElBQTNCLEVBQWlDSyxRQUFqQztBQUNELEtBSkQ7QUFNQSxTQUFLTixNQUFMLENBQVlFLGVBQVosQ0FBNEJDLGdCQUE1QixDQUE2Q1osYUFBN0MsRUFBNEQsVUFDMURlLFFBRDBELEVBRTFEO0FBQ0FMLE1BQUFBLElBQUksQ0FBQ1EsY0FBTCxDQUFvQkosSUFBcEIsQ0FBeUJKLElBQXpCLEVBQStCSyxRQUEvQjtBQUNELEtBSkQ7QUFNQSxTQUFLSSxlQUFMO0FBQ0Q7O0FBRURDLEVBQUFBLE1BQU0sR0FBRztBQUNQLFNBQUtYLE1BQUwsR0FBYyxJQUFkO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7OztBQUNFTyxFQUFBQSxpQkFBaUIsQ0FBQ0QsUUFBRCxFQUFXLENBQUUsQ0FoREUsQ0FnREQ7O0FBRS9CO0FBQ0Y7QUFDQTs7O0FBQ0VFLEVBQUFBLGdCQUFnQixDQUFDRixRQUFELEVBQVcsQ0FBRSxDQXJERyxDQXFERjs7QUFFOUI7QUFDRjtBQUNBOzs7QUFDRUcsRUFBQUEsY0FBYyxDQUFDSCxRQUFELEVBQVcsQ0FBRSxDQTFESyxDQTBESjs7QUFFNUI7QUFDRjtBQUNBOzs7QUFDRUYsRUFBQUEsY0FBYyxDQUFDSixNQUFELEVBQVMsQ0FBRSxDQS9ETyxDQStETjs7QUFFMUI7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VVLEVBQUFBLGVBQWUsR0FBRztBQUNoQixRQUFJLENBQUNmLE9BQUwsRUFBYztBQUNaO0FBQ0Q7O0FBRURpQixJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxHQUFFLEtBQUtmLElBQUssRUFBekI7QUFDRDs7QUE1RStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUEFSVElDTEVfQ1JFQVRFRCxcbiAgUEFSVElDTEVfREVBRCxcbiAgUEFSVElDTEVfVVBEQVRFLFxuICBTWVNURU1fVVBEQVRFLFxufSBmcm9tICcuLi9ldmVudHMvY29uc3RhbnRzJztcblxuaW1wb3J0IHsgUkVOREVSRVJfVFlQRV9CQVNFIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBfX0RFVl9fIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IodHlwZSA9IFJFTkRFUkVSX1RZUEVfQkFTRSkge1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBjbGFzcyB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIGluaXQoc3lzdGVtKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5zeXN0ZW0gPSBzeXN0ZW07XG5cbiAgICB0aGlzLnN5c3RlbS5ldmVudERpc3BhdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcihTWVNURU1fVVBEQVRFLCBmdW5jdGlvbihcbiAgICAgIHN5c3RlbVxuICAgICkge1xuICAgICAgc2VsZi5vblN5c3RlbVVwZGF0ZS5jYWxsKHNlbGYsIHN5c3RlbSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN5c3RlbS5ldmVudERpc3BhdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcihQQVJUSUNMRV9DUkVBVEVELCBmdW5jdGlvbihcbiAgICAgIHBhcnRpY2xlXG4gICAgKSB7XG4gICAgICBzZWxmLm9uUGFydGljbGVDcmVhdGVkLmNhbGwoc2VsZiwgcGFydGljbGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zeXN0ZW0uZXZlbnREaXNwYXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIoUEFSVElDTEVfVVBEQVRFLCBmdW5jdGlvbihcbiAgICAgIHBhcnRpY2xlXG4gICAgKSB7XG4gICAgICBzZWxmLm9uUGFydGljbGVVcGRhdGUuY2FsbChzZWxmLCBwYXJ0aWNsZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN5c3RlbS5ldmVudERpc3BhdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcihQQVJUSUNMRV9ERUFELCBmdW5jdGlvbihcbiAgICAgIHBhcnRpY2xlXG4gICAgKSB7XG4gICAgICBzZWxmLm9uUGFydGljbGVEZWFkLmNhbGwoc2VsZiwgcGFydGljbGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2dSZW5kZXJlclR5cGUoKTtcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLnN5c3RlbSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIG9uU3lzdGVtVXBkYXRlKHN5c3RlbSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSByZW5kZXJlciB0eXBlIGJlaW5nIHVzZWQgd2hlbiBpbiBkZXZlbG9wbWVudCBtb2RlLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGxvZ1JlbmRlcmVyVHlwZSgpIHtcbiAgICBpZiAoIV9fREVWX18pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgJHt0aGlzLnR5cGV9YCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,23 @@
import BaseRenderer from './BaseRenderer';
import { Pool } from '../core';
import { RENDERER_TYPE_CUSTOM as type } from './types';
export default class CustomRenderer extends BaseRenderer {
constructor() {
super(type);
this.targetPool = new Pool();
this.materialPool = new Pool();
}
onSystemUpdate() {}
onParticleCreated(particle) {} // eslint-disable-line
onParticleUpdate(particle) {} // eslint-disable-line
onParticleDead(particle) {} // eslint-disable-line
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZW5kZXJlci9DdXN0b21SZW5kZXJlci5qcyJdLCJuYW1lcyI6WyJCYXNlUmVuZGVyZXIiLCJQb29sIiwiUkVOREVSRVJfVFlQRV9DVVNUT00iLCJ0eXBlIiwiQ3VzdG9tUmVuZGVyZXIiLCJjb25zdHJ1Y3RvciIsInRhcmdldFBvb2wiLCJtYXRlcmlhbFBvb2wiLCJvblN5c3RlbVVwZGF0ZSIsIm9uUGFydGljbGVDcmVhdGVkIiwicGFydGljbGUiLCJvblBhcnRpY2xlVXBkYXRlIiwib25QYXJ0aWNsZURlYWQiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVAsTUFBeUIsZ0JBQXpCO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixTQUFyQjtBQUNBLFNBQVNDLG9CQUFvQixJQUFJQyxJQUFqQyxRQUE2QyxTQUE3QztBQUVBLGVBQWUsTUFBTUMsY0FBTixTQUE2QkosWUFBN0IsQ0FBMEM7QUFDdkRLLEVBQUFBLFdBQVcsR0FBRztBQUNaLFVBQU1GLElBQU47QUFFQSxTQUFLRyxVQUFMLEdBQWtCLElBQUlMLElBQUosRUFBbEI7QUFDQSxTQUFLTSxZQUFMLEdBQW9CLElBQUlOLElBQUosRUFBcEI7QUFDRDs7QUFFRE8sRUFBQUEsY0FBYyxHQUFHLENBQUU7O0FBRW5CQyxFQUFBQSxpQkFBaUIsQ0FBQ0MsUUFBRCxFQUFXLENBQUUsQ0FWeUIsQ0FVeEI7OztBQUUvQkMsRUFBQUEsZ0JBQWdCLENBQUNELFFBQUQsRUFBVyxDQUFFLENBWjBCLENBWXpCOzs7QUFFOUJFLEVBQUFBLGNBQWMsQ0FBQ0YsUUFBRCxFQUFXLENBQUUsQ0FkNEIsQ0FjM0I7OztBQWQyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSAnLi9CYXNlUmVuZGVyZXInO1xuaW1wb3J0IHsgUG9vbCB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgUkVOREVSRVJfVFlQRV9DVVNUT00gYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDdXN0b21SZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHR5cGUpO1xuXG4gICAgdGhpcy50YXJnZXRQb29sID0gbmV3IFBvb2woKTtcbiAgICB0aGlzLm1hdGVyaWFsUG9vbCA9IG5ldyBQb29sKCk7XG4gIH1cblxuICBvblN5c3RlbVVwZGF0ZSgpIHt9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbn1cbiJdfQ==
@@ -0,0 +1,357 @@
import _defineProperty from "@babel/runtime/helpers/defineProperty";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import { ParticleBuffer, Target, TextureAtlas, UniqueList } from '../common';
import { fragmentShader, vertexShader } from './shaders';
import BaseRenderer from '../../BaseRenderer';
import { DEFAULT_RENDERER_OPTIONS } from '../common/constants';
import { Pool } from '../../../core';
import { RENDERER_TYPE_GPU_DESKTOP } from '../../types';
let THREE;
/**
* GPURenderer for devices that support floating point textures.
*
* @author thrax <manthrax@gmail.com>
* @author rohan-deshpande <rohan@creativelifeform.com>
*/
export default class DesktopGPURenderer extends BaseRenderer {
constructor(container, three, options = DEFAULT_RENDERER_OPTIONS) {
super(RENDERER_TYPE_GPU_DESKTOP);
THREE = this.three = three;
const props = _objectSpread(_objectSpread({}, DEFAULT_RENDERER_OPTIONS), options);
const {
camera,
maxParticles,
baseColor,
blending,
depthTest,
depthWrite,
transparent,
shouldDebugTextureAtlas
} = props;
const particleBuffer = new ParticleBuffer(maxParticles, THREE);
const material = new THREE.ShaderMaterial({
uniforms: {
baseColor: {
value: new THREE.Color(baseColor)
},
uTexture: {
value: null
},
atlasIndex: {
value: null
}
},
vertexShader: vertexShader(),
fragmentShader: fragmentShader(),
blending: THREE[blending],
depthTest,
depthWrite,
transparent
});
this.container = container;
this.camera = camera;
this.targetPool = new Pool();
this.uniqueList = new UniqueList(maxParticles);
this.particleBuffer = particleBuffer;
this.buffer = particleBuffer.buffer;
this.stride = particleBuffer.stride;
this.geometry = particleBuffer.geometry;
this.material = material;
this.points = new THREE.Points(this.geometry, this.material);
this.points.frustumCulled = false;
this.shouldDebugTextureAtlas = shouldDebugTextureAtlas;
this.container.add(this.points);
}
onSystemUpdate(system) {
super.onSystemUpdate(system);
this.buffer.needsUpdate = true;
this.textureAtlas && this.textureAtlas.update();
}
/**
* Pools the particle target if it does not exist.
* Updates the target and maps particle properties to the point.
*
* @param {Particle}
*/
onParticleCreated(particle) {
if (!particle.target) {
particle.target = this.targetPool.get(Target, THREE);
this.uniqueList.add(particle.id);
}
this.updateTarget(particle).mapParticleTargetPropsToPoint(particle);
}
/**
* Maps particle properties to the point if the particle has a target.
*
* @param {Particle}
*/
onParticleUpdate(particle) {
if (!particle.target) {
return;
}
this.updateTarget(particle).mapParticleTargetPropsToPoint(particle);
}
/**
* Resets and clears the particle target.
*
* @param {Particle}
*/
onParticleDead(particle) {
if (!particle.target) {
return;
}
particle.target.reset();
this.mapParticleTargetPropsToPoint(particle);
particle.target = null;
}
/**
* Maps all mutable properties from the particle to the target.
*
* @param {Particle}
* @return {DesktopGPURenderer}
*/
updateTarget(particle) {
const {
position,
rotation,
scale,
radius,
color,
alpha,
body,
id
} = particle;
const {
r,
g,
b
} = color;
particle.target.position.copy(position);
particle.target.rotation.copy(rotation);
particle.target.size = scale * radius;
particle.target.color.setRGB(r, g, b);
particle.target.alpha = alpha;
particle.target.index = this.uniqueList.find(id);
if (body && body instanceof THREE.Sprite) {
const {
map
} = body.material;
particle.target.texture = map;
particle.target.textureIndex = this.getTextureID(map, this.shouldDebugTextureAtlas);
}
return this;
}
/**
* Entry point for mapping particle properties to buffer geometry points.
*
* @param {Particle} particle - The particle containing the properties to map
* @return {DesktopGPURenderer}
*/
mapParticleTargetPropsToPoint(particle) {
this.updatePointPosition(particle).updatePointSize(particle).updatePointRotation(particle).updatePointColor(particle).updatePointAlpha(particle).updatePointTextureIndex(particle);
return this;
}
/**
* Updates the point's position according to the particle's target position.
*
* @param {Particle} particle - The particle containing the target position.
* @return {DesktopGPURenderer}
*/
updatePointPosition(particle) {
const attribute = 'position';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.position.x;
buffer.array[target.index * stride + offset + 1] = target.position.y;
buffer.array[target.index * stride + offset + 2] = target.position.z;
return this;
}
/**
* Updates the point's size relative to the particle's target scale and radius.
*
* @param {Particle} particle - The particle containing the target scale.
* @return {DesktopGPURenderer}
*/
updatePointSize(particle) {
const attribute = 'size';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.size;
return this;
}
/**
* Updates the point's rotation.
*
* @param {Particle} particle - The particle containing the target rotation.
* @return {DesktopGPURenderer}
*/
updatePointRotation(particle) {
const attribute = 'rotation';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.rotation.z;
return this;
}
/**
* Updates the point's color attribute according with the particle's target color.
*
* @param {Particle} particle - The particle containing the target color and alpha.
* @return {DesktopGPURenderer}
*/
updatePointColor(particle) {
const attribute = 'color';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.color.r;
buffer.array[target.index * stride + offset + 1] = target.color.g;
buffer.array[target.index * stride + offset + 2] = target.color.b;
return this;
}
/**
* Updates the point alpha attribute with the particle's target alpha.
*
* @param {Particle} particle - The particle containing the target alpha.
* @return {DesktopGPURenderer}
*/
updatePointAlpha(particle) {
const attribute = 'alpha';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.alpha;
return this;
}
/**
* Updates the point texture attribute with the particle's target texture.
*
* @param {Particle} particle - The particle containing the target texture.
* @return {DesktopGPURenderer}
*/
updatePointTextureIndex(particle) {
const attribute = 'texID';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.textureIndex;
return this;
}
getTextureID(texture, debug) {
if (texture.textureIndex === undefined) {
if (!this.textureAtlas) {
this.textureAtlas = new TextureAtlas(this, debug);
}
this.textureAtlas.addTexture(texture);
}
return texture.textureIndex;
}
/**
* Tears down the GPURenderer.
*
* @return void
*/
destroy() {
const {
container,
points,
textureAtlas,
uniqueList
} = this;
container.remove(points);
uniqueList.destroy();
textureAtlas && textureAtlas.destroy();
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9EZXNrdG9wL2luZGV4LmpzIl0sIm5hbWVzIjpbIlBhcnRpY2xlQnVmZmVyIiwiVGFyZ2V0IiwiVGV4dHVyZUF0bGFzIiwiVW5pcXVlTGlzdCIsImZyYWdtZW50U2hhZGVyIiwidmVydGV4U2hhZGVyIiwiQmFzZVJlbmRlcmVyIiwiREVGQVVMVF9SRU5ERVJFUl9PUFRJT05TIiwiUG9vbCIsIlJFTkRFUkVSX1RZUEVfR1BVX0RFU0tUT1AiLCJUSFJFRSIsIkRlc2t0b3BHUFVSZW5kZXJlciIsImNvbnN0cnVjdG9yIiwiY29udGFpbmVyIiwidGhyZWUiLCJvcHRpb25zIiwicHJvcHMiLCJjYW1lcmEiLCJtYXhQYXJ0aWNsZXMiLCJiYXNlQ29sb3IiLCJibGVuZGluZyIsImRlcHRoVGVzdCIsImRlcHRoV3JpdGUiLCJ0cmFuc3BhcmVudCIsInNob3VsZERlYnVnVGV4dHVyZUF0bGFzIiwicGFydGljbGVCdWZmZXIiLCJtYXRlcmlhbCIsIlNoYWRlck1hdGVyaWFsIiwidW5pZm9ybXMiLCJ2YWx1ZSIsIkNvbG9yIiwidVRleHR1cmUiLCJhdGxhc0luZGV4IiwidGFyZ2V0UG9vbCIsInVuaXF1ZUxpc3QiLCJidWZmZXIiLCJzdHJpZGUiLCJnZW9tZXRyeSIsInBvaW50cyIsIlBvaW50cyIsImZydXN0dW1DdWxsZWQiLCJhZGQiLCJvblN5c3RlbVVwZGF0ZSIsInN5c3RlbSIsIm5lZWRzVXBkYXRlIiwidGV4dHVyZUF0bGFzIiwidXBkYXRlIiwib25QYXJ0aWNsZUNyZWF0ZWQiLCJwYXJ0aWNsZSIsInRhcmdldCIsImdldCIsImlkIiwidXBkYXRlVGFyZ2V0IiwibWFwUGFydGljbGVUYXJnZXRQcm9wc1RvUG9pbnQiLCJvblBhcnRpY2xlVXBkYXRlIiwib25QYXJ0aWNsZURlYWQiLCJyZXNldCIsInBvc2l0aW9uIiwicm90YXRpb24iLCJzY2FsZSIsInJhZGl1cyIsImNvbG9yIiwiYWxwaGEiLCJib2R5IiwiciIsImciLCJiIiwiY29weSIsInNpemUiLCJzZXRSR0IiLCJpbmRleCIsImZpbmQiLCJTcHJpdGUiLCJtYXAiLCJ0ZXh0dXJlIiwidGV4dHVyZUluZGV4IiwiZ2V0VGV4dHVyZUlEIiwidXBkYXRlUG9pbnRQb3NpdGlvbiIsInVwZGF0ZVBvaW50U2l6ZSIsInVwZGF0ZVBvaW50Um90YXRpb24iLCJ1cGRhdGVQb2ludENvbG9yIiwidXBkYXRlUG9pbnRBbHBoYSIsInVwZGF0ZVBvaW50VGV4dHVyZUluZGV4IiwiYXR0cmlidXRlIiwib2Zmc2V0IiwiYXR0cmlidXRlcyIsImFycmF5IiwieCIsInkiLCJ6IiwiZGVidWciLCJ1bmRlZmluZWQiLCJhZGRUZXh0dXJlIiwiZGVzdHJveSIsInJlbW92ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsY0FBVCxFQUF5QkMsTUFBekIsRUFBaUNDLFlBQWpDLEVBQStDQyxVQUEvQyxRQUFpRSxXQUFqRTtBQUNBLFNBQVNDLGNBQVQsRUFBeUJDLFlBQXpCLFFBQTZDLFdBQTdDO0FBRUEsT0FBT0MsWUFBUCxNQUF5QixvQkFBekI7QUFDQSxTQUFTQyx3QkFBVCxRQUF5QyxxQkFBekM7QUFDQSxTQUFTQyxJQUFULFFBQXFCLGVBQXJCO0FBQ0EsU0FBU0MseUJBQVQsUUFBMEMsYUFBMUM7QUFFQSxJQUFJQyxLQUFKO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsa0JBQU4sU0FBaUNMLFlBQWpDLENBQThDO0FBQzNETSxFQUFBQSxXQUFXLENBQUNDLFNBQUQsRUFBWUMsS0FBWixFQUFtQkMsT0FBTyxHQUFHUix3QkFBN0IsRUFBdUQ7QUFDaEUsVUFBTUUseUJBQU47QUFFQUMsSUFBQUEsS0FBSyxHQUFHLEtBQUtJLEtBQUwsR0FBYUEsS0FBckI7O0FBQ0EsVUFBTUUsS0FBSyxtQ0FBUVQsd0JBQVIsR0FBcUNRLE9BQXJDLENBQVg7O0FBQ0EsVUFBTTtBQUNKRSxNQUFBQSxNQURJO0FBRUpDLE1BQUFBLFlB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 Line truncated
@@ -0,0 +1,30 @@
export const fragmentShader = () => {
return `
uniform vec3 baseColor;
uniform sampler2D uTexture;
uniform sampler2D atlasIndex;
varying float vRotation;
varying vec3 targetColor;
varying float targetAlpha;
varying vec4 tileRect;
varying float tileID;
void main() {
gl_FragColor = vec4(baseColor * targetColor, targetAlpha);
vec2 uv = gl_PointCoord;
uv = mix(tileRect.xy, tileRect.zw, gl_PointCoord);
float mid = 0.5;
uv = vec2(
cos(vRotation) * (uv.x - mid) - sin(vRotation) * (uv.y - mid) + mid,
cos(vRotation) * (uv.y - mid) + sin(vRotation) * (uv.x - mid) + mid
);
gl_FragColor = gl_FragColor * texture2D(uTexture, uv);
}
`;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9EZXNrdG9wL3NoYWRlcnMvZnJhZ21lbnRTaGFkZXIuanMiXSwibmFtZXMiOlsiZnJhZ21lbnRTaGFkZXIiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTUEsY0FBYyxHQUFHLE1BQU07QUFDbEMsU0FBUTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0ExQkU7QUEyQkQsQ0E1Qk0iLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSAoKSA9PiB7XG4gIHJldHVybiBgXG4gICAgdW5pZm9ybSB2ZWMzIGJhc2VDb2xvcjtcbiAgICB1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZTtcbiAgICB1bmlmb3JtIHNhbXBsZXIyRCBhdGxhc0luZGV4O1xuXG4gICAgdmFyeWluZyBmbG9hdCB2Um90YXRpb247XG4gICAgdmFyeWluZyB2ZWMzIHRhcmdldENvbG9yO1xuICAgIHZhcnlpbmcgZmxvYXQgdGFyZ2V0QWxwaGE7XG4gICAgdmFyeWluZyB2ZWM0IHRpbGVSZWN0O1xuICAgIHZhcnlpbmcgZmxvYXQgdGlsZUlEO1xuXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChiYXNlQ29sb3IgKiB0YXJnZXRDb2xvciwgdGFyZ2V0QWxwaGEpO1xuXG4gICAgICB2ZWMyIHV2ID0gZ2xfUG9pbnRDb29yZDtcbiAgICAgIHV2ID0gbWl4KHRpbGVSZWN0Lnh5LCB0aWxlUmVjdC56dywgZ2xfUG9pbnRDb29yZCk7XG5cbiAgICAgIGZsb2F0IG1pZCA9IDAuNTtcbiAgICAgIHV2ID0gdmVjMihcbiAgICAgICAgY29zKHZSb3RhdGlvbikgKiAodXYueCAtIG1pZCkgLSBzaW4odlJvdGF0aW9uKSAqICh1di55IC0gbWlkKSArIG1pZCxcbiAgICAgICAgY29zKHZSb3RhdGlvbikgKiAodXYueSAtIG1pZCkgKyBzaW4odlJvdGF0aW9uKSAqICh1di54IC0gbWlkKSArIG1pZFxuICAgICAgKTtcblxuICAgICAgZ2xfRnJhZ0NvbG9yID0gZ2xfRnJhZ0NvbG9yICogdGV4dHVyZTJEKHVUZXh0dXJlLCB1dik7XG5cbiAgICB9XG5gO1xufTtcbiJdfQ==
@@ -0,0 +1,3 @@
export { fragmentShader } from './fragmentShader';
export { vertexShader } from './vertexShader';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9EZXNrdG9wL3NoYWRlcnMvaW5kZXguanMiXSwibmFtZXMiOlsiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGNBQVQsUUFBK0Isa0JBQS9CO0FBQ0EsU0FBU0MsWUFBVCxRQUE2QixnQkFBN0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBmcmFnbWVudFNoYWRlciB9IGZyb20gJy4vZnJhZ21lbnRTaGFkZXInO1xuZXhwb3J0IHsgdmVydGV4U2hhZGVyIH0gZnJvbSAnLi92ZXJ0ZXhTaGFkZXInO1xuIl19
@@ -0,0 +1,36 @@
import { DATA_TEXTURE_SIZE } from '../../common/TextureAtlas/constants';
import { SIZE_ATTENUATION_FACTOR } from '../../common/shaders/constants';
export const vertexShader = () => {
return `
uniform sampler2D uTexture;
//atlasIndex is a 256x1 float texture of tile rectangles as r=minx g=miny b=maxx a=maxy
uniform sampler2D atlasIndex;
attribute float size;
attribute vec3 color;
attribute float alpha;
attribute float texID;
attribute float rotation;
varying float vRotation;
varying vec3 targetColor;
varying float targetAlpha;
varying vec4 tileRect;
varying float tileID;
void main() {
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
targetColor = color;
targetAlpha = alpha;
vRotation = rotation;
tileID = texID;
//get the tile rectangle from the atlasIndex texture..
tileRect = texture2D(atlasIndex, vec2((tileID + 0.5) / ${DATA_TEXTURE_SIZE}.0, 0.5));
gl_PointSize = ((size * ${SIZE_ATTENUATION_FACTOR}) / -mvPosition.z);
gl_Position = projectionMatrix * mvPosition;
}
`;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9EZXNrdG9wL3NoYWRlcnMvdmVydGV4U2hhZGVyLmpzIl0sIm5hbWVzIjpbIkRBVEFfVEVYVFVSRV9TSVpFIiwiU0laRV9BVFRFTlVBVElPTl9GQUNUT1IiLCJ2ZXJ0ZXhTaGFkZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGlCQUFULFFBQWtDLHFDQUFsQztBQUNBLFNBQVNDLHVCQUFULFFBQXdDLGdDQUF4QztBQUVBLE9BQU8sTUFBTUMsWUFBWSxHQUFHLE1BQU07QUFDaEMsU0FBUTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErREYsaUJBQWtCO0FBQ2pGO0FBQ0EsZ0NBQWdDQyx1QkFBd0I7QUFDeEQ7QUFDQTtBQUNBLENBOUJFO0FBK0JELENBaENNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREFUQV9URVhUVVJFX1NJWkUgfSBmcm9tICcuLi8uLi9jb21tb24vVGV4dHVyZUF0bGFzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTSVpFX0FUVEVOVUFUSU9OX0ZBQ1RPUiB9IGZyb20gJy4uLy4uL2NvbW1vbi9zaGFkZXJzL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSAoKSA9PiB7XG4gIHJldHVybiBgXG4gICAgdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmU7XG4gICAgLy9hdGxhc0luZGV4IGlzIGEgMjU2eDEgZmxvYXQgdGV4dHVyZSBvZiB0aWxlIHJlY3RhbmdsZXMgYXMgcj1taW54IGc9bWlueSBiPW1heHggYT1tYXh5XG4gICAgdW5pZm9ybSBzYW1wbGVyMkQgYXRsYXNJbmRleDtcblxuICAgIGF0dHJpYnV0ZSBmbG9hdCBzaXplO1xuICAgIGF0dHJpYnV0ZSB2ZWMzIGNvbG9yO1xuICAgIGF0dHJpYnV0ZSBmbG9hdCBhbHBoYTtcbiAgICBhdHRyaWJ1dGUgZmxvYXQgdGV4SUQ7XG4gICAgYXR0cmlidXRlIGZsb2F0IHJvdGF0aW9uO1xuXG4gICAgdmFyeWluZyBmbG9hdCB2Um90YXRpb247XG4gICAgdmFyeWluZyB2ZWMzIHRhcmdldENvbG9yO1xuICAgIHZhcnlpbmcgZmxvYXQgdGFyZ2V0QWxwaGE7XG4gICAgdmFyeWluZyB2ZWM0IHRpbGVSZWN0O1xuICAgIHZhcnlpbmcgZmxvYXQgdGlsZUlEO1xuXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgdmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICAgIHRhcmdldENvbG9yID0gY29sb3I7XG4gICAgICB0YXJnZXRBbHBoYSA9IGFscGhhO1xuICAgICAgdlJvdGF0aW9uID0gcm90YXRpb247XG5cbiAgICAgIHRpbGVJRCA9IHRleElEO1xuICAgICAgLy9nZXQgdGhlIHRpbGUgcmVjdGFuZ2xlIGZyb20gdGhlIGF0bGFzSW5kZXggdGV4dHVyZS4uXG4gICAgICB0aWxlUmVjdCA9IHRleHR1cmUyRChhdGxhc0luZGV4LCB2ZWMyKCh0aWxlSUQgKyAwLjUpIC8gJHtEQVRBX1RFWFRVUkVfU0laRX0uMCwgMC41KSk7XG5cbiAgICAgIGdsX1BvaW50U2l6ZSA9ICgoc2l6ZSAqICR7U0laRV9BVFRFTlVBVElPTl9GQUNUT1J9KSAvIC1tdlBvc2l0aW9uLnopO1xuICAgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcbiAgICB9XG5gO1xufTtcbiJdfQ==
@@ -0,0 +1,375 @@
import _defineProperty from "@babel/runtime/helpers/defineProperty";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import { ParticleBuffer, Target, TextureAtlas, UniqueList } from '../common';
import { fragmentShader, vertexShader } from './shaders';
import BaseRenderer from '../../BaseRenderer';
import { DEFAULT_RENDERER_OPTIONS } from '../common/constants';
import { Pool } from '../../../core';
import { RENDERER_TYPE_GPU_MOBILE } from '../../types';
let THREE;
/**
* GPURenderer for mobile devices that do not support floating point textures.
*
* @author thrax <manthrax@gmail.com>
* @author rohan-deshpande <rohan@creativelifeform.com>
*/
export default class MobileGPURenderer extends BaseRenderer {
constructor(container, three, options = DEFAULT_RENDERER_OPTIONS) {
super(RENDERER_TYPE_GPU_MOBILE);
THREE = this.three = three;
const props = _objectSpread(_objectSpread({}, DEFAULT_RENDERER_OPTIONS), options);
const {
camera,
maxParticles,
baseColor,
blending,
depthTest,
depthWrite,
transparent,
shouldDebugTextureAtlas
} = props;
const particleBuffer = new ParticleBuffer(maxParticles, THREE);
const material = new THREE.ShaderMaterial({
uniforms: {
baseColor: {
value: new THREE.Color(baseColor)
},
uTexture: {
value: null
},
FFatlasIndex: {
value: null
},
atlasDim: {
value: new THREE.Vector2()
}
},
vertexShader: vertexShader(),
fragmentShader: fragmentShader(),
blending: THREE[blending],
depthTest,
depthWrite,
transparent
});
this.camera = camera;
this.targetPool = new Pool();
this.uniqueList = new UniqueList(maxParticles);
this.particleBuffer = particleBuffer;
this.buffer = particleBuffer.buffer;
this.stride = particleBuffer.stride;
this.geometry = particleBuffer.geometry;
this.material = material;
this.points = new THREE.Points(this.geometry, this.material);
this.points.frustumCulled = false;
this.shouldDebugTextureAtlas = shouldDebugTextureAtlas;
container.add(this.points);
}
onSystemUpdate(system) {
super.onSystemUpdate(system);
this.buffer.needsUpdate = true;
const {
textureAtlas
} = this;
if (textureAtlas) {
textureAtlas.update();
this.material.uniforms.atlasDim.value.set(textureAtlas.atlasTexture.image.width, textureAtlas.atlasTexture.image.height);
}
}
/**
* Pools the particle target if it does not exist.
* Updates the target and maps particle properties to the point.
*
* @param {Particle}
*/
onParticleCreated(particle) {
if (!particle.target) {
particle.target = this.targetPool.get(Target, THREE);
this.uniqueList.add(particle.id);
}
this.updateTarget(particle).mapParticleTargetPropsToPoint(particle);
}
/**
* Maps particle properties to the point if the particle has a target.
*
* @param {Particle}
*/
onParticleUpdate(particle) {
if (!particle.target) {
return;
}
this.updateTarget(particle).mapParticleTargetPropsToPoint(particle);
}
/**
* Resets and clears the particle target.
*
* @param {Particle}
*/
onParticleDead(particle) {
if (!particle.target) {
return;
}
particle.target.reset();
this.mapParticleTargetPropsToPoint(particle);
particle.target = null;
}
/**
* Maps all mutable properties from the particle to the target.
*
* @param {Particle}
* @return {GPURenderer}
*/
updateTarget(particle) {
const {
position,
rotation,
scale,
radius,
color,
alpha,
body,
id
} = particle;
const {
r,
g,
b
} = color;
particle.target.position.copy(position);
particle.target.rotation.copy(rotation);
particle.target.size = scale * radius;
particle.target.color.setRGB(r, g, b);
particle.target.alpha = alpha;
particle.target.index = this.uniqueList.find(id);
if (body && body instanceof THREE.Sprite) {
const {
map
} = body.material;
particle.target.texture = map;
particle.target.textureIndex = this.getTextureID(map, this.shouldDebugTextureAtlas);
}
return this;
}
/**
* Entry point for mapping particle properties to buffer geometry points.
*
* @param {Particle} particle - The particle containing the properties to map
* @return {GPURenderer}
*/
mapParticleTargetPropsToPoint(particle) {
this.updatePointPosition(particle).updatePointSize(particle).updatePointRotation(particle).updatePointColor(particle).updatePointAlpha(particle).updatePointTextureIndex(particle);
return this;
}
/**
* Updates the point's position according to the particle's target position.
*
* @param {Particle} particle - The particle containing the target position.
* @return {GPURenderer}
*/
updatePointPosition(particle) {
const attribute = 'position';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.position.x;
buffer.array[target.index * stride + offset + 1] = target.position.y;
buffer.array[target.index * stride + offset + 2] = target.position.z;
return this;
}
/**
* Updates the point's size relative to the particle's target scale and radius.
*
* @param {Particle} particle - The particle containing the target scale.
* @return {GPURenderer}
*/
updatePointSize(particle) {
const attribute = 'size';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.size;
return this;
}
/**
* Updates the point's rotation.
*
* @param {Particle} particle - The particle containing the target rotation.
* @return {GPURenderer}
*/
updatePointRotation(particle) {
const attribute = 'rotation';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.rotation.z;
return this;
}
/**
* Updates the point's color attribute according with the particle's target color.
*
* @param {Particle} particle - The particle containing the target color and alpha.
* @return {GPURenderer}
*/
updatePointColor(particle) {
const attribute = 'color';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.color.r;
buffer.array[target.index * stride + offset + 1] = target.color.g;
buffer.array[target.index * stride + offset + 2] = target.color.b;
return this;
}
/**
* Updates the point alpha attribute with the particle's target alpha.
*
* @param {Particle} particle - The particle containing the target alpha.
* @return {GPURenderer}
*/
updatePointAlpha(particle) {
const attribute = 'alpha';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
buffer.array[target.index * stride + offset + 0] = target.alpha;
return this;
}
/**
* Updates the point texture attribute with the particle's target texture.
*
* @param {Particle} particle - The particle containing the target texture.
* @return {GPURenderer}
*/
updatePointTextureIndex(particle) {
const attribute = 'texID';
const {
geometry,
stride,
buffer
} = this;
const {
target
} = particle;
const {
offset
} = geometry.attributes[attribute];
const id = target.index * stride + offset + 0; // eslint-disable-next-line
if (false) {
buffer.array[id] = target.textureIndex;
} else {
let ti = target.textureIndex * 4;
const ta = this.textureAtlas;
const ida = ta.indexData;
const nx = ida[ti++];
const ny = ida[ti++];
const px = ida[ti++];
const py = ida[ti++];
buffer.array[id] = (nx * ta.atlasTexture.image.width | 0) + px;
buffer.array[id + 1] = (ny * ta.atlasTexture.image.height | 0) + py;
}
return this;
}
getTextureID(texture, debug) {
if (texture.textureIndex === undefined) {
if (!this.textureAtlas) {
this.textureAtlas = new TextureAtlas(this, debug);
}
this.textureAtlas.addTexture(texture);
}
return texture.textureIndex;
}
destroy() {
const {
container,
points,
textureAtlas,
uniqueList
} = this;
container.remove(points);
uniqueList.destroy();
textureAtlas && textureAtlas.destroy();
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9Nb2JpbGUvaW5kZXguanMiXSwibmFtZXMiOlsiUGFydGljbGVCdWZmZXIiLCJUYXJnZXQiLCJUZXh0dXJlQXRsYXMiLCJVbmlxdWVMaXN0IiwiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiLCJCYXNlUmVuZGVyZXIiLCJERUZBVUxUX1JFTkRFUkVSX09QVElPTlMiLCJQb29sIiwiUkVOREVSRVJfVFlQRV9HUFVfTU9CSUxFIiwiVEhSRUUiLCJNb2JpbGVHUFVSZW5kZXJlciIsImNvbnN0cnVjdG9yIiwiY29udGFpbmVyIiwidGhyZWUiLCJvcHRpb25zIiwicHJvcHMiLCJjYW1lcmEiLCJtYXhQYXJ0aWNsZXMiLCJiYXNlQ29sb3IiLCJibGVuZGluZyIsImRlcHRoVGVzdCIsImRlcHRoV3JpdGUiLCJ0cmFuc3BhcmVudCIsInNob3VsZERlYnVnVGV4dHVyZUF0bGFzIiwicGFydGljbGVCdWZmZXIiLCJtYXRlcmlhbCIsIlNoYWRlck1hdGVyaWFsIiwidW5pZm9ybXMiLCJ2YWx1ZSIsIkNvbG9yIiwidVRleHR1cmUiLCJGRmF0bGFzSW5kZXgiLCJhdGxhc0RpbSIsIlZlY3RvcjIiLCJ0YXJnZXRQb29sIiwidW5pcXVlTGlzdCIsImJ1ZmZlciIsInN0cmlkZSIsImdlb21ldHJ5IiwicG9pbnRzIiwiUG9pbnRzIiwiZnJ1c3R1bUN1bGxlZCIsImFkZCIsIm9uU3lzdGVtVXBkYXRlIiwic3lzdGVtIiwibmVlZHNVcGRhdGUiLCJ0ZXh0dXJlQXRsYXMiLCJ1cGRhdGUiLCJzZXQiLCJhdGxhc1RleHR1cmUiLCJpbWFnZSIsIndpZHRoIiwiaGVpZ2h0Iiwib25QYXJ0aWNsZUNyZWF0ZWQiLCJwYXJ0aWNsZSIsInRhcmdldCIsImdldCIsImlkIiwidXBkYXRlVGFyZ2V0IiwibWFwUGFydGljbGVUYXJnZXRQcm9wc1RvUG9pbnQiLCJvblBhcnRpY2xlVXBkYXRlIiwib25QYXJ0aWNsZURlYWQiLCJyZXNldCIsInBvc2l0aW9uIiwicm90YXRpb24iLCJzY2FsZSIsInJhZGl1cyIsImNvbG9yIiwiYWxwaGEiLCJib2R5IiwiciIsImciLCJiIiwiY29weSIsInNpemUiLCJzZXRSR0IiLCJpbmRleCIsImZpbmQiLCJTcHJpdGUiLCJtYXAiLCJ0ZXh0dXJlIiwidGV4dHVyZUluZGV4IiwiZ2V0VGV4dHVyZUlEIiwidXBkYXRlUG9pbnRQb3NpdGlvbiIsInVwZGF0ZVBvaW50U2l6ZSIsInVwZGF0ZVBvaW50Um90YXRpb24iLCJ1cGRhdGVQb2ludENvbG9yIiwidXBkYXRlUG9pbnRBbHBoYSIsInVwZGF0ZVBvaW50VGV4dHVyZUluZGV4IiwiYXR0cmlidXRlIiwib2Zmc2V0IiwiYXR0cmlidXRlcyIsImFycmF5IiwieCIsInkiLCJ6IiwidGkiLCJ0YSIsImlkYSIsImluZGV4RGF0YSIsIm54IiwibnkiLCJweCIsInB5IiwiZGVidWciLCJ1bmRlZmluZWQiLCJhZGRUZXh0dXJlIiwiZGVzdHJveSIsInJlbW92ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsY0FBVCxFQUF5QkMsTUFBekIsRUFBaUNDLFlBQWpDLEVBQStDQyxVQUEvQyxRQUFpRSxXQUFqRTtBQUNBLFNBQVNDLGNBQVQsRUFBeUJDLFlBQXpCLFFBQTZDLFdBQTdDO0FBRUEsT0FBT0MsWUFBUCxNQUF5QixvQkFBekI7QUFDQSxTQUFTQyx3QkFBVCxRQUF5QyxxQkFBekM7QUFDQSxTQUFTQyxJQUFULFFBQXFCLGVBQXJCO0FBQ0EsU0FBU0Msd0JBQVQsUUFBeUMsYUFBekM7QUFFQSxJQUFJQyxLQUFKO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsaUJBQU4sU0FBZ0NMLFlBQWhDLENBQTZDO0FBQzFETSxFQUFBQSxXQUFXLENBQUNDLFNBQUQsRUFBWUMsS0FBWixFQUFtQkMsT0FBTyxHQUFHUix3QkFBN0IsRUFBdUQ7QUFDaEUsVUFBTUUsd0JBQU47QUFFQUMsSUFBQUEsS0FBSyxHQUFH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 Line truncated
@@ -0,0 +1,27 @@
export const fragmentShader = () => {
return `
uniform vec3 baseColor;
uniform sampler2D uTexture;
varying float vRotation;
varying vec3 targetColor;
varying float targetAlpha;
varying vec4 tileRect;
void main() {
gl_FragColor = vec4(baseColor * targetColor, targetAlpha);
vec2 uv = gl_PointCoord;
uv = mix(tileRect.xy, tileRect.zw, gl_PointCoord);
float mid = 0.5;
uv = vec2(
cos(vRotation) * (uv.x - mid) - sin(vRotation) * (uv.y - mid) + mid,
cos(vRotation) * (uv.y - mid) + sin(vRotation) * (uv.x - mid) + mid
);
gl_FragColor = gl_FragColor * texture2D(uTexture, uv);
}
`;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9Nb2JpbGUvc2hhZGVycy9mcmFnbWVudFNoYWRlci5qcyJdLCJuYW1lcyI6WyJmcmFnbWVudFNoYWRlciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxjQUFjLEdBQUcsTUFBTTtBQUNsQyxTQUFRO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQXZCRTtBQXdCRCxDQXpCTSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBmcmFnbWVudFNoYWRlciA9ICgpID0+IHtcbiAgcmV0dXJuIGBcbiAgICB1bmlmb3JtIHZlYzMgYmFzZUNvbG9yO1xuICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlO1xuXG4gICAgdmFyeWluZyBmbG9hdCB2Um90YXRpb247XG4gICAgdmFyeWluZyB2ZWMzIHRhcmdldENvbG9yO1xuICAgIHZhcnlpbmcgZmxvYXQgdGFyZ2V0QWxwaGE7XG4gICAgdmFyeWluZyB2ZWM0IHRpbGVSZWN0O1xuXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChiYXNlQ29sb3IgKiB0YXJnZXRDb2xvciwgdGFyZ2V0QWxwaGEpO1xuXG4gICAgICB2ZWMyIHV2ID0gZ2xfUG9pbnRDb29yZDtcbiAgICAgIHV2ID0gbWl4KHRpbGVSZWN0Lnh5LCB0aWxlUmVjdC56dywgZ2xfUG9pbnRDb29yZCk7XG5cbiAgICAgIGZsb2F0IG1pZCA9IDAuNTtcbiAgICAgIHV2ID0gdmVjMihcbiAgICAgICAgY29zKHZSb3RhdGlvbikgKiAodXYueCAtIG1pZCkgLSBzaW4odlJvdGF0aW9uKSAqICh1di55IC0gbWlkKSArIG1pZCxcbiAgICAgICAgY29zKHZSb3RhdGlvbikgKiAodXYueSAtIG1pZCkgKyBzaW4odlJvdGF0aW9uKSAqICh1di54IC0gbWlkKSArIG1pZFxuICAgICAgKTtcbiAgICAgIFxuICAgICAgZ2xfRnJhZ0NvbG9yID0gZ2xfRnJhZ0NvbG9yICogdGV4dHVyZTJEKHVUZXh0dXJlLCB1dik7XG4gICAgfVxuYDtcbn07XG4iXX0=
@@ -0,0 +1,3 @@
export { fragmentShader } from './fragmentShader';
export { vertexShader } from './vertexShader';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9Nb2JpbGUvc2hhZGVycy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcmFnbWVudFNoYWRlciIsInZlcnRleFNoYWRlciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsY0FBVCxRQUErQixrQkFBL0I7QUFDQSxTQUFTQyxZQUFULFFBQTZCLGdCQUE3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGZyYWdtZW50U2hhZGVyIH0gZnJvbSAnLi9mcmFnbWVudFNoYWRlcic7XG5leHBvcnQgeyB2ZXJ0ZXhTaGFkZXIgfSBmcm9tICcuL3ZlcnRleFNoYWRlcic7XG4iXX0=
@@ -0,0 +1,33 @@
import { SIZE_ATTENUATION_FACTOR } from '../../common/shaders/constants';
export const vertexShader = () => {
return `
uniform sampler2D uTexture;
uniform vec2 atlasDim;
attribute float size;
attribute vec3 color;
attribute float alpha;
attribute vec2 texID;
attribute float rotation;
varying float vRotation;
varying vec3 targetColor;
varying float targetAlpha;
varying vec4 tileRect;
void main() {
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
targetColor = color;
targetAlpha = alpha;
vRotation = rotation;
vec2 tmin = floor(texID) / atlasDim;
vec2 tmax = fract(texID);
tileRect = vec4(tmin,tmax);
gl_PointSize = ((size * ${SIZE_ATTENUATION_FACTOR}) / -mvPosition.z);
gl_Position = projectionMatrix * mvPosition;
}
`;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9Nb2JpbGUvc2hhZGVycy92ZXJ0ZXhTaGFkZXIuanMiXSwibmFtZXMiOlsiU0laRV9BVFRFTlVBVElPTl9GQUNUT1IiLCJ2ZXJ0ZXhTaGFkZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLHVCQUFULFFBQXdDLGdDQUF4QztBQUVBLE9BQU8sTUFBTUMsWUFBWSxHQUFHLE1BQU07QUFDaEMsU0FBUTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQ0QsdUJBQXdCO0FBQ3hEO0FBQ0E7QUFDQSxDQTVCRTtBQTZCRCxDQTlCTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNJWkVfQVRURU5VQVRJT05fRkFDVE9SIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NoYWRlcnMvY29uc3RhbnRzJztcblxuZXhwb3J0IGNvbnN0IHZlcnRleFNoYWRlciA9ICgpID0+IHtcbiAgcmV0dXJuIGBcbiAgICB1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZTtcbiAgICB1bmlmb3JtIHZlYzIgYXRsYXNEaW07XG5cbiAgICBhdHRyaWJ1dGUgZmxvYXQgc2l6ZTtcbiAgICBhdHRyaWJ1dGUgdmVjMyBjb2xvcjtcbiAgICBhdHRyaWJ1dGUgZmxvYXQgYWxwaGE7XG4gICAgYXR0cmlidXRlIHZlYzIgdGV4SUQ7XG4gICAgYXR0cmlidXRlIGZsb2F0IHJvdGF0aW9uO1xuXG4gICAgdmFyeWluZyBmbG9hdCB2Um90YXRpb247XG4gICAgdmFyeWluZyB2ZWMzIHRhcmdldENvbG9yO1xuICAgIHZhcnlpbmcgZmxvYXQgdGFyZ2V0QWxwaGE7XG4gICAgdmFyeWluZyB2ZWM0IHRpbGVSZWN0O1xuXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgdmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICAgIHRhcmdldENvbG9yID0gY29sb3I7XG4gICAgICB0YXJnZXRBbHBoYSA9IGFscGhhO1xuICAgICAgdlJvdGF0aW9uID0gcm90YXRpb247XG5cbiAgICAgIHZlYzIgdG1pbiA9IGZsb29yKHRleElEKSAvIGF0bGFzRGltO1xuICAgICAgdmVjMiB0bWF4ID0gZnJhY3QodGV4SUQpO1xuICAgICAgdGlsZVJlY3QgPSB2ZWM0KHRtaW4sdG1heCk7XG5cbiAgICAgIGdsX1BvaW50U2l6ZSA9ICgoc2l6ZSAqICR7U0laRV9BVFRFTlVBVElPTl9GQUNUT1J9KSAvIC1tdlBvc2l0aW9uLnopO1xuICAgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcbiAgICB9XG5gO1xufTtcbiJdfQ==
@@ -0,0 +1,30 @@
// Primitives
export const DEFAULT_MAX_PARTICLES = 10000;
export const VECTOR_3_SIZE = ['x', 'y', 'z'].length;
export const RGBA_SIZE = ['r', 'g', 'b', 'a'].length;
export const FLOAT_BYTE_SIZE = 4; // Byte sizes
export const POSITION_BYTE_SIZE = VECTOR_3_SIZE * FLOAT_BYTE_SIZE;
export const ROTATION_BYTE_SIZE = FLOAT_BYTE_SIZE;
export const SIZE_BYTE_SIZE = FLOAT_BYTE_SIZE;
export const RGBA_BYTE_SIZE = RGBA_SIZE * FLOAT_BYTE_SIZE;
export const ALL_BYTE_SIZES = [POSITION_BYTE_SIZE, ROTATION_BYTE_SIZE, SIZE_BYTE_SIZE, RGBA_BYTE_SIZE];
export const PARTICLE_BYTE_SIZE = ALL_BYTE_SIZES.reduce((cur, acc) => cur + acc); // Attributes
export const POSITION_ATTRIBUTE_BUFFER_SIZE = VECTOR_3_SIZE;
export const ROTATION_ATTRIBUTE_BUFFER_SIZE = 1;
export const SIZE_ATTRIBUTE_BUFFER_SIZE = 1;
export const RGBA_ATTRIBUTE_BUFFER_SIZE = RGBA_SIZE;
export const ALPHA_ATTRIBUTE_BUFFER_SIZE = 1;
export const TEXID_ATTRIBUTE_BUFFER_SIZE = 2;
export const ATTRIBUTE_TO_SIZE_MAP = {
position: POSITION_ATTRIBUTE_BUFFER_SIZE,
rotation: ROTATION_ATTRIBUTE_BUFFER_SIZE,
size: SIZE_ATTRIBUTE_BUFFER_SIZE,
// THREE.Color does not contain alpha, so we will have separate attributes for these
color: RGBA_ATTRIBUTE_BUFFER_SIZE,
alpha: ALPHA_ATTRIBUTE_BUFFER_SIZE,
texID: TEXID_ATTRIBUTE_BUFFER_SIZE
};
export const PARTICLE_STRIDE = [POSITION_ATTRIBUTE_BUFFER_SIZE, ROTATION_ATTRIBUTE_BUFFER_SIZE, SIZE_ATTRIBUTE_BUFFER_SIZE, RGBA_ATTRIBUTE_BUFFER_SIZE, ALPHA_ATTRIBUTE_BUFFER_SIZE, TEXID_ATTRIBUTE_BUFFER_SIZE].reduce((cur, acc) => cur + acc);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vUGFydGljbGVCdWZmZXIvY29uc3RhbnRzLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfTUFYX1BBUlRJQ0xFUyIsIlZFQ1RPUl8zX1NJWkUiLCJsZW5ndGgiLCJSR0JBX1NJWkUiLCJGTE9BVF9CWVRFX1NJWkUiLCJQT1NJVElPTl9CWVRFX1NJWkUiLCJST1RBVElPTl9CWVRFX1NJWkUiLCJTSVpFX0JZVEVfU0laRSIsIlJHQkFfQllURV9TSVpFIiwiQUxMX0JZVEVfU0laRVMiLCJQQVJUSUNMRV9CWVRFX1NJWkUiLCJyZWR1Y2UiLCJjdXIiLCJhY2MiLCJQT1NJVElPTl9BVFRSSUJVVEVfQlVGRkVSX1NJWkUiLCJST1RBVElPTl9BVFRSSUJVVEVfQlVGRkVSX1NJWkUiLCJTSVpFX0FUVFJJQlVURV9CVUZGRVJfU0laRSIsIlJHQkFfQVRUUklCVVRFX0JVRkZFUl9TSVpFIiwiQUxQSEFfQVRUUklCVVRFX0JVRkZFUl9TSVpFIiwiVEVYSURfQVRUUklCVVRFX0JVRkZFUl9TSVpFIiwiQVRUUklCVVRFX1RPX1NJWkVfTUFQIiwicG9zaXRpb24iLCJyb3RhdGlvbiIsInNpemUiLCJjb2xvciIsImFscGhhIiwidGV4SUQiLCJQQVJUSUNMRV9TVFJJREUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsT0FBTyxNQUFNQSxxQkFBcUIsR0FBRyxLQUE5QjtBQUNQLE9BQU8sTUFBTUMsYUFBYSxHQUFHLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLEVBQWdCQyxNQUF0QztBQUNQLE9BQU8sTUFBTUMsU0FBUyxHQUFHLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLEVBQWdCLEdBQWhCLEVBQXFCRCxNQUF2QztBQUNQLE9BQU8sTUFBTUUsZUFBZSxHQUFHLENBQXhCLEMsQ0FFUDs7QUFDQSxPQUFPLE1BQU1DLGtCQUFrQixHQUFHSixhQUFhLEdBQUdHLGVBQTNDO0FBQ1AsT0FBTyxNQUFNRSxrQkFBa0IsR0FBR0YsZUFBM0I7QUFDUCxPQUFPLE1BQU1HLGNBQWMsR0FBR0gsZUFBdkI7QUFDUCxPQUFPLE1BQU1JLGNBQWMsR0FBR0wsU0FBUyxHQUFHQyxlQUFuQztBQUNQLE9BQU8sTUFBTUssY0FBYyxHQUFHLENBQzVCSixrQkFENEIsRUFFNUJDLGtCQUY0QixFQUc1QkMsY0FINEIsRUFJNUJDLGNBSjRCLENBQXZCO0FBTVAsT0FBTyxNQUFNRSxrQkFBa0IsR0FBR0QsY0FBYyxDQUFDRSxNQUFmLENBQ2hDLENBQUNDLEdBQUQsRUFBTUMsR0FBTixLQUFjRCxHQUFHLEdBQUdDLEdBRFksQ0FBM0IsQyxDQUlQOztBQUNBLE9BQU8sTUFBTUMsOEJBQThCLEdBQUdiLGFBQXZDO0FBQ1AsT0FBTyxNQUFNYyw4QkFBOEIsR0FBRyxDQUF2QztBQUNQLE9BQU8sTUFBTUMsMEJBQTBCLEdBQUcsQ0FBbkM7QUFDUCxPQUFPLE1BQU1DLDBCQUEwQixHQUFHZCxTQUFuQztBQUNQLE9BQU8sTUFBTWUsMkJBQTJCLEdBQUcsQ0FBcEM7QUFDUCxPQUFPLE1BQU1DLDJCQUEyQixHQUFHLENBQXBDO0FBRVAsT0FBTyxNQUFNQyxxQkFBcUIsR0FBRztBQUNuQ0MsRUFBQUEsUUFBUSxFQUFFUCw4QkFEeUI7QUFFbkNRLEVBQUFBLFFBQVEsRUFBRVAsOEJBRnlCO0FBR25DUSxFQUFBQSxJQUFJLEVBQUVQLDBCQUg2QjtBQUluQztBQUNBUSxFQUFBQSxLQUFLLEVBQUVQLDBCQUw0QjtBQU1uQ1EsRUFBQUEsS0FBSyxFQUFFUCwyQkFONEI7QUFPbkNRLEVBQUFBLEtBQUssRUFBRVA7QUFQNEIsQ0FBOUI7QUFVUCxPQUFPLE1BQU1RLGVBQWUsR0FBRyxDQUM3QmIsOEJBRDZCLEVBRTdCQyw4QkFGNkIsRUFHN0JDLDBCQUg2QixFQUk3QkMsMEJBSjZCLEVBSzdCQywyQkFMNkIsRUFNN0JDLDJCQU42QixFQU83QlIsTUFQNkIsQ0FPdEIsQ0FBQ0MsR0FBRCxFQUFNQyxHQUFOLEtBQWNELEdBQUcsR0FBR0MsR0FQRSxDQUF4QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFByaW1pdGl2ZXNcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9QQVJUSUNMRVMgPSAxMDAwMDtcbmV4cG9ydCBjb25zdCBWRUNUT1JfM19TSVpFID0gWyd4JywgJ3knLCAneiddLmxlbmd0aDtcbmV4cG9ydCBjb25zdCBSR0JBX1NJWkUgPSBbJ3InLCAnZycsICdiJywgJ2EnXS5sZW5ndGg7XG5leHBvcnQgY29uc3QgRkxPQVRfQllURV9TSVpFID0gNDtcblxuLy8gQnl0ZSBzaXplc1xuZXhwb3J0IGNvbnN0IFBPU0lUSU9OX0JZVEVfU0laRSA9IFZFQ1RPUl8zX1NJWkUgKiBGTE9BVF9CWVRFX1NJWkU7XG5leHBvcnQgY29uc3QgUk9UQVRJT05fQllURV9TSVpFID0gRkxPQVRfQllURV9TSVpFO1xuZXhwb3J0IGNvbnN0IFNJWkVfQllURV9TSVpFID0gRkxPQVRfQllURV9TSVpFO1xuZXhwb3J0IGNvbnN0IFJHQkFfQllURV9TSVpFID0gUkdCQV9TSVpFICogRkxPQVRfQllURV9TSVpFO1xuZXhwb3J0IGNvbnN0IEFMTF9CWVRFX1NJWkVTID0gW1xuICBQT1NJVElPTl9CWVRFX1NJWkUsXG4gIFJPVEFUSU9OX0JZVEVfU0laRSxcbiAgU0laRV9CWVRFX1NJWkUsXG4gIFJHQkFfQllURV9TSVpFLFxuXTtcbmV4cG9ydCBjb25zdCBQQVJUSUNMRV9CWVRFX1NJWkUgPSBBTExfQllURV9TSVpFUy5yZWR1Y2UoXG4gIChjdXIsIGFjYykgPT4gY3VyICsgYWNjXG4pO1xuXG4vLyBBdHRyaWJ1dGVzXG5leHBvcnQgY29uc3QgUE9TSVRJT05fQVRUUklCVVRFX0JVRkZFUl9TSVpFID0gVkVDVE9SXzNfU0laRTtcbmV4cG9ydCBjb25zdCBST1RBVElPTl9BVFRSSUJVVEVfQlVGRkVSX1NJWkUgPSAxO1xuZXhwb3J0IGNvbnN0IFNJWkVfQVRUUklCVVRFX0JVRkZFUl9TSVpFID0gMTtcbmV4cG9ydCBjb25zdCBSR0JBX0FUVFJJQlVURV9CVUZGRVJfU0laRSA9IFJHQkFfU0laRTtcbmV4cG9ydCBjb25zdCBBTFBIQV9BVFRSSUJVVEVfQlVGRkVSX1NJWkUgPSAxO1xuZXhwb3J0IGNvbnN0IFRFWElEX0FUVFJJQlVURV9CVUZGRVJfU0laRSA9IDI7XG5cbmV4cG9ydCBjb25zdCBBVFRSSUJVVEVfVE9fU0laRV9NQVAgPSB7XG4gIHBvc2l0aW9uOiBQT1NJVElPTl9BVFRSSUJVVEVfQlVGRkVSX1NJWkUsXG4gIHJvdGF0aW9uOiBST1RBVElPTl9BVFRSSUJVVEVfQlVGRkVSX1NJWkUsXG4gIHNpemU6IFNJWkVfQVRUUklCVVRFX0JVRkZFUl9TSVpFLFxuICAvLyBUSFJFRS5Db2xvciBkb2VzIG5vdCBjb250YWluIGFscGhhLCBzbyB3ZSB3aWxsIGhhdmUgc2VwYXJhdGUgYXR0cmlidXRlcyBmb3IgdGhlc2VcbiAgY29sb3I6IFJHQkFfQVRUUklCVVRFX0JVRkZFUl9TSVpFLFxuICBhbHBoYTogQUxQSEFfQVRUUklCVVRFX0JVRkZFUl9TSVpFLFxuICB0ZXhJRDogVEVYSURfQVRUUklCVVRFX0JVRkZFUl9TSVpFLFxufTtcblxuZXhwb3J0IGNvbnN0IFBBUlRJQ0xFX1NUUklERSA9IFtcbiAgUE9TSVRJT05fQVRUUklCVVRFX0JVRkZFUl9TSVpFLFxuICBST1RBVElPTl9BVFRSSUJVVEVfQlVGRkVSX1NJWkUsXG4gIFNJWkVfQVRUUklCVVRFX0JVRkZFUl9TSVpFLFxuICBSR0JBX0FUVFJJQlVURV9CVUZGRVJfU0laRSxcbiAgQUxQSEFfQVRUUklCVVRFX0JVRkZFUl9TSVpFLFxuICBURVhJRF9BVFRSSUJVVEVfQlVGRkVSX1NJWkUsXG5dLnJlZHVjZSgoY3VyLCBhY2MpID0+IGN1ciArIGFjYyk7XG4iXX0=
@@ -0,0 +1,70 @@
import { ATTRIBUTE_TO_SIZE_MAP, DEFAULT_MAX_PARTICLES, PARTICLE_BYTE_SIZE } from './constants';
let THREE;
/**
* Creates and provides performant buffers for mapping particle properties to geometry vertices.
*
* @author thrax <manthrax@gmail.com>
* @author rohan-deshpande <rohan@creativelifeform.com>
* @see https://threejs.org/examples/?q=buffe#webgl_buffergeometry_points_interleaved
* @see https://threejs.org/examples/?q=points#webgl_custom_attributes_points
*/
export default class ParticleBuffer {
constructor(maxParticles = DEFAULT_MAX_PARTICLES, three) {
THREE = three;
this.maxParticles = maxParticles;
this.createInterleavedBuffer().createBufferGeometry();
}
/**
* Creates the interleaved buffer that will be used to write data to the GPU.
*
* @return {ParticleBuffer}
*/
createInterleavedBuffer() {
const arrayBuffer = new ArrayBuffer(this.maxParticles * PARTICLE_BYTE_SIZE);
this.interleavedBuffer = new THREE.InterleavedBuffer(new Float32Array(arrayBuffer), PARTICLE_BYTE_SIZE); // this.interleavedBuffer.usage = THREE.DynamicDrawUsage;
return this;
}
/**
* Sets the geometry's buffer attributes.
*
* NOTE Each attribute needs to be set at the right index in the buffer right after the previous
* attribute that occupies a set amount of size in the buffer.
*
* @return {ParticleBufferGeometry}
*/
createBufferGeometry() {
this.geometry = new THREE.BufferGeometry();
const {
interleavedBuffer,
geometry
} = this;
Object.keys(ATTRIBUTE_TO_SIZE_MAP).reduce((offset, attribute) => {
const size = ATTRIBUTE_TO_SIZE_MAP[attribute];
geometry.setAttribute(attribute, new THREE.InterleavedBufferAttribute(interleavedBuffer, size, offset));
return offset += size;
}, 0);
return this;
}
/**
* Gets the publicly accessible interleaved buffer.
*
* @return {THREE.InterleavedBuffer} buffers - The interleaved buffer
*/
get buffer() {
return this.interleavedBuffer;
}
get stride() {
return PARTICLE_BYTE_SIZE;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vUGFydGljbGVCdWZmZXIvaW5kZXguanMiXSwibmFtZXMiOlsiQVRUUklCVVRFX1RPX1NJWkVfTUFQIiwiREVGQVVMVF9NQVhfUEFSVElDTEVTIiwiUEFSVElDTEVfQllURV9TSVpFIiwiVEhSRUUiLCJQYXJ0aWNsZUJ1ZmZlciIsImNvbnN0cnVjdG9yIiwibWF4UGFydGljbGVzIiwidGhyZWUiLCJjcmVhdGVJbnRlcmxlYXZlZEJ1ZmZlciIsImNyZWF0ZUJ1ZmZlckdlb21ldHJ5IiwiYXJyYXlCdWZmZXIiLCJBcnJheUJ1ZmZlciIsImludGVybGVhdmVkQnVmZmVyIiwiSW50ZXJsZWF2ZWRCdWZmZXIiLCJGbG9hdDMyQXJyYXkiLCJnZW9tZXRyeSIsIkJ1ZmZlckdlb21ldHJ5IiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsIm9mZnNldCIsImF0dHJpYnV0ZSIsInNpemUiLCJzZXRBdHRyaWJ1dGUiLCJJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSIsImJ1ZmZlciIsInN0cmlkZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FDRUEscUJBREYsRUFFRUMscUJBRkYsRUFHRUMsa0JBSEYsUUFJTyxhQUpQO0FBTUEsSUFBSUMsS0FBSjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxjQUFOLENBQXFCO0FBQ2xDQyxFQUFBQSxXQUFXLENBQUNDLFlBQVksR0FBR0wscUJBQWhCLEVBQXVDTSxLQUF2QyxFQUE4QztBQUN2REosSUFBQUEsS0FBSyxHQUFHSSxLQUFSO0FBQ0EsU0FBS0QsWUFBTCxHQUFvQkEsWUFBcEI7QUFFQSxTQUFLRSx1QkFBTCxHQUErQkMsb0JBQS9CO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUQsRUFBQUEsdUJBQXVCLEdBQUc7QUFDeEIsVUFBTUUsV0FBVyxHQUFHLElBQUlDLFdBQUosQ0FBZ0IsS0FBS0wsWUFBTCxHQUFvQkosa0JBQXBDLENBQXBCO0FBRUEsU0FBS1UsaUJBQUwsR0FBeUIsSUFBSVQsS0FBSyxDQUFDVSxpQkFBVixDQUN2QixJQUFJQyxZQUFKLENBQWlCSixXQUFqQixDQUR1QixFQUV2QlIsa0JBRnVCLENBQXpCLENBSHdCLENBT3hCOztBQUVBLFdBQU8sSUFBUDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VPLEVBQUFBLG9CQUFvQixHQUFHO0FBQ3JCLFNBQUtNLFFBQUwsR0FBZ0IsSUFBSVosS0FBSyxDQUFDYSxjQUFWLEVBQWhCO0FBRUEsVUFBTTtBQUFFSixNQUFBQSxpQkFBRjtBQUFxQkcsTUFBQUE7QUFBckIsUUFBa0MsSUFBeEM7QUFFQUUsSUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlsQixxQkFBWixFQUFtQ21CLE1BQW5DLENBQTBDLENBQUNDLE1BQUQsRUFBU0MsU0FBVCxLQUF1QjtBQUMvRCxZQUFNQyxJQUFJLEdBQUd0QixxQkFBcUIsQ0FBQ3FCLFNBQUQsQ0FBbEM7QUFFQU4sTUFBQUEsUUFBUSxDQUFDUSxZQUFULENBQ0VGLFNBREYsRUFFRSxJQUFJbEIsS0FBSyxDQUFDcUIsMEJBQVYsQ0FBcUNaLGlCQUFyQyxFQUF3RFUsSUFBeEQsRUFBOERGLE1BQTlELENBRkY7QUFLQSxhQUFRQSxNQUFNLElBQUlFLElBQWxCO0FBQ0QsS0FURCxFQVNHLENBVEg7QUFXQSxXQUFPLElBQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUNZLE1BQU5HLE1BQU0sR0FBRztBQUNYLFdBQU8sS0FBS2IsaUJBQVo7QUFDRDs7QUFFUyxNQUFOYyxNQUFNLEdBQUc7QUFDWCxXQUFPeEIsa0JBQVA7QUFDRDs7QUEvRGlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQVRUUklCVVRFX1RPX1NJWkVfTUFQLFxuICBERUZBVUxUX01BWF9QQVJUSUNMRVMsXG4gIFBBUlRJQ0xFX0JZVEVfU0laRSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5sZXQgVEhSRUU7XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcHJvdmlkZXMgcGVyZm9ybWFudCBidWZmZXJzIGZvciBtYXBwaW5nIHBhcnRpY2xlIHByb3BlcnRpZXMgdG8gZ2VvbWV0cnkgdmVydGljZXMuXG4gKlxuICogQGF1dGhvciB0aHJheCA8bWFudGhyYXhAZ21haWwuY29tPlxuICogQGF1dGhvciByb2hhbi1kZXNocGFuZGUgPHJvaGFuQGNyZWF0aXZlbGlmZWZvcm0uY29tPlxuICogQHNlZSBodHRwczovL3RocmVlanMub3JnL2V4YW1wbGVzLz9xPWJ1ZmZlI3dlYmdsX2J1ZmZlcmdlb21ldHJ5X3BvaW50c19pbnRlcmxlYXZlZFxuICogQHNlZSBodHRwczovL3RocmVlanMub3JnL2V4YW1wbGVzLz9xPXBvaW50cyN3ZWJnbF9jdXN0b21fYXR0cmlidXRlc19wb2ludHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFydGljbGVCdWZmZXIge1xuICBjb25zdHJ1Y3RvcihtYXhQYXJ0aWNsZXMgPSBERUZBVUxUX01BWF9QQVJUSUNMRVMsIHRocmVlKSB7XG4gICAgVEhSRUUgPSB0aHJlZTtcbiAgICB0aGlzLm1heFBhcnRpY2xlcyA9IG1heFBhcnRpY2xlcztcblxuICAgIHRoaXMuY3JlYXRlSW50ZXJsZWF2ZWRCdWZmZXIoKS5jcmVhdGVCdWZmZXJHZW9tZXRyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGludGVybGVhdmVkIGJ1ZmZlciB0aGF0IHdpbGwgYmUgdXNlZCB0byB3cml0ZSBkYXRhIHRvIHRoZSBHUFUuXG4gICAqXG4gICAqIEByZXR1cm4ge1BhcnRpY2xlQnVmZmVyfVxuICAgKi9cbiAgY3JlYXRlSW50ZXJsZWF2ZWRCdWZmZXIoKSB7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5tYXhQYXJ0aWNsZXMgKiBQQVJUSUNMRV9CWVRFX1NJWkUpO1xuXG4gICAgdGhpcy5pbnRlcmxlYXZlZEJ1ZmZlciA9IG5ldyBUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcihcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoYXJyYXlCdWZmZXIpLFxuICAgICAgUEFSVElDTEVfQllURV9TSVpFXG4gICAgKTtcbiAgICAvLyB0aGlzLmludGVybGVhdmVkQnVmZmVyLnVzYWdlID0gVEhSRUUuRHluYW1pY0RyYXdVc2FnZTtcbiAgICBcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnZW9tZXRyeSdzIGJ1ZmZlciBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBOT1RFIEVhY2ggYXR0cmlidXRlIG5lZWRzIHRvIGJlIHNldCBhdCB0aGUgcmlnaHQgaW5kZXggaW4gdGhlIGJ1ZmZlciByaWdodCBhZnRlciB0aGUgcHJldmlvdXNcbiAgICogYXR0cmlidXRlIHRoYXQgb2NjdXBpZXMgYSBzZXQgYW1vdW50IG9mIHNpemUgaW4gdGhlIGJ1ZmZlci5cbiAgICpcbiAgICogQHJldHVybiB7UGFydGljbGVCdWZmZXJHZW9tZXRyeX1cbiAgICovXG4gIGNyZWF0ZUJ1ZmZlckdlb21ldHJ5KCkge1xuICAgIHRoaXMuZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcblxuICAgIGNvbnN0IHsgaW50ZXJsZWF2ZWRCdWZmZXIsIGdlb21ldHJ5IH0gPSB0aGlzO1xuXG4gICAgT2JqZWN0LmtleXMoQVRUUklCVVRFX1RPX1NJWkVfTUFQKS5yZWR1Y2UoKG9mZnNldCwgYXR0cmlidXRlKSA9PiB7XG4gICAgICBjb25zdCBzaXplID0gQVRUUklCVVRFX1RPX1NJWkVfTUFQW2F0dHJpYnV0ZV07XG5cbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZShcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICBuZXcgVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoaW50ZXJsZWF2ZWRCdWZmZXIsIHNpemUsIG9mZnNldClcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiAob2Zmc2V0ICs9IHNpemUpO1xuICAgIH0sIDApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcHVibGljbHkgYWNjZXN Line truncated
@@ -0,0 +1,2 @@
export const DATA_TEXTURE_SIZE = 256;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vVGV4dHVyZUF0bGFzL2NvbnN0YW50cy5qcyJdLCJuYW1lcyI6WyJEQVRBX1RFWFRVUkVfU0laRSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxpQkFBaUIsR0FBRyxHQUExQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBEQVRBX1RFWFRVUkVfU0laRSA9IDI1NjtcbiJdfQ==
@@ -0,0 +1,207 @@
import { RENDERER_TYPE_GPU_DESKTOP, RENDERER_TYPE_GPU_MOBILE } from '../../../types';
import { DATA_TEXTURE_SIZE } from './constants';
import { __DEV__ } from '../../../../constants';
import potpack from "../../../../utils/potpack.js";
/**
* Dynamic texture atlas for performant support of systems with multiple emitters and textures.
*
*/
export default class TextureAtlas {
constructor(renderer, shouldDebug) {
const {
three: THREE,
type: rendererType
} = renderer;
const data = new Float32Array(DATA_TEXTURE_SIZE * 4);
const ctx = this.ctx = document.createElement('canvas').getContext('2d');
const {
canvas
} = ctx;
this.shouldDebug = shouldDebug;
this.rendererType = rendererType;
this.indexData = data;
this.canvas = canvas;
this.entries = [];
if (rendererType === RENDERER_TYPE_GPU_DESKTOP) {
this.atlasIndex = new THREE.DataTexture(data, DATA_TEXTURE_SIZE, 1, THREE.RGBAFormat, THREE.FloatType);
}
canvas.width = canvas.height = DATA_TEXTURE_SIZE;
if (shouldDebug) {
this.debug(canvas, ctx);
}
this.atlasTexture = new THREE.CanvasTexture(canvas);
this.atlasTexture.flipY = false;
renderer.material.uniforms.uTexture.value = this.atlasTexture;
if (rendererType === RENDERER_TYPE_GPU_DESKTOP) {
renderer.material.uniforms.atlasIndex.value = this.atlasIndex;
}
renderer.material.uniformsNeedUpdate = true;
}
/**
* Logs to the console when in dev mode.
*
*/
log(...args) {
if (!__DEV__) {
return;
}
console.log(...args);
}
/**
* Debugs the texture atlas by rendering it to a canvas in the DOM.
*
*/
debug() {
const {
canvas,
ctx
} = this;
const halfmax = canvas.width;
ctx.fillStyle = 'purple';
ctx.fillRect(0, 0, halfmax, halfmax);
ctx.fillStyle = 'green';
ctx.fillRect(0, halfmax, halfmax, halfmax);
ctx.fillStyle = 'blue';
ctx.fillRect(halfmax, 0, halfmax, halfmax);
ctx.fillStyle = 'orange';
ctx.fillRect(halfmax, halfmax, halfmax, halfmax);
ctx.fillStyle = 'yellow';
ctx.font = canvas.width + 'px Verdana';
ctx.fillText('top row', 100, 500);
ctx.fillStyle = 'pink';
ctx.fillText('bottom row', 100, 1500);
canvas.style.position = 'absolute';
canvas.style.width = canvas.style.height = '300px';
canvas.style.left = canvas.style.top = '0px';
canvas.style.zIndex = 100;
document.body.appendChild(canvas);
}
/**
* Adds a texture to the texture atlas and flags that the atlas needs to be updated.
*
*/
addTexture(texture) {
this.log('Adding texture to atlas:', texture.uuid);
texture.textureIndex = this.entries.length;
this.entries.push({
texture: texture
});
this.needsUpdate = true;
}
/**
* Updates the texture atlas. Will only rebuild the atlas if all images are loaded.
*
*/
update() {
if (!this.needsUpdate) {
return;
}
const {
entries,
canvas,
indexData,
ctx,
atlasIndex,
atlasTexture,
rendererType
} = this;
for (let i = 0; i < entries.length; i++) {
if (!entries[i].texture.image) {
return;
}
}
this.needsUpdate = false;
for (let i = 0; i < entries.length; i++) {
const e = entries[i];
const {
texture
} = e;
const {
width,
height
} = texture.image;
e.w = width;
e.h = height;
}
const stats = potpack(entries);
this.log('Rebuilt atlas:', stats);
if (canvas.width != stats.w || canvas.height != stats.h) {
canvas.width = stats.w;
canvas.height = stats.h;
}
for (let i = 0; i < entries.length; i++) {
const e = this.entries[i];
const ii = e.texture.textureIndex * 4;
if (rendererType === RENDERER_TYPE_GPU_DESKTOP) {
indexData[ii + 0] = e.x / canvas.width;
indexData[ii + 1] = e.y / canvas.height;
indexData[ii + 2] = (e.x + e.w) / canvas.width;
indexData[ii + 3] = (e.y + e.h) / canvas.height;
}
if (rendererType === RENDERER_TYPE_GPU_MOBILE) {
indexData[ii + 0] = e.x / (canvas.width + 1);
indexData[ii + 1] = e.y / (canvas.height + 1);
indexData[ii + 2] = (e.x + e.w) / (canvas.width + 1);
indexData[ii + 3] = (e.y + e.h) / (canvas.height + 1);
}
ctx.drawImage(e.texture.image, e.x, e.y, e.w, e.h);
}
if (rendererType === RENDERER_TYPE_GPU_DESKTOP) {
atlasIndex.needsUpdate = true;
}
atlasTexture.needsUpdate = true;
}
/**
* Disposes of the textures used by the texture atlas.
*
* @return void
*/
destroy() {
const {
atlasIndex,
atlasTexture,
canvas
} = this;
atlasTexture.dispose();
atlasIndex && atlasIndex.dispose();
if (this.shouldDebug) {
canvas.remove();
}
this.entries = [];
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vVGV4dHVyZUF0bGFzL2luZGV4LmpzIl0sIm5hbWVzIjpbIlJFTkRFUkVSX1RZUEVfR1BVX0RFU0tUT1AiLCJSRU5ERVJFUl9UWVBFX0dQVV9NT0JJTEUiLCJEQVRBX1RFWFRVUkVfU0laRSIsIl9fREVWX18iLCJwb3RwYWNrIiwiVGV4dHVyZUF0bGFzIiwiY29uc3RydWN0b3IiLCJyZW5kZXJlciIsInNob3VsZERlYnVnIiwidGhyZWUiLCJUSFJFRSIsInR5cGUiLCJyZW5kZXJlclR5cGUiLCJkYXRhIiwiRmxvYXQzMkFycmF5IiwiY3R4IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZ2V0Q29udGV4dCIsImNhbnZhcyIsImluZGV4RGF0YSIsImVudHJpZXMiLCJhdGxhc0luZGV4IiwiRGF0YVRleHR1cmUiLCJSR0JBRm9ybWF0IiwiRmxvYXRUeXBlIiwid2lkdGgiLCJoZWlnaHQiLCJkZWJ1ZyIsImF0bGFzVGV4dHVyZSIsIkNhbnZhc1RleHR1cmUiLCJmbGlwWSIsIm1hdGVyaWFsIiwidW5pZm9ybXMiLCJ1VGV4dHVyZSIsInZhbHVlIiwidW5pZm9ybXNOZWVkVXBkYXRlIiwibG9nIiwiYXJncyIsImNvbnNvbGUiLCJoYWxmbWF4IiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJmb250IiwiZmlsbFRleHQiLCJzdHlsZSIsInBvc2l0aW9uIiwibGVmdCIsInRvcCIsInpJbmRleCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImFkZFRleHR1cmUiLCJ0ZXh0dXJlIiwidXVpZCIsInRleHR1cmVJbmRleCIsImxlbmd0aCIsInB1c2giLCJuZWVkc1VwZGF0ZSIsInVwZGF0ZSIsImkiLCJpbWFnZSIsImUiLCJ3IiwiaCIsInN0YXRzIiwiaWkiLCJ4IiwieSIsImRyYXdJbWFnZSIsImRlc3Ryb3kiLCJkaXNwb3NlIiwicmVtb3ZlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUNF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 Line truncated
@@ -0,0 +1,13 @@
import { DEFAULT_MAX_PARTICLES } from './ParticleBuffer/constants';
export const DEFAULT_RENDERER_OPTIONS = {
blending: 'AdditiveBlending',
baseColor: 0xffffff,
depthTest: true,
depthWrite: false,
transparent: true,
maxParticles: DEFAULT_MAX_PARTICLES,
shouldDebugTextureAtlas: false,
shouldForceDesktopRenderer: false,
shouldForceMobileRenderer: false
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vY29uc3RhbnRzLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfTUFYX1BBUlRJQ0xFUyIsIkRFRkFVTFRfUkVOREVSRVJfT1BUSU9OUyIsImJsZW5kaW5nIiwiYmFzZUNvbG9yIiwiZGVwdGhUZXN0IiwiZGVwdGhXcml0ZSIsInRyYW5zcGFyZW50IiwibWF4UGFydGljbGVzIiwic2hvdWxkRGVidWdUZXh0dXJlQXRsYXMiLCJzaG91bGRGb3JjZURlc2t0b3BSZW5kZXJlciIsInNob3VsZEZvcmNlTW9iaWxlUmVuZGVyZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLHFCQUFULFFBQXNDLDRCQUF0QztBQUVBLE9BQU8sTUFBTUMsd0JBQXdCLEdBQUc7QUFDdENDLEVBQUFBLFFBQVEsRUFBRSxrQkFENEI7QUFFdENDLEVBQUFBLFNBQVMsRUFBRSxRQUYyQjtBQUd0Q0MsRUFBQUEsU0FBUyxFQUFFLElBSDJCO0FBSXRDQyxFQUFBQSxVQUFVLEVBQUUsS0FKMEI7QUFLdENDLEVBQUFBLFdBQVcsRUFBRSxJQUx5QjtBQU10Q0MsRUFBQUEsWUFBWSxFQUFFUCxxQkFOd0I7QUFPdENRLEVBQUFBLHVCQUF1QixFQUFFLEtBUGE7QUFRdENDLEVBQUFBLDBCQUEwQixFQUFFLEtBUlU7QUFTdENDLEVBQUFBLHlCQUF5QixFQUFFO0FBVFcsQ0FBakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX01BWF9QQVJUSUNMRVMgfSBmcm9tICcuL1BhcnRpY2xlQnVmZmVyL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFTkRFUkVSX09QVElPTlMgPSB7XG4gIGJsZW5kaW5nOiAnQWRkaXRpdmVCbGVuZGluZycsXG4gIGJhc2VDb2xvcjogMHhmZmZmZmYsXG4gIGRlcHRoVGVzdDogdHJ1ZSxcbiAgZGVwdGhXcml0ZTogZmFsc2UsXG4gIHRyYW5zcGFyZW50OiB0cnVlLFxuICBtYXhQYXJ0aWNsZXM6IERFRkFVTFRfTUFYX1BBUlRJQ0xFUyxcbiAgc2hvdWxkRGVidWdUZXh0dXJlQXRsYXM6IGZhbHNlLFxuICBzaG91bGRGb3JjZURlc2t0b3BSZW5kZXJlcjogZmFsc2UsXG4gIHNob3VsZEZvcmNlTW9iaWxlUmVuZGVyZXI6IGZhbHNlLFxufTtcbiJdfQ==
@@ -0,0 +1,4 @@
export { Target, UniqueList } from './stores';
export { default as ParticleBuffer } from './ParticleBuffer';
export { default as TextureAtlas } from './TextureAtlas';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vaW5kZXguanMiXSwibmFtZXMiOlsiVGFyZ2V0IiwiVW5pcXVlTGlzdCIsImRlZmF1bHQiLCJQYXJ0aWNsZUJ1ZmZlciIsIlRleHR1cmVBdGxhcyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFBVCxFQUFpQkMsVUFBakIsUUFBbUMsVUFBbkM7QUFDQSxTQUFTQyxPQUFPLElBQUlDLGNBQXBCLFFBQTBDLGtCQUExQztBQUNBLFNBQVNELE9BQU8sSUFBSUUsWUFBcEIsUUFBd0MsZ0JBQXhDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgVGFyZ2V0LCBVbmlxdWVMaXN0IH0gZnJvbSAnLi9zdG9yZXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQYXJ0aWNsZUJ1ZmZlciB9IGZyb20gJy4vUGFydGljbGVCdWZmZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUZXh0dXJlQXRsYXMgfSBmcm9tICcuL1RleHR1cmVBdGxhcyc7XG4iXX0=
@@ -0,0 +1,2 @@
export const SIZE_ATTENUATION_FACTOR = '600.0';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vc2hhZGVycy9jb25zdGFudHMuanMiXSwibmFtZXMiOlsiU0laRV9BVFRFTlVBVElPTl9GQUNUT1IiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTUEsdUJBQXVCLEdBQUcsT0FBaEMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgU0laRV9BVFRFTlVBVElPTl9GQUNUT1IgPSAnNjAwLjAnO1xuIl19
@@ -0,0 +1,26 @@
/**
* Simple class that stores the particle's "target" or "next" state.
*
*/
export class Target {
constructor(THREE) {
this.position = new THREE.Vector3();
this.rotation = new THREE.Vector3();
this.size = 0;
this.color = new THREE.Color();
this.alpha = 0;
this.texture = null;
this.index = 0;
}
reset() {
this.position.set(0, 0, 0);
this.rotation.set(0, 0, 0);
this.size = 0;
this.color.setRGB(0, 0, 0);
this.alpha = 0;
this.texture = null;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vc3RvcmVzL1RhcmdldC5qcyJdLCJuYW1lcyI6WyJUYXJnZXQiLCJjb25zdHJ1Y3RvciIsIlRIUkVFIiwicG9zaXRpb24iLCJWZWN0b3IzIiwicm90YXRpb24iLCJzaXplIiwiY29sb3IiLCJDb2xvciIsImFscGhhIiwidGV4dHVyZSIsImluZGV4IiwicmVzZXQiLCJzZXQiLCJzZXRSR0IiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNQSxNQUFOLENBQWE7QUFDbEJDLEVBQUFBLFdBQVcsQ0FBQ0MsS0FBRCxFQUFRO0FBQ2pCLFNBQUtDLFFBQUwsR0FBZ0IsSUFBSUQsS0FBSyxDQUFDRSxPQUFWLEVBQWhCO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQixJQUFJSCxLQUFLLENBQUNFLE9BQVYsRUFBaEI7QUFDQSxTQUFLRSxJQUFMLEdBQVksQ0FBWjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxJQUFJTCxLQUFLLENBQUNNLEtBQVYsRUFBYjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxDQUFiO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLElBQWY7QUFDQSxTQUFLQyxLQUFMLEdBQWEsQ0FBYjtBQUNEOztBQUVEQyxFQUFBQSxLQUFLLEdBQUc7QUFDTixTQUFLVCxRQUFMLENBQWNVLEdBQWQsQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsRUFBd0IsQ0FBeEI7QUFDQSxTQUFLUixRQUFMLENBQWNRLEdBQWQsQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsRUFBd0IsQ0FBeEI7QUFDQSxTQUFLUCxJQUFMLEdBQVksQ0FBWjtBQUNBLFNBQUtDLEtBQUwsQ0FBV08sTUFBWCxDQUFrQixDQUFsQixFQUFxQixDQUFyQixFQUF3QixDQUF4QjtBQUNBLFNBQUtMLEtBQUwsR0FBYSxDQUFiO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLElBQWY7QUFDRDs7QUFsQmlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaW1wbGUgY2xhc3MgdGhhdCBzdG9yZXMgdGhlIHBhcnRpY2xlJ3MgXCJ0YXJnZXRcIiBvciBcIm5leHRcIiBzdGF0ZS5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXQge1xuICBjb25zdHJ1Y3RvcihUSFJFRSkge1xuICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIHRoaXMucm90YXRpb24gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgdGhpcy5jb2xvciA9IG5ldyBUSFJFRS5Db2xvcigpO1xuICAgIHRoaXMuYWxwaGEgPSAwO1xuICAgIHRoaXMudGV4dHVyZSA9IG51bGw7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcbiAgICB0aGlzLnJvdGF0aW9uLnNldCgwLCAwLCAwKTtcbiAgICB0aGlzLnNpemUgPSAwO1xuICAgIHRoaXMuY29sb3Iuc2V0UkdCKDAsIDAsIDApO1xuICAgIHRoaXMuYWxwaGEgPSAwO1xuICAgIHRoaXMudGV4dHVyZSA9IG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,29 @@
/**
* Map of particle IDs to integer ids
*/
export class UniqueList {
constructor(max = Infinity) {
this.max = max;
this.count = 0;
this._items = {};
}
add(item) {
if (this._items[item] !== undefined) {
return;
}
this._items[item] = this.count++;
}
find(item) {
return this._items[item];
}
destroy() {
this._items = {};
this.count = 0;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vc3RvcmVzL1VuaXF1ZUxpc3QuanMiXSwibmFtZXMiOlsiVW5pcXVlTGlzdCIsImNvbnN0cnVjdG9yIiwibWF4IiwiSW5maW5pdHkiLCJjb3VudCIsIl9pdGVtcyIsImFkZCIsIml0ZW0iLCJ1bmRlZmluZWQiLCJmaW5kIiwiZGVzdHJveSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNQSxVQUFOLENBQWlCO0FBQ3RCQyxFQUFBQSxXQUFXLENBQUNDLEdBQUcsR0FBR0MsUUFBUCxFQUFpQjtBQUMxQixTQUFLRCxHQUFMLEdBQVdBLEdBQVg7QUFDQSxTQUFLRSxLQUFMLEdBQWEsQ0FBYjtBQUNBLFNBQUtDLE1BQUwsR0FBYyxFQUFkO0FBQ0Q7O0FBRURDLEVBQUFBLEdBQUcsQ0FBQ0MsSUFBRCxFQUFPO0FBQ1IsUUFBSSxLQUFLRixNQUFMLENBQVlFLElBQVosTUFBc0JDLFNBQTFCLEVBQXFDO0FBQ25DO0FBQ0Q7O0FBRUQsU0FBS0gsTUFBTCxDQUFZRSxJQUFaLElBQW9CLEtBQUtILEtBQUwsRUFBcEI7QUFDRDs7QUFFREssRUFBQUEsSUFBSSxDQUFDRixJQUFELEVBQU87QUFDVCxXQUFPLEtBQUtGLE1BQUwsQ0FBWUUsSUFBWixDQUFQO0FBQ0Q7O0FBRURHLEVBQUFBLE9BQU8sR0FBRztBQUNSLFNBQUtMLE1BQUwsR0FBYyxFQUFkO0FBQ0EsU0FBS0QsS0FBTCxHQUFhLENBQWI7QUFDRDs7QUF0QnFCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXAgb2YgcGFydGljbGUgSURzIHRvIGludGVnZXIgaWRzXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmlxdWVMaXN0IHtcbiAgY29uc3RydWN0b3IobWF4ID0gSW5maW5pdHkpIHtcbiAgICB0aGlzLm1heCA9IG1heDtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgICB0aGlzLl9pdGVtcyA9IHt9O1xuICB9XG5cbiAgYWRkKGl0ZW0pIHtcbiAgICBpZiAodGhpcy5faXRlbXNbaXRlbV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2l0ZW1zW2l0ZW1dID0gdGhpcy5jb3VudCsrO1xuICB9XG5cbiAgZmluZChpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zW2l0ZW1dO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9pdGVtcyA9IHt9O1xuICAgIHRoaXMuY291bnQgPSAwO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,3 @@
export { Target } from './Target';
export { UniqueList } from './UniqueList';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9jb21tb24vc3RvcmVzL2luZGV4LmpzIl0sIm5hbWVzIjpbIlRhcmdldCIsIlVuaXF1ZUxpc3QiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE1BQVQsUUFBdUIsVUFBdkI7QUFDQSxTQUFTQyxVQUFULFFBQTJCLGNBQTNCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi9UYXJnZXQnO1xuZXhwb3J0IHsgVW5pcXVlTGlzdCB9IGZyb20gJy4vVW5pcXVlTGlzdCc7XG4iXX0=
@@ -0,0 +1,57 @@
import BaseRenderer from '../BaseRenderer';
import { DEFAULT_RENDERER_OPTIONS } from './common/constants';
import DesktopGPURenderer from './Desktop';
import MobileGPURenderer from './Mobile';
import { RENDERER_TYPE_GPU } from '../types';
/**
* Performant particle renderer that uses THREE.Points to propagate particle (postiion, rgba etc.,) properties to
* vertices in a ParticleBufferGeometry.
* Uses a dynamic texture atlas to support systems with mutliple sprites in a performant way.
*
* NOTE! This is an experimental renderer and is currently not covered by tests, coverage will be added when the API
* is more stable. Currently only compatible with sprite/texture based systems. Meshes are not yet supported.
*
* @author thrax <manthrax@gmail.com>
* @author rohan-deshpande <rohan@creativelifeform.com>
*/
export default class GPURenderer extends BaseRenderer {
constructor(container, THREE, options = DEFAULT_RENDERER_OPTIONS) {
super(RENDERER_TYPE_GPU);
const {
shouldForceDesktopRenderer,
shouldForceMobileRenderer
} = options;
const args = [container, THREE, options];
if (shouldForceDesktopRenderer) {
return new DesktopGPURenderer(...args);
}
if (shouldForceMobileRenderer) {
return new MobileGPURenderer(...args);
}
if (!this.isFloatingPointTextureSupported()) {
return new MobileGPURenderer(...args);
}
return new DesktopGPURenderer(...args);
}
isFloatingPointTextureSupported() {
const canvas = document.createElement('canvas');
if (window.WebGL2RenderingContext && canvas.getContext('webgl2')) {
// return false here to test the mobile renderer on desktop
return true;
}
const gl = canvas.getContext('webgl');
const support = !!gl.getExtension('OES_texture_float');
canvas.remove();
return support;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9yZW5kZXJlci9HUFVSZW5kZXJlci9pbmRleC5qcyJdLCJuYW1lcyI6WyJCYXNlUmVuZGVyZXIiLCJERUZBVUxUX1JFTkRFUkVSX09QVElPTlMiLCJEZXNrdG9wR1BVUmVuZGVyZXIiLCJNb2JpbGVHUFVSZW5kZXJlciIsIlJFTkRFUkVSX1RZUEVfR1BVIiwiR1BVUmVuZGVyZXIiLCJjb25zdHJ1Y3RvciIsImNvbnRhaW5lciIsIlRIUkVFIiwib3B0aW9ucyIsInNob3VsZEZvcmNlRGVza3RvcFJlbmRlcmVyIiwic2hvdWxkRm9yY2VNb2JpbGVSZW5kZXJlciIsImFyZ3MiLCJpc0Zsb2F0aW5nUG9pbnRUZXh0dXJlU3VwcG9ydGVkIiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwid2luZG93IiwiV2ViR0wyUmVuZGVyaW5nQ29udGV4dCIsImdldENvbnRleHQiLCJnbCIsInN1cHBvcnQiLCJnZXRFeHRlbnNpb24iLCJyZW1vdmUiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVAsTUFBeUIsaUJBQXpCO0FBQ0EsU0FBU0Msd0JBQVQsUUFBeUMsb0JBQXpDO0FBQ0EsT0FBT0Msa0JBQVAsTUFBK0IsV0FBL0I7QUFDQSxPQUFPQyxpQkFBUCxNQUE4QixVQUE5QjtBQUNBLFNBQVNDLGlCQUFULFFBQWtDLFVBQWxDO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxlQUFlLE1BQU1DLFdBQU4sU0FBMEJMLFlBQTFCLENBQXVDO0FBQ3BETSxFQUFBQSxXQUFXLENBQUNDLFNBQUQsRUFBWUMsS0FBWixFQUFtQkMsT0FBTyxHQUFHUix3QkFBN0IsRUFBdUQ7QUFDaEUsVUFBTUcsaUJBQU47QUFFQSxVQUFNO0FBQUVNLE1BQUFBLDBCQUFGO0FBQThCQyxNQUFBQTtBQUE5QixRQUE0REYsT0FBbEU7QUFDQSxVQUFNRyxJQUFJLEdBQUcsQ0FBQ0wsU0FBRCxFQUFZQyxLQUFaLEVBQW1CQyxPQUFuQixDQUFiOztBQUVBLFFBQUlDLDBCQUFKLEVBQWdDO0FBQzlCLGFBQU8sSUFBSVIsa0JBQUosQ0FBdUIsR0FBR1UsSUFBMUIsQ0FBUDtBQUNEOztBQUVELFFBQUlELHlCQUFKLEVBQStCO0FBQzdCLGFBQU8sSUFBSVIsaUJBQUosQ0FBc0IsR0FBR1MsSUFBekIsQ0FBUDtBQUNEOztBQUVELFFBQUksQ0FBQyxLQUFLQywrQkFBTCxFQUFMLEVBQTZDO0FBQzNDLGFBQU8sSUFBSVYsaUJBQUosQ0FBc0IsR0FBR1MsSUFBekIsQ0FBUDtBQUNEOztBQUVELFdBQU8sSUFBSVYsa0JBQUosQ0FBdUIsR0FBR1UsSUFBMUIsQ0FBUDtBQUNEOztBQUVEQyxFQUFBQSwrQkFBK0IsR0FBRztBQUNoQyxVQUFNQyxNQUFNLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBVCxDQUF1QixRQUF2QixDQUFmOztBQUVBLFFBQUlDLE1BQU0sQ0FBQ0Msc0JBQVAsSUFBaUNKLE1BQU0sQ0FBQ0ssVUFBUCxDQUFrQixRQUFsQixDQUFyQyxFQUFrRTtBQUNoRTtBQUNBLGFBQU8sSUFBUDtBQUNEOztBQUVELFVBQU1DLEVBQUUsR0FBR04sTUFBTSxDQUFDSyxVQUFQLENBQWtCLE9BQWxCLENBQVg7QUFDQSxVQUFNRSxPQUFPLEdBQUcsQ0FBQyxDQUFDRCxFQUFFLENBQUNFLFlBQUgsQ0FBZ0IsbUJBQWhCLENBQWxCO0FBRUFSLElBQUFBLE1BQU0sQ0FBQ1MsTUFBUDtBQUVBLFdBQU9GLE9BQVA7QUFDRDs7QUFwQ21EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tICcuLi9CYXNlUmVuZGVyZXInO1xuaW1wb3J0IHsgREVGQVVMVF9SRU5ERVJFUl9PUFRJT05TIH0gZnJvbSAnLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCBEZXNrdG9wR1BVUmVuZGVyZXIgZnJvbSAnLi9EZXNrdG9wJztcbmltcG9ydCBNb2JpbGVHUFVSZW5kZXJlciBmcm9tICcuL01vYmlsZSc7XG5pbXBvcnQgeyBSRU5ERVJFUl9UWVBFX0dQVSB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBQZXJmb3JtYW50IHBhcnRpY2xlIHJlbmRlcmVyIHRoYXQgdXNlcyBUSFJFRS5Qb2ludHMgdG8gcHJvcGFnYXRlIHBhcnRpY2xlIChwb3N0aWlvbiwgcmdiYSBldGMuLCkgcHJvcGVydGllcyB0b1xuICogdmVydGljZXMgaW4gYSBQYXJ0aWNsZUJ1ZmZlckdlb21ldHJ5LlxuICogVXNlcyBhIGR5bmFtaWMgdGV4dHVyZSBhdGxhcyB0byBzdXBwb3J0IHN5c3RlbXMgd2l0aCBtdXRsaXBsZSBzcHJpdGVzIGluIGEgcGVyZm9ybWFudCB3YXkuXG4gKlxuICogTk9URSEgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgcmVuZGVyZXIgYW5kIGlzIGN1cnJlbnRseSBub3QgY292ZXJlZCBieSB0ZXN0cywgY292ZXJhZ2Ugd2lsbCBiZSBhZGRlZCB3aGVuIHRoZSBBUElcbiAqIGlzIG1vcmUgc3RhYmxlLiBDdXJyZW50bHkgb25seSBjb21wYXRpYmxlIHdpdGggc3ByaXRlL3RleHR1cmUgYmFzZWQgc3lzdGVtcy4gTWVzaGVzIGFyZSBub3QgeWV0IHN1cHBvcnRlZC5cbiAqXG4gKiBAYXV0aG9yIHRocmF4IDxtYW50aHJheEBnbWFpbC5jb20+XG4gKiBAYXV0aG9yIHJvaGFuLWRlc2hwYW5kZSA8cm9oYW5AY3JlYXRpdmVsaWZlZm9ybS5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdQVVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCBUSFJFRSwgb3B0aW9ucyA9IERFRkFVTFRfUkVOREVSRVJfT1BUSU9OUykge1xuICAgIHN1cGVyKFJFTkRFUkVSX1RZUEVfR1BVKTtcblxuICAgIGNvbnN0IHsgc2hvdWxkRm9yY2VEZXNrdG9wUmVuZGVyZXIsIHNob3VsZEZvcmNlTW9iaWxlUmVuZGVyZXIgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYXJncyA9IFtjb250YWluZXIsIFRIUkVFLCBvcHRpb25zXTtcblxuICAgIGlmIChzaG91bGRGb3JjZURlc2t0b3BSZW5kZXJlcikge1xuICAgICAgcmV0dXJuIG5ldyBEZXNrdG9wR1BVUmVuZGVyZXIoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEZvcmNlTW9iaWxlUmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiBuZXcgTW9iaWxlR1BVUmVuZGVyZXIoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzRmxvYXRpbmdQb2ludFRleHR1cmVTdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuIG5ldyBNb2JpbGVHUFVSZW5kZXJlciguLi5hcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERlc2t0b3BHUFVSZW5kZXJlciguLi5hcmdzKTtcbiAgfVxuXG4gIGlzRmxvYXRpbmdQb2ludFRleHR1cmVTdXBwb3J0ZWQoKSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICBpZiAod2luZG93LldlYkdMMlJlbmRlcmluZ0NvbnRleHQgJiYgY2FudmFzLmdldENvbnRleHQoJ3dlYmdsMicpKSB7XG4gICAgICAvLyByZXR1cm4gZmFsc2UgaGVyZSB0byB0ZXN0IHRoZSBtb2JpbGUgcmVuZGVyZXIgb24gZGVza3RvcFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKTtcbiAgICBjb25zdCBzdXBwb3J0ID0gISFnbC5nZXRFeHRlbnNpb24oJ09FU190ZXh0dXJlX2Zsb2F0Jyk7XG5cbiAgICBjYW52YXMucmVtb3ZlKCk7XG5cbiAgICByZXR1cm4gc3VwcG9ydDtcbiAgfVxufVxuIl19
@@ -0,0 +1,93 @@
import BaseRenderer from './BaseRenderer';
import { PUID } from '../utils';
import { Pool } from '../core';
import { RENDERER_TYPE_MESH as type } from './types';
/**
* @requires THREE - { Mesh, BoxGeometry, MeshLambertMaterial }
*/
export default class MeshRenderer extends BaseRenderer {
/**
* @param {object} container - An Object3D container, usually a THREE.Scene
* @param {object} THREE - THREE Api
*/
constructor(container, THREE) {
super(type);
this.container = container;
this._targetPool = new Pool();
this._materialPool = new Pool();
this._body = new THREE.Mesh(new THREE.BoxGeometry(50, 50, 50), new THREE.MeshLambertMaterial({
color: '#ff0000'
}));
}
isThreeSprite(particle) {
return particle.target.isSprite;
}
onSystemUpdate() {}
onParticleCreated(particle) {
if (!particle.target) {
//set target
if (!particle.body) particle.body = this._body;
particle.target = this._targetPool.get(particle.body); //set material
if (particle.useAlpha || particle.useColor) {
particle.target.material.__puid = PUID.id(particle.body.material);
particle.target.material = this._materialPool.get(particle.target.material);
}
}
if (particle.target) {
particle.target.position.copy(particle.position);
this.container.add(particle.target);
}
}
onParticleUpdate(particle) {
const {
target,
useAlpha,
useColor
} = particle;
if (!target) {
return;
}
target.position.copy(particle.position);
this.rotate(particle);
this.scale(particle);
if (useAlpha) {
target.material.opacity = particle.alpha;
target.material.transparent = true;
}
if (useColor) {
target.material.color.copy(particle.color);
}
}
rotate(particle) {
particle.target.rotation.set(particle.rotation.x, particle.rotation.y, particle.rotation.z);
}
scale(particle) {
particle.target.scale.set(particle.scale, particle.scale, particle.scale);
}
onParticleDead(particle) {
if (particle.target) {
if (particle.useAlpha || particle.useColor) this._materialPool.expire(particle.target.material);
this._targetPool.expire(particle.target);
this.container.remove(particle.target);
particle.target = null;
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZW5kZXJlci9NZXNoUmVuZGVyZXIuanMiXSwibmFtZXMiOlsiQmFzZVJlbmRlcmVyIiwiUFVJRCIsIlBvb2wiLCJSRU5ERVJFUl9UWVBFX01FU0giLCJ0eXBlIiwiTWVzaFJlbmRlcmVyIiwiY29uc3RydWN0b3IiLCJjb250YWluZXIiLCJUSFJFRSIsIl90YXJnZXRQb29sIiwiX21hdGVyaWFsUG9vbCIsIl9ib2R5IiwiTWVzaCIsIkJveEdlb21ldHJ5IiwiTWVzaExhbWJlcnRNYXRlcmlhbCIsImNvbG9yIiwiaXNUaHJlZVNwcml0ZSIsInBhcnRpY2xlIiwidGFyZ2V0IiwiaXNTcHJpdGUiLCJvblN5c3RlbVVwZGF0ZSIsIm9uUGFydGljbGVDcmVhdGVkIiwiYm9keSIsImdldCIsInVzZUFscGhhIiwidXNlQ29sb3IiLCJtYXRlcmlhbCIsIl9fcHVpZCIsImlkIiwicG9zaXRpb24iLCJjb3B5IiwiYWRkIiwib25QYXJ0aWNsZVVwZGF0ZSIsInJvdGF0ZSIsInNjYWxlIiwib3BhY2l0eSIsImFscGhhIiwidHJhbnNwYXJlbnQiLCJyb3RhdGlvbiIsInNldCIsIngiLCJ5IiwieiIsIm9uUGFydGljbGVEZWFkIiwiZXhwaXJlIiwicmVtb3ZlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFQLE1BQXlCLGdCQUF6QjtBQUNBLFNBQVNDLElBQVQsUUFBcUIsVUFBckI7QUFDQSxTQUFTQyxJQUFULFFBQXFCLFNBQXJCO0FBQ0EsU0FBU0Msa0JBQWtCLElBQUlDLElBQS9CLFFBQTJDLFNBQTNDO0FBRUE7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsWUFBTixTQUEyQkwsWUFBM0IsQ0FBd0M7QUFDckQ7QUFDRjtBQUNBO0FBQ0E7QUFDRU0sRUFBQUEsV0FBVyxDQUFDQyxTQUFELEVBQVlDLEtBQVosRUFBbUI7QUFDNUIsVUFBTUosSUFBTjtBQUVBLFNBQUtHLFNBQUwsR0FBaUJBLFNBQWpCO0FBQ0EsU0FBS0UsV0FBTCxHQUFtQixJ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Q0FBQ3FCLFFBQVQsQ0FBa0JJLENBQXpGO0FBQ0Q7O0FBRURSLEVBQUFBLEtBQUssQ0FBQ2pCLFFBQUQsRUFBVztBQUNkQSxJQUFBQSxRQUFRLENBQUNDLE1BQVQsQ0FBZ0JnQixLQUFoQixDQUFzQkssR0FBdEIsQ0FBMEJ0QixRQUFRLENBQUNpQixLQUFuQyxFQUEwQ2pCLFFBQVEsQ0FBQ2lCLEtBQW5ELEVBQTBEakIsUUFBUSxDQUFDaUIsS0FBbkU7QUFDRDs7QUFFRFMsRUFBQUEsY0FBYyxDQUFDMUIsUUFBRCxFQUFXO0FBQ3ZCLFFBQUlBLFFBQVEsQ0FBQ0MsTUFBYixFQUFxQjtBQUNuQixVQUFJRCxRQUFRLENBQUNPLFFBQVQsSUFBcUJQLFFBQVEsQ0FBQ1EsUUFBbEMsRUFDRSxLQUFLZixhQUFMLENBQW1Ca0MsTUFBbkIsQ0FBMEIzQixRQUFRLENBQUNDLE1BQVQsQ0FBZ0JRLFFBQTFDOztBQUVGLFdBQUtqQixXQUFMLENBQWlCbUMsTUFBakIsQ0FBd0IzQixRQUFRLENBQUNDLE1BQWpDOztBQUNBLFdBQUtYLFNBQUwsQ0FBZXNDLE1BQWYsQ0FBc0I1QixRQUFRLENBQUNDLE1BQS9CO0FBQ0FELE1BQUFBLFFBQVEsQ0FBQ0MsTUFBVCxHQUFrQixJQUFsQjtBQUNEO0FBQ0Y7O0FBcEZvRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSAnLi9CYXNlUmVuZGVyZXInO1xuaW1wb3J0IHsgUFVJRCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFBvb2wgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IFJFTkRFUkVSX1RZUEVfTUVTSCBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQHJlcXVpcmVzIFRIUkVFIC0geyBNZXNoLCBCb3hHZW9tZXRyeSwgTWVzaExhbWJlcnRNYXRlcmlhbCB9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lc2hSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGFpbmVyIC0gQW4gT2JqZWN0M0QgY29udGFpbmVyLCB1c3VhbGx5IGEgVEhSRUUuU2NlbmVcbiAgICogQHBhcmFtIHtvYmplY3R9IFRIUkVFIC0gVEhSRUU Line truncated
@@ -0,0 +1,30 @@
import MeshRenderer from './MeshRenderer';
import { RENDERER_TYPE_SPRITE as type } from './types';
/**
* @requires THREE - { Mesh, BoxGeometry, MeshLambertMaterial, Sprite, SpriteMaterial }
*/
export default class SpriteRenderer extends MeshRenderer {
constructor(container, THREE) {
super(container, THREE);
/**
* @desc The class type.
* @type {string}
*/
this.type = type;
this._body = new THREE.Sprite(new THREE.SpriteMaterial({
color: 0xffffff
}));
}
rotate(particle) {
particle.target.material.rotation = particle.rotation.z;
}
scale(particle) {
particle.target.scale.set(particle.scale * particle.radius, particle.scale * particle.radius, 1);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZW5kZXJlci9TcHJpdGVSZW5kZXJlci5qcyJdLCJuYW1lcyI6WyJNZXNoUmVuZGVyZXIiLCJSRU5ERVJFUl9UWVBFX1NQUklURSIsInR5cGUiLCJTcHJpdGVSZW5kZXJlciIsImNvbnN0cnVjdG9yIiwiY29udGFpbmVyIiwiVEhSRUUiLCJfYm9keSIsIlNwcml0ZSIsIlNwcml0ZU1hdGVyaWFsIiwiY29sb3IiLCJyb3RhdGUiLCJwYXJ0aWNsZSIsInRhcmdldCIsIm1hdGVyaWFsIiwicm90YXRpb24iLCJ6Iiwic2NhbGUiLCJzZXQiLCJyYWRpdXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVAsTUFBeUIsZ0JBQXpCO0FBQ0EsU0FBU0Msb0JBQW9CLElBQUlDLElBQWpDLFFBQTZDLFNBQTdDO0FBRUE7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsY0FBTixTQUE2QkgsWUFBN0IsQ0FBMEM7QUFDdkRJLEVBQUFBLFdBQVcsQ0FBQ0MsU0FBRCxFQUFZQyxLQUFaLEVBQW1CO0FBQzVCLFVBQU1ELFNBQU4sRUFBaUJDLEtBQWpCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0osSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0ssS0FBTCxHQUFhLElBQUlELEtBQUssQ0FBQ0UsTUFBVixDQUNYLElBQUlGLEtBQUssQ0FBQ0csY0FBVixDQUF5QjtBQUFFQyxNQUFBQSxLQUFLLEVBQUU7QUFBVCxLQUF6QixDQURXLENBQWI7QUFHRDs7QUFFREMsRUFBQUEsTUFBTSxDQUFDQyxRQUFELEVBQVc7QUFDZkEsSUFBQUEsUUFBUSxDQUFDQyxNQUFULENBQWdCQyxRQUFoQixDQUF5QkMsUUFBekIsR0FBb0NILFFBQVEsQ0FBQ0csUUFBVCxDQUFrQkMsQ0FBdEQ7QUFDRDs7QUFFREMsRUFBQUEsS0FBSyxDQUFDTCxRQUFELEVBQVc7QUFDZEEsSUFBQUEsUUFBUSxDQUFDQyxNQUFULENBQWdCSSxLQUFoQixDQUFzQkMsR0FBdEIsQ0FDRU4sUUFBUSxDQUFDSyxLQUFULEdBQWlCTCxRQUFRLENBQUNPLE1BRDVCLEVBRUVQLFFBQVEsQ0FBQ0ssS0FBVCxHQUFpQkwsUUFBUSxDQUFDTyxNQUY1QixFQUdFLENBSEY7QUFLRDs7QUF4QnNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1lc2hSZW5kZXJlciBmcm9tICcuL01lc2hSZW5kZXJlcic7XG5pbXBvcnQgeyBSRU5ERVJFUl9UWVBFX1NQUklURSBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQHJlcXVpcmVzIFRIUkVFIC0geyBNZXNoLCBCb3hHZW9tZXRyeSwgTWVzaExhbWJlcnRNYXRlcmlhbCwgU3ByaXRlLCBTcHJpdGVNYXRlcmlhbCB9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNwcml0ZVJlbmRlcmVyIGV4dGVuZHMgTWVzaFJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCBUSFJFRSkge1xuICAgIHN1cGVyKGNvbnRhaW5lciwgVEhSRUUpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNsYXNzIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuX2JvZHkgPSBuZXcgVEhSRUUuU3ByaXRlKFxuICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHsgY29sb3I6IDB4ZmZmZmZmIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJvdGF0ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnRhcmdldC5tYXRlcmlhbC5yb3RhdGlvbiA9IHBhcnRpY2xlLnJvdGF0aW9uLno7XG4gIH1cblxuICBzY2FsZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnRhcmdldC5zY2FsZS5zZXQoXG4gICAgICBwYXJ0aWNsZS5zY2FsZSAqIHBhcnRpY2xlLnJhZGl1cyxcbiAgICAgIHBhcnRpY2xlLnNjYWxlICogcGFydGljbGUucmFkaXVzLFxuICAgICAgMVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
export { default as CustomRenderer } from './CustomRenderer';
export { default as MeshRenderer } from './MeshRenderer';
export { default as SpriteRenderer } from './SpriteRenderer';
export { default as GPURenderer } from './GPURenderer';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZW5kZXJlci9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0IiwiQ3VzdG9tUmVuZGVyZXIiLCJNZXNoUmVuZGVyZXIiLCJTcHJpdGVSZW5kZXJlciIsIkdQVVJlbmRlcmVyIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLElBQUlDLGNBQXBCLFFBQTBDLGtCQUExQztBQUNBLFNBQVNELE9BQU8sSUFBSUUsWUFBcEIsUUFBd0MsZ0JBQXhDO0FBQ0EsU0FBU0YsT0FBTyxJQUFJRyxjQUFwQixRQUEwQyxrQkFBMUM7QUFDQSxTQUFTSCxPQUFPLElBQUlJLFdBQXBCLFFBQXVDLGVBQXZDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXN0b21SZW5kZXJlciB9IGZyb20gJy4vQ3VzdG9tUmVuZGVyZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNZXNoUmVuZGVyZXIgfSBmcm9tICcuL01lc2hSZW5kZXJlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNwcml0ZVJlbmRlcmVyIH0gZnJvbSAnLi9TcHJpdGVSZW5kZXJlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdQVVJlbmRlcmVyIH0gZnJvbSAnLi9HUFVSZW5kZXJlcic7XG4iXX0=
Loaded 100 of 1321 files, more files were not shown because too many files have changed in this diff. Show more