custom-pixi-particles 8.1.1 → 8.2.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 (163) hide show
  1. package/dist/index.d.ts +15 -0
  2. package/dist/index.js +45 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/lib/Model.d.ts +32 -0
  5. package/dist/lib/Model.js +44 -0
  6. package/dist/lib/Model.js.map +1 -0
  7. package/dist/lib/Particle.d.ts +234 -0
  8. package/dist/lib/Particle.js +201 -0
  9. package/dist/lib/Particle.js.map +1 -0
  10. package/dist/lib/ParticlePool.d.ts +37 -0
  11. package/dist/lib/ParticlePool.js +56 -0
  12. package/dist/lib/ParticlePool.js.map +1 -0
  13. package/dist/lib/behaviour/AngularVelocityBehaviour.d.ts +61 -0
  14. package/dist/lib/behaviour/AngularVelocityBehaviour.js +118 -0
  15. package/dist/lib/behaviour/AngularVelocityBehaviour.js.map +1 -0
  16. package/dist/lib/behaviour/AttractionRepulsionBehaviour.d.ts +42 -0
  17. package/dist/lib/behaviour/AttractionRepulsionBehaviour.js +78 -0
  18. package/dist/lib/behaviour/AttractionRepulsionBehaviour.js.map +1 -0
  19. package/dist/lib/behaviour/Behaviour.d.ts +33 -0
  20. package/dist/lib/behaviour/Behaviour.js +45 -0
  21. package/dist/lib/behaviour/Behaviour.js.map +1 -0
  22. package/dist/lib/behaviour/BehaviourNames.d.ts +22 -0
  23. package/dist/lib/behaviour/BehaviourNames.js +23 -0
  24. package/dist/lib/behaviour/BehaviourNames.js.map +1 -0
  25. package/dist/lib/behaviour/CollisionBehaviour.d.ts +81 -0
  26. package/dist/lib/behaviour/CollisionBehaviour.js +136 -0
  27. package/dist/lib/behaviour/CollisionBehaviour.js.map +1 -0
  28. package/dist/lib/behaviour/ColorBehaviour.d.ts +67 -0
  29. package/dist/lib/behaviour/ColorBehaviour.js +209 -0
  30. package/dist/lib/behaviour/ColorBehaviour.js.map +1 -0
  31. package/dist/lib/behaviour/EmitDirectionBehaviour.d.ts +52 -0
  32. package/dist/lib/behaviour/EmitDirectionBehaviour.js +105 -0
  33. package/dist/lib/behaviour/EmitDirectionBehaviour.js.map +1 -0
  34. package/dist/lib/behaviour/EmitterBehaviours.d.ts +69 -0
  35. package/dist/lib/behaviour/EmitterBehaviours.js +116 -0
  36. package/dist/lib/behaviour/EmitterBehaviours.js.map +1 -0
  37. package/dist/lib/behaviour/ForceFieldsBehaviour.d.ts +53 -0
  38. package/dist/lib/behaviour/ForceFieldsBehaviour.js +80 -0
  39. package/dist/lib/behaviour/ForceFieldsBehaviour.js.map +1 -0
  40. package/dist/lib/behaviour/GroupingBehaviour.d.ts +57 -0
  41. package/dist/lib/behaviour/GroupingBehaviour.js +143 -0
  42. package/dist/lib/behaviour/GroupingBehaviour.js.map +1 -0
  43. package/dist/lib/behaviour/LifeBehaviour.d.ts +47 -0
  44. package/dist/lib/behaviour/LifeBehaviour.js +65 -0
  45. package/dist/lib/behaviour/LifeBehaviour.js.map +1 -0
  46. package/dist/lib/behaviour/LightEffectBehaviour.d.ts +59 -0
  47. package/dist/lib/behaviour/LightEffectBehaviour.js +94 -0
  48. package/dist/lib/behaviour/LightEffectBehaviour.js.map +1 -0
  49. package/dist/lib/behaviour/NoiseBasedMotionBehaviour.d.ts +28 -0
  50. package/dist/lib/behaviour/NoiseBasedMotionBehaviour.js +50 -0
  51. package/dist/lib/behaviour/NoiseBasedMotionBehaviour.js.map +1 -0
  52. package/dist/lib/behaviour/PositionBehaviour.d.ts +164 -0
  53. package/dist/lib/behaviour/PositionBehaviour.js +484 -0
  54. package/dist/lib/behaviour/PositionBehaviour.js.map +1 -0
  55. package/dist/lib/behaviour/RotationBehaviour.d.ts +59 -0
  56. package/dist/lib/behaviour/RotationBehaviour.js +100 -0
  57. package/dist/lib/behaviour/RotationBehaviour.js.map +1 -0
  58. package/dist/lib/behaviour/SizeBehaviour.d.ts +61 -0
  59. package/dist/lib/behaviour/SizeBehaviour.js +156 -0
  60. package/dist/lib/behaviour/SizeBehaviour.js.map +1 -0
  61. package/dist/lib/behaviour/SoundReactiveBehaviour.d.ts +58 -0
  62. package/dist/lib/behaviour/SoundReactiveBehaviour.js +132 -0
  63. package/dist/lib/behaviour/SoundReactiveBehaviour.js.map +1 -0
  64. package/dist/lib/behaviour/SpawnBehaviour.d.ts +89 -0
  65. package/dist/lib/behaviour/SpawnBehaviour.js +705 -0
  66. package/dist/lib/behaviour/SpawnBehaviour.js.map +1 -0
  67. package/dist/lib/behaviour/StretchBehaviour.d.ts +30 -0
  68. package/dist/lib/behaviour/StretchBehaviour.js +59 -0
  69. package/dist/lib/behaviour/StretchBehaviour.js.map +1 -0
  70. package/dist/lib/behaviour/TemperatureBehaviour.d.ts +47 -0
  71. package/dist/lib/behaviour/TemperatureBehaviour.js +64 -0
  72. package/dist/lib/behaviour/TemperatureBehaviour.js.map +1 -0
  73. package/dist/lib/behaviour/TimelineBehaviour.d.ts +73 -0
  74. package/dist/lib/behaviour/TimelineBehaviour.js +100 -0
  75. package/dist/lib/behaviour/TimelineBehaviour.js.map +1 -0
  76. package/dist/lib/behaviour/TurbulenceBehaviour.d.ts +73 -0
  77. package/dist/lib/behaviour/TurbulenceBehaviour.js +133 -0
  78. package/dist/lib/behaviour/TurbulenceBehaviour.js.map +1 -0
  79. package/dist/lib/behaviour/index.d.ts +23 -0
  80. package/dist/lib/behaviour/index.js +24 -0
  81. package/dist/lib/behaviour/index.js.map +1 -0
  82. package/dist/lib/customPixiParticlesSettingsInterface.d.ts +19 -0
  83. package/dist/lib/customPixiParticlesSettingsInterface.js +2 -0
  84. package/dist/lib/customPixiParticlesSettingsInterface.js.map +1 -0
  85. package/dist/lib/emission/AbstractEmission.d.ts +30 -0
  86. package/dist/lib/emission/AbstractEmission.js +39 -0
  87. package/dist/lib/emission/AbstractEmission.js.map +1 -0
  88. package/dist/lib/emission/EmissionTypes.d.ts +6 -0
  89. package/dist/lib/emission/EmissionTypes.js +6 -0
  90. package/dist/lib/emission/EmissionTypes.js.map +1 -0
  91. package/dist/lib/emission/RandomEmission.d.ts +44 -0
  92. package/dist/lib/emission/RandomEmission.js +66 -0
  93. package/dist/lib/emission/RandomEmission.js.map +1 -0
  94. package/dist/lib/emission/StandardEmission.d.ts +62 -0
  95. package/dist/lib/emission/StandardEmission.js +87 -0
  96. package/dist/lib/emission/StandardEmission.js.map +1 -0
  97. package/dist/lib/emission/UniformEmission.d.ts +56 -0
  98. package/dist/lib/emission/UniformEmission.js +83 -0
  99. package/dist/lib/emission/UniformEmission.js.map +1 -0
  100. package/dist/lib/emission/index.d.ts +6 -0
  101. package/dist/lib/emission/index.js +7 -0
  102. package/dist/lib/emission/index.js.map +1 -0
  103. package/dist/lib/emitter/Duration.d.ts +27 -0
  104. package/dist/lib/emitter/Duration.js +41 -0
  105. package/dist/lib/emitter/Duration.js.map +1 -0
  106. package/dist/lib/emitter/Emitter.d.ts +116 -0
  107. package/dist/lib/emitter/Emitter.js +240 -0
  108. package/dist/lib/emitter/Emitter.js.map +1 -0
  109. package/dist/lib/emitter/index.d.ts +3 -0
  110. package/dist/lib/emitter/index.js +4 -0
  111. package/dist/lib/emitter/index.js.map +1 -0
  112. package/dist/lib/index.d.ts +20 -0
  113. package/dist/lib/index.js +21 -0
  114. package/dist/lib/index.js.map +1 -0
  115. package/dist/lib/parser/BehaviourParser.d.ts +21 -0
  116. package/dist/lib/parser/BehaviourParser.js +72 -0
  117. package/dist/lib/parser/BehaviourParser.js.map +1 -0
  118. package/dist/lib/parser/CompatibilityHelper.d.ts +12 -0
  119. package/dist/lib/parser/CompatibilityHelper.js +19 -0
  120. package/dist/lib/parser/CompatibilityHelper.js.map +1 -0
  121. package/dist/lib/parser/EmitControllerParser.d.ts +27 -0
  122. package/dist/lib/parser/EmitControllerParser.js +39 -0
  123. package/dist/lib/parser/EmitControllerParser.js.map +1 -0
  124. package/dist/lib/parser/EmitterParser.d.ts +67 -0
  125. package/dist/lib/parser/EmitterParser.js +168 -0
  126. package/dist/lib/parser/EmitterParser.js.map +1 -0
  127. package/dist/lib/parser/index.d.ts +5 -0
  128. package/dist/lib/parser/index.js +6 -0
  129. package/dist/lib/parser/index.js.map +1 -0
  130. package/dist/lib/pixi/Renderer.d.ts +125 -0
  131. package/dist/lib/pixi/Renderer.js +566 -0
  132. package/dist/lib/pixi/Renderer.js.map +1 -0
  133. package/dist/lib/pixi/TestRenderer.d.ts +125 -0
  134. package/dist/lib/pixi/TestRenderer.js +560 -0
  135. package/dist/lib/pixi/TestRenderer.js.map +1 -0
  136. package/dist/lib/util/Color.d.ts +133 -0
  137. package/dist/lib/util/Color.js +173 -0
  138. package/dist/lib/util/Color.js.map +1 -0
  139. package/dist/lib/util/List.d.ts +49 -0
  140. package/dist/lib/util/List.js +87 -0
  141. package/dist/lib/util/List.js.map +1 -0
  142. package/dist/lib/util/MinMax.d.ts +34 -0
  143. package/dist/lib/util/MinMax.js +46 -0
  144. package/dist/lib/util/MinMax.js.map +1 -0
  145. package/dist/lib/util/Point.d.ts +34 -0
  146. package/dist/lib/util/Point.js +46 -0
  147. package/dist/lib/util/Point.js.map +1 -0
  148. package/dist/lib/util/Random.d.ts +24 -0
  149. package/dist/lib/util/Random.js +30 -0
  150. package/dist/lib/util/Random.js.map +1 -0
  151. package/dist/lib/util/ThereBack.d.ts +14 -0
  152. package/dist/lib/util/ThereBack.js +23 -0
  153. package/dist/lib/util/ThereBack.js.map +1 -0
  154. package/dist/lib/util/index.d.ts +5 -0
  155. package/dist/lib/util/index.js +6 -0
  156. package/dist/lib/util/index.js.map +1 -0
  157. package/dist/lib/util/maths.d.ts +10 -0
  158. package/dist/lib/util/maths.js +13 -0
  159. package/dist/lib/util/maths.js.map +1 -0
  160. package/dist/lib/util/turbulencePool.d.ts +4 -0
  161. package/dist/lib/util/turbulencePool.js +7 -0
  162. package/dist/lib/util/turbulencePool.js.map +1 -0
  163. package/package.json +1 -1
