three-nebula 10.0.3 → 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/.claude/rules/no-coauthor.md +4 -0
- package/CHANGELOG.md +33 -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 +32 -56
- 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 -791
- 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/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 -100
- package/build/cjs/initializer/types.js +0 -35
- 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 -350
- 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 -364
- 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 -53
- 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 -43
- 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 -63
- 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 -14
- 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 -701
- 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/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 -11
- package/build/esm/initializer/types.js +0 -15
- 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 -331
- package/build/esm/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -23
- package/build/esm/renderer/GPURenderer/Desktop/shaders/index.js +0 -3
- package/build/esm/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -33
- package/build/esm/renderer/GPURenderer/Mobile/index.js +0 -349
- package/build/esm/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -20
- package/build/esm/renderer/GPURenderer/Mobile/shaders/index.js +0 -3
- package/build/esm/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -30
- package/build/esm/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -27
- 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 -24
- 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 -94
- package/build/esm/renderer/SpriteRenderer.js +0 -26
- 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,357 +0,0 @@
|
|
|
1
|
-
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';
|
|
2
|
-
import { Util, uid } from '../utils';
|
|
3
|
-
import { PI } from '../constants';
|
|
4
|
-
import { Vector3D } from '../math';
|
|
5
|
-
import { CORE_TYPE_PARTICLE as type } from './types';
|
|
6
|
-
/**
|
|
7
|
-
* A Particle is an object that is emitted by an emitter.
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export default class Particle {
|
|
12
|
-
/**
|
|
13
|
-
* Constructs a Particle instance.
|
|
14
|
-
*
|
|
15
|
-
* @param {object} properties - The properties to instantiate the particle with
|
|
16
|
-
* @property {number} properties.life - The particle's life
|
|
17
|
-
* @property {number} properties.age - The particle's age
|
|
18
|
-
* @property {number} properties.energy - The particle's energy loss
|
|
19
|
-
* @property {boolean} properties.dead - Determines if the particle is dead or not
|
|
20
|
-
* @property {boolean} properties.sleep - Determines if the particle is sleeping or not
|
|
21
|
-
* @property {object} properties.target - The particle's target
|
|
22
|
-
* @property {object} properties.body - The particle's body
|
|
23
|
-
* @property {number} properties.mass - The particle's mass
|
|
24
|
-
* @property {number} properties.radius - The particle's radius
|
|
25
|
-
* @property {number} properties.alpha - The particle's alpha
|
|
26
|
-
* @property {number} properties.scale - The particle's scale
|
|
27
|
-
* @property {number} properties.rotation - The particle's rotation
|
|
28
|
-
* @property {string|number} properties.color - The particle's color
|
|
29
|
-
* @property {function} properties.easing - The particle's easing
|
|
30
|
-
* @property {Vector3D} properties.position - The particle's position
|
|
31
|
-
* @property {Vector3D} properties.velocity - The particle's velocity
|
|
32
|
-
* @property {Vector3D} properties.acceleration - The particle's acceleration
|
|
33
|
-
* @property {array} properties.behaviours - The particle's behaviours array
|
|
34
|
-
* @property {object} properties.transform - The particle's transform collection
|
|
35
|
-
* @return void
|
|
36
|
-
*/
|
|
37
|
-
constructor(properties) {
|
|
38
|
-
/**
|
|
39
|
-
* @desc The particle's unique id
|
|
40
|
-
* @type {number}
|
|
41
|
-
*/
|
|
42
|
-
this.id = `particle-${uid()}`;
|
|
43
|
-
/**
|
|
44
|
-
* @desc The class type.
|
|
45
|
-
* @type {string}
|
|
46
|
-
*/
|
|
47
|
-
|
|
48
|
-
this.type = type;
|
|
49
|
-
/**
|
|
50
|
-
* @desc The particle's life
|
|
51
|
-
* @type {number}
|
|
52
|
-
*/
|
|
53
|
-
|
|
54
|
-
this.life = DEFAULT_LIFE;
|
|
55
|
-
/**
|
|
56
|
-
* @desc The particle's age
|
|
57
|
-
* @type {number}
|
|
58
|
-
*/
|
|
59
|
-
|
|
60
|
-
this.age = DEFAULT_AGE;
|
|
61
|
-
/**
|
|
62
|
-
* @desc The particle's energy loss
|
|
63
|
-
* @type {number}
|
|
64
|
-
*/
|
|
65
|
-
|
|
66
|
-
this.energy = DEFAULT_ENERGY;
|
|
67
|
-
/**
|
|
68
|
-
* @desc Determines if the particle is dead or not
|
|
69
|
-
* @type {number}
|
|
70
|
-
*/
|
|
71
|
-
|
|
72
|
-
this.dead = DEFAULT_DEAD;
|
|
73
|
-
/**
|
|
74
|
-
* @desc Determines if the particle is sleeping or not
|
|
75
|
-
* @type {number}
|
|
76
|
-
*/
|
|
77
|
-
|
|
78
|
-
this.sleep = DEFAULT_SLEEP;
|
|
79
|
-
/**
|
|
80
|
-
* @desc The particle's body
|
|
81
|
-
* @type {object}
|
|
82
|
-
*/
|
|
83
|
-
|
|
84
|
-
this.body = DEFAULT_BODY;
|
|
85
|
-
/**
|
|
86
|
-
* @desc The particle's parent
|
|
87
|
-
* @type {?Emitter}
|
|
88
|
-
*/
|
|
89
|
-
|
|
90
|
-
this.parent = DEFAULT_PARENT;
|
|
91
|
-
/**
|
|
92
|
-
* @desc The particle's mass
|
|
93
|
-
* @type {number}
|
|
94
|
-
*/
|
|
95
|
-
|
|
96
|
-
this.mass = DEFAULT_MASS;
|
|
97
|
-
/**
|
|
98
|
-
* @desc The particle's radius
|
|
99
|
-
* @type {number}
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
|
-
this.radius = DEFAULT_RADIUS;
|
|
103
|
-
/**
|
|
104
|
-
* @desc The particle's alpha
|
|
105
|
-
* @type {number}
|
|
106
|
-
*/
|
|
107
|
-
|
|
108
|
-
this.alpha = DEFAULT_ALPHA;
|
|
109
|
-
/**
|
|
110
|
-
* @desc The particle's scale
|
|
111
|
-
* @type {number}
|
|
112
|
-
*/
|
|
113
|
-
|
|
114
|
-
this.scale = DEFAULT_SCALE;
|
|
115
|
-
/**
|
|
116
|
-
* @desc Determines whether to use color or not
|
|
117
|
-
* @type {boolean}
|
|
118
|
-
*/
|
|
119
|
-
|
|
120
|
-
this.useColor = DEFAULT_USE_COLOR;
|
|
121
|
-
/**
|
|
122
|
-
* @desc Determines whether to use alpha or not
|
|
123
|
-
* @type {boolean}
|
|
124
|
-
*/
|
|
125
|
-
|
|
126
|
-
this.useAlpha = DEFAULT_USE_ALPHA;
|
|
127
|
-
/**
|
|
128
|
-
* @desc The particle's easing
|
|
129
|
-
* @type {string}
|
|
130
|
-
*/
|
|
131
|
-
|
|
132
|
-
this.easing = DEFAULT_EASING;
|
|
133
|
-
/**
|
|
134
|
-
* @desc The particle's position
|
|
135
|
-
* @type {Vector3D}
|
|
136
|
-
*/
|
|
137
|
-
|
|
138
|
-
this.position = new Vector3D();
|
|
139
|
-
/**
|
|
140
|
-
* @desc The particle's velocity
|
|
141
|
-
* @type {Vector3D}
|
|
142
|
-
*/
|
|
143
|
-
|
|
144
|
-
this.velocity = new Vector3D();
|
|
145
|
-
/**
|
|
146
|
-
* @desc The particle's acceleration
|
|
147
|
-
* @type {Vector3D}
|
|
148
|
-
*/
|
|
149
|
-
|
|
150
|
-
this.acceleration = new Vector3D();
|
|
151
|
-
/**
|
|
152
|
-
* @desc The particle's last position, velocity and acceleration
|
|
153
|
-
* @type {Vector3D}
|
|
154
|
-
*/
|
|
155
|
-
|
|
156
|
-
this.old = {};
|
|
157
|
-
/**
|
|
158
|
-
* @desc The particle's old position
|
|
159
|
-
* @type {Vector3D}
|
|
160
|
-
*/
|
|
161
|
-
|
|
162
|
-
this.old.position = this.position.clone();
|
|
163
|
-
/**
|
|
164
|
-
* @desc The particle's old velocity
|
|
165
|
-
* @type {Vector3D}
|
|
166
|
-
*/
|
|
167
|
-
|
|
168
|
-
this.old.velocity = this.velocity.clone();
|
|
169
|
-
/**
|
|
170
|
-
* @desc The particle's old acceleration
|
|
171
|
-
* @type {Vector3D}
|
|
172
|
-
*/
|
|
173
|
-
|
|
174
|
-
this.old.acceleration = this.acceleration.clone();
|
|
175
|
-
/**
|
|
176
|
-
* @desc The particle's behaviours array
|
|
177
|
-
* @type {array}
|
|
178
|
-
*/
|
|
179
|
-
|
|
180
|
-
this.behaviours = [];
|
|
181
|
-
/**
|
|
182
|
-
* @desc The particle's transform collection
|
|
183
|
-
* @type {object}
|
|
184
|
-
*/
|
|
185
|
-
|
|
186
|
-
this.transform = {};
|
|
187
|
-
/**
|
|
188
|
-
* @desc The particle's color store
|
|
189
|
-
* @type {object}
|
|
190
|
-
*/
|
|
191
|
-
|
|
192
|
-
this.color = {
|
|
193
|
-
r: 0,
|
|
194
|
-
g: 0,
|
|
195
|
-
b: 0
|
|
196
|
-
};
|
|
197
|
-
/**
|
|
198
|
-
* @desc The particle's rotation
|
|
199
|
-
* @type {number}
|
|
200
|
-
*/
|
|
201
|
-
|
|
202
|
-
this.rotation = new Vector3D();
|
|
203
|
-
/**
|
|
204
|
-
* @desc The particle's distance to the camera, only set by the GPURenderer for depth sorting purposes.
|
|
205
|
-
* @type {number}
|
|
206
|
-
*/
|
|
207
|
-
|
|
208
|
-
this.distanceToCamera = 0; // override constructor props with passed properties.
|
|
209
|
-
|
|
210
|
-
Util.setPrototypeByObj(this, properties);
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Gets the particle's current direction.
|
|
214
|
-
*
|
|
215
|
-
* @return {number}
|
|
216
|
-
*/
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
getDirection() {
|
|
220
|
-
return Math.atan2(this.velocity.x, -this.velocity.y) * (180 / PI);
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Resets the particle's default properties and clear's its particle's position,
|
|
224
|
-
* velocity, acceleration, color and rotation. Also destroy's the particle's
|
|
225
|
-
* transform collection & removes all behaviours.
|
|
226
|
-
*
|
|
227
|
-
* @return {Particle}
|
|
228
|
-
*/
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
reset() {
|
|
232
|
-
this.life = DEFAULT_LIFE;
|
|
233
|
-
this.age = DEFAULT_AGE;
|
|
234
|
-
this.energy = DEFAULT_ENERGY;
|
|
235
|
-
this.dead = DEFAULT_DEAD;
|
|
236
|
-
this.sleep = DEFAULT_SLEEP;
|
|
237
|
-
this.body = DEFAULT_BODY;
|
|
238
|
-
this.parent = DEFAULT_PARENT;
|
|
239
|
-
this.mass = DEFAULT_MASS;
|
|
240
|
-
this.radius = DEFAULT_RADIUS;
|
|
241
|
-
this.alpha = DEFAULT_ALPHA;
|
|
242
|
-
this.scale = DEFAULT_SCALE;
|
|
243
|
-
this.useColor = DEFAULT_USE_COLOR;
|
|
244
|
-
this.useAlpha = DEFAULT_USE_ALPHA;
|
|
245
|
-
this.easing = DEFAULT_EASING;
|
|
246
|
-
this.position.set(0, 0, 0);
|
|
247
|
-
this.velocity.set(0, 0, 0);
|
|
248
|
-
this.acceleration.set(0, 0, 0);
|
|
249
|
-
this.old.position.set(0, 0, 0);
|
|
250
|
-
this.old.velocity.set(0, 0, 0);
|
|
251
|
-
this.old.acceleration.set(0, 0, 0);
|
|
252
|
-
this.color.r = 0;
|
|
253
|
-
this.color.g = 0;
|
|
254
|
-
this.color.b = 0;
|
|
255
|
-
this.rotation.clear();
|
|
256
|
-
Util.destroyObject(this.transform);
|
|
257
|
-
this.removeAllBehaviours();
|
|
258
|
-
return this;
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Updates the particle's properties by applying each behaviour to the particle.
|
|
262
|
-
* Will also update the particle's energy, unless it's age is greater than it's life
|
|
263
|
-
* in which case it will be destroyed.
|
|
264
|
-
*
|
|
265
|
-
* @param {number} time - Integration time
|
|
266
|
-
* @param {integer} index - Particle index
|
|
267
|
-
* @return void
|
|
268
|
-
*/
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
update(time, index) {
|
|
272
|
-
if (!this.sleep) {
|
|
273
|
-
this.age += time;
|
|
274
|
-
let i = this.behaviours.length;
|
|
275
|
-
|
|
276
|
-
while (i--) {
|
|
277
|
-
let behaviour = this.behaviours[i]; //behaviour &&
|
|
278
|
-
|
|
279
|
-
behaviour.applyBehaviour(this, time, index);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
if (this.age >= this.life) {
|
|
284
|
-
this.destroy();
|
|
285
|
-
} else {
|
|
286
|
-
const scale = this.easing(this.age / this.life);
|
|
287
|
-
this.energy = Math.max(1 - scale, 0);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Adds a behaviour to the particle.
|
|
292
|
-
*
|
|
293
|
-
* @param {Behaviour} behaviour - The behaviour to add to the particle
|
|
294
|
-
* @return void
|
|
295
|
-
*/
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
addBehaviour(behaviour) {
|
|
299
|
-
this.behaviours.push(behaviour);
|
|
300
|
-
behaviour.initialize(this);
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Adds multiple behaviours to the particle.
|
|
304
|
-
*
|
|
305
|
-
* @param {array<Behaviour>} behaviours - An array of behaviours to add to the particle
|
|
306
|
-
* @return void
|
|
307
|
-
*/
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
addBehaviours(behaviours) {
|
|
311
|
-
let i = behaviours.length;
|
|
312
|
-
|
|
313
|
-
while (i--) {
|
|
314
|
-
this.addBehaviour(behaviours[i]);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Removes the behaviour from the particle.
|
|
319
|
-
*
|
|
320
|
-
* @param {Behaviour} behaviour - The behaviour to remove from the particle
|
|
321
|
-
* @return void
|
|
322
|
-
*/
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
removeBehaviour(behaviour) {
|
|
326
|
-
const index = this.behaviours.indexOf(behaviour);
|
|
327
|
-
|
|
328
|
-
if (index > -1) {
|
|
329
|
-
this.behaviours.splice(index, 1);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Removes all behaviours from the particle.
|
|
334
|
-
*
|
|
335
|
-
* @return void
|
|
336
|
-
*/
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
removeAllBehaviours() {
|
|
340
|
-
Util.destroyArray(this.behaviours);
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Destroys the particle.
|
|
344
|
-
*
|
|
345
|
-
* @return void
|
|
346
|
-
*/
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
destroy() {
|
|
350
|
-
this.removeAllBehaviours();
|
|
351
|
-
this.energy = 0;
|
|
352
|
-
this.dead = true;
|
|
353
|
-
this.parent = null;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
}
|
|
357
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL1BhcnRpY2xlLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQUdFIiwiREVGQVVMVF9BTFBIQSIsIkRFRkFVTFRfQk9EWSIsIkRFRkFVTFRfREVBRCIsIkRFRkFVTFRfRUFTSU5HIiwiREVGQVVMVF9FTkVSR1kiLCJERUZBVUxUX0xJRkUiLCJERUZBVUxUX01BU1MiLCJERUZBVUxUX1BBUkVOVCIsIkRFRkFVTFRfUkFESVVTIiwiREVGQVVMVF9TQ0FMRSIsIkRFRkFVTFRfU0xFRVAiLCJERUZBVUxUX1VTRV9BTFBIQSIsIkRFRkFVTFRfVVNFX0NPTE9SIiwiVXRpbCIsInVpZCIsIlBJIiwiVmVjdG9yM0QiLCJDT1JFX1RZUEVfUEFSVElDTEUiLCJ0eXBlIiwiUGFydGljbGUiLCJjb25zdHJ1Y3RvciIsInByb3BlcnRpZXMiLCJpZCIsImxpZmUiLCJhZ2UiLCJlbmVyZ3kiLCJkZWFkIiwic2xlZXAiLCJib2R5IiwicGFyZW50IiwibWFzcyIsInJhZGl1cyIsImFscGhhIiwic2NhbGUiLCJ1c2VDb2xvciIsInVzZUFscGhhIiwiZWFzaW5nIiwicG9zaXRpb24iLCJ2ZWxvY2l0eSIsImFjY2VsZXJhdGlvbiIsIm9sZCIsImNsb25lIiwiYmVoYXZpb3VycyIsInRyYW5zZm9ybSIsImNvbG9yIiwiciIsImciLCJiIiwicm90YXRpb24iLCJkaXN0YW5jZVRvQ2FtZXJhIiwic2V0UHJvdG90eXBlQnlPYmoiLCJnZXREaXJlY3Rpb24iLCJNYXRoIiwiYXRhbjIiLCJ4IiwieSIsInJlc2V0Iiwic2V0IiwiY2xlYXIiLCJkZXN0cm95T2JqZWN0IiwicmVtb3ZlQWxsQmVoYXZpb3VycyIsInVwZGF0ZSIsInRpbWUiLCJpbmRleCIsImkiLCJsZW5ndGgiLCJiZWhhdmlvdXIiLCJhcHBseUJlaGF2aW91ciIsImRlc3Ryb3kiLCJtYXgiLCJhZGRCZWhhdmlvdXIiLCJwdXNoIiwiaW5pdGlhbGl6ZSIsImFkZEJlaGF2aW91cnMiLCJyZW1vdmVCZWhh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VUFBVSxDQUFDc0IsQ0FBRCxDQUE1QjtBQUNEO0FBQ0Y7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFVSxFQUFBQSxlQUFlLENBQUNSLFNBQUQsRUFBWTtBQUN6QixVQUFNSCxLQUFLLEdBQUcsS0FBS3JCLFVBQUwsQ0FBZ0JpQyxPQUFoQixDQUF3QlQsU0FBeEIsQ0FBZDs7QUFFQSxRQUFJSCxLQUFLLEdBQUcsQ0FBQyxDQUFiLEVBQWdCO0FBQ2QsV0FBS3JCLFVBQUwsQ0FBZ0JrQyxNQUFoQixDQUF1QmIsS0FBdkIsRUFBOEIsQ0FBOUI7QUFDRDtBQUNGO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0VILEVBQUFBLG1CQUFtQixHQUFHO0FBQ3BCL0MsSUFBQUEsSUFBSSxDQUFDZ0UsWUFBTCxDQUFrQixLQUFLbkMsVUFBdkI7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUNFMEIsRUFBQUEsT0FBTyxHQUFHO0FBQ1IsU0FBS1IsbUJBQUw7QUFDQSxTQUFLbkMsTUFBTCxHQUFjLENBQWQ7QUFDQSxTQUFLQyxJQUFMLEdBQVksSUFBWjtBQUNBLFNBQUtHLE1BQUwsR0FBYyxJQUFkO0FBQ0Q7O0FBeFQyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERFRkFVTFRfQUdFLFxuICBERUZBVUxUX0FMUEhBLFxuICBERUZBVUxUX0JPRFksXG4gIERFRkFVTFRfREVBRCxcbiAgREVGQVVMVF9FQVNJTkcsXG4gIERFRkFVTFRfRU5FUkdZLFxuICBERUZBVUxUX0xJRkUsXG4gIERFRkFVTFRfTUFTUyxcbiAgREVGQVVMVF9QQVJFTlQsXG4gIERFRkFVTFRfUkFESVVTLFxuICBERUZBVUxUX1NDQUxFLFxuICBERUZBVUxUX1NMRUVQLFxuICBERUZBVUxUX1VTRV9BTFBIQSxcbiAgREVGQVVMVF9VU0VfQ09MT1IsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFV0aWwsIHVpZCB9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgUEkgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVmVjdG9yM0QgfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IENPUkVfVFlQRV9QQVJUSUNMRSBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQSBQYXJ0aWNsZSBpcyBhbiBvYmplY3QgdGhhdCBpcyBlbWl0dGVkIGJ5IGFuIGVtaXR0ZXIuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJ0aWNsZSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFydGljbGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wZXJ0aWVzIC0gVGhlIHByb3BlcnRpZXMgdG8gaW5zdGFudGlhdGUgdGhlIHBhcnRpY2xlIHdpdGhcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHByb3BlcnRpZXMubGlmZSAtIFRoZSBwYXJ0aWNsZSdzIGxpZmVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHByb3BlcnRpZXMuYWdlIC0gVGhlIHBhcnRpY2xlJ3MgYWdlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcm9wZXJ0aWVzLmVuZXJneSAtIFRoZSBwYXJ0aWNsZSdzIGVuZXJneSBsb3NzXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJvcGVydGllcy5kZWFkIC0gRGV0ZXJtaW5lcyBpZiB0aGUgcGFydGljbGUgaXMgZGVhZCBvciBub3RcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBwcm9wZXJ0aWVzLnNsZWVwIC0gRGV0ZXJtaW5lcyBpZiB0aGUgcGFydGljbGUgaXMgc2xlZXBpbmcgb3Igbm90XG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcm9wZXJ0aWVzLnRhcmdldCAtIFRoZSBwYXJ0aWNsZSdzIHRhcmdldFxuICAgKiBAcHJvcGVydHkge29iamVjdH0gcHJvcGVydGllcy5ib2R5IC0gVGhlIHBhcnRpY2xlJ3MgYm9keVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydGllcy5tYXNzIC0gVGhlIHBhcnRpY2xlJ3MgbWFzc1xuICAgKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydGllcy5yYWRpdXMgLSBUaGUgcGFydGljbGUncyByYWRpdXNcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHByb3BlcnRpZXMuYWxwaGEgLSBUaGUgcGFydGljbGUncyBhbHBoYVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydGllcy5zY2FsZSAtIFRoZSBwYXJ0aWNsZSdzIHNjYWxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcm9wZXJ0aWVzLnJvdGF0aW9uIC0gVGhlIHBhcnRpY2xlJ3Mgcm90YXRpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBwcm9wZXJ0aWVzLmNvbG9yIC0gVGhlIHBhcnRpY2xlJ3MgY29sb3JcbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gcHJvcGVydGllcy5lYXNpbmcgLSBUaGUgcGFydGljbGUncyBlYXNpbmdcbiAgICogQHByb3BlcnR5IHtWZWN0b3IzRH0gcHJvcGVydGllcy5wb3NpdGlvbiAtIFRoZSBwYXJ0aWNsZSdzIHBvc2l0aW9uXG4gICAqIEBwcm9wZXJ0eSB7VmVjdG9yM0R9IHByb3BlcnRpZXMudmVsb2NpdHkgLSBUaGUgcGFydGljbGUncyB2ZWxvY2l0eVxuICAgKiBAcHJvcGVydHkge1ZlY3RvcjNEfSBwcm9wZXJ0aWVzLmFjY2VsZXJhdGlvbiAtIFRoZSBwYXJ0aWNsZSdzIGFjY2VsZXJhdGlvblxuICAgKiBAcHJvcGVydHkge2FycmF5fSBwcm9wZXJ0aWVzLmJlaGF2aW91cnMgLSBUaGUgcGFydGljbGUncyBiZWhhdmlvdXJzIGFycmF5XG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcm9wZXJ0aWVzLnRyYW5zZm9ybSAtIFRoZSBwYXJ0aWNsZSdzIHRyYW5zZm9ybSBjb2xsZWN0aW9uXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcGVydGllcykge1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwYXJ0aWNsZSdzIHVuaXF1ZSBpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGBwYXJ0aWNsZS0ke3VpZCgpfWA7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgY2xhc3MgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHBhcnRpY2xlJ3MgbGlmZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5saWZlID0gREVGQVVMVF9MSUZFO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwYXJ0aWNsZSdzIGFnZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5hZ2UgPSBERUZBVUxUX0FHRTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyBlbmVyZ3kgbG9zc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5lbmVyZ3kgPSBERUZBVUxUX0VORVJHWTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIGlmIHRoZSBwYXJ0aWNsZSBpcyBkZWFkIG9yIG5vdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kZWFkID0gREVGQVVMVF9ERUFEO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIERldGVybWluZXMgaWYgdGhlIHBhcnRpY2xlIGlzIHNsZWVwaW5nIG9yIG5vdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5zbGVlcCA9IERFRkFVTFRfU0xFRVA7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHBhcnRpY2xlJ3MgYm9keVxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5ib2R5ID0gREVGQVVMVF9CT0RZO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwYXJ0aWNsZSdzIHBhcmVudFxuICAgICAqIEB0eXBlIHs/RW1pdHRlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBhcmVudCA9IERFRkFVTFRfUEFSRU5UO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwYXJ0aWNsZSdzIG1hc3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubWFzcyA9IERFRkFVTFRfTUFTUztcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyByYWRpdXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMucmFkaXVzID0gREVGQVVMVF9SQURJVVM7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHBhcnRpY2xlJ3MgYWxwaGFcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuYWxwaGEgPSBERUZBVUxUX0FMUEhBO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwYXJ0aWNsZSdzIHNjYWxlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnNjYWxlID0gREVGQVVMVF9TQ0FMRTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGNvbG9yIG9yIG5vdFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMudXNlQ29sb3IgPSBERUZBVUxUX1VTRV9DT0xPUjtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGFscGhhIG9yIG5vdFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMudXNlQWxwaGEgPSBERUZBVUxUX1VTRV9BTFBIQTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyBlYXNpbmdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuZWFzaW5nID0gREVGQVVMVF9FQVNJTkc7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHBhcnRpY2xlJ3MgcG9zaXRpb25cbiAgICAgKiBAdHlwZSB7VmVjdG9yM0R9XG4gICAgICovXG4gICAgdGhpcy5wb3NpdGlvbiA9IG5ldyBWZWN0b3IzRCgpO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwYXJ0aWNsZSdzIHZlbG9jaXR5XG4gICAgICogQHR5cGUge1ZlY3RvcjNEfVxuICAgICAqL1xuICAgIHRoaXMudmVsb2NpdHkgPSBuZXcgVmVjdG9yM0QoKTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyBhY2NlbGVyYXRpb25cbiAgICAgKiBAdHlwZSB7VmVjdG9yM0R9XG4gICAgICovXG4gICAgdGhpcy5hY2NlbGVyYXRpb24gPSBuZXcgVmVjdG9yM0QoKTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyBsYXN0IHBvc2l0aW9uLCB2ZWxvY2l0eSBhbmQgYWNjZWxlcmF0aW9uXG4gICAgICogQHR5cGUge1ZlY3RvcjNEfVxuICAgICAqL1xuICAgIHRoaXMub2xkID0ge307XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHBhcnRpY2xlJ3Mgb2xkIHBvc2l0aW9uXG4gICAgICogQHR5cGUge1ZlY3RvcjNEfVxuICAgICAqL1xuICAgIHRoaXMub2xkLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbi5jbG9uZSgpO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwYXJ0aWNsZSdzIG9sZCB2ZWxvY2l0eVxuICAgICAqIEB0eXBlIHtWZWN0b3IzRH1cbiAgICAgKi9cbiAgICB0aGlzLm9sZC52ZWxvY2l0eSA9IHRoaXMudmVsb2NpdHkuY2xvbmUoKTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyBvbGQgYWNjZWxlcmF0aW9uXG4gICAgICogQHR5cGUge1ZlY3RvcjNEfVxuICAgICAqL1xuICAgIHRoaXMub2xkLmFjY2VsZXJhdGlvbiA9IHRoaXMuYWNjZWxlcmF0aW9uLmNsb25lKCk7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHBhcnRpY2xlJ3MgYmVoYXZpb3VycyBhcnJheVxuICAgICAqIEB0eXBlIHthcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLmJlaGF2aW91cnMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyB0cmFuc2Zvcm0gY29sbGVjdGlvblxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7fTtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyBjb2xvciBzdG9yZVxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5jb2xvciA9IHsgcjogMCwgZzogMCwgYjogMCB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBwYXJ0aWNsZSdzIHJvdGF0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJvdGF0aW9uID0gbmV3IFZlY3RvcjNEKCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGUncyBkaXN0YW5jZSB0byB0aGUgY2FtZXJhLCBvbmx5IHNldCBieSB0aGUgR1BVUmVuZGVyZXIgZm9yIGRlcHRoIHNvcnRpbmcgcHVycG9zZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmRpc3RhbmNlVG9DYW1lcmEgPSAwO1xuXG4gICAgLy8gb3ZlcnJpZGUgY29uc3RydWN0b3IgcHJvcHMgd2l0aCBwYXNzZWQgcHJvcGVydGllcy5cbiAgICBVdGlsLnNldFByb3RvdHlwZUJ5T2JqKHRoaXMsIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBhcnRpY2xlJ3MgY3VycmVudCBkaXJlY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldERpcmVjdGlvbigpIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnZlbG9jaXR5LngsIC10aGlzLnZlbG9jaXR5LnkpICogKDE4MCAvIFBJKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHBhcnRpY2xlJ3MgZGVmYXVsdCBwcm9wZXJ0aWVzIGFuZCBjbGVhcidzIGl0cyBwYXJ0aWNsZSdzIHBvc2l0aW9uLFxuICAgKiB2ZWxvY2l0eSwgYWNjZWxlcmF0aW9uLCBjb2xvciBhbmQgcm90YXRpb24uIEFsc28gZGVzdHJveSdzIHRoZSBwYXJ0aWNsZSdzXG4gICAqIHRyYW5zZm9ybSBjb2xsZWN0aW9uICYgcmVtb3ZlcyBhbGwgYmVoYXZpb3Vycy5cbiAgICpcbiAgICogQHJldHVybiB7UGFydGljbGV9XG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLmxpZmUgPSBERUZBVUxUX0xJRkU7XG4gICAgdGhpcy5hZ2UgPSBERUZBVUxUX0FHRTtcbiAgICB0aGlzLmVuZXJneSA9IERFRkFVTFRfRU5FUkdZO1xuICAgIHRoaXMuZGVhZCA9IERFRkFVTFRfREVBRDtcbiAgICB0aGlzLnNsZWVwID0gREVGQVVMVF9TTEVFUDtcbiAgICB0aGlzLmJvZHkgPSBERUZBVUxUX0JPRFk7XG4gICAgdGhpcy5wYXJlbnQgPSBERUZBVUxUX1BBUkVOVDtcbiAgICB0aGlzLm1hc3MgPSBERUZBVUxUX01BU1M7XG4gICAgdGhpcy5yYWRpdXMgPSBERUZBVUxUX1JBRElVUztcbiAgICB0aGlzLmFscGhhID0gREVGQVVMVF9BTFBIQTtcbiAgICB0aGlzLnNjYWxlID0gREVGQVVMVF9TQ0FMRTtcbiAgICB0aGlzLnVzZUNvbG9yID0gREVGQVVMVF9VU0VfQ09MT1I7XG4gICAgdGhpcy51c2VBbHBoYSA9IERFRkFVTFRfVVNFX0FMUEhBO1xuICAgIHRoaXMuZWFzaW5nID0gREVGQVVMVF9FQVNJTkc7XG4gICAgdGhpcy5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XG4gICAgdGhpcy52ZWxvY2l0eS5zZXQoMCwgMCwgMCk7XG4gICAgdGhpcy5hY2NlbGVyYXRpb24uc2V0KDAsIDAsIDApO1xuICAgIHRoaXMub2xkLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcbiAgICB0aGlzLm9sZC52ZWxvY2l0eS5zZXQoMCwgMCwgMCk7XG4gICAgdGhpcy5vbGQuYWNjZWxlcmF0aW9uLnNldCgwLCAwLCAwKTtcbiAgICB0aGlzLmNvbG9yLnIgPSAwO1xuICAgIHRoaXMuY29sb3IuZyA9IDA7XG4gICAgdGhpcy5jb2xvci5iID0gMDtcblxuICAgIHRoaXMucm90YXRpb24uY2xlYXIoKTtcbiAgICBVdGlsLmRlc3Ryb3lPYmplY3QodGhpcy50cmFuc2Zvcm0pO1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcGFydGljbGUncyBwcm9wZXJ0aWVzIGJ5IGFwcGx5aW5nIGVhY2ggYmVoYXZpb3VyIHRvIHRoZSBwYXJ0aWNsZS5cbiAgICogV2lsbCBhbHNvIHVwZGF0ZSB0aGUgcGFydGljbGUncyBlbmVyZ3ksIHVubGVzcyBpdCdzIGFnZSBpcyBncmVhdGVyIHRoYW4gaXQncyBsaWZlXG4gICAqIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBkZXN0cm95ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gSW50ZWdyYXRpb24gdGltZVxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gUGFydGljbGUgaW5kZXhcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICB1cGRhdGUodGltZSwgaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMuc2xlZXApIHtcbiAgICAgIHRoaXMuYWdlICs9IHRpbWU7XG5cbiAgICAgIGxldCBpID0gdGhpcy5iZWhhdmlvdXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBsZXQgYmVoYXZpb3VyID0gdGhpcy5iZWhhdmlvdXJzW2ldO1xuXG4gICAgICAgIC8vYmVoYXZpb3VyICYmIFxuICAgICAgICBiZWhhdmlvdXIuYXBwbHlCZWhhdmlvdXIodGhpcywgdGltZSwgaW5kZXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFnZSA+PSB0aGlzLmxpZmUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZWFzaW5nKHRoaXMuYWdlIC8gdGhpcy5saWZlKTtcblxuICAgICAgdGhpcy5lbmVyZ3kgPSBNYXRoLm1heCgxIC0gc2NhbGUsIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgYmVoYXZpb3VyIHRvIHRoZSBwYXJ0aWNsZS5cbiAgICpcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciAtIFRoZSBiZWhhdmlvdXIgdG8gYWRkIHRvIHRoZSBwYXJ0aWNsZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGFkZEJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuICAgIGJlaGF2aW91ci5pbml0aWFsaXplKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgYmVoYXZpb3VycyB0byB0aGUgcGFydGljbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8QmVoYXZpb3VyPn0gYmVoYXZpb3VycyAtIEFuIGFycmF5IG9mIGJlaGF2aW91cnMgdG8gYWRkIHRvIHRoZSBwYXJ0aWNsZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGFkZEJlaGF2aW91cnMoYmVoYXZpb3Vycykge1xuICAgIGxldCBpID0gYmVoYXZpb3Vycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLmFkZEJlaGF2aW91cihiZWhhdmlvdXJzW2ldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgYmVoYXZpb3VyIGZyb20gdGhlIHBhcnRpY2xlLlxuICAgKlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIC0gVGhlIGJlaGF2aW91ciB0byByZW1vdmUgZnJvbSB0aGUgcGFydGljbGVcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICByZW1vdmVCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmJlaGF2aW91cnMuaW5kZXhPZihiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuYmVoYXZpb3Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBiZWhhdmlvdXJzIGZyb20gdGhlIHBhcnRpY2xlLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIHJlbW92ZUFsbEJlaGF2aW91cnMoKSB7XG4gICAgVXRpbC5kZXN0cm95QXJyYXkodGhpcy5iZWhhdmlvdXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgcGFydGljbGUuXG4gICAqXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUFsbEJlaGF2aW91cnMoKTtcbiAgICB0aGlzLmVuZXJneSA9IDA7XG4gICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIH1cbn1cbiJdfQ==
|
package/build/esm/core/Pool.js
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import PUID from '../utils/PUID';
|
|
2
|
-
import { CORE_TYPE_POOL as type } from './types';
|
|
3
|
-
/**
|
|
4
|
-
* An object pool implementation. Used for pooling objects to avoid unnecessary
|
|
5
|
-
* garbage collection.
|
|
6
|
-
*
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export default class Pool {
|
|
10
|
-
/**
|
|
11
|
-
* Constructs a Pool instance.
|
|
12
|
-
*
|
|
13
|
-
* @return void
|
|
14
|
-
*/
|
|
15
|
-
constructor() {
|
|
16
|
-
/**
|
|
17
|
-
* @desc The class type.
|
|
18
|
-
* @type {string}
|
|
19
|
-
*/
|
|
20
|
-
this.type = type;
|
|
21
|
-
/**
|
|
22
|
-
* @desc Incrementing id that keeps a count of the number of objects created
|
|
23
|
-
* @type {integer}
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
this.cID = 0;
|
|
27
|
-
/**
|
|
28
|
-
* @desc Map of pools in the format of PUID<String>: pool<Array>
|
|
29
|
-
* @type {object}
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
this.list = {};
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Attempts to create a new object either by creating a new instance or calling its
|
|
36
|
-
* clone method.
|
|
37
|
-
*
|
|
38
|
-
* TODO COVERAGE - for the constructorArgs
|
|
39
|
-
* @param {function|object} functionOrObject - The object to instantiate or clone
|
|
40
|
-
* @return {object|undefined}
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
create(functionOrObject, ...constructorArgs) {
|
|
45
|
-
if (!this.canCreateNewObject(functionOrObject)) {
|
|
46
|
-
throw new Error('The pool is unable to create or clone the object supplied');
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
this.cID++;
|
|
50
|
-
|
|
51
|
-
if (this.canInstantiateObject(functionOrObject)) {
|
|
52
|
-
return new functionOrObject(...constructorArgs);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (this.canCloneObject(functionOrObject)) {
|
|
56
|
-
return functionOrObject.clone();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Determines if the object is able to be instantiated or not.
|
|
61
|
-
*
|
|
62
|
-
* @param {object} object - The object to check
|
|
63
|
-
* @return {boolean}
|
|
64
|
-
*/
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
canInstantiateObject(object) {
|
|
68
|
-
return typeof object === 'function';
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Determines if the object is able to be cloned or not.
|
|
72
|
-
*
|
|
73
|
-
* @param {object} object - The object to check
|
|
74
|
-
* @return {boolean}
|
|
75
|
-
*/
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
canCloneObject(object) {
|
|
79
|
-
return object.clone && typeof object.clone === 'function';
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Determines if a new object is able to be created.
|
|
83
|
-
*
|
|
84
|
-
* @param {object} object - The object to check
|
|
85
|
-
* @return {boolean}
|
|
86
|
-
*/
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
canCreateNewObject(object) {
|
|
90
|
-
return this.canInstantiateObject(object) || this.canCloneObject(object) ? true : false;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Gets a count of all objects in the pool.
|
|
94
|
-
*
|
|
95
|
-
* @return {integer}
|
|
96
|
-
*/
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
getCount() {
|
|
100
|
-
var count = 0;
|
|
101
|
-
|
|
102
|
-
for (var id in this.list) count += this.list[id].length;
|
|
103
|
-
|
|
104
|
-
return count++;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Gets an object either by creating a new one or retrieving it from the pool.
|
|
108
|
-
*
|
|
109
|
-
* @param {function|object} obj - The function or object to get
|
|
110
|
-
* @param {array} args - The args to pass to the function on creation
|
|
111
|
-
* @return {object}
|
|
112
|
-
*/
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
get(obj, ...args) {
|
|
116
|
-
var p,
|
|
117
|
-
puid = obj.__puid || PUID.id(obj);
|
|
118
|
-
if (this.list[puid] && this.list[puid].length > 0) p = this.list[puid].pop();else p = this.create(obj, ...args);
|
|
119
|
-
p.__puid = obj.__puid || puid;
|
|
120
|
-
return p;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Pushes an object into the pool.
|
|
124
|
-
*
|
|
125
|
-
* @param {object} obj - The object to expire
|
|
126
|
-
* @return {integer}
|
|
127
|
-
*/
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
expire(obj) {
|
|
131
|
-
return this._getList(obj.__puid).push(obj);
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Destroys all pools.
|
|
135
|
-
*
|
|
136
|
-
* @return void
|
|
137
|
-
*/
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
destroy() {
|
|
141
|
-
for (var id in this.list) {
|
|
142
|
-
this.list[id].length = 0;
|
|
143
|
-
delete this.list[id];
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Gets the pool mapped to the UID.
|
|
148
|
-
*
|
|
149
|
-
* @param {string} uid - The pool uid
|
|
150
|
-
* @return {array}
|
|
151
|
-
*/
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
_getList(uid) {
|
|
155
|
-
uid = uid || 'default';
|
|
156
|
-
if (!this.list[uid]) this.list[uid] = [];
|
|
157
|
-
return this.list[uid];
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL1Bvb2wuanMiXSwibmFtZXMiOlsiUFVJRCIsIkNPUkVfVFlQRV9QT09MIiwidHlwZSIsIlBvb2wiLCJjb25zdHJ1Y3RvciIsImNJRCIsImxpc3QiLCJjcmVhdGUiLCJmdW5jdGlvbk9yT2JqZWN0IiwiY29uc3RydWN0b3JBcmdzIiwiY2FuQ3JlYXRlTmV3T2JqZWN0IiwiRXJyb3IiLCJjYW5JbnN0YW50aWF0ZU9iamVjdCIsImNhbkNsb25lT2JqZWN0IiwiY2xvbmUiLCJvYmplY3QiLCJnZXRDb3VudCIsImNvdW50IiwiaWQiLCJsZW5ndGgiLCJnZXQiLCJvYmoiLCJhcmdzIiwicCIsInB1aWQiLCJfX3B1aWQiLCJwb3AiLCJleHBpcmUiLCJfZ2V0TGlzdCIsInB1c2giLCJkZXN0cm95IiwidWlkIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxJQUFQLE1BQWlCLGVBQWpCO0FBQ0EsU0FBU0MsY0FBYyxJQUFJQyxJQUEzQixRQUF1QyxTQUF2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsZUFBZSxNQUFNQyxJQUFOLENBQVc7QUFDeEI7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNFQyxFQUFBQSxXQUFXLEdBQUc7QUFDWjtBQUNKO0FBQ0E7QUFDQTtBQUNJLFNBQUtGLElBQUwsR0FBWUEsSUFBWjtBQUNBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFNBQUtHLEdBQUwsR0FBVyxDQUFYO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksU0FBS0MsSUFBTCxHQUFZLEVBQVo7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNFQyxFQUFBQSxNQUFNLENBQUNDLGdCQUFELEVBQW1CLEdBQUdDLGVBQXRCLEVBQXVDO0FBQzNDLFFBQUksQ0FBQyxLQUFLQyxrQkFBTCxDQUF3QkYsZ0JBQXhCLENBQUwsRUFBZ0Q7QUFDOUMsWUFBTSxJQUFJRyxLQUFKLENBQ0osMkRBREksQ0FBTjtBQUdEOztB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QUFpQixFQUFqQjtBQUVyQixXQUFPLEtBQUt6QixJQUFMLENBQVV5QixHQUFWLENBQVA7QUFDRDs7QUFySnVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBVSUQgZnJvbSAnLi4vdXRpbHMvUFVJRCc7XG5pbXBvcnQgeyBDT1JFX1RZUEVfUE9PTCBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIEFuIG9iamVjdCBwb29sIGltcGxlbWVudGF0aW9uLiBVc2VkIGZvciBwb29saW5nIG9iamVjdHMgdG8gYXZvaWQgdW5uZWNlc3NhcnlcbiAqIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvb2wge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBvb2wgaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNsYXNzIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIC8qKlxuICAgICAqIEBkZXNjIEluY3JlbWVudGluZyBpZCB0aGF0IGtlZXBzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBvYmplY3RzIGNyZWF0ZWRcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cbiAgICAgKi9cbiAgICB0aGlzLmNJRCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBNYXAgb2YgcG9vbHMgaW4gdGhlIGZvcm1hdCBvZiBQVUlEPFN0cmluZz46IHBvb2w8QXJyYXk+XG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmxpc3QgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGVpdGhlciBieSBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvciBjYWxsaW5nIGl0c1xuICAgKiBjbG9uZSBtZXRob2QuXG4gICAqXG4gICAqIFRPRE8gQ09WRVJBR0UgLSBmb3IgdGhlIGNvbnN0cnVjdG9yQXJnc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufG9iamVjdH0gZnVuY3Rpb25Pck9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW5zdGFudGlhdGUgb3IgY2xvbmVcbiAgICogQHJldHVybiB7b2JqZWN0fHVuZGVmaW5lZH1cbiAgICovXG4gIGNyZWF0ZShmdW5jdGlvbk9yT2JqZWN0LCAuLi5jb25zdHJ1Y3RvckFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuY2FuQ3JlYXRlTmV3T2JqZWN0KGZ1bmN0aW9uT3JPYmplY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgcG9vbCBpcyB1bmFibGUgdG8gY3JlYXRlIG9yIGNsb25lIHRoZSBvYmplY3Qgc3VwcGxpZWQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY0lEKys7XG5cbiAgICBpZiAodGhpcy5jYW5JbnN0YW50aWF0ZU9iamVjdChmdW5jdGlvbk9yT2JqZWN0KSkge1xuICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbk9yT2JqZWN0KC4uLmNvbnN0cnVjdG9yQXJncyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuQ2xvbmVPYmplY3QoZnVuY3Rpb25Pck9iamVjdCkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbk9yT2JqZWN0LmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIG9iamVjdCBpcyBhYmxlIHRvIGJlIGluc3RhbnRpYXRlZCBvciBub3QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBjYW5JbnN0YW50aWF0ZU9iamVjdChvYmplY3QpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBvYmplY3QgaXMgYWJsZSB0byBiZSBjbG9uZWQgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgY2FuQ2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdC5jbG9uZSAmJiB0eXBlb2Ygb2JqZWN0LmNsb25lID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSBuZXcgb2JqZWN0IGlzIGFibGUgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNhbkNyZWF0ZU5ld09iamVjdChvYmplY3QpIHtcbiAgICByZXR1cm4gdGhpcy5jYW5JbnN0YW50aWF0ZU9iamVjdChvYmplY3QpIHx8IHRoaXMuY2FuQ2xvbmVPYmplY3Qob2JqZWN0KVxuICAgICAgPyB0cnVlXG4gICAgICA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBjb3VudCBvZiBhbGwgb2JqZWN0cyBpbiB0aGUgcG9vbC5cbiAgICpcbiAgICogQHJldHVybiB7aW50ZWdlcn1cbiAgICovXG4gIGdldENvdW50KCkge1xuICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICBmb3IgKHZhciBpZCBpbiB0aGlzLmxpc3QpIGNvdW50ICs9IHRoaXMubGlzdFtpZF0ubGVuZ3RoO1xuXG4gICAgcmV0dXJuIGNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYmplY3QgZWl0aGVyIGJ5IGNyZWF0aW5nIGEgbmV3IG9uZSBvciByZXRyaWV2aW5nIGl0IGZyb20gdGhlIHBvb2wuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb258b2JqZWN0fSBvYmogLSBUaGUgZnVuY3Rpb24gb3Igb2JqZWN0IHRvIGdldFxuICAgKiBAcGFyYW0ge2FycmF5fSBhcmdzIC0gVGhlIGFyZ3MgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gb24gY3JlYXRpb25cbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgZ2V0KG9iaiwgLi4uYXJncykge1xuICAgIHZhciBwLFxuICAgICAgcHVpZCA9IG9iai5fX3B1aWQgfHwgUFVJRC5pZChvYmopO1xuXG4gICAgaWYgKHRoaXMubGlzdFtwdWlkXSAmJiB0aGlzLmxpc3RbcHVpZF0ubGVuZ3RoID4gMClcbiAgICAgIHAgPSB0aGlzLmxpc3RbcHVpZF0ucG9wKCk7XG4gICAgZWxzZSBwID0gdGhpcy5jcmVhdGUob2JqLCAuLi5hcmdzKTtcblxuICAgIHAuX19wdWlkID0gb2JqLl9fcHVpZCB8fCBwdWlkO1xuXG4gICAgcmV0dXJuIHA7XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIGFuIG9iamVjdCBpbnRvIHRoZSBwb29sLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gVGhlIG9iamVjdCB0byBleHBpcmVcbiAgICogQHJldHVybiB7aW50ZWdlcn1cbiAgICovXG4gIGV4cGlyZShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0TGlzdChvYmouX19wdWlkKS5wdXNoKG9iaik7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgYWxsIHBvb2xzLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgZm9yICh2YXIgaWQgaW4gdGhpcy5saXN0KSB7XG4gICAgICB0aGlzLmxpc3RbaWRdLmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5saXN0W2lkXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcG9vbCBtYXBwZWQgdG8gdGhlIFVJRC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpZCAtIFRoZSBwb29sIHVpZFxuICAgKiBAcmV0dXJuIHthcnJheX1cbiAgICovXG4gIF9nZXRMaXN0KHVpZCkge1xuICAgIHVpZCA9IHVpZCB8fCAnZGVmYXVsdCc7XG4gICAgaWYgKCF0aGlzLmxpc3RbdWlkXSkgdGhpcy5saXN0W3VpZF0gPSBbXTtcblxuICAgIHJldHVybiB0aGlzLmxpc3RbdWlkXTtcbiAgfVxufVxuIl19
|