@codexo/exojs-particles 0.15.3 → 0.16.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/README.md +21 -43
- package/dist/esm/ParticleStorage.d.ts +188 -0
- package/dist/esm/ParticleStorage.d.ts.map +1 -0
- package/dist/esm/ParticleStorage.js +208 -0
- package/dist/esm/ParticleStorage.js.map +1 -0
- package/dist/esm/ParticleSystem.d.ts +189 -60
- package/dist/esm/ParticleSystem.d.ts.map +1 -0
- package/dist/esm/ParticleSystem.js +660 -560
- package/dist/esm/ParticleSystem.js.map +1 -1
- package/dist/esm/distributions/BoxArea.d.ts +1 -0
- package/dist/esm/distributions/BoxArea.d.ts.map +1 -0
- package/dist/esm/distributions/BoxArea.js +38 -44
- package/dist/esm/distributions/BoxArea.js.map +1 -1
- package/dist/esm/distributions/CircleArea.d.ts +1 -0
- package/dist/esm/distributions/CircleArea.d.ts.map +1 -0
- package/dist/esm/distributions/CircleArea.js +30 -28
- package/dist/esm/distributions/CircleArea.js.map +1 -1
- package/dist/esm/distributions/ColorGradient.d.ts +3 -2
- package/dist/esm/distributions/ColorGradient.d.ts.map +1 -0
- package/dist/esm/distributions/ColorGradient.js +70 -75
- package/dist/esm/distributions/ColorGradient.js.map +1 -1
- package/dist/esm/distributions/ConeDirection.d.ts +2 -1
- package/dist/esm/distributions/ConeDirection.d.ts.map +1 -0
- package/dist/esm/distributions/ConeDirection.js +41 -39
- package/dist/esm/distributions/ConeDirection.js.map +1 -1
- package/dist/esm/distributions/Constant.d.ts +1 -0
- package/dist/esm/distributions/Constant.d.ts.map +1 -0
- package/dist/esm/distributions/Constant.js +32 -32
- package/dist/esm/distributions/Constant.js.map +1 -1
- package/dist/esm/distributions/Curve.d.ts +2 -1
- package/dist/esm/distributions/Curve.d.ts.map +1 -0
- package/dist/esm/distributions/Curve.js +46 -55
- package/dist/esm/distributions/Curve.js.map +1 -1
- package/dist/esm/distributions/Distribution.d.ts +4 -3
- package/dist/esm/distributions/Distribution.d.ts.map +1 -0
- package/dist/esm/distributions/LineSegment.d.ts +1 -0
- package/dist/esm/distributions/LineSegment.d.ts.map +1 -0
- package/dist/esm/distributions/LineSegment.js +25 -23
- package/dist/esm/distributions/LineSegment.js.map +1 -1
- package/dist/esm/distributions/Range.d.ts +1 -0
- package/dist/esm/distributions/Range.d.ts.map +1 -0
- package/dist/esm/distributions/Range.js +18 -16
- package/dist/esm/distributions/Range.js.map +1 -1
- package/dist/esm/distributions/VectorRange.d.ts +1 -0
- package/dist/esm/distributions/VectorRange.d.ts.map +1 -0
- package/dist/esm/distributions/VectorRange.js +29 -27
- package/dist/esm/distributions/VectorRange.js.map +1 -1
- package/dist/esm/distributions/index.d.ts +1 -0
- package/dist/esm/distributions/index.d.ts.map +1 -0
- package/dist/esm/gpu/ParticleGpuState.d.ts +143 -18
- package/dist/esm/gpu/ParticleGpuState.d.ts.map +1 -0
- package/dist/esm/gpu/ParticleGpuState.js +655 -497
- package/dist/esm/gpu/ParticleGpuState.js.map +1 -1
- package/dist/esm/gpu/shaders/particle-simulate.wgsl.js +6 -0
- package/dist/esm/gpu/shaders/particle-simulate.wgsl.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +39 -32
- package/dist/esm/modules/AlphaFadeOverLifetime.d.ts +4 -3
- package/dist/esm/modules/AlphaFadeOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/AlphaFadeOverLifetime.js +68 -55
- package/dist/esm/modules/AlphaFadeOverLifetime.js.map +1 -1
- package/dist/esm/modules/ApplyForce.d.ts +4 -3
- package/dist/esm/modules/ApplyForce.d.ts.map +1 -0
- package/dist/esm/modules/ApplyForce.js +49 -43
- package/dist/esm/modules/ApplyForce.js.map +1 -1
- package/dist/esm/modules/AttractToPoint.d.ts +4 -3
- package/dist/esm/modules/AttractToPoint.d.ts.map +1 -0
- package/dist/esm/modules/AttractToPoint.js +73 -62
- package/dist/esm/modules/AttractToPoint.js.map +1 -1
- package/dist/esm/modules/BurstSpawn.d.ts +6 -18
- package/dist/esm/modules/BurstSpawn.d.ts.map +1 -0
- package/dist/esm/modules/BurstSpawn.js +56 -91
- package/dist/esm/modules/BurstSpawn.js.map +1 -1
- package/dist/esm/modules/ColorOverLifetime.d.ts +4 -3
- package/dist/esm/modules/ColorOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/ColorOverLifetime.js +65 -53
- package/dist/esm/modules/ColorOverLifetime.js.map +1 -1
- package/dist/esm/modules/ColorOverSpeed.d.ts +5 -4
- package/dist/esm/modules/ColorOverSpeed.d.ts.map +1 -0
- package/dist/esm/modules/ColorOverSpeed.js +90 -75
- package/dist/esm/modules/ColorOverSpeed.js.map +1 -1
- package/dist/esm/modules/DeathModule.d.ts +26 -10
- package/dist/esm/modules/DeathModule.d.ts.map +1 -0
- package/dist/esm/modules/DeathModule.js +38 -22
- package/dist/esm/modules/DeathModule.js.map +1 -1
- package/dist/esm/modules/Drag.d.ts +3 -2
- package/dist/esm/modules/Drag.d.ts.map +1 -0
- package/dist/esm/modules/Drag.js +43 -37
- package/dist/esm/modules/Drag.js.map +1 -1
- package/dist/esm/modules/OrbitalForce.d.ts +4 -3
- package/dist/esm/modules/OrbitalForce.d.ts.map +1 -0
- package/dist/esm/modules/OrbitalForce.js +70 -58
- package/dist/esm/modules/OrbitalForce.js.map +1 -1
- package/dist/esm/modules/RateSpawn.d.ts +7 -22
- package/dist/esm/modules/RateSpawn.d.ts.map +1 -0
- package/dist/esm/modules/RateSpawn.js +39 -71
- package/dist/esm/modules/RateSpawn.js.map +1 -1
- package/dist/esm/modules/RepelFromPoint.d.ts +4 -3
- package/dist/esm/modules/RepelFromPoint.d.ts.map +1 -0
- package/dist/esm/modules/RepelFromPoint.js +72 -62
- package/dist/esm/modules/RepelFromPoint.js.map +1 -1
- package/dist/esm/modules/RotateOverLifetime.d.ts +3 -2
- package/dist/esm/modules/RotateOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/RotateOverLifetime.js +40 -36
- package/dist/esm/modules/RotateOverLifetime.js.map +1 -1
- package/dist/esm/modules/ScaleOverLifetime.d.ts +5 -4
- package/dist/esm/modules/ScaleOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/ScaleOverLifetime.js +60 -50
- package/dist/esm/modules/ScaleOverLifetime.js.map +1 -1
- package/dist/esm/modules/SpawnModule.d.ts +15 -12
- package/dist/esm/modules/SpawnModule.d.ts.map +1 -0
- package/dist/esm/modules/SpawnModule.js +32 -28
- package/dist/esm/modules/SpawnModule.js.map +1 -1
- package/dist/esm/modules/SpawnOnDeath.d.ts +13 -9
- package/dist/esm/modules/SpawnOnDeath.d.ts.map +1 -0
- package/dist/esm/modules/SpawnOnDeath.js +41 -43
- package/dist/esm/modules/SpawnOnDeath.js.map +1 -1
- package/dist/esm/modules/Turbulence.d.ts +4 -3
- package/dist/esm/modules/Turbulence.d.ts.map +1 -0
- package/dist/esm/modules/Turbulence.js +101 -89
- package/dist/esm/modules/Turbulence.js.map +1 -1
- package/dist/esm/modules/UpdateModule.d.ts +21 -13
- package/dist/esm/modules/UpdateModule.d.ts.map +1 -0
- package/dist/esm/modules/UpdateModule.js +65 -63
- package/dist/esm/modules/UpdateModule.js.map +1 -1
- package/dist/esm/modules/VelocityOverLifetime.d.ts +7 -6
- package/dist/esm/modules/VelocityOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/VelocityOverLifetime.js +75 -73
- package/dist/esm/modules/VelocityOverLifetime.js.map +1 -1
- package/dist/esm/modules/WgslContribution.d.ts +16 -15
- package/dist/esm/modules/WgslContribution.d.ts.map +1 -0
- package/dist/esm/modules/WgslContribution.js +37 -29
- package/dist/esm/modules/WgslContribution.js.map +1 -1
- package/dist/esm/modules/index.d.ts +3 -1
- package/dist/esm/modules/index.d.ts.map +1 -0
- package/dist/esm/modules/spawnFields.d.ts +32 -0
- package/dist/esm/modules/spawnFields.d.ts.map +1 -0
- package/dist/esm/modules/spawnFields.js +31 -0
- package/dist/esm/modules/spawnFields.js.map +1 -0
- package/dist/esm/particlesBuildInfo.d.ts +1 -0
- package/dist/esm/particlesBuildInfo.d.ts.map +1 -0
- package/dist/esm/particlesBuildInfo.js +6 -4
- package/dist/esm/particlesBuildInfo.js.map +1 -1
- package/dist/esm/particlesExtension.d.ts +13 -5
- package/dist/esm/particlesExtension.d.ts.map +1 -0
- package/dist/esm/particlesExtension.js +38 -42
- package/dist/esm/particlesExtension.js.map +1 -1
- package/dist/esm/public.d.ts +11 -0
- package/dist/esm/public.d.ts.map +1 -0
- package/dist/esm/renderModes/MeshParticles.d.ts +128 -0
- package/dist/esm/renderModes/MeshParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/MeshParticles.js +263 -0
- package/dist/esm/renderModes/MeshParticles.js.map +1 -0
- package/dist/esm/renderModes/ParticleBufferLayout.d.ts +59 -0
- package/dist/esm/renderModes/ParticleBufferLayout.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleBufferLayout.js +99 -0
- package/dist/esm/renderModes/ParticleBufferLayout.js.map +1 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.d.ts +58 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.js +173 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.js.map +1 -0
- package/dist/esm/renderModes/ParticleMaterial.d.ts +18 -0
- package/dist/esm/renderModes/ParticleMaterial.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleMaterial.js +24 -0
- package/dist/esm/renderModes/ParticleMaterial.js.map +1 -0
- package/dist/esm/renderModes/ParticleRenderMode.d.ts +114 -0
- package/dist/esm/renderModes/ParticleRenderMode.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleRenderMode.js +99 -0
- package/dist/esm/renderModes/ParticleRenderMode.js.map +1 -0
- package/dist/esm/renderModes/QuadParticles.d.ts +55 -0
- package/dist/esm/renderModes/QuadParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/QuadParticles.js +95 -0
- package/dist/esm/renderModes/QuadParticles.js.map +1 -0
- package/dist/esm/renderModes/RibbonParticles.d.ts +96 -0
- package/dist/esm/renderModes/RibbonParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/RibbonParticles.js +202 -0
- package/dist/esm/renderModes/RibbonParticles.js.map +1 -0
- package/dist/esm/renderModes/shaders/mesh-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/mesh-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/mesh.vert.js +6 -0
- package/dist/esm/renderModes/shaders/mesh.vert.js.map +1 -0
- package/dist/esm/renderModes/shaders/quad-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/quad-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon.frag.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon.frag.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon.vert.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon.vert.js.map +1 -0
- package/dist/esm/renderers/WebGl2ParticleRenderer.d.ts +48 -20
- package/dist/esm/renderers/WebGl2ParticleRenderer.d.ts.map +1 -0
- package/dist/esm/renderers/WebGl2ParticleRenderer.js +317 -321
- package/dist/esm/renderers/WebGl2ParticleRenderer.js.map +1 -1
- package/dist/esm/renderers/WebGpuParticleRenderer.d.ts +99 -18
- package/dist/esm/renderers/WebGpuParticleRenderer.d.ts.map +1 -0
- package/dist/esm/renderers/WebGpuParticleRenderer.js +542 -551
- package/dist/esm/renderers/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/renderers/shaders/particle.frag.js +6 -0
- package/dist/esm/renderers/shaders/particle.frag.js.map +1 -0
- package/dist/esm/renderers/shaders/particle.vert.js +6 -0
- package/dist/esm/renderers/shaders/particle.vert.js.map +1 -0
- package/package.json +8 -15
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/register.d.ts +0 -1
- package/dist/esm/register.js +0 -43
- package/dist/esm/register.js.map +0 -1
- package/dist/esm/renderers/glsl/particle.frag.js +0 -4
- package/dist/esm/renderers/glsl/particle.frag.js.map +0 -1
- package/dist/esm/renderers/glsl/particle.vert.js +0 -4
- package/dist/esm/renderers/glsl/particle.vert.js.map +0 -1
|
@@ -1,44 +1,46 @@
|
|
|
1
|
-
import { Vector } from
|
|
1
|
+
import { Vector } from "@codexo/exojs";
|
|
2
2
|
|
|
3
|
+
//#region src/distributions/ConeDirection.ts
|
|
3
4
|
const tau = Math.PI * 2;
|
|
4
5
|
/**
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class ConeDirection {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
6
|
+
* Random unit vector inside a cone, scaled by a speed magnitude.
|
|
7
|
+
*
|
|
8
|
+
* The cone is centred on `directionAngle` (in radians, 0 = +X, π/2 = +Y for
|
|
9
|
+
* screen-down coordinates) and spans `±halfAngle` radians around it. Speed
|
|
10
|
+
* is sampled uniformly in `[minSpeed, maxSpeed]`.
|
|
11
|
+
*
|
|
12
|
+
* Use for emission cones, explosions, fountain spread - anywhere the
|
|
13
|
+
* direction has a preferred axis with bounded variance.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* // Upward fountain with ±15° spread, 200-300 px/s:
|
|
17
|
+
* const up = new ConeDirection(-Math.PI / 2, Math.PI / 12, 200, 300);
|
|
18
|
+
* up.sample(particle.velocity);
|
|
19
|
+
*/
|
|
20
|
+
var ConeDirection = class ConeDirection {
|
|
21
|
+
directionAngle;
|
|
22
|
+
halfAngle;
|
|
23
|
+
minSpeed;
|
|
24
|
+
maxSpeed;
|
|
25
|
+
_scratch = new Vector();
|
|
26
|
+
constructor(directionAngle, halfAngle, minSpeed, maxSpeed) {
|
|
27
|
+
this.directionAngle = directionAngle;
|
|
28
|
+
this.halfAngle = halfAngle;
|
|
29
|
+
this.minSpeed = minSpeed;
|
|
30
|
+
this.maxSpeed = maxSpeed;
|
|
31
|
+
}
|
|
32
|
+
sample(out = this._scratch) {
|
|
33
|
+
const angle = this.directionAngle + (Math.random() * 2 - 1) * this.halfAngle;
|
|
34
|
+
const speed = this.minSpeed + Math.random() * (this.maxSpeed - this.minSpeed);
|
|
35
|
+
out.set(Math.cos(angle) * speed, Math.sin(angle) * speed);
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
/** Convenience: omnidirectional emission (full circle, 0..2π). */
|
|
39
|
+
static omni(minSpeed, maxSpeed) {
|
|
40
|
+
return new ConeDirection(0, tau / 2, minSpeed, maxSpeed);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
42
43
|
|
|
44
|
+
//#endregion
|
|
43
45
|
export { ConeDirection };
|
|
44
|
-
//# sourceMappingURL=ConeDirection.js.map
|
|
46
|
+
//# sourceMappingURL=ConeDirection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConeDirection.js","sources":["
|
|
1
|
+
{"version":3,"file":"ConeDirection.js","names":[],"sources":["../../../src/distributions/ConeDirection.ts"],"sourcesContent":["import { Vector } from '@codexo/exojs';\n\nimport type { Distribution } from './Distribution';\n\nconst tau = Math.PI * 2;\n\n/**\n * Random unit vector inside a cone, scaled by a speed magnitude.\n *\n * The cone is centred on `directionAngle` (in radians, 0 = +X, π/2 = +Y for\n * screen-down coordinates) and spans `±halfAngle` radians around it. Speed\n * is sampled uniformly in `[minSpeed, maxSpeed]`.\n *\n * Use for emission cones, explosions, fountain spread - anywhere the\n * direction has a preferred axis with bounded variance.\n *\n * @example\n * // Upward fountain with ±15° spread, 200-300 px/s:\n * const up = new ConeDirection(-Math.PI / 2, Math.PI / 12, 200, 300);\n * up.sample(particle.velocity);\n */\nexport class ConeDirection implements Distribution<Vector> {\n private readonly _scratch = new Vector();\n\n public constructor(\n public directionAngle: number,\n public halfAngle: number,\n public minSpeed: number,\n public maxSpeed: number,\n ) {}\n\n public sample(out: Vector = this._scratch): Vector {\n const angle = this.directionAngle + (Math.random() * 2 - 1) * this.halfAngle;\n const speed = this.minSpeed + Math.random() * (this.maxSpeed - this.minSpeed);\n\n out.set(Math.cos(angle) * speed, Math.sin(angle) * speed);\n\n return out;\n }\n\n /** Convenience: omnidirectional emission (full circle, 0..2π). */\n public static omni(minSpeed: number, maxSpeed: number): ConeDirection {\n return new ConeDirection(0, tau / 2, minSpeed, maxSpeed);\n }\n}\n"],"mappings":";;;AAIA,MAAM,MAAM,KAAK,KAAK;;;;;;;;;;;;;;;;AAiBtB,IAAa,gBAAb,MAAa,cAA8C;CAIhD;CACA;CACA;CACA;CANT,AAAiB,WAAW,IAAI,OAAO;CAEvC,AAAO,YACL,AAAO,gBACP,AAAO,WACP,AAAO,UACP,AAAO,UACP;EAJO;EACA;EACA;EACA;CACN;CAEH,AAAO,OAAO,MAAc,KAAK,UAAkB;EACjD,MAAM,QAAQ,KAAK,kBAAkB,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK;EACnE,MAAM,QAAQ,KAAK,WAAW,KAAK,OAAO,KAAK,KAAK,WAAW,KAAK;EAEpE,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK;EAExD,OAAO;CACT;;CAGA,OAAc,KAAK,UAAkB,UAAiC;EACpE,OAAO,IAAI,cAAc,GAAG,MAAM,GAAG,UAAU,QAAQ;CACzD;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constant.d.ts","sourceRoot":"","sources":["../../../src/distributions/Constant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAErE;;;;;;;;GAQG;AACH,qBAAa,QAAQ,CAAC,CAAC,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC5C,KAAK,EAAE,CAAC;gBAAR,KAAK,EAAE,CAAC;IAE3B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;IAIlB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;IAIvC,OAAO,CAAC,aAAa;CAetB"}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
+
//#region src/distributions/Constant.ts
|
|
1
2
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
}
|
|
3
|
+
* Distribution that always returns the same value. Implements both
|
|
4
|
+
* {@link Distribution} and {@link LifetimeFunction} so it can stand in
|
|
5
|
+
* wherever a randomized or time-parameterised value is expected.
|
|
6
|
+
*
|
|
7
|
+
* For mutable types (Vector, Color, ...) the constant value is copied into
|
|
8
|
+
* `out` if provided, otherwise the constructor's value is returned directly.
|
|
9
|
+
* Mutating that returned reference mutates the distribution's source.
|
|
10
|
+
*/
|
|
11
|
+
var Constant = class {
|
|
12
|
+
value;
|
|
13
|
+
constructor(value) {
|
|
14
|
+
this.value = value;
|
|
15
|
+
}
|
|
16
|
+
sample(out) {
|
|
17
|
+
return this._copyOrReturn(out);
|
|
18
|
+
}
|
|
19
|
+
evaluate(_t, out) {
|
|
20
|
+
return this._copyOrReturn(out);
|
|
21
|
+
}
|
|
22
|
+
_copyOrReturn(out) {
|
|
23
|
+
if (out === void 0 || out === null) return this.value;
|
|
24
|
+
const target = out;
|
|
25
|
+
if (typeof target.copy === "function") {
|
|
26
|
+
target.copy(this.value);
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
return this.value;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
33
32
|
|
|
33
|
+
//#endregion
|
|
34
34
|
export { Constant };
|
|
35
|
-
//# sourceMappingURL=Constant.js.map
|
|
35
|
+
//# sourceMappingURL=Constant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Constant.js","sources":["
|
|
1
|
+
{"version":3,"file":"Constant.js","names":[],"sources":["../../../src/distributions/Constant.ts"],"sourcesContent":["import type { Distribution, LifetimeFunction } from './Distribution';\n\n/**\n * Distribution that always returns the same value. Implements both\n * {@link Distribution} and {@link LifetimeFunction} so it can stand in\n * wherever a randomized or time-parameterised value is expected.\n *\n * For mutable types (Vector, Color, ...) the constant value is copied into\n * `out` if provided, otherwise the constructor's value is returned directly.\n * Mutating that returned reference mutates the distribution's source.\n */\nexport class Constant<T> implements Distribution<T>, LifetimeFunction<T> {\n public constructor(public value: T) {}\n\n public sample(out?: T): T {\n return this._copyOrReturn(out);\n }\n\n public evaluate(_t: number, out?: T): T {\n return this._copyOrReturn(out);\n }\n\n private _copyOrReturn(out?: T): T {\n if (out === undefined || out === null) {\n return this.value;\n }\n\n const target = out as { copy?: (src: T) => unknown };\n\n if (typeof target.copy === 'function') {\n target.copy(this.value);\n\n return out;\n }\n\n return this.value;\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,WAAb,MAAyE;CAC7C;CAA1B,AAAO,YAAY,AAAO,OAAU;EAAV;CAAW;CAErC,AAAO,OAAO,KAAY;EACxB,OAAO,KAAK,cAAc,GAAG;CAC/B;CAEA,AAAO,SAAS,IAAY,KAAY;EACtC,OAAO,KAAK,cAAc,GAAG;CAC/B;CAEA,AAAQ,cAAc,KAAY;EAChC,IAAI,QAAQ,UAAa,QAAQ,MAC/B,OAAO,KAAK;EAGd,MAAM,SAAS;EAEf,IAAI,OAAO,OAAO,SAAS,YAAY;GACrC,OAAO,KAAK,KAAK,KAAK;GAEtB,OAAO;EACT;EAEA,OAAO,KAAK;CACd;AACF"}
|
|
@@ -7,7 +7,7 @@ export interface CurveKey {
|
|
|
7
7
|
/**
|
|
8
8
|
* Piecewise-linear keyframe curve sampled by lifetime ratio `t` in `[0, 1]`.
|
|
9
9
|
*
|
|
10
|
-
* Keyframes are stored sorted by `t` and clamped at the endpoints
|
|
10
|
+
* Keyframes are stored sorted by `t` and clamped at the endpoints - sampling
|
|
11
11
|
* outside the keyframe range returns the nearest endpoint value. The
|
|
12
12
|
* implementation tracks the last accessed segment so monotonically advancing
|
|
13
13
|
* `t` (the typical case for per-particle lifetime sampling) costs O(1)
|
|
@@ -28,3 +28,4 @@ export declare class Curve implements LifetimeFunction<number> {
|
|
|
28
28
|
constructor(keys: readonly CurveKey[]);
|
|
29
29
|
evaluate(t: number): number;
|
|
30
30
|
}
|
|
31
|
+
//# sourceMappingURL=Curve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Curve.d.ts","sourceRoot":"","sources":["../../../src/distributions/Curve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,KAAM,YAAW,gBAAgB,CAAC,MAAM,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,YAAY,CAAK;gBAEN,IAAI,EAAE,SAAS,QAAQ,EAAE;IAQrC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAiCnC"}
|
|
@@ -1,59 +1,50 @@
|
|
|
1
|
+
//#region src/distributions/Curve.ts
|
|
1
2
|
const compareT = (a, b) => a.t - b.t;
|
|
2
3
|
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
segment++;
|
|
47
|
-
}
|
|
48
|
-
this._lastSegment = segment;
|
|
49
|
-
const a = keys[segment];
|
|
50
|
-
const b = keys[segment + 1];
|
|
51
|
-
if (a === undefined || b === undefined)
|
|
52
|
-
return lastKey.v;
|
|
53
|
-
const ratio = (t - a.t) / (b.t - a.t);
|
|
54
|
-
return a.v + (b.v - a.v) * ratio;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
4
|
+
* Piecewise-linear keyframe curve sampled by lifetime ratio `t` in `[0, 1]`.
|
|
5
|
+
*
|
|
6
|
+
* Keyframes are stored sorted by `t` and clamped at the endpoints - sampling
|
|
7
|
+
* outside the keyframe range returns the nearest endpoint value. The
|
|
8
|
+
* implementation tracks the last accessed segment so monotonically advancing
|
|
9
|
+
* `t` (the typical case for per-particle lifetime sampling) costs O(1)
|
|
10
|
+
* amortized per call instead of O(log n).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // Scale pulses up then down over lifetime:
|
|
14
|
+
* const sizeCurve = new Curve([
|
|
15
|
+
* { t: 0, v: 0.2 },
|
|
16
|
+
* { t: 0.4, v: 1.5 },
|
|
17
|
+
* { t: 1, v: 0.0 },
|
|
18
|
+
* ]);
|
|
19
|
+
* scale.x = scale.y = sizeCurve.evaluate(particle.elapsedRatio);
|
|
20
|
+
*/
|
|
21
|
+
var Curve = class {
|
|
22
|
+
_keys;
|
|
23
|
+
_lastSegment = 0;
|
|
24
|
+
constructor(keys) {
|
|
25
|
+
if (keys.length === 0) throw new Error("Curve requires at least one keyframe.");
|
|
26
|
+
this._keys = [...keys].sort(compareT);
|
|
27
|
+
}
|
|
28
|
+
evaluate(t) {
|
|
29
|
+
const keys = this._keys;
|
|
30
|
+
const last = keys.length - 1;
|
|
31
|
+
const first = keys[0];
|
|
32
|
+
const lastKey = keys[last];
|
|
33
|
+
if (first === void 0 || lastKey === void 0) return 0;
|
|
34
|
+
if (t <= first.t) return first.v;
|
|
35
|
+
if (t >= lastKey.t) return lastKey.v;
|
|
36
|
+
let segment = this._lastSegment;
|
|
37
|
+
if (t < (keys[segment]?.t ?? 0)) segment = 0;
|
|
38
|
+
while (segment < last && t > (keys[segment + 1]?.t ?? Infinity)) segment++;
|
|
39
|
+
this._lastSegment = segment;
|
|
40
|
+
const a = keys[segment];
|
|
41
|
+
const b = keys[segment + 1];
|
|
42
|
+
if (a === void 0 || b === void 0) return lastKey.v;
|
|
43
|
+
const ratio = (t - a.t) / (b.t - a.t);
|
|
44
|
+
return a.v + (b.v - a.v) * ratio;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
57
47
|
|
|
48
|
+
//#endregion
|
|
58
49
|
export { Curve };
|
|
59
|
-
//# sourceMappingURL=Curve.js.map
|
|
50
|
+
//# sourceMappingURL=Curve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Curve.js","sources":["
|
|
1
|
+
{"version":3,"file":"Curve.js","names":[],"sources":["../../../src/distributions/Curve.ts"],"sourcesContent":["import type { LifetimeFunction } from './Distribution';\n\n/** A keyframe in a {@link Curve}: value `v` at lifetime ratio `t` in `[0, 1]`. */\nexport interface CurveKey {\n t: number;\n v: number;\n}\n\nconst compareT = (a: CurveKey, b: CurveKey): number => a.t - b.t;\n\n/**\n * Piecewise-linear keyframe curve sampled by lifetime ratio `t` in `[0, 1]`.\n *\n * Keyframes are stored sorted by `t` and clamped at the endpoints - sampling\n * outside the keyframe range returns the nearest endpoint value. The\n * implementation tracks the last accessed segment so monotonically advancing\n * `t` (the typical case for per-particle lifetime sampling) costs O(1)\n * amortized per call instead of O(log n).\n *\n * @example\n * // Scale pulses up then down over lifetime:\n * const sizeCurve = new Curve([\n * { t: 0, v: 0.2 },\n * { t: 0.4, v: 1.5 },\n * { t: 1, v: 0.0 },\n * ]);\n * scale.x = scale.y = sizeCurve.evaluate(particle.elapsedRatio);\n */\nexport class Curve implements LifetimeFunction<number> {\n private readonly _keys: CurveKey[];\n private _lastSegment = 0;\n\n public constructor(keys: readonly CurveKey[]) {\n if (keys.length === 0) {\n throw new Error('Curve requires at least one keyframe.');\n }\n\n this._keys = [...keys].sort(compareT);\n }\n\n public evaluate(t: number): number {\n const keys = this._keys;\n const last = keys.length - 1;\n const first = keys[0];\n const lastKey = keys[last];\n\n if (first === undefined || lastKey === undefined) return 0;\n\n if (t <= first.t) return first.v;\n if (t >= lastKey.t) return lastKey.v;\n\n // Cache-friendly forward search: most callers sweep t monotonically.\n let segment = this._lastSegment;\n\n if (t < (keys[segment]?.t ?? 0)) {\n segment = 0;\n }\n\n while (segment < last && t > (keys[segment + 1]?.t ?? Infinity)) {\n segment++;\n }\n\n this._lastSegment = segment;\n\n const a = keys[segment];\n const b = keys[segment + 1];\n\n if (a === undefined || b === undefined) return lastKey.v;\n\n const ratio = (t - a.t) / (b.t - a.t);\n\n return a.v + (b.v - a.v) * ratio;\n }\n}\n"],"mappings":";AAQA,MAAM,YAAY,GAAa,MAAwB,EAAE,IAAI,EAAE;;;;;;;;;;;;;;;;;;;AAoB/D,IAAa,QAAb,MAAuD;CACrD,AAAiB;CACjB,AAAQ,eAAe;CAEvB,AAAO,YAAY,MAA2B;EAC5C,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,uCAAuC;EAGzD,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,QAAQ;CACtC;CAEA,AAAO,SAAS,GAAmB;EACjC,MAAM,OAAO,KAAK;EAClB,MAAM,OAAO,KAAK,SAAS;EAC3B,MAAM,QAAQ,KAAK;EACnB,MAAM,UAAU,KAAK;EAErB,IAAI,UAAU,UAAa,YAAY,QAAW,OAAO;EAEzD,IAAI,KAAK,MAAM,GAAG,OAAO,MAAM;EAC/B,IAAI,KAAK,QAAQ,GAAG,OAAO,QAAQ;EAGnC,IAAI,UAAU,KAAK;EAEnB,IAAI,KAAK,KAAK,QAAQ,EAAE,KAAK,IAC3B,UAAU;EAGZ,OAAO,UAAU,QAAQ,KAAK,KAAK,UAAU,EAAE,EAAE,KAAK,WACpD;EAGF,KAAK,eAAe;EAEpB,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,KAAK,UAAU;EAEzB,IAAI,MAAM,UAAa,MAAM,QAAW,OAAO,QAAQ;EAEvD,MAAM,SAAS,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;EAEnC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;CAC7B;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Value distribution sampled at particle spawn time. Each `sample()` call
|
|
3
|
-
* may return a different value
|
|
3
|
+
* may return a different value - used to randomize spawn properties
|
|
4
4
|
* (lifetime, position, velocity, scale, tint, ...) without per-particle
|
|
5
5
|
* subclassing.
|
|
6
6
|
*
|
|
@@ -34,12 +34,13 @@ export interface Distribution<T> {
|
|
|
34
34
|
/**
|
|
35
35
|
* Lifetime-parameterised function that produces a deterministic `T` for a
|
|
36
36
|
* given lifetime ratio `t` in `[0, 1]`. Used by per-frame update modules
|
|
37
|
-
* that interpolate over particle lifetime
|
|
37
|
+
* that interpolate over particle lifetime - `ColorOverLifetime` (ColorGradient),
|
|
38
38
|
* `ScaleOverLifetime` (Curve), etc.
|
|
39
39
|
*
|
|
40
|
-
* Mutable-target rule: same as {@link Distribution}
|
|
40
|
+
* Mutable-target rule: same as {@link Distribution} - pass your own scratch
|
|
41
41
|
* via `out` for hot loops, omit for one-off calls.
|
|
42
42
|
*/
|
|
43
43
|
export interface LifetimeFunction<T> {
|
|
44
44
|
evaluate(t: number, out?: T): T;
|
|
45
45
|
}
|
|
46
|
+
//# sourceMappingURL=Distribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Distribution.d.ts","sourceRoot":"","sources":["../../../src/distributions/Distribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineSegment.d.ts","sourceRoot":"","sources":["../../../src/distributions/LineSegment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;GAGG;AACH,qBAAa,WAAY,YAAW,YAAY,CAAC,MAAM,CAAC;IAI7C,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IANnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAGhC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM;IAGZ,MAAM,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM;CAOnD"}
|
|
@@ -1,27 +1,29 @@
|
|
|
1
|
-
import { Vector } from
|
|
1
|
+
import { Vector } from "@codexo/exojs";
|
|
2
2
|
|
|
3
|
+
//#region src/distributions/LineSegment.ts
|
|
3
4
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
5
|
+
* Random point on a line segment between `(x0, y0)` and `(x1, y1)`. Uniform
|
|
6
|
+
* parameter distribution: `t = Math.random()` then `lerp(start, end, t)`.
|
|
7
|
+
*/
|
|
8
|
+
var LineSegment = class {
|
|
9
|
+
x0;
|
|
10
|
+
y0;
|
|
11
|
+
x1;
|
|
12
|
+
y1;
|
|
13
|
+
_scratch = new Vector();
|
|
14
|
+
constructor(x0, y0, x1, y1) {
|
|
15
|
+
this.x0 = x0;
|
|
16
|
+
this.y0 = y0;
|
|
17
|
+
this.x1 = x1;
|
|
18
|
+
this.y1 = y1;
|
|
19
|
+
}
|
|
20
|
+
sample(out = this._scratch) {
|
|
21
|
+
const t = Math.random();
|
|
22
|
+
out.set(this.x0 + (this.x1 - this.x0) * t, this.y0 + (this.y1 - this.y0) * t);
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
25
26
|
|
|
27
|
+
//#endregion
|
|
26
28
|
export { LineSegment };
|
|
27
|
-
//# sourceMappingURL=LineSegment.js.map
|
|
29
|
+
//# sourceMappingURL=LineSegment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineSegment.js","sources":["
|
|
1
|
+
{"version":3,"file":"LineSegment.js","names":[],"sources":["../../../src/distributions/LineSegment.ts"],"sourcesContent":["import { Vector } from '@codexo/exojs';\n\nimport type { Distribution } from './Distribution';\n\n/**\n * Random point on a line segment between `(x0, y0)` and `(x1, y1)`. Uniform\n * parameter distribution: `t = Math.random()` then `lerp(start, end, t)`.\n */\nexport class LineSegment implements Distribution<Vector> {\n private readonly _scratch = new Vector();\n\n public constructor(\n public x0: number,\n public y0: number,\n public x1: number,\n public y1: number,\n ) {}\n\n public sample(out: Vector = this._scratch): Vector {\n const t = Math.random();\n\n out.set(this.x0 + (this.x1 - this.x0) * t, this.y0 + (this.y1 - this.y0) * t);\n\n return out;\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,cAAb,MAAyD;CAI9C;CACA;CACA;CACA;CANT,AAAiB,WAAW,IAAI,OAAO;CAEvC,AAAO,YACL,AAAO,IACP,AAAO,IACP,AAAO,IACP,AAAO,IACP;EAJO;EACA;EACA;EACA;CACN;CAEH,AAAO,OAAO,MAAc,KAAK,UAAkB;EACjD,MAAM,IAAI,KAAK,OAAO;EAEtB,IAAI,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,GAAG,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,CAAC;EAE5E,OAAO;CACT;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Range.d.ts","sourceRoot":"","sources":["../../../src/distributions/Range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,KAAM,YAAW,YAAY,CAAC,MAAM,CAAC;IAEvC,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;gBADX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM;IAGb,MAAM,IAAI,MAAM;CAGxB"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
//#region src/distributions/Range.ts
|
|
1
2
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
3
|
+
* Uniform random number in `[min, max]`. Each `sample()` returns a fresh
|
|
4
|
+
* roll; the bounds are inclusive on both ends (modulo the rounding bias
|
|
5
|
+
* inherent to `Math.random()`).
|
|
6
|
+
*/
|
|
7
|
+
var Range = class {
|
|
8
|
+
min;
|
|
9
|
+
max;
|
|
10
|
+
constructor(min, max) {
|
|
11
|
+
this.min = min;
|
|
12
|
+
this.max = max;
|
|
13
|
+
}
|
|
14
|
+
sample() {
|
|
15
|
+
return this.min + Math.random() * (this.max - this.min);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
17
18
|
|
|
19
|
+
//#endregion
|
|
18
20
|
export { Range };
|
|
19
|
-
//# sourceMappingURL=Range.js.map
|
|
21
|
+
//# sourceMappingURL=Range.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Range.js","sources":["
|
|
1
|
+
{"version":3,"file":"Range.js","names":[],"sources":["../../../src/distributions/Range.ts"],"sourcesContent":["import type { Distribution } from './Distribution';\n\n/**\n * Uniform random number in `[min, max]`. Each `sample()` returns a fresh\n * roll; the bounds are inclusive on both ends (modulo the rounding bias\n * inherent to `Math.random()`).\n */\nexport class Range implements Distribution<number> {\n public constructor(\n public min: number,\n public max: number,\n ) {}\n\n public sample(): number {\n return this.min + Math.random() * (this.max - this.min);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,QAAb,MAAmD;CAExC;CACA;CAFT,AAAO,YACL,AAAO,KACP,AAAO,KACP;EAFO;EACA;CACN;CAEH,AAAO,SAAiB;EACtB,OAAO,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK;CACrD;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorRange.d.ts","sourceRoot":"","sources":["../../../src/distributions/VectorRange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;;GAQG;AACH,qBAAa,WAAY,YAAW,YAAY,CAAC,MAAM,CAAC;IAI7C,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IANrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAGhC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;IAGd,MAAM,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM;CAKnD"}
|
|
@@ -1,31 +1,33 @@
|
|
|
1
|
-
import { Vector } from
|
|
1
|
+
import { Vector } from "@codexo/exojs";
|
|
2
2
|
|
|
3
|
+
//#region src/distributions/VectorRange.ts
|
|
3
4
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
5
|
+
* Uniform random vector with each axis sampled independently in its own
|
|
6
|
+
* `[min, max]` range. Each `sample()` writes into the provided `out` Vector
|
|
7
|
+
* (or an internal scratch instance when `out` is omitted).
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const knockback = new VectorRange(-300, 300, -800, -200); // any X, upward Y
|
|
11
|
+
* knockback.sample(particle.velocity); // writes into existing instance, no alloc
|
|
12
|
+
*/
|
|
13
|
+
var VectorRange = class {
|
|
14
|
+
minX;
|
|
15
|
+
maxX;
|
|
16
|
+
minY;
|
|
17
|
+
maxY;
|
|
18
|
+
_scratch = new Vector();
|
|
19
|
+
constructor(minX, maxX, minY, maxY) {
|
|
20
|
+
this.minX = minX;
|
|
21
|
+
this.maxX = maxX;
|
|
22
|
+
this.minY = minY;
|
|
23
|
+
this.maxY = maxY;
|
|
24
|
+
}
|
|
25
|
+
sample(out = this._scratch) {
|
|
26
|
+
out.set(this.minX + Math.random() * (this.maxX - this.minX), this.minY + Math.random() * (this.maxY - this.minY));
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
29
30
|
|
|
31
|
+
//#endregion
|
|
30
32
|
export { VectorRange };
|
|
31
|
-
//# sourceMappingURL=VectorRange.js.map
|
|
33
|
+
//# sourceMappingURL=VectorRange.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorRange.js","sources":["
|
|
1
|
+
{"version":3,"file":"VectorRange.js","names":[],"sources":["../../../src/distributions/VectorRange.ts"],"sourcesContent":["import { Vector } from '@codexo/exojs';\n\nimport type { Distribution } from './Distribution';\n\n/**\n * Uniform random vector with each axis sampled independently in its own\n * `[min, max]` range. Each `sample()` writes into the provided `out` Vector\n * (or an internal scratch instance when `out` is omitted).\n *\n * @example\n * const knockback = new VectorRange(-300, 300, -800, -200); // any X, upward Y\n * knockback.sample(particle.velocity); // writes into existing instance, no alloc\n */\nexport class VectorRange implements Distribution<Vector> {\n private readonly _scratch = new Vector();\n\n public constructor(\n public minX: number,\n public maxX: number,\n public minY: number,\n public maxY: number,\n ) {}\n\n public sample(out: Vector = this._scratch): Vector {\n out.set(this.minX + Math.random() * (this.maxX - this.minX), this.minY + Math.random() * (this.maxY - this.minY));\n\n return out;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAa,cAAb,MAAyD;CAI9C;CACA;CACA;CACA;CANT,AAAiB,WAAW,IAAI,OAAO;CAEvC,AAAO,YACL,AAAO,MACP,AAAO,MACP,AAAO,MACP,AAAO,MACP;EAJO;EACA;EACA;EACA;CACN;CAEH,AAAO,OAAO,MAAc,KAAK,UAAkB;EACjD,IAAI,IAAI,KAAK,OAAO,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK;EAEhH,OAAO;CACT;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/distributions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|