@tsparticles/engine 4.0.0-alpha.25 → 4.0.0-alpha.27
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/164.min.js +1 -0
- package/README.md +3 -3
- package/browser/Core/Canvas.js +7 -4
- package/browser/Core/Engine.js +6 -16
- package/browser/Core/Particle.js +10 -35
- package/browser/Core/Particles.js +0 -23
- package/browser/Core/Utils/Constants.js +1 -1
- package/browser/Core/Utils/Ranges.js +2 -2
- package/browser/Core/Utils/Vectors.js +10 -7
- package/browser/Options/Classes/ColorAnimation.js +11 -1
- package/browser/Options/Classes/HslAnimation.js +4 -3
- package/browser/Options/Classes/Options.js +38 -1
- package/browser/Options/Classes/Particles/Effect/Effect.js +0 -5
- package/browser/Options/Classes/Particles/Fill.js +28 -0
- package/browser/Options/Classes/Particles/Move/Move.js +0 -4
- package/browser/Options/Classes/Particles/ParticlesOptions.js +12 -6
- package/browser/Options/Classes/Particles/Shape/Shape.js +0 -5
- package/browser/Utils/CanvasUtils.js +33 -36
- package/browser/Utils/ColorUtils.js +22 -19
- package/browser/Utils/MathUtils.js +8 -1
- package/browser/Utils/Utils.js +93 -24
- package/browser/exports.js +1 -1
- package/cjs/Core/Canvas.js +7 -4
- package/cjs/Core/Engine.js +6 -16
- package/cjs/Core/Particle.js +10 -35
- package/cjs/Core/Particles.js +0 -23
- package/cjs/Core/Utils/Constants.js +1 -1
- package/cjs/Core/Utils/Ranges.js +2 -2
- package/cjs/Core/Utils/Vectors.js +10 -7
- package/cjs/Options/Classes/ColorAnimation.js +11 -1
- package/cjs/Options/Classes/HslAnimation.js +4 -3
- package/cjs/Options/Classes/Options.js +38 -1
- package/cjs/Options/Classes/Particles/Effect/Effect.js +0 -5
- package/cjs/Options/Classes/Particles/Fill.js +28 -0
- package/cjs/Options/Classes/Particles/Move/Move.js +0 -4
- package/cjs/Options/Classes/Particles/ParticlesOptions.js +12 -6
- package/cjs/Options/Classes/Particles/Shape/Shape.js +0 -5
- package/cjs/Utils/CanvasUtils.js +33 -36
- package/cjs/Utils/ColorUtils.js +22 -19
- package/cjs/Utils/MathUtils.js +8 -1
- package/cjs/Utils/Utils.js +93 -24
- package/cjs/exports.js +1 -1
- package/dist_browser_Core_Container_js.js +4 -4
- package/esm/Core/Canvas.js +7 -4
- package/esm/Core/Engine.js +6 -16
- package/esm/Core/Particle.js +10 -35
- package/esm/Core/Particles.js +0 -23
- package/esm/Core/Utils/Constants.js +1 -1
- package/esm/Core/Utils/Ranges.js +2 -2
- package/esm/Core/Utils/Vectors.js +10 -7
- package/esm/Options/Classes/ColorAnimation.js +11 -1
- package/esm/Options/Classes/HslAnimation.js +4 -3
- package/esm/Options/Classes/Options.js +38 -1
- package/esm/Options/Classes/Particles/Effect/Effect.js +0 -5
- package/esm/Options/Classes/Particles/Fill.js +28 -0
- package/esm/Options/Classes/Particles/Move/Move.js +0 -4
- package/esm/Options/Classes/Particles/ParticlesOptions.js +12 -6
- package/esm/Options/Classes/Particles/Shape/Shape.js +0 -5
- package/esm/Utils/CanvasUtils.js +33 -36
- package/esm/Utils/ColorUtils.js +22 -19
- package/esm/Utils/MathUtils.js +8 -1
- package/esm/Utils/Utils.js +93 -24
- package/esm/exports.js +1 -1
- package/package.json +1 -1
- package/report.html +1 -1
- package/scripts/install.js +4 -20
- package/tsparticles.engine.js +34 -34
- package/tsparticles.engine.min.js +2 -2
- package/types/Core/Engine.d.ts +5 -9
- package/types/Core/Interfaces/IPalette.d.ts +7 -0
- package/types/Core/Interfaces/IParticleOpacityData.d.ts +1 -0
- package/types/Core/Interfaces/IParticleValueAnimation.d.ts +3 -3
- package/types/Core/Interfaces/IShapeValues.d.ts +0 -1
- package/types/Core/Particle.d.ts +3 -7
- package/types/Core/Particles.d.ts +0 -5
- package/types/Core/Utils/Constants.d.ts +1 -1
- package/types/Core/Utils/Vectors.d.ts +6 -6
- package/types/Options/Classes/ColorAnimation.d.ts +3 -1
- package/types/Options/Classes/Options.d.ts +2 -0
- package/types/Options/Classes/Particles/Effect/Effect.d.ts +0 -1
- package/types/Options/Classes/Particles/Fill.d.ts +12 -0
- package/types/Options/Classes/Particles/Move/Move.d.ts +0 -2
- package/types/Options/Classes/Particles/ParticlesOptions.d.ts +2 -2
- package/types/Options/Classes/Particles/Shape/Shape.d.ts +0 -1
- package/types/Options/Interfaces/IColorAnimation.d.ts +2 -0
- package/types/Options/Interfaces/IOptions.d.ts +1 -0
- package/types/Options/Interfaces/Particles/Effect/IEffect.d.ts +0 -1
- package/types/Options/Interfaces/Particles/IFill.d.ts +9 -0
- package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +2 -2
- package/types/Options/Interfaces/Particles/IStroke.d.ts +2 -2
- package/types/Options/Interfaces/Particles/Move/IMove.d.ts +0 -2
- package/types/Options/Interfaces/Particles/Shape/IShape.d.ts +0 -1
- package/types/Types/EngineInitializers.d.ts +0 -6
- package/types/Utils/CanvasUtils.d.ts +6 -7
- package/types/Utils/ColorUtils.d.ts +1 -2
- package/types/Utils/MathUtils.d.ts +2 -0
- package/types/Utils/Utils.d.ts +7 -0
- package/types/export-types.d.ts +2 -4
- package/types/exports.d.ts +1 -1
- package/umd/Core/Canvas.js +6 -3
- package/umd/Core/Engine.js +6 -16
- package/umd/Core/Particle.js +11 -36
- package/umd/Core/Particles.js +0 -23
- package/umd/Core/Utils/Constants.js +2 -2
- package/umd/Core/Utils/Ranges.js +1 -1
- package/umd/Core/Utils/Vectors.js +10 -7
- package/umd/Options/Classes/ColorAnimation.js +11 -1
- package/umd/Options/Classes/HslAnimation.js +5 -4
- package/umd/Options/Classes/Options.js +38 -1
- package/umd/Options/Classes/Particles/Effect/Effect.js +0 -5
- package/umd/Options/Classes/Particles/Fill.js +42 -0
- package/umd/Options/Classes/Particles/Move/Move.js +1 -5
- package/umd/Options/Classes/Particles/ParticlesOptions.js +13 -7
- package/umd/Options/Classes/Particles/Shape/Shape.js +0 -5
- package/umd/Utils/CanvasUtils.js +33 -36
- package/umd/Utils/ColorUtils.js +21 -18
- package/umd/Utils/MathUtils.js +10 -1
- package/umd/Utils/Utils.js +94 -24
- package/umd/exports.js +2 -2
- package/152.min.js +0 -1
- package/browser/Options/Classes/Particles/Move/MoveAttract.js +0 -36
- package/cjs/Options/Classes/Particles/Move/MoveAttract.js +0 -36
- package/esm/Core/Interfaces/IMovePathGenerator.js +0 -1
- package/esm/Core/Interfaces/IParticleMover.js +0 -1
- package/esm/Options/Classes/Particles/Move/MoveAttract.js +0 -36
- package/esm/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -1
- package/types/Core/Interfaces/IMovePathGenerator.d.ts +0 -9
- package/types/Core/Interfaces/IParticleMover.d.ts +0 -7
- package/types/Options/Classes/Particles/Move/MoveAttract.d.ts +0 -12
- package/types/Options/Interfaces/Particles/Move/IMoveAttract.d.ts +0 -7
- package/umd/Options/Classes/Particles/Move/MoveAttract.js +0 -50
- package/umd/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -12
- /package/browser/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
- /package/browser/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
- /package/{browser/Options/Interfaces/Particles/Move/IMoveAttract.js → cjs/Core/Interfaces/IPalette.js} +0 -0
- /package/cjs/{Core/Interfaces/IMovePathGenerator.js → Options/Interfaces/Particles/IFill.js} +0 -0
- /package/{cjs/Core/Interfaces/IParticleMover.js → esm/Core/Interfaces/IPalette.js} +0 -0
- /package/{cjs/Options/Interfaces/Particles/Move/IMoveAttract.js → esm/Options/Interfaces/Particles/IFill.js} +0 -0
- /package/umd/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
- /package/umd/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
package/cjs/Core/Engine.js
CHANGED
|
@@ -57,13 +57,10 @@ export class Engine {
|
|
|
57
57
|
effectDrawers = new Map();
|
|
58
58
|
initializers = {
|
|
59
59
|
effects: new Map(),
|
|
60
|
-
movers: new Map(),
|
|
61
|
-
pathGenerators: new Map(),
|
|
62
60
|
shapes: new Map(),
|
|
63
61
|
updaters: new Map(),
|
|
64
62
|
};
|
|
65
|
-
|
|
66
|
-
pathGenerators = new Map();
|
|
63
|
+
palettes = new Map();
|
|
67
64
|
plugins = [];
|
|
68
65
|
presets = new Map();
|
|
69
66
|
shapeDrawers = new Map();
|
|
@@ -87,7 +84,7 @@ export class Engine {
|
|
|
87
84
|
return this._domArray;
|
|
88
85
|
}
|
|
89
86
|
get version() {
|
|
90
|
-
return "4.0.0-alpha.
|
|
87
|
+
return "4.0.0-alpha.27";
|
|
91
88
|
}
|
|
92
89
|
addColorManager(name, manager) {
|
|
93
90
|
this.colorManagers.set(name, manager);
|
|
@@ -109,15 +106,12 @@ export class Engine {
|
|
|
109
106
|
addEventListener(type, listener) {
|
|
110
107
|
this._eventDispatcher.addEventListener(type, listener);
|
|
111
108
|
}
|
|
112
|
-
|
|
113
|
-
this.
|
|
109
|
+
addPalette(name, palette) {
|
|
110
|
+
this.palettes.set(name, palette);
|
|
114
111
|
}
|
|
115
112
|
addParticleUpdater(name, updaterInitializer) {
|
|
116
113
|
this.initializers.updaters.set(name, updaterInitializer);
|
|
117
114
|
}
|
|
118
|
-
addPathGenerator(name, generator) {
|
|
119
|
-
this.initializers.pathGenerators.set(name, generator);
|
|
120
|
-
}
|
|
121
115
|
addPlugin(plugin) {
|
|
122
116
|
if (this.getPlugin(plugin.id)) {
|
|
123
117
|
return;
|
|
@@ -143,7 +137,6 @@ export class Engine {
|
|
|
143
137
|
}
|
|
144
138
|
clearPlugins(container) {
|
|
145
139
|
this.effectDrawers.delete(container);
|
|
146
|
-
this.movers.delete(container);
|
|
147
140
|
this.shapeDrawers.delete(container);
|
|
148
141
|
this.updaters.delete(container);
|
|
149
142
|
}
|
|
@@ -156,11 +149,8 @@ export class Engine {
|
|
|
156
149
|
getEffectDrawers(container, force = false) {
|
|
157
150
|
return getItemMapFromInitializer(container, this.effectDrawers, this.initializers.effects, force);
|
|
158
151
|
}
|
|
159
|
-
|
|
160
|
-
return
|
|
161
|
-
}
|
|
162
|
-
getPathGenerators(container, force = false) {
|
|
163
|
-
return getItemMapFromInitializer(container, this.pathGenerators, this.initializers.pathGenerators, force);
|
|
152
|
+
getPalette(name) {
|
|
153
|
+
return this.palettes.get(name);
|
|
164
154
|
}
|
|
165
155
|
getPlugin(plugin) {
|
|
166
156
|
return this.plugins.find(t => t.id === plugin);
|
package/cjs/Core/Particle.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Vector, Vector3d } from "./Utils/Vectors.js";
|
|
2
2
|
import { alterHsl, getHslFromAnimation } from "../Utils/ColorUtils.js";
|
|
3
3
|
import { calcExactPositionOrRandomFromSize, clamp, degToRad, getParticleBaseVelocity, getParticleDirectionAngle, getRandom, getRangeValue, randomInRangeValue, setRangeValue, } from "../Utils/MathUtils.js";
|
|
4
|
-
import { decayOffset, defaultAngle, defaultOpacity, defaultRetryCount, defaultTransform, double, doublePI, half, identity, millisecondsToSeconds, minZ, randomColorValue, squareExp, triple, tryCountIncrement, zIndexFactorOffset, } from "./Utils/Constants.js";
|
|
5
4
|
import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
|
|
5
|
+
import { defaultAngle, defaultOpacity, defaultRetryCount, defaultTransform, double, doublePI, half, identity, minZ, randomColorValue, squareExp, triple, tryCountIncrement, zIndexFactorOffset, } from "./Utils/Constants.js";
|
|
6
6
|
import { EventType } from "../Enums/Types/EventType.js";
|
|
7
7
|
import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
|
|
8
8
|
import { OutMode } from "../Enums/Modes/OutMode.js";
|
|
@@ -12,14 +12,12 @@ function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
|
|
|
12
12
|
const effectData = effectOptions.options[effect];
|
|
13
13
|
return deepExtend({
|
|
14
14
|
close: effectOptions.close,
|
|
15
|
-
fill: effectOptions.fill,
|
|
16
15
|
}, itemFromSingleOrMultiple(effectData, id, reduceDuplicates));
|
|
17
16
|
}
|
|
18
17
|
function loadShapeData(shape, shapeOptions, id, reduceDuplicates) {
|
|
19
18
|
const shapeData = shapeOptions.options[shape];
|
|
20
19
|
return deepExtend({
|
|
21
20
|
close: shapeOptions.close,
|
|
22
|
-
fill: shapeOptions.fill,
|
|
23
21
|
}, itemFromSingleOrMultiple(shapeData, id, reduceDuplicates));
|
|
24
22
|
}
|
|
25
23
|
function fixOutMode(data) {
|
|
@@ -38,13 +36,14 @@ export class Particle {
|
|
|
38
36
|
container;
|
|
39
37
|
backColor;
|
|
40
38
|
bubble;
|
|
41
|
-
color;
|
|
42
39
|
destroyed;
|
|
43
40
|
direction;
|
|
44
41
|
effect;
|
|
45
42
|
effectClose;
|
|
46
43
|
effectData;
|
|
47
|
-
|
|
44
|
+
fillColor;
|
|
45
|
+
fillEnabled;
|
|
46
|
+
fillOpacity;
|
|
48
47
|
group;
|
|
49
48
|
id;
|
|
50
49
|
ignoresResizeRatio;
|
|
@@ -54,13 +53,10 @@ export class Particle {
|
|
|
54
53
|
lastPathTime;
|
|
55
54
|
misplaced;
|
|
56
55
|
moveCenter;
|
|
57
|
-
moveDecay;
|
|
58
56
|
offset;
|
|
59
57
|
opacity;
|
|
60
58
|
options;
|
|
61
59
|
outType;
|
|
62
|
-
pathDelay;
|
|
63
|
-
pathGenerator;
|
|
64
60
|
pathRotation;
|
|
65
61
|
position;
|
|
66
62
|
randomIndexData;
|
|
@@ -70,7 +66,6 @@ export class Particle {
|
|
|
70
66
|
shape;
|
|
71
67
|
shapeClose;
|
|
72
68
|
shapeData;
|
|
73
|
-
shapeFill;
|
|
74
69
|
sides;
|
|
75
70
|
size;
|
|
76
71
|
slow;
|
|
@@ -82,6 +77,7 @@ export class Particle {
|
|
|
82
77
|
velocity;
|
|
83
78
|
zIndexFactor;
|
|
84
79
|
_cachedOpacityData = {
|
|
80
|
+
fillOpacity: defaultOpacity,
|
|
85
81
|
opacity: defaultOpacity,
|
|
86
82
|
strokeOpacity: defaultOpacity,
|
|
87
83
|
};
|
|
@@ -105,7 +101,7 @@ export class Particle {
|
|
|
105
101
|
this.destroyed = true;
|
|
106
102
|
this.bubble.inRange = false;
|
|
107
103
|
this.slow.inRange = false;
|
|
108
|
-
const container = this.container,
|
|
104
|
+
const container = this.container, shapeDrawer = this.shape ? container.particles.shapeDrawers.get(this.shape) : undefined;
|
|
109
105
|
shapeDrawer?.particleDestroy?.(this);
|
|
110
106
|
for (const plugin of container.particleDestroyedPlugins) {
|
|
111
107
|
plugin.particleDestroyed?.(this, override);
|
|
@@ -113,7 +109,6 @@ export class Particle {
|
|
|
113
109
|
for (const updater of container.particles.updaters) {
|
|
114
110
|
updater.particleDestroyed?.(this, override);
|
|
115
111
|
}
|
|
116
|
-
pathGenerator?.reset(this);
|
|
117
112
|
this._engine.dispatchEvent(EventType.particleDestroyed, {
|
|
118
113
|
container: this.container,
|
|
119
114
|
data: {
|
|
@@ -130,15 +125,16 @@ export class Particle {
|
|
|
130
125
|
return this.rotation + (this.pathRotation ? this.velocity.angle : defaultAngle);
|
|
131
126
|
}
|
|
132
127
|
getFillColor() {
|
|
133
|
-
return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.
|
|
128
|
+
return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.fillColor));
|
|
134
129
|
}
|
|
135
130
|
getMass() {
|
|
136
131
|
return this.getRadius() ** squareExp * Math.PI * half;
|
|
137
132
|
}
|
|
138
133
|
getOpacity() {
|
|
139
|
-
const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, opacity = this.bubble.opacity ?? getRangeValue(this.opacity?.value ?? defaultOpacity), strokeOpacity = this.strokeOpacity ??
|
|
134
|
+
const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, opacity = this.bubble.opacity ?? getRangeValue(this.opacity?.value ?? defaultOpacity), fillOpacity = this.fillOpacity ?? defaultOpacity, strokeOpacity = this.strokeOpacity ?? defaultOpacity;
|
|
135
|
+
this._cachedOpacityData.fillOpacity = opacity * fillOpacity * zOpacityFactor;
|
|
140
136
|
this._cachedOpacityData.opacity = opacity * zOpacityFactor;
|
|
141
|
-
this._cachedOpacityData.strokeOpacity = strokeOpacity * zOpacityFactor;
|
|
137
|
+
this._cachedOpacityData.strokeOpacity = opacity * strokeOpacity * zOpacityFactor;
|
|
142
138
|
return this._cachedOpacityData;
|
|
143
139
|
}
|
|
144
140
|
getPosition() {
|
|
@@ -176,9 +172,7 @@ export class Particle {
|
|
|
176
172
|
this.id = id;
|
|
177
173
|
this.group = group;
|
|
178
174
|
this.effectClose = true;
|
|
179
|
-
this.effectFill = true;
|
|
180
175
|
this.shapeClose = true;
|
|
181
|
-
this.shapeFill = true;
|
|
182
176
|
this.pathRotation = false;
|
|
183
177
|
this.lastPathTime = 0;
|
|
184
178
|
this.destroyed = false;
|
|
@@ -230,24 +224,9 @@ export class Particle {
|
|
|
230
224
|
if (shapeData) {
|
|
231
225
|
particlesOptions.load(shapeData.particles);
|
|
232
226
|
}
|
|
233
|
-
this.effectFill = effectData?.fill ?? particlesOptions.effect.fill;
|
|
234
227
|
this.effectClose = effectData?.close ?? particlesOptions.effect.close;
|
|
235
|
-
this.shapeFill = shapeData?.fill ?? particlesOptions.shape.fill;
|
|
236
228
|
this.shapeClose = shapeData?.close ?? particlesOptions.shape.close;
|
|
237
229
|
this.options = particlesOptions;
|
|
238
|
-
const pathOptions = this.options.move.path;
|
|
239
|
-
this.pathDelay = getRangeValue(pathOptions.delay.value) * millisecondsToSeconds;
|
|
240
|
-
if (pathOptions.generator) {
|
|
241
|
-
let pathGenerator = this.container.particles.pathGenerators.get(pathOptions.generator);
|
|
242
|
-
if (!pathGenerator) {
|
|
243
|
-
pathGenerator = this.container.particles.availablePathGenerators.get(pathOptions.generator);
|
|
244
|
-
if (pathGenerator) {
|
|
245
|
-
this.container.particles.pathGenerators.set(pathOptions.generator, pathGenerator);
|
|
246
|
-
pathGenerator.init();
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
this.pathGenerator = pathGenerator;
|
|
250
|
-
}
|
|
251
230
|
container.retina.initParticle(this);
|
|
252
231
|
this.size = initParticleNumericAnimationValue(this.options.size, pxRatio);
|
|
253
232
|
this.bubble = {
|
|
@@ -260,7 +239,6 @@ export class Particle {
|
|
|
260
239
|
this._initPosition(position);
|
|
261
240
|
this.initialVelocity = this._calculateVelocity();
|
|
262
241
|
this.velocity = this.initialVelocity.copy();
|
|
263
|
-
this.moveDecay = decayOffset - getRangeValue(this.options.move.decay);
|
|
264
242
|
const particles = container.particles;
|
|
265
243
|
particles.setLastZIndex(this.position.z);
|
|
266
244
|
this.zIndexFactor = this.position.z / container.zLayers;
|
|
@@ -286,9 +264,6 @@ export class Particle {
|
|
|
286
264
|
for (const updater of particles.updaters) {
|
|
287
265
|
updater.init(this);
|
|
288
266
|
}
|
|
289
|
-
for (const mover of particles.movers) {
|
|
290
|
-
mover.init(this);
|
|
291
|
-
}
|
|
292
267
|
effectDrawer?.particleInit?.(container, this);
|
|
293
268
|
shapeDrawer?.particleInit?.(container, this);
|
|
294
269
|
for (const plugin of container.particleCreatedPlugins) {
|
package/cjs/Core/Particles.js
CHANGED
|
@@ -6,12 +6,9 @@ import { SpatialHashGrid } from "./Utils/SpatialHashGrid.js";
|
|
|
6
6
|
import { getLogger } from "../Utils/LogUtils.js";
|
|
7
7
|
import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
|
|
8
8
|
export class Particles {
|
|
9
|
-
availablePathGenerators;
|
|
10
9
|
checkParticlePositionPlugins;
|
|
11
10
|
effectDrawers;
|
|
12
11
|
grid;
|
|
13
|
-
movers;
|
|
14
|
-
pathGenerators;
|
|
15
12
|
shapeDrawers;
|
|
16
13
|
updaters;
|
|
17
14
|
_array;
|
|
@@ -45,9 +42,6 @@ export class Particles {
|
|
|
45
42
|
this._maxZIndex = 0;
|
|
46
43
|
this.grid = new SpatialHashGrid(spatialHashGridCellSize);
|
|
47
44
|
this.effectDrawers = new Map();
|
|
48
|
-
this.movers = [];
|
|
49
|
-
this.availablePathGenerators = new Map();
|
|
50
|
-
this.pathGenerators = new Map();
|
|
51
45
|
this.shapeDrawers = new Map();
|
|
52
46
|
this.updaters = [];
|
|
53
47
|
this.checkParticlePositionPlugins = [];
|
|
@@ -123,9 +117,6 @@ export class Particles {
|
|
|
123
117
|
this._pool.length = 0;
|
|
124
118
|
this._zArray = [];
|
|
125
119
|
this.effectDrawers = new Map();
|
|
126
|
-
this.movers = [];
|
|
127
|
-
this.availablePathGenerators = new Map();
|
|
128
|
-
this.pathGenerators = new Map();
|
|
129
120
|
this.shapeDrawers = new Map();
|
|
130
121
|
this.updaters = [];
|
|
131
122
|
this.checkParticlePositionPlugins = [];
|
|
@@ -217,14 +208,8 @@ export class Particles {
|
|
|
217
208
|
async initPlugins() {
|
|
218
209
|
const container = this._container;
|
|
219
210
|
this.effectDrawers = await this._engine.getEffectDrawers(container, true);
|
|
220
|
-
this.movers = await this._engine.getMovers(container, true);
|
|
221
|
-
this.availablePathGenerators = await this._engine.getPathGenerators(container, true);
|
|
222
|
-
this.pathGenerators = new Map();
|
|
223
211
|
this.shapeDrawers = await this._engine.getShapeDrawers(container, true);
|
|
224
212
|
this.updaters = await this._engine.getUpdaters(container, true);
|
|
225
|
-
for (const pathGenerator of this.pathGenerators.values()) {
|
|
226
|
-
pathGenerator.init();
|
|
227
|
-
}
|
|
228
213
|
}
|
|
229
214
|
push(nb, position, overrideOptions, group) {
|
|
230
215
|
for (let i = 0; i < nb; i++) {
|
|
@@ -281,9 +266,6 @@ export class Particles {
|
|
|
281
266
|
update(delta) {
|
|
282
267
|
const particlesToDelete = new Set();
|
|
283
268
|
this.grid.clear();
|
|
284
|
-
for (const pathGenerator of this.pathGenerators.values()) {
|
|
285
|
-
pathGenerator.update();
|
|
286
|
-
}
|
|
287
269
|
for (const plugin of this._updatePlugins) {
|
|
288
270
|
plugin.update?.(delta);
|
|
289
271
|
}
|
|
@@ -305,11 +287,6 @@ export class Particles {
|
|
|
305
287
|
}
|
|
306
288
|
plugin.particleUpdate?.(particle, delta);
|
|
307
289
|
}
|
|
308
|
-
for (const mover of this.movers) {
|
|
309
|
-
if (mover.isEnabled(particle)) {
|
|
310
|
-
mover.move(particle, delta);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
290
|
if (particle.destroyed) {
|
|
314
291
|
particlesToDelete.add(particle);
|
|
315
292
|
continue;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const generatedAttribute = "generated", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
|
|
1
|
+
export const generatedAttribute = "generated", defaultCompositeValue = "source-over", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
|
|
2
2
|
x: 0,
|
|
3
3
|
y: 0,
|
|
4
4
|
z: 0,
|
package/cjs/Core/Utils/Ranges.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RangeType } from "../../Enums/RangeType.js";
|
|
2
|
-
import {
|
|
2
|
+
import { checkDistance } from "../../Utils/MathUtils.js";
|
|
3
3
|
import { squareExp } from "./Constants.js";
|
|
4
4
|
export class BaseRange {
|
|
5
5
|
position;
|
|
@@ -19,7 +19,7 @@ export class Circle extends BaseRange {
|
|
|
19
19
|
this.radius = radius;
|
|
20
20
|
}
|
|
21
21
|
contains(point) {
|
|
22
|
-
return
|
|
22
|
+
return checkDistance(point, this.position, this.radius);
|
|
23
23
|
}
|
|
24
24
|
intersects(range) {
|
|
25
25
|
const pos1 = this.position, pos2 = range.position, distPos = { x: Math.abs(pos2.x - pos1.x), y: Math.abs(pos2.y - pos1.y) }, r = this.radius;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { inverseFactorNumerator, none, originPoint, squareExp } from "./Constants.js";
|
|
2
|
+
function getZ(source) {
|
|
3
|
+
return "z" in source ? source.z : originPoint.z;
|
|
4
|
+
}
|
|
2
5
|
export class Vector3d {
|
|
3
6
|
x;
|
|
4
7
|
y;
|
|
@@ -24,21 +27,21 @@ export class Vector3d {
|
|
|
24
27
|
this._updateFromAngle(this.angle, length);
|
|
25
28
|
}
|
|
26
29
|
static clone(source) {
|
|
27
|
-
return Vector3d.create(source.x, source.y, source
|
|
30
|
+
return Vector3d.create(source.x, source.y, getZ(source));
|
|
28
31
|
}
|
|
29
32
|
static create(x, y, z) {
|
|
30
33
|
if (typeof x === "number") {
|
|
31
34
|
return new Vector3d(x, y ?? originPoint.y, z ?? originPoint.z);
|
|
32
35
|
}
|
|
33
|
-
return new Vector3d(x.x, x.y,
|
|
36
|
+
return new Vector3d(x.x, x.y, getZ(x));
|
|
34
37
|
}
|
|
35
38
|
add(v) {
|
|
36
|
-
return Vector3d.create(this.x + v.x, this.y + v.y, this.z + v
|
|
39
|
+
return Vector3d.create(this.x + v.x, this.y + v.y, this.z + getZ(v));
|
|
37
40
|
}
|
|
38
41
|
addTo(v) {
|
|
39
42
|
this.x += v.x;
|
|
40
43
|
this.y += v.y;
|
|
41
|
-
this.z += v
|
|
44
|
+
this.z += getZ(v);
|
|
42
45
|
}
|
|
43
46
|
copy() {
|
|
44
47
|
return Vector3d.clone(this);
|
|
@@ -74,15 +77,15 @@ export class Vector3d {
|
|
|
74
77
|
setTo(c) {
|
|
75
78
|
this.x = c.x;
|
|
76
79
|
this.y = c.y;
|
|
77
|
-
this.z =
|
|
80
|
+
this.z = getZ(c);
|
|
78
81
|
}
|
|
79
82
|
sub(v) {
|
|
80
|
-
return Vector3d.create(this.x - v.x, this.y - v.y, this.z - v
|
|
83
|
+
return Vector3d.create(this.x - v.x, this.y - v.y, this.z - getZ(v));
|
|
81
84
|
}
|
|
82
85
|
subFrom(v) {
|
|
83
86
|
this.x -= v.x;
|
|
84
87
|
this.y -= v.y;
|
|
85
|
-
this.z -= v
|
|
88
|
+
this.z -= getZ(v);
|
|
86
89
|
}
|
|
87
90
|
_updateFromAngle(angle, length) {
|
|
88
91
|
this.x = Math.cos(angle) * length;
|
|
@@ -2,9 +2,13 @@ import { AnimationOptions } from "./AnimationOptions.js";
|
|
|
2
2
|
import { isNull } from "../../Utils/TypeUtils.js";
|
|
3
3
|
import { setRangeValue } from "../../Utils/MathUtils.js";
|
|
4
4
|
export class ColorAnimation extends AnimationOptions {
|
|
5
|
+
max;
|
|
6
|
+
min;
|
|
5
7
|
offset;
|
|
6
|
-
constructor() {
|
|
8
|
+
constructor(min, max) {
|
|
7
9
|
super();
|
|
10
|
+
this.min = min;
|
|
11
|
+
this.max = max;
|
|
8
12
|
this.offset = 0;
|
|
9
13
|
this.sync = true;
|
|
10
14
|
}
|
|
@@ -13,6 +17,12 @@ export class ColorAnimation extends AnimationOptions {
|
|
|
13
17
|
if (isNull(data)) {
|
|
14
18
|
return;
|
|
15
19
|
}
|
|
20
|
+
if (data.max !== undefined) {
|
|
21
|
+
this.max = data.max;
|
|
22
|
+
}
|
|
23
|
+
if (data.min !== undefined) {
|
|
24
|
+
this.min = data.min;
|
|
25
|
+
}
|
|
16
26
|
if (data.offset !== undefined) {
|
|
17
27
|
this.offset = setRangeValue(data.offset);
|
|
18
28
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { hMax, hMin, lMax, lMin, sMax, sMin } from "../../Core/Utils/Constants.js";
|
|
1
2
|
import { ColorAnimation } from "./ColorAnimation.js";
|
|
2
3
|
import { isNull } from "../../Utils/TypeUtils.js";
|
|
3
4
|
export class HslAnimation {
|
|
4
|
-
h = new ColorAnimation();
|
|
5
|
-
l = new ColorAnimation();
|
|
6
|
-
s = new ColorAnimation();
|
|
5
|
+
h = new ColorAnimation(hMin, hMax);
|
|
6
|
+
l = new ColorAnimation(lMin, lMax);
|
|
7
|
+
s = new ColorAnimation(sMin, sMax);
|
|
7
8
|
load(data) {
|
|
8
9
|
if (isNull(data)) {
|
|
9
10
|
return;
|
|
@@ -18,6 +18,7 @@ export class Options {
|
|
|
18
18
|
hdr;
|
|
19
19
|
key;
|
|
20
20
|
name;
|
|
21
|
+
palette;
|
|
21
22
|
particles;
|
|
22
23
|
pauseOnBlur;
|
|
23
24
|
pauseOnOutsideViewport;
|
|
@@ -54,10 +55,15 @@ export class Options {
|
|
|
54
55
|
return;
|
|
55
56
|
}
|
|
56
57
|
if (data.preset !== undefined) {
|
|
57
|
-
|
|
58
|
+
this.preset = data.preset;
|
|
59
|
+
executeOnSingleOrMultiple(this.preset, preset => {
|
|
58
60
|
this._importPreset(preset);
|
|
59
61
|
});
|
|
60
62
|
}
|
|
63
|
+
if (data.palette !== undefined) {
|
|
64
|
+
this.palette = data.palette;
|
|
65
|
+
this._importPalette(this.palette);
|
|
66
|
+
}
|
|
61
67
|
if (data.autoPlay !== undefined) {
|
|
62
68
|
this.autoPlay = data.autoPlay;
|
|
63
69
|
}
|
|
@@ -114,6 +120,37 @@ export class Options {
|
|
|
114
120
|
plugin.loadOptions(this._container, this, data);
|
|
115
121
|
});
|
|
116
122
|
}
|
|
123
|
+
_importPalette = palette => {
|
|
124
|
+
const paletteData = this._engine.getPalette(palette);
|
|
125
|
+
if (!paletteData) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.load({
|
|
129
|
+
background: {
|
|
130
|
+
color: paletteData.background,
|
|
131
|
+
},
|
|
132
|
+
blend: {
|
|
133
|
+
enable: true,
|
|
134
|
+
mode: paletteData.blendMode,
|
|
135
|
+
},
|
|
136
|
+
particles: {
|
|
137
|
+
fill: {
|
|
138
|
+
color: paletteData.fill
|
|
139
|
+
? {
|
|
140
|
+
value: paletteData.colors,
|
|
141
|
+
}
|
|
142
|
+
: undefined,
|
|
143
|
+
enable: paletteData.fill,
|
|
144
|
+
},
|
|
145
|
+
stroke: !paletteData.fill
|
|
146
|
+
? paletteData.colors.map(color => ({
|
|
147
|
+
color: { value: color },
|
|
148
|
+
width: 1,
|
|
149
|
+
}))
|
|
150
|
+
: undefined,
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
};
|
|
117
154
|
_importPreset = preset => {
|
|
118
155
|
this.load(this._engine.getPreset(preset));
|
|
119
156
|
};
|
|
@@ -2,12 +2,10 @@ import { deepExtend } from "../../../../Utils/Utils.js";
|
|
|
2
2
|
import { isNull } from "../../../../Utils/TypeUtils.js";
|
|
3
3
|
export class Effect {
|
|
4
4
|
close;
|
|
5
|
-
fill;
|
|
6
5
|
options;
|
|
7
6
|
type;
|
|
8
7
|
constructor() {
|
|
9
8
|
this.close = true;
|
|
10
|
-
this.fill = true;
|
|
11
9
|
this.options = {};
|
|
12
10
|
this.type = [];
|
|
13
11
|
}
|
|
@@ -27,9 +25,6 @@ export class Effect {
|
|
|
27
25
|
if (data.close !== undefined) {
|
|
28
26
|
this.close = data.close;
|
|
29
27
|
}
|
|
30
|
-
if (data.fill !== undefined) {
|
|
31
|
-
this.fill = data.fill;
|
|
32
|
-
}
|
|
33
28
|
if (data.type !== undefined) {
|
|
34
29
|
this.type = data.type;
|
|
35
30
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AnimatableColor } from "../AnimatableColor.js";
|
|
2
|
+
import { isNull } from "../../../Utils/TypeUtils.js";
|
|
3
|
+
import { setRangeValue } from "../../../Utils/MathUtils.js";
|
|
4
|
+
export class Fill {
|
|
5
|
+
color;
|
|
6
|
+
enable;
|
|
7
|
+
opacity;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.enable = true;
|
|
10
|
+
this.color = new AnimatableColor();
|
|
11
|
+
this.color.value = "#fff";
|
|
12
|
+
this.opacity = 1;
|
|
13
|
+
}
|
|
14
|
+
load(data) {
|
|
15
|
+
if (isNull(data)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (data.color !== undefined) {
|
|
19
|
+
this.color = AnimatableColor.create(this.color, data.color);
|
|
20
|
+
}
|
|
21
|
+
if (data.enable !== undefined) {
|
|
22
|
+
this.enable = data.enable;
|
|
23
|
+
}
|
|
24
|
+
if (data.opacity !== undefined) {
|
|
25
|
+
this.opacity = setRangeValue(data.opacity);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { MoveDirection } from "../../../../Enums/Directions/MoveDirection.js";
|
|
2
2
|
import { isNull, isNumber, isObject } from "../../../../Utils/TypeUtils.js";
|
|
3
3
|
import { MoveAngle } from "./MoveAngle.js";
|
|
4
|
-
import { MoveAttract } from "./MoveAttract.js";
|
|
5
4
|
import { MoveCenter } from "./MoveCenter.js";
|
|
6
5
|
import { MoveGravity } from "./MoveGravity.js";
|
|
7
6
|
import { MovePath } from "./Path/MovePath.js";
|
|
@@ -10,7 +9,6 @@ import { Spin } from "./Spin.js";
|
|
|
10
9
|
import { setRangeValue } from "../../../../Utils/MathUtils.js";
|
|
11
10
|
export class Move {
|
|
12
11
|
angle;
|
|
13
|
-
attract;
|
|
14
12
|
center;
|
|
15
13
|
decay;
|
|
16
14
|
direction;
|
|
@@ -29,7 +27,6 @@ export class Move {
|
|
|
29
27
|
warp;
|
|
30
28
|
constructor() {
|
|
31
29
|
this.angle = new MoveAngle();
|
|
32
|
-
this.attract = new MoveAttract();
|
|
33
30
|
this.center = new MoveCenter();
|
|
34
31
|
this.decay = 0;
|
|
35
32
|
this.distance = {};
|
|
@@ -52,7 +49,6 @@ export class Move {
|
|
|
52
49
|
return;
|
|
53
50
|
}
|
|
54
51
|
this.angle.load(isNumber(data.angle) ? { value: data.angle } : data.angle);
|
|
55
|
-
this.attract.load(data.attract);
|
|
56
52
|
this.center.load(data.center);
|
|
57
53
|
if (data.decay !== undefined) {
|
|
58
54
|
this.decay = setRangeValue(data.decay);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { deepExtend, executeOnSingleOrMultiple } from "../../../Utils/Utils.js";
|
|
2
|
-
import { AnimatableColor } from "../AnimatableColor.js";
|
|
3
2
|
import { Effect } from "./Effect/Effect.js";
|
|
3
|
+
import { Fill } from "./Fill.js";
|
|
4
4
|
import { Move } from "./Move/Move.js";
|
|
5
5
|
import { Opacity } from "./Opacity/Opacity.js";
|
|
6
6
|
import { ParticlesBounce } from "./Bounce/ParticlesBounce.js";
|
|
@@ -12,8 +12,8 @@ import { ZIndex } from "./ZIndex/ZIndex.js";
|
|
|
12
12
|
import { isNull } from "../../../Utils/TypeUtils.js";
|
|
13
13
|
export class ParticlesOptions {
|
|
14
14
|
bounce;
|
|
15
|
-
color;
|
|
16
15
|
effect;
|
|
16
|
+
fill;
|
|
17
17
|
groups;
|
|
18
18
|
move;
|
|
19
19
|
number;
|
|
@@ -29,9 +29,8 @@ export class ParticlesOptions {
|
|
|
29
29
|
this._engine = engine;
|
|
30
30
|
this._container = container;
|
|
31
31
|
this.bounce = new ParticlesBounce();
|
|
32
|
-
this.color = new AnimatableColor();
|
|
33
|
-
this.color.value = "#fff";
|
|
34
32
|
this.effect = new Effect();
|
|
33
|
+
this.fill = new Fill();
|
|
35
34
|
this.groups = {};
|
|
36
35
|
this.move = new Move();
|
|
37
36
|
this.number = new ParticlesNumber();
|
|
@@ -48,7 +47,7 @@ export class ParticlesOptions {
|
|
|
48
47
|
}
|
|
49
48
|
if (data.groups !== undefined) {
|
|
50
49
|
for (const group of Object.keys(data.groups)) {
|
|
51
|
-
if (!
|
|
50
|
+
if (!(group in data.groups)) {
|
|
52
51
|
continue;
|
|
53
52
|
}
|
|
54
53
|
const item = data.groups[group];
|
|
@@ -61,7 +60,6 @@ export class ParticlesOptions {
|
|
|
61
60
|
this.reduceDuplicates = data.reduceDuplicates;
|
|
62
61
|
}
|
|
63
62
|
this.bounce.load(data.bounce);
|
|
64
|
-
this.color.load(AnimatableColor.create(this.color, data.color));
|
|
65
63
|
this.effect.load(data.effect);
|
|
66
64
|
this.move.load(data.move);
|
|
67
65
|
this.number.load(data.number);
|
|
@@ -69,6 +67,14 @@ export class ParticlesOptions {
|
|
|
69
67
|
this.shape.load(data.shape);
|
|
70
68
|
this.size.load(data.size);
|
|
71
69
|
this.zIndex.load(data.zIndex);
|
|
70
|
+
const fillToLoad = data.fill;
|
|
71
|
+
if (fillToLoad) {
|
|
72
|
+
this.fill = executeOnSingleOrMultiple(fillToLoad, t => {
|
|
73
|
+
const tmp = new Fill();
|
|
74
|
+
tmp.load(t);
|
|
75
|
+
return tmp;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
72
78
|
const strokeToLoad = data.stroke;
|
|
73
79
|
if (strokeToLoad) {
|
|
74
80
|
this.stroke = executeOnSingleOrMultiple(strokeToLoad, t => {
|
|
@@ -2,12 +2,10 @@ import { deepExtend } from "../../../../Utils/Utils.js";
|
|
|
2
2
|
import { isNull } from "../../../../Utils/TypeUtils.js";
|
|
3
3
|
export class Shape {
|
|
4
4
|
close;
|
|
5
|
-
fill;
|
|
6
5
|
options;
|
|
7
6
|
type;
|
|
8
7
|
constructor() {
|
|
9
8
|
this.close = true;
|
|
10
|
-
this.fill = true;
|
|
11
9
|
this.options = {};
|
|
12
10
|
this.type = "circle";
|
|
13
11
|
}
|
|
@@ -27,9 +25,6 @@ export class Shape {
|
|
|
27
25
|
if (data.close !== undefined) {
|
|
28
26
|
this.close = data.close;
|
|
29
27
|
}
|
|
30
|
-
if (data.fill !== undefined) {
|
|
31
|
-
this.fill = data.fill;
|
|
32
|
-
}
|
|
33
28
|
if (data.type !== undefined) {
|
|
34
29
|
this.type = data.type;
|
|
35
30
|
}
|