@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.
Files changed (211) hide show
  1. package/README.md +21 -43
  2. package/dist/esm/ParticleStorage.d.ts +188 -0
  3. package/dist/esm/ParticleStorage.d.ts.map +1 -0
  4. package/dist/esm/ParticleStorage.js +208 -0
  5. package/dist/esm/ParticleStorage.js.map +1 -0
  6. package/dist/esm/ParticleSystem.d.ts +189 -60
  7. package/dist/esm/ParticleSystem.d.ts.map +1 -0
  8. package/dist/esm/ParticleSystem.js +660 -560
  9. package/dist/esm/ParticleSystem.js.map +1 -1
  10. package/dist/esm/distributions/BoxArea.d.ts +1 -0
  11. package/dist/esm/distributions/BoxArea.d.ts.map +1 -0
  12. package/dist/esm/distributions/BoxArea.js +38 -44
  13. package/dist/esm/distributions/BoxArea.js.map +1 -1
  14. package/dist/esm/distributions/CircleArea.d.ts +1 -0
  15. package/dist/esm/distributions/CircleArea.d.ts.map +1 -0
  16. package/dist/esm/distributions/CircleArea.js +30 -28
  17. package/dist/esm/distributions/CircleArea.js.map +1 -1
  18. package/dist/esm/distributions/ColorGradient.d.ts +3 -2
  19. package/dist/esm/distributions/ColorGradient.d.ts.map +1 -0
  20. package/dist/esm/distributions/ColorGradient.js +70 -75
  21. package/dist/esm/distributions/ColorGradient.js.map +1 -1
  22. package/dist/esm/distributions/ConeDirection.d.ts +2 -1
  23. package/dist/esm/distributions/ConeDirection.d.ts.map +1 -0
  24. package/dist/esm/distributions/ConeDirection.js +41 -39
  25. package/dist/esm/distributions/ConeDirection.js.map +1 -1
  26. package/dist/esm/distributions/Constant.d.ts +1 -0
  27. package/dist/esm/distributions/Constant.d.ts.map +1 -0
  28. package/dist/esm/distributions/Constant.js +32 -32
  29. package/dist/esm/distributions/Constant.js.map +1 -1
  30. package/dist/esm/distributions/Curve.d.ts +2 -1
  31. package/dist/esm/distributions/Curve.d.ts.map +1 -0
  32. package/dist/esm/distributions/Curve.js +46 -55
  33. package/dist/esm/distributions/Curve.js.map +1 -1
  34. package/dist/esm/distributions/Distribution.d.ts +4 -3
  35. package/dist/esm/distributions/Distribution.d.ts.map +1 -0
  36. package/dist/esm/distributions/LineSegment.d.ts +1 -0
  37. package/dist/esm/distributions/LineSegment.d.ts.map +1 -0
  38. package/dist/esm/distributions/LineSegment.js +25 -23
  39. package/dist/esm/distributions/LineSegment.js.map +1 -1
  40. package/dist/esm/distributions/Range.d.ts +1 -0
  41. package/dist/esm/distributions/Range.d.ts.map +1 -0
  42. package/dist/esm/distributions/Range.js +18 -16
  43. package/dist/esm/distributions/Range.js.map +1 -1
  44. package/dist/esm/distributions/VectorRange.d.ts +1 -0
  45. package/dist/esm/distributions/VectorRange.d.ts.map +1 -0
  46. package/dist/esm/distributions/VectorRange.js +29 -27
  47. package/dist/esm/distributions/VectorRange.js.map +1 -1
  48. package/dist/esm/distributions/index.d.ts +1 -0
  49. package/dist/esm/distributions/index.d.ts.map +1 -0
  50. package/dist/esm/gpu/ParticleGpuState.d.ts +143 -18
  51. package/dist/esm/gpu/ParticleGpuState.d.ts.map +1 -0
  52. package/dist/esm/gpu/ParticleGpuState.js +655 -497
  53. package/dist/esm/gpu/ParticleGpuState.js.map +1 -1
  54. package/dist/esm/gpu/shaders/particle-simulate.wgsl.js +6 -0
  55. package/dist/esm/gpu/shaders/particle-simulate.wgsl.js.map +1 -0
  56. package/dist/esm/index.d.ts +1 -0
  57. package/dist/esm/index.d.ts.map +1 -0
  58. package/dist/esm/index.js +39 -32
  59. package/dist/esm/modules/AlphaFadeOverLifetime.d.ts +4 -3
  60. package/dist/esm/modules/AlphaFadeOverLifetime.d.ts.map +1 -0
  61. package/dist/esm/modules/AlphaFadeOverLifetime.js +68 -55
  62. package/dist/esm/modules/AlphaFadeOverLifetime.js.map +1 -1
  63. package/dist/esm/modules/ApplyForce.d.ts +4 -3
  64. package/dist/esm/modules/ApplyForce.d.ts.map +1 -0
  65. package/dist/esm/modules/ApplyForce.js +49 -43
  66. package/dist/esm/modules/ApplyForce.js.map +1 -1
  67. package/dist/esm/modules/AttractToPoint.d.ts +4 -3
  68. package/dist/esm/modules/AttractToPoint.d.ts.map +1 -0
  69. package/dist/esm/modules/AttractToPoint.js +73 -62
  70. package/dist/esm/modules/AttractToPoint.js.map +1 -1
  71. package/dist/esm/modules/BurstSpawn.d.ts +6 -18
  72. package/dist/esm/modules/BurstSpawn.d.ts.map +1 -0
  73. package/dist/esm/modules/BurstSpawn.js +56 -91
  74. package/dist/esm/modules/BurstSpawn.js.map +1 -1
  75. package/dist/esm/modules/ColorOverLifetime.d.ts +4 -3
  76. package/dist/esm/modules/ColorOverLifetime.d.ts.map +1 -0
  77. package/dist/esm/modules/ColorOverLifetime.js +65 -53
  78. package/dist/esm/modules/ColorOverLifetime.js.map +1 -1
  79. package/dist/esm/modules/ColorOverSpeed.d.ts +5 -4
  80. package/dist/esm/modules/ColorOverSpeed.d.ts.map +1 -0
  81. package/dist/esm/modules/ColorOverSpeed.js +90 -75
  82. package/dist/esm/modules/ColorOverSpeed.js.map +1 -1
  83. package/dist/esm/modules/DeathModule.d.ts +26 -10
  84. package/dist/esm/modules/DeathModule.d.ts.map +1 -0
  85. package/dist/esm/modules/DeathModule.js +38 -22
  86. package/dist/esm/modules/DeathModule.js.map +1 -1
  87. package/dist/esm/modules/Drag.d.ts +3 -2
  88. package/dist/esm/modules/Drag.d.ts.map +1 -0
  89. package/dist/esm/modules/Drag.js +43 -37
  90. package/dist/esm/modules/Drag.js.map +1 -1
  91. package/dist/esm/modules/OrbitalForce.d.ts +4 -3
  92. package/dist/esm/modules/OrbitalForce.d.ts.map +1 -0
  93. package/dist/esm/modules/OrbitalForce.js +70 -58
  94. package/dist/esm/modules/OrbitalForce.js.map +1 -1
  95. package/dist/esm/modules/RateSpawn.d.ts +7 -22
  96. package/dist/esm/modules/RateSpawn.d.ts.map +1 -0
  97. package/dist/esm/modules/RateSpawn.js +39 -71
  98. package/dist/esm/modules/RateSpawn.js.map +1 -1
  99. package/dist/esm/modules/RepelFromPoint.d.ts +4 -3
  100. package/dist/esm/modules/RepelFromPoint.d.ts.map +1 -0
  101. package/dist/esm/modules/RepelFromPoint.js +72 -62
  102. package/dist/esm/modules/RepelFromPoint.js.map +1 -1
  103. package/dist/esm/modules/RotateOverLifetime.d.ts +3 -2
  104. package/dist/esm/modules/RotateOverLifetime.d.ts.map +1 -0
  105. package/dist/esm/modules/RotateOverLifetime.js +40 -36
  106. package/dist/esm/modules/RotateOverLifetime.js.map +1 -1
  107. package/dist/esm/modules/ScaleOverLifetime.d.ts +5 -4
  108. package/dist/esm/modules/ScaleOverLifetime.d.ts.map +1 -0
  109. package/dist/esm/modules/ScaleOverLifetime.js +60 -50
  110. package/dist/esm/modules/ScaleOverLifetime.js.map +1 -1
  111. package/dist/esm/modules/SpawnModule.d.ts +15 -12
  112. package/dist/esm/modules/SpawnModule.d.ts.map +1 -0
  113. package/dist/esm/modules/SpawnModule.js +32 -28
  114. package/dist/esm/modules/SpawnModule.js.map +1 -1
  115. package/dist/esm/modules/SpawnOnDeath.d.ts +13 -9
  116. package/dist/esm/modules/SpawnOnDeath.d.ts.map +1 -0
  117. package/dist/esm/modules/SpawnOnDeath.js +41 -43
  118. package/dist/esm/modules/SpawnOnDeath.js.map +1 -1
  119. package/dist/esm/modules/Turbulence.d.ts +4 -3
  120. package/dist/esm/modules/Turbulence.d.ts.map +1 -0
  121. package/dist/esm/modules/Turbulence.js +101 -89
  122. package/dist/esm/modules/Turbulence.js.map +1 -1
  123. package/dist/esm/modules/UpdateModule.d.ts +21 -13
  124. package/dist/esm/modules/UpdateModule.d.ts.map +1 -0
  125. package/dist/esm/modules/UpdateModule.js +65 -63
  126. package/dist/esm/modules/UpdateModule.js.map +1 -1
  127. package/dist/esm/modules/VelocityOverLifetime.d.ts +7 -6
  128. package/dist/esm/modules/VelocityOverLifetime.d.ts.map +1 -0
  129. package/dist/esm/modules/VelocityOverLifetime.js +75 -73
  130. package/dist/esm/modules/VelocityOverLifetime.js.map +1 -1
  131. package/dist/esm/modules/WgslContribution.d.ts +16 -15
  132. package/dist/esm/modules/WgslContribution.d.ts.map +1 -0
  133. package/dist/esm/modules/WgslContribution.js +37 -29
  134. package/dist/esm/modules/WgslContribution.js.map +1 -1
  135. package/dist/esm/modules/index.d.ts +3 -1
  136. package/dist/esm/modules/index.d.ts.map +1 -0
  137. package/dist/esm/modules/spawnFields.d.ts +32 -0
  138. package/dist/esm/modules/spawnFields.d.ts.map +1 -0
  139. package/dist/esm/modules/spawnFields.js +31 -0
  140. package/dist/esm/modules/spawnFields.js.map +1 -0
  141. package/dist/esm/particlesBuildInfo.d.ts +1 -0
  142. package/dist/esm/particlesBuildInfo.d.ts.map +1 -0
  143. package/dist/esm/particlesBuildInfo.js +6 -4
  144. package/dist/esm/particlesBuildInfo.js.map +1 -1
  145. package/dist/esm/particlesExtension.d.ts +13 -5
  146. package/dist/esm/particlesExtension.d.ts.map +1 -0
  147. package/dist/esm/particlesExtension.js +38 -42
  148. package/dist/esm/particlesExtension.js.map +1 -1
  149. package/dist/esm/public.d.ts +11 -0
  150. package/dist/esm/public.d.ts.map +1 -0
  151. package/dist/esm/renderModes/MeshParticles.d.ts +128 -0
  152. package/dist/esm/renderModes/MeshParticles.d.ts.map +1 -0
  153. package/dist/esm/renderModes/MeshParticles.js +263 -0
  154. package/dist/esm/renderModes/MeshParticles.js.map +1 -0
  155. package/dist/esm/renderModes/ParticleBufferLayout.d.ts +59 -0
  156. package/dist/esm/renderModes/ParticleBufferLayout.d.ts.map +1 -0
  157. package/dist/esm/renderModes/ParticleBufferLayout.js +99 -0
  158. package/dist/esm/renderModes/ParticleBufferLayout.js.map +1 -0
  159. package/dist/esm/renderModes/ParticleInstanceWriter.d.ts +58 -0
  160. package/dist/esm/renderModes/ParticleInstanceWriter.d.ts.map +1 -0
  161. package/dist/esm/renderModes/ParticleInstanceWriter.js +173 -0
  162. package/dist/esm/renderModes/ParticleInstanceWriter.js.map +1 -0
  163. package/dist/esm/renderModes/ParticleMaterial.d.ts +18 -0
  164. package/dist/esm/renderModes/ParticleMaterial.d.ts.map +1 -0
  165. package/dist/esm/renderModes/ParticleMaterial.js +24 -0
  166. package/dist/esm/renderModes/ParticleMaterial.js.map +1 -0
  167. package/dist/esm/renderModes/ParticleRenderMode.d.ts +114 -0
  168. package/dist/esm/renderModes/ParticleRenderMode.d.ts.map +1 -0
  169. package/dist/esm/renderModes/ParticleRenderMode.js +99 -0
  170. package/dist/esm/renderModes/ParticleRenderMode.js.map +1 -0
  171. package/dist/esm/renderModes/QuadParticles.d.ts +55 -0
  172. package/dist/esm/renderModes/QuadParticles.d.ts.map +1 -0
  173. package/dist/esm/renderModes/QuadParticles.js +95 -0
  174. package/dist/esm/renderModes/QuadParticles.js.map +1 -0
  175. package/dist/esm/renderModes/RibbonParticles.d.ts +96 -0
  176. package/dist/esm/renderModes/RibbonParticles.d.ts.map +1 -0
  177. package/dist/esm/renderModes/RibbonParticles.js +202 -0
  178. package/dist/esm/renderModes/RibbonParticles.js.map +1 -0
  179. package/dist/esm/renderModes/shaders/mesh-particles.wgsl.js +6 -0
  180. package/dist/esm/renderModes/shaders/mesh-particles.wgsl.js.map +1 -0
  181. package/dist/esm/renderModes/shaders/mesh.vert.js +6 -0
  182. package/dist/esm/renderModes/shaders/mesh.vert.js.map +1 -0
  183. package/dist/esm/renderModes/shaders/quad-particles.wgsl.js +6 -0
  184. package/dist/esm/renderModes/shaders/quad-particles.wgsl.js.map +1 -0
  185. package/dist/esm/renderModes/shaders/ribbon-particles.wgsl.js +6 -0
  186. package/dist/esm/renderModes/shaders/ribbon-particles.wgsl.js.map +1 -0
  187. package/dist/esm/renderModes/shaders/ribbon.frag.js +6 -0
  188. package/dist/esm/renderModes/shaders/ribbon.frag.js.map +1 -0
  189. package/dist/esm/renderModes/shaders/ribbon.vert.js +6 -0
  190. package/dist/esm/renderModes/shaders/ribbon.vert.js.map +1 -0
  191. package/dist/esm/renderers/WebGl2ParticleRenderer.d.ts +48 -20
  192. package/dist/esm/renderers/WebGl2ParticleRenderer.d.ts.map +1 -0
  193. package/dist/esm/renderers/WebGl2ParticleRenderer.js +317 -321
  194. package/dist/esm/renderers/WebGl2ParticleRenderer.js.map +1 -1
  195. package/dist/esm/renderers/WebGpuParticleRenderer.d.ts +99 -18
  196. package/dist/esm/renderers/WebGpuParticleRenderer.d.ts.map +1 -0
  197. package/dist/esm/renderers/WebGpuParticleRenderer.js +542 -551
  198. package/dist/esm/renderers/WebGpuParticleRenderer.js.map +1 -1
  199. package/dist/esm/renderers/shaders/particle.frag.js +6 -0
  200. package/dist/esm/renderers/shaders/particle.frag.js.map +1 -0
  201. package/dist/esm/renderers/shaders/particle.vert.js +6 -0
  202. package/dist/esm/renderers/shaders/particle.vert.js.map +1 -0
  203. package/package.json +8 -15
  204. package/dist/esm/index.js.map +0 -1
  205. package/dist/esm/register.d.ts +0 -1
  206. package/dist/esm/register.js +0 -43
  207. package/dist/esm/register.js.map +0 -1
  208. package/dist/esm/renderers/glsl/particle.frag.js +0 -4
  209. package/dist/esm/renderers/glsl/particle.frag.js.map +0 -1
  210. package/dist/esm/renderers/glsl/particle.vert.js +0 -4
  211. package/dist/esm/renderers/glsl/particle.vert.js.map +0 -1