@@ -0,0 +1,100 @@
1
+ import { Behaviour, BehaviourNames } from './index';
2
+ /**
3
+ * RotationBehaviour is a Behaviour class used to control the rotation of particles.
4
+ * @extends Behaviour
5
+ */
6
+ export default class RotationBehaviour extends Behaviour {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.enabled = false;
10
+ this.priority = 0;
11
+ this.rotation = 0; // Base rotation speed
12
+ this.variance = 0; // Variance in rotation speed
13
+ this.oscillate = false; // Enable oscillation
14
+ this.oscillationSpeed = 1; // Speed of oscillation
15
+ this.oscillationAmplitude = 0; // Amplitude of oscillation
16
+ this.useNoise = false; // Use Perlin noise for rotation
17
+ this.noiseScale = 0.1; // Scale of Perlin noise
18
+ this.acceleration = 0; // Rotation acceleration (positive or negative)
19
+ this.clockwise = true; // Clockwise or counterclockwise rotation
20
+ /**
21
+ * Initialise the Behaviour for a particle
22
+ * @param {Particle} particle - The particle to be initialised
23
+ */
24
+ this.init = (particle) => {
25
+ if (!this.enabled)
26
+ return;
27
+ // Set base rotation delta with variance
28
+ const baseRotation = this.rotation + this.varianceFrom(this.variance);
29
+ particle.rotationDelta = this.clockwise ? baseRotation : -baseRotation;
30
+ // Initialize acceleration if enabled
31
+ particle.rotationAcceleration = this.acceleration;
32
+ };
33
+ /**
34
+ * Applies the Behaviour to a particle
35
+ * @param {Particle} particle - The particle to apply the Behaviour to
36
+ * @param {number} deltaTime - The delta time of the runtime
37
+ */
38
+ this.apply = (particle, deltaTime) => {
39
+ if (!this.enabled)
40
+ return;
41
+ if (particle.skipRotationBehaviour)
42
+ return;
43
+ let deltaRotation = particle.rotationDelta;
44
+ // Apply oscillation effect
45
+ if (this.oscillate) {
46
+ const oscillation = Math.sin(particle.lifeTime * this.oscillationSpeed) * this.oscillationAmplitude;
47
+ deltaRotation += oscillation;
48
+ }
49
+ // Apply noise-based rotation
50
+ if (this.useNoise) {
51
+ const noiseValue = this.pseudoRandomNoise(particle.lifeTime * this.noiseScale);
52
+ deltaRotation += noiseValue * 2 - 1; // Map noise from [0,1] to [-1,1]
53
+ }
54
+ // Apply rotation acceleration
55
+ if (particle.rotationAcceleration) {
56
+ particle.rotationDelta += particle.rotationAcceleration * deltaTime;
57
+ deltaRotation = particle.rotationDelta;
58
+ }
59
+ // Update particle rotation
60
+ particle.rotation += deltaRotation * deltaTime;
61
+ };
62
+ }
63
+ /**
64
+ * Pseudo-random noise generator for smooth transitions
65
+ * @param {number} seed - Input seed for generating noise
66
+ * @returns {number} - Noise value between 0 and 1
67
+ */
68
+ pseudoRandomNoise(seed) {
69
+ const x = Math.sin(seed * 10000) * 10000;
70
+ return x - Math.floor(x);
71
+ }
72
+ /**
73
+ * Gets the name of the Behaviour
74
+ * @returns {string} - The name of the Behaviour
75
+ */
76
+ getName() {
77
+ return BehaviourNames.ROTATION_BEHAVIOUR;
78
+ }
79
+ /**
80
+ * Gets the properties of the Behaviour
81
+ * @returns {object} - The properties of the Behaviour
82
+ */
83
+ getProps() {
84
+ return {
85
+ enabled: this.enabled,
86
+ priority: this.priority,
87
+ rotation: this.rotation,
88
+ variance: this.variance,
89
+ oscillate: this.oscillate,
90
+ oscillationSpeed: this.oscillationSpeed,
91
+ oscillationAmplitude: this.oscillationAmplitude,
92
+ useNoise: this.useNoise,
93
+ noiseScale: this.noiseScale,
94
+ acceleration: this.acceleration,
95
+ clockwise: this.clockwise,
96
+ name: this.getName(),
97
+ };
98
+ }
99
+ }
100
+ //# sourceMappingURL=RotationBehaviour.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RotationBehaviour.js","sourceRoot":"","sources":["../../../src/lib/behaviour/RotationBehaviour.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { Point } from '../util';
2
+ import { Behaviour } from './index';
3
+ import Particle from '../Particle';
4
+ export default class SizeBehaviour extends Behaviour {
5
+ enabled: boolean;
6
+ priority: number;
7
+ sizeStart: Point;
8
+ sizeEnd: Point;
9
+ startVariance: number;
10
+ endVariance: number;
11
+ maxSize: Point;
12
+ uniformScaling: boolean;
13
+ pulsate: boolean;
14
+ pulsationSpeed: number;
15
+ pulsationAmplitude: number;
16
+ useNoise: boolean;
17
+ noiseScale: number;
18
+ invertAtMidpoint: boolean;
19
+ sizeSteps: never[];
20
+ timeOffset: number;
21
+ xScalingFunction: string;
22
+ yScalingFunction: string;
23
+ sizeAlphaDependency: boolean;
24
+ init: (particle: Particle) => void;
25
+ apply: (particle: Particle, deltaTime: number) => void;
26
+ applyMultiStepSize: (particle: Particle, lifeProgress: number) => void;
27
+ applyEasing: (progress: number, easingType: string) => number;
28
+ pseudoRandomNoise: (seed: number) => number;
29
+ getName(): string;
30
+ getProps(): {
31
+ enabled: boolean;
32
+ priority: number;
33
+ sizeStart: {
34
+ x: number;
35
+ y: number;
36
+ };
37
+ sizeEnd: {
38
+ x: number;
39
+ y: number;
40
+ };
41
+ startVariance: number;
42
+ endVariance: number;
43
+ maxSize: {
44
+ x: number;
45
+ y: number;
46
+ };
47
+ uniformScaling: boolean;
48
+ pulsate: boolean;
49
+ pulsationSpeed: number;
50
+ pulsationAmplitude: number;
51
+ useNoise: boolean;
52
+ noiseScale: number;
53
+ invertAtMidpoint: boolean;
54
+ sizeSteps: never[];
55
+ timeOffset: number;
56
+ xScalingFunction: string;
57
+ yScalingFunction: string;
58
+ sizeAlphaDependency: boolean;
59
+ name: string;
60
+ };
61
+ }
@@ -0,0 +1,156 @@
1
+ import { Point } from '../util';
2
+ import { Behaviour, BehaviourNames } from './index';
3
+ export default class SizeBehaviour extends Behaviour {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.enabled = true;
7
+ this.priority = 0;
8
+ this.sizeStart = new Point(1, 1);
9
+ this.sizeEnd = new Point(1, 1);
10
+ this.startVariance = 0;
11
+ this.endVariance = 0;
12
+ this.maxSize = new Point(2, 2); // Maximum size clamp
13
+ this.uniformScaling = true; // Toggle for uniform scaling
14
+ this.pulsate = false; // Enable pulsating size effect
15
+ this.pulsationSpeed = 1; // Speed of pulsation
16
+ this.pulsationAmplitude = 0.2; // Amplitude of pulsation
17
+ this.useNoise = false; // Use noise for size modulation
18
+ this.noiseScale = 0.1; // Scale of the noise effect
19
+ this.invertAtMidpoint = false; // Invert size at midpoint
20
+ this.sizeSteps = []; // Array of size points for multi-step transitions
21
+ this.timeOffset = 0; // Delay or advance size scaling
22
+ this.xScalingFunction = 'linear'; // Easing for x-axis
23
+ this.yScalingFunction = 'linear'; // Easing for y-axis
24
+ this.sizeAlphaDependency = false; // Link size to alpha value
25
+ this.init = (particle) => {
26
+ if (!this.enabled)
27
+ return;
28
+ let variance = this.varianceFrom(this.startVariance);
29
+ const sizeStartX = this.sizeStart.x + variance;
30
+ const sizeStartY = this.sizeStart.y + variance;
31
+ variance = this.varianceFrom(this.endVariance);
32
+ const sizeEndX = this.sizeEnd.x + variance;
33
+ const sizeEndY = this.sizeEnd.y + variance;
34
+ particle.sizeDifference = {
35
+ x: sizeEndX - sizeStartX,
36
+ y: sizeEndY - sizeStartY,
37
+ };
38
+ particle.sizeStart.x = sizeStartX;
39
+ particle.sizeStart.y = sizeStartY;
40
+ particle.sizeEnd.x = sizeEndX;
41
+ particle.sizeEnd.y = sizeEndY;
42
+ particle.size.copyFrom(particle.sizeStart);
43
+ };
44
+ this.apply = (particle, deltaTime) => {
45
+ if (!this.enabled || particle.skipSizeBehaviour)
46
+ return;
47
+ let lifeProgress = particle.lifeProgress - this.timeOffset;
48
+ if (lifeProgress < 0)
49
+ return; // Skip if delayed
50
+ if (this.invertAtMidpoint && lifeProgress > 0.5) {
51
+ lifeProgress = 1 - lifeProgress; // Invert at midpoint
52
+ }
53
+ // Handle multi-step transitions
54
+ if (this.sizeSteps.length > 0) {
55
+ this.applyMultiStepSize(particle, lifeProgress);
56
+ return;
57
+ }
58
+ let sizeX = particle.sizeStart.x + particle.sizeDifference.x * this.applyEasing(lifeProgress, this.xScalingFunction);
59
+ let sizeY = this.uniformScaling
60
+ ? sizeX
61
+ : particle.sizeStart.y + particle.sizeDifference.y * this.applyEasing(lifeProgress, this.yScalingFunction);
62
+ // Apply pulsation effect
63
+ if (this.pulsate) {
64
+ const pulseFactor = 1 + Math.sin(particle.lifeTime * this.pulsationSpeed * Math.PI * 2) * this.pulsationAmplitude;
65
+ sizeX *= pulseFactor;
66
+ sizeY *= pulseFactor;
67
+ }
68
+ // Apply noise modulation
69
+ if (this.useNoise) {
70
+ const noiseFactor = this.pseudoRandomNoise(particle.lifeTime * this.noiseScale);
71
+ sizeX *= noiseFactor;
72
+ sizeY *= noiseFactor;
73
+ }
74
+ // Size linked to alpha
75
+ if (this.sizeAlphaDependency) {
76
+ const alphaFactor = particle.color.alpha;
77
+ sizeX *= alphaFactor;
78
+ sizeY *= alphaFactor;
79
+ }
80
+ // Clamp to maximum size
81
+ sizeX = Math.min(sizeX, this.maxSize.x);
82
+ sizeY = Math.min(sizeY, this.maxSize.y);
83
+ particle.size.x = sizeX;
84
+ particle.size.y = sizeY;
85
+ };
86
+ this.applyMultiStepSize = (particle, lifeProgress) => {
87
+ const stepCount = this.sizeSteps.length - 1;
88
+ if (stepCount < 1)
89
+ return; // Skip if fewer than two steps
90
+ const currentStep = Math.floor(lifeProgress * stepCount);
91
+ const nextStep = Math.min(currentStep + 1, stepCount);
92
+ const t = (lifeProgress * stepCount) % 1;
93
+ const sizeStart = this.sizeSteps[currentStep];
94
+ const sizeEnd = this.sizeSteps[nextStep];
95
+ // @ts-ignore
96
+ particle.size.x = sizeStart.x + (sizeEnd.x - sizeStart.x) * this.applyEasing(t, this.xScalingFunction);
97
+ // @ts-ignore
98
+ particle.size.y = sizeStart.y + (sizeEnd.y - sizeStart.y) * this.applyEasing(t, this.yScalingFunction);
99
+ };
100
+ this.applyEasing = (progress, easingType) => {
101
+ switch (easingType) {
102
+ case 'easeIn':
103
+ return progress * progress;
104
+ case 'easeOut':
105
+ return 1 - Math.pow(1 - progress, 2);
106
+ case 'easeInOut':
107
+ return progress < 0.5 ? 2 * progress * progress : 1 - Math.pow(-2 * progress + 2, 2) / 2;
108
+ case 'linear':
109
+ default:
110
+ return progress;
111
+ }
112
+ };
113
+ this.pseudoRandomNoise = (seed) => {
114
+ const prime = 2654435761; // A prime constant
115
+ const x = Math.sin(seed * prime) * 10000; // Scale the randomness
116
+ return x - Math.floor(x); // Ensure result is between 0 and 1
117
+ };
118
+ }
119
+ getName() {
120
+ return BehaviourNames.SIZE_BEHAVIOUR;
121
+ }
122
+ getProps() {
123
+ return {
124
+ enabled: this.enabled,
125
+ priority: this.priority,
126
+ sizeStart: {
127
+ x: this.sizeStart.x,
128
+ y: this.sizeStart.y,
129
+ },
130
+ sizeEnd: {
131
+ x: this.sizeEnd.x,
132
+ y: this.sizeEnd.y,
133
+ },
134
+ startVariance: this.startVariance,
135
+ endVariance: this.endVariance,
136
+ maxSize: {
137
+ x: this.maxSize.x,
138
+ y: this.maxSize.y,
139
+ },
140
+ uniformScaling: this.uniformScaling,
141
+ pulsate: this.pulsate,
142
+ pulsationSpeed: this.pulsationSpeed,
143
+ pulsationAmplitude: this.pulsationAmplitude,
144
+ useNoise: this.useNoise,
145
+ noiseScale: this.noiseScale,
146
+ invertAtMidpoint: this.invertAtMidpoint,
147
+ sizeSteps: this.sizeSteps,
148
+ timeOffset: this.timeOffset,
149
+ xScalingFunction: this.xScalingFunction,
150
+ yScalingFunction: this.yScalingFunction,
151
+ sizeAlphaDependency: this.sizeAlphaDependency,
152
+ name: this.getName(),
153
+ };
154
+ }
155
+ }
156
+ //# sourceMappingURL=SizeBehaviour.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SizeBehaviour.js","sourceRoot":"","sources":["../../../src/lib/behaviour/SizeBehaviour.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { Behaviour } from './index';
2
+ import Particle from '../Particle';
3
+ import { Color, Point } from '../util';
4
+ export default class SoundReactiveBehaviour extends Behaviour {
5
+ enabled: boolean;
6
+ priority: number;
7
+ isPlaying: boolean;
8
+ useColor: boolean;
9
+ useSize: boolean;
10
+ useVelocity: boolean;
11
+ useRotation: boolean;
12
+ useRandomColor: boolean;
13
+ beatColor: Color;
14
+ audioContext: AudioContext | null;
15
+ analyser: AnalyserNode | null;
16
+ frequencyData: Uint8Array | null;
17
+ amplitudeFactor: number;
18
+ frequencyFactor: number;
19
+ rotationFactor: number;
20
+ beatSensitivity: number;
21
+ velocityFactor: Point;
22
+ init(): void;
23
+ apply(particle: Particle, deltaTime: number): void;
24
+ /**
25
+ * Computes the amplitude (average volume level) from the frequency data.
26
+ */
27
+ getAmplitude(): number;
28
+ /**
29
+ * Finds the dominant frequency (frequency with the highest amplitude).
30
+ */
31
+ getDominantFrequency(): number;
32
+ /**
33
+ * Detects a beat based on amplitude and sensitivity.
34
+ */
35
+ isBeatDetected(amplitude: number): boolean;
36
+ /**
37
+ * Generates a random RGBA color.
38
+ */
39
+ getRandomColor(): Color;
40
+ getName(): string;
41
+ getProps(): {
42
+ enabled: boolean;
43
+ priority: number;
44
+ isPlaying: boolean;
45
+ useColor: boolean;
46
+ useVelocity: boolean;
47
+ useSize: boolean;
48
+ useRotation: boolean;
49
+ useRandomColor: boolean;
50
+ beatColor: Color;
51
+ amplitudeFactor: number;
52
+ frequencyFactor: number;
53
+ rotationFactor: number;
54
+ beatSensitivity: number;
55
+ velocityFactor: Point;
56
+ name: string;
57
+ };
58
+ }
@@ -0,0 +1,132 @@
1
+ import { Behaviour, BehaviourNames } from './index';
2
+ import { Color, Point } from '../util';
3
+ export default class SoundReactiveBehaviour extends Behaviour {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.enabled = true;
7
+ this.priority = 0;
8
+ this.isPlaying = false;
9
+ this.useColor = true;
10
+ this.useSize = true;
11
+ this.useVelocity = true;
12
+ this.useRotation = true; // New property for rotation
13
+ this.useRandomColor = true; // New property for random colors
14
+ this.beatColor = new Color(255, 0, 0, 1); // Default beat color (red with full alpha)
15
+ this.audioContext = null; // Audio context for analysis
16
+ this.analyser = null; // Audio analyser node
17
+ this.frequencyData = null; // Frequency data array
18
+ this.amplitudeFactor = 0.1; // Scale factor for amplitude effects
19
+ this.frequencyFactor = 1; // Scale factor for frequency effects
20
+ this.rotationFactor = 0.05; // Scale factor for rotation effects
21
+ this.beatSensitivity = 1; // Sensitivity to detect beats
22
+ this.velocityFactor = new Point(1, 1); // Sensitivity to detect beats
23
+ }
24
+ init() {
25
+ //
26
+ }
27
+ apply(particle, deltaTime) {
28
+ if (!this.enabled || !this.analyser || !this.frequencyData || !this.isPlaying)
29
+ return;
30
+ // Update frequency data
31
+ this.analyser.getByteFrequencyData(this.frequencyData);
32
+ // Compute amplitude and frequency effects
33
+ const amplitude = this.getAmplitude();
34
+ const dominantFrequency = this.getDominantFrequency();
35
+ if (this.useSize) {
36
+ // Apply amplitude effect to size
37
+ particle.size.x += amplitude * this.amplitudeFactor * deltaTime;
38
+ particle.size.y += amplitude * this.amplitudeFactor * deltaTime;
39
+ }
40
+ if (this.useVelocity) {
41
+ // Apply frequency effect to velocity or position
42
+ particle.velocity.x += dominantFrequency * this.frequencyFactor * deltaTime * this.velocityFactor.x;
43
+ particle.velocity.y += dominantFrequency * this.frequencyFactor * deltaTime * this.velocityFactor.y;
44
+ }
45
+ if (this.useRotation) {
46
+ // Apply rotation effect based on dominant frequency
47
+ particle.rotation += dominantFrequency * this.rotationFactor * deltaTime;
48
+ }
49
+ if (this.useColor) {
50
+ // Add beat reaction with color and alpha logic
51
+ if (this.isBeatDetected(amplitude)) {
52
+ const color = this.useRandomColor ? this.getRandomColor() : this.beatColor;
53
+ particle.color.r = color.r;
54
+ particle.color.g = color.g;
55
+ particle.color.b = color.b;
56
+ particle.color.alpha = color.alpha; // Ensure alpha is applied
57
+ }
58
+ else {
59
+ particle.color.r = Math.max(0, particle.color.r - 5); // Fade back to normal
60
+ particle.color.g = Math.max(0, particle.color.g - 5);
61
+ particle.color.b = Math.max(0, particle.color.b - 5);
62
+ particle.color.alpha = Math.max(0, particle.color.alpha - 0.05); // Gradually decrease alpha
63
+ }
64
+ }
65
+ }
66
+ /**
67
+ * Computes the amplitude (average volume level) from the frequency data.
68
+ */
69
+ getAmplitude() {
70
+ if (!this.frequencyData)
71
+ return 0;
72
+ const sum = this.frequencyData.reduce((a, b) => a + b, 0);
73
+ return sum / this.frequencyData.length;
74
+ }
75
+ /**
76
+ * Finds the dominant frequency (frequency with the highest amplitude).
77
+ */
78
+ getDominantFrequency() {
79
+ var _a, _b, _c, _d;
80
+ if (!this.frequencyData)
81
+ return 0;
82
+ let maxAmplitude = 0;
83
+ let dominantIndex = 0;
84
+ for (let i = 0; i < this.frequencyData.length; i++) {
85
+ if (this.frequencyData[i] > maxAmplitude) {
86
+ maxAmplitude = this.frequencyData[i];
87
+ dominantIndex = i;
88
+ }
89
+ }
90
+ return (dominantIndex * ((_b = (_a = this.analyser) === null || _a === void 0 ? void 0 : _a.context.sampleRate) !== null && _b !== void 0 ? _b : 0)) / ((_d = (_c = this.analyser) === null || _c === void 0 ? void 0 : _c.fftSize) !== null && _d !== void 0 ? _d : 1);
91
+ }
92
+ /**
93
+ * Detects a beat based on amplitude and sensitivity.
94
+ */
95
+ isBeatDetected(amplitude) {
96
+ return amplitude > this.beatSensitivity * 128; // Threshold for beat detection
97
+ }
98
+ /**
99
+ * Generates a random RGBA color.
100
+ */
101
+ getRandomColor() {
102
+ // Generate a random color if allTheSameColor is false
103
+ const r = Math.floor(Math.random() * 256);
104
+ const g = Math.floor(Math.random() * 256);
105
+ const b = Math.floor(Math.random() * 256);
106
+ const a = 1; // Ensure alpha is explicitly set
107
+ return new Color(r, g, b, a);
108
+ }
109
+ getName() {
110
+ return BehaviourNames.SOUND_REACTIVE_BEHAVIOUR;
111
+ }
112
+ getProps() {
113
+ return {
114
+ enabled: this.enabled,
115
+ priority: this.priority,
116
+ isPlaying: this.isPlaying,
117
+ useColor: this.useColor,
118
+ useVelocity: this.useVelocity,
119
+ useSize: this.useSize,
120
+ useRotation: this.useRotation,
121
+ useRandomColor: this.useRandomColor, // Include random color toggle in props
122
+ beatColor: this.beatColor, // Include beat color with alpha in props
123
+ amplitudeFactor: this.amplitudeFactor,
124
+ frequencyFactor: this.frequencyFactor,
125
+ rotationFactor: this.rotationFactor,
126
+ beatSensitivity: this.beatSensitivity,
127
+ velocityFactor: this.velocityFactor,
128
+ name: this.getName(),
129
+ };
130
+ }
131
+ }
132
+ //# sourceMappingURL=SoundReactiveBehaviour.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoundReactiveBehaviour.js","sourceRoot":"","sources":["../../../src/lib/behaviour/SoundReactiveBehaviour.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { Behaviour } from './index';
2
+ import Particle from '../Particle';
3
+ export default class SpawnBehaviour extends Behaviour {
4
+ enabled: boolean;
5
+ priority: number;
6
+ overOne: boolean;
7
+ trailProgress: number;
8
+ trailingEnabled: boolean;
9
+ spawnAlongTrail: boolean;
10
+ trailSpeed: number;
11
+ trailRepeat: boolean;
12
+ trailStart: number;
13
+ currentProgress: number;
14
+ customPoints: any[];
15
+ lastWordSettings: any;
16
+ /**
17
+ * Initialize particles for each custom point.
18
+ * @param {Particle} particle - The particle to initialize.
19
+ */
20
+ init: (particle: Particle) => void;
21
+ apply: () => void;
22
+ /**
23
+ * Calculate trail positions along the range from trailStart to currentProgress.
24
+ * @param {Object} point - The custom point configuration.
25
+ * @returns {Point[]} List of positions along the trail.
26
+ */
27
+ calculateTrailRangePositions: (point: any) => {
28
+ positions: {
29
+ x: any;
30
+ y: any;
31
+ z: any;
32
+ }[];
33
+ probabilities: number[];
34
+ };
35
+ /**
36
+ * Spawn particle at the specified point configuration.
37
+ * @param {Particle} particle - The particle to be initialized.
38
+ * @param {Object} point - The custom point configuration.
39
+ */
40
+ spawnParticleAtPoint: (particle: Particle, point: any) => void;
41
+ /**
42
+ * Calculate canvas context for rendering text-based particles.
43
+ * @param {Object} point - The custom point configuration.
44
+ */
45
+ calculateCtx: (point: any) => void;
46
+ calculateTrailPosition: (point: any, overrideProgress?: number) => {
47
+ x: any;
48
+ y: any;
49
+ z: any;
50
+ };
51
+ /**
52
+ * Update trail progress once per frame.
53
+ * @param {number} deltaTime - Time since the last update
54
+ */
55
+ updateTrailProgress: (deltaTime: number) => void;
56
+ weightedRandomIndex: (probabilities: any) => any;
57
+ /**
58
+ * Update method to be called once per frame.
59
+ * @param {number} deltaTime - Time since the last frame
60
+ */
61
+ update: (deltaTime: number) => void;
62
+ /**
63
+ * Adds a random variance to the given value
64
+ * @param {number} value - The value to calculate
65
+ * @param {number} variance - The random variance to add
66
+ * @returns {number} The calculated value
67
+ */
68
+ calculate: (value: number, variance: number) => number;
69
+ /**
70
+ * Gets the name of the behaviour
71
+ * @return {string} The name of the behaviour
72
+ */
73
+ getName(): string;
74
+ /**
75
+ * Retrieves the properties of the custom points.
76
+ * @returns {Object[]} The array of custom points and their properties.
77
+ */
78
+ getProps(): {
79
+ enabled: boolean;
80
+ priority: number;
81
+ trailingEnabled: boolean;
82
+ spawnAlongTrail: boolean;
83
+ trailSpeed: number;
84
+ trailRepeat: boolean;
85
+ trailStart: number;
86
+ customPoints: any[];
87
+ name: string;
88
+ };
89
+ }