@tsparticles/engine 4.0.0-alpha.23 → 4.0.0-alpha.25
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/152.min.js +1 -0
- package/browser/Core/Container.js +1 -4
- package/browser/Core/Engine.js +1 -1
- package/browser/Core/Particle.js +1 -2
- package/browser/Core/Particles.js +8 -14
- package/browser/Core/Utils/Constants.js +1 -1
- package/browser/Core/Utils/Ranges.js +1 -1
- package/browser/Core/Utils/SpatialHashGrid.js +82 -0
- package/browser/Core/Utils/Vectors.js +3 -10
- package/browser/Utils/CanvasUtils.js +2 -13
- package/browser/Utils/ColorUtils.js +9 -1
- package/browser/Utils/MathUtils.js +4 -6
- package/browser/exports.js +0 -1
- package/cjs/Core/Container.js +1 -4
- package/cjs/Core/Engine.js +1 -1
- package/cjs/Core/Particle.js +1 -2
- package/cjs/Core/Particles.js +8 -14
- package/cjs/Core/Utils/Constants.js +1 -1
- package/cjs/Core/Utils/Ranges.js +1 -1
- package/cjs/Core/Utils/SpatialHashGrid.js +82 -0
- package/cjs/Core/Utils/Vectors.js +3 -10
- package/cjs/Utils/CanvasUtils.js +2 -13
- package/cjs/Utils/ColorUtils.js +9 -1
- package/cjs/Utils/MathUtils.js +4 -6
- package/cjs/exports.js +0 -1
- package/dist_browser_Core_Container_js.js +9 -9
- package/esm/Core/Container.js +1 -4
- package/esm/Core/Engine.js +1 -1
- package/esm/Core/Particle.js +1 -2
- package/esm/Core/Particles.js +8 -14
- package/esm/Core/Utils/Constants.js +1 -1
- package/esm/Core/Utils/Ranges.js +1 -1
- package/esm/Core/Utils/SpatialHashGrid.js +82 -0
- package/esm/Core/Utils/Vectors.js +3 -10
- package/esm/Utils/CanvasUtils.js +2 -13
- package/esm/Utils/ColorUtils.js +9 -1
- package/esm/Utils/MathUtils.js +4 -6
- package/esm/exports.js +0 -1
- package/package.json +1 -1
- package/report.html +1 -1
- package/tsparticles.engine.js +10 -20
- package/tsparticles.engine.min.js +2 -2
- package/types/Core/Particles.d.ts +2 -2
- package/types/Core/Utils/Constants.d.ts +1 -1
- package/types/Core/Utils/SpatialHashGrid.d.ts +18 -0
- package/types/Core/Utils/Vectors.d.ts +2 -4
- package/types/Utils/CanvasUtils.d.ts +0 -3
- package/types/Utils/ColorUtils.d.ts +2 -0
- package/types/export-types.d.ts +1 -1
- package/types/exports.d.ts +0 -1
- package/umd/Core/Container.js +1 -4
- package/umd/Core/Engine.js +1 -1
- package/umd/Core/Particle.js +3 -4
- package/umd/Core/Particles.js +8 -14
- package/umd/Core/Utils/Constants.js +2 -2
- package/umd/Core/Utils/Ranges.js +1 -1
- package/umd/Core/Utils/SpatialHashGrid.js +96 -0
- package/umd/Core/Utils/Vectors.js +3 -10
- package/umd/Utils/CanvasUtils.js +2 -14
- package/umd/Utils/ColorUtils.js +10 -1
- package/umd/Utils/MathUtils.js +4 -6
- package/umd/exports.js +1 -2
- package/515.min.js +0 -1
- package/browser/Core/Utils/Point.js +0 -8
- package/browser/Core/Utils/QuadTree.js +0 -64
- package/cjs/Core/Utils/Point.js +0 -8
- package/cjs/Core/Utils/QuadTree.js +0 -64
- package/esm/Core/Utils/Point.js +0 -8
- package/esm/Core/Utils/QuadTree.js +0 -64
- package/types/Core/Utils/Point.d.ts +0 -7
- package/types/Core/Utils/QuadTree.d.ts +0 -18
- package/umd/Core/Utils/Point.js +0 -22
- package/umd/Core/Utils/QuadTree.js +0 -78
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Circle, Rectangle } from "./Ranges.js";
|
|
2
|
+
export class SpatialHashGrid {
|
|
3
|
+
_cellSize;
|
|
4
|
+
_cells = new Map();
|
|
5
|
+
_pendingCellSize;
|
|
6
|
+
constructor(cellSize) {
|
|
7
|
+
this._cellSize = cellSize;
|
|
8
|
+
}
|
|
9
|
+
clear() {
|
|
10
|
+
this._cells.clear();
|
|
11
|
+
const pendingCellSize = this._pendingCellSize;
|
|
12
|
+
if (pendingCellSize) {
|
|
13
|
+
this._cellSize = pendingCellSize;
|
|
14
|
+
}
|
|
15
|
+
this._pendingCellSize = undefined;
|
|
16
|
+
}
|
|
17
|
+
insert(particle) {
|
|
18
|
+
const { x, y } = particle.getPosition(), key = this._cellKeyFromCoords(x, y);
|
|
19
|
+
if (!this._cells.has(key)) {
|
|
20
|
+
this._cells.set(key, []);
|
|
21
|
+
}
|
|
22
|
+
this._cells.get(key)?.push(particle);
|
|
23
|
+
}
|
|
24
|
+
query(range, check, out = []) {
|
|
25
|
+
const bounds = this._getRangeBounds(range);
|
|
26
|
+
if (!bounds) {
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
const minCellX = Math.floor(bounds.minX / this._cellSize), maxCellX = Math.floor(bounds.maxX / this._cellSize), minCellY = Math.floor(bounds.minY / this._cellSize), maxCellY = Math.floor(bounds.maxY / this._cellSize);
|
|
30
|
+
for (let cx = minCellX; cx <= maxCellX; cx++) {
|
|
31
|
+
for (let cy = minCellY; cy <= maxCellY; cy++) {
|
|
32
|
+
const key = `${cx}_${cy}`, cellParticles = this._cells.get(key);
|
|
33
|
+
if (!cellParticles) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
for (const p of cellParticles) {
|
|
37
|
+
if (check && !check(p)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (range.contains(p.getPosition())) {
|
|
41
|
+
out.push(p);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
queryCircle(position, radius, check, out = []) {
|
|
49
|
+
return this.query(new Circle(position.x, position.y, radius), check, out);
|
|
50
|
+
}
|
|
51
|
+
queryRectangle(position, size, check, out = []) {
|
|
52
|
+
return this.query(new Rectangle(position.x, position.y, size.width, size.height), check, out);
|
|
53
|
+
}
|
|
54
|
+
setCellSize(cellSize) {
|
|
55
|
+
this._pendingCellSize = cellSize;
|
|
56
|
+
}
|
|
57
|
+
_cellKeyFromCoords(x, y) {
|
|
58
|
+
const cellX = Math.floor(x / this._cellSize), cellY = Math.floor(y / this._cellSize);
|
|
59
|
+
return `${cellX}_${cellY}`;
|
|
60
|
+
}
|
|
61
|
+
_getRangeBounds(range) {
|
|
62
|
+
if (range instanceof Circle) {
|
|
63
|
+
const r = range.radius, { x, y } = range.position;
|
|
64
|
+
return {
|
|
65
|
+
minX: x - r,
|
|
66
|
+
maxX: x + r,
|
|
67
|
+
minY: y - r,
|
|
68
|
+
maxY: y + r,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (range instanceof Rectangle) {
|
|
72
|
+
const { x, y } = range.position, { width, height } = range.size;
|
|
73
|
+
return {
|
|
74
|
+
minX: x,
|
|
75
|
+
maxX: x + width,
|
|
76
|
+
minY: y,
|
|
77
|
+
maxY: y + height,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -43,12 +43,6 @@ export class Vector3d {
|
|
|
43
43
|
copy() {
|
|
44
44
|
return Vector3d.clone(this);
|
|
45
45
|
}
|
|
46
|
-
distanceTo(v) {
|
|
47
|
-
return this.sub(v).length;
|
|
48
|
-
}
|
|
49
|
-
distanceToSq(v) {
|
|
50
|
-
return this.sub(v).getLengthSq();
|
|
51
|
-
}
|
|
52
46
|
div(n) {
|
|
53
47
|
return Vector3d.create(this.x / n, this.y / n, this.z / n);
|
|
54
48
|
}
|
|
@@ -80,8 +74,7 @@ export class Vector3d {
|
|
|
80
74
|
setTo(c) {
|
|
81
75
|
this.x = c.x;
|
|
82
76
|
this.y = c.y;
|
|
83
|
-
|
|
84
|
-
this.z = v3d.z ? v3d.z : originPoint.z;
|
|
77
|
+
this.z = "z" in c ? c.z : originPoint.z;
|
|
85
78
|
}
|
|
86
79
|
sub(v) {
|
|
87
80
|
return Vector3d.create(this.x - v.x, this.y - v.y, this.z - v.z);
|
|
@@ -91,10 +84,10 @@ export class Vector3d {
|
|
|
91
84
|
this.y -= v.y;
|
|
92
85
|
this.z -= v.z;
|
|
93
86
|
}
|
|
94
|
-
_updateFromAngle
|
|
87
|
+
_updateFromAngle(angle, length) {
|
|
95
88
|
this.x = Math.cos(angle) * length;
|
|
96
89
|
this.y = Math.sin(angle) * length;
|
|
97
|
-
}
|
|
90
|
+
}
|
|
98
91
|
}
|
|
99
92
|
export class Vector extends Vector3d {
|
|
100
93
|
constructor(x = originPoint.x, y = originPoint.y) {
|
package/esm/Utils/CanvasUtils.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { defaultZoom,
|
|
2
|
-
import { AlterType } from "../Enums/Types/AlterType.js";
|
|
1
|
+
import { defaultZoom, minStrokeWidth, originPoint } from "../Core/Utils/Constants.js";
|
|
3
2
|
export function paintBase(context, dimension, baseColor) {
|
|
4
3
|
context.fillStyle = baseColor ?? "rgba(0,0,0,0)";
|
|
5
4
|
context.fillRect(originPoint.x, originPoint.y, dimension.width, dimension.height);
|
|
@@ -40,10 +39,7 @@ export function drawParticle(data) {
|
|
|
40
39
|
fill: particle.shapeFill,
|
|
41
40
|
stroke: strokeWidth > minStrokeWidth || !particle.shapeFill,
|
|
42
41
|
transformData,
|
|
43
|
-
position: {
|
|
44
|
-
x: pos.x,
|
|
45
|
-
y: pos.y,
|
|
46
|
-
},
|
|
42
|
+
position: { ...pos },
|
|
47
43
|
drawPosition,
|
|
48
44
|
drawScale,
|
|
49
45
|
};
|
|
@@ -128,10 +124,3 @@ export function drawParticlePlugin(context, plugin, particle, delta) {
|
|
|
128
124
|
}
|
|
129
125
|
plugin.drawParticle(context, particle, delta);
|
|
130
126
|
}
|
|
131
|
-
export function alterHsl(color, type, value) {
|
|
132
|
-
return {
|
|
133
|
-
h: color.h,
|
|
134
|
-
s: color.s,
|
|
135
|
-
l: color.l + (type === AlterType.darken ? -lFactor : lFactor) * value,
|
|
136
|
-
};
|
|
137
|
-
}
|
package/esm/Utils/ColorUtils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { clamp, getRandom, getRandomInRange, getRangeMax, getRangeMin, getRangeValue, mix, randomInRangeValue, setRangeValue, } from "./MathUtils.js";
|
|
2
|
-
import { decayOffset, defaultLoops, defaultOpacity, defaultRgbMin, defaultTime, defaultVelocity, double, hMax, hMin, hPhase, half, identity, lMax, lMin, midColorValue, millisecondsToSeconds, percentDenominator, phaseNumerator, randomColorValue, rgbMax, sMax, sMin, sNormalizedOffset, sextuple, triple, } from "../Core/Utils/Constants.js";
|
|
2
|
+
import { decayOffset, defaultLoops, defaultOpacity, defaultRgbMin, defaultTime, defaultVelocity, double, hMax, hMin, hPhase, half, identity, lFactor, lMax, lMin, midColorValue, millisecondsToSeconds, percentDenominator, phaseNumerator, randomColorValue, rgbMax, sMax, sMin, sNormalizedOffset, sextuple, triple, } from "../Core/Utils/Constants.js";
|
|
3
3
|
import { isArray, isString } from "./TypeUtils.js";
|
|
4
|
+
import { AlterType } from "../Enums/Types/AlterType.js";
|
|
4
5
|
import { AnimationStatus } from "../Enums/AnimationStatus.js";
|
|
5
6
|
import { itemFromArray } from "./Utils.js";
|
|
6
7
|
const styleCache = new Map(), maxCacheSize = 1000, firstIndex = 0, rgbFixedPrecision = 2, hslFixedPrecision = 2;
|
|
@@ -350,3 +351,10 @@ export function updateColor(color, delta) {
|
|
|
350
351
|
updateColorValue(s, ranges.s, true, delta);
|
|
351
352
|
updateColorValue(l, ranges.l, true, delta);
|
|
352
353
|
}
|
|
354
|
+
export function alterHsl(color, type, value) {
|
|
355
|
+
return {
|
|
356
|
+
h: color.h,
|
|
357
|
+
s: color.s,
|
|
358
|
+
l: color.l + (type === AlterType.darken ? -lFactor : lFactor) * value,
|
|
359
|
+
};
|
|
360
|
+
}
|
package/esm/Utils/MathUtils.js
CHANGED
|
@@ -21,10 +21,8 @@ export function getRandomInRange(min, max) {
|
|
|
21
21
|
return getRandom() * (max - min) + min;
|
|
22
22
|
}
|
|
23
23
|
export function setAnimationFunctions(nextFrame, cancel) {
|
|
24
|
-
_animationLoop.nextFrame =
|
|
25
|
-
_animationLoop.cancel =
|
|
26
|
-
cancel(handle);
|
|
27
|
-
};
|
|
24
|
+
_animationLoop.nextFrame = nextFrame;
|
|
25
|
+
_animationLoop.cancel = cancel;
|
|
28
26
|
}
|
|
29
27
|
export function animate(fn) {
|
|
30
28
|
return _animationLoop.nextFrame(fn);
|
|
@@ -68,8 +66,8 @@ export function setRangeValue(source, value) {
|
|
|
68
66
|
: setRangeValue(min, max);
|
|
69
67
|
}
|
|
70
68
|
export function getDistances(pointA, pointB) {
|
|
71
|
-
const dx = pointA.x - pointB.x, dy = pointA.y - pointB.y
|
|
72
|
-
return { dx: dx, dy: dy, distance: Math.
|
|
69
|
+
const dx = pointA.x - pointB.x, dy = pointA.y - pointB.y;
|
|
70
|
+
return { dx: dx, dy: dy, distance: Math.hypot(dx, dy) };
|
|
73
71
|
}
|
|
74
72
|
export function getDistance(pointA, pointB) {
|
|
75
73
|
return getDistances(pointA, pointB).distance;
|
package/esm/exports.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsparticles/engine",
|
|
3
|
-
"version": "4.0.0-alpha.
|
|
3
|
+
"version": "4.0.0-alpha.25",
|
|
4
4
|
"description": "Easily create highly customizable particle, confetti and fireworks animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.",
|
|
5
5
|
"homepage": "https://particles.js.org",
|
|
6
6
|
"scripts": {
|
package/report.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8"/>
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
6
|
-
<title>@tsparticles/engine [
|
|
6
|
+
<title>@tsparticles/engine [21 Feb 2026 at 12:47]</title>
|
|
7
7
|
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
|
|
8
8
|
|
|
9
9
|
<script>
|