@tsparticles/engine 3.7.1 → 3.8.1
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/browser/Core/Canvas.js +37 -27
- package/browser/Core/Container.js +10 -13
- package/browser/Core/Engine.js +15 -11
- package/browser/Core/Particle.js +8 -11
- package/browser/Core/Particles.js +10 -14
- package/browser/Core/Retina.js +1 -1
- package/browser/Core/Utils/Constants.js +10 -16
- package/browser/Core/Utils/EventListeners.js +5 -8
- package/browser/Core/Utils/QuadTree.js +1 -1
- package/browser/Core/Utils/Ranges.js +1 -1
- package/browser/Core/Utils/Vectors.js +10 -15
- package/browser/Options/Classes/ManualParticle.js +3 -3
- package/browser/Utils/CanvasUtils.js +8 -14
- package/browser/Utils/ColorUtils.js +12 -17
- package/browser/Utils/EventDispatcher.js +2 -2
- package/browser/Utils/NumberUtils.js +2 -4
- package/browser/Utils/Utils.js +59 -9
- package/cjs/Core/Canvas.js +38 -28
- package/cjs/Core/Container.js +14 -17
- package/cjs/Core/Engine.js +21 -17
- package/cjs/Core/Particle.js +18 -21
- package/cjs/Core/Particles.js +22 -26
- package/cjs/Core/Retina.js +5 -5
- package/cjs/Core/Utils/Constants.js +12 -17
- package/cjs/Core/Utils/EventListeners.js +8 -11
- package/cjs/Core/Utils/QuadTree.js +4 -4
- package/cjs/Core/Utils/Ranges.js +4 -4
- package/cjs/Core/Utils/Vectors.js +11 -16
- package/cjs/Options/Classes/ManualParticle.js +3 -3
- package/cjs/Utils/CanvasUtils.js +14 -20
- package/cjs/Utils/ColorUtils.js +47 -52
- package/cjs/Utils/EventDispatcher.js +5 -5
- package/cjs/Utils/NumberUtils.js +11 -13
- package/cjs/Utils/Utils.js +61 -10
- package/esm/Core/Canvas.js +37 -27
- package/esm/Core/Container.js +10 -13
- package/esm/Core/Engine.js +15 -11
- package/esm/Core/Particle.js +8 -11
- package/esm/Core/Particles.js +10 -14
- package/esm/Core/Retina.js +1 -1
- package/esm/Core/Utils/Constants.js +10 -16
- package/esm/Core/Utils/EventListeners.js +5 -8
- package/esm/Core/Utils/QuadTree.js +1 -1
- package/esm/Core/Utils/Ranges.js +1 -1
- package/esm/Core/Utils/Vectors.js +10 -15
- package/esm/Options/Classes/ManualParticle.js +3 -3
- package/esm/Utils/CanvasUtils.js +8 -14
- package/esm/Utils/ColorUtils.js +12 -17
- package/esm/Utils/EventDispatcher.js +2 -2
- package/esm/Utils/NumberUtils.js +2 -4
- package/esm/Utils/Utils.js +59 -9
- package/package.json +1 -1
- package/report.html +1 -1
- package/tsparticles.engine.js +20 -20
- package/tsparticles.engine.min.js +1 -1
- package/tsparticles.engine.min.js.LICENSE.txt +1 -1
- package/types/Core/Canvas.d.ts +1 -1
- package/types/Core/Engine.d.ts +5 -4
- package/types/Core/Utils/Constants.d.ts +7 -16
- package/types/Utils/ColorUtils.d.ts +1 -1
- package/types/Utils/Utils.d.ts +2 -2
- package/umd/Core/Canvas.js +39 -29
- package/umd/Core/Container.js +14 -17
- package/umd/Core/Engine.js +21 -17
- package/umd/Core/Particle.js +19 -22
- package/umd/Core/Particles.js +23 -27
- package/umd/Core/Retina.js +6 -6
- package/umd/Core/Utils/Constants.js +11 -17
- package/umd/Core/Utils/EventListeners.js +9 -12
- package/umd/Core/Utils/QuadTree.js +5 -5
- package/umd/Core/Utils/Ranges.js +5 -5
- package/umd/Core/Utils/Vectors.js +11 -16
- package/umd/Options/Classes/ManualParticle.js +4 -4
- package/umd/Utils/CanvasUtils.js +15 -21
- package/umd/Utils/ColorUtils.js +48 -53
- package/umd/Utils/EventDispatcher.js +6 -6
- package/umd/Utils/NumberUtils.js +12 -14
- package/umd/Utils/Utils.js +61 -10
package/esm/Core/Engine.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { errorPrefix, generatedAttribute } from "./Utils/Constants.js";
|
|
1
|
+
import { canvasFirstIndex, canvasTag, errorPrefix, generatedAttribute, generatedFalse, generatedTrue, loadMinIndex, loadRandomFactor, none, one, removeDeleteCount, } from "./Utils/Constants.js";
|
|
2
2
|
import { executeOnSingleOrMultiple, getLogger, itemFromSingleOrMultiple } from "../Utils/Utils.js";
|
|
3
3
|
import { Container } from "./Container.js";
|
|
4
4
|
import { EventDispatcher } from "../Utils/EventDispatcher.js";
|
|
@@ -24,7 +24,7 @@ async function getDataFromUrl(data) {
|
|
|
24
24
|
getLogger().error(`${errorPrefix} ${response.status} while retrieving config file`);
|
|
25
25
|
return data.fallback;
|
|
26
26
|
}
|
|
27
|
-
const
|
|
27
|
+
const getCanvasFromContainer = (domContainer) => {
|
|
28
28
|
let canvasEl;
|
|
29
29
|
if (domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag) {
|
|
30
30
|
canvasEl = domContainer;
|
|
@@ -35,8 +35,7 @@ const generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", ge
|
|
|
35
35
|
else {
|
|
36
36
|
const existingCanvases = domContainer.getElementsByTagName(canvasTag);
|
|
37
37
|
if (existingCanvases.length) {
|
|
38
|
-
|
|
39
|
-
canvasEl = existingCanvases[firstIndex];
|
|
38
|
+
canvasEl = existingCanvases[canvasFirstIndex];
|
|
40
39
|
canvasEl.dataset[generatedAttribute] = generatedFalse;
|
|
41
40
|
}
|
|
42
41
|
else {
|
|
@@ -97,7 +96,7 @@ export class Engine {
|
|
|
97
96
|
return this._domArray;
|
|
98
97
|
}
|
|
99
98
|
get version() {
|
|
100
|
-
return "3.
|
|
99
|
+
return "3.8.1";
|
|
101
100
|
}
|
|
102
101
|
async addColorManager(manager, refresh = true) {
|
|
103
102
|
this.colorManagers.set(manager.key, manager);
|
|
@@ -165,6 +164,12 @@ export class Engine {
|
|
|
165
164
|
}
|
|
166
165
|
await this.refresh(refresh);
|
|
167
166
|
}
|
|
167
|
+
checkVersion(pluginVersion) {
|
|
168
|
+
if (this.version === pluginVersion) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
throw new Error(`The tsParticles version is different from the loaded plugins version. Engine version: ${this.version}. Plugin version: ${pluginVersion}`);
|
|
172
|
+
}
|
|
168
173
|
clearPlugins(container) {
|
|
169
174
|
this.updaters.delete(container);
|
|
170
175
|
this.movers.delete(container);
|
|
@@ -230,17 +235,16 @@ export class Engine {
|
|
|
230
235
|
item(index) {
|
|
231
236
|
const { items } = this, item = items[index];
|
|
232
237
|
if (!item || item.destroyed) {
|
|
233
|
-
|
|
234
|
-
items.splice(index, deleteCount);
|
|
238
|
+
items.splice(index, removeDeleteCount);
|
|
235
239
|
return;
|
|
236
240
|
}
|
|
237
241
|
return item;
|
|
238
242
|
}
|
|
239
243
|
async load(params) {
|
|
240
|
-
const
|
|
241
|
-
const currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id),
|
|
242
|
-
if (oldIndex >=
|
|
243
|
-
const old = this.item(oldIndex),
|
|
244
|
+
const id = params.id ?? params.element?.id ?? `tsparticles${Math.floor(getRandom() * loadRandomFactor)}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options;
|
|
245
|
+
const currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), newItem = new Container(this, id, currentOptions);
|
|
246
|
+
if (oldIndex >= loadMinIndex) {
|
|
247
|
+
const old = this.item(oldIndex), deleteCount = old ? one : none;
|
|
244
248
|
if (old && !old.destroyed) {
|
|
245
249
|
old.destroy(false);
|
|
246
250
|
}
|
package/esm/Core/Particle.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Vector, Vector3d } from "./Utils/Vectors.js";
|
|
2
2
|
import { calcExactPositionOrRandomFromSize, clamp, degToRad, getDistance, getParticleBaseVelocity, getParticleDirectionAngle, getRandom, getRangeValue, randomInRange, setRangeValue, } from "../Utils/NumberUtils.js";
|
|
3
|
+
import { decayOffset, defaultRadius, defaultRetryCount, double, errorPrefix, half, millisecondsToSeconds, minRetries, minZ, none, randomColorValue, rollFactor, squareExp, tryCountIncrement, } from "./Utils/Constants.js";
|
|
3
4
|
import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
|
|
4
|
-
import { errorPrefix, millisecondsToSeconds } from "./Utils/Constants.js";
|
|
5
5
|
import { getHslFromAnimation, rangeColorToRgb } from "../Utils/ColorUtils.js";
|
|
6
6
|
import { EventType } from "../Enums/Types/EventType.js";
|
|
7
7
|
import { Interactivity } from "../Options/Classes/Interactivity/Interactivity.js";
|
|
@@ -11,7 +11,6 @@ import { ParticleOutType } from "../Enums/Types/ParticleOutType.js";
|
|
|
11
11
|
import { PixelMode } from "../Enums/Modes/PixelMode.js";
|
|
12
12
|
import { alterHsl } from "../Utils/CanvasUtils.js";
|
|
13
13
|
import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
|
|
14
|
-
const defaultRetryCount = 0, double = 2, half = 0.5, squareExp = 2, randomString = "random";
|
|
15
14
|
function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
|
|
16
15
|
const effectData = effectOptions.options[effect];
|
|
17
16
|
if (!effectData) {
|
|
@@ -81,8 +80,7 @@ export class Particle {
|
|
|
81
80
|
fixVertical(outModes.top ?? outModes.default);
|
|
82
81
|
fixVertical(outModes.bottom ?? outModes.default);
|
|
83
82
|
if (this._checkOverlap(pos, tryCount)) {
|
|
84
|
-
|
|
85
|
-
return this._calcPosition(container, undefined, zIndex, tryCount + increment);
|
|
83
|
+
return this._calcPosition(container, undefined, zIndex, tryCount + tryCountIncrement);
|
|
86
84
|
}
|
|
87
85
|
return pos;
|
|
88
86
|
};
|
|
@@ -112,7 +110,7 @@ export class Particle {
|
|
|
112
110
|
if (overlapOptions.enable) {
|
|
113
111
|
return false;
|
|
114
112
|
}
|
|
115
|
-
const retries = overlapOptions.retries
|
|
113
|
+
const retries = overlapOptions.retries;
|
|
116
114
|
if (retries >= minRetries && tryCount > retries) {
|
|
117
115
|
throw new Error(`${errorPrefix} particle is overlapping and can't be placed`);
|
|
118
116
|
}
|
|
@@ -122,7 +120,7 @@ export class Particle {
|
|
|
122
120
|
if (!color || !this.roll || (!this.backColor && !this.roll.alter)) {
|
|
123
121
|
return color;
|
|
124
122
|
}
|
|
125
|
-
const
|
|
123
|
+
const backFactor = this.roll.horizontal && this.roll.vertical ? double * rollFactor : rollFactor, backSum = this.roll.horizontal ? Math.PI * half : none, rolled = Math.floor(((this.roll.angle ?? none) + backSum) / (Math.PI / backFactor)) % double;
|
|
126
124
|
if (!rolled) {
|
|
127
125
|
return color;
|
|
128
126
|
}
|
|
@@ -135,10 +133,10 @@ export class Particle {
|
|
|
135
133
|
return color;
|
|
136
134
|
};
|
|
137
135
|
this._initPosition = position => {
|
|
138
|
-
const container = this.container, zIndexValue = getRangeValue(this.options.zIndex.value)
|
|
136
|
+
const container = this.container, zIndexValue = getRangeValue(this.options.zIndex.value);
|
|
139
137
|
this.position = this._calcPosition(container, position, clamp(zIndexValue, minZ, container.zLayers));
|
|
140
138
|
this.initialPosition = this.position.copy();
|
|
141
|
-
const canvasSize = container.canvas.size
|
|
139
|
+
const canvasSize = container.canvas.size;
|
|
142
140
|
this.moveCenter = {
|
|
143
141
|
...getPosition(this.options.move.center, canvasSize),
|
|
144
142
|
radius: this.options.move.center.radius ?? defaultRadius,
|
|
@@ -246,11 +244,11 @@ export class Particle {
|
|
|
246
244
|
}
|
|
247
245
|
}
|
|
248
246
|
}
|
|
249
|
-
if (this.effect ===
|
|
247
|
+
if (this.effect === randomColorValue) {
|
|
250
248
|
const availableEffects = [...this.container.effectDrawers.keys()];
|
|
251
249
|
this.effect = availableEffects[Math.floor(Math.random() * availableEffects.length)];
|
|
252
250
|
}
|
|
253
|
-
if (this.shape ===
|
|
251
|
+
if (this.shape === randomColorValue) {
|
|
254
252
|
const availableShapes = [...this.container.shapeDrawers.keys()];
|
|
255
253
|
this.shape = availableShapes[Math.floor(Math.random() * availableShapes.length)];
|
|
256
254
|
}
|
|
@@ -294,7 +292,6 @@ export class Particle {
|
|
|
294
292
|
this._initPosition(position);
|
|
295
293
|
this.initialVelocity = this._calculateVelocity();
|
|
296
294
|
this.velocity = this.initialVelocity.copy();
|
|
297
|
-
const decayOffset = 1;
|
|
298
295
|
this.moveDecay = decayOffset - getRangeValue(this.options.move.decay);
|
|
299
296
|
const particles = container.particles;
|
|
300
297
|
particles.setLastZIndex(this.position.z);
|
package/esm/Core/Particles.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { countOffset, defaultDensityFactor, defaultRemoveQuantity, deleteCount, errorPrefix, lengthOffset, manualCount, minCount, minIndex, minLimit, posOffset, qTreeCapacity, sizeFactor, squareExp, } from "./Utils/Constants.js";
|
|
1
2
|
import { getLogger, getPosition } from "../Utils/Utils.js";
|
|
2
3
|
import { EventType } from "../Enums/Types/EventType.js";
|
|
3
4
|
import { InteractionManager } from "./Utils/InteractionManager.js";
|
|
@@ -6,10 +7,8 @@ import { Particle } from "./Particle.js";
|
|
|
6
7
|
import { Point } from "./Utils/Point.js";
|
|
7
8
|
import { QuadTree } from "./Utils/QuadTree.js";
|
|
8
9
|
import { Rectangle } from "./Utils/Ranges.js";
|
|
9
|
-
import { errorPrefix } from "./Utils/Constants.js";
|
|
10
|
-
const qTreeCapacity = 4, squareExp = 2, defaultRemoveQuantity = 1;
|
|
11
10
|
const qTreeRectangle = (canvasSize) => {
|
|
12
|
-
const { height, width } = canvasSize
|
|
11
|
+
const { height, width } = canvasSize;
|
|
13
12
|
return new Rectangle(posOffset * width, posOffset * height, sizeFactor * width, sizeFactor * height);
|
|
14
13
|
};
|
|
15
14
|
export class Particles {
|
|
@@ -28,7 +27,7 @@ export class Particles {
|
|
|
28
27
|
}
|
|
29
28
|
return;
|
|
30
29
|
}
|
|
31
|
-
const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value,
|
|
30
|
+
const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + manualCount, particlesCount = Math.min(this.count, this.filter(t => t.group === group).length);
|
|
32
31
|
if (group === undefined) {
|
|
33
32
|
this._limit = numberOptions.limit.value * densityFactor;
|
|
34
33
|
}
|
|
@@ -43,9 +42,9 @@ export class Particles {
|
|
|
43
42
|
}
|
|
44
43
|
};
|
|
45
44
|
this._initDensityFactor = densityOptions => {
|
|
46
|
-
const container = this._container
|
|
45
|
+
const container = this._container;
|
|
47
46
|
if (!container.canvas.element || !densityOptions.enable) {
|
|
48
|
-
return
|
|
47
|
+
return defaultDensityFactor;
|
|
49
48
|
}
|
|
50
49
|
const canvas = container.canvas.element, pxRatio = container.retina.pixelRatio;
|
|
51
50
|
return (canvas.width * canvas.height) / (densityOptions.height * densityOptions.width * pxRatio ** squareExp);
|
|
@@ -84,7 +83,7 @@ export class Particles {
|
|
|
84
83
|
if (!particle || particle.group !== group) {
|
|
85
84
|
return false;
|
|
86
85
|
}
|
|
87
|
-
const zIdx = this._zArray.indexOf(particle)
|
|
86
|
+
const zIdx = this._zArray.indexOf(particle);
|
|
88
87
|
this._array.splice(index, deleteCount);
|
|
89
88
|
this._zArray.splice(zIdx, deleteCount);
|
|
90
89
|
particle.destroy(override);
|
|
@@ -122,11 +121,11 @@ export class Particles {
|
|
|
122
121
|
options.manualParticles.forEach(p => this.addParticle(p.position ? getPosition(p.position, container.canvas.size) : undefined, p.options));
|
|
123
122
|
}
|
|
124
123
|
addParticle(position, overrideOptions, group, initializer) {
|
|
125
|
-
const limitMode = this._container.actualOptions.particles.number.limit.mode, limit = group === undefined ? this._limit : (this._groupLimits.get(group) ?? this._limit), currentCount = this.count
|
|
124
|
+
const limitMode = this._container.actualOptions.particles.number.limit.mode, limit = group === undefined ? this._limit : (this._groupLimits.get(group) ?? this._limit), currentCount = this.count;
|
|
126
125
|
if (limit > minLimit) {
|
|
127
126
|
switch (limitMode) {
|
|
128
127
|
case LimitMode.delete: {
|
|
129
|
-
const
|
|
128
|
+
const countToRemove = currentCount + countOffset - limit;
|
|
130
129
|
if (countToRemove > minCount) {
|
|
131
130
|
this.removeQuantity(countToRemove);
|
|
132
131
|
}
|
|
@@ -227,7 +226,6 @@ export class Particles {
|
|
|
227
226
|
this.removeAt(this._array.indexOf(particle), undefined, group, override);
|
|
228
227
|
}
|
|
229
228
|
removeAt(index, quantity = defaultRemoveQuantity, group, override) {
|
|
230
|
-
const minIndex = 0;
|
|
231
229
|
if (index < minIndex || index > this.count) {
|
|
232
230
|
return;
|
|
233
231
|
}
|
|
@@ -240,11 +238,10 @@ export class Particles {
|
|
|
240
238
|
}
|
|
241
239
|
}
|
|
242
240
|
removeQuantity(quantity, group) {
|
|
243
|
-
|
|
244
|
-
this.removeAt(defaultIndex, quantity, group);
|
|
241
|
+
this.removeAt(minIndex, quantity, group);
|
|
245
242
|
}
|
|
246
243
|
setDensity() {
|
|
247
|
-
const options = this._container.actualOptions, groups = options.particles.groups
|
|
244
|
+
const options = this._container.actualOptions, groups = options.particles.groups;
|
|
248
245
|
for (const group in groups) {
|
|
249
246
|
this._applyDensity(groups[group], manualCount, group);
|
|
250
247
|
}
|
|
@@ -320,7 +317,6 @@ export class Particles {
|
|
|
320
317
|
if (this._needsSort) {
|
|
321
318
|
const zArray = this._zArray;
|
|
322
319
|
zArray.sort((a, b) => b.position.z - a.position.z || a.id - b.id);
|
|
323
|
-
const lengthOffset = 1;
|
|
324
320
|
this._lastZIndex = zArray[zArray.length - lengthOffset].position.z;
|
|
325
321
|
this._needsSort = false;
|
|
326
322
|
}
|
package/esm/Core/Retina.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { defaultRatio, defaultReduceFactor } from "./Utils/Constants.js";
|
|
1
2
|
import { getRangeValue } from "../Utils/NumberUtils.js";
|
|
2
3
|
import { isSsr } from "../Utils/Utils.js";
|
|
3
|
-
const defaultRatio = 1, defaultReduceFactor = 1;
|
|
4
4
|
export class Retina {
|
|
5
5
|
constructor(container) {
|
|
6
6
|
this.container = container;
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
export const generatedAttribute = "generated"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export const resizeEvent = "resize";
|
|
12
|
-
export const visibilityChangeEvent = "visibilitychange";
|
|
13
|
-
export const errorPrefix = "tsParticles - Error";
|
|
14
|
-
export const percentDenominator = 100;
|
|
15
|
-
export const halfRandom = 0.5;
|
|
16
|
-
export const millisecondsToSeconds = 1000;
|
|
1
|
+
export const generatedAttribute = "generated", mouseDownEvent = "pointerdown", mouseUpEvent = "pointerup", mouseLeaveEvent = "pointerleave", mouseOutEvent = "pointerout", mouseMoveEvent = "pointermove", touchStartEvent = "touchstart", touchEndEvent = "touchend", touchMoveEvent = "touchmove", touchCancelEvent = "touchcancel", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", errorPrefix = "tsParticles - Error", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
|
|
2
|
+
x: 0,
|
|
3
|
+
y: 0,
|
|
4
|
+
z: 0,
|
|
5
|
+
}, defaultTransform = {
|
|
6
|
+
a: 1,
|
|
7
|
+
b: 0,
|
|
8
|
+
c: 0,
|
|
9
|
+
d: 1,
|
|
10
|
+
}, randomColorValue = "random", midColorValue = "mid", double = 2, doublePI = Math.PI * double, defaultFps = 60, defaultAlpha = 1, generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", defaultRetryCount = 0, squareExp = 2, qTreeCapacity = 4, defaultRemoveQuantity = 1, defaultRatio = 1, defaultReduceFactor = 1, subdivideCount = 4, inverseFactorNumerator = 1.0, rgbMax = 255, hMax = 360, sMax = 100, lMax = 100, hMin = 0, sMin = 0, hPhase = 60, empty = 0, quarter = 0.25, threeQuarter = half + quarter, minVelocity = 0, defaultTransformValue = 1, minimumSize = 0, minimumLength = 0, zIndexFactorOffset = 1, defaultOpacity = 1, clickRadius = 1, touchEndLengthOffset = 1, minCoordinate = 0, removeDeleteCount = 1, removeMinIndex = 0, defaultFpsLimit = 120, minFpsLimit = 0, canvasFirstIndex = 0, loadRandomFactor = 10000, loadMinIndex = 0, one = 1, none = 0, decayOffset = 1, tryCountIncrement = 1, minRetries = 0, rollFactor = 1, minZ = 0, defaultRadius = 0, posOffset = -quarter, sizeFactor = 1.5, minLimit = 0, countOffset = 1, minCount = 0, minIndex = 0, manualCount = 0, lengthOffset = 1, defaultDensityFactor = 1, deleteCount = 1, touchDelay = 500, manualDefaultPosition = 50, defaultAngle = 0, identity = 1, minStrokeWidth = 0, lFactor = 1, lMin = 0, rgbFactor = 255, triple = 3, sextuple = 6, sNormalizedOffset = 1, phaseNumerator = 1, defaultRgbMin = 0, defaultVelocity = 0, defaultLoops = 0, defaultTime = 0;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
import { double, lengthOffset, millisecondsToSeconds, minCoordinate, mouseDownEvent, mouseLeaveEvent, mouseMoveEvent, mouseOutEvent, mouseUpEvent, resizeEvent, touchCancelEvent, touchDelay, touchEndEvent, touchMoveEvent, touchStartEvent, visibilityChangeEvent, } from "./Constants.js";
|
|
1
2
|
import { executeOnSingleOrMultiple, safeMatchMedia } from "../../Utils/Utils.js";
|
|
2
|
-
import { millisecondsToSeconds, mouseDownEvent, mouseLeaveEvent, mouseMoveEvent, mouseOutEvent, mouseUpEvent, resizeEvent, touchCancelEvent, touchEndEvent, touchMoveEvent, touchStartEvent, visibilityChangeEvent, } from "./Constants.js";
|
|
3
3
|
import { InteractivityDetect } from "../../Enums/InteractivityDetect.js";
|
|
4
4
|
import { isBoolean } from "../../Utils/TypeUtils.js";
|
|
5
|
-
const double = 2;
|
|
6
5
|
function manageListener(element, event, handler, add, options) {
|
|
7
6
|
if (add) {
|
|
8
7
|
let addOptions = { passive: true };
|
|
@@ -35,7 +34,6 @@ export class EventListeners {
|
|
|
35
34
|
executeOnSingleOrMultiple(onClick.mode, mode => this.container.handleClickMode(mode));
|
|
36
35
|
}
|
|
37
36
|
if (e.type === "touchend") {
|
|
38
|
-
const touchDelay = 500;
|
|
39
37
|
setTimeout(() => this._mouseTouchFinish(), touchDelay);
|
|
40
38
|
}
|
|
41
39
|
};
|
|
@@ -77,8 +75,7 @@ export class EventListeners {
|
|
|
77
75
|
this._resizeTimeout = setTimeout(() => void handleResize(), this.container.actualOptions.interactivity.events.resize.delay * millisecondsToSeconds);
|
|
78
76
|
};
|
|
79
77
|
this._manageInteractivityListeners = (mouseLeaveTmpEvent, add) => {
|
|
80
|
-
const handlers = this._handlers, container = this.container, options = container.actualOptions;
|
|
81
|
-
const interactivityEl = container.interactivity.element;
|
|
78
|
+
const handlers = this._handlers, container = this.container, options = container.actualOptions, interactivityEl = container.interactivity.element;
|
|
82
79
|
if (!interactivityEl) {
|
|
83
80
|
return;
|
|
84
81
|
}
|
|
@@ -259,10 +256,10 @@ export class EventListeners {
|
|
|
259
256
|
else {
|
|
260
257
|
this._canPush = e.type !== "touchmove";
|
|
261
258
|
if (canvasEl) {
|
|
262
|
-
const touchEvent = e,
|
|
259
|
+
const touchEvent = e, lastTouch = touchEvent.touches[touchEvent.touches.length - lengthOffset], canvasRect = canvasEl.getBoundingClientRect();
|
|
263
260
|
pos = {
|
|
264
|
-
x: lastTouch.clientX - (canvasRect.left ??
|
|
265
|
-
y: lastTouch.clientY - (canvasRect.top ??
|
|
261
|
+
x: lastTouch.clientX - (canvasRect.left ?? minCoordinate),
|
|
262
|
+
y: lastTouch.clientY - (canvasRect.top ?? minCoordinate),
|
|
266
263
|
};
|
|
267
264
|
}
|
|
268
265
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Circle, Rectangle } from "./Ranges.js";
|
|
2
|
+
import { double, half, subdivideCount } from "./Constants.js";
|
|
2
3
|
import { getDistance } from "../../Utils/NumberUtils.js";
|
|
3
|
-
const half = 0.5, double = 2, subdivideCount = 4;
|
|
4
4
|
export class QuadTree {
|
|
5
5
|
constructor(rectangle, capacity) {
|
|
6
6
|
this.rectangle = rectangle;
|
package/esm/Core/Utils/Ranges.js
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import { errorPrefix } from "./Constants.js";
|
|
1
|
+
import { errorPrefix, inverseFactorNumerator, none, originPoint, squareExp } from "./Constants.js";
|
|
2
2
|
import { isNumber } from "../../Utils/TypeUtils.js";
|
|
3
|
-
const origin = {
|
|
4
|
-
x: 0,
|
|
5
|
-
y: 0,
|
|
6
|
-
z: 0,
|
|
7
|
-
}, squareExp = 2, inverseFactorNumerator = 1.0;
|
|
8
3
|
export class Vector3d {
|
|
9
4
|
constructor(xOrCoords, y, z) {
|
|
10
5
|
this._updateFromAngle = (angle, length) => {
|
|
@@ -15,19 +10,19 @@ export class Vector3d {
|
|
|
15
10
|
this.x = xOrCoords.x;
|
|
16
11
|
this.y = xOrCoords.y;
|
|
17
12
|
const coords3d = xOrCoords;
|
|
18
|
-
this.z = coords3d.z ? coords3d.z :
|
|
13
|
+
this.z = coords3d.z ? coords3d.z : originPoint.z;
|
|
19
14
|
}
|
|
20
15
|
else if (xOrCoords !== undefined && y !== undefined) {
|
|
21
16
|
this.x = xOrCoords;
|
|
22
17
|
this.y = y;
|
|
23
|
-
this.z = z ??
|
|
18
|
+
this.z = z ?? originPoint.z;
|
|
24
19
|
}
|
|
25
20
|
else {
|
|
26
21
|
throw new Error(`${errorPrefix} Vector3d not initialized correctly`);
|
|
27
22
|
}
|
|
28
23
|
}
|
|
29
24
|
static get origin() {
|
|
30
|
-
return Vector3d.create(
|
|
25
|
+
return Vector3d.create(originPoint.x, originPoint.y, originPoint.z);
|
|
31
26
|
}
|
|
32
27
|
get angle() {
|
|
33
28
|
return Math.atan2(this.y, this.x);
|
|
@@ -84,19 +79,19 @@ export class Vector3d {
|
|
|
84
79
|
this.z *= n;
|
|
85
80
|
}
|
|
86
81
|
normalize() {
|
|
87
|
-
const length = this.length
|
|
88
|
-
if (length !=
|
|
82
|
+
const length = this.length;
|
|
83
|
+
if (length != none) {
|
|
89
84
|
this.multTo(inverseFactorNumerator / length);
|
|
90
85
|
}
|
|
91
86
|
}
|
|
92
87
|
rotate(angle) {
|
|
93
|
-
return Vector3d.create(this.x * Math.cos(angle) - this.y * Math.sin(angle), this.x * Math.sin(angle) + this.y * Math.cos(angle),
|
|
88
|
+
return Vector3d.create(this.x * Math.cos(angle) - this.y * Math.sin(angle), this.x * Math.sin(angle) + this.y * Math.cos(angle), originPoint.z);
|
|
94
89
|
}
|
|
95
90
|
setTo(c) {
|
|
96
91
|
this.x = c.x;
|
|
97
92
|
this.y = c.y;
|
|
98
93
|
const v3d = c;
|
|
99
|
-
this.z = v3d.z ? v3d.z :
|
|
94
|
+
this.z = v3d.z ? v3d.z : originPoint.z;
|
|
100
95
|
}
|
|
101
96
|
sub(v) {
|
|
102
97
|
return Vector3d.create(this.x - v.x, this.y - v.y, this.z - v.z);
|
|
@@ -109,10 +104,10 @@ export class Vector3d {
|
|
|
109
104
|
}
|
|
110
105
|
export class Vector extends Vector3d {
|
|
111
106
|
constructor(xOrCoords, y) {
|
|
112
|
-
super(xOrCoords, y,
|
|
107
|
+
super(xOrCoords, y, originPoint.z);
|
|
113
108
|
}
|
|
114
109
|
static get origin() {
|
|
115
|
-
return Vector.create(
|
|
110
|
+
return Vector.create(originPoint.x, originPoint.y);
|
|
116
111
|
}
|
|
117
112
|
static clone(source) {
|
|
118
113
|
return Vector.create(source.x, source.y);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PixelMode } from "../../Enums/Modes/PixelMode.js";
|
|
2
2
|
import { deepExtend } from "../../Utils/Utils.js";
|
|
3
3
|
import { isNull } from "../../Utils/TypeUtils.js";
|
|
4
|
-
|
|
4
|
+
import { manualDefaultPosition } from "../../Core/Utils/Constants.js";
|
|
5
5
|
export class ManualParticle {
|
|
6
6
|
load(data) {
|
|
7
7
|
if (isNull(data)) {
|
|
@@ -9,8 +9,8 @@ export class ManualParticle {
|
|
|
9
9
|
}
|
|
10
10
|
if (data.position) {
|
|
11
11
|
this.position = {
|
|
12
|
-
x: data.position.x ??
|
|
13
|
-
y: data.position.y ??
|
|
12
|
+
x: data.position.x ?? manualDefaultPosition,
|
|
13
|
+
y: data.position.y ?? manualDefaultPosition,
|
|
14
14
|
mode: data.position.mode ?? PixelMode.percent,
|
|
15
15
|
};
|
|
16
16
|
}
|
package/esm/Utils/CanvasUtils.js
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
|
+
import { defaultAngle, defaultTransform, identity, lFactor, minStrokeWidth, originPoint, } from "../Core/Utils/Constants.js";
|
|
1
2
|
import { AlterType } from "../Enums/Types/AlterType.js";
|
|
2
3
|
import { getStyleFromRgb } from "./ColorUtils.js";
|
|
3
|
-
const origin = { x: 0, y: 0 }, defaultTransform = {
|
|
4
|
-
a: 1,
|
|
5
|
-
b: 0,
|
|
6
|
-
c: 0,
|
|
7
|
-
d: 1,
|
|
8
|
-
};
|
|
9
4
|
export function drawLine(context, begin, end) {
|
|
10
5
|
context.beginPath();
|
|
11
6
|
context.moveTo(begin.x, begin.y);
|
|
@@ -14,24 +9,24 @@ export function drawLine(context, begin, end) {
|
|
|
14
9
|
}
|
|
15
10
|
export function paintBase(context, dimension, baseColor) {
|
|
16
11
|
context.fillStyle = baseColor ?? "rgba(0,0,0,0)";
|
|
17
|
-
context.fillRect(
|
|
12
|
+
context.fillRect(originPoint.x, originPoint.y, dimension.width, dimension.height);
|
|
18
13
|
}
|
|
19
14
|
export function paintImage(context, dimension, image, opacity) {
|
|
20
15
|
if (!image) {
|
|
21
16
|
return;
|
|
22
17
|
}
|
|
23
18
|
context.globalAlpha = opacity;
|
|
24
|
-
context.drawImage(image,
|
|
19
|
+
context.drawImage(image, originPoint.x, originPoint.y, dimension.width, dimension.height);
|
|
25
20
|
context.globalAlpha = 1;
|
|
26
21
|
}
|
|
27
22
|
export function clear(context, dimension) {
|
|
28
|
-
context.clearRect(
|
|
23
|
+
context.clearRect(originPoint.x, originPoint.y, dimension.width, dimension.height);
|
|
29
24
|
}
|
|
30
25
|
export function drawParticle(data) {
|
|
31
|
-
const { container, context, particle, delta, colorStyles, backgroundMask, composite, radius, opacity, shadow, transform, } = data, pos = particle.getPosition(),
|
|
26
|
+
const { container, context, particle, delta, colorStyles, backgroundMask, composite, radius, opacity, shadow, transform, } = data, pos = particle.getPosition(), angle = particle.rotation + (particle.pathRotation ? particle.velocity.angle : defaultAngle), rotateData = {
|
|
32
27
|
sin: Math.sin(angle),
|
|
33
28
|
cos: Math.cos(angle),
|
|
34
|
-
}, rotating = !!angle,
|
|
29
|
+
}, rotating = !!angle, transformData = {
|
|
35
30
|
a: rotateData.cos * (transform.a ?? defaultTransform.a),
|
|
36
31
|
b: rotating ? rotateData.sin * (transform.b ?? identity) : (transform.b ?? defaultTransform.b),
|
|
37
32
|
c: rotating ? -rotateData.sin * (transform.c ?? identity) : (transform.c ?? defaultTransform.c),
|
|
@@ -51,7 +46,7 @@ export function drawParticle(data) {
|
|
|
51
46
|
if (colorStyles.fill) {
|
|
52
47
|
context.fillStyle = colorStyles.fill;
|
|
53
48
|
}
|
|
54
|
-
const
|
|
49
|
+
const strokeWidth = particle.strokeWidth ?? minStrokeWidth;
|
|
55
50
|
context.lineWidth = strokeWidth;
|
|
56
51
|
if (colorStyles.stroke) {
|
|
57
52
|
context.strokeStyle = colorStyles.stroke;
|
|
@@ -92,7 +87,7 @@ export function drawEffect(data) {
|
|
|
92
87
|
});
|
|
93
88
|
}
|
|
94
89
|
export function drawShape(data) {
|
|
95
|
-
const { container, context, particle, radius, opacity, delta, strokeWidth, transformData } = data
|
|
90
|
+
const { container, context, particle, radius, opacity, delta, strokeWidth, transformData } = data;
|
|
96
91
|
if (!particle.shape) {
|
|
97
92
|
return;
|
|
98
93
|
}
|
|
@@ -152,7 +147,6 @@ export function drawParticlePlugin(context, plugin, particle, delta) {
|
|
|
152
147
|
plugin.drawParticle(context, particle, delta);
|
|
153
148
|
}
|
|
154
149
|
export function alterHsl(color, type, value) {
|
|
155
|
-
const lFactor = 1;
|
|
156
150
|
return {
|
|
157
151
|
h: color.h,
|
|
158
152
|
s: color.s,
|
package/esm/Utils/ColorUtils.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { clamp, getRandom, getRangeMax, getRangeMin, getRangeValue, mix, randomInRange, setRangeValue, } from "./NumberUtils.js";
|
|
2
|
+
import { decayOffset, defaultLoops, defaultOpacity, defaultRgbMin, defaultTime, defaultVelocity, double, hMax, hMin, hPhase, half, identity, lMax, lMin, midColorValue, millisecondsToSeconds, percentDenominator, phaseNumerator, randomColorValue, rgbFactor, rgbMax, sMax, sMin, sNormalizedOffset, sextuple, triple, } from "../Core/Utils/Constants.js";
|
|
2
3
|
import { isArray, isString } from "./TypeUtils.js";
|
|
3
|
-
import { millisecondsToSeconds, percentDenominator } from "../Core/Utils/Constants.js";
|
|
4
4
|
import { AnimationStatus } from "../Enums/AnimationStatus.js";
|
|
5
5
|
import { itemFromArray } from "./Utils.js";
|
|
6
|
-
const randomColorValue = "random", midColorValue = "mid";
|
|
7
6
|
function stringToRgba(engine, input) {
|
|
8
7
|
if (!input) {
|
|
9
8
|
return;
|
|
@@ -63,7 +62,7 @@ export function rangeColorToHsl(engine, color, index, useIndex = true) {
|
|
|
63
62
|
return rgb ? rgbToHsl(rgb) : undefined;
|
|
64
63
|
}
|
|
65
64
|
export function rgbToHsl(color) {
|
|
66
|
-
const
|
|
65
|
+
const r1 = color.r / rgbMax, g1 = color.g / rgbMax, b1 = color.b / rgbMax, max = Math.max(r1, g1, b1), min = Math.min(r1, g1, b1), res = {
|
|
67
66
|
h: hMin,
|
|
68
67
|
l: (max + min) * half,
|
|
69
68
|
s: sMin,
|
|
@@ -93,13 +92,13 @@ export function stringToRgb(engine, input) {
|
|
|
93
92
|
return stringToRgba(engine, input);
|
|
94
93
|
}
|
|
95
94
|
export function hslToRgb(hsl) {
|
|
96
|
-
const
|
|
95
|
+
const h = ((hsl.h % hMax) + hMax) % hMax, s = Math.max(sMin, Math.min(sMax, hsl.s)), l = Math.max(lMin, Math.min(lMax, hsl.l)), hNormalized = h / hMax, sNormalized = s / sMax, lNormalized = l / lMax;
|
|
97
96
|
if (s === sMin) {
|
|
98
97
|
const grayscaleValue = Math.round(lNormalized * rgbFactor);
|
|
99
98
|
return { r: grayscaleValue, g: grayscaleValue, b: grayscaleValue };
|
|
100
99
|
}
|
|
101
|
-
const
|
|
102
|
-
const temp3Min = 0, temp3Max = 1
|
|
100
|
+
const channel = (temp1, temp2, temp3) => {
|
|
101
|
+
const temp3Min = 0, temp3Max = 1;
|
|
103
102
|
if (temp3 < temp3Min) {
|
|
104
103
|
temp3++;
|
|
105
104
|
}
|
|
@@ -117,9 +116,9 @@ export function hslToRgb(hsl) {
|
|
|
117
116
|
return temp1 + (temp2 - temp1) * (temp3Offset - temp3) * sextuple;
|
|
118
117
|
}
|
|
119
118
|
return temp1;
|
|
120
|
-
},
|
|
119
|
+
}, temp1 = lNormalized < half
|
|
121
120
|
? lNormalized * (sNormalizedOffset + sNormalized)
|
|
122
|
-
: lNormalized + sNormalized - lNormalized * sNormalized, temp2 = double * lNormalized - temp1,
|
|
121
|
+
: lNormalized + sNormalized - lNormalized * sNormalized, temp2 = double * lNormalized - temp1, phaseThird = phaseNumerator / triple, red = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized + phaseThird)), green = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized)), blue = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized - phaseThird));
|
|
123
122
|
return { r: Math.round(red), g: Math.round(green), b: Math.round(blue) };
|
|
124
123
|
}
|
|
125
124
|
export function hslaToRgba(hsla) {
|
|
@@ -132,19 +131,17 @@ export function hslaToRgba(hsla) {
|
|
|
132
131
|
};
|
|
133
132
|
}
|
|
134
133
|
export function getRandomRgbColor(min) {
|
|
135
|
-
const
|
|
134
|
+
const fixedMin = min ?? defaultRgbMin, fixedMax = rgbMax + identity;
|
|
136
135
|
return {
|
|
137
|
-
b: Math.floor(randomInRange(setRangeValue(fixedMin,
|
|
138
|
-
g: Math.floor(randomInRange(setRangeValue(fixedMin,
|
|
139
|
-
r: Math.floor(randomInRange(setRangeValue(fixedMin,
|
|
136
|
+
b: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))),
|
|
137
|
+
g: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))),
|
|
138
|
+
r: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))),
|
|
140
139
|
};
|
|
141
140
|
}
|
|
142
141
|
export function getStyleFromRgb(color, opacity) {
|
|
143
|
-
const defaultOpacity = 1;
|
|
144
142
|
return `rgba(${color.r}, ${color.g}, ${color.b}, ${opacity ?? defaultOpacity})`;
|
|
145
143
|
}
|
|
146
144
|
export function getStyleFromHsl(color, opacity) {
|
|
147
|
-
const defaultOpacity = 1;
|
|
148
145
|
return `hsla(${color.h}, ${color.s}%, ${color.l}%, ${opacity ?? defaultOpacity})`;
|
|
149
146
|
}
|
|
150
147
|
export function colorMix(color1, color2, size1, size2) {
|
|
@@ -236,7 +233,6 @@ export function getHslAnimationFromHsl(hsl, animationOptions, reduceFactor) {
|
|
|
236
233
|
}
|
|
237
234
|
function setColorAnimation(colorValue, colorAnimation, reduceFactor) {
|
|
238
235
|
colorValue.enable = colorAnimation.enable;
|
|
239
|
-
const defaultVelocity = 0, decayOffset = 1, defaultLoops = 0, defaultTime = 0;
|
|
240
236
|
if (colorValue.enable) {
|
|
241
237
|
colorValue.velocity = (getRangeValue(colorAnimation.speed) / percentDenominator) * reduceFactor;
|
|
242
238
|
colorValue.decay = decayOffset - getRangeValue(colorAnimation.decay);
|
|
@@ -308,8 +304,7 @@ export function updateColor(color, delta) {
|
|
|
308
304
|
if (!color) {
|
|
309
305
|
return;
|
|
310
306
|
}
|
|
311
|
-
const { h, s, l } = color
|
|
312
|
-
const ranges = {
|
|
307
|
+
const { h, s, l } = color, ranges = {
|
|
313
308
|
h: { min: 0, max: 360 },
|
|
314
309
|
s: { min: 0, max: 100 },
|
|
315
310
|
l: { min: 0, max: 100 },
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { deleteCount, minIndex } from "../Core/Utils/Constants.js";
|
|
1
2
|
export class EventDispatcher {
|
|
2
3
|
constructor() {
|
|
3
4
|
this._listeners = new Map();
|
|
@@ -31,11 +32,10 @@ export class EventDispatcher {
|
|
|
31
32
|
if (!arr) {
|
|
32
33
|
return;
|
|
33
34
|
}
|
|
34
|
-
const length = arr.length, idx = arr.indexOf(listener)
|
|
35
|
+
const length = arr.length, idx = arr.indexOf(listener);
|
|
35
36
|
if (idx < minIndex) {
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
|
-
const deleteCount = 1;
|
|
39
39
|
if (length === deleteCount) {
|
|
40
40
|
this._listeners.delete(type);
|
|
41
41
|
}
|
package/esm/Utils/NumberUtils.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
|
|
2
|
+
import { double, doublePI, empty, half, percentDenominator, quarter, threeQuarter } from "../Core/Utils/Constants.js";
|
|
2
3
|
import { Vector } from "../Core/Utils/Vectors.js";
|
|
3
4
|
import { isNumber } from "./TypeUtils.js";
|
|
4
|
-
import { percentDenominator } from "../Core/Utils/Constants.js";
|
|
5
5
|
let _random = Math.random;
|
|
6
6
|
const _animationLoop = {
|
|
7
7
|
nextFrame: (cb) => requestAnimationFrame(cb),
|
|
8
8
|
cancel: (idx) => cancelAnimationFrame(idx),
|
|
9
|
-
}
|
|
9
|
+
};
|
|
10
10
|
export function setRandom(rnd = Math.random) {
|
|
11
11
|
_random = rnd;
|
|
12
12
|
}
|
|
@@ -74,7 +74,6 @@ export function getParticleDirectionAngle(direction, position, center) {
|
|
|
74
74
|
if (isNumber(direction)) {
|
|
75
75
|
return degToRad(direction);
|
|
76
76
|
}
|
|
77
|
-
const empty = 0, half = 0.5, quarter = 0.25, threeQuarter = half + quarter;
|
|
78
77
|
switch (direction) {
|
|
79
78
|
case MoveDirection.top:
|
|
80
79
|
return -Math.PI * half;
|
|
@@ -107,7 +106,6 @@ export function getParticleBaseVelocity(direction) {
|
|
|
107
106
|
return baseVelocity;
|
|
108
107
|
}
|
|
109
108
|
export function collisionVelocity(v1, v2, m1, m2) {
|
|
110
|
-
const double = 2;
|
|
111
109
|
return Vector.create((v1.x * (m1 - m2)) / (m1 + m2) + (v2.x * double * m2) / (m1 + m2), v1.y);
|
|
112
110
|
}
|
|
113
111
|
export function calcPositionFromSize(data) {
|