three-nebula 11.0.0 → 11.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/three-nebula.cjs +109 -0
- package/dist/three-nebula.cjs.map +1 -0
- package/dist/three-nebula.mjs +2968 -0
- package/dist/three-nebula.mjs.map +1 -0
- package/dist/three-nebula.umd.js +109 -0
- package/dist/three-nebula.umd.js.map +1 -0
- package/package.json +23 -47
- package/specs/01-emitter-hierarchy.md +200 -0
- package/specs/02-determinism-scrubbing.md +188 -0
- package/specs/03-sound-renderer.md +183 -0
- package/specs/04-schema-versioning.md +140 -0
- package/specs/05-content-addressed-assets.md +288 -0
- package/specs/README.md +80 -0
- package/build/cjs/behaviour/Alpha.js +0 -189
- package/build/cjs/behaviour/Attraction.js +0 -189
- package/build/cjs/behaviour/Behaviour.js +0 -253
- package/build/cjs/behaviour/Collision.js +0 -146
- package/build/cjs/behaviour/Color.js +0 -148
- package/build/cjs/behaviour/CrossZone.js +0 -141
- package/build/cjs/behaviour/Force.js +0 -126
- package/build/cjs/behaviour/Gravity.js +0 -78
- package/build/cjs/behaviour/RandomDrift.js +0 -153
- package/build/cjs/behaviour/Repulsion.js +0 -123
- package/build/cjs/behaviour/Rotate.js +0 -265
- package/build/cjs/behaviour/Scale.js +0 -177
- package/build/cjs/behaviour/Spring.js +0 -133
- package/build/cjs/behaviour/constants.js +0 -28
- package/build/cjs/behaviour/index.js +0 -112
- package/build/cjs/behaviour/types.js +0 -33
- package/build/cjs/constants/index.js +0 -61
- package/build/cjs/core/Particle.js +0 -390
- package/build/cjs/core/Pool.js +0 -203
- package/build/cjs/core/System.js +0 -366
- package/build/cjs/core/constants.js +0 -163
- package/build/cjs/core/fromJSON.js +0 -128
- package/build/cjs/core/fromJSONAsync.js +0 -239
- package/build/cjs/core/index.js +0 -32
- package/build/cjs/core/three/Euler.js +0 -233
- package/build/cjs/core/three/Math.js +0 -91
- package/build/cjs/core/three/Matrix4.js +0 -745
- package/build/cjs/core/three/Quaternion.js +0 -451
- package/build/cjs/core/three/Vector3.js +0 -464
- package/build/cjs/core/three/constants.js +0 -298
- package/build/cjs/core/three/index.js +0 -48
- package/build/cjs/core/types.js +0 -13
- package/build/cjs/debug/Debug.js +0 -209
- package/build/cjs/debug/constants.js +0 -19
- package/build/cjs/debug/index.js +0 -24
- package/build/cjs/debug/log.js +0 -38
- package/build/cjs/ease/index.js +0 -149
- package/build/cjs/emitter/Emitter.js +0 -798
- package/build/cjs/emitter/FollowEmitter.js +0 -146
- package/build/cjs/emitter/constants.js +0 -20
- package/build/cjs/emitter/index.js +0 -24
- package/build/cjs/emitter/types.js +0 -11
- package/build/cjs/events/EventDispatcher.js +0 -105
- package/build/cjs/events/constants.js +0 -23
- package/build/cjs/events/index.js +0 -27
- package/build/cjs/index.js +0 -151
- package/build/cjs/initializer/Body.js +0 -122
- package/build/cjs/initializer/BodySprite.js +0 -146
- package/build/cjs/initializer/Initializer.js +0 -109
- package/build/cjs/initializer/InitializerUtil.js +0 -54
- package/build/cjs/initializer/Life.js +0 -106
- package/build/cjs/initializer/Mass.js +0 -101
- package/build/cjs/initializer/Position.js +0 -152
- package/build/cjs/initializer/Radius.js +0 -118
- package/build/cjs/initializer/Rate.js +0 -150
- package/build/cjs/initializer/Rotation.js +0 -95
- package/build/cjs/initializer/Texture.js +0 -139
- package/build/cjs/initializer/Velocity/PolarVelocity.js +0 -102
- package/build/cjs/initializer/Velocity/RadialVelocity.js +0 -111
- package/build/cjs/initializer/Velocity/VectorVelocity.js +0 -108
- package/build/cjs/initializer/Velocity/Velocity.js +0 -94
- package/build/cjs/initializer/Velocity/index.js +0 -32
- package/build/cjs/initializer/constants.js +0 -43
- package/build/cjs/initializer/index.js +0 -108
- package/build/cjs/initializer/types.js +0 -37
- package/build/cjs/math/ArraySpan.js +0 -103
- package/build/cjs/math/Box.js +0 -46
- package/build/cjs/math/ColorSpan.js +0 -113
- package/build/cjs/math/MathUtils.js +0 -57
- package/build/cjs/math/Polar3D.js +0 -115
- package/build/cjs/math/Span.js +0 -88
- package/build/cjs/math/Vector3D.js +0 -76
- package/build/cjs/math/constants.js +0 -35
- package/build/cjs/math/index.js +0 -122
- package/build/cjs/math/integration.js +0 -59
- package/build/cjs/math/types.js +0 -19
- package/build/cjs/renderer/BaseRenderer.js +0 -108
- package/build/cjs/renderer/CustomRenderer.js +0 -65
- package/build/cjs/renderer/GPURenderer/Desktop/index.js +0 -371
- package/build/cjs/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -13
- package/build/cjs/renderer/GPURenderer/Desktop/shaders/index.js +0 -22
- package/build/cjs/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -17
- package/build/cjs/renderer/GPURenderer/Mobile/index.js +0 -385
- package/build/cjs/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -13
- package/build/cjs/renderer/GPURenderer/Mobile/shaders/index.js +0 -22
- package/build/cjs/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -15
- package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -58
- package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -93
- package/build/cjs/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -9
- package/build/cjs/renderer/GPURenderer/common/TextureAtlas/index.js +0 -221
- package/build/cjs/renderer/GPURenderer/common/constants.js +0 -22
- package/build/cjs/renderer/GPURenderer/common/index.js +0 -38
- package/build/cjs/renderer/GPURenderer/common/shaders/constants.js +0 -9
- package/build/cjs/renderer/GPURenderer/common/stores/Target.js +0 -45
- package/build/cjs/renderer/GPURenderer/common/stores/UniqueList.js +0 -51
- package/build/cjs/renderer/GPURenderer/common/stores/index.js +0 -22
- package/build/cjs/renderer/GPURenderer/index.js +0 -97
- package/build/cjs/renderer/MeshRenderer.js +0 -136
- package/build/cjs/renderer/SpriteRenderer.js +0 -68
- package/build/cjs/renderer/index.js +0 -40
- package/build/cjs/renderer/types.js +0 -21
- package/build/cjs/utils/ColorUtil.js +0 -39
- package/build/cjs/utils/PUID.js +0 -26
- package/build/cjs/utils/THREEUtil.js +0 -40
- package/build/cjs/utils/Util.js +0 -69
- package/build/cjs/utils/index.js +0 -61
- package/build/cjs/utils/uid.js +0 -12
- package/build/cjs/zone/BoxZone.js +0 -178
- package/build/cjs/zone/LineZone.js +0 -101
- package/build/cjs/zone/MeshZone.js +0 -101
- package/build/cjs/zone/PointZone.js +0 -99
- package/build/cjs/zone/ScreenZone.js +0 -164
- package/build/cjs/zone/SphereZone.js +0 -155
- package/build/cjs/zone/Zone.js +0 -172
- package/build/cjs/zone/index.js +0 -56
- package/build/cjs/zone/types.js +0 -21
- package/build/esm/behaviour/Alpha.js +0 -134
- package/build/esm/behaviour/Attraction.js +0 -135
- package/build/esm/behaviour/Behaviour.js +0 -215
- package/build/esm/behaviour/Collision.js +0 -100
- package/build/esm/behaviour/Color.js +0 -101
- package/build/esm/behaviour/CrossZone.js +0 -82
- package/build/esm/behaviour/Force.js +0 -83
- package/build/esm/behaviour/Gravity.js +0 -40
- package/build/esm/behaviour/RandomDrift.js +0 -97
- package/build/esm/behaviour/Repulsion.js +0 -81
- package/build/esm/behaviour/Rotate.js +0 -214
- package/build/esm/behaviour/Scale.js +0 -131
- package/build/esm/behaviour/Spring.js +0 -90
- package/build/esm/behaviour/constants.js +0 -11
- package/build/esm/behaviour/index.js +0 -14
- package/build/esm/behaviour/types.js +0 -14
- package/build/esm/constants/index.js +0 -42
- package/build/esm/core/Particle.js +0 -357
- package/build/esm/core/Pool.js +0 -161
- package/build/esm/core/System.js +0 -320
- package/build/esm/core/constants.js +0 -127
- package/build/esm/core/fromJSON.js +0 -107
- package/build/esm/core/fromJSONAsync.js +0 -210
- package/build/esm/core/index.js +0 -4
- package/build/esm/core/three/Euler.js +0 -224
- package/build/esm/core/three/Math.js +0 -84
- package/build/esm/core/three/Matrix4.js +0 -739
- package/build/esm/core/three/Quaternion.js +0 -445
- package/build/esm/core/three/Vector3.js +0 -457
- package/build/esm/core/three/constants.js +0 -148
- package/build/esm/core/three/index.js +0 -5
- package/build/esm/core/types.js +0 -4
- package/build/esm/debug/Debug.js +0 -195
- package/build/esm/debug/constants.js +0 -7
- package/build/esm/debug/index.js +0 -3
- package/build/esm/debug/log.js +0 -31
- package/build/esm/ease/index.js +0 -113
- package/build/esm/emitter/Emitter.js +0 -708
- package/build/esm/emitter/FollowEmitter.js +0 -97
- package/build/esm/emitter/constants.js +0 -7
- package/build/esm/emitter/index.js +0 -3
- package/build/esm/emitter/types.js +0 -3
- package/build/esm/events/EventDispatcher.js +0 -82
- package/build/esm/events/constants.js +0 -9
- package/build/esm/events/index.js +0 -4
- package/build/esm/index.js +0 -13
- package/build/esm/initializer/Body.js +0 -83
- package/build/esm/initializer/BodySprite.js +0 -108
- package/build/esm/initializer/Initializer.js +0 -84
- package/build/esm/initializer/InitializerUtil.js +0 -48
- package/build/esm/initializer/Life.js +0 -66
- package/build/esm/initializer/Mass.js +0 -60
- package/build/esm/initializer/Position.js +0 -98
- package/build/esm/initializer/Radius.js +0 -75
- package/build/esm/initializer/Rate.js +0 -107
- package/build/esm/initializer/Rotation.js +0 -54
- package/build/esm/initializer/Texture.js +0 -101
- package/build/esm/initializer/Velocity/PolarVelocity.js +0 -63
- package/build/esm/initializer/Velocity/RadialVelocity.js +0 -72
- package/build/esm/initializer/Velocity/VectorVelocity.js +0 -69
- package/build/esm/initializer/Velocity/Velocity.js +0 -52
- package/build/esm/initializer/Velocity/index.js +0 -4
- package/build/esm/initializer/constants.js +0 -26
- package/build/esm/initializer/index.js +0 -12
- package/build/esm/initializer/types.js +0 -16
- package/build/esm/math/ArraySpan.js +0 -62
- package/build/esm/math/Box.js +0 -25
- package/build/esm/math/ColorSpan.js +0 -71
- package/build/esm/math/MathUtils.js +0 -48
- package/build/esm/math/Polar3D.js +0 -81
- package/build/esm/math/Span.js +0 -63
- package/build/esm/math/Vector3D.js +0 -34
- package/build/esm/math/constants.js +0 -24
- package/build/esm/math/index.js +0 -10
- package/build/esm/math/integration.js +0 -47
- package/build/esm/math/types.js +0 -7
- package/build/esm/renderer/BaseRenderer.js +0 -78
- package/build/esm/renderer/CustomRenderer.js +0 -23
- package/build/esm/renderer/GPURenderer/Desktop/index.js +0 -357
- package/build/esm/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -30
- package/build/esm/renderer/GPURenderer/Desktop/shaders/index.js +0 -3
- package/build/esm/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -36
- package/build/esm/renderer/GPURenderer/Mobile/index.js +0 -375
- package/build/esm/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -27
- package/build/esm/renderer/GPURenderer/Mobile/shaders/index.js +0 -3
- package/build/esm/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -33
- package/build/esm/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -30
- package/build/esm/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -70
- package/build/esm/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -2
- package/build/esm/renderer/GPURenderer/common/TextureAtlas/index.js +0 -206
- package/build/esm/renderer/GPURenderer/common/constants.js +0 -13
- package/build/esm/renderer/GPURenderer/common/index.js +0 -4
- package/build/esm/renderer/GPURenderer/common/shaders/constants.js +0 -2
- package/build/esm/renderer/GPURenderer/common/stores/Target.js +0 -26
- package/build/esm/renderer/GPURenderer/common/stores/UniqueList.js +0 -29
- package/build/esm/renderer/GPURenderer/common/stores/index.js +0 -3
- package/build/esm/renderer/GPURenderer/index.js +0 -57
- package/build/esm/renderer/MeshRenderer.js +0 -93
- package/build/esm/renderer/SpriteRenderer.js +0 -30
- package/build/esm/renderer/index.js +0 -5
- package/build/esm/renderer/types.js +0 -8
- package/build/esm/utils/ColorUtil.js +0 -32
- package/build/esm/utils/PUID.js +0 -19
- package/build/esm/utils/THREEUtil.js +0 -31
- package/build/esm/utils/Util.js +0 -60
- package/build/esm/utils/index.js +0 -13
- package/build/esm/utils/uid.js +0 -3
- package/build/esm/zone/BoxZone.js +0 -133
- package/build/esm/zone/LineZone.js +0 -61
- package/build/esm/zone/MeshZone.js +0 -60
- package/build/esm/zone/PointZone.js +0 -59
- package/build/esm/zone/ScreenZone.js +0 -116
- package/build/esm/zone/SphereZone.js +0 -113
- package/build/esm/zone/Zone.js +0 -141
- package/build/esm/zone/index.js +0 -7
- package/build/esm/zone/types.js +0 -8
- package/build/three-nebula.js +0 -2
- package/build/three-nebula.js.map +0 -1
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { MathUtils, createSpan } from '../math';
|
|
2
|
-
import Behaviour from './Behaviour';
|
|
3
|
-
import { PARTICLE_ALPHA_THRESHOLD } from './constants';
|
|
4
|
-
import { getEasingByName } from '../ease';
|
|
5
|
-
import { BEHAVIOUR_TYPE_ALPHA as type } from './types';
|
|
6
|
-
/**
|
|
7
|
-
* Behaviour that applies an alpha transition effect to particles.
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export default class Alpha extends Behaviour {
|
|
12
|
-
/**
|
|
13
|
-
* Constructs an Alpha behaviour instance.
|
|
14
|
-
*
|
|
15
|
-
* @param {number} alphaA - The starting alpha value
|
|
16
|
-
* @param {?number} alphaB - The ending alpha value
|
|
17
|
-
* @param {number} life - The life of the behaviour
|
|
18
|
-
* @param {function} easing - The easing equation to use for transforms
|
|
19
|
-
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
|
|
20
|
-
* @return void
|
|
21
|
-
*/
|
|
22
|
-
constructor(alphaA = 1, alphaB = null, life, easing, isEnabled = true) {
|
|
23
|
-
super(life, easing, type, isEnabled);
|
|
24
|
-
/**
|
|
25
|
-
* @desc The starting alpha value
|
|
26
|
-
* @type {number|Span}
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
this.alphaA = alphaA;
|
|
30
|
-
/**
|
|
31
|
-
* @desc The ending alpha value
|
|
32
|
-
* @type {number|Span}
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
this.alphaB = alphaB;
|
|
36
|
-
this.reset(alphaA, alphaB);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Gets the _same property which determines if the alpha are the same.
|
|
40
|
-
*
|
|
41
|
-
* @return {boolean}
|
|
42
|
-
*/
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
get same() {
|
|
46
|
-
return this._same;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Sets the _same property which determines if the alpha are the same.
|
|
50
|
-
*
|
|
51
|
-
* @param {boolean} same
|
|
52
|
-
* @return {boolean}
|
|
53
|
-
*/
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
set same(same) {
|
|
57
|
-
/**
|
|
58
|
-
* @type {boolean}
|
|
59
|
-
*/
|
|
60
|
-
this._same = same;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Resets the behaviour properties.
|
|
64
|
-
*
|
|
65
|
-
* @param {number} alphaA - the starting alpha value
|
|
66
|
-
* @param {?number} alphaB - the ending alpha value
|
|
67
|
-
* @param {number} life - the life of the behaviour
|
|
68
|
-
* @param {function} easing - the easing equation to use for transforms
|
|
69
|
-
* @return void
|
|
70
|
-
*/
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
reset(alphaA = 1, alphaB = null, life, easing) {
|
|
74
|
-
this.same = alphaB === null || alphaB === undefined ? true : false;
|
|
75
|
-
this.alphaA = createSpan(alphaA);
|
|
76
|
-
this.alphaB = createSpan(alphaB);
|
|
77
|
-
life && super.reset(life, easing);
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Initializes the behaviour on a particle.
|
|
81
|
-
*
|
|
82
|
-
* @param {object} particle - the particle to initialize the behaviour on
|
|
83
|
-
* @return void
|
|
84
|
-
*/
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
initialize(particle) {
|
|
88
|
-
particle.useAlpha = true;
|
|
89
|
-
particle.transform.alphaA = this.alphaA.getValue();
|
|
90
|
-
particle.transform.alphaB = this.same ? particle.transform.alphaA : this.alphaB.getValue();
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Mutates the target's alpha/opacity property.
|
|
94
|
-
*
|
|
95
|
-
* @param {object} particle - the particle to apply the behaviour to
|
|
96
|
-
* @param {number} time - engine time
|
|
97
|
-
* @param {integer} index - the particle index
|
|
98
|
-
* @return void
|
|
99
|
-
*/
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
mutate(particle, time, index) {
|
|
103
|
-
this.energize(particle, time, index);
|
|
104
|
-
particle.alpha = MathUtils.lerp(particle.transform.alphaA, particle.transform.alphaB, this.energy);
|
|
105
|
-
|
|
106
|
-
if (particle.alpha < PARTICLE_ALPHA_THRESHOLD) {
|
|
107
|
-
particle.alpha = 0;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Creates a Body initializer from JSON.
|
|
112
|
-
*
|
|
113
|
-
* @param {object} json - The JSON to construct the instance from.
|
|
114
|
-
* @property {number} json.alphaA - The starting alpha value
|
|
115
|
-
* @property {number} json.alphaB - The ending alpha value
|
|
116
|
-
* @property {number} json.life - The life of the behaviour
|
|
117
|
-
* @property {string} json.easing - The easing equation to use for transforms
|
|
118
|
-
* @return {Body}
|
|
119
|
-
*/
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
static fromJSON(json) {
|
|
123
|
-
const {
|
|
124
|
-
alphaA,
|
|
125
|
-
alphaB,
|
|
126
|
-
life,
|
|
127
|
-
easing,
|
|
128
|
-
isEnabled = true
|
|
129
|
-
} = json;
|
|
130
|
-
return new Alpha(alphaA, alphaB, life, getEasingByName(easing), isEnabled);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQWxwaGEuanMiXSwibmFtZXMiOlsiTWF0aFV0aWxzIiwiY3JlYXRlU3BhbiIsIkJlaGF2aW91ciIsIlBBUlRJQ0xFX0FMUEhBX1RIUkVTSE9MRCIsImdldEVhc2luZ0J5TmFtZSIsIkJFSEFWSU9VUl9UWVBFX0FMUEhBIiwidHlwZSIsIkFscGhhIiwiY29uc3RydWN0b3IiLCJhbHBoYUEiLCJhbHBoYUIiLCJsaWZlIiwiZWFzaW5nIiwiaXNFbmFibGVkIiwicmVzZXQiLCJzYW1lIiwiX3NhbWUiLCJ1bmRlZmluZWQiLCJpbml0aWFsaXplIiwicGFydGljbGUiLCJ1c2VBbHBoYSIsInRyYW5zZm9ybSIsImdldFZhbHVlIiwibXV0YXRlIiwidGltZSIsImluZGV4IiwiZW5lcmdpemUiLCJhbHBoYSIsImxlcnAiLCJlbmVyZ3kiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFNBQVQsRUFBb0JDLFVBQXBCLFFBQXNDLFNBQXRDO0FBRUEsT0FBT0MsU0FBUCxNQUFzQixhQUF0QjtBQUNBLFNBQVNDLHdCQUFULFFBQXlDLGFBQXpDO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQyxTQUFoQztBQUNBLFNBQVNDLG9CQUFvQixJQUFJQyxJQUFqQyxRQUE2QyxTQUE3QztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsS0FBTixTQUFvQkwsU0FBcEIsQ0FBOEI7QUFDM0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRU0sRUFBQUEsV0FBVyxDQUFDQyxNQUFNLEdBQUcsQ0FBVixFQUFhQyxNQUFNLEdBQUcsSUFBdEIsRUFBNEJDLElBQTVCLEVBQWtDQyxNQUFsQyxFQUEwQ0MsU0FBUyxHQUFHLElBQXRELEVBQTREO0FBQ3JFLFVBQU1GLElBQU4sRUFBWUMsTUFBWixFQUFvQk4sSUFBcEIsRUFBMEJPLFNBQTFCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0osTUFBTCxHQUFjQSxNQUFkO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0MsTUFBTCxHQUFjQSxNQUFkO0FBRUEsU0FBS0ksS0FBTCxDQUFXTCxNQUFYLEVBQW1CQyxNQUFuQjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ1UsTUFBSkssSUFBSSxHQUFHO0FBQ1QsV0FBTyxLQUFLQyxLQUFaO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNVLE1BQUpELElBQUksQ0FBQ0EsSUFBRCxFQUFPO0FBQ2I7QUFDSjtBQUNBO0FBQ0ksU0FBS0MsS0FBTCxHQUFhRCxJQUFiO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRCxFQUFBQSxLQUFLLENBQUNMLE1BQU0sR0FBRyxDQUFWLEVBQWFDLE1BQU0sR0FBRyxJQUF0QixFQUE0QkMsSUFBNUIsRUFBa0NDLE1BQWxDLEVBQTBDO0FBQzdDLFNBQUtHLElBQUwsR0FBWUwsTUFBTSxLQUFLLElBQVgsSUFBbUJBLE1BQU0sS0FBS08sU0FBOUIsR0FBMEMsSUFBMUMsR0FBaUQsS0FBN0Q7QUFDQSxTQUFLUixNQUFMLEdBQWNSLFVBQVUsQ0FBQ1EsTUFBRCxDQUF4QjtBQUNBLFNBQUtDLE1BQUwsR0FBY1QsVUFBVSxDQUFDUyxNQUFELENBQXhCO0FBRUFDLElBQUFBLElBQUksSUFBSSxNQUFNRyxLQUFOLENBQVlILElBQVosRUFBa0JDLE1BQWxCLENBQVI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VNLEVBQUFBLFVBQVUsQ0FBQ0MsUUFBRCxFQUFXO0FBQ25CQSxJQUFBQSxRQUFRLENBQUNDLFFBQVQsR0FBb0IsSUFBcEI7QUFDQUQsSUFBQUEsUUFBUSxDQUFDRSxTQUFULENBQW1CWixNQUFuQixHQUE0QixLQUFLQSxNQUFMLENBQVlhLFFBQVosRUFBNUI7QUFFQUgsSUFBQUEsUUFBUSxDQUFDRSxTQUFULENBQW1CWCxNQUFuQixHQUE0QixLQUFLSyxJQUFMLEdBQ3hCSSxRQUFRLENBQUNFLFNBQVQsQ0FBbUJaLE1BREssR0FFeEIsS0FBS0MsTUFBTCxDQUFZWSxRQUFaLEVBRko7QUFHRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFQyxFQUFBQSxNQUFNLENBQUNKLFFBQUQsRUFBV0ssSUFBWCxFQUFpQkMsS0FBakIsRUFBd0I7QUFDNUIsU0FBS0MsUUFBTCxDQUFjUCxRQUFkLEVBQXdCSyxJQUF4QixFQUE4QkMsS0FBOUI7QUFFQU4sSUFBQUEsUUFBUSxDQUFDUSxLQUFULEdBQWlCM0IsU0FBUyxDQUFDNEIsSUFBVixDQUNmVCxRQUFRLENBQUNFLFNBQVQsQ0FBbUJaLE1BREosRUFFZlUsUUFBUSxDQUFDRSxTQUFULENBQW1CWCxNQUZKLEVBR2YsS0FBS21CLE1BSFUsQ0FBakI7O0FBTUEsUUFBSVYsUUFBUSxDQUFDUSxLQUFULEdBQWlCeEIsd0JBQXJCLEVBQStDO0FBQzdDZ0IsTUFBQUEsUUFBUSxDQUFDUSxLQUFULEdBQWlCLENBQWpCO0FBQ0Q7QUFDRjtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDaUIsU0FBUkcsUUFBUSxDQUFDQyxJQUFELEVBQU87QUFDcEIsVUFBTTtBQUFFdEIsTUFBQUEsTUFBRjtBQUFVQyxNQUFBQSxNQUFWO0FBQWtCQyxNQUFBQSxJQUFsQjtBQUF3QkMsTUFBQUEsTUFBeEI7QUFBZ0NDLE1BQUFBLFNBQVMsR0FBRztBQUE1QyxRQUFxRGtCLElBQTNEO0FBRUEsV0FBTyxJQUFJeEIsS0FBSixDQUFVRSxNQUFWLEVBQWtCQyxNQUFsQixFQUEwQkMsSUFBMUIsRUFBZ0NQLGVBQWUsQ0FBQ1EsTUFBRCxDQUEvQyxFQUF5REMsU0FBekQsQ0FBUDtBQUNEOztBQXZIMEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXRoVXRpbHMsIGNyZWF0ZVNwYW4gfSBmcm9tICcuLi9tYXRoJztcblxuaW1wb3J0IEJlaGF2aW91ciBmcm9tICcuL0JlaGF2aW91cic7XG5pbXBvcnQgeyBQQVJUSUNMRV9BTFBIQV9USFJFU0hPTEQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRFYXNpbmdCeU5hbWUgfSBmcm9tICcuLi9lYXNlJztcbmltcG9ydCB7IEJFSEFWSU9VUl9UWVBFX0FMUEhBIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBCZWhhdmlvdXIgdGhhdCBhcHBsaWVzIGFuIGFscGhhIHRyYW5zaXRpb24gZWZmZWN0IHRvIHBhcnRpY2xlcy5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFscGhhIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYW4gQWxwaGEgYmVoYXZpb3VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gYWxwaGFBIC0gVGhlIHN0YXJ0aW5nIGFscGhhIHZhbHVlXG4gICAqIEBwYXJhbSB7P251bWJlcn0gYWxwaGFCIC0gVGhlIGVuZGluZyBhbHBoYSB2YWx1ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBiZWhhdmlvdXJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWFzaW5nIC0gVGhlIGVhc2luZyBlcXVhdGlvbiB0byB1c2UgZm9yIHRyYW5zZm9ybXNcbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNFbmFibGVkPXRydWVdIC0gRGV0ZXJtaW5lcyBpZiB0aGUgYmVoYXZpb3VyIHdpbGwgYmUgYXBwbGllZCBvciBub3RcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhbHBoYUEgPSAxLCBhbHBoYUIgPSBudWxsLCBsaWZlLCBlYXNpbmcsIGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcsIHR5cGUsIGlzRW5hYmxlZCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgc3RhcnRpbmcgYWxwaGEgdmFsdWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfFNwYW59XG4gICAgICovXG4gICAgdGhpcy5hbHBoYUEgPSBhbHBoYUE7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgZW5kaW5nIGFscGhhIHZhbHVlXG4gICAgICogQHR5cGUge251bWJlcnxTcGFufVxuICAgICAqL1xuICAgIHRoaXMuYWxwaGFCID0gYWxwaGFCO1xuXG4gICAgdGhpcy5yZXNldChhbHBoYUEsIGFscGhhQik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgX3NhbWUgcHJvcGVydHkgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGUgYWxwaGEgYXJlIHRoZSBzYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IHNhbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NhbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgX3NhbWUgcHJvcGVydHkgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGUgYWxwaGEgYXJlIHRoZSBzYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNhbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHNldCBzYW1lKHNhbWUpIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl9zYW1lID0gc2FtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGJlaGF2aW91ciBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gYWxwaGFBIC0gdGhlIHN0YXJ0aW5nIGFscGhhIHZhbHVlXG4gICAqIEBwYXJhbSB7P251bWJlcn0gYWxwaGFCIC0gdGhlIGVuZGluZyBhbHBoYSB2YWx1ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIHRoZSBsaWZlIG9mIHRoZSBiZWhhdmlvdXJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWFzaW5nIC0gdGhlIGVhc2luZyBlcXVhdGlvbiB0byB1c2UgZm9yIHRyYW5zZm9ybXNcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICByZXNldChhbHBoYUEgPSAxLCBhbHBoYUIgPSBudWxsLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnNhbWUgPSBhbHBoYUIgPT09IG51bGwgfHwgYWxwaGFCID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgdGhpcy5hbHBoYUEgPSBjcmVhdGVTcGFuKGFscGhhQSk7XG4gICAgdGhpcy5hbHBoYUIgPSBjcmVhdGVTcGFuKGFscGhhQik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGJlaGF2aW91ciBvbiBhIHBhcnRpY2xlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGljbGUgLSB0aGUgcGFydGljbGUgdG8gaW5pdGlhbGl6ZSB0aGUgYmVoYXZpb3VyIG9uXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnVzZUFscGhhID0gdHJ1ZTtcbiAgICBwYXJ0aWNsZS50cmFuc2Zvcm0uYWxwaGFBID0gdGhpcy5hbHBoYUEuZ2V0VmFsdWUoKTtcblxuICAgIHBhcnRpY2xlLnRyYW5zZm9ybS5hbHBoYUIgPSB0aGlzLnNhbWVcbiAgICAgID8gcGFydGljbGUudHJhbnNmb3JtLmFscGhhQVxuICAgICAgOiB0aGlzLmFscGhhQi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE11dGF0ZXMgdGhlIHRhcmdldCdzIGFscGhhL29wYWNpdHkgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWNsZSAtIHRoZSBwYXJ0aWNsZSB0byBhcHBseSB0aGUgYmVoYXZpb3VyIHRvXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gZW5naW5lIHRpbWVcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIG11dGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmVuZXJnaXplKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICBwYXJ0aWNsZS5hbHBoYSA9IE1hdGhVdGlscy5sZXJwKFxuICAgICAgcGFydGljbGUudHJhbnNmb3JtLmFscGhhQSxcbiAgICAgIHBhcnRpY2xlLnRyYW5zZm9ybS5hbHBoYUIsXG4gICAgICB0aGlzLmVuZXJneVxuICAgICk7XG5cbiAgICBpZiAocGFydGljbGUuYWxwaGEgPCBQQVJUSUNMRV9BTFBIQV9USFJFU0hPTEQpIHtcbiAgICAgIHBhcnRpY2xlLmFscGhhID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEJvZHkgaW5pdGlhbGl6ZXIgZnJvbSBKU09OLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0ganNvbiAtIFRoZSBKU09OIHRvIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UgZnJvbS5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGpzb24uYWxwaGFBIC0gVGhlIHN0YXJ0aW5nIGFscGhhIHZhbHVlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLmFscGhhQiAtIFRoZSBlbmRpbmcgYWxwaGEgdmFsdWVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGpzb24ubGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBiZWhhdmlvdXJcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGpzb24uZWFzaW5nIC0gVGhlIGVhc2luZyBlcXVhdGlvbiB0byB1c2UgZm9yIHRyYW5zZm9ybXNcbiAgICogQHJldHVybiB7Qm9keX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgY29uc3QgeyBhbHBoYUEsIGFscGhhQiwgbGlmZSwgZWFzaW5nLCBpc0VuYWJsZWQgPSB0cnVlIH0gPSBqc29uO1xuXG4gICAgcmV0dXJuIG5ldyBBbHBoYShhbHBoYUEsIGFscGhhQiwgbGlmZSwgZ2V0RWFzaW5nQnlOYW1lKGVhc2luZyksIGlzRW5hYmxlZCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { DEFAULT_ATTRACITON_RADIUS, DEFAULT_ATTRACTION_FORCE_SCALAR, DEFAULT_BEHAVIOUR_EASING, DEFAULT_LIFE, PARTICLE_LENGTH_SQ_THRESHOLD } from './constants';
|
|
2
|
-
import Behaviour from './Behaviour';
|
|
3
|
-
import { Vector3D } from '../math';
|
|
4
|
-
import { getEasingByName } from '../ease';
|
|
5
|
-
import { BEHAVIOUR_TYPE_ATTRACTION as type } from './types';
|
|
6
|
-
/**
|
|
7
|
-
* Behaviour that causes particles to be attracted to a target position.
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export default class Attraction extends Behaviour {
|
|
12
|
-
/**
|
|
13
|
-
* Constructs an Attraction behaviour instance.
|
|
14
|
-
*
|
|
15
|
-
* @param {Vector3D} targetPosition - The position the particles will be attracted to
|
|
16
|
-
* @param {number} force - The attraction force scalar multiplier
|
|
17
|
-
* @param {number} radius - The attraction radius
|
|
18
|
-
* @param {number} [life=DEFAULT_LIFE] - The life of the particle
|
|
19
|
-
* @param {function} [easing=DEFAULT_BEHAVIOUR_EASING] - The behaviour's decaying trend
|
|
20
|
-
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
|
|
21
|
-
* @return void
|
|
22
|
-
*/
|
|
23
|
-
constructor(targetPosition = new Vector3D(), force = DEFAULT_ATTRACTION_FORCE_SCALAR, radius = DEFAULT_ATTRACITON_RADIUS, life = DEFAULT_LIFE, easing = DEFAULT_BEHAVIOUR_EASING, isEnabled = true) {
|
|
24
|
-
super(life, easing, type, isEnabled);
|
|
25
|
-
/**
|
|
26
|
-
* @desc The position the particles will be attracted to
|
|
27
|
-
* @type {Vector3D}
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
this.targetPosition = targetPosition;
|
|
31
|
-
/**
|
|
32
|
-
* @desc The attraction radius
|
|
33
|
-
* @type {number} - the attraction radius
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
this.radius = radius;
|
|
37
|
-
/**
|
|
38
|
-
* @desc The attraction force scalar multiplier
|
|
39
|
-
* @type {number}
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
this.force = this.normalizeValue(force);
|
|
43
|
-
/**
|
|
44
|
-
* @desc The radius of the attraction squared
|
|
45
|
-
* @type {number}
|
|
46
|
-
*/
|
|
47
|
-
|
|
48
|
-
this.radiusSq = this.radius * this.radius;
|
|
49
|
-
/**
|
|
50
|
-
* @desc The attraction force in 3D space
|
|
51
|
-
* @type {Vector3D}
|
|
52
|
-
*/
|
|
53
|
-
|
|
54
|
-
this.attractionForce = new Vector3D();
|
|
55
|
-
/**
|
|
56
|
-
* @desc The linear attraction force
|
|
57
|
-
* @type {number}
|
|
58
|
-
*/
|
|
59
|
-
|
|
60
|
-
this.lengthSq = 0;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Resets the behaviour properties.
|
|
64
|
-
*
|
|
65
|
-
* @param {Vector3D} targetPosition - the position the particles will be attracted to
|
|
66
|
-
* @param {number} force - the attraction force multiplier
|
|
67
|
-
* @param {number} radius - the attraction radius
|
|
68
|
-
* @param {number} life - the life of the particle
|
|
69
|
-
* @param {function} easing - The behaviour's decaying trend
|
|
70
|
-
* @return void
|
|
71
|
-
*/
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
reset(targetPosition = new Vector3D(), force = DEFAULT_ATTRACTION_FORCE_SCALAR, radius = DEFAULT_ATTRACITON_RADIUS, life, easing) {
|
|
75
|
-
this.targetPosition = targetPosition;
|
|
76
|
-
this.radius = radius;
|
|
77
|
-
this.force = this.normalizeValue(force);
|
|
78
|
-
this.radiusSq = this.radius * this.radius;
|
|
79
|
-
this.attractionForce = new Vector3D();
|
|
80
|
-
this.lengthSq = 0;
|
|
81
|
-
life && super.reset(life, easing);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Mutates particle acceleration.
|
|
85
|
-
*
|
|
86
|
-
* @param {Particle} particle - the particle to apply the behaviour to
|
|
87
|
-
* @param {number} time - particle engine time
|
|
88
|
-
* @param {integer} index - the particle index
|
|
89
|
-
* @return void
|
|
90
|
-
*/
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
mutate(particle, time, index) {
|
|
94
|
-
this.energize(particle, time, index);
|
|
95
|
-
this.attractionForce.copy(this.targetPosition);
|
|
96
|
-
this.attractionForce.sub(particle.position);
|
|
97
|
-
this.lengthSq = this.attractionForce.lengthSq();
|
|
98
|
-
|
|
99
|
-
if (this.lengthSq > PARTICLE_LENGTH_SQ_THRESHOLD && this.lengthSq < this.radiusSq) {
|
|
100
|
-
this.attractionForce.normalize();
|
|
101
|
-
this.attractionForce.scalar(1 - this.lengthSq / this.radiusSq);
|
|
102
|
-
this.attractionForce.scalar(this.force);
|
|
103
|
-
particle.acceleration.add(this.attractionForce);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Creates a Body initializer from JSON.
|
|
108
|
-
*
|
|
109
|
-
* @param {object} json - The JSON to construct the instance from.
|
|
110
|
-
* @property {number} json.x - The target position x value
|
|
111
|
-
* @property {number} json.y - The target position y value
|
|
112
|
-
* @property {number} json.z - The target position z value
|
|
113
|
-
* @property {number} json.force - The attraction force scalar multiplier
|
|
114
|
-
* @property {number} json.life - The life of the particle
|
|
115
|
-
* @property {string} json.easing - The behaviour's decaying trend
|
|
116
|
-
* @return {Body}
|
|
117
|
-
*/
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
static fromJSON(json) {
|
|
121
|
-
const {
|
|
122
|
-
x,
|
|
123
|
-
y,
|
|
124
|
-
z,
|
|
125
|
-
force,
|
|
126
|
-
radius,
|
|
127
|
-
life,
|
|
128
|
-
easing,
|
|
129
|
-
isEnabled = true
|
|
130
|
-
} = json;
|
|
131
|
-
return new Attraction(new Vector3D(x, y, z), force, radius, life, getEasingByName(easing), isEnabled);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQXR0cmFjdGlvbi5qcyJdLCJuYW1lcyI6WyJERUZBVUxUX0FUVFJBQ0lUT05fUkFESVVTIiwiREVGQVVMVF9BVFRSQUNUSU9OX0ZPUkNFX1NDQUxBUiIsIkRFRkFVTFRfQkVIQVZJT1VSX0VBU0lORyIsIkRFRkFVTFRfTElGRSIsIlBBUlRJQ0xFX0xFTkdUSF9TUV9USFJFU0hPTEQiLCJCZWhhdmlvdXIiLCJWZWN0b3IzRCIsImdldEVhc2luZ0J5TmFtZSIsIkJFSEFWSU9VUl9UWVBFX0FUVFJBQ1RJT04iLCJ0eXBlIiwiQXR0cmFjdGlvbiIsImNvbnN0cnVjdG9yIiwidGFyZ2V0UG9zaXRpb24iLCJmb3JjZSIsInJhZGl1cyIsImxpZmUiLCJlYXNpbmciLCJpc0VuYWJsZWQiLCJub3JtYWxpemVWYWx1ZSIsInJhZGl1c1NxIiwiYXR0cmFjdGlvbkZvcmNlIiwibGVuZ3RoU3EiLCJyZXNldCIsIm11dGF0ZSIsInBhcnRpY2xlIiwidGltZSIsImluZGV4IiwiZW5lcmdpemUiLCJjb3B5Iiwic3ViIiwicG9zaXRpb24iLCJub3JtYWxpemUiLCJzY2FsYXIiLCJhY2NlbGVyYXRpb24iLCJhZGQiLCJmcm9tSlNPTiIsImpzb24iLCJ4IiwieSIsInoiXSwibWFwcGluZ3MiOiJBQUFBLFNBQ0VBLHlCQURGLEVBRUVDLCtCQUZGLEVBR0VDLHdCQUhGLEVBSUVDLFlBSkYsRUFLRUMsNEJBTEYsUUFNTyxhQU5QO0FBUUEsT0FBT0MsU0FBUCxNQUFzQixhQUF0QjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsU0FBekI7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFNBQWhDO0FBQ0EsU0FBU0MseUJBQXlCLElBQUlDLElBQXRDLFFBQWtELFNBQWxEO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxVQUFOLFNBQXlCTCxTQUF6QixDQUFtQztBQUNoRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QVI7QUFBVzFCLE1BQUFBLEtBQVg7QUFBa0JDLE1BQUFBLE1BQWxCO0FBQTBCQyxNQUFBQSxJQUExQjtBQUFnQ0MsTUFBQUEsTUFBaEM7QUFBd0NDLE1BQUFBLFNBQVMsR0FBRztBQUFwRCxRQUE2RG1CLElBQW5FO0FBRUEsV0FBTyxJQUFJMUIsVUFBSixDQUNMLElBQUlKLFFBQUosQ0FBYStCLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CQyxDQUFuQixDQURLLEVBRUwxQixLQUZLLEVBR0xDLE1BSEssRUFJTEMsSUFKSyxFQUtMUixlQUFlLENBQUNTLE1BQUQsQ0FMVixFQU1MQyxTQU5LLENBQVA7QUFRRDs7QUF6SStDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgREVGQVVMVF9BVFRSQUNJVE9OX1JBRElVUyxcbiAgREVGQVVMVF9BVFRSQUNUSU9OX0ZPUkNFX1NDQUxBUixcbiAgREVGQVVMVF9CRUhBVklPVVJfRUFTSU5HLFxuICBERUZBVUxUX0xJRkUsXG4gIFBBUlRJQ0xFX0xFTkdUSF9TUV9USFJFU0hPTEQsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuaW1wb3J0IEJlaGF2aW91ciBmcm9tICcuL0JlaGF2aW91cic7XG5pbXBvcnQgeyBWZWN0b3IzRCB9IGZyb20gJy4uL21hdGgnO1xuaW1wb3J0IHsgZ2V0RWFzaW5nQnlOYW1lIH0gZnJvbSAnLi4vZWFzZSc7XG5pbXBvcnQgeyBCRUhBVklPVVJfVFlQRV9BVFRSQUNUSU9OIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBCZWhhdmlvdXIgdGhhdCBjYXVzZXMgcGFydGljbGVzIHRvIGJlIGF0dHJhY3RlZCB0byBhIHRhcmdldCBwb3NpdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dHJhY3Rpb24gZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBBdHRyYWN0aW9uIGJlaGF2aW91ciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3IzRH0gdGFyZ2V0UG9zaXRpb24gLSBUaGUgcG9zaXRpb24gdGhlIHBhcnRpY2xlcyB3aWxsIGJlIGF0dHJhY3RlZCB0b1xuICAgKiBAcGFyYW0ge251bWJlcn0gZm9yY2UgLSBUaGUgYXR0cmFjdGlvbiBmb3JjZSBzY2FsYXIgbXVsdGlwbGllclxuICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIGF0dHJhY3Rpb24gcmFkaXVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1ERUZBVUxUX0xJRkVdIC0gVGhlIGxpZmUgb2YgdGhlIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtlYXNpbmc9REVGQVVMVF9CRUhBVklPVVJfRUFTSU5HXSAtIFRoZSBiZWhhdmlvdXIncyBkZWNheWluZyB0cmVuZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0VuYWJsZWQ9dHJ1ZV0gLSBEZXRlcm1pbmVzIGlmIHRoZSBiZWhhdmlvdXIgd2lsbCBiZSBhcHBsaWVkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRhcmdldFBvc2l0aW9uID0gbmV3IFZlY3RvcjNEKCksXG4gICAgZm9yY2UgPSBERUZBVUxUX0FUVFJBQ1RJT05fRk9SQ0VfU0NBTEFSLFxuICAgIHJhZGl1cyA9IERFRkFVTFRfQVRUUkFDSVRPTl9SQURJVVMsXG4gICAgbGlmZSA9IERFRkFVTFRfTElGRSxcbiAgICBlYXNpbmcgPSBERUZBVUxUX0JFSEFWSU9VUl9FQVNJTkcsXG4gICAgaXNFbmFibGVkID0gdHJ1ZVxuICApIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcsIHR5cGUsIGlzRW5hYmxlZCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcG9zaXRpb24gdGhlIHBhcnRpY2xlcyB3aWxsIGJlIGF0dHJhY3RlZCB0b1xuICAgICAqIEB0eXBlIHtWZWN0b3IzRH1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldFBvc2l0aW9uID0gdGFyZ2V0UG9zaXRpb247XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgYXR0cmFjdGlvbiByYWRpdXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfSAtIHRoZSBhdHRyYWN0aW9uIHJhZGl1c1xuICAgICAqL1xuICAgIHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGF0dHJhY3Rpb24gZm9yY2Ugc2NhbGFyIG11bHRpcGxpZXJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuZm9yY2UgPSB0aGlzLm5vcm1hbGl6ZVZhbHVlKGZvcmNlKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSByYWRpdXMgb2YgdGhlIGF0dHJhY3Rpb24gc3F1YXJlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5yYWRpdXNTcSA9IHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXM7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgYXR0cmFjdGlvbiBmb3JjZSBpbiAzRCBzcGFjZVxuICAgICAqIEB0eXBlIHtWZWN0b3IzRH1cbiAgICAgKi9cbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZSA9IG5ldyBWZWN0b3IzRCgpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGxpbmVhciBhdHRyYWN0aW9uIGZvcmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmxlbmd0aFNxID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGJlaGF2aW91ciBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcjNEfSB0YXJnZXRQb3NpdGlvbiAtIHRoZSBwb3NpdGlvbiB0aGUgcGFydGljbGVzIHdpbGwgYmUgYXR0cmFjdGVkIHRvXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmb3JjZSAtIHRoZSBhdHRyYWN0aW9uIGZvcmNlIG11bHRpcGxpZXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIHRoZSBhdHRyYWN0aW9uIHJhZGl1c1xuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIHRoZSBsaWZlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlYXNpbmcgLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmRcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICByZXNldChcbiAgICB0YXJnZXRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzRCgpLFxuICAgIGZvcmNlID0gREVGQVVMVF9BVFRSQUNUSU9OX0ZPUkNFX1NDQUxBUixcbiAgICByYWRpdXMgPSBERUZBVUxUX0FUVFJBQ0lUT05fUkFESVVTLFxuICAgIGxpZmUsXG4gICAgZWFzaW5nXG4gICkge1xuICAgIHRoaXMudGFyZ2V0UG9zaXRpb24gPSB0YXJnZXRQb3NpdGlvbjtcbiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcbiAgICB0aGlzLmZvcmNlID0gdGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSk7XG4gICAgdGhpcy5yYWRpdXNTcSA9IHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXM7XG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UgPSBuZXcgVmVjdG9yM0QoKTtcbiAgICB0aGlzLmxlbmd0aFNxID0gMDtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNdXRhdGVzIHBhcnRpY2xlIGFjY2VsZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSB0aGUgcGFydGljbGUgdG8gYXBwbHkgdGhlIGJlaGF2aW91ciB0b1xuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIHBhcnRpY2xlIGVuZ2luZSB0aW1lXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBtdXRhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5lbmVyZ2l6ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UuY29weSh0aGlzLnRhcmdldFBvc2l0aW9uKTtcbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5zdWIocGFydGljbGUucG9zaXRpb24pO1xuXG4gICAgdGhpcy5sZW5ndGhTcSA9IHRoaXMuYXR0cmFjdGlvbkZvcmNlLmxlbmd0aFNxKCk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmxlbmd0aFNxID4gUEFSVElDTEVfTEVOR1RIX1NRX1RIUkVTSE9MRCAmJlxuICAgICAgdGhpcy5sZW5ndGhTcSA8IHRoaXMucmFkaXVzU3FcbiAgICApIHtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm5vcm1hbGl6ZSgpO1xuICAgICAgdGhpcy5hdHRyYWN0aW9uRm9yY2Uuc2NhbGFyKDEgLSB0aGlzLmxlbmd0aFNxIC8gdGhpcy5yYWRpdXNTcSk7XG4gICAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5zY2FsYXIodGhpcy5mb3JjZSk7XG5cbiAgICAgIHBhcnRpY2xlLmFjY2VsZXJhdGlvbi5hZGQodGhpcy5hdHRyYWN0aW9uRm9yY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQm9keSBpbml0aWFsaXplciBmcm9tIEpTT04uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gVGhlIEpTT04gdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZSBmcm9tLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0ganNvbi54IC0gVGhlIHRhcmdldCBwb3NpdGlvbiB4IHZhbHVlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLnkgLSBUaGUgdGFyZ2V0IHBvc2l0aW9uIHkgdmFsdWVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGpzb24ueiAtIFRoZSB0YXJnZXQgcG9zaXRpb24geiB2YWx1ZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0ganNvbi5mb3JjZSAtIFRoZSBhdHRyYWN0aW9uIGZvcmNlIHNjYWxhciBtdWx0aXBsaWVyXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBqc29uLmxpZmUgLSBUaGUgbGlmZSBvZiB0aGUgcGFydGljbGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGpzb24uZWFzaW5nIC0gVGhlIGJlaGF2aW91cidzIGRlY2F5aW5nIHRyZW5kXG4gICAqIEByZXR1cm4ge0JvZHl9XG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgIGNvbnN0IHsgeCwgeSwgeiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nLCBpc0VuYWJsZWQgPSB0cnVlIH0gPSBqc29uO1xuXG4gICAgcmV0dXJuIG5ldyBBdHRyYWN0aW9uKFxuICAgICAgbmV3IFZlY3RvcjNEKHgsIHksIHopLFxuICAgICAgZm9yY2UsXG4gICAgICByYWRpdXMsXG4gICAgICBsaWZlLFxuICAgICAgZ2V0RWFzaW5nQnlOYW1lKGVhc2luZyksXG4gICAgICBpc0VuYWJsZWRcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { DEFAULT_BEHAVIOUR_EASING, DEFAULT_LIFE } from './constants';
|
|
2
|
-
import { BEHAVIOUR_TYPE_ABSTRACT } from './types';
|
|
3
|
-
import { MEASURE } from '../constants';
|
|
4
|
-
import isNumber from 'lodash/isNumber';
|
|
5
|
-
import { uid } from '../utils';
|
|
6
|
-
/**
|
|
7
|
-
* The base behaviour class.
|
|
8
|
-
* Behaviours manage a particle's behaviour after they have been emitted.
|
|
9
|
-
*
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
export default class Behaviour {
|
|
13
|
-
/**
|
|
14
|
-
* Constructs a Behaviour instance.
|
|
15
|
-
*
|
|
16
|
-
* @param {number} [life=Infinity] - The life of the behaviour
|
|
17
|
-
* @param {function} [easing=DEFAULT_BEHAVIOUR_EASING] - The behaviour's decaying trend
|
|
18
|
-
* @param {string} [type=BEHAVIOUR_TYPE_ABSTRACT] - The behaviour type
|
|
19
|
-
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
|
|
20
|
-
* @return void
|
|
21
|
-
*/
|
|
22
|
-
constructor(life = Infinity, easing = DEFAULT_BEHAVIOUR_EASING, type = BEHAVIOUR_TYPE_ABSTRACT, isEnabled = true) {
|
|
23
|
-
/**
|
|
24
|
-
* @desc The class type.
|
|
25
|
-
* @type {string}
|
|
26
|
-
*/
|
|
27
|
-
this.type = type;
|
|
28
|
-
/**
|
|
29
|
-
* @desc Determines if the behaviour will be applied or not
|
|
30
|
-
* @type {boolean}
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
this.isEnabled = isEnabled;
|
|
34
|
-
/**
|
|
35
|
-
* @desc The behaviour's id
|
|
36
|
-
* @type {string} id
|
|
37
|
-
*/
|
|
38
|
-
|
|
39
|
-
this.id = `behaviour-${uid()}`;
|
|
40
|
-
/**
|
|
41
|
-
* @desc The life of the behaviour
|
|
42
|
-
* @type {number}
|
|
43
|
-
*/
|
|
44
|
-
|
|
45
|
-
this.life = life;
|
|
46
|
-
/**
|
|
47
|
-
* @desc The behaviour's decaying trend
|
|
48
|
-
* @type {function}
|
|
49
|
-
*/
|
|
50
|
-
|
|
51
|
-
this.easing = easing;
|
|
52
|
-
/**
|
|
53
|
-
* @desc The age of the behaviour
|
|
54
|
-
* @type {number}
|
|
55
|
-
*/
|
|
56
|
-
|
|
57
|
-
this.age = 0;
|
|
58
|
-
/**
|
|
59
|
-
* @desc The energy of the behaviour
|
|
60
|
-
* @type {number}
|
|
61
|
-
*/
|
|
62
|
-
|
|
63
|
-
this.energy = 1;
|
|
64
|
-
/**
|
|
65
|
-
* Determines if the behaviour is dead or not
|
|
66
|
-
* @type {boolean}
|
|
67
|
-
*/
|
|
68
|
-
|
|
69
|
-
this.dead = false;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Reset this behaviour's parameters
|
|
73
|
-
*
|
|
74
|
-
* @param {number} [life=DEFAULT_LIFE] - The life of the behaviour
|
|
75
|
-
* @param {function} [easing=DEFAULT_BEHAVIOUR_EASING] - The behaviour's decaying trend
|
|
76
|
-
*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
reset(life = DEFAULT_LIFE, easing = DEFAULT_BEHAVIOUR_EASING) {
|
|
80
|
-
this.life = life;
|
|
81
|
-
this.easing = easing || DEFAULT_BEHAVIOUR_EASING;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Ensures that life is infinity if an invalid value is supplied.
|
|
85
|
-
*
|
|
86
|
-
* @return void
|
|
87
|
-
*/
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
set life(life) {
|
|
91
|
-
this._life = isNumber(life) ? life : DEFAULT_LIFE;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Gets the behaviour's life.
|
|
95
|
-
*
|
|
96
|
-
* @return {Number}
|
|
97
|
-
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
get life() {
|
|
101
|
-
return this._life;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Normalize a force by 1:100;
|
|
105
|
-
*
|
|
106
|
-
* @param {Vector3D} force - The force to normalize.
|
|
107
|
-
* @return {Vector3D}
|
|
108
|
-
*/
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
normalizeForce(force) {
|
|
112
|
-
return force.scalar(MEASURE);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Normalize a value by 1:100;
|
|
116
|
-
*
|
|
117
|
-
* @param {number} value - The value to normalize
|
|
118
|
-
* @return {number}
|
|
119
|
-
*/
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
normalizeValue(value) {
|
|
123
|
-
return value * MEASURE;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Set the behaviour's initial properties on the particle.
|
|
127
|
-
*
|
|
128
|
-
* @param {Particle} particle
|
|
129
|
-
* @abstract
|
|
130
|
-
*/
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
initialize(particle) {} // eslint-disable-line
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Apply behaviour to the target as a factor of time.
|
|
137
|
-
* Internally calls the mutate method to change properties on the target
|
|
138
|
-
* Will not do so if the behaviour is disabled
|
|
139
|
-
*
|
|
140
|
-
* @abstract
|
|
141
|
-
* @param {Particle|Emitter} target - The particle or emitter to apply the behaviour to
|
|
142
|
-
* @param {Number} time - the system integration time
|
|
143
|
-
* @param {integer} index - the target index
|
|
144
|
-
* @return mixed
|
|
145
|
-
*/
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
applyBehaviour(target, time, index) {
|
|
149
|
-
if (!this.isEnabled) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
this.mutate(target, time, index);
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Change the target's properties according to specific behaviour logic.
|
|
157
|
-
*
|
|
158
|
-
* @abstract
|
|
159
|
-
* @param {Particle|Emitter} target - The particle or emitter to apply the behaviour to
|
|
160
|
-
* @param {Number} time - the system integration time
|
|
161
|
-
* @return mixed
|
|
162
|
-
*/
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
mutate(target, time, index) {} // eslint-disable-line
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Compares the age of the behaviour vs integration time and determines
|
|
169
|
-
* if the behaviour should be set to dead or not.
|
|
170
|
-
* Sets the behaviour energy as a factor of particle age and life.
|
|
171
|
-
*
|
|
172
|
-
* @param {Particle} particle - The particle to apply the behaviour to
|
|
173
|
-
* @param {Number} time - the system integration time
|
|
174
|
-
* @return void
|
|
175
|
-
*/
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
energize(particle, time) {
|
|
179
|
-
if (this.dead) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
this.age += time;
|
|
184
|
-
|
|
185
|
-
if (this.age >= this.life) {
|
|
186
|
-
this.energy = 0;
|
|
187
|
-
this.dead = true;
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const scale = this.easing(particle.age / particle.life);
|
|
192
|
-
this.energy = Math.max(1 - scale, 0);
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Destory this behaviour.
|
|
196
|
-
*
|
|
197
|
-
* @abstract
|
|
198
|
-
*/
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
destroy() {}
|
|
202
|
-
/**
|
|
203
|
-
* Returns a new instance of the behaviour from the JSON object passed.
|
|
204
|
-
*
|
|
205
|
-
* @abstract
|
|
206
|
-
* @param {object} json - JSON object containing the required constructor properties
|
|
207
|
-
* @return {Behaviour}
|
|
208
|
-
*/
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
fromJSON(json) {} // eslint-disable-line
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
}
|
|
215
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQmVoYXZpb3VyLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQkVIQVZJT1VSX0VBU0lORyIsIkRFRkFVTFRfTElGRSIsIkJFSEFWSU9VUl9UWVBFX0FCU1RSQUNUIiwiTUVBU1VSRSIsImlzTnVtYmVyIiwidWlkIiwiQmVoYXZpb3VyIiwiY29uc3RydWN0b3IiLCJsaWZlIiwiSW5maW5pdHkiLCJlYXNpbmciLCJ0eXBlIiwiaXNFbmFibGVkIiwiaWQiLCJhZ2UiLCJlbmVyZ3kiLCJkZWFkIiwicmVzZXQiLCJfbGlmZSIsIm5vcm1hbGl6ZUZvcmNlIiwiZm9yY2UiLCJzY2FsYXIiLCJub3JtYWxpemVWYWx1ZSIsInZhbHVlIiwiaW5pdGlhbGl6ZSIsInBhcnRpY2xlIiwiYXBwbHlCZWhhdmlvdXIiLCJ0YXJnZXQiLCJ0aW1lIiwiaW5kZXgiLCJtdXRhdGUiLCJlbmVyZ2l6ZSIsInNjYWxlIiwiTWF0aCIsIm1heCIsImRlc3Ryb3kiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLHdCQUFULEVBQW1DQyxZQUFuQyxRQUF1RCxhQUF2RDtBQUVBLFNBQVNDLHVCQUFULFFBQXdDLFNBQXhDO0FBQ0EsU0FBU0MsT0FBVCxRQUF3QixjQUF4QjtBQUNBLE9BQU9DLFFBQVAsTUFBcUIsaUJBQXJCO0FBQ0EsU0FBU0MsR0FBVCxRQUFvQixVQUFwQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxTQUFOLENBQWdCO0FBQzdCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFQyxFQUFBQSxXQUFXLENBQ1RDLElBQUksR0FBR0MsUUFERSxFQUVUQyxNQUFNLEdBQUdWLHdCQUZBLEVBR1RXLElBQUksR0FBR1QsdUJBSEUsRUFJVFUsU0FBUyxHQUFHLElBSkgsRUFLVDtBQUNBO0FBQ0o7QUFDQTtBQUNBO0FBQ0ksU0FBS0QsSUFBTCxHQUFZQSxJQUFaO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0MsU0FBTCxHQUFpQkEsU0FBakI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxFQUFMLEdBQVcsYUFBWVIsR0FBRyxFQUFHLEVBQTdCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0csSUFBTCxHQUFZQSxJQUFaO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0UsTUFBTCxHQUFjQSxNQUFkO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0ksR0FBTCxHQUFXLENBQVg7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxTQUFLQyxNQUFMLEdBQWMsQ0FBZDtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtDLElBQUwsR0FBWSxLQUFaO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFQyxFQUFBQSxLQUFLLENBQUNULElBQUksR0FBR1AsWUFBUixFQUFzQlMsTUFBTSxHQUFHVix3QkFBL0IsRUFBeUQ7QUFDNUQsU0FBS1EsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0UsTUFBTCxHQUFjQSxNQUFNLElBQUlWLHdCQUF4QjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ1UsTUFBSlEsSUFBSSxDQUFDQSxJQUFELEVBQU87QUFDYixTQUFLVSxLQUFMLEdBQWFkLFFBQVEsQ0FBQ0ksSUFBRCxDQUFSLEdBQWlCQSxJQUFqQixHQUF3QlAsWUFBckM7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUNVLE1BQUpPLElBQUksR0FBRztBQUNULFdBQU8sS0FBS1UsS0FBWjtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUMsRUFBQUEsY0FBYyxDQUFDQyxLQUFELEVBQVE7QUFDcEIsV0FBT0EsS0FBSyxDQUFDQyxNQUFOLENBQWFsQixPQUFiLENBQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VtQixFQUFBQSxjQUFjLENBQUNDLEtBQUQsRUFBUTtBQUNwQixXQUFPQSxLQUFLLEdBQUdwQixPQUFmO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFcUIsRUFBQUEsVUFBVSxDQUFDQyxRQUFELEVBQVcsQ0FBRSxDQXhITSxDQXdITDs7QUFFeEI7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VDLEVBQUFBLGNBQWMsQ0FBQ0MsTUFBRCxFQUFTQyxJQUFULEVBQWVDLEtBQWYsRUFBc0I7QUFDbEMsUUFBSSxDQUFDLEtBQUtqQixTQUFWLEVBQXFCO0FBQ25CO0FBQ0Q7O0FBRUQsU0FBS2tCLE1BQUwsQ0FBWUgsTUFBWixFQUFvQkMsSUFBcEIsRUFBMEJDLEtBQTFCO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUMsRUFBQUEsTUFBTSxDQUFDSCxNQUFELEVBQVNDLElBQVQsRUFBZUMsS0FBZixFQUFzQixDQUFFLENBckpELENBcUpFOztBQUUvQjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRSxFQUFBQSxRQUFRLENBQUNOLFFBQUQsRUFBV0csSUFBWCxFQUFpQjtBQUN2QixRQUFJLEtBQUtaLElBQVQsRUFBZTtBQUNiO0FBQ0Q7O0FBRUQsU0FBS0YsR0FBTCxJQUFZYyxJQUFaOztBQUVBLFFBQUksS0FBS2QsR0FBTCxJQUFZLEtBQUtOLElBQXJCLEVBQTJCO0FBQ3pCLFdBQUtPLE1BQUwsR0FBYyxDQUFkO0FBQ0EsV0FBS0MsSUFBTCxHQUFZLElBQVo7QUFFQTtBQUNEOztBQUVELFVBQU1nQixLQUFLLEdBQUcsS0FBS3RCLE1BQUwsQ0FBWWUsUUFBUSxDQUFDWCxHQUFULEdBQWVXLFFBQVEsQ0FBQ2pCLElBQXBDLENBQWQ7QUFFQSxTQUFLTyxNQUFMLEdBQWNrQixJQUFJLENBQUNDLEdBQUwsQ0FBUyxJQUFJRixLQUFiLEVBQW9CLENBQXBCLENBQWQ7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUNFRyxFQUFBQSxPQUFPLEdBQUcsQ0FBRTtBQUVaO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDRUMsRUFBQUEsUUFBUSxDQUFDQyxJQUFELEVBQU8sQ0FBRSxDQWpNWSxDQWlNWDs7O0FBak1XIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVGQVVMVF9CRUhBVklPVVJfRUFTSU5HLCBERUZBVUxUX0xJRkUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmltcG9ydCB7IEJFSEFWSU9VUl9UWVBFX0FCU1RSQUNUIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBNRUFTVVJFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBpc051bWJlciBmcm9tICdsb2Rhc2gvaXNOdW1iZXInO1xuaW1wb3J0IHsgdWlkIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGJlaGF2aW91ciBjbGFzcy5cbiAqIEJlaGF2aW91cnMgbWFuYWdlIGEgcGFydGljbGUncyBiZWhhdmlvdXIgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZW1pdHRlZC5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgQmVoYXZpb3VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmU9SW5maW5pdHldIC0gVGhlIGxpZmUgb2YgdGhlIGJlaGF2aW91clxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZWFzaW5nPURFRkFVTFRfQkVIQVZJT1VSX0VBU0lOR10gLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPUJFSEFWSU9VUl9UWVBFX0FCU1RSQUNUXSAtIFRoZSBiZWhhdmlvdXIgdHlwZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0VuYWJsZWQ9dHJ1ZV0gLSBEZXRlcm1pbmVzIGlmIHRoZSBiZWhhdmlvdXIgd2lsbCBiZSBhcHBsaWVkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGxpZmUgPSBJbmZpbml0eSxcbiAgICBlYXNpbmcgPSBERUZBVUxUX0JFSEFWSU9VUl9FQVNJTkcsXG4gICAgdHlwZSA9IEJFSEFWSU9VUl9UWVBFX0FCU1RSQUNULFxuICAgIGlzRW5hYmxlZCA9IHRydWVcbiAgKSB7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNsYXNzIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgRGV0ZXJtaW5lcyBpZiB0aGUgYmVoYXZpb3VyIHdpbGwgYmUgYXBwbGllZCBvciBub3RcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmlzRW5hYmxlZCA9IGlzRW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBiZWhhdmlvdXIncyBpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9IGlkXG4gICAgICovXG4gICAgdGhpcy5pZCA9IGBiZWhhdmlvdXItJHt1aWQoKX1gO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGxpZmUgb2YgdGhlIGJlaGF2aW91clxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5saWZlID0gbGlmZTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBiZWhhdmlvdXIncyBkZWNheWluZyB0cmVuZFxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cbiAgICAgKi9cbiAgICB0aGlzLmVhc2luZyA9IGVhc2luZztcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBhZ2Ugb2YgdGhlIGJlaGF2aW91clxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5hZ2UgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGVuZXJneSBvZiB0aGUgYmVoYXZpb3VyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmVuZXJneSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBiZWhhdmlvdXIgaXMgZGVhZCBvciBub3RcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmRlYWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPURFRkFVTFRfTElGRV0gLSBUaGUgbGlmZSBvZiB0aGUgYmVoYXZpb3VyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtlYXNpbmc9REVGQVVMVF9CRUhBVklPVVJfRUFTSU5HXSAtIFRoZSBiZWhhdmlvdXIncyBkZWNheWluZyB0cmVuZFxuICAgKi9cbiAgcmVzZXQobGlmZSA9IERFRkFVTFRfTElGRSwgZWFzaW5nID0gREVGQVVMVF9CRUhBVklPVVJfRUFTSU5HKSB7XG4gICAgdGhpcy5saWZlID0gbGlmZTtcbiAgICB0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBERUZBVUxUX0JFSEFWSU9VUl9FQVNJTkc7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGF0IGxpZmUgaXMgaW5maW5pdHkgaWYgYW4gaW52YWxpZCB2YWx1ZSBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBzZXQgbGlmZShsaWZlKSB7XG4gICAgdGhpcy5fbGlmZSA9IGlzTnVtYmVyKGxpZmUpID8gbGlmZSA6IERFRkFVTFRfTElGRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBiZWhhdmlvdXIncyBsaWZlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgbGlmZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlmZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSBmb3JjZSBieSAxOjEwMDtcbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3IzRH0gZm9yY2UgLSBUaGUgZm9yY2UgdG8gbm9ybWFsaXplLlxuICAgKiBAcmV0dXJuIHtWZWN0b3IzRH1cbiAgICovXG4gIG5vcm1hbGl6ZUZvcmNlKGZvcmNlKSB7XG4gICAgcmV0dXJuIGZvcmNlLnNjYWxhcihNRUFTVVJFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSB2YWx1ZSBieSAxOjEwMDtcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAqIE1FQVNVUkU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBiZWhhdmlvdXIncyBpbml0aWFsIHByb3BlcnRpZXMgb24gdGhlIHBhcnRpY2xlLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAvKipcbiAgICogQXBwbHkgYmVoYXZpb3VyIHRvIHRoZSB0YXJnZXQgYXMgYSBmYWN0b3Igb2YgdGltZS5cbiAgICogSW50ZXJuYWxseSBjYWxscyB0aGUgbXV0YXRlIG1ldGhvZCB0byBjaGFuZ2UgcHJvcGVydGllcyBvbiB0aGUgdGFyZ2V0XG4gICAqIFdpbGwgbm90IGRvIHNvIGlmIHRoZSBiZWhhdmlvdXIgaXMgZGlzYWJsZWRcbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7UGFydGljbGV8RW1pdHRlcn0gdGFyZ2V0IC0gVGhlIHBhcnRpY2xlIG9yIGVtaXR0ZXIgdG8gYXBwbHkgdGhlIGJlaGF2aW91ciB0b1xuICAgKiBAcGFyYW0ge051bWJlcn0gdGltZSAtIHRoZSBzeXN0ZW0gaW50ZWdyYXRpb24gdGltZVxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gdGhlIHRhcmdldCBpbmRleFxuICAgKiBAcmV0dXJuIG1peGVkXG4gICAqL1xuICBhcHBseUJlaGF2aW91cih0YXJnZXQsIHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubXV0YXRlKHRhcmdldCwgdGltZSwgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgdGFyZ2V0J3MgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWMgYmVoYXZpb3VyIGxvZ2ljLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtQYXJ0aWNsZXxFbWl0dGVyfSB0YXJnZXQgLSBUaGUgcGFydGljbGUgb3IgZW1pdHRlciB0byBhcHBseSB0aGUgYmVoYXZpb3VyIHRvXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lIC0gdGhlIHN5c3RlbSBpbnRlZ3JhdGlvbiB0aW1lXG4gICAqIEByZXR1cm4gbWl4ZWRcbiAgICovXG4gIG11dGF0ZSh0YXJnZXQsIHRpbWUsIGluZGV4KSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgLyoqXG4gICAqIENvbXBhcmVzIHRoZSBhZ2Ugb2YgdGhlIGJlaGF2aW91ciB2cyBpbnRlZ3JhdGlvbiB0aW1lIGFuZCBkZXRlcm1pbmVzXG4gICAqIGlmIHRoZSBiZWhhdmlvdXIgc2hvdWxkIGJlIHNldCB0byBkZWFkIG9yIG5vdC5cbiAgICogU2V0cyB0aGUgYmVoYXZpb3VyIGVuZXJneSBhcyBhIGZhY3RvciBvZiBwYXJ0aWNsZSBhZ2UgYW5kIGxpZmUuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGFwcGx5IHRoZSBiZWhhdmlvdXIgdG9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWUgLSB0aGUgc3lzdGVtIGludGVncmF0aW9uIHRpbWVcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBlbmVyZ2l6ZShwYXJ0aWNsZSwgdGltZSkge1xuICAgIGlmICh0aGlzLmRlYWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuYWdlID49IHRoaXMubGlmZSkge1xuICAgICAgdGhpcy5lbmVyZ3kgPSAwO1xuICAgICAgdGhpcy5kZWFkID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5lYXNpbmcocGFydGljbGUuYWdlIC8gcGFydGljbGUubGlmZSk7XG5cbiAgICB0aGlzLmVuZXJneSA9IE1hdGgubWF4KDEgLSBzY2FsZSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSB0aGlzIGJlaGF2aW91ci5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBkZXN0cm95KCkge31cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYmVoYXZpb3VyIGZyb20gdGhlIEpTT04gb2JqZWN0IHBhc3NlZC5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWlyZWQgY29uc3RydWN0b3IgcHJvcGVydGllc1xuICAgKiBAcmV0dXJuIHtCZWhhdmlvdXJ9XG4gICAqL1xuICBmcm9tSlNPTihqc29uKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG59XG4iXX0=
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import Behaviour from './Behaviour';
|
|
2
|
-
import { Vector3D } from '../math';
|
|
3
|
-
import { BEHAVIOUR_TYPE_COLLISION as type } from './types';
|
|
4
|
-
/**
|
|
5
|
-
* Behaviour that causes particles to move away from other particles they collide with.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export default class Collision extends Behaviour {
|
|
9
|
-
/**
|
|
10
|
-
* Constructs a Collision behaviour instance.
|
|
11
|
-
*
|
|
12
|
-
* @param {Emitter} emitter - The emitter containing the particles to detect collisions against
|
|
13
|
-
* @param {boolean} useMass - Determiens whether to use mass or not
|
|
14
|
-
* @param {function} onCollide - Function to call when particles collide
|
|
15
|
-
* @param {number} life - The life of the particle
|
|
16
|
-
* @param {function} easing - The behaviour's decaying trend
|
|
17
|
-
* @param {boolean} [isEnabled=true] - Determines if the behaviour will be applied or not
|
|
18
|
-
* @return void
|
|
19
|
-
*/
|
|
20
|
-
constructor(emitter, useMass, onCollide, life, easing, isEnabled = true) {
|
|
21
|
-
super(life, easing, type, isEnabled);
|
|
22
|
-
this.reset(emitter, useMass, onCollide);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Resets the behaviour properties.
|
|
26
|
-
*
|
|
27
|
-
* @param {Emitter} emitter - The emitter containing the particles to detect collisions against
|
|
28
|
-
* @param {boolean} useMass - Determiens whether to use mass or not
|
|
29
|
-
* @param {function} onCollide - Function to call when particles collide
|
|
30
|
-
* @param {number} life - The life of the particle
|
|
31
|
-
* @param {function} easing - The behaviour's decaying trend
|
|
32
|
-
* @return void
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
reset(emitter, useMass, onCollide, life, easing) {
|
|
37
|
-
this.emitter = emitter;
|
|
38
|
-
this.useMass = useMass;
|
|
39
|
-
this.onCollide = onCollide;
|
|
40
|
-
this.particles = [];
|
|
41
|
-
this.delta = new Vector3D();
|
|
42
|
-
life && super.reset(life, easing);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Detects collisions with other particles and calls the
|
|
46
|
-
* onCollide function on colliding particles.
|
|
47
|
-
*
|
|
48
|
-
* @param {Particle} particle - the particle to apply the behaviour to
|
|
49
|
-
* @param {number} time - particle engine time
|
|
50
|
-
* @param {integer} index - the particle index
|
|
51
|
-
* @return void
|
|
52
|
-
*/
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
mutate(particle, time, index) {
|
|
56
|
-
const particles = this.emitter ? this.emitter.particles.slice(index) : this.particles.slice(index);
|
|
57
|
-
let otherParticle, lengthSq, overlap, distance, averageMass1, averageMass2;
|
|
58
|
-
let i = particles.length;
|
|
59
|
-
|
|
60
|
-
while (i--) {
|
|
61
|
-
otherParticle = particles[i];
|
|
62
|
-
|
|
63
|
-
if (otherParticle == particle) {
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
this.delta.copy(otherParticle.position).sub(particle.position);
|
|
68
|
-
lengthSq = this.delta.lengthSq();
|
|
69
|
-
distance = particle.radius + otherParticle.radius;
|
|
70
|
-
|
|
71
|
-
if (lengthSq <= distance * distance) {
|
|
72
|
-
overlap = distance - Math.sqrt(lengthSq);
|
|
73
|
-
overlap += 0.5;
|
|
74
|
-
averageMass1 = this._getAverageMass(particle, otherParticle);
|
|
75
|
-
averageMass2 = this._getAverageMass(otherParticle, particle);
|
|
76
|
-
particle.position.add(this.delta.clone().normalize().scalar(overlap * -averageMass1));
|
|
77
|
-
otherParticle.position.add(this.delta.normalize().scalar(overlap * averageMass2));
|
|
78
|
-
this.onCollide && this.onCollide(particle, otherParticle);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Gets the average mass of both particles.
|
|
84
|
-
*
|
|
85
|
-
* @param {Particle} particleA - The first particle
|
|
86
|
-
* @param {Particle} particleB - The second particle
|
|
87
|
-
* @return {number}
|
|
88
|
-
*/
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
_getAverageMass(particleA, particleB) {
|
|
92
|
-
return this.useMass ? particleB.mass / (particleA.mass + particleB.mass) : 0.5;
|
|
93
|
-
} // TODO
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
fromJSON(json) {} // eslint-disable-line
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZWhhdmlvdXIvQ29sbGlzaW9uLmpzIl0sIm5hbWVzIjpbIkJlaGF2aW91ciIsIlZlY3RvcjNEIiwiQkVIQVZJT1VSX1RZUEVfQ09MTElTSU9OIiwidHlwZSIsIkNvbGxpc2lvbiIsImNvbnN0cnVjdG9yIiwiZW1pdHRlciIsInVzZU1hc3MiLCJvbkNvbGxpZGUiLCJsaWZlIiwiZWFzaW5nIiwiaXNFbmFibGVkIiwicmVzZXQiLCJwYXJ0aWNsZXMiLCJkZWx0YSIsIm11dGF0ZSIsInBhcnRpY2xlIiwidGltZSIsImluZGV4Iiwic2xpY2UiLCJvdGhlclBhcnRpY2xlIiwibGVuZ3RoU3EiLCJvdmVybGFwIiwiZGlzdGFuY2UiLCJhdmVyYWdlTWFzczEiLCJhdmVyYWdlTWFzczIiLCJpIiwibGVuZ3RoIiwiY29weSIsInBvc2l0aW9uIiwic3ViIiwicmFkaXVzIiwiTWF0aCIsInNxcnQiLCJfZ2V0QXZlcmFnZU1hc3MiLCJhZGQiLCJjbG9uZSIsIm5vcm1hbGl6ZSIsInNjYWxhciIsInBhcnRpY2xlQSIsInBhcnRpY2xlQiIsIm1hc3MiLCJmcm9tSlNPTiIsImpzb24iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFNBQVAsTUFBc0IsYUFBdEI7QUFDQSxTQUFTQyxRQUFULFFBQXlCLFNBQXpCO0FBQ0EsU0FBU0Msd0JBQXdCLElBQUlDLElBQXJDLFFBQWlELFNBQWpEO0FBRUE7QUFDQTtBQUNBOztBQUNBLGVBQWUsTUFBTUMsU0FBTixTQUF3QkosU0FBeEIsQ0FBa0M7QUFDL0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFSyxFQUFBQSxXQUFXLENBQUNDLE9BQUQsRUFBVUMsT0FBVixFQUFtQkMsU0FBbkIsRUFBOEJDLElBQTlCLEVBQW9DQyxNQUFwQyxFQUE0Q0MsU0FBUyxHQUFHLElBQXhELEVBQThEO0FBQ3ZFLFVBQU1GLElBQU4sRUFBWUMsTUFBWixFQUFvQlAsSUFBcEIsRUFB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U0FBUyxDQUFDQyxJQUFWLElBQWtCRixTQUFTLENBQUNFLElBQVYsR0FBaUJELFNBQVMsQ0FBQ0MsSUFBN0MsQ0FERyxHQUVILEdBRko7QUFHRCxHQXRHOEMsQ0F3Ry9DOzs7QUFDQUMsRUFBQUEsUUFBUSxDQUFDQyxJQUFELEVBQU8sQ0FBRSxDQXpHOEIsQ0F5RzdCOzs7QUF6RzZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJlaGF2aW91ciBmcm9tICcuL0JlaGF2aW91cic7XG5pbXBvcnQgeyBWZWN0b3IzRCB9IGZyb20gJy4uL21hdGgnO1xuaW1wb3J0IHsgQkVIQVZJT1VSX1RZUEVfQ09MTElTSU9OIGFzIHR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBCZWhhdmlvdXIgdGhhdCBjYXVzZXMgcGFydGljbGVzIHRvIG1vdmUgYXdheSBmcm9tIG90aGVyIHBhcnRpY2xlcyB0aGV5IGNvbGxpZGUgd2l0aC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGlzaW9uIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBDb2xsaXNpb24gYmVoYXZpb3VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0VtaXR0ZXJ9IGVtaXR0ZXIgLSBUaGUgZW1pdHRlciBjb250YWluaW5nIHRoZSBwYXJ0aWNsZXMgdG8gZGV0ZWN0IGNvbGxpc2lvbnMgYWdhaW5zdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZU1hc3MgLSBEZXRlcm1pZW5zIHdoZXRoZXIgdG8gdXNlIG1hc3Mgb3Igbm90XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uQ29sbGlkZSAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwYXJ0aWNsZXMgY29sbGlkZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlYXNpbmcgLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmRcbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNFbmFibGVkPXRydWVdIC0gRGV0ZXJtaW5lcyBpZiB0aGUgYmVoYXZpb3VyIHdpbGwgYmUgYXBwbGllZCBvciBub3RcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbWl0dGVyLCB1c2VNYXNzLCBvbkNvbGxpZGUsIGxpZmUsIGVhc2luZywgaXNFbmFibGVkID0gdHJ1ZSkge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZywgdHlwZSwgaXNFbmFibGVkKTtcblxuICAgIHRoaXMucmVzZXQoZW1pdHRlciwgdXNlTWFzcywgb25Db2xsaWRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGJlaGF2aW91ciBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0VtaXR0ZXJ9IGVtaXR0ZXIgLSBUaGUgZW1pdHRlciBjb250YWluaW5nIHRoZSBwYXJ0aWNsZXMgdG8gZGV0ZWN0IGNvbGxpc2lvbnMgYWdhaW5zdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZU1hc3MgLSBEZXRlcm1pZW5zIHdoZXRoZXIgdG8gdXNlIG1hc3Mgb3Igbm90XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uQ29sbGlkZSAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwYXJ0aWNsZXMgY29sbGlkZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGlmZSAtIFRoZSBsaWZlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlYXNpbmcgLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmRcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICByZXNldChlbWl0dGVyLCB1c2VNYXNzLCBvbkNvbGxpZGUsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuZW1pdHRlciA9IGVtaXR0ZXI7XG4gICAgdGhpcy51c2VNYXNzID0gdXNlTWFzcztcbiAgICB0aGlzLm9uQ29sbGlkZSA9IG9uQ29sbGlkZTtcbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuICAgIHRoaXMuZGVsdGEgPSBuZXcgVmVjdG9yM0QoKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIGNvbGxpc2lvbnMgd2l0aCBvdGhlciBwYXJ0aWNsZXMgYW5kIGNhbGxzIHRoZVxuICAgKiBvbkNvbGxpZGUgZnVuY3Rpb24gb24gY29sbGlkaW5nIHBhcnRpY2xlcy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSB0aGUgcGFydGljbGUgdG8gYXBwbHkgdGhlIGJlaGF2aW91ciB0b1xuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIHBhcnRpY2xlIGVuZ2luZSB0aW1lXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBtdXRhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgY29uc3QgcGFydGljbGVzID0gdGhpcy5lbWl0dGVyXG4gICAgICA/IHRoaXMuZW1pdHRlci5wYXJ0aWNsZXMuc2xpY2UoaW5kZXgpXG4gICAgICA6IHRoaXMucGFydGljbGVzLnNsaWNlKGluZGV4KTtcblxuICAgIGxldCBvdGhlclBhcnRpY2xlLCBsZW5ndGhTcSwgb3ZlcmxhcCwgZGlzdGFuY2UsIGF2ZXJhZ2VNYXNzMSwgYXZlcmFnZU1hc3MyO1xuXG4gICAgbGV0IGkgPSBwYXJ0aWNsZXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgb3RoZXJQYXJ0aWNsZSA9IHBhcnRpY2xlc1tpXTtcblxuICAgICAgaWYgKG90aGVyUGFydGljbGUgPT0gcGFydGljbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVsdGEuY29weShvdGhlclBhcnRpY2xlLnBvc2l0aW9uKS5zdWIocGFydGljbGUucG9zaXRpb24pO1xuXG4gICAgICBsZW5ndGhTcSA9IHRoaXMuZGVsdGEubGVuZ3RoU3EoKTtcbiAgICAgIGRpc3RhbmNlID0gcGFydGljbGUucmFkaXVzICsgb3RoZXJQYXJ0aWNsZS5yYWRpdXM7XG5cbiAgICAgIGlmIChsZW5ndGhTcSA8PSBkaXN0YW5jZSAqIGRpc3RhbmNlKSB7XG4gICAgICAgIG92ZXJsYXAgPSBkaXN0YW5jZSAtIE1hdGguc3FydChsZW5ndGhTcSk7XG4gICAgICAgIG92ZXJsYXAgKz0gMC41O1xuXG4gICAgICAgIGF2ZXJhZ2VNYXNzMSA9IHRoaXMuX2dldEF2ZXJhZ2VNYXNzKHBhcnRpY2xlLCBvdGhlclBhcnRpY2xlKTtcbiAgICAgICAgYXZlcmFnZU1hc3MyID0gdGhpcy5fZ2V0QXZlcmFnZU1hc3Mob3RoZXJQYXJ0aWNsZSwgcGFydGljbGUpO1xuXG4gICAgICAgIHBhcnRpY2xlLnBvc2l0aW9uLmFkZChcbiAgICAgICAgICB0aGlzLmRlbHRhXG4gICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgLm5vcm1hbGl6ZSgpXG4gICAgICAgICAgICAuc2NhbGFyKG92ZXJsYXAgKiAtYXZlcmFnZU1hc3MxKVxuICAgICAgICApO1xuXG4gICAgICAgIG90aGVyUGFydGljbGUucG9zaXRpb24uYWRkKFxuICAgICAgICAgIHRoaXMuZGVsdGEubm9ybWFsaXplKCkuc2NhbGFyKG92ZXJsYXAgKiBhdmVyYWdlTWFzczIpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbkNvbGxpZGUgJiYgdGhpcy5vbkNvbGxpZGUocGFydGljbGUsIG90aGVyUGFydGljbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhdmVyYWdlIG1hc3Mgb2YgYm90aCBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlQSAtIFRoZSBmaXJzdCBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZUIgLSBUaGUgc2Vjb25kIHBhcnRpY2xlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIF9nZXRBdmVyYWdlTWFzcyhwYXJ0aWNsZUEsIHBhcnRpY2xlQikge1xuICAgIHJldHVybiB0aGlzLnVzZU1hc3NcbiAgICAgID8gcGFydGljbGVCLm1hc3MgLyAocGFydGljbGVBLm1hc3MgKyBwYXJ0aWNsZUIubWFzcylcbiAgICAgIDogMC41O1xuICB9XG5cbiAgLy8gVE9ET1xuICBmcm9tSlNPTihqc29uKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG59XG4iXX0=
|