@@ -1,44 +1,46 @@
1
- import { Vector } from '@codexo/exojs';
1
+ import { Vector } from "@codexo/exojs";
2
2
 
3
+ //#region src/distributions/ConeDirection.ts
3
4
  const tau = Math.PI * 2;
4
5
  /**
5
- * Random unit vector inside a cone, scaled by a speed magnitude.
6
- *
7
- * The cone is centred on `directionAngle` (in radians, 0 = +X, π/2 = +Y for
8
- * screen-down coordinates) and spans `±halfAngle` radians around it. Speed
9
- * is sampled uniformly in `[minSpeed, maxSpeed]`.
10
- *
11
- * Use for emission cones, explosions, fountain spread anywhere the
12
- * direction has a preferred axis with bounded variance.
13
- *
14
- * @example
15
- * // Upward fountain with ±15° spread, 200-300 px/s:
16
- * const up = new ConeDirection(-Math.PI / 2, Math.PI / 12, 200, 300);
17
- * up.sample(particle.velocity);
18
- */
19
- class ConeDirection {
20
- directionAngle;
21
- halfAngle;
22
- minSpeed;
23
- maxSpeed;
24
- _scratch = new Vector();
25
- constructor(directionAngle, halfAngle, minSpeed, maxSpeed) {
26
- this.directionAngle = directionAngle;
27
- this.halfAngle = halfAngle;
28
- this.minSpeed = minSpeed;
29
- this.maxSpeed = maxSpeed;
30
- }
31
- sample(out = this._scratch) {
32
- const angle = this.directionAngle + (Math.random() * 2 - 1) * this.halfAngle;
33
- const speed = this.minSpeed + Math.random() * (this.maxSpeed - this.minSpeed);
34
- out.set(Math.cos(angle) * speed, Math.sin(angle) * speed);
35
- return out;
36
- }
37
- /** Convenience: omnidirectional emission (full circle, 0..2π). */
38
- static omni(minSpeed, maxSpeed) {
39
- return new ConeDirection(0, tau / 2, minSpeed, maxSpeed);
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":["../../../../src/distributions/ConeDirection.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AAEvB;;;;;;;;;;;;;;AAcG;MACU,aAAa,CAAA;AAIf,IAAA,cAAA;AACA,IAAA,SAAA;AACA,IAAA,QAAA;AACA,IAAA,QAAA;AANQ,IAAA,QAAQ,GAAG,IAAI,MAAM,EAAE;AAExC,IAAA,WAAA,CACS,cAAsB,EACtB,SAAiB,EACjB,QAAgB,EAChB,QAAgB,EAAA;QAHhB,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACd;AAEI,IAAA,MAAM,CAAC,GAAA,GAAc,IAAI,CAAC,QAAQ,EAAA;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE7E,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAEzD,QAAA,OAAO,GAAG;IACZ;;AAGO,IAAA,OAAO,IAAI,CAAC,QAAgB,EAAE,QAAgB,EAAA;AACnD,QAAA,OAAO,IAAI,aAAa,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAC1D;AACD;;;;"}
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"}
@@ -15,3 +15,4 @@ export declare class Constant<T> implements Distribution<T>, LifetimeFunction<T>
15
15
  evaluate(_t: number, out?: T): T;
16
16
  private _copyOrReturn;
17
17
  }
18
+ //# sourceMappingURL=Constant.d.ts.map
@@ -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
- * Distribution that always returns the same value. Implements both
3
- * {@link Distribution} and {@link LifetimeFunction} so it can stand in
4
- * wherever a randomized or time-parameterised value is expected.
5
- *
6
- * For mutable types (Vector, Color, ...) the constant value is copied into
7
- * `out` if provided, otherwise the constructor's value is returned directly.
8
- * Mutating that returned reference mutates the distribution's source.
9
- */
10
- class Constant {
11
- value;
12
- constructor(value) {
13
- this.value = value;
14
- }
15
- sample(out) {
16
- return this._copyOrReturn(out);
17
- }
18
- evaluate(_t, out) {
19
- return this._copyOrReturn(out);
20
- }
21
- _copyOrReturn(out) {
22
- if (out === undefined || out === null) {
23
- return this.value;
24
- }
25
- const target = out;
26
- if (typeof target.copy === 'function') {
27
- target.copy(this.value);
28
- return out;
29
- }
30
- return this.value;
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":["../../../../src/distributions/Constant.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA;;;;;;;;AAQG;MACU,QAAQ,CAAA;AACO,IAAA,KAAA;AAA1B,IAAA,WAAA,CAA0B,KAAQ,EAAA;QAAR,IAAA,CAAA,KAAK,GAAL,KAAK;IAAM;AAE9B,IAAA,MAAM,CAAC,GAAO,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;IAChC;IAEO,QAAQ,CAAC,EAAU,EAAE,GAAO,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;IAChC;AAEQ,IAAA,aAAa,CAAC,GAAO,EAAA;QAC3B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE;YACrC,OAAO,IAAI,CAAC,KAAK;QACnB;QAEA,MAAM,MAAM,GAAG,GAAqC;AAEpD,QAAA,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;AACrC,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAEvB,YAAA,OAAO,GAAG;QACZ;QAEA,OAAO,IAAI,CAAC,KAAK;IACnB;AACD;;;;"}
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 sampling
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
- * Piecewise-linear keyframe curve sampled by lifetime ratio `t` in `[0, 1]`.
4
- *
5
- * Keyframes are stored sorted by `t` and clamped at the endpoints sampling
6
- * outside the keyframe range returns the nearest endpoint value. The
7
- * implementation tracks the last accessed segment so monotonically advancing
8
- * `t` (the typical case for per-particle lifetime sampling) costs O(1)
9
- * amortized per call instead of O(log n).
10
- *
11
- * @example
12
- * // Scale pulses up then down over lifetime:
13
- * const sizeCurve = new Curve([
14
- * { t: 0, v: 0.2 },
15
- * { t: 0.4, v: 1.5 },
16
- * { t: 1, v: 0.0 },
17
- * ]);
18
- * scale.x = scale.y = sizeCurve.evaluate(particle.elapsedRatio);
19
- */
20
- class Curve {
21
- _keys;
22
- _lastSegment = 0;
23
- constructor(keys) {
24
- if (keys.length === 0) {
25
- throw new Error('Curve requires at least one keyframe.');
26
- }
27
- this._keys = [...keys].sort(compareT);
28
- }
29
- evaluate(t) {
30
- const keys = this._keys;
31
- const last = keys.length - 1;
32
- const first = keys[0];
33
- const lastKey = keys[last];
34
- if (first === undefined || lastKey === undefined)
35
- return 0;
36
- if (t <= first.t)
37
- return first.v;
38
- if (t >= lastKey.t)
39
- return lastKey.v;
40
- // Cache-friendly forward search: most callers sweep t monotonically.
41
- let segment = this._lastSegment;
42
- if (t < (keys[segment]?.t ?? 0)) {
43
- segment = 0;
44
- }
45
- while (segment < last && t > (keys[segment + 1]?.t ?? Infinity)) {
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":["../../../../src/distributions/Curve.ts"],"sourcesContent":[null],"names":[],"mappings":"AAQA,MAAM,QAAQ,GAAG,CAAC,CAAW,EAAE,CAAW,KAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE;;;;;;;;;;;;;;;;;AAiBG;MACU,KAAK,CAAA;AACC,IAAA,KAAK;IACd,YAAY,GAAG,CAAC;AAExB,IAAA,WAAA,CAAmB,IAAyB,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,YAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;QAC1D;AAEA,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IACvC;AAEO,IAAA,QAAQ,CAAC,CAAS,EAAA;AACvB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;AACrB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;AAE1B,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;AAAE,YAAA,OAAO,CAAC;AAE1D,QAAA,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC,CAAC;;AAGpC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY;AAE/B,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE;YAC/B,OAAO,GAAG,CAAC;QACb;AAEA,QAAA,OAAO,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE;AAC/D,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO;AAE3B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;AAE3B,QAAA,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,CAAC;AAExD,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAErC,QAAA,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK;IAClC;AACD;;;;"}
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 used to randomize spawn properties
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 `ColorOverLifetime` (ColorGradient),
37
+ * that interpolate over particle lifetime - `ColorOverLifetime` (ColorGradient),
38
38
  * `ScaleOverLifetime` (Curve), etc.
39
39
  *
40
- * Mutable-target rule: same as {@link Distribution} pass your own scratch
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"}
@@ -13,3 +13,4 @@ export declare class LineSegment implements Distribution<Vector> {
13
13
  constructor(x0: number, y0: number, x1: number, y1: number);
14
14
  sample(out?: Vector): Vector;
15
15
  }
16
+ //# sourceMappingURL=LineSegment.d.ts.map
@@ -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 '@codexo/exojs';
1
+ import { Vector } from "@codexo/exojs";
2
2
 
3
+ //#region src/distributions/LineSegment.ts
3
4
  /**
4
- * Random point on a line segment between `(x0, y0)` and `(x1, y1)`. Uniform
5
- * parameter distribution: `t = Math.random()` then `lerp(start, end, t)`.
6
- */
7
- class LineSegment {
8
- x0;
9
- y0;
10
- x1;
11
- y1;
12
- _scratch = new Vector();
13
- constructor(x0, y0, x1, y1) {
14
- this.x0 = x0;
15
- this.y0 = y0;
16
- this.x1 = x1;
17
- this.y1 = y1;
18
- }
19
- sample(out = this._scratch) {
20
- const t = Math.random();
21
- out.set(this.x0 + (this.x1 - this.x0) * t, this.y0 + (this.y1 - this.y0) * t);
22
- return out;
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":["../../../../src/distributions/LineSegment.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA;;;AAGG;MACU,WAAW,CAAA;AAIb,IAAA,EAAA;AACA,IAAA,EAAA;AACA,IAAA,EAAA;AACA,IAAA,EAAA;AANQ,IAAA,QAAQ,GAAG,IAAI,MAAM,EAAE;AAExC,IAAA,WAAA,CACS,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EAAA;QAHV,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,EAAE,GAAF,EAAE;IACR;AAEI,IAAA,MAAM,CAAC,GAAA,GAAc,IAAI,CAAC,QAAQ,EAAA;AACvC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AAEvB,QAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAE7E,QAAA,OAAO,GAAG;IACZ;AACD;;;;"}
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"}
@@ -10,3 +10,4 @@ export declare class Range implements Distribution<number> {
10
10
  constructor(min: number, max: number);
11
11
  sample(): number;
12
12
  }
13
+ //# sourceMappingURL=Range.d.ts.map
@@ -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
- * Uniform random number in `[min, max]`. Each `sample()` returns a fresh
3
- * roll; the bounds are inclusive on both ends (modulo the rounding bias
4
- * inherent to `Math.random()`).
5
- */
6
- class Range {
7
- min;
8
- max;
9
- constructor(min, max) {
10
- this.min = min;
11
- this.max = max;
12
- }
13
- sample() {
14
- return this.min + Math.random() * (this.max - this.min);
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":["../../../../src/distributions/Range.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA;;;;AAIG;MACU,KAAK,CAAA;AAEP,IAAA,GAAA;AACA,IAAA,GAAA;IAFT,WAAA,CACS,GAAW,EACX,GAAW,EAAA;QADX,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,GAAG,GAAH,GAAG;IACT;IAEI,MAAM,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACzD;AACD;;;;"}
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"}
@@ -18,3 +18,4 @@ export declare class VectorRange implements Distribution<Vector> {
18
18
  constructor(minX: number, maxX: number, minY: number, maxY: number);
19
19
  sample(out?: Vector): Vector;
20
20
  }
21
+ //# sourceMappingURL=VectorRange.d.ts.map
@@ -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 '@codexo/exojs';
1
+ import { Vector } from "@codexo/exojs";
2
2
 
3
+ //#region src/distributions/VectorRange.ts
3
4
  /**
4
- * Uniform random vector with each axis sampled independently in its own
5
- * `[min, max]` range. Each `sample()` writes into the provided `out` Vector
6
- * (or an internal scratch instance when `out` is omitted).
7
- *
8
- * @example
9
- * const knockback = new VectorRange(-300, 300, -800, -200); // any X, upward Y
10
- * knockback.sample(particle.velocity); // writes into existing instance, no alloc
11
- */
12
- class VectorRange {
13
- minX;
14
- maxX;
15
- minY;
16
- maxY;
17
- _scratch = new Vector();
18
- constructor(minX, maxX, minY, maxY) {
19
- this.minX = minX;
20
- this.maxX = maxX;
21
- this.minY = minY;
22
- this.maxY = maxY;
23
- }
24
- sample(out = this._scratch) {
25
- out.set(this.minX + Math.random() * (this.maxX - this.minX), this.minY + Math.random() * (this.maxY - this.minY));
26
- return out;
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":["../../../../src/distributions/VectorRange.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA;;;;;;;;AAQG;MACU,WAAW,CAAA;AAIb,IAAA,IAAA;AACA,IAAA,IAAA;AACA,IAAA,IAAA;AACA,IAAA,IAAA;AANQ,IAAA,QAAQ,GAAG,IAAI,MAAM,EAAE;AAExC,IAAA,WAAA,CACS,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,IAAY,EAAA;QAHZ,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,IAAI,GAAJ,IAAI;IACV;AAEI,IAAA,MAAM,CAAC,GAAA,GAAc,IAAI,CAAC,QAAQ,EAAA;AACvC,QAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;AAEjH,QAAA,OAAO,GAAG;IACZ;AACD;;;;"}
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"}
@@ -10,3 +10,4 @@ export type { Distribution, LifetimeFunction } from './Distribution';
10
10
  export { LineSegment } from './LineSegment';
11
11
  export { Range } from './Range';
12
12
  export { VectorRange } from './VectorRange';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}