@joydle/juice-babylon 0.1.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/dist/CameraShake.d.ts +34 -0
- package/dist/CameraShake.d.ts.map +1 -0
- package/dist/CameraShake.js +85 -0
- package/dist/CameraShake.js.map +1 -0
- package/dist/MaterialFlash.d.ts +13 -0
- package/dist/MaterialFlash.d.ts.map +1 -0
- package/dist/MaterialFlash.js +56 -0
- package/dist/MaterialFlash.js.map +1 -0
- package/dist/MeshHelpers.d.ts +57 -0
- package/dist/MeshHelpers.d.ts.map +1 -0
- package/dist/MeshHelpers.js +140 -0
- package/dist/MeshHelpers.js.map +1 -0
- package/dist/ParticleBurst.d.ts +44 -0
- package/dist/ParticleBurst.d.ts.map +1 -0
- package/dist/ParticleBurst.js +126 -0
- package/dist/ParticleBurst.js.map +1 -0
- package/dist/TrailMesh.d.ts +30 -0
- package/dist/TrailMesh.d.ts.map +1 -0
- package/dist/TrailMesh.js +98 -0
- package/dist/TrailMesh.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/toolkit.d.ts +30 -0
- package/dist/toolkit.d.ts.map +1 -0
- package/dist/toolkit.js +87 -0
- package/dist/toolkit.js.map +1 -0
- package/dist/types.d.ts +111 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { BabylonCamera } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Applies random positional jitter to a Babylon.js camera.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* ```ts
|
|
7
|
+
* const shake = new CameraShake(camera);
|
|
8
|
+
* shake.trigger(0.5, 0.3); // intensity 0.5, duration 0.3s
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export declare class CameraShake {
|
|
12
|
+
private camera;
|
|
13
|
+
private originalPos;
|
|
14
|
+
private intensity;
|
|
15
|
+
private duration;
|
|
16
|
+
private elapsed;
|
|
17
|
+
private rafId;
|
|
18
|
+
private lastTime;
|
|
19
|
+
constructor(camera: BabylonCamera);
|
|
20
|
+
/**
|
|
21
|
+
* Begin (or restart) a camera shake.
|
|
22
|
+
* If a shake is already in progress the previous one is replaced -- the
|
|
23
|
+
* camera position is first restored before starting the new shake.
|
|
24
|
+
*
|
|
25
|
+
* @param intensity Maximum displacement per axis (world units).
|
|
26
|
+
* @param duration Shake duration in **seconds**.
|
|
27
|
+
*/
|
|
28
|
+
trigger(intensity: number, duration: number): void;
|
|
29
|
+
/** Stop the shake immediately and snap back to the original position. */
|
|
30
|
+
stop(): void;
|
|
31
|
+
private loop;
|
|
32
|
+
private restore;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=CameraShake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraShake.d.ts","sourceRoot":"","sources":["../src/CameraShake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAoD;IACvE,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAK;gBAET,MAAM,EAAE,aAAa;IAIjC;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAoBlD,yEAAyE;IACzE,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,IAAI,CAsBV;IAEF,OAAO,CAAC,OAAO;CAShB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies random positional jitter to a Babylon.js camera.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```ts
|
|
6
|
+
* const shake = new CameraShake(camera);
|
|
7
|
+
* shake.trigger(0.5, 0.3); // intensity 0.5, duration 0.3s
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export class CameraShake {
|
|
11
|
+
camera;
|
|
12
|
+
originalPos = null;
|
|
13
|
+
intensity = 0;
|
|
14
|
+
duration = 0;
|
|
15
|
+
elapsed = 0;
|
|
16
|
+
rafId = null;
|
|
17
|
+
lastTime = 0;
|
|
18
|
+
constructor(camera) {
|
|
19
|
+
this.camera = camera;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Begin (or restart) a camera shake.
|
|
23
|
+
* If a shake is already in progress the previous one is replaced -- the
|
|
24
|
+
* camera position is first restored before starting the new shake.
|
|
25
|
+
*
|
|
26
|
+
* @param intensity Maximum displacement per axis (world units).
|
|
27
|
+
* @param duration Shake duration in **seconds**.
|
|
28
|
+
*/
|
|
29
|
+
trigger(intensity, duration) {
|
|
30
|
+
// If we are already shaking, restore position before restarting.
|
|
31
|
+
if (this.rafId !== null) {
|
|
32
|
+
this.restore();
|
|
33
|
+
cancelAnimationFrame(this.rafId);
|
|
34
|
+
this.rafId = null;
|
|
35
|
+
}
|
|
36
|
+
this.intensity = intensity;
|
|
37
|
+
this.duration = duration;
|
|
38
|
+
this.elapsed = 0;
|
|
39
|
+
this.originalPos = {
|
|
40
|
+
x: this.camera.position.x,
|
|
41
|
+
y: this.camera.position.y,
|
|
42
|
+
z: this.camera.position.z,
|
|
43
|
+
};
|
|
44
|
+
this.lastTime = performance.now();
|
|
45
|
+
this.rafId = requestAnimationFrame(this.loop);
|
|
46
|
+
}
|
|
47
|
+
/** Stop the shake immediately and snap back to the original position. */
|
|
48
|
+
stop() {
|
|
49
|
+
if (this.rafId !== null) {
|
|
50
|
+
cancelAnimationFrame(this.rafId);
|
|
51
|
+
this.rafId = null;
|
|
52
|
+
}
|
|
53
|
+
this.restore();
|
|
54
|
+
}
|
|
55
|
+
// ---- internal -----------------------------------------------------------
|
|
56
|
+
loop = (now) => {
|
|
57
|
+
const dt = (now - this.lastTime) / 1000; // seconds
|
|
58
|
+
this.lastTime = now;
|
|
59
|
+
this.elapsed += dt;
|
|
60
|
+
if (this.elapsed >= this.duration) {
|
|
61
|
+
this.restore();
|
|
62
|
+
this.rafId = null;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Linear decay from 1 to 0 over the duration.
|
|
66
|
+
const decay = 1 - this.elapsed / this.duration;
|
|
67
|
+
const mag = this.intensity * decay;
|
|
68
|
+
const pos = this.camera.position;
|
|
69
|
+
const orig = this.originalPos;
|
|
70
|
+
pos.x = orig.x + (Math.random() * 2 - 1) * mag;
|
|
71
|
+
pos.y = orig.y + (Math.random() * 2 - 1) * mag;
|
|
72
|
+
pos.z = orig.z + (Math.random() * 2 - 1) * mag;
|
|
73
|
+
this.rafId = requestAnimationFrame(this.loop);
|
|
74
|
+
};
|
|
75
|
+
restore() {
|
|
76
|
+
if (this.originalPos) {
|
|
77
|
+
const pos = this.camera.position;
|
|
78
|
+
pos.x = this.originalPos.x;
|
|
79
|
+
pos.y = this.originalPos.y;
|
|
80
|
+
pos.z = this.originalPos.z;
|
|
81
|
+
this.originalPos = null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=CameraShake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraShake.js","sourceRoot":"","sources":["../src/CameraShake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BabylonMesh, BabylonColor } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Briefly flash a mesh's emissive colour and animate it back using GSAP.
|
|
4
|
+
*
|
|
5
|
+
* Handles meshes without a material (or without emissiveColor) gracefully
|
|
6
|
+
* by returning early as a no-op.
|
|
7
|
+
*
|
|
8
|
+
* @param mesh The Babylon.js mesh to flash.
|
|
9
|
+
* @param color Flash colour (Babylon Color3/Color4 or any `{r, g, b}`).
|
|
10
|
+
* @param duration Flash duration in **seconds**.
|
|
11
|
+
*/
|
|
12
|
+
export declare function MaterialFlash(mesh: BabylonMesh, color: BabylonColor, duration: number): void;
|
|
13
|
+
//# sourceMappingURL=MaterialFlash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaterialFlash.d.ts","sourceRoot":"","sources":["../src/MaterialFlash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AAyBtE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,GACf,IAAI,CA0BN"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Resolve gsap at runtime (peer dependency).
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
function getGsap() {
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
const g = globalThis;
|
|
7
|
+
if (g.gsap)
|
|
8
|
+
return g.gsap;
|
|
9
|
+
try {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
+
return require('gsap');
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
throw new Error('[juice-babylon] Could not resolve "gsap". ' +
|
|
15
|
+
'Make sure it is installed as a peer dependency or available as window.gsap.');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// MaterialFlash
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Briefly flash a mesh's emissive colour and animate it back using GSAP.
|
|
23
|
+
*
|
|
24
|
+
* Handles meshes without a material (or without emissiveColor) gracefully
|
|
25
|
+
* by returning early as a no-op.
|
|
26
|
+
*
|
|
27
|
+
* @param mesh The Babylon.js mesh to flash.
|
|
28
|
+
* @param color Flash colour (Babylon Color3/Color4 or any `{r, g, b}`).
|
|
29
|
+
* @param duration Flash duration in **seconds**.
|
|
30
|
+
*/
|
|
31
|
+
export function MaterialFlash(mesh, color, duration) {
|
|
32
|
+
// Guard: no material or no emissiveColor property.
|
|
33
|
+
if (!mesh.material)
|
|
34
|
+
return;
|
|
35
|
+
if (!mesh.material.emissiveColor)
|
|
36
|
+
return;
|
|
37
|
+
const gsap = getGsap();
|
|
38
|
+
const emissive = mesh.material.emissiveColor;
|
|
39
|
+
// Save the original emissive values.
|
|
40
|
+
const origR = emissive.r;
|
|
41
|
+
const origG = emissive.g;
|
|
42
|
+
const origB = emissive.b;
|
|
43
|
+
// Snap to the flash colour immediately.
|
|
44
|
+
emissive.r = color.r;
|
|
45
|
+
emissive.g = color.g;
|
|
46
|
+
emissive.b = color.b;
|
|
47
|
+
// Animate back to the original emissive colour over `duration` seconds.
|
|
48
|
+
gsap.to(emissive, {
|
|
49
|
+
r: origR,
|
|
50
|
+
g: origG,
|
|
51
|
+
b: origB,
|
|
52
|
+
duration,
|
|
53
|
+
overwrite: true,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=MaterialFlash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaterialFlash.js","sourceRoot":"","sources":["../src/MaterialFlash.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,SAAS,OAAO;IACd,8DAA8D;IAC9D,MAAM,CAAC,GAAG,UAAiB,CAAC;IAC5B,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,IAAgB,CAAC;IACtC,IAAI,CAAC;QACH,iEAAiE;QACjE,OAAO,OAAO,CAAC,MAAM,CAAa,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,4CAA4C;YAC1C,6EAA6E,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAiB,EACjB,KAAmB,EACnB,QAAgB;IAEhB,mDAAmD;IACnD,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO;IAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa;QAAE,OAAO;IAEzC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;IAE7C,qCAAqC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;IAEzB,wCAAwC;IACxC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACrB,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACrB,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAErB,wEAAwE;IACxE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;QAChB,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,KAAK;QACR,QAAQ;QACR,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { BabylonMesh } from './types.js';
|
|
2
|
+
export interface SquashOptions {
|
|
3
|
+
/** Axis to squash along. @default 'y' */
|
|
4
|
+
axis?: 'x' | 'y' | 'z';
|
|
5
|
+
/** Squash amount (0-1, where 1 = fully flattened). @default 0.4 */
|
|
6
|
+
amount?: number;
|
|
7
|
+
/** Duration in seconds. @default 0.2 */
|
|
8
|
+
duration?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ExplodeOutOptions {
|
|
11
|
+
/** Target scale multiplier. @default 2 */
|
|
12
|
+
scaleTo?: number;
|
|
13
|
+
/** Duration of the fade/scale animation in seconds. @default 0.4 */
|
|
14
|
+
fadeDuration?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface BobOptions {
|
|
17
|
+
/** Vertical displacement in world units. @default 0.3 */
|
|
18
|
+
height?: number;
|
|
19
|
+
/** Full cycle duration in seconds. @default 1.5 */
|
|
20
|
+
speed?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface SpinOptions {
|
|
23
|
+
/** Axis to spin around. @default 'y' */
|
|
24
|
+
axis?: 'x' | 'y' | 'z';
|
|
25
|
+
/** Full rotation duration in seconds. @default 2 */
|
|
26
|
+
speed?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface JuicedMesh extends BabylonMesh {
|
|
29
|
+
/** Squash-and-stretch on one axis, then return to normal scale. */
|
|
30
|
+
squash(opts?: SquashOptions): void;
|
|
31
|
+
/** Scale up and fade out (visibility -> 0). */
|
|
32
|
+
explodeOut(opts?: ExplodeOutOptions): void;
|
|
33
|
+
/** Continuous bobbing on position.y. Returns a kill function. */
|
|
34
|
+
bob(opts?: BobOptions): {
|
|
35
|
+
kill(): void;
|
|
36
|
+
};
|
|
37
|
+
/** Continuous spinning on one rotation axis. Returns a kill function. */
|
|
38
|
+
spin(opts?: SpinOptions): {
|
|
39
|
+
kill(): void;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Attaches juice helper methods (`.squash()`, `.explodeOut()`, `.bob()`,
|
|
44
|
+
* `.spin()`) directly onto a Babylon mesh instance.
|
|
45
|
+
*
|
|
46
|
+
* All animations use GSAP and operate on the mesh's `scaling`, `position`,
|
|
47
|
+
* `rotation`, and `visibility` properties -- fully compatible with Babylon's
|
|
48
|
+
* render loop.
|
|
49
|
+
*
|
|
50
|
+
* Usage:
|
|
51
|
+
* ```ts
|
|
52
|
+
* addMeshHelpers(myMesh);
|
|
53
|
+
* (myMesh as JuicedMesh).squash({ axis: 'y', amount: 0.5 });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function addMeshHelpers(mesh: BabylonMesh): void;
|
|
57
|
+
//# sourceMappingURL=MeshHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshHelpers.d.ts","sourceRoot":"","sources":["../src/MeshHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,YAAY,CAAC;AAyBvE,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,mEAAmE;IACnE,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC,+CAA+C;IAC/C,UAAU,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3C,iEAAiE;IACjE,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG;QAAE,IAAI,IAAI,IAAI,CAAA;KAAE,CAAC;IACzC,yEAAyE;IACzE,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG;QAAE,IAAI,IAAI,IAAI,CAAA;KAAE,CAAC;CAC5C;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CA4HtD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Resolve gsap at runtime (peer dependency).
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
function getGsap() {
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
const g = globalThis;
|
|
7
|
+
if (g.gsap)
|
|
8
|
+
return g.gsap;
|
|
9
|
+
try {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
+
return require('gsap');
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
throw new Error('[juice-babylon] Could not resolve "gsap". ' +
|
|
15
|
+
'Make sure it is installed as a peer dependency or available as window.gsap.');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// addMeshHelpers
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Attaches juice helper methods (`.squash()`, `.explodeOut()`, `.bob()`,
|
|
23
|
+
* `.spin()`) directly onto a Babylon mesh instance.
|
|
24
|
+
*
|
|
25
|
+
* All animations use GSAP and operate on the mesh's `scaling`, `position`,
|
|
26
|
+
* `rotation`, and `visibility` properties -- fully compatible with Babylon's
|
|
27
|
+
* render loop.
|
|
28
|
+
*
|
|
29
|
+
* Usage:
|
|
30
|
+
* ```ts
|
|
31
|
+
* addMeshHelpers(myMesh);
|
|
32
|
+
* (myMesh as JuicedMesh).squash({ axis: 'y', amount: 0.5 });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function addMeshHelpers(mesh) {
|
|
36
|
+
const m = mesh;
|
|
37
|
+
// -- squash --------------------------------------------------------------
|
|
38
|
+
m.squash = function squash(opts = {}) {
|
|
39
|
+
const gsap = getGsap();
|
|
40
|
+
const axis = opts.axis ?? 'y';
|
|
41
|
+
const amount = opts.amount ?? 0.4;
|
|
42
|
+
const duration = opts.duration ?? 0.2;
|
|
43
|
+
const halfDur = duration / 2;
|
|
44
|
+
// Remember the original scale on the target axis.
|
|
45
|
+
const origScale = mesh.scaling[axis];
|
|
46
|
+
const squashedScale = origScale * (1 - amount);
|
|
47
|
+
// Complementary axes stretch to conserve volume.
|
|
48
|
+
const stretchAxes = ['x', 'y', 'z'].filter((a) => a !== axis);
|
|
49
|
+
const stretchFactor = 1 / Math.sqrt(1 - amount);
|
|
50
|
+
const origStretch = {};
|
|
51
|
+
for (const a of stretchAxes) {
|
|
52
|
+
origStretch[a] = mesh.scaling[a];
|
|
53
|
+
}
|
|
54
|
+
// Phase 1: squash down.
|
|
55
|
+
const squashVars = {
|
|
56
|
+
[axis]: squashedScale,
|
|
57
|
+
duration: halfDur,
|
|
58
|
+
overwrite: true,
|
|
59
|
+
onComplete: () => {
|
|
60
|
+
// Phase 2: spring back to original.
|
|
61
|
+
const restoreVars = {
|
|
62
|
+
[axis]: origScale,
|
|
63
|
+
duration: halfDur,
|
|
64
|
+
ease: 'back.out(2)',
|
|
65
|
+
};
|
|
66
|
+
for (const a of stretchAxes) {
|
|
67
|
+
restoreVars[a] = origStretch[a];
|
|
68
|
+
}
|
|
69
|
+
gsap.to(mesh.scaling, restoreVars);
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
for (const a of stretchAxes) {
|
|
73
|
+
squashVars[a] = origStretch[a] * stretchFactor;
|
|
74
|
+
}
|
|
75
|
+
gsap.to(mesh.scaling, squashVars);
|
|
76
|
+
};
|
|
77
|
+
// -- explodeOut ----------------------------------------------------------
|
|
78
|
+
m.explodeOut = function explodeOut(opts = {}) {
|
|
79
|
+
const gsap = getGsap();
|
|
80
|
+
const scaleTo = opts.scaleTo ?? 2;
|
|
81
|
+
const fadeDuration = opts.fadeDuration ?? 0.4;
|
|
82
|
+
// Scale up on all axes.
|
|
83
|
+
gsap.to(mesh.scaling, {
|
|
84
|
+
x: mesh.scaling.x * scaleTo,
|
|
85
|
+
y: mesh.scaling.y * scaleTo,
|
|
86
|
+
z: mesh.scaling.z * scaleTo,
|
|
87
|
+
duration: fadeDuration,
|
|
88
|
+
ease: 'power2.out',
|
|
89
|
+
overwrite: true,
|
|
90
|
+
});
|
|
91
|
+
// Fade out visibility.
|
|
92
|
+
// Babylon meshes use `visibility` (0..1) rather than `opacity`.
|
|
93
|
+
gsap.to(mesh, {
|
|
94
|
+
visibility: 0,
|
|
95
|
+
duration: fadeDuration,
|
|
96
|
+
ease: 'power2.out',
|
|
97
|
+
overwrite: 'auto',
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
// -- bob -----------------------------------------------------------------
|
|
101
|
+
m.bob = function bob(opts = {}) {
|
|
102
|
+
const gsap = getGsap();
|
|
103
|
+
const height = opts.height ?? 0.3;
|
|
104
|
+
const speed = opts.speed ?? 1.5;
|
|
105
|
+
const baseY = mesh.position.y;
|
|
106
|
+
const tween = gsap.to(mesh.position, {
|
|
107
|
+
y: baseY + height,
|
|
108
|
+
duration: speed / 2,
|
|
109
|
+
ease: 'sine.inOut',
|
|
110
|
+
yoyo: true,
|
|
111
|
+
repeat: -1, // infinite
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
kill() {
|
|
115
|
+
tween.kill();
|
|
116
|
+
mesh.position.y = baseY;
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
// -- spin ----------------------------------------------------------------
|
|
121
|
+
m.spin = function spin(opts = {}) {
|
|
122
|
+
const gsap = getGsap();
|
|
123
|
+
const axis = opts.axis ?? 'y';
|
|
124
|
+
const speed = opts.speed ?? 2;
|
|
125
|
+
const baseRotation = mesh.rotation[axis];
|
|
126
|
+
const tween = gsap.to(mesh.rotation, {
|
|
127
|
+
[axis]: baseRotation + Math.PI * 2,
|
|
128
|
+
duration: speed,
|
|
129
|
+
ease: 'none',
|
|
130
|
+
repeat: -1, // infinite
|
|
131
|
+
});
|
|
132
|
+
return {
|
|
133
|
+
kill() {
|
|
134
|
+
tween.kill();
|
|
135
|
+
mesh.rotation[axis] = baseRotation;
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=MeshHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshHelpers.js","sourceRoot":"","sources":["../src/MeshHelpers.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,SAAS,OAAO;IACd,8DAA8D;IAC9D,MAAM,CAAC,GAAG,UAAiB,CAAC;IAC5B,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,IAAgB,CAAC;IACtC,IAAI,CAAC;QACH,iEAAiE;QACjE,OAAO,OAAO,CAAC,MAAM,CAAa,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,4CAA4C;YAC1C,6EAA6E,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAmDD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC9C,MAAM,CAAC,GAAG,IAAkB,CAAC;IAE7B,2EAA2E;IAE3E,CAAC,CAAC,MAAM,GAAG,SAAS,MAAM,CAAC,OAAsB,EAAE;QACjD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;QACtC,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC;QAE7B,kDAAkD;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAE/C,iDAAiD;QACjD,MAAM,WAAW,GAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACzE,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAChD,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,wBAAwB;QACxB,MAAM,UAAU,GAA4B;YAC1C,CAAC,IAAI,CAAC,EAAE,aAAa;YACrB,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,GAAG,EAAE;gBACf,oCAAoC;gBACpC,MAAM,WAAW,GAA4B;oBAC3C,CAAC,IAAI,CAAC,EAAE,SAAS;oBACjB,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,aAAa;iBACpB,CAAC;gBACF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;oBAC5B,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACrC,CAAC;SACF,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,2EAA2E;IAE3E,CAAC,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,OAA0B,EAAE;QAC7D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC;QAE9C,wBAAwB;QACxB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YACpB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO;YAC3B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO;YAC3B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO;YAC3B,QAAQ,EAAE,YAAY;YACtB,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,uBAAuB;QACvB,gEAAgE;QAChE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;YACZ,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,YAAY;YACtB,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,2EAA2E;IAE3E,CAAC,CAAC,GAAG,GAAG,SAAS,GAAG,CAAC,OAAmB,EAAE;QACxC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;QAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9B,MAAM,KAAK,GAAkB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClD,CAAC,EAAE,KAAK,GAAG,MAAM;YACjB,QAAQ,EAAE,KAAK,GAAG,CAAC;YACnB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,CAAC,CAAC,EAAE,WAAW;SACxB,CAAC,CAAC;QAEH,OAAO;YACL,IAAI;gBACF,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC;YAC1B,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,2EAA2E;IAE3E,CAAC,CAAC,IAAI,GAAG,SAAS,IAAI,CAAC,OAAoB,EAAE;QAC3C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAkB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClD,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;YAClC,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,CAAC,CAAC,EAAE,WAAW;SACxB,CAAC,CAAC;QAEH,OAAO;YACL,IAAI;gBACF,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;YACrC,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { BabylonScene, BabylonColor } from './types.js';
|
|
2
|
+
export interface ParticleBurstOptions {
|
|
3
|
+
/** Maximum particle capacity. @default 60 */
|
|
4
|
+
max?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface BurstOptions {
|
|
7
|
+
/** Particle colour (Babylon Color4 or any {r,g,b,a?}). */
|
|
8
|
+
color: BabylonColor;
|
|
9
|
+
/** Number of particles to emit. */
|
|
10
|
+
count: number;
|
|
11
|
+
/** Ejection speed (units/s). @default 3 */
|
|
12
|
+
speed?: number;
|
|
13
|
+
/** Particle lifetime in seconds. @default 0.6 */
|
|
14
|
+
lifetime?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Wrapper around Babylon's `ParticleSystem` providing a one-shot burst API.
|
|
18
|
+
*
|
|
19
|
+
* Each call to `burst()` creates a short-lived particle system that
|
|
20
|
+
* automatically disposes itself after the particles die.
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* ```ts
|
|
24
|
+
* const pb = new ParticleBurst(scene);
|
|
25
|
+
* pb.burst({ x: 0, y: 1, z: 0 }, { color: new Color4(1,0,0,1), count: 30 });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class ParticleBurst {
|
|
29
|
+
private scene;
|
|
30
|
+
private max;
|
|
31
|
+
private activeSystems;
|
|
32
|
+
constructor(scene: BabylonScene, opts?: ParticleBurstOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Emit a burst of particles at a world-space position.
|
|
35
|
+
*/
|
|
36
|
+
burst(position: {
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
z: number;
|
|
40
|
+
}, opts: BurstOptions): void;
|
|
41
|
+
/** Dispose all active particle systems immediately. */
|
|
42
|
+
dispose(): void;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ParticleBurst.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParticleBurst.d.ts","sourceRoot":"","sources":["../src/ParticleBurst.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAEb,MAAM,YAAY,CAAC;AAuEpB,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,KAAK,EAAE,YAAY,CAAC;IACpB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,aAAa,CAAmC;gBAE5C,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,oBAAyB;IAKhE;;OAEG;IACH,KAAK,CACH,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAC7C,IAAI,EAAE,YAAY,GACjB,IAAI;IAoFP,uDAAuD;IACvD,OAAO,IAAI,IAAI;CAWhB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/** Cached reference to the Babylon namespace. */
|
|
2
|
+
let BABYLON = null;
|
|
3
|
+
function ensureBabylon() {
|
|
4
|
+
if (BABYLON)
|
|
5
|
+
return BABYLON;
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
const g = globalThis;
|
|
8
|
+
if (g.BABYLON) {
|
|
9
|
+
BABYLON = g.BABYLON;
|
|
10
|
+
return BABYLON;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
14
|
+
BABYLON = require('@babylonjs/core');
|
|
15
|
+
return BABYLON;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new Error('[juice-babylon] Could not resolve "@babylonjs/core". ' +
|
|
19
|
+
'Make sure it is installed as a peer dependency or available as window.BABYLON.');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// 1x1 white pixel as a minimal default particle texture (base64 PNG).
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
const WHITE_PIXEL_BASE64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5/hPwAIAgL/4d1j8wAAAABJRU5ErkJggg==';
|
|
26
|
+
/**
|
|
27
|
+
* Wrapper around Babylon's `ParticleSystem` providing a one-shot burst API.
|
|
28
|
+
*
|
|
29
|
+
* Each call to `burst()` creates a short-lived particle system that
|
|
30
|
+
* automatically disposes itself after the particles die.
|
|
31
|
+
*
|
|
32
|
+
* Usage:
|
|
33
|
+
* ```ts
|
|
34
|
+
* const pb = new ParticleBurst(scene);
|
|
35
|
+
* pb.burst({ x: 0, y: 1, z: 0 }, { color: new Color4(1,0,0,1), count: 30 });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export class ParticleBurst {
|
|
39
|
+
scene;
|
|
40
|
+
max;
|
|
41
|
+
activeSystems = [];
|
|
42
|
+
constructor(scene, opts = {}) {
|
|
43
|
+
this.scene = scene;
|
|
44
|
+
this.max = opts.max ?? 60;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Emit a burst of particles at a world-space position.
|
|
48
|
+
*/
|
|
49
|
+
burst(position, opts) {
|
|
50
|
+
const B = ensureBabylon();
|
|
51
|
+
const speed = opts.speed ?? 3;
|
|
52
|
+
const lifetime = opts.lifetime ?? 0.6;
|
|
53
|
+
const count = opts.count;
|
|
54
|
+
const ps = new B.ParticleSystem('juice_burst_' + Date.now(), this.max, this.scene);
|
|
55
|
+
// -- Emitter at the given position ------------------------------------
|
|
56
|
+
ps.emitter = new B.Vector3(position.x, position.y, position.z);
|
|
57
|
+
// Emit from a single point.
|
|
58
|
+
ps.minEmitBox = new B.Vector3(0, 0, 0);
|
|
59
|
+
ps.maxEmitBox = new B.Vector3(0, 0, 0);
|
|
60
|
+
// -- Colours ----------------------------------------------------------
|
|
61
|
+
const c = opts.color;
|
|
62
|
+
const alpha = c.a ?? 1;
|
|
63
|
+
ps.color1 = new B.Color4(c.r, c.g, c.b, alpha);
|
|
64
|
+
ps.color2 = new B.Color4(c.r * 0.8, c.g * 0.8, c.b * 0.8, alpha);
|
|
65
|
+
ps.colorDead = new B.Color4(c.r * 0.2, c.g * 0.2, c.b * 0.2, 0);
|
|
66
|
+
// -- Size -------------------------------------------------------------
|
|
67
|
+
ps.minSize = 0.05;
|
|
68
|
+
ps.maxSize = 0.15;
|
|
69
|
+
// -- Lifetime ---------------------------------------------------------
|
|
70
|
+
ps.minLifeTime = lifetime * 0.5;
|
|
71
|
+
ps.maxLifeTime = lifetime;
|
|
72
|
+
// -- Emission rate (high burst then stop) ------------------------------
|
|
73
|
+
// We emit all particles immediately in one big burst by setting a high
|
|
74
|
+
// rate and a short target stop duration.
|
|
75
|
+
ps.emitRate = count * 10; // emit very fast
|
|
76
|
+
ps.blendMode = 1; // BLENDMODE_ONEONE (additive)
|
|
77
|
+
// -- Speed / direction ------------------------------------------------
|
|
78
|
+
ps.minEmitPower = speed * 0.5;
|
|
79
|
+
ps.maxEmitPower = speed;
|
|
80
|
+
ps.updateSpeed = 0.01;
|
|
81
|
+
// Omnidirectional burst.
|
|
82
|
+
ps.direction1 = new B.Vector3(-1, -1, -1);
|
|
83
|
+
ps.direction2 = new B.Vector3(1, 1, 1);
|
|
84
|
+
// -- Auto-stop & dispose ----------------------------------------------
|
|
85
|
+
// targetStopDuration causes the system to stop emitting after N seconds,
|
|
86
|
+
// and disposeOnStop cleans up the GPU resources automatically.
|
|
87
|
+
ps.targetStopDuration = 0.05; // emit for a very short window
|
|
88
|
+
ps.disposeOnStop = true;
|
|
89
|
+
// Try to create a default particle texture. Babylon ParticleSystem
|
|
90
|
+
// requires a particleTexture to render. We use a 1x1 white pixel so the
|
|
91
|
+
// system works without external asset loading.
|
|
92
|
+
try {
|
|
93
|
+
if (B.Texture?.CreateFromBase64String) {
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
+
ps.particleTexture = B.Texture.CreateFromBase64String(WHITE_PIXEL_BASE64, 'juice_particle_tex', this.scene);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Non-critical -- particles may render as white squares.
|
|
100
|
+
}
|
|
101
|
+
// Track for bulk dispose.
|
|
102
|
+
this.activeSystems.push(ps);
|
|
103
|
+
ps.start();
|
|
104
|
+
// Remove from tracking after particles are fully dead.
|
|
105
|
+
const cleanupDelay = (lifetime + 0.1) * 1000;
|
|
106
|
+
setTimeout(() => {
|
|
107
|
+
const idx = this.activeSystems.indexOf(ps);
|
|
108
|
+
if (idx !== -1)
|
|
109
|
+
this.activeSystems.splice(idx, 1);
|
|
110
|
+
}, cleanupDelay);
|
|
111
|
+
}
|
|
112
|
+
/** Dispose all active particle systems immediately. */
|
|
113
|
+
dispose() {
|
|
114
|
+
for (const ps of this.activeSystems) {
|
|
115
|
+
try {
|
|
116
|
+
ps.stop();
|
|
117
|
+
ps.dispose();
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Already disposed or scene gone.
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
this.activeSystems.length = 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=ParticleBurst.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParticleBurst.js","sourceRoot":"","sources":["../src/ParticleBurst.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BabylonScene, BabylonMesh, BabylonColor } from './types.js';
|
|
2
|
+
export interface TrailOptions {
|
|
3
|
+
/** Trail length (number of segments). @default 60 */
|
|
4
|
+
length?: number;
|
|
5
|
+
/** Trail diameter. @default 0.2 */
|
|
6
|
+
diameter?: number;
|
|
7
|
+
/** Trail colour. If omitted, uses a default white. */
|
|
8
|
+
color?: BabylonColor;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Wrapper around Babylon's `TrailMesh` that follows a source mesh.
|
|
12
|
+
*
|
|
13
|
+
* If `TrailMesh` is not available in the current Babylon.js build, all
|
|
14
|
+
* operations become no-ops, so it is safe to use unconditionally.
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```ts
|
|
18
|
+
* const trail = new TrailEffect(scene, playerMesh, { length: 80, color: myColor });
|
|
19
|
+
* // ... later
|
|
20
|
+
* trail.dispose();
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class TrailEffect {
|
|
24
|
+
private trail;
|
|
25
|
+
private material;
|
|
26
|
+
constructor(scene: BabylonScene, mesh: BabylonMesh, opts?: TrailOptions);
|
|
27
|
+
/** Stop the trail and release GPU resources. */
|
|
28
|
+
dispose(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=TrailMesh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrailMesh.d.ts","sourceRoot":"","sources":["../src/TrailMesh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4E1E,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,QAAQ,CAAqC;gBAGnD,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE,YAAiB;IAqDzB,gDAAgD;IAChD,OAAO,IAAI,IAAI;CAkBhB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/** Cached reference. */
|
|
2
|
+
let BABYLON = null;
|
|
3
|
+
function resolveBabylon() {
|
|
4
|
+
if (BABYLON)
|
|
5
|
+
return BABYLON;
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
const g = globalThis;
|
|
8
|
+
if (g.BABYLON) {
|
|
9
|
+
BABYLON = g.BABYLON;
|
|
10
|
+
return BABYLON;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
14
|
+
BABYLON = require('@babylonjs/core');
|
|
15
|
+
return BABYLON;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Return empty namespace -- TrailMesh will be unavailable and we gracefully no-op.
|
|
19
|
+
BABYLON = {};
|
|
20
|
+
return BABYLON;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Wrapper around Babylon's `TrailMesh` that follows a source mesh.
|
|
25
|
+
*
|
|
26
|
+
* If `TrailMesh` is not available in the current Babylon.js build, all
|
|
27
|
+
* operations become no-ops, so it is safe to use unconditionally.
|
|
28
|
+
*
|
|
29
|
+
* Usage:
|
|
30
|
+
* ```ts
|
|
31
|
+
* const trail = new TrailEffect(scene, playerMesh, { length: 80, color: myColor });
|
|
32
|
+
* // ... later
|
|
33
|
+
* trail.dispose();
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export class TrailEffect {
|
|
37
|
+
trail = null;
|
|
38
|
+
material = null;
|
|
39
|
+
constructor(scene, mesh, opts = {}) {
|
|
40
|
+
const B = resolveBabylon();
|
|
41
|
+
if (!B.TrailMesh) {
|
|
42
|
+
// TrailMesh not available in this Babylon build -- graceful no-op.
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const length = opts.length ?? 60;
|
|
46
|
+
const diameter = opts.diameter ?? 0.2;
|
|
47
|
+
try {
|
|
48
|
+
this.trail = new B.TrailMesh('juice_trail_' + mesh.name, mesh, scene, diameter, length, true);
|
|
49
|
+
// Apply colour via a simple emissive material if constructors are available.
|
|
50
|
+
if (B.StandardMaterial && opts.color) {
|
|
51
|
+
const mat = new B.StandardMaterial('juice_trail_mat_' + mesh.name, scene);
|
|
52
|
+
mat.emissiveColor = opts.color;
|
|
53
|
+
if (B.Color3) {
|
|
54
|
+
mat.diffuseColor = new B.Color3(0, 0, 0);
|
|
55
|
+
}
|
|
56
|
+
mat.alpha = 0.6;
|
|
57
|
+
mat.backFaceCulling = false;
|
|
58
|
+
// The TrailMesh exposes .mesh for the generated mesh geometry.
|
|
59
|
+
if (this.trail.mesh && this.trail.mesh.material !== undefined) {
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
this.trail.mesh.material = mat;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Some versions expose the material directly on the trail instance.
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
+
this.trail.material = mat;
|
|
67
|
+
}
|
|
68
|
+
this.material = mat;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Construction failed -- remain in no-op state.
|
|
73
|
+
this.trail = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Stop the trail and release GPU resources. */
|
|
77
|
+
dispose() {
|
|
78
|
+
if (this.trail) {
|
|
79
|
+
try {
|
|
80
|
+
this.trail.dispose();
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Already disposed.
|
|
84
|
+
}
|
|
85
|
+
this.trail = null;
|
|
86
|
+
}
|
|
87
|
+
if (this.material) {
|
|
88
|
+
try {
|
|
89
|
+
this.material.dispose();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Already disposed.
|
|
93
|
+
}
|
|
94
|
+
this.material = null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=TrailMesh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrailMesh.js","sourceRoot":"","sources":["../src/TrailMesh.ts"],"names":[],"mappings":"AAkDA,wBAAwB;AACxB,IAAI,OAAO,GAAiC,IAAI,CAAC;AAEjD,SAAS,cAAc;IACrB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,8DAA8D;IAC9D,MAAM,CAAC,GAAG,UAAiB,CAAC;IAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,GAAG,CAAC,CAAC,OAAgC,CAAC;QAC7C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC;QACH,iEAAiE;QACjE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAA0B,CAAC;QAC9D,OAAO,OAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,mFAAmF;QACnF,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAeD;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,WAAW;IACd,KAAK,GAA6B,IAAI,CAAC;IACvC,QAAQ,GAAgC,IAAI,CAAC;IAErD,YACE,KAAmB,EACnB,IAAiB,EACjB,OAAqB,EAAE;QAEvB,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;QAE3B,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,mEAAmE;YACnE,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;QAEtC,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,SAAS,CAC1B,cAAc,GAAG,IAAI,CAAC,IAAI,EAC1B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,CACL,CAAC;YAEF,6EAA6E;YAC7E,IAAI,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,gBAAgB,CAChC,kBAAkB,GAAG,IAAI,CAAC,IAAI,EAC9B,KAAK,CACN,CAAC;gBACF,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC/B,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;oBACb,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3C,CAAC;gBACD,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC;gBAChB,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC;gBAE5B,+DAA+D;gBAC/D,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC9D,8DAA8D;oBAC7D,IAAI,CAAC,KAAa,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,8DAA8D;oBAC7D,IAAI,CAAC,KAAa,CAAC,QAAQ,GAAG,GAAG,CAAC;gBACrC,CAAC;gBAED,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;YAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type { BabylonVec3, BabylonColor, BabylonMaterial, BabylonMesh, BabylonCamera, BabylonScene, BabylonParticleSystemLike, GsapLike, GsapTweenLike, JuiceToolkit, } from './types.js';
|
|
2
|
+
export { CameraShake } from './CameraShake.js';
|
|
3
|
+
export { ParticleBurst } from './ParticleBurst.js';
|
|
4
|
+
export type { ParticleBurstOptions, BurstOptions } from './ParticleBurst.js';
|
|
5
|
+
export { MaterialFlash } from './MaterialFlash.js';
|
|
6
|
+
export { TrailEffect } from './TrailMesh.js';
|
|
7
|
+
export type { TrailOptions } from './TrailMesh.js';
|
|
8
|
+
export { addMeshHelpers } from './MeshHelpers.js';
|
|
9
|
+
export type { JuicedMesh, SquashOptions, ExplodeOutOptions, BobOptions, SpinOptions, } from './MeshHelpers.js';
|
|
10
|
+
export { createBabylonJuiceToolkit } from './toolkit.js';
|
|
11
|
+
export type { CreateToolkitOptions } from './toolkit.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,EACb,YAAY,EACZ,yBAAyB,EACzB,QAAQ,EACR,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,UAAU,EACV,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @joydle/juice-babylon -- Public API barrel
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Camera shake
|
|
5
|
+
export { CameraShake } from './CameraShake.js';
|
|
6
|
+
// Particle burst
|
|
7
|
+
export { ParticleBurst } from './ParticleBurst.js';
|
|
8
|
+
// Material flash
|
|
9
|
+
export { MaterialFlash } from './MaterialFlash.js';
|
|
10
|
+
// Trail mesh
|
|
11
|
+
export { TrailEffect } from './TrailMesh.js';
|
|
12
|
+
// Mesh helpers
|
|
13
|
+
export { addMeshHelpers } from './MeshHelpers.js';
|
|
14
|
+
// Toolkit factory
|
|
15
|
+
export { createBabylonJuiceToolkit } from './toolkit.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAgB9E,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,eAAe;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASlD,kBAAkB;AAClB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BabylonScene, BabylonCamera, JuiceToolkit } from './types.js';
|
|
2
|
+
export interface CreateToolkitOptions {
|
|
3
|
+
/** Maximum particles per burst system. @default 60 */
|
|
4
|
+
maxParticles?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Creates a unified `JuiceToolkit` for Babylon.js scenes.
|
|
8
|
+
*
|
|
9
|
+
* Internally instantiates a `CameraShake` and `ParticleBurst` and exposes
|
|
10
|
+
* them through the unified toolkit interface. Also provides `flash()`,
|
|
11
|
+
* `trail()`, and `addHelpers()` for material, trail, and mesh utilities.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { createBabylonJuiceToolkit } from '@joydle/juice-babylon';
|
|
16
|
+
*
|
|
17
|
+
* const juice = createBabylonJuiceToolkit(scene, camera);
|
|
18
|
+
* juice.shake({ intensity: 0.4, duration: 0.3 });
|
|
19
|
+
* juice.flash(mesh, { color: redColor, duration: 0.2 });
|
|
20
|
+
* juice.particles({ position: { x: 0, y: 1, z: 0 }, color: whiteColor, count: 30 });
|
|
21
|
+
* const trail = juice.trail(mesh, { length: 80, color: blueColor });
|
|
22
|
+
* juice.addHelpers(mesh);
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @param scene The Babylon.js scene.
|
|
26
|
+
* @param camera The Babylon.js camera (used for shake).
|
|
27
|
+
* @param opts Optional configuration.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createBabylonJuiceToolkit(scene: BabylonScene, camera: BabylonCamera, opts?: CreateToolkitOptions): JuiceToolkit;
|
|
30
|
+
//# sourceMappingURL=toolkit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolkit.d.ts","sourceRoot":"","sources":["../src/toolkit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAA6B,YAAY,EAAE,MAAM,YAAY,CAAC;AAWvG,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,oBAAyB,GAC9B,YAAY,CA0Ed"}
|
package/dist/toolkit.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { CameraShake } from './CameraShake.js';
|
|
2
|
+
import { ParticleBurst } from './ParticleBurst.js';
|
|
3
|
+
import { MaterialFlash } from './MaterialFlash.js';
|
|
4
|
+
import { TrailEffect } from './TrailMesh.js';
|
|
5
|
+
import { addMeshHelpers } from './MeshHelpers.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// createBabylonJuiceToolkit
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/**
|
|
10
|
+
* Creates a unified `JuiceToolkit` for Babylon.js scenes.
|
|
11
|
+
*
|
|
12
|
+
* Internally instantiates a `CameraShake` and `ParticleBurst` and exposes
|
|
13
|
+
* them through the unified toolkit interface. Also provides `flash()`,
|
|
14
|
+
* `trail()`, and `addHelpers()` for material, trail, and mesh utilities.
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { createBabylonJuiceToolkit } from '@joydle/juice-babylon';
|
|
19
|
+
*
|
|
20
|
+
* const juice = createBabylonJuiceToolkit(scene, camera);
|
|
21
|
+
* juice.shake({ intensity: 0.4, duration: 0.3 });
|
|
22
|
+
* juice.flash(mesh, { color: redColor, duration: 0.2 });
|
|
23
|
+
* juice.particles({ position: { x: 0, y: 1, z: 0 }, color: whiteColor, count: 30 });
|
|
24
|
+
* const trail = juice.trail(mesh, { length: 80, color: blueColor });
|
|
25
|
+
* juice.addHelpers(mesh);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @param scene The Babylon.js scene.
|
|
29
|
+
* @param camera The Babylon.js camera (used for shake).
|
|
30
|
+
* @param opts Optional configuration.
|
|
31
|
+
*/
|
|
32
|
+
export function createBabylonJuiceToolkit(scene, camera, opts = {}) {
|
|
33
|
+
const shake = new CameraShake(camera);
|
|
34
|
+
const particles = new ParticleBurst(scene, { max: opts.maxParticles ?? 60 });
|
|
35
|
+
// Track trails for bulk disposal.
|
|
36
|
+
const activeTrails = [];
|
|
37
|
+
const toolkit = {
|
|
38
|
+
// -- shake ---------------------------------------------------------------
|
|
39
|
+
shake(shakeOpts) {
|
|
40
|
+
shake.trigger(shakeOpts.intensity, shakeOpts.duration);
|
|
41
|
+
},
|
|
42
|
+
// -- flash ---------------------------------------------------------------
|
|
43
|
+
flash(target, flashOpts) {
|
|
44
|
+
MaterialFlash(target, flashOpts.color, flashOpts.duration);
|
|
45
|
+
},
|
|
46
|
+
// -- particles -----------------------------------------------------------
|
|
47
|
+
particles(burstOpts) {
|
|
48
|
+
particles.burst(burstOpts.position, {
|
|
49
|
+
color: burstOpts.color,
|
|
50
|
+
count: burstOpts.count,
|
|
51
|
+
speed: burstOpts.speed,
|
|
52
|
+
lifetime: burstOpts.lifetime,
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
// -- trail ---------------------------------------------------------------
|
|
56
|
+
trail(target, trailOpts) {
|
|
57
|
+
const trail = new TrailEffect(scene, target, {
|
|
58
|
+
length: trailOpts.length,
|
|
59
|
+
color: trailOpts.color,
|
|
60
|
+
});
|
|
61
|
+
activeTrails.push(trail);
|
|
62
|
+
return {
|
|
63
|
+
dispose() {
|
|
64
|
+
trail.dispose();
|
|
65
|
+
const idx = activeTrails.indexOf(trail);
|
|
66
|
+
if (idx !== -1)
|
|
67
|
+
activeTrails.splice(idx, 1);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
// -- helpers -------------------------------------------------------------
|
|
72
|
+
addHelpers(mesh) {
|
|
73
|
+
addMeshHelpers(mesh);
|
|
74
|
+
},
|
|
75
|
+
// -- dispose -------------------------------------------------------------
|
|
76
|
+
dispose() {
|
|
77
|
+
shake.stop();
|
|
78
|
+
particles.dispose();
|
|
79
|
+
for (const t of activeTrails) {
|
|
80
|
+
t.dispose();
|
|
81
|
+
}
|
|
82
|
+
activeTrails.length = 0;
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
return toolkit;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=toolkit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolkit.js","sourceRoot":"","sources":["../src/toolkit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWlD,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAmB,EACnB,MAAqB,EACrB,OAA6B,EAAE;IAE/B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,CAAC;IAE7E,kCAAkC;IAClC,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,MAAM,OAAO,GAAiB;QAC5B,2EAA2E;QAC3E,KAAK,CAAC,SAAkD;YACtD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;QAED,2EAA2E;QAC3E,KAAK,CACH,MAAmB,EACnB,SAAoD;YAEpD,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;QAED,2EAA2E;QAC3E,SAAS,CAAC,SAMT;YACC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE;gBAClC,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,2EAA2E;QAC3E,KAAK,CACH,MAAmB,EACnB,SAAoD;YAEpD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE;gBAC3C,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,KAAK,EAAE,SAAS,CAAC,KAAK;aACvB,CAAC,CAAC;YACH,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEzB,OAAO;gBACL,OAAO;oBACL,KAAK,CAAC,OAAO,EAAE,CAAC;oBAChB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACxC,IAAI,GAAG,KAAK,CAAC,CAAC;wBAAE,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC9C,CAAC;aACF,CAAC;QACJ,CAAC;QAED,2EAA2E;QAC3E,UAAU,CAAC,IAAiB;YAC1B,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,2EAA2E;QAC3E,OAAO;YACL,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,SAAS,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7B,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,CAAC;YACD,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/** Subset of BABYLON.Vector3 we rely on. */
|
|
2
|
+
export interface BabylonVec3 {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
z: number;
|
|
6
|
+
copyFrom(source: BabylonVec3): void;
|
|
7
|
+
}
|
|
8
|
+
/** Subset of BABYLON.Color3 / Color4 we rely on. */
|
|
9
|
+
export interface BabylonColor {
|
|
10
|
+
r: number;
|
|
11
|
+
g: number;
|
|
12
|
+
b: number;
|
|
13
|
+
a?: number;
|
|
14
|
+
clone(): BabylonColor;
|
|
15
|
+
copyFrom(source: BabylonColor): void;
|
|
16
|
+
}
|
|
17
|
+
/** Subset of BABYLON.Material we rely on (StandardMaterial / PBRMaterial). */
|
|
18
|
+
export interface BabylonMaterial {
|
|
19
|
+
emissiveColor?: BabylonColor;
|
|
20
|
+
dispose?(): void;
|
|
21
|
+
}
|
|
22
|
+
/** Subset of BABYLON.AbstractMesh we rely on. */
|
|
23
|
+
export interface BabylonMesh {
|
|
24
|
+
name: string;
|
|
25
|
+
position: BabylonVec3;
|
|
26
|
+
scaling: BabylonVec3;
|
|
27
|
+
rotation: BabylonVec3;
|
|
28
|
+
visibility: number;
|
|
29
|
+
material: BabylonMaterial | null;
|
|
30
|
+
isDisposed(): boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Subset of BABYLON.Camera we rely on (any camera type). */
|
|
33
|
+
export interface BabylonCamera {
|
|
34
|
+
position: BabylonVec3;
|
|
35
|
+
}
|
|
36
|
+
/** Subset of BABYLON.Scene we rely on. */
|
|
37
|
+
export interface BabylonScene {
|
|
38
|
+
[key: string]: any;
|
|
39
|
+
}
|
|
40
|
+
/** Subset of BABYLON.ParticleSystem we construct at runtime. */
|
|
41
|
+
export interface BabylonParticleSystemLike {
|
|
42
|
+
emitter: BabylonVec3 | {
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
z: number;
|
|
46
|
+
};
|
|
47
|
+
minEmitBox: BabylonVec3;
|
|
48
|
+
maxEmitBox: BabylonVec3;
|
|
49
|
+
color1: BabylonColor;
|
|
50
|
+
color2: BabylonColor;
|
|
51
|
+
colorDead: BabylonColor;
|
|
52
|
+
minSize: number;
|
|
53
|
+
maxSize: number;
|
|
54
|
+
minLifeTime: number;
|
|
55
|
+
maxLifeTime: number;
|
|
56
|
+
emitRate: number;
|
|
57
|
+
blendMode: number;
|
|
58
|
+
minEmitPower: number;
|
|
59
|
+
maxEmitPower: number;
|
|
60
|
+
updateSpeed: number;
|
|
61
|
+
direction1: BabylonVec3;
|
|
62
|
+
direction2: BabylonVec3;
|
|
63
|
+
targetStopDuration: number;
|
|
64
|
+
disposeOnStop: boolean;
|
|
65
|
+
start(): void;
|
|
66
|
+
stop(): void;
|
|
67
|
+
dispose(): void;
|
|
68
|
+
}
|
|
69
|
+
export interface GsapLike {
|
|
70
|
+
to(target: unknown, vars: Record<string, unknown>): GsapTweenLike;
|
|
71
|
+
killTweensOf(target: unknown): void;
|
|
72
|
+
}
|
|
73
|
+
export interface GsapTweenLike {
|
|
74
|
+
kill(): void;
|
|
75
|
+
}
|
|
76
|
+
export interface JuiceToolkit {
|
|
77
|
+
/** Trigger camera shake. */
|
|
78
|
+
shake(opts: {
|
|
79
|
+
intensity: number;
|
|
80
|
+
duration: number;
|
|
81
|
+
}): void;
|
|
82
|
+
/** Flash an emissive colour on a mesh's material. */
|
|
83
|
+
flash(target: BabylonMesh, opts: {
|
|
84
|
+
color: BabylonColor;
|
|
85
|
+
duration: number;
|
|
86
|
+
}): void;
|
|
87
|
+
/** Emit a burst of particles at a world position. */
|
|
88
|
+
particles(opts: {
|
|
89
|
+
position: {
|
|
90
|
+
x: number;
|
|
91
|
+
y: number;
|
|
92
|
+
z: number;
|
|
93
|
+
};
|
|
94
|
+
color: BabylonColor;
|
|
95
|
+
count: number;
|
|
96
|
+
speed?: number;
|
|
97
|
+
lifetime?: number;
|
|
98
|
+
}): void;
|
|
99
|
+
/** Attach a trail to a mesh. Returns a dispose function. */
|
|
100
|
+
trail(target: BabylonMesh, opts: {
|
|
101
|
+
length?: number;
|
|
102
|
+
color?: BabylonColor;
|
|
103
|
+
}): {
|
|
104
|
+
dispose(): void;
|
|
105
|
+
};
|
|
106
|
+
/** Add squash/explodeOut/bob/spin helpers to a mesh. */
|
|
107
|
+
addHelpers(mesh: BabylonMesh): void;
|
|
108
|
+
/** Dispose all internal resources. */
|
|
109
|
+
dispose(): void;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @joydle/juice-babylon -- Local type definitions
|
|
3
|
+
//
|
|
4
|
+
// Minimal inline interfaces for Babylon.js and GSAP so this package compiles
|
|
5
|
+
// without importing from the peer dependency type roots. Consumers supply
|
|
6
|
+
// real Babylon.js / GSAP objects at runtime.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mDAAmD;AACnD,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,8CAA8C;AAC9C,8EAA8E"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@joydle/juice-babylon",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": ["dist"],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"typecheck": "tsc --noEmit",
|
|
17
|
+
"clean": "rm -rf dist"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "Joydle <contact@joydle.dev>",
|
|
24
|
+
"homepage": "https://joydle.dev",
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@babylonjs/core": "^6.0 || ^7.0",
|
|
27
|
+
"gsap": "^3.12"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"typescript": "^5.4.0"
|
|
31
|
+
}
|
|
32
|
+
}
|