@zylem/behaviors 0.5.7 → 0.5.11
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/{behavior-system-HEt67el5.d.ts → behavior-system-DkFAwLb_.d.ts} +6 -0
- package/dist/{chunk-7LHXAEOZ.js → chunk-3QUECYMT.js} +5 -4
- package/dist/chunk-3QUECYMT.js.map +1 -0
- package/dist/{chunk-GZ3DQIIZ.js → chunk-4GW6DCYF.js} +1 -0
- package/dist/chunk-4GW6DCYF.js.map +1 -0
- package/dist/{chunk-F7E23E26.js → chunk-4WH2ZN7P.js} +1 -0
- package/dist/chunk-4WH2ZN7P.js.map +1 -0
- package/dist/{chunk-LAN7U3AK.js → chunk-52FJIDGL.js} +2 -1
- package/dist/chunk-52FJIDGL.js.map +1 -0
- package/dist/{chunk-K6CWKFHL.js → chunk-5A5AYP2C.js} +1 -0
- package/dist/chunk-5A5AYP2C.js.map +1 -0
- package/dist/{chunk-JSBRDJBE.js → chunk-5WRI5ZAA.js} +1 -0
- package/dist/chunk-5WRI5ZAA.js.map +1 -0
- package/dist/{chunk-UUMH3DC3.js → chunk-5XPPLTC7.js} +2 -1
- package/dist/chunk-5XPPLTC7.js.map +1 -0
- package/dist/{chunk-OBF6BIA2.js → chunk-AS3HR7AS.js} +2 -1
- package/dist/chunk-AS3HR7AS.js.map +1 -0
- package/dist/{chunk-E2MOFIDH.js → chunk-BAXJ7XHJ.js} +4 -3
- package/dist/chunk-BAXJ7XHJ.js.map +1 -0
- package/dist/{chunk-TK3AXXXI.js → chunk-D7N6SC4D.js} +4 -3
- package/dist/chunk-D7N6SC4D.js.map +1 -0
- package/dist/{chunk-CTSYM56P.js → chunk-DGDNFX43.js} +6 -5
- package/dist/chunk-DGDNFX43.js.map +1 -0
- package/dist/{chunk-CB3C7CRD.js → chunk-DWVLGXMF.js} +5 -4
- package/dist/chunk-DWVLGXMF.js.map +1 -0
- package/dist/{chunk-2HKY6WF7.js → chunk-EIWQM6U3.js} +1 -0
- package/dist/chunk-EIWQM6U3.js.map +1 -0
- package/dist/{chunk-YDLO5M7S.js → chunk-EZNCCO4L.js} +1 -0
- package/dist/chunk-EZNCCO4L.js.map +1 -0
- package/dist/{chunk-LLDLVVG4.js → chunk-GL5JGXPR.js} +5 -4
- package/dist/chunk-GL5JGXPR.js.map +1 -0
- package/dist/{chunk-NDJO56BB.js → chunk-GLXEJD2P.js} +4 -3
- package/dist/chunk-GLXEJD2P.js.map +1 -0
- package/dist/{chunk-QU6GQ657.js → chunk-H4TJ7X4O.js} +3 -2
- package/dist/chunk-H4TJ7X4O.js.map +1 -0
- package/dist/{chunk-4DVDFCVY.js → chunk-HZMY3TT4.js} +1 -0
- package/dist/chunk-HZMY3TT4.js.map +1 -0
- package/dist/{chunk-57GLKGEX.js → chunk-IRMJTAIK.js} +4 -3
- package/dist/chunk-IRMJTAIK.js.map +1 -0
- package/dist/{chunk-2HLZBWGD.js → chunk-IZJFUAXB.js} +1 -0
- package/dist/chunk-IZJFUAXB.js.map +1 -0
- package/dist/{chunk-M25QJBDN.js → chunk-JACX7ZMJ.js} +5 -4
- package/dist/chunk-JACX7ZMJ.js.map +1 -0
- package/dist/{chunk-SHZZ2QRV.js → chunk-JVADRLWX.js} +3 -2
- package/dist/chunk-JVADRLWX.js.map +1 -0
- package/dist/{chunk-RR3XNDKG.js → chunk-KFFETUAL.js} +3 -2
- package/dist/chunk-KFFETUAL.js.map +1 -0
- package/dist/{chunk-OSPQFWQF.js → chunk-KIYUUSPK.js} +3 -2
- package/dist/chunk-KIYUUSPK.js.map +1 -0
- package/dist/{chunk-2YF7J3H4.js → chunk-LL4FLHIY.js} +1 -0
- package/dist/chunk-LL4FLHIY.js.map +1 -0
- package/dist/{chunk-LWM346FW.js → chunk-M3QDKKDF.js} +1 -0
- package/dist/chunk-M3QDKKDF.js.map +1 -0
- package/dist/{chunk-CVRN7YAI.js → chunk-MUBU2DIB.js} +44 -16
- package/dist/chunk-MUBU2DIB.js.map +1 -0
- package/dist/{chunk-UKGBQTHL.js → chunk-NQPYMUDF.js} +4 -3
- package/dist/chunk-NQPYMUDF.js.map +1 -0
- package/dist/{chunk-DD4U42FG.js → chunk-NW4SE5XW.js} +3 -2
- package/dist/chunk-NW4SE5XW.js.map +1 -0
- package/dist/{chunk-WHKPWIQO.js → chunk-OHCPV2NT.js} +1 -0
- package/dist/chunk-OHCPV2NT.js.map +1 -0
- package/dist/{chunk-TZQQYJYK.js → chunk-OPZ2LVS2.js} +1 -0
- package/dist/chunk-OPZ2LVS2.js.map +1 -0
- package/dist/{chunk-7TIIRJKF.js → chunk-PLIXVF7B.js} +4 -3
- package/dist/chunk-PLIXVF7B.js.map +1 -0
- package/dist/{chunk-4EWASZHB.js → chunk-QVCMJ4Q2.js} +1 -0
- package/dist/chunk-QVCMJ4Q2.js.map +1 -0
- package/dist/{chunk-55CFXXZH.js → chunk-S5HFWDGM.js} +4 -3
- package/dist/chunk-S5HFWDGM.js.map +1 -0
- package/dist/{chunk-3X3CL24Z.js → chunk-SGHIGTVZ.js} +1 -0
- package/dist/chunk-SGHIGTVZ.js.map +1 -0
- package/dist/{chunk-VJ3UA6OD.js → chunk-TBUKJKY6.js} +2 -1
- package/dist/chunk-TBUKJKY6.js.map +1 -0
- package/dist/{chunk-UF7QPYUX.js → chunk-USFIJUDN.js} +1 -0
- package/dist/chunk-USFIJUDN.js.map +1 -0
- package/dist/{chunk-ERS6SNA5.js → chunk-WOMHL23C.js} +2 -1
- package/dist/chunk-WOMHL23C.js.map +1 -0
- package/dist/{chunk-7GGR26YA.js → chunk-WQUPSOFV.js} +4 -3
- package/dist/chunk-WQUPSOFV.js.map +1 -0
- package/dist/{chunk-OU2SW4U5.js → chunk-ZOYA3TZG.js} +4 -3
- package/dist/chunk-ZOYA3TZG.js.map +1 -0
- package/dist/{components-JZQoO2sU.d.ts → components--RTwuT4S.d.ts} +1 -1
- package/dist/cooldown.d.ts +1 -1
- package/dist/cooldown.js +4 -3
- package/dist/cooldown.js.map +1 -0
- package/dist/coordinators/boundary-ricochet-3d.d.ts +2 -2
- package/dist/coordinators/boundary-ricochet-3d.js +5 -4
- package/dist/coordinators/boundary-ricochet-3d.js.map +1 -0
- package/dist/coordinators/boundary-ricochet.d.ts +2 -2
- package/dist/coordinators/boundary-ricochet.js +5 -4
- package/dist/coordinators/boundary-ricochet.js.map +1 -0
- package/dist/coordinators/first-person-shooter.js +5 -4
- package/dist/coordinators/first-person-shooter.js.map +1 -0
- package/dist/coordinators/multidirectional-space-shooter.d.ts +1 -1
- package/dist/coordinators/multidirectional-space-shooter.js +7 -6
- package/dist/coordinators/multidirectional-space-shooter.js.map +1 -0
- package/dist/coordinators/top-down-shooter.d.ts +1 -1
- package/dist/coordinators/top-down-shooter.js +7 -6
- package/dist/coordinators/top-down-shooter.js.map +1 -0
- package/dist/core.d.ts +4 -4
- package/dist/core.js +7 -6
- package/dist/core.js.map +1 -0
- package/dist/destructible-3d.d.ts +1 -1
- package/dist/destructible-3d.js +5 -4
- package/dist/destructible-3d.js.map +1 -0
- package/dist/destructible-prebake.js +3 -2
- package/dist/destructible-prebake.js.map +1 -0
- package/dist/first-person.d.ts +1 -1
- package/dist/first-person.js +8 -7
- package/dist/first-person.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +41 -40
- package/dist/index.js.map +1 -0
- package/dist/jumper-2d.d.ts +1 -1
- package/dist/jumper-2d.js +6 -5
- package/dist/jumper-2d.js.map +1 -0
- package/dist/jumper-3d.d.ts +1 -1
- package/dist/jumper-3d.js +7 -6
- package/dist/jumper-3d.js.map +1 -0
- package/dist/{moveable-BdFmI3s1.d.ts → moveable-CFOHmblC.d.ts} +1 -1
- package/dist/particle-emitter/presets.js +3 -2
- package/dist/particle-emitter/presets.js.map +1 -0
- package/dist/particle-emitter.d.ts +1 -1
- package/dist/particle-emitter.js +6 -5
- package/dist/particle-emitter.js.map +1 -0
- package/dist/platformer-2d.d.ts +1 -1
- package/dist/platformer-2d.js +6 -5
- package/dist/platformer-2d.js.map +1 -0
- package/dist/platformer-3d.d.ts +1 -1
- package/dist/platformer-3d.js +6 -5
- package/dist/platformer-3d.js.map +1 -0
- package/dist/ricochet-2d.d.ts +1 -1
- package/dist/ricochet-2d.js +6 -5
- package/dist/ricochet-2d.js.map +1 -0
- package/dist/ricochet-3d.d.ts +1 -1
- package/dist/ricochet-3d.js +6 -5
- package/dist/ricochet-3d.js.map +1 -0
- package/dist/runtime-2d.d.ts +1 -1
- package/dist/runtime-2d.js +3 -2
- package/dist/runtime-2d.js.map +1 -0
- package/dist/screen-visibility.d.ts +1 -1
- package/dist/screen-visibility.js +4 -3
- package/dist/screen-visibility.js.map +1 -0
- package/dist/screen-wrap.d.ts +1 -1
- package/dist/screen-wrap.js +6 -5
- package/dist/screen-wrap.js.map +1 -0
- package/dist/shooter-2d.d.ts +1 -1
- package/dist/shooter-2d.js +6 -5
- package/dist/shooter-2d.js.map +1 -0
- package/dist/thruster.d.ts +1 -1
- package/dist/thruster.js +6 -5
- package/dist/thruster.js.map +1 -0
- package/dist/top-down-movement.d.ts +1 -1
- package/dist/top-down-movement.js +8 -7
- package/dist/top-down-movement.js.map +1 -0
- package/dist/world-boundary-2d.d.ts +1 -1
- package/dist/world-boundary-2d.js +7 -6
- package/dist/world-boundary-2d.js.map +1 -0
- package/dist/world-boundary-3d.d.ts +1 -1
- package/dist/world-boundary-3d.js +7 -6
- package/dist/world-boundary-3d.js.map +1 -0
- package/package.json +160 -159
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/behaviors/platformer-3d/components.ts","../src/lib/behaviors/platformer-3d/platformer-3d-fsm.ts","../src/lib/behaviors/platformer-3d/platformer-3d.descriptor.ts"],"sourcesContent":["/**\n * Platformer 3D ECS Components\n * \n * Components for 3D platformer movement system including walking, running,\n * jumping with multi-jump support, and falling/landing states.\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Platformer3DMovementComponent (capability / configuration)\n// Defines the movement capabilities and physics parameters\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Platformer3DMovementComponent {\n\t/** Base walking speed */\n\twalkSpeed: number;\n\t/** Sprint/run speed */\n\trunSpeed: number;\n\t/** Initial jump force/velocity */\n\tjumpForce: number;\n\t/** Maximum number of jumps (1 = single jump, 2 = double jump, etc.) */\n\tmaxJumps: number;\n\t/** Gravity force (optional override) */\n\tgravity: number;\n\t/** Coyote time in seconds (grace period after leaving ground) */\n\tcoyoteTime: number;\n\t/** Jump buffer time in seconds (queue jump input before landing) */\n\tjumpBufferTime: number;\n\t/** Velocity multiplier when releasing jump button early (0-1) */\n\tjumpCutMultiplier: number;\n\t/** Time in seconds before multi-jump becomes available (0 = after button release) */\n\tmultiJumpWindowTime: number;\n\t/** Maximum slope angle (degrees) the character can walk up */\n\tslopeClimbAngle: number;\n\t/** Slope angle (degrees) past which the character slides down */\n\tslopeSlideAngle: number;\n\t/** Autostep configuration for small ledges, or false to disable */\n\tautostep: { maxHeight: number; minWidth: number } | false;\n\t/** Snap-to-ground distance (keeps the character glued going downhill) */\n\tsnapToGroundDistance: number;\n\t/** Character controller offset (small gap kept between collider and environment) */\n\tcharacterOffset: number;\n}\n\nexport function createPlatformer3DMovementComponent(\n\toptions: Partial<Platformer3DMovementComponent> = {}\n): Platformer3DMovementComponent {\n\treturn {\n\t\twalkSpeed: options.walkSpeed ?? 12,\n\t\trunSpeed: options.runSpeed ?? 24,\n\t\tjumpForce: options.jumpForce ?? 12,\n\t\tmaxJumps: options.maxJumps ?? 1,\n\t\tgravity: options.gravity ?? 9.82,\n\t\tcoyoteTime: options.coyoteTime ?? 0.1,\n\t\tjumpBufferTime: options.jumpBufferTime ?? 0.1,\n\t\tjumpCutMultiplier: options.jumpCutMultiplier ?? 0.5,\n\t\tmultiJumpWindowTime: options.multiJumpWindowTime ?? 0.15, // 150ms default\n\t\tslopeClimbAngle: options.slopeClimbAngle ?? 50,\n\t\tslopeSlideAngle: options.slopeSlideAngle ?? 40,\n\t\tautostep: options.autostep ?? { maxHeight: 0.3, minWidth: 0.1 },\n\t\tsnapToGroundDistance: options.snapToGroundDistance ?? 0.3,\n\t\tcharacterOffset: options.characterOffset ?? 0.05,\n\t};\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Platformer3DInputComponent (intent)\n// Written by: Player controller, AI controller\n// Read by: Platformer3DBehavior\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Platformer3DInputComponent {\n\t/** Horizontal movement input (-1 to 1) */\n\tmoveX: number;\n\t/** Forward/backward movement input (-1 to 1) */\n\tmoveZ: number;\n\t/** Jump button pressed */\n\tjump: boolean;\n\t/** Run/sprint button held */\n\trun: boolean;\n}\n\nexport function createPlatformer3DInputComponent(): Platformer3DInputComponent {\n\treturn {\n\t\tmoveX: 0,\n\t\tmoveZ: 0,\n\t\tjump: false,\n\t\trun: false,\n\t};\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Platformer3DStateComponent (runtime state)\n// Tracks the current state of the platformer entity\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Platformer3DStateComponent {\n\t/** Is the entity on the ground */\n\tgrounded: boolean;\n\t/** Is currently in a jump arc */\n\tjumping: boolean;\n\t/** Is falling (not jumping) */\n\tfalling: boolean;\n\t/** Current jump count (for multi-jump) */\n\tjumpCount: number;\n\t/** Y position when jump started */\n\tjumpStartHeight: number;\n\t/** Current movement speed being applied */\n\tcurrentSpeed: number;\n\t/** Last known ground Y position */\n\tlastGroundedY: number;\n\t/** Was jump button pressed last frame (for edge detection) */\n\tjumpPressedLastFrame: boolean;\n\t\n\t// -- New fields --\n\t/** Is currently colliding with ground (from physics collision callback) */\n\tcollisionGrounded: boolean;\n\t/** Timestamp of last ground collision */\n\tgroundedCollisionTime: number;\n\t/** Time in seconds since last grounded */\n\ttimeSinceGrounded: number;\n\t/** Is a jump allowed due to buffer? */\n\tjumpBuffered: boolean;\n\t/** Time remaining in jump buffer */\n\tjumpBufferTimer: number;\n\t/** Is jump button currently held */\n\tjumpHeld: boolean;\n\t/** Has the jump cut been applied for this jump? */\n\tjumpCutApplied: boolean;\n\t/** Has jump button been released since last jump (required for multi-jump) */\n\tjumpReleasedSinceLastJump: boolean;\n\t/** Time since current jump started (for multi-jump window) */\n\ttimeSinceJump: number;\n\t/** True for the single frame on which a jump impulse was applied; prevents gravity from clobbering jump velocity. */\n\tjumpedThisFrame: boolean;\n\t/** Remaining seconds of jump-cut velocity ramp; while > 0, verticalVelocity lerps toward verticalVelocity * jumpCutMultiplier. */\n\tjumpCutRampTimer: number;\n\t/**\n\t * Controller-owned vertical velocity (units/second).\n\t * The body is kinematic, so `linvel()` is meaningless — this field is the\n\t * single source of truth for jump/gravity motion on the Y axis.\n\t */\n\tverticalVelocity: number;\n}\n\nexport function createPlatformer3DStateComponent(): Platformer3DStateComponent {\n\treturn {\n\t\tgrounded: false,\n\t\tjumping: false,\n\t\tfalling: false,\n\t\tjumpCount: 0,\n\t\tjumpStartHeight: 0,\n\t\tcurrentSpeed: 0,\n\t\tlastGroundedY: 0,\n\t\tjumpPressedLastFrame: false,\n\t\tcollisionGrounded: false,\n\t\tgroundedCollisionTime: 0,\n\t\ttimeSinceGrounded: 0,\n\t\tjumpBuffered: false,\n\t\tjumpBufferTimer: 0,\n\t\tjumpHeld: false,\n\t\tjumpCutApplied: false,\n\t\tjumpReleasedSinceLastJump: true,\n\t\ttimeSinceJump: 0,\n\t\tjumpedThisFrame: false,\n\t\tjumpCutRampTimer: 0,\n\t\tverticalVelocity: 0,\n\t};\n}\n","/**\n * Platformer 3D Finite State Machine\n * \n * Manages state transitions for 3D platformer movement:\n * - Idle: Standing still on ground\n * - Walking: Moving on ground (slow)\n * - Running: Moving on ground (fast)\n * - Jumping: Ascending from jump\n * - Falling: Descending (gravity)\n * - Landing: Just touched ground\n */\n\nimport { SyncStateMachine, t } from '../../core/utility/sync-state-machine';\nimport type { Platformer3DInputComponent, Platformer3DStateComponent } from './components';\n\n/**\n * Simplified Collision Context interface\n */\nexport interface PlatformerCollisionContext {\n\tcontact: {\n\t\tnormal: { x: number; y: number; z?: number };\n\t};\n}\n\n/**\n * Platformer states\n */\nexport enum Platformer3DState {\n\tIdle = 'idle',\n\tWalking = 'walking',\n\tRunning = 'running',\n\tJumping = 'jumping',\n\tFalling = 'falling',\n\tLanding = 'landing',\n}\n\n/**\n * Events that trigger state transitions\n */\nexport enum Platformer3DEvent {\n\tWalk = 'walk',\n\tRun = 'run',\n\tJump = 'jump',\n\tFall = 'fall',\n\tLand = 'land',\n\tStop = 'stop',\n}\n\n/**\n * Context for the FSM\n */\nexport interface Platformer3DContext {\n\tinput: Platformer3DInputComponent;\n\tstate: Platformer3DStateComponent;\n}\n\n/**\n * Platformer 3D FSM\n */\nexport class Platformer3DFSM {\n\tmachine: SyncStateMachine<Platformer3DState, Platformer3DEvent, never>;\n\n\tconstructor(private ctx: Platformer3DContext) {\n\t\tthis.machine = new SyncStateMachine<Platformer3DState, Platformer3DEvent, never>(\n\t\t\tPlatformer3DState.Idle,\n\t\t\t[\n\t\t\t\t// Idle transitions\n\t\t\t\tt(Platformer3DState.Idle, Platformer3DEvent.Walk, Platformer3DState.Walking),\n\t\t\t\tt(Platformer3DState.Idle, Platformer3DEvent.Run, Platformer3DState.Running),\n\t\t\t\tt(Platformer3DState.Idle, Platformer3DEvent.Jump, Platformer3DState.Jumping),\n\t\t\t\tt(Platformer3DState.Idle, Platformer3DEvent.Fall, Platformer3DState.Falling),\n\t\t\t\t\n\t\t\t\t// Walking transitions\n\t\t\t\tt(Platformer3DState.Walking, Platformer3DEvent.Run, Platformer3DState.Running),\n\t\t\t\tt(Platformer3DState.Walking, Platformer3DEvent.Jump, Platformer3DState.Jumping),\n\t\t\t\tt(Platformer3DState.Walking, Platformer3DEvent.Stop, Platformer3DState.Idle),\n\t\t\t\tt(Platformer3DState.Walking, Platformer3DEvent.Fall, Platformer3DState.Falling),\n\t\t\t\t\n\t\t\t\t// Running transitions\n\t\t\t\tt(Platformer3DState.Running, Platformer3DEvent.Walk, Platformer3DState.Walking),\n\t\t\t\tt(Platformer3DState.Running, Platformer3DEvent.Jump, Platformer3DState.Jumping),\n\t\t\t\tt(Platformer3DState.Running, Platformer3DEvent.Stop, Platformer3DState.Idle),\n\t\t\t\tt(Platformer3DState.Running, Platformer3DEvent.Fall, Platformer3DState.Falling),\n\t\t\t\t\n\t\t\t\t// Jumping transitions\n\t\t\t\tt(Platformer3DState.Jumping, Platformer3DEvent.Fall, Platformer3DState.Falling),\n\t\t\t\tt(Platformer3DState.Jumping, Platformer3DEvent.Land, Platformer3DState.Landing),\n\t\t\t\tt(Platformer3DState.Jumping, Platformer3DEvent.Jump, Platformer3DState.Jumping), // Multi-jump\n\t\t\t\t\n\t\t\t\t// Falling transitions\n\t\t\t\tt(Platformer3DState.Falling, Platformer3DEvent.Land, Platformer3DState.Landing),\n\t\t\t\t\n\t\t\t\t// Landing transitions\n\t\t\t\tt(Platformer3DState.Landing, Platformer3DEvent.Walk, Platformer3DState.Walking),\n\t\t\t\tt(Platformer3DState.Landing, Platformer3DEvent.Run, Platformer3DState.Running),\n\t\t\t\tt(Platformer3DState.Landing, Platformer3DEvent.Stop, Platformer3DState.Idle),\n\t\t\t\t\n\t\t\t\t// Self-transitions (no-ops)\n\t\t\t\tt(Platformer3DState.Idle, Platformer3DEvent.Stop, Platformer3DState.Idle),\n\t\t\t]\n\t\t);\n\t}\n\n\t/**\n\t * Get the current state\n\t */\n\tgetState(): Platformer3DState {\n\t\treturn this.machine.getState();\n\t}\n\n\t/**\n\t * Dispatch an event to the FSM\n\t */\n\tdispatch(event: Platformer3DEvent): void {\n\t\tif (this.machine.can(event)) {\n\t\t\tthis.machine.syncDispatch(event);\n\t\t}\n\t}\n\n\t/**\n\t * Check if grounded\n\t */\n\tisGrounded(): boolean {\n\t\tconst state = this.getState();\n\t\treturn state === Platformer3DState.Idle || \n\t\t state === Platformer3DState.Walking || \n\t\t state === Platformer3DState.Running || \n\t\t state === Platformer3DState.Landing;\n\t}\n\n\t/**\n\t * Get current jump count from context\n\t */\n\tgetJumpCount(): number {\n\t\treturn this.ctx.state.jumpCount;\n\t}\n\n\t/**\n\t * Handle collision event to update ground state\n\t */\n\thandleCollision(ctx: PlatformerCollisionContext): void {\n\t\t// Check if collision is ground (normal pointing up)\n\t\t// Y normal > 0.5 means roughly within 60 degrees of up\n\t\tif (ctx.contact.normal.y > 0.5) {\n\t\t\tthis.ctx.state.collisionGrounded = true;\n\t\t\tthis.ctx.state.groundedCollisionTime = performance.now();\n\t\t}\n\t}\n\n\t/**\n\t * Update FSM based on current state\n\t */\n\tupdate(input: Platformer3DInputComponent, state: Platformer3DStateComponent): void {\n\t\t// Update context\n\t\tthis.ctx.input = input;\n\t\tthis.ctx.state = state;\n\n\t\t// Get current FSM state\n\t\tconst currentState = this.getState();\n\n\t\t// Determine movement state\n\t\tconst hasInput = Math.abs(input.moveX) > 0.1 || Math.abs(input.moveZ) > 0.1;\n\t\tconst isRunning = input.run;\n\n\t\t// Handle landing: if we're in falling state and now grounded, land\n\t\tif (currentState === Platformer3DState.Falling && state.grounded) {\n\t\t\tthis.dispatch(Platformer3DEvent.Land);\n\t\t\t// Don't return - allow immediate transition to movement state\n\t\t}\n\n\t\t// Send appropriate events based on state\n\t\tif (state.grounded) {\n\t\t\tif (hasInput) {\n\t\t\t\tif (isRunning) {\n\t\t\t\t\tthis.dispatch(Platformer3DEvent.Run);\n\t\t\t\t} else {\n\t\t\t\t\tthis.dispatch(Platformer3DEvent.Walk);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.dispatch(Platformer3DEvent.Stop);\n\t\t\t}\n\t\t} else {\n\t\t\t// Not grounded - check if we should be falling\n\t\t\t// Transition to falling if: We're in jumping state and now falling, \n\t\t\t// OR we walked off a ledge (idle/walking/running and now falling)\n\t\t\tif (state.falling) {\n\t\t\t\tthis.dispatch(Platformer3DEvent.Fall);\n\t\t\t}\n\t\t}\n\n\t\t// Handle jump input (edge detection handled in behavior)\n\t\tif (input.jump && !state.jumpPressedLastFrame) {\n\t\t\tthis.dispatch(Platformer3DEvent.Jump);\n\t\t}\n\t}\n}\n","/**\n * Platformer 3D Behavior Descriptor\n * \n * Type-safe descriptor for the platformer 3D behavior system.\n * Provides entity.use() API for 3D platformer movement.\n */\n\nimport { defineBehavior } from '../behavior-descriptor';\nimport type { BehaviorEntityLink, BehaviorSystem } from '../behavior-system';\nimport { Platformer3DState, PlatformerCollisionContext } from './platformer-3d-fsm';\nimport {\n\tcreatePlatformer3DMovementComponent,\n\tcreatePlatformer3DInputComponent,\n\tcreatePlatformer3DStateComponent,\n\ttype Platformer3DMovementComponent,\n\ttype Platformer3DInputComponent,\n\ttype Platformer3DStateComponent,\n} from './components';\nimport {\n\tSTAGE_INPUT_BUTTON_JUMP,\n\tSTAGE_INPUT_BUTTON_RUN,\n\treadBehaviorSnapshot,\n\tStagePlatformerShapeSource,\n\ttype BehaviorRuntime,\n\ttype StagePlatformer3DOptions,\n} from '../../runtime/wasm-stage-runtime';\n\n/** Rust `Platformer3DFsmState` index → TS state (see `platformer_3d/fsm.rs`). */\nconst FSM_STATE_BY_INDEX: readonly Platformer3DState[] = [\n\tPlatformer3DState.Idle,\n\tPlatformer3DState.Walking,\n\tPlatformer3DState.Running,\n\tPlatformer3DState.Jumping,\n\tPlatformer3DState.Falling,\n\tPlatformer3DState.Landing,\n];\n\n/**\n * Platformer behavior options (typed for entity.use() autocomplete)\n */\nexport interface Platformer3DBehaviorOptions {\n\t/** Base walking speed (default: 12) */\n\twalkSpeed?: number;\n\t/** Sprint/run speed (default: 24) */\n\trunSpeed?: number;\n\t/** Initial jump force (default: 12) */\n\tjumpForce?: number;\n\t/** Maximum number of jumps (default: 1) */\n\tmaxJumps?: number;\n\t/** Gravity force (default: 9.82) */\n\tgravity?: number;\n\t/** Maximum slope angle in degrees the character can walk up (default: 50) */\n\tslopeClimbAngle?: number;\n\t/** Slope angle in degrees past which the character slides (default: 40) */\n\tslopeSlideAngle?: number;\n\t/** Autostep over small ledges, or false to disable (default: { maxHeight: 0.3, minWidth: 0.1 }) */\n\tautostep?: { maxHeight: number; minWidth: number } | false;\n\t/** Snap-to-ground distance for downhill/step-down stability (default: 0.3) */\n\tsnapToGroundDistance?: number;\n\t/** Character controller collision offset (default: 0.05) */\n\tcharacterOffset?: number;\n\t/** Explicit KCC capsule override (requires `useAttachedCollider: false`). */\n\tshape?: {\n\t\thalfHeight: number;\n\t\tradius: number;\n\t\toffset?: [number, number, number];\n\t};\n\t/** When true (default), KCC reads shape + offset from the attached Rapier collider. */\n\tuseAttachedCollider?: boolean;\n}\n\nconst defaultOptions: Platformer3DBehaviorOptions = {\n\twalkSpeed: 12,\n\trunSpeed: 24,\n\tjumpForce: 12,\n\tmaxJumps: 1,\n\tgravity: 9.82,\n\tslopeClimbAngle: 50,\n\tslopeSlideAngle: 40,\n\tautostep: { maxHeight: 0.3, minWidth: 0.1 },\n\tsnapToGroundDistance: 0.3,\n\tcharacterOffset: 0.05,\n};\n\nconst PLATFORMER_BEHAVIOR_KEY = Symbol.for('zylem:behavior:platformer-3d');\n\nfunction resolvePlatformerAttachShape(\n\toptions: Platformer3DBehaviorOptions,\n\tgameEntity?: {\n\t\tcolliderDesc?: {\n\t\t\tshape?: { type?: string; halfHeight?: number; radius?: number };\n\t\t\toffset?: [number, number, number];\n\t\t};\n\t},\n): Pick<StagePlatformer3DOptions, 'halfHeight' | 'radius' | 'offsetX' | 'offsetY' | 'offsetZ' | 'shapeSource'> {\n\tconst fallback = {\n\t\thalfHeight: 0.9,\n\t\tradius: 0.4,\n\t\toffsetX: 0,\n\t\toffsetY: 0,\n\t\toffsetZ: 0,\n\t\tshapeSource: StagePlatformerShapeSource.Auto,\n\t};\n\n\tif (options.useAttachedCollider === false && options.shape) {\n\t\tconst offset = options.shape.offset ?? [0, 0, 0];\n\t\treturn {\n\t\t\thalfHeight: options.shape.halfHeight,\n\t\t\tradius: options.shape.radius,\n\t\t\toffsetX: offset[0],\n\t\t\toffsetY: offset[1],\n\t\t\toffsetZ: offset[2],\n\t\t\tshapeSource: StagePlatformerShapeSource.Override,\n\t\t};\n\t}\n\n\tconst collider = gameEntity?.colliderDesc;\n\tif (collider?.shape?.type === 'capsule') {\n\t\tconst offset = collider.offset ?? [0, 0, 0];\n\t\treturn {\n\t\t\thalfHeight: collider.shape.halfHeight ?? fallback.halfHeight,\n\t\t\tradius: collider.shape.radius ?? fallback.radius,\n\t\t\toffsetX: offset[0],\n\t\t\toffsetY: offset[1],\n\t\t\toffsetZ: offset[2],\n\t\t\tshapeSource: StagePlatformerShapeSource.Auto,\n\t\t};\n\t}\n\n\treturn fallback;\n}\n\n/**\n * Entity with platformer components (input written by the game; the wasm\n * runtime owns the kinematic character controller and FSM).\n */\nexport interface Platformer3DEntity {\n\tuuid: string;\n\tplatformer: Platformer3DMovementComponent;\n\t$platformer: Platformer3DInputComponent;\n\tplatformerState: Platformer3DStateComponent;\n}\n\n/**\n * Forwards platformer input into the wasm runtime. The Rust `platformer_3d`\n * Stage behavior (KCC + jump FSM) is the single simulation path; handles\n * read its state back via the snapshot buffer.\n */\nclass Platformer3DBehaviorSystem implements BehaviorSystem {\n\tprivate attachedRuntimeSlots = new Set<number>();\n\n\tconstructor(\n\t\tprivate wasmStage: BehaviorRuntime | null,\n\t\tprivate getBehaviorLinks?: (key: symbol) => Iterable<BehaviorEntityLink>,\n\t) {}\n\n\tupdate(_ecs: unknown, _delta: number): void {\n\t\tconst links = this.getBehaviorLinks?.(PLATFORMER_BEHAVIOR_KEY);\n\t\tif (!links) return;\n\n\t\tfor (const link of links) {\n\t\t\tconst gameEntity = link.entity as any;\n\t\t\tconst platformerRef = link.ref as any;\n\n\t\t\tconst options = platformerRef.options as Platformer3DBehaviorOptions;\n\n\t\t\tif (!gameEntity.platformer) {\n\t\t\t\tgameEntity.platformer = createPlatformer3DMovementComponent(options);\n\t\t\t}\n\t\t\tif (!gameEntity.$platformer) {\n\t\t\t\tgameEntity.$platformer = createPlatformer3DInputComponent();\n\t\t\t}\n\t\t\tif (!gameEntity.platformerState) {\n\t\t\t\tgameEntity.platformerState = createPlatformer3DStateComponent();\n\t\t\t}\n\n\t\t\tconst handle = (gameEntity.runtimeHandle ?? -1) as number;\n\t\t\tif (!this.wasmStage || handle < 0) continue;\n\n\t\t\tthis.ensureWasmAttached(handle, options, gameEntity);\n\t\t\tplatformerRef.__wasmStage = this.wasmStage;\n\t\t\tplatformerRef.__entity = gameEntity;\n\t\t\tconst input = gameEntity.$platformer;\n\t\t\tif (input) {\n\t\t\t\tthis.wasmStage.writeInputAxes(handle, input.moveX ?? 0, input.moveZ ?? 0);\n\t\t\t\tthis.wasmStage.writeInputButton(handle, STAGE_INPUT_BUTTON_JUMP, !!input.jump);\n\t\t\t\tthis.wasmStage.writeInputButton(handle, STAGE_INPUT_BUTTON_RUN, !!input.run);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate ensureWasmAttached(\n\t\thandle: number,\n\t\toptions: Platformer3DBehaviorOptions,\n\t\tgameEntity?: { colliderDesc?: { shape?: { type?: string; halfHeight?: number; radius?: number }; offset?: [number, number, number] } },\n\t): void {\n\t\tif (!this.wasmStage || this.attachedRuntimeSlots.has(handle)) return;\n\t\tconst autostep = options.autostep ?? defaultOptions.autostep!;\n\t\tconst shape = resolvePlatformerAttachShape(options, gameEntity);\n\t\tthis.wasmStage.attachPlatformer3D(handle, {\n\t\t\t...shape,\n\t\t\twalkSpeed: options.walkSpeed ?? defaultOptions.walkSpeed!,\n\t\t\trunSpeed: options.runSpeed ?? defaultOptions.runSpeed!,\n\t\t\tjumpForce: options.jumpForce ?? defaultOptions.jumpForce!,\n\t\t\tmaxJumps: options.maxJumps ?? defaultOptions.maxJumps!,\n\t\t\tgravity: options.gravity ?? defaultOptions.gravity!,\n\t\t\tslopeClimbAngle: options.slopeClimbAngle ?? defaultOptions.slopeClimbAngle!,\n\t\t\tslopeSlideAngle: options.slopeSlideAngle ?? defaultOptions.slopeSlideAngle!,\n\t\t\tautostepHeight: autostep ? autostep.maxHeight : 0,\n\t\t\tautostepMinWidth: autostep ? autostep.minWidth : 0.1,\n\t\t\tsnapToGroundDistance: options.snapToGroundDistance ?? defaultOptions.snapToGroundDistance!,\n\t\t\tcharacterOffset: options.characterOffset ?? defaultOptions.characterOffset!,\n\t\t});\n\t\tthis.attachedRuntimeSlots.add(handle);\n\t}\n\n\tdestroy(_ecs: unknown): void {\n\t\tthis.attachedRuntimeSlots.clear();\n\t}\n}\n\n/**\n * Platformer3DBehavior - typed descriptor for 3D platformer movement\n * \n * Provides complete 3D platformer physics including:\n * - Walking and running\n * - Jumping with multi-jump support\n * - Gravity and falling\n * - Ground detection\n * \n * @example\n * ```typescript\n * import { Platformer3DBehavior } from \"@zylem/game-lib/behavior\";\n * \n * const player = await playgroundActor('player');\n * const platformer = player.use(Platformer3DBehavior, {\n * walkSpeed: 12,\n * runSpeed: 24,\n * jumpForce: 12,\n * maxJumps: 2, // Double jump!\n * });\n * \n * // In update loop\n * player.onUpdate(({ inputs }) => {\n * player.$platformer.moveX = inputs.p1.axes.Horizontal.value;\n * player.$platformer.moveZ = inputs.p1.axes.Vertical.value;\n * player.$platformer.jump = inputs.p1.buttons.A.held > 0;\n * player.$platformer.run = inputs.p1.shoulders.LTrigger.held > 0;\n * \n * const state = platformer.getState();\n * const grounded = platformer.isGrounded();\n * });\n * ```\n */\nexport const Platformer3DBehavior = defineBehavior<\n\tPlatformer3DBehaviorOptions,\n\t{\n\t\tgetState: () => Platformer3DState;\n\t\tisGrounded: () => boolean;\n\t\tgetJumpCount: () => number;\n\t\tonPlatformCollision: (ctx: PlatformerCollisionContext) => void;\n\t},\n\tPlatformer3DEntity\n>({\n\tname: 'platformer-3d',\n\tdefaultOptions,\n\tsystemFactory: (ctx) =>\n\t\tnew Platformer3DBehaviorSystem(\n\t\t\tctx.wasmStage ?? null,\n\t\t\tctx.getBehaviorLinks,\n\t\t),\n\t// Handles read the runtime snapshot buffer (values are from the end of\n\t// the previous step — one-frame lag). The Rust FSM is the single source\n\t// of truth.\n\tcreateHandle: (ref) => ({\n\t\tgetState: () => {\n\t\t\tconst snapshot = readBehaviorSnapshot(ref);\n\t\t\tif (snapshot) return FSM_STATE_BY_INDEX[snapshot.fsmState] ?? Platformer3DState.Idle;\n\t\t\treturn Platformer3DState.Idle;\n\t\t},\n\t\tisGrounded: () => readBehaviorSnapshot(ref)?.grounded ?? false,\n\t\tgetJumpCount: () => readBehaviorSnapshot(ref)?.jumpCount ?? 0,\n\t\tonPlatformCollision: (_ctx) => {},\n\t}),\n});\n"],"mappings":"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","names":["Platformer3DState","Platformer3DEvent"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/behaviors/shared/direction-2d.ts"],"sourcesContent":["export interface Direction2D {\n\tx: number;\n\ty: number;\n}\n\nconst DIRECTION_EPSILON = 1e-6;\n\nexport function normalizeDirection2D(x: number, y: number): Direction2D | null {\n\tconst length = Math.hypot(x, y);\n\tif (length <= DIRECTION_EPSILON) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tx: x / length,\n\t\ty: y / length,\n\t};\n}\n\n/**\n * Allocation-free variant of {@link normalizeDirection2D} for per-frame paths.\n * Writes the normalized direction into `out` and returns true, or returns\n * false (leaving `out` untouched) when the input is effectively zero-length.\n */\nexport function normalizeDirection2DInto(\n\tx: number,\n\ty: number,\n\tout: Direction2D,\n): boolean {\n\tconst length = Math.hypot(x, y);\n\tif (length <= DIRECTION_EPSILON) {\n\t\treturn false;\n\t}\n\n\tout.x = x / length;\n\tout.y = y / length;\n\treturn true;\n}\n\nexport function angleFromDirection2D(direction: Direction2D): number {\n\treturn Math.atan2(-direction.x, direction.y);\n}\n\nexport function directionFromAngle2D(angle: number): Direction2D {\n\treturn {\n\t\tx: Math.sin(-angle),\n\t\ty: Math.cos(-angle),\n\t};\n}\n\nexport function rightFromAngle2D(angle: number): Direction2D {\n\treturn {\n\t\tx: Math.cos(angle),\n\t\ty: Math.sin(angle),\n\t};\n}\n\nexport function rotateLocalOffset2D(\n\toffset: Direction2D,\n\tangle: number,\n): Direction2D {\n\tconst right = rightFromAngle2D(angle);\n\tconst forward = directionFromAngle2D(angle);\n\treturn {\n\t\tx: right.x * offset.x + forward.x * offset.y,\n\t\ty: right.y * offset.x + forward.y * offset.y,\n\t};\n}\n\nexport function getRotationAngle2D(\n\trotation: { x: number; y: number; z: number; w: number },\n): number {\n\treturn Math.atan2(\n\t\t2 * (rotation.w * rotation.z + rotation.x * rotation.y),\n\t\t1 - 2 * (rotation.y * rotation.y + rotation.z * rotation.z),\n\t);\n}\n"],"mappings":";AAKA,IAAM,oBAAoB;AAEnB,SAAS,qBAAqB,GAAW,GAA+B;AAC9E,QAAM,SAAS,KAAK,MAAM,GAAG,CAAC;AAC9B,MAAI,UAAU,mBAAmB;AAChC,WAAO;AAAA,EACR;AAEA,SAAO;AAAA,IACN,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,EACR;AACD;AAsBO,SAAS,qBAAqB,WAAgC;AACpE,SAAO,KAAK,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;AAC5C;AAEO,SAAS,qBAAqB,OAA4B;AAChE,SAAO;AAAA,IACN,GAAG,KAAK,IAAI,CAAC,KAAK;AAAA,IAClB,GAAG,KAAK,IAAI,CAAC,KAAK;AAAA,EACnB;AACD;AAEO,SAAS,iBAAiB,OAA4B;AAC5D,SAAO;AAAA,IACN,GAAG,KAAK,IAAI,KAAK;AAAA,IACjB,GAAG,KAAK,IAAI,KAAK;AAAA,EAClB;AACD;AAEO,SAAS,oBACf,QACA,OACc;AACd,QAAM,QAAQ,iBAAiB,KAAK;AACpC,QAAM,UAAU,qBAAqB,KAAK;AAC1C,SAAO;AAAA,IACN,GAAG,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO;AAAA,IAC3C,GAAG,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO;AAAA,EAC5C;AACD;AAEO,SAAS,mBACf,UACS;AACT,SAAO,KAAK;AAAA,IACX,KAAK,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS;AAAA,IACrD,IAAI,KAAK,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS;AAAA,EAC1D;AACD;","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
directionFromAngle2D,
|
|
4
4
|
getRotationAngle2D,
|
|
5
5
|
normalizeDirection2D
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SGHIGTVZ.js";
|
|
7
7
|
|
|
8
8
|
// src/lib/coordinators/shared/top-down-aim.ts
|
|
9
9
|
function getEntityFacingAngle2D(entity) {
|
|
@@ -35,3 +35,4 @@ export {
|
|
|
35
35
|
getEntityFacingAngle2D,
|
|
36
36
|
resolveAim2D
|
|
37
37
|
};
|
|
38
|
+
//# sourceMappingURL=chunk-TBUKJKY6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/coordinators/shared/top-down-aim.ts"],"sourcesContent":["import {\n\tangleFromDirection2D,\n\tdirectionFromAngle2D,\n\tgetRotationAngle2D,\n\tnormalizeDirection2D,\n} from '../../behaviors/shared/direction-2d';\n\nexport interface ResolvedAim2D {\n\tangle: number;\n\tdirection: { x: number; y: number };\n\thasAimInput: boolean;\n}\n\n/**\n * Minimal entity slice needed to derive a 2D facing angle. Structurally\n * satisfied by `Shooter2DSourceEntity` and the engine entity.\n */\nexport interface FacingAngle2DEntity {\n\ttopDownMovementState?: { facingAngle: number };\n\tbody?: {\n\t\trotation?: () => { x: number; y: number; z: number; w: number };\n\t} | null;\n\t/** Cached Z rotation maintained by 2D rotation helpers. */\n\t_rotation2DAngle?: number;\n}\n\nexport function getEntityFacingAngle2D(entity: FacingAngle2DEntity): number {\n\tif (entity.topDownMovementState) {\n\t\treturn entity.topDownMovementState.facingAngle;\n\t}\n\n\tif (entity.body?.rotation) {\n\t\treturn getRotationAngle2D(entity.body.rotation());\n\t}\n\n\treturn entity._rotation2DAngle ?? 0;\n}\n\nexport function resolveAim2D(\n\taimX: number,\n\taimY: number,\n\tfallbackAngle: number,\n): ResolvedAim2D {\n\tconst direction = normalizeDirection2D(aimX, aimY);\n\tif (direction) {\n\t\treturn {\n\t\t\tangle: angleFromDirection2D(direction),\n\t\t\tdirection,\n\t\t\thasAimInput: true,\n\t\t};\n\t}\n\n\treturn {\n\t\tangle: fallbackAngle,\n\t\tdirection: directionFromAngle2D(fallbackAngle),\n\t\thasAimInput: false,\n\t};\n}\n"],"mappings":";;;;;;;;AA0BO,SAAS,uBAAuB,QAAqC;AAC3E,MAAI,OAAO,sBAAsB;AAChC,WAAO,OAAO,qBAAqB;AAAA,EACpC;AAEA,MAAI,OAAO,MAAM,UAAU;AAC1B,WAAO,mBAAmB,OAAO,KAAK,SAAS,CAAC;AAAA,EACjD;AAEA,SAAO,OAAO,oBAAoB;AACnC;AAEO,SAAS,aACf,MACA,MACA,eACgB;AAChB,QAAM,YAAY,qBAAqB,MAAM,IAAI;AACjD,MAAI,WAAW;AACd,WAAO;AAAA,MACN,OAAO,qBAAqB,SAAS;AAAA,MACrC;AAAA,MACA,aAAa;AAAA,IACd;AAAA,EACD;AAEA,SAAO;AAAA,IACN,OAAO;AAAA,IACP,WAAW,qBAAqB,aAAa;AAAA,IAC7C,aAAa;AAAA,EACd;AACD;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/behaviors/particle-emitter/preset-builder.ts","../src/lib/behaviors/particle-emitter/gpu/particles.ts","../src/lib/behaviors/particle-emitter/gpu/types.ts","../src/lib/behaviors/particle-emitter/gpu/textures.ts","../src/lib/behaviors/particle-emitter/gpu/nodes.ts","../src/lib/behaviors/particle-emitter/gpu/easing.ts","../src/lib/behaviors/particle-emitter/gpu/utils.ts","../src/lib/behaviors/particle-emitter/presets/electricity/arc.ts","../src/lib/behaviors/particle-emitter/presets/electricity/pulse.ts","../src/lib/behaviors/particle-emitter/presets/electricity/spark.ts","../src/lib/behaviors/particle-emitter/presets/electricity/storm.ts","../src/lib/behaviors/particle-emitter/presets/electricity/surge.ts","../src/lib/behaviors/particle-emitter/presets/electricity/index.ts","../src/lib/behaviors/particle-emitter/presets/fire/blaze.ts","../src/lib/behaviors/particle-emitter/presets/fire/ember.ts","../src/lib/behaviors/particle-emitter/presets/fire/flamelet.ts","../src/lib/behaviors/particle-emitter/presets/fire/smolder.ts","../src/lib/behaviors/particle-emitter/presets/fire/spark.ts","../src/lib/behaviors/particle-emitter/presets/fire/index.ts","../src/lib/behaviors/particle-emitter/presets/gas/haze.ts","../src/lib/behaviors/particle-emitter/presets/gas/miasma.ts","../src/lib/behaviors/particle-emitter/presets/gas/plume.ts","../src/lib/behaviors/particle-emitter/presets/gas/smoke.ts","../src/lib/behaviors/particle-emitter/presets/gas/vapor.ts","../src/lib/behaviors/particle-emitter/presets/gas/index.ts","../src/lib/behaviors/particle-emitter/presets/magic/arcane.ts","../src/lib/behaviors/particle-emitter/presets/magic/corrupted.ts","../src/lib/behaviors/particle-emitter/presets/magic/holy.ts","../src/lib/behaviors/particle-emitter/presets/magic/nature.ts","../src/lib/behaviors/particle-emitter/presets/magic/psychic.ts","../src/lib/behaviors/particle-emitter/presets/magic/void.ts","../src/lib/behaviors/particle-emitter/presets/magic/index.ts","../src/lib/behaviors/particle-emitter/presets/water/drizzle.ts","../src/lib/behaviors/particle-emitter/presets/water/mist.ts","../src/lib/behaviors/particle-emitter/presets/water/splash.ts","../src/lib/behaviors/particle-emitter/presets/water/spray.ts","../src/lib/behaviors/particle-emitter/presets/water/torrent.ts","../src/lib/behaviors/particle-emitter/presets/water/index.ts"],"sourcesContent":["import {\n\tAdditiveBlending,\n\tColor,\n\ttype Blending,\n\ttype ColorRepresentation,\n\ttype Texture,\n} from 'three';\n\nimport { Particles } from './gpu';\nimport type {\n\tColorStop as GpuColorStop,\n\tEaseFunction,\n\tEmitterSettings,\n\tParticleSettings,\n\tParticlesConfig,\n\tRenderSettings,\n} from './gpu';\n\n/**\n * Builds {@link ParticlesConfig} objects for the WebGPU/TSL particle engine\n * ({@link Particles}) from a high-level \"semantic\" description.\n *\n * This module previously targeted the CPU-simulated `three.quarks`\n * `ParticleSystem`. The authoring surface (semantic presets, magic modifiers,\n * option names) is preserved; the output now drives the GPU engine instead.\n *\n * ## three.quarks feature-parity notes\n *\n * The GPU engine simulates each particle from a small set of per-instance\n * values, so several three.quarks behaviors are approximated or unsupported:\n *\n * - `ColorOverLife` -> sampled gradient (`particles.colors`). Per-stop alpha is\n * collapsed into a single fade-in/fade-out window (`fadeAlpha`).\n * - `SizeOverLife` (bezier) -> fade-in/out window (`fadeSize`), approximated\n * from the curve's endpoints.\n * - `SpeedOverLife` (bezier) -> chooses an `easeFunction` (accelerate vs.\n * decelerate); the exact curve is not reproduced.\n * - `ForceOverLife` -> constant `gravity` (midpoint of the configured ranges).\n * - `RotationOverLife` -> per-particle `rotationSpeed`.\n * - Cone/Sphere emitters -> emission direction/position ranges approximating\n * the shape; not an exact volumetric match.\n * - `renderMode` -> only billboard is supported (sprites always face the\n * camera); stretched/mesh/trail modes are ignored.\n * - `Noise`, `OrbitOverLife`, sprite-sheet tiling, and trails -> not supported.\n */\n\n/** Subset of three.quarks `RenderMode` kept for preset-authoring compatibility. */\nexport enum RenderMode {\n\tBillBoard = 0,\n\tStretchedBillBoard = 1,\n\tHorizontalBillBoard = 2,\n\tVerticalBillBoard = 3,\n\tMesh = 4,\n\tTrail = 5,\n}\n\n/** A particle effect factory returning a fresh {@link Particles} object. */\nexport interface ParticleEffectDefinition {\n\tcreate(): Particles;\n}\n\nexport interface ParticlePresetMaterialOptions {\n\ttexture?: Texture;\n\topacity?: number;\n\tdepthWrite?: boolean;\n\talphaTest?: number;\n\tblending?: Blending;\n\tuTileCount?: number;\n\tvTileCount?: number;\n\tblendTiles?: boolean;\n}\n\nexport type NumericRange = number | readonly [number, number];\nexport type CurvePoints = readonly [number, number, number, number];\nexport type ColorStop = readonly [ColorRepresentation, number];\nexport type AlphaStop = readonly [number, number];\n\nexport interface ParticleColorOverLifeConfig {\n\tcolors: readonly ColorStop[];\n\talpha: readonly AlphaStop[];\n}\n\nexport interface ParticleForceOverLifeConfig {\n\tx?: NumericRange;\n\ty?: NumericRange;\n\tz?: NumericRange;\n}\n\nexport interface ParticleNoiseConfig {\n\tfrequency: NumericRange;\n\tpower: NumericRange;\n\tpositionAmount?: NumericRange;\n\trotationAmount?: NumericRange;\n}\n\nexport interface ParticleOrbitConfig {\n\tspeed: NumericRange;\n\taxis?: readonly [number, number, number];\n}\n\nexport interface ParticleBehaviorConfig {\n\tcolorOverLife?: ParticleColorOverLifeConfig;\n\tsizeOverLife?: CurvePoints;\n\tspeedOverLife?: CurvePoints;\n\trotationOverLife?: NumericRange;\n\tforceOverLife?: ParticleForceOverLifeConfig;\n\tnoise?: ParticleNoiseConfig;\n\torbitOverLife?: ParticleOrbitConfig;\n}\n\nexport interface ParticleBehaviorOverrides {\n\tcolorOverLife?: ParticleColorOverLifeConfig | null;\n\tsizeOverLife?: CurvePoints | null;\n\tspeedOverLife?: CurvePoints | null;\n\trotationOverLife?: NumericRange | null;\n\tforceOverLife?: Partial<ParticleForceOverLifeConfig> | null;\n\tnoise?: Partial<ParticleNoiseConfig> | null;\n\torbitOverLife?: Partial<ParticleOrbitConfig> | null;\n}\n\nexport type ParticleShapeConfig =\n\t| { type: 'point' }\n\t| {\n\t\t\ttype: 'cone';\n\t\t\tradius?: number;\n\t\t\tthickness?: number;\n\t\t\tangle?: number;\n\t\t\tspeed?: NumericRange;\n\t }\n\t| {\n\t\t\ttype: 'sphere';\n\t\t\tradius?: number;\n\t\t\tthickness?: number;\n\t\t\tspeed?: NumericRange;\n\t };\n\ntype ParticleEmissionConfig =\n\t| {\n\t\t\ttype: 'burst';\n\t\t\tcount: number;\n\t }\n\t| {\n\t\t\ttype: 'rate';\n\t\t\trate: number;\n\t };\n\ninterface SemanticParticleSystemConfig {\n\tdefaults: {\n\t\tduration: number;\n\t\tlooping?: boolean;\n\t\tworldSpace?: boolean;\n\t\tcolor: ColorRepresentation;\n\t\tlife: NumericRange;\n\t\tsize: NumericRange;\n\t\tspeed: NumericRange;\n\t\trotation?: NumericRange;\n\t\topacity?: number;\n\t\trenderMode?: RenderMode;\n\t};\n\temission: ParticleEmissionConfig;\n\tshape?: ParticleShapeConfig;\n\tbehaviors?: ParticleBehaviorConfig;\n\t/** Reserved for renderer-specific hints; ignored by the GPU engine. */\n\trendererEmitterSettings?: Record<string, unknown>;\n}\n\nexport interface SemanticParticlePresetDefinition<\n\tFamily extends string = string,\n\tVariant extends string = string,\n> {\n\tfamily: Family;\n\tvariant: Variant;\n\tdescription: string;\n\taxes: Readonly<Record<string, string>>;\n\tsystem: SemanticParticleSystemConfig;\n}\n\nexport type ParticleMagicAlignment =\n\t| 'arcane'\n\t| 'holy'\n\t| 'corrupted'\n\t| 'nature'\n\t| 'void'\n\t| 'psychic';\n\nexport type ParticleMagicTemperament =\n\t| 'calm'\n\t| 'ominous'\n\t| 'playful'\n\t| 'regal'\n\t| 'predatory';\n\nexport type ParticleMagicAgency =\n\t| 'passive'\n\t| 'reactive'\n\t| 'seeking'\n\t| 'sentient-feeling';\n\nexport type ParticleMagicOrder = 'geometric' | 'organic' | 'chaotic';\n\nexport type ParticleMagicRealityEffect =\n\t| 'warping'\n\t| 'illuminating'\n\t| 'binding'\n\t| 'decaying'\n\t| 'healing';\n\nexport interface ParticleMagicModifierOptions {\n\talignment: ParticleMagicAlignment;\n\ttemperament?: ParticleMagicTemperament;\n\tagency?: ParticleMagicAgency;\n\torder?: ParticleMagicOrder;\n\trealityEffect?: ParticleMagicRealityEffect;\n\tintensity?: number;\n}\n\nexport type ParticleMagicModifierInput =\n\t| ParticleMagicAlignment\n\t| ParticleMagicModifierOptions;\n\nexport interface SemanticParticlePresetOptions\n\textends ParticlePresetMaterialOptions {\n\tbehaviors?: ParticleBehaviorOverrides;\n\tcolor?: ColorRepresentation;\n\tcount?: number;\n\tduration?: number;\n\temissionRate?: number;\n\tlife?: NumericRange;\n\tlooping?: boolean;\n\tmagic?: ParticleMagicModifierInput;\n\trenderMode?: RenderMode;\n\trendererEmitterSettings?: Record<string, unknown>;\n\trotation?: NumericRange;\n\tshape?: ParticleShapeConfig;\n\tsize?: NumericRange;\n\tspeed?: NumericRange;\n\tworldSpace?: boolean;\n}\n\ninterface MagicPalette {\n\tstart: ColorRepresentation;\n\tmid: ColorRepresentation;\n\tend: ColorRepresentation;\n}\n\nconst DEFAULT_MAGIC_BEHAVIOR_BY_ALIGNMENT: Record<\n\tParticleMagicAlignment,\n\tOmit<ParticleMagicModifierOptions, 'alignment'>\n> = {\n\tarcane: {\n\t\ttemperament: 'regal',\n\t\tagency: 'reactive',\n\t\torder: 'geometric',\n\t\trealityEffect: 'warping',\n\t\tintensity: 1,\n\t},\n\tholy: {\n\t\ttemperament: 'calm',\n\t\tagency: 'passive',\n\t\torder: 'geometric',\n\t\trealityEffect: 'illuminating',\n\t\tintensity: 1,\n\t},\n\tcorrupted: {\n\t\ttemperament: 'ominous',\n\t\tagency: 'seeking',\n\t\torder: 'chaotic',\n\t\trealityEffect: 'decaying',\n\t\tintensity: 1.05,\n\t},\n\tnature: {\n\t\ttemperament: 'calm',\n\t\tagency: 'reactive',\n\t\torder: 'organic',\n\t\trealityEffect: 'healing',\n\t\tintensity: 0.9,\n\t},\n\tvoid: {\n\t\ttemperament: 'ominous',\n\t\tagency: 'seeking',\n\t\torder: 'chaotic',\n\t\trealityEffect: 'warping',\n\t\tintensity: 1.15,\n\t},\n\tpsychic: {\n\t\ttemperament: 'predatory',\n\t\tagency: 'sentient-feeling',\n\t\torder: 'organic',\n\t\trealityEffect: 'binding',\n\t\tintensity: 1,\n\t},\n};\n\nconst MAGIC_PALETTES: Record<ParticleMagicAlignment, MagicPalette> = {\n\tarcane: { start: '#dbeafe', mid: '#60a5fa', end: '#1d4ed8' },\n\tholy: { start: '#fff7d1', mid: '#fde68a', end: '#f59e0b' },\n\tcorrupted: { start: '#bef264', mid: '#84cc16', end: '#4d7c0f' },\n\tnature: { start: '#dcfce7', mid: '#4ade80', end: '#15803d' },\n\tvoid: { start: '#c4b5fd', mid: '#475569', end: '#0f172a' },\n\tpsychic: { start: '#fce7f3', mid: '#f472b6', end: '#db2777' },\n};\n\nexport function particleEffect(create: () => Particles): ParticleEffectDefinition {\n\treturn { create };\n}\n\nexport function defineSemanticParticlePreset<\n\tT extends SemanticParticlePresetDefinition,\n>(preset: T): T {\n\treturn preset;\n}\n\nexport function createMagicModifier(\n\talignment: ParticleMagicAlignment,\n\toverrides: Omit<ParticleMagicModifierOptions, 'alignment'> = {},\n): ParticleMagicModifierOptions {\n\treturn {\n\t\talignment,\n\t\t...DEFAULT_MAGIC_BEHAVIOR_BY_ALIGNMENT[alignment],\n\t\t...overrides,\n\t};\n}\n\n/**\n * Builds a {@link ParticlesConfig} from a semantic preset and per-call options,\n * then wraps it in a {@link ParticleEffectDefinition} factory.\n */\nexport function createSemanticParticleEffect(\n\tpreset: SemanticParticlePresetDefinition,\n\toptions: SemanticParticlePresetOptions = {},\n): ParticleEffectDefinition {\n\tconst config = buildParticlesConfig(preset, options);\n\treturn particleEffect(() => new Particles(config));\n}\n\nexport function buildParticlesConfig(\n\tpreset: SemanticParticlePresetDefinition,\n\toptions: SemanticParticlePresetOptions = {},\n): ParticlesConfig {\n\tconst defaults = preset.system.defaults;\n\tconst magic = normalizeMagicModifier(options.magic);\n\tconst resolvedShape = mergeShapeConfig(preset.system.shape, options.shape);\n\tconst baseBehaviors = mergeBehaviorConfig(preset.system.behaviors, options.behaviors);\n\n\tconst baseColor = options.color ?? defaults.color;\n\tconst resolvedColor = magic\n\t\t? mixColors(baseColor, MAGIC_PALETTES[magic.alignment].start, 0.2)\n\t\t: baseColor;\n\tconst behaviors = magic\n\t\t? applyMagicBehaviors(baseBehaviors, resolvedColor, magic)\n\t\t: baseBehaviors;\n\n\tconst duration = options.duration ?? defaults.duration;\n\tconst looping =\n\t\toptions.looping ?? defaults.looping ?? preset.system.emission.type === 'rate';\n\tconst life = toRange(options.life ?? defaults.life);\n\tconst size = toRange(options.size ?? defaults.size);\n\tconst baseSpeed = toRange(options.speed ?? defaults.speed);\n\tconst shapeSpeed = resolvedShape && 'speed' in resolvedShape ? resolvedShape.speed : undefined;\n\tconst speed = shapeSpeed !== undefined ? toRange(addRanges(baseSpeed, shapeSpeed)!) : baseSpeed;\n\n\tconst intensity = magic ? clamp(magic.intensity ?? 1, 0.5, 1.5) : (defaults.opacity ?? 1);\n\n\tconst colors = behaviors?.colorOverLife\n\t\t? [behaviors.colorOverLife.colors.map(([color, stop]) => toGpuColorStop(color, stop))]\n\t\t: [\n\t\t\t\t[\n\t\t\t\t\t{ color: toHexColor(resolvedColor), stop: 0 },\n\t\t\t\t\t{ color: toHexColor(resolvedColor), stop: 1 },\n\t\t\t\t],\n\t\t\t];\n\n\tconst fadeAlpha = behaviors?.colorOverLife\n\t\t? deriveFadeFromAlpha(behaviors.colorOverLife.alpha)\n\t\t: [0.1, 0.85];\n\tconst fadeSize = behaviors?.sizeOverLife\n\t\t? deriveFadeFromSizeCurve(behaviors.sizeOverLife)\n\t\t: [0.15, 0.9];\n\tconst gravity = behaviors?.forceOverLife\n\t\t? forceToGravity(behaviors.forceOverLife)\n\t\t: [0, 0, 0];\n\tconst easeFunction = behaviors?.speedOverLife\n\t\t? speedCurveToEase(behaviors.speedOverLife)\n\t\t: 'easeLinear';\n\n\tconst emission = resolveEmission(preset.system.emission, options, duration, life[1]);\n\tconst direction = shapeToDirection(resolvedShape);\n\tconst startPosition = shapeToStartPosition(resolvedShape);\n\tconst startRotation = rotationToStart(options.rotation ?? defaults.rotation);\n\tconst rotationSpeed = behaviors?.rotationOverLife\n\t\t? rangeToRotationSpeedZ(behaviors.rotationOverLife)\n\t\t: { min: [0, 0, 0] as Vec3, max: [0, 0, 0] as Vec3 };\n\n\tconst blending = (options.blending ?? AdditiveBlending) as RenderSettings['blendingMode'];\n\n\tconst particles: Partial<ParticleSettings> & Pick<ParticleSettings, 'count'> = {\n\t\tcount: emission.count,\n\t\tintensity,\n\t\tfadeSize: fadeSize as [number, number],\n\t\tfadeAlpha: fadeAlpha as [number, number],\n\t\tgravity: gravity as Vec3,\n\t\tcolors,\n\t\teaseFunction,\n\t};\n\tif (options.texture) {\n\t\tparticles.alphaMapsStart = [options.texture] as unknown as ParticleSettings['alphaMapsStart'];\n\t}\n\n\tconst emitter: Partial<EmitterSettings> = {\n\t\tduration,\n\t\trate: emission.rate,\n\t\tspawnMode: emission.spawnMode,\n\t\tloop: looping,\n\t\tstatic: 0,\n\t\tworldUpRight: false,\n\t\tlifetime: life as [number, number],\n\t\tspeed: speed as [number, number],\n\t\tsize: size as [number, number],\n\t\tdirectionMin: direction.min,\n\t\tdirectionMax: direction.max,\n\t\tstartPositionMin: startPosition.min,\n\t\tstartPositionMax: startPosition.max,\n\t\tstartRotationMin: startRotation.min,\n\t\tstartRotationMax: startRotation.max,\n\t\trotationSpeedMin: rotationSpeed.min,\n\t\trotationSpeedMax: rotationSpeed.max,\n\t};\n\n\treturn {\n\t\tparticles,\n\t\temitter,\n\t\trender: { blendingMode: blending },\n\t};\n}\n\ntype Vec3 = [number, number, number];\n\ninterface EmissionResult {\n\tspawnMode: 'time' | 'burst';\n\trate: number;\n\tcount: number;\n}\n\nfunction resolveEmission(\n\temission: ParticleEmissionConfig,\n\toptions: SemanticParticlePresetOptions,\n\tduration: number,\n\tmaxLifetime: number,\n): EmissionResult {\n\tif (emission.type === 'burst') {\n\t\tconst count = Math.max(1, Math.round(options.count ?? emission.count));\n\t\treturn { spawnMode: 'burst', rate: count, count };\n\t}\n\n\tconst perSecond = Math.max(0, options.emissionRate ?? emission.rate);\n\tconst rate = Math.max(1, Math.round(perSecond * Math.max(duration, 0.0001)));\n\tconst simultaneous = Math.ceil(perSecond * Math.max(maxLifetime, 0.0001) * 1.5);\n\tconst count = Math.min(200000, Math.max(rate, simultaneous, 8));\n\treturn { spawnMode: 'time', rate, count };\n}\n\nfunction deriveFadeFromAlpha(alpha: readonly AlphaStop[]): [number, number] {\n\tif (!alpha || alpha.length === 0) return [0.1, 0.85];\n\tconst sorted = [...alpha].sort((a, b) => a[1] - b[1]);\n\tconst maxAlpha = Math.max(...sorted.map(([value]) => value), 0.0001);\n\n\tlet fadeIn = 0.15;\n\tfor (const [value, stop] of sorted) {\n\t\tif (value >= maxAlpha * 0.6) {\n\t\t\tfadeIn = stop;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet fadeOut = 0.85;\n\tfor (const [value, stop] of sorted) {\n\t\tif (value >= maxAlpha * 0.4) fadeOut = stop;\n\t}\n\n\tfadeIn = clamp(fadeIn, 0.02, 0.45);\n\tfadeOut = clamp(fadeOut, 0.55, 0.99);\n\tif (fadeOut <= fadeIn) fadeOut = Math.min(0.99, fadeIn + 0.3);\n\treturn [fadeIn, fadeOut];\n}\n\nfunction deriveFadeFromSizeCurve(points: CurvePoints): [number, number] {\n\tconst start = points[0];\n\tconst end = points[3];\n\tconst fadeIn = start < 0.5 ? 0.25 : 0.02;\n\tconst fadeOut = end < 0.5 ? 0.75 : 0.98;\n\treturn [fadeIn, fadeOut];\n}\n\nfunction forceToGravity(force: ParticleForceOverLifeConfig): Vec3 {\n\tconst mid = (range: NumericRange | undefined): number => {\n\t\tif (range === undefined) return 0;\n\t\tconst [min, max] = toRange(range);\n\t\treturn (min + max) * 0.5;\n\t};\n\treturn [mid(force.x), mid(force.y), mid(force.z)];\n}\n\nfunction speedCurveToEase(points: CurvePoints): EaseFunction {\n\tconst start = points[0];\n\tconst end = points[3];\n\tif (end < start - 0.05) return 'easeOutCubic';\n\tif (end > start + 0.05) return 'easeInCubic';\n\treturn 'easeLinear';\n}\n\nfunction shapeToDirection(shape: ParticleShapeConfig | undefined): { min: Vec3; max: Vec3 } {\n\tif (!shape || shape.type === 'point' || shape.type === 'sphere') {\n\t\treturn { min: [-1, -1, -1], max: [1, 1, 1] };\n\t}\n\tconst angle = shape.angle ?? 0.3;\n\tconst spread = Math.tan(clamp(angle, 0, 1.4));\n\treturn { min: [-spread, 1, -spread], max: [spread, 1, spread] };\n}\n\nfunction shapeToStartPosition(shape: ParticleShapeConfig | undefined): { min: Vec3; max: Vec3 } {\n\tif (!shape || shape.type === 'point') {\n\t\treturn { min: [0, 0, 0], max: [0, 0, 0] };\n\t}\n\tconst r = shape.radius ?? 0;\n\tif (shape.type === 'sphere') {\n\t\treturn { min: [-r, -r, -r], max: [r, r, r] };\n\t}\n\treturn { min: [-r, 0, -r], max: [r, 0, r] };\n}\n\nfunction rotationToStart(rotation: NumericRange | undefined): { min: Vec3; max: Vec3 } {\n\tif (rotation === undefined) {\n\t\treturn { min: [0, 0, 0], max: [0, 0, 0] };\n\t}\n\tconst [min, max] = toRange(rotation);\n\tconst norm = (theta: number) => theta / Math.PI - 1;\n\treturn { min: [0, 0, norm(min)], max: [0, 0, norm(max)] };\n}\n\nfunction rangeToRotationSpeedZ(rotation: NumericRange): { min: Vec3; max: Vec3 } {\n\tconst [min, max] = toRange(rotation);\n\treturn { min: [0, 0, min], max: [0, 0, max] };\n}\n\nfunction toGpuColorStop(color: ColorRepresentation, stop: number): GpuColorStop {\n\treturn { color: toHexColor(color), stop };\n}\n\nfunction normalizeMagicModifier(\n\tinput?: ParticleMagicModifierInput,\n): ParticleMagicModifierOptions | null {\n\tif (!input) return null;\n\tif (typeof input === 'string') return createMagicModifier(input);\n\treturn createMagicModifier(input.alignment, input);\n}\n\nfunction applyMagicBehaviors(\n\tbase: ParticleBehaviorConfig | undefined,\n\tbaseColor: ColorRepresentation,\n\tmagic: ParticleMagicModifierOptions,\n): ParticleBehaviorConfig {\n\tconst intensity = clamp(magic.intensity ?? 1, 0.25, 1.5);\n\tconst palette = MAGIC_PALETTES[magic.alignment];\n\n\treturn {\n\t\t...base,\n\t\tcolorOverLife: tintColorOverLife(base?.colorOverLife, baseColor, palette, intensity),\n\t\trotationOverLife: addRanges(base?.rotationOverLife, resolveMagicRotation(magic, intensity)),\n\t\tforceOverLife: mergeForce(base?.forceOverLife, resolveMagicForce(magic, intensity)),\n\t\tnoise: mergeNoise(base?.noise, resolveMagicNoise(magic, intensity)),\n\t\torbitOverLife: resolveMagicOrbit(magic, intensity) ?? base?.orbitOverLife,\n\t};\n}\n\nfunction resolveMagicRotation(\n\tmagic: ParticleMagicModifierOptions,\n\tintensity: number,\n): NumericRange | undefined {\n\tconst amount = 0.7 + intensity * 1.4;\n\n\tswitch (magic.order) {\n\t\tcase 'geometric':\n\t\t\treturn [amount * 0.45, amount];\n\t\tcase 'organic':\n\t\t\treturn [-amount * 0.55, amount * 0.55];\n\t\tcase 'chaotic':\n\t\t\treturn [-amount * 2.4, amount * 2.4];\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction resolveMagicForce(\n\tmagic: ParticleMagicModifierOptions,\n\tintensity: number,\n): ParticleForceOverLifeConfig | undefined {\n\tconst amount = 0.2 + intensity * 0.55;\n\n\tswitch (magic.realityEffect) {\n\t\tcase 'illuminating':\n\t\tcase 'healing':\n\t\t\treturn { y: [amount * 0.6, amount] };\n\t\tcase 'decaying':\n\t\t\treturn { y: [-amount, -amount * 0.5] };\n\t\tcase 'binding':\n\t\t\treturn { y: [-amount * 0.35, amount * 0.15] };\n\t\tcase 'warping':\n\t\t\treturn { x: [-amount * 0.35, amount * 0.35], z: [-amount * 0.35, amount * 0.35] };\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction resolveMagicNoise(\n\tmagic: ParticleMagicModifierOptions,\n\tintensity: number,\n): ParticleNoiseConfig {\n\tconst calmMultiplier = magic.temperament === 'calm' ? 0.6 : 1;\n\tconst ominousBoost = magic.temperament === 'ominous' ? 1.25 : 1;\n\tconst basePower = (0.08 + intensity * 0.1) * calmMultiplier * ominousBoost;\n\n\tswitch (magic.order) {\n\t\tcase 'geometric':\n\t\t\treturn {\n\t\t\t\tfrequency: [1.5, 3.5],\n\t\t\t\tpower: [basePower * 0.4, basePower * 0.8],\n\t\t\t\tpositionAmount: [0.08, 0.2],\n\t\t\t\trotationAmount: [0.1, 0.2],\n\t\t\t};\n\t\tcase 'organic':\n\t\t\treturn {\n\t\t\t\tfrequency: [2.5, 5.5],\n\t\t\t\tpower: [basePower * 0.7, basePower * 1.2],\n\t\t\t\tpositionAmount: [0.12, 0.3],\n\t\t\t\trotationAmount: [0.14, 0.26],\n\t\t\t};\n\t\tcase 'chaotic':\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tfrequency: [4, 8],\n\t\t\t\tpower: [basePower, basePower * 1.7],\n\t\t\t\tpositionAmount: [0.18, 0.38],\n\t\t\t\trotationAmount: [0.18, 0.34],\n\t\t\t};\n\t}\n}\n\nfunction resolveMagicOrbit(\n\tmagic: ParticleMagicModifierOptions,\n\tintensity: number,\n): ParticleOrbitConfig | undefined {\n\tif (magic.order === 'geometric') {\n\t\treturn { speed: [3 + intensity * 2, 6 + intensity * 3], axis: [0, 1, 0] };\n\t}\n\tif (magic.agency === 'sentient-feeling') {\n\t\treturn { speed: [1 + intensity, 2.5 + intensity * 1.2], axis: [0, 1, 0] };\n\t}\n\treturn undefined;\n}\n\nfunction tintColorOverLife(\n\tbase: ParticleColorOverLifeConfig | undefined,\n\tbaseColor: ColorRepresentation,\n\tpalette: MagicPalette,\n\tintensity: number,\n): ParticleColorOverLifeConfig {\n\tif (!base) {\n\t\treturn {\n\t\t\tcolors: [\n\t\t\t\t[mixColors(baseColor, palette.start, 0.25), 0],\n\t\t\t\t[mixColors(baseColor, palette.mid, 0.55), 0.45],\n\t\t\t\t[mixColors(baseColor, palette.end, 0.75), 1],\n\t\t\t],\n\t\t\talpha: [\n\t\t\t\t[0.22, 0],\n\t\t\t\t[1, 0.12],\n\t\t\t\t[0.52 + intensity * 0.08, 0.64],\n\t\t\t\t[0, 1],\n\t\t\t],\n\t\t};\n\t}\n\n\treturn {\n\t\tcolors: base.colors.map(([color, stop], index) => {\n\t\t\tconst target =\n\t\t\t\tindex === 0\n\t\t\t\t\t? palette.start\n\t\t\t\t\t: index === base.colors.length - 1\n\t\t\t\t\t\t? palette.end\n\t\t\t\t\t\t: palette.mid;\n\t\t\tconst amount = index === 0 ? 0.18 : 0.3 + intensity * 0.15;\n\t\t\treturn [mixColors(color, target, amount), stop] as const;\n\t\t}),\n\t\talpha: base.alpha,\n\t};\n}\n\nfunction mergeNoise(\n\tbase: ParticleNoiseConfig | undefined,\n\toverlay: ParticleNoiseConfig | undefined,\n): ParticleNoiseConfig | undefined {\n\tif (!base) return overlay;\n\tif (!overlay) return base;\n\treturn {\n\t\tfrequency: addRanges(base.frequency, overlay.frequency) ?? base.frequency,\n\t\tpower: addRanges(base.power, overlay.power) ?? base.power,\n\t\tpositionAmount: addRanges(base.positionAmount, overlay.positionAmount),\n\t\trotationAmount: addRanges(base.rotationAmount, overlay.rotationAmount),\n\t};\n}\n\nfunction mergeForce(\n\tbase: ParticleForceOverLifeConfig | undefined,\n\toverlay: ParticleForceOverLifeConfig | undefined,\n): ParticleForceOverLifeConfig | undefined {\n\tif (!base) return overlay;\n\tif (!overlay) return base;\n\treturn {\n\t\tx: addRanges(base.x, overlay.x),\n\t\ty: addRanges(base.y, overlay.y),\n\t\tz: addRanges(base.z, overlay.z),\n\t};\n}\n\nfunction mergeBehaviorConfig(\n\tbase: ParticleBehaviorConfig | undefined,\n\toverrides: ParticleBehaviorOverrides | undefined,\n): ParticleBehaviorConfig | undefined {\n\tif (!base && !overrides) return undefined;\n\n\tconst merged: ParticleBehaviorConfig = {};\n\n\tassignIfDefined(merged, 'colorOverLife', resolveOverrideValue(base?.colorOverLife, overrides?.colorOverLife));\n\tassignIfDefined(merged, 'sizeOverLife', resolveOverrideValue(base?.sizeOverLife, overrides?.sizeOverLife));\n\tassignIfDefined(merged, 'speedOverLife', resolveOverrideValue(base?.speedOverLife, overrides?.speedOverLife));\n\tassignIfDefined(merged, 'rotationOverLife', resolveOverrideValue(base?.rotationOverLife, overrides?.rotationOverLife));\n\tassignIfDefined(merged, 'forceOverLife', resolvePartialOverride(base?.forceOverLife, overrides?.forceOverLife));\n\tassignIfDefined(merged, 'noise', resolveNoiseOverride(base?.noise, overrides?.noise));\n\tassignIfDefined(merged, 'orbitOverLife', resolveOrbitOverride(base?.orbitOverLife, overrides?.orbitOverLife));\n\n\treturn Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeShapeConfig(\n\tbase: ParticleShapeConfig | undefined,\n\toverride: ParticleShapeConfig | undefined,\n): ParticleShapeConfig | undefined {\n\tif (!override) return base;\n\tif (!base || override.type !== base.type) return override;\n\tif (override.type === 'point') return override;\n\tif (override.type === 'cone' && base.type === 'cone') return { ...base, ...override };\n\tif (override.type === 'sphere' && base.type === 'sphere') return { ...base, ...override };\n\treturn override;\n}\n\nfunction addRanges(\n\tbase: NumericRange | undefined,\n\toverlay: NumericRange | undefined,\n): NumericRange | undefined {\n\tif (base === undefined) return overlay;\n\tif (overlay === undefined) return base;\n\tconst [baseMin, baseMax] = toRange(base);\n\tconst [overlayMin, overlayMax] = toRange(overlay);\n\treturn [baseMin + overlayMin, baseMax + overlayMax];\n}\n\nfunction resolveOverrideValue<T>(\n\tbase: T | undefined,\n\toverride: T | null | undefined,\n): T | undefined {\n\tif (override === null) return undefined;\n\treturn override ?? base;\n}\n\nfunction resolvePartialOverride<T extends object>(\n\tbase: T | undefined,\n\toverride: Partial<T> | null | undefined,\n): T | undefined {\n\tif (override === null) return undefined;\n\tif (!override) return base;\n\tconst resolved = { ...base, ...override };\n\treturn Object.keys(resolved).length > 0 ? (resolved as T) : undefined;\n}\n\nfunction resolveNoiseOverride(\n\tbase: ParticleNoiseConfig | undefined,\n\toverride: Partial<ParticleNoiseConfig> | null | undefined,\n): ParticleNoiseConfig | undefined {\n\tif (override === null) return undefined;\n\tif (!override) return base;\n\tconst frequency = override.frequency ?? base?.frequency;\n\tconst power = override.power ?? base?.power;\n\tif (frequency === undefined || power === undefined) return undefined;\n\treturn { ...base, ...override, frequency, power };\n}\n\nfunction resolveOrbitOverride(\n\tbase: ParticleOrbitConfig | undefined,\n\toverride: Partial<ParticleOrbitConfig> | null | undefined,\n): ParticleOrbitConfig | undefined {\n\tif (override === null) return undefined;\n\tif (!override) return base;\n\tconst speed = override.speed ?? base?.speed;\n\tif (speed === undefined) return undefined;\n\treturn { ...base, ...override, speed };\n}\n\nfunction assignIfDefined<T extends object, K extends keyof T>(\n\ttarget: T,\n\tkey: K,\n\tvalue: T[K] | undefined,\n) {\n\tif (value !== undefined) target[key] = value;\n}\n\nfunction toHexColor(color: ColorRepresentation): string {\n\treturn `#${new Color(color).getHexString()}`;\n}\n\nfunction toRange(value: NumericRange): readonly [number, number] {\n\tif (Array.isArray(value)) {\n\t\treturn [value[0] ?? 0, value[1] ?? value[0] ?? 0];\n\t}\n\treturn [value as number, value as number];\n}\n\nfunction mixColors(\n\tbase: ColorRepresentation,\n\toverlay: ColorRepresentation,\n\tamount: number,\n): string {\n\tconst color = new Color(base);\n\tcolor.lerp(new Color(overlay), clamp(amount, 0, 1));\n\treturn `#${color.getHexString()}`;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.min(Math.max(value, min), max);\n}\n","/**\n * WebGPU-accelerated particle system using Three.js TSL.\n *\n * Ported/adapted from the `threeparticles` project (MIT). The per-particle\n * simulation (position/rotation/scale/color over life) runs in the node\n * material on the GPU; emission is done on the CPU in `update(delta)`. No\n * renderer/compute access is required, so it ticks from the behavior system\n * exactly like the previous three.quarks `BatchedRenderer` node did.\n *\n * @module\n */\n// @ts-nocheck - TSL types are incompatible with TypeScript\nimport * as THREE from 'three/webgpu';\nimport { instancedArray, texture, uniform } from 'three/tsl';\nimport type { EmitterSettings, ParticlesConfig, ParticleSettings, RenderSettings } from './types';\nimport { EASE_FUNCTIONS } from './types';\nimport { createTextureAtlas, createColorGradientTexture } from './textures';\nimport { createParticleMaterialTemplate } from './nodes';\nimport { randFloat, randInt } from './utils';\n\ninterface ResolvedConfig {\n\tparticles: ParticleSettings;\n\trender: RenderSettings;\n\temitter: EmitterSettings;\n}\n\n/** Marks storage nodes for GPU upload on the next draw. */\nfunction markStorageDirty(node: { value?: { needsUpdate: boolean } }): void {\n\tif (node.value) {\n\t\tnode.value.needsUpdate = true;\n\t}\n}\n\nfunction createWhiteCanvasTexture(): THREE.CanvasTexture {\n\tconst canvas = document.createElement('canvas');\n\tcanvas.width = 1;\n\tcanvas.height = 1;\n\tconst ctx = canvas.getContext('2d')!;\n\tctx.fillStyle = '#ffffff';\n\tctx.fillRect(0, 0, 1, 1);\n\tconst tex = new THREE.CanvasTexture(canvas);\n\ttex.needsUpdate = true;\n\treturn tex;\n}\n\nexport class Particles extends THREE.Object3D {\n\tprivate sprite: THREE.Sprite;\n\t/** Base object for positioning the emitter. */\n\tpublic base: THREE.Object3D;\n\tprivate debugMesh: THREE.Mesh;\n\tprivate material: THREE.NodeMaterial;\n\tprivate config: ResolvedConfig;\n\n\tprivate uniforms: Record<string, unknown>;\n\tprivate buffers: Record<string, Float32Array>;\n\tprivate attributes: Record<string, unknown>;\n\n\tprivate easingIndex = 0;\n\tprivate alphaMapCount = 0;\n\tprivate emitted = 0;\n\tprivate cursor = 0;\n\t/** Whether the particle system is currently running. */\n\tpublic running = false;\n\n\tconstructor(config: ParticlesConfig, _geometry?: THREE.BufferGeometry) {\n\t\tsuper();\n\n\t\tthis.name = 'Particles';\n\t\tthis.type = 'Particles';\n\t\tthis.frustumCulled = false;\n\n\t\tthis.base = new THREE.Object3D();\n\t\tthis.base.name = 'Base';\n\t\tthis.add(this.base);\n\n\t\t// Debug Mesh\n\t\tthis.debugMesh = new THREE.Mesh(\n\t\t\tnew THREE.BoxGeometry(0.2, 0.2, 0.2),\n\t\t\tnew THREE.MeshBasicMaterial({ color: 0xffffff, wireframe: true }),\n\t\t);\n\t\tthis.debugMesh.name = 'Debug';\n\t\tthis.base.add(this.debugMesh);\n\n\t\tconst p = config.particles;\n\t\tconst r = config.render ?? {};\n\t\tconst e = config.emitter ?? {};\n\n\t\tthis.config = {\n\t\t\tparticles: {\n\t\t\t\tcount: p.count ?? 1000,\n\t\t\t\tintensity: p.intensity ?? 1,\n\t\t\t\tfadeSize: p.fadeSize ?? [0.1, 0.9],\n\t\t\t\tfadeAlpha: p.fadeAlpha ?? [0.0, 1.0],\n\t\t\t\tfadeAlphaMap: p.fadeAlphaMap ?? [0.0, 1.0],\n\t\t\t\tgravity: p.gravity ?? [0, 0, 0],\n\t\t\t\talphaMapsStart: p.alphaMapsStart ?? [],\n\t\t\t\talphaMapsEnd: p.alphaMapsEnd ?? [],\n\t\t\t\tcolors: p.colors ?? [[{ color: '#ffffff', stop: 0 }]],\n\t\t\t\tappearance: p.appearance ?? 0,\n\t\t\t\teaseFunction: p.easeFunction ?? 'easeLinear',\n\t\t\t},\n\t\t\trender: {\n\t\t\t\talphaMapSize: r.alphaMapSize ?? 256,\n\t\t\t\talphaMapFilter: r.alphaMapFilter ?? THREE.LinearFilter,\n\t\t\t\tfrustumCulled: r.frustumCulled ?? false,\n\t\t\t\tblendingMode: r.blendingMode ?? THREE.AdditiveBlending,\n\t\t\t\tside: r.side ?? THREE.FrontSide,\n\t\t\t\tdepthTest: r.depthTest ?? true,\n\t\t\t},\n\t\t\temitter: {\n\t\t\t\tduration: e.duration ?? 1,\n\t\t\t\trate: e.rate ?? 1000,\n\t\t\t\tspawnMode: e.spawnMode ?? 'time',\n\t\t\t\tstatic: e.static ?? 0.0,\n\t\t\t\tworldUpRight: e.worldUpRight ?? false,\n\t\t\t\tloop: e.loop ?? false,\n\t\t\t\tdelay: e.delay ?? 0,\n\t\t\t\tdebug: e.debug ?? false,\n\t\t\t\tlifetime: e.lifetime ?? [0.1, 1],\n\t\t\t\tspeed: e.speed ?? [5, 20],\n\t\t\t\tsize: e.size ?? [0.1, 1],\n\t\t\t\tstartPositionMin: e.startPositionMin ?? [0, 0, 0],\n\t\t\t\tstartPositionMax: e.startPositionMax ?? [0, 0, 0],\n\t\t\t\tstartRotationMin: e.startRotationMin ?? [0, 0, 0],\n\t\t\t\tstartRotationMax: e.startRotationMax ?? [0, 0, 0],\n\t\t\t\trotationSpeedMin: e.rotationSpeedMin ?? [0, 0, 0],\n\t\t\t\trotationSpeedMax: e.rotationSpeedMax ?? [0, 0, 0],\n\t\t\t\tdirectionMin: e.directionMin ?? [0, 0, 0],\n\t\t\t\tdirectionMax: e.directionMax ?? [0, 0, 0],\n\t\t\t},\n\t\t};\n\n\t\tthis.debugMesh.visible = this.config.emitter.debug;\n\t\tthis.easingIndex = EASE_FUNCTIONS.indexOf(this.config.particles.easeFunction);\n\t\tif (this.easingIndex < 0) this.easingIndex = 0;\n\n\t\tconst alphaMaps = [\n\t\t\t...(this.config.particles.alphaMapsStart ?? []),\n\t\t\t...(this.config.particles.alphaMapsEnd ?? []),\n\t\t];\n\t\tthis.alphaMapCount = alphaMaps.length;\n\n\t\tlet atlas: THREE.Texture | null = null;\n\t\tif (alphaMaps.length > 0) {\n\t\t\tatlas = createTextureAtlas(\n\t\t\t\talphaMaps,\n\t\t\t\tundefined,\n\t\t\t\tthis.config.render.alphaMapSize,\n\t\t\t\tthis.config.render.alphaMapFilter,\n\t\t\t);\n\t\t} else {\n\t\t\tatlas = createWhiteCanvasTexture();\n\t\t}\n\n\t\tconst colorGradientTexture = createColorGradientTexture(this.config.particles.colors, 128);\n\n\t\tthis.uniforms = {\n\t\t\tcursor: uniform(0),\n\t\t\trate: uniform(0),\n\t\t\tuTime: uniform(0),\n\t\t\tuPosition: uniform(this.base.position),\n\t\t\talphaMap: texture(atlas),\n\t\t\tuColorGradient: texture(colorGradientTexture),\n\t\t};\n\n\t\tconst count = this.config.particles.count;\n\n\t\tthis.buffers = {\n\t\t\tinstanceLifetime: new Float32Array(count * 2),\n\t\t\tinstance: new Float32Array(count * 7),\n\t\t\tinstanceDirection: new Float32Array(count * 3),\n\t\t\tinstanceRotationSpeed: new Float32Array(count * 3),\n\t\t\tinstanceAlphaMapUVOffset: new Float32Array(count * 2),\n\t\t\tinstanceSpeed: new Float32Array(count),\n\t\t};\n\n\t\tthis.attributes = {\n\t\t\tinstanceLifetime: instancedArray(this.buffers.instanceLifetime, 'float'),\n\t\t\tinstance: instancedArray(this.buffers.instance, 'float'),\n\t\t\tinstanceDirection: instancedArray(this.buffers.instanceDirection, 'float'),\n\t\t\tinstanceRotationSpeed: instancedArray(this.buffers.instanceRotationSpeed, 'float'),\n\t\t\tinstanceAlphaMapUVOffset: instancedArray(this.buffers.instanceAlphaMapUVOffset, 'float'),\n\t\t\tinstanceSpeed: instancedArray(this.buffers.instanceSpeed, 'float'),\n\t\t};\n\n\t\tthis.material = this.createMaterial();\n\n\t\tthis.sprite = new THREE.Sprite(this.material);\n\t\tthis.sprite.count = count;\n\t\tthis.sprite.renderOrder = 10;\n\n\t\tthis.add(this.sprite);\n\t\tthis.sprite.frustumCulled = this.config.render.frustumCulled ?? false;\n\t}\n\n\tprivate createMaterial(): THREE.NodeMaterial {\n\t\tconst _mat = createParticleMaterialTemplate({\n\t\t\tattributes: this.attributes,\n\t\t\tuniforms: this.uniforms,\n\t\t\tconfig: this.config,\n\t\t\talphaMapCount: this.alphaMapCount,\n\t\t\teasingIndex: this.easingIndex,\n\t\t});\n\t\t_mat.blending = this.config.render.blendingMode;\n\t\t_mat.premultipliedAlpha =\n\t\t\tthis.config.render.blendingMode === THREE.SubtractiveBlending ||\n\t\t\tthis.config.render.blendingMode === THREE.MultiplyBlending;\n\t\t_mat.depthWrite = false;\n\t\t_mat.side = this.config.render.side;\n\t\t_mat.depthTest = this.config.render.depthTest;\n\t\t_mat.transparent = true;\n\t\treturn _mat;\n\t}\n\n\t/** Starts the particle system from the beginning. */\n\tpublic start(): void {\n\t\tthis.running = true;\n\t\tthis.uniforms.uTime.value = 0;\n\t\tthis.cursor = 0;\n\t\tthis.emitted = 0;\n\t\tthis.visible = true;\n\t\tthis.sprite.visible = true;\n\t\tthis.resetDeadSlots();\n\t\tthis.markAllStorageDirty();\n\t\tthis._update();\n\t}\n\n\tprivate resetDeadSlots(): void {\n\t\tconst count = this.config.particles.count;\n\t\tconst lifetime = this.buffers.instanceLifetime;\n\t\tconst speed = this.buffers.instanceSpeed;\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst i2 = i * 2;\n\t\t\tlifetime[i2] = 0;\n\t\t\tlifetime[i2 + 1] = 0.0001;\n\t\t\tspeed[i] = -1;\n\t\t}\n\t}\n\n\t/** Restarts (alias for start). */\n\tpublic restart(): void {\n\t\tthis.start();\n\t}\n\n\t/** Pauses the particle system, keeping current state. */\n\tpublic pause(): void {\n\t\tthis.running = false;\n\t}\n\n\t/** Resumes a paused system without resetting its state. */\n\tpublic resume(): void {\n\t\tthis.running = true;\n\t\tthis.visible = true;\n\t\tthis.sprite.visible = true;\n\t}\n\n\t/** Stops the particle system and hides it. */\n\tpublic stop(): void {\n\t\tthis.running = false;\n\t\tthis.visible = false;\n\t\tthis.sprite.visible = false;\n\t}\n\n\t/** Whether emission loops continuously. */\n\tpublic get looping(): boolean {\n\t\treturn this.config.emitter.loop;\n\t}\n\n\t/**\n\t * For non-looping systems, whether all emitted particles have aged past\n\t * their maximum lifetime (so the effect is visually finished).\n\t */\n\tpublic isComplete(): boolean {\n\t\tif (this.config.emitter.loop) return false;\n\t\tconst e = this.config.emitter;\n\t\tconst maxLifetime = e.lifetime[1];\n\t\tconst endTime = e.delay + e.duration + maxLifetime;\n\t\treturn this.emitted >= e.rate && this.uniforms.uTime.value > endTime;\n\t}\n\n\t/** Updates the particle system. Call each frame. */\n\tpublic update(delta: number): void {\n\t\tthis.sprite.visible = this.visible;\n\t\tif (!this.running) return;\n\t\tthis._update();\n\t\tthis.uniforms.uTime.value += delta;\n\t}\n\n\tprivate markAllStorageDirty(): void {\n\t\tfor (const attr of Object.values(this.attributes)) {\n\t\t\tmarkStorageDirty(attr as { value?: { needsUpdate: boolean } });\n\t\t}\n\t}\n\n\tprivate _compute(i: number): void {\n\t\tconst { emitter } = this.config;\n\t\tconst pos = this.uniforms.uPosition.value;\n\t\tconst dynamicFactor = 1 - emitter.static;\n\n\t\tconst inst = this.buffers.instance;\n\t\tconst i7 = i * 7;\n\t\tinst[i7 + 0] =\n\t\t\trandFloat(emitter.startPositionMin[0], emitter.startPositionMax[0]) + pos.x * dynamicFactor;\n\t\tinst[i7 + 1] =\n\t\t\trandFloat(emitter.startPositionMin[1], emitter.startPositionMax[1]) + pos.y * dynamicFactor;\n\t\tinst[i7 + 2] =\n\t\t\trandFloat(emitter.startPositionMin[2], emitter.startPositionMax[2]) + pos.z * dynamicFactor;\n\t\tinst[i7 + 3] = randFloat(emitter.startRotationMin[0], emitter.startRotationMax[0]);\n\t\tinst[i7 + 4] = randFloat(emitter.startRotationMin[1], emitter.startRotationMax[1]);\n\t\tinst[i7 + 5] = randFloat(emitter.startRotationMin[2], emitter.startRotationMax[2]);\n\t\tinst[i7 + 6] = randFloat(emitter.size[0], emitter.size[1]);\n\n\t\tconst i3 = i * 3;\n\t\tconst dir = this.buffers.instanceDirection;\n\t\tdir[i3 + 0] = randFloat(emitter.directionMin[0], emitter.directionMax[0]);\n\t\tdir[i3 + 1] = randFloat(emitter.directionMin[1], emitter.directionMax[1]);\n\t\tdir[i3 + 2] = randFloat(emitter.directionMin[2], emitter.directionMax[2]);\n\n\t\tconst rotSpeed = this.buffers.instanceRotationSpeed;\n\t\trotSpeed[i3 + 0] = randFloat(emitter.rotationSpeedMin[0], emitter.rotationSpeedMax[0]);\n\t\trotSpeed[i3 + 1] = randFloat(emitter.rotationSpeedMin[1], emitter.rotationSpeedMax[1]);\n\t\trotSpeed[i3 + 2] = randFloat(emitter.rotationSpeedMin[2], emitter.rotationSpeedMax[2]);\n\n\t\tconst i2 = i * 2;\n\t\tconst lifetime = this.buffers.instanceLifetime;\n\t\tlifetime[i2 + 0] = this.uniforms.uTime.value;\n\t\tlifetime[i2 + 1] = randFloat(emitter.lifetime[0], emitter.lifetime[1]);\n\n\t\tconst startCount = this.config.particles.alphaMapsStart?.length ?? 0;\n\t\tconst endCount = this.config.particles.alphaMapsEnd?.length ?? 0;\n\t\tconst startIdx = startCount > 0 ? randInt(0, startCount - 1) : 0;\n\t\tlet endIdx = 0;\n\t\tif (endCount > 0) {\n\t\t\tendIdx = startCount + randInt(0, endCount - 1);\n\t\t} else if (startCount > 0) {\n\t\t\tendIdx = randInt(0, startCount - 1);\n\t\t}\n\t\tconst alphaOffset = this.buffers.instanceAlphaMapUVOffset;\n\t\talphaOffset[i2 + 0] = startIdx;\n\t\talphaOffset[i2 + 1] = endIdx;\n\n\t\tthis.buffers.instanceSpeed[i] = randFloat(emitter.speed[0], emitter.speed[1]);\n\t}\n\n\tprivate _update(): void {\n\t\tconst loop = this.config.emitter.loop;\n\t\tconst spawnMode = this.config.emitter.spawnMode;\n\t\tconst maxParticlesTotal = this.config.particles.count;\n\t\tconst maxParticles = this.config.emitter.rate;\n\t\tconst duration = this.config.emitter.duration;\n\t\tconst delay = this.config.emitter.delay;\n\n\t\tconst amount =\n\t\t\tspawnMode === 'burst'\n\t\t\t\t? maxParticles\n\t\t\t\t: Math.max(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tMath.floor(((this.uniforms.uTime.value - delay) / duration) * maxParticles),\n\t\t\t\t\t);\n\n\t\tconst rate = amount - this.emitted;\n\n\t\tif (this.emitted >= maxParticles && !loop) return;\n\n\t\tif (spawnMode === 'time') {\n\t\t\tif (this.cursor >= maxParticlesTotal) this.cursor = 0;\n\t\t\tthis.uniforms.cursor.value = this.cursor;\n\t\t\tthis.uniforms.rate.value = rate;\n\t\t}\n\n\t\tfor (let _i = this.cursor; _i < this.cursor + rate; _i++) {\n\t\t\tthis._compute(_i % maxParticlesTotal);\n\t\t}\n\n\t\tthis.markAllStorageDirty();\n\n\t\tif (spawnMode === 'time') {\n\t\t\tthis.cursor += rate;\n\t\t\tthis.cursor = this.cursor % maxParticlesTotal;\n\t\t}\n\n\t\tthis.emitted += rate;\n\t}\n\n\t/** Updates configuration at runtime (shallow per-section merge). */\n\tpublic updateConfig(config: Partial<ParticlesConfig>): void {\n\t\tif (config.particles) Object.assign(this.config.particles, config.particles);\n\t\tif (config.render) Object.assign(this.config.render, config.render);\n\t\tif (config.emitter) Object.assign(this.config.emitter, config.emitter);\n\t}\n\n\t/** Disposes of all resources used by the particle system. */\n\tpublic dispose(): void {\n\t\tthis.stop();\n\t\tthis.material.dispose();\n\t}\n}\n","import type * as THREE from 'three/webgpu';\n\n/**\n * GPU particle engine configuration types.\n *\n * Ported/adapted from the `threeparticles` project (MIT) — a WebGPU/TSL\n * particle system — to replace the previous three.quarks backend. Editor-only\n * export types from the original are omitted.\n */\n\n/** Color stop definition for gradient textures. */\nexport interface ColorStop {\n\t/** CSS color string (hex, rgb, named color, etc.) */\n\tcolor: string;\n\t/** Position in gradient from 0 to 1 */\n\tstop: number;\n}\n\n/** Available easing function identifiers. */\nexport type EaseFunction =\n\t| 'easeLinear'\n\t| 'easeInPower1'\n\t| 'easeOutPower1'\n\t| 'easeInOutPower1'\n\t| 'easeInPower2'\n\t| 'easeOutPower2'\n\t| 'easeInOutPower2'\n\t| 'easeInPower3'\n\t| 'easeOutPower3'\n\t| 'easeInOutPower3'\n\t| 'easeInPower4'\n\t| 'easeOutPower4'\n\t| 'easeInOutPower4'\n\t| 'easeInQuad'\n\t| 'easeOutQuad'\n\t| 'easeInOutQuad'\n\t| 'easeInCubic'\n\t| 'easeOutCubic'\n\t| 'easeInOutCubic'\n\t| 'easeInQuart'\n\t| 'easeOutQuart'\n\t| 'easeInOutQuart'\n\t| 'easeInQuint'\n\t| 'easeOutQuint'\n\t| 'easeInOutQuint'\n\t| 'easeInSine'\n\t| 'easeOutSine'\n\t| 'easeInOutSine'\n\t| 'easeInExpo'\n\t| 'easeOutExpo'\n\t| 'easeInOutExpo'\n\t| 'easeInCirc'\n\t| 'easeOutCirc'\n\t| 'easeInOutCirc'\n\t| 'easeInElastic'\n\t| 'easeOutElastic'\n\t| 'easeInOutElastic'\n\t| 'easeInBack'\n\t| 'easeOutBack'\n\t| 'easeInOutBack';\n\n/** All easing function names, ordered by shader ID. */\nexport const EASE_FUNCTIONS: EaseFunction[] = [\n\t'easeLinear',\n\t'easeInPower1',\n\t'easeOutPower1',\n\t'easeInOutPower1',\n\t'easeInPower2',\n\t'easeOutPower2',\n\t'easeInOutPower2',\n\t'easeInPower3',\n\t'easeOutPower3',\n\t'easeInOutPower3',\n\t'easeInPower4',\n\t'easeOutPower4',\n\t'easeInOutPower4',\n\t'easeInQuad',\n\t'easeOutQuad',\n\t'easeInOutQuad',\n\t'easeInCubic',\n\t'easeOutCubic',\n\t'easeInOutCubic',\n\t'easeInQuart',\n\t'easeOutQuart',\n\t'easeInOutQuart',\n\t'easeInQuint',\n\t'easeOutQuint',\n\t'easeInOutQuint',\n\t'easeInSine',\n\t'easeOutSine',\n\t'easeInOutSine',\n\t'easeInExpo',\n\t'easeOutExpo',\n\t'easeInOutExpo',\n\t'easeInCirc',\n\t'easeOutCirc',\n\t'easeInOutCirc',\n\t'easeInElastic',\n\t'easeOutElastic',\n\t'easeInOutElastic',\n\t'easeInBack',\n\t'easeOutBack',\n\t'easeInOutBack',\n];\n\n/** Particle shape rendering modes. */\nexport enum AppearanceMode {\n\t/** Square/quad particles */\n\tSquare = 0,\n\t/** Circular particles with soft edges */\n\tCircular = 1,\n}\n\n/** Configuration for particle visual appearance and behavior. */\nexport interface ParticleSettings {\n\t/** Maximum number of particles in the system */\n\tcount: number;\n\t/** Color intensity multiplier (1.0 = normal) */\n\tintensity: number;\n\t/** Size fade range [start, end] as progress values (0-1) */\n\tfadeSize: [min: number, max: number];\n\t/** Alpha fade range [start, end] as progress values (0-1) */\n\tfadeAlpha: [min: number, max: number];\n\t/** Alpha map morph range [start, end] as progress values (0-1) */\n\tfadeAlphaMap: [min: number, max: number];\n\t/** World-space gravity force [x, y, z] */\n\tgravity: [x: number, y: number, z: number];\n\t/** Alpha map textures for particle start state */\n\talphaMapsStart?: THREE.Texture[];\n\t/** Alpha map textures for particle end state */\n\talphaMapsEnd?: THREE.Texture[];\n\t/** Color gradient definitions per row */\n\tcolors: ColorStop[][];\n\t/** Particle shape mode */\n\tappearance: AppearanceMode;\n\t/** Easing function for particle animation */\n\teaseFunction: EaseFunction;\n}\n\n/** Configuration for WebGPU rendering settings. */\nexport interface RenderSettings {\n\t/** Size of each alpha map slot in the texture atlas (pixels) */\n\talphaMapSize: number;\n\t/** Texture filtering mode for alpha maps */\n\talphaMapFilter: THREE.MagnificationTextureFilter;\n\t/** Enable frustum culling for the particle mesh */\n\tfrustumCulled: boolean;\n\t/** Blending mode for particle rendering */\n\tblendingMode: THREE.Blending;\n\t/** Which side of faces to render */\n\tside: THREE.Side;\n\t/** Enable depth testing */\n\tdepthTest: boolean;\n}\n\n/** Configuration for particle emission behavior. */\nexport interface EmitterSettings {\n\t/** Total duration of emission in seconds */\n\tduration: number;\n\t/** Number of particles to emit per cycle */\n\trate: number;\n\t/** Emission timing mode: \"time\" spreads over duration, \"burst\" emits all at once */\n\tspawnMode: 'time' | 'burst';\n\t/** Static position blend (0 = dynamic, 1 = static at spawn position) */\n\tstatic: number;\n\t/** Apply world up-right correction during animation */\n\tworldUpRight: boolean;\n\t/** Loop the emission continuously */\n\tloop: boolean;\n\t/** Delay before first emission in seconds */\n\tdelay: number;\n\t/** Show debug wireframe mesh at emitter position */\n\tdebug: boolean;\n\t/** Particle lifetime range [min, max] in seconds */\n\tlifetime: [min: number, max: number];\n\t/** Speed range [min, max] in units per second */\n\tspeed: [min: number, max: number];\n\t/** Size range [min, max] */\n\tsize: [min: number, max: number];\n\t/** Minimum spawn position offset [x, y, z] */\n\tstartPositionMin: [x: number, y: number, z: number];\n\t/** Maximum spawn position offset [x, y, z] */\n\tstartPositionMax: [x: number, y: number, z: number];\n\t/** Minimum initial rotation [x, y, z] normalized -1 to 1 */\n\tstartRotationMin: [x: number, y: number, z: number];\n\t/** Maximum initial rotation [x, y, z] normalized -1 to 1 */\n\tstartRotationMax: [x: number, y: number, z: number];\n\t/** Minimum rotation speed [x, y, z] in radians per second */\n\trotationSpeedMin: [x: number, y: number, z: number];\n\t/** Maximum rotation speed [x, y, z] in radians per second */\n\trotationSpeedMax: [x: number, y: number, z: number];\n\t/** Minimum emission direction [x, y, z] */\n\tdirectionMin: [x: number, y: number, z: number];\n\t/** Maximum emission direction [x, y, z] */\n\tdirectionMax: [x: number, y: number, z: number];\n}\n\n/**\n * Complete particle system configuration. All sections are deep-partial at the\n * authoring boundary; the {@link Particles} constructor fills defaults.\n */\nexport interface ParticlesConfig {\n\tparticles: Partial<ParticleSettings> & Pick<ParticleSettings, 'count'>;\n\trender?: Partial<RenderSettings>;\n\temitter?: Partial<EmitterSettings>;\n}\n","import * as THREE from 'three/webgpu';\nimport type { ColorStop } from './types';\n\n/**\n * Texture helpers for the GPU particle engine. Ported from `threeparticles` (MIT).\n *\n * Both helpers use a 2D canvas, so they run only in a DOM/browser environment\n * (which is where WebGPU rendering happens anyway).\n */\n\n/**\n * Combines multiple textures into a horizontal atlas strip.\n *\n * @returns Combined canvas texture, or null if no textures provided.\n */\nexport function createTextureAtlas(\n\ttextures: THREE.Texture[],\n\tonLoad?: () => void,\n\tsize = 512,\n\tfilter?: THREE.MagnificationTextureFilter,\n): THREE.CanvasTexture | null {\n\tif (!textures || textures.length === 0) return null;\n\n\tconst canvas = document.createElement('canvas');\n\tconst ctx = canvas.getContext('2d')!;\n\n\tconst count = textures.length;\n\tcanvas.width = size * count;\n\tcanvas.height = size;\n\n\tlet loadedCount = 0;\n\tlet imagesLoaded = 0;\n\n\ttextures.forEach((texture, i) => {\n\t\tconst img = texture.image as HTMLImageElement;\n\t\tif (img && img.complete && img.width > 0) {\n\t\t\tctx.drawImage(img, i * size, 0, size, size);\n\t\t\timagesLoaded++;\n\t\t} else {\n\t\t\tconst checkAndDraw = () => {\n\t\t\t\tconst ready = texture.image as HTMLImageElement;\n\t\t\t\tif (ready && ready.complete && ready.width > 0) {\n\t\t\t\t\tctx.drawImage(ready, i * size, 0, size, size);\n\t\t\t\t\tloadedCount++;\n\t\t\t\t\tif (loadedCount === count - imagesLoaded) {\n\t\t\t\t\t\tatlasTexture.needsUpdate = true;\n\t\t\t\t\t\tif (onLoad) onLoad();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(checkAndDraw, 100);\n\t\t\t\t}\n\t\t\t};\n\t\t\tcheckAndDraw();\n\t\t}\n\t});\n\n\tconst atlasTexture = new THREE.CanvasTexture(canvas);\n\tif (filter !== undefined) {\n\t\tatlasTexture.minFilter = filter;\n\t\tatlasTexture.magFilter = filter;\n\t}\n\tatlasTexture.needsUpdate = true;\n\n\treturn atlasTexture;\n}\n\n/**\n * Builds a gradient lookup texture (one row per color-stop array) sampled by\n * the particle material to color particles over their lifetime progress.\n */\nexport function createColorGradientTexture(\n\trows: ColorStop[][],\n\twidth = 512,\n): THREE.CanvasTexture {\n\tlet safeRows = rows;\n\tif (!safeRows || safeRows.length === 0) safeRows = [[{ color: 'white', stop: 0 }]];\n\n\tconst normalized = safeRows.map((row) => {\n\t\tconst sorted = [...row].sort((a, b) => a.stop - b.stop);\n\t\tif (sorted[0]!.stop > 0) sorted.unshift({ color: sorted[0]!.color, stop: 0 });\n\t\tif (sorted[sorted.length - 1]!.stop < 1)\n\t\t\tsorted.push({ color: sorted[sorted.length - 1]!.color, stop: 1 });\n\t\treturn sorted;\n\t});\n\n\tconst canvas = document.createElement('canvas');\n\tconst ctx = canvas.getContext('2d')!;\n\tcanvas.width = width;\n\tcanvas.height = normalized.length;\n\n\tfor (let y = 0; y < normalized.length; y++) {\n\t\tconst stops = normalized[y]!;\n\t\tconst g = ctx.createLinearGradient(0, 0, width, 0);\n\t\tfor (const s of stops) g.addColorStop(THREE.MathUtils.clamp(s.stop, 0, 1), s.color);\n\t\tctx.fillStyle = g;\n\t\tctx.fillRect(0, y, width, 1);\n\t}\n\n\tconst tex = new THREE.CanvasTexture(canvas);\n\ttex.minFilter = THREE.LinearFilter;\n\ttex.magFilter = THREE.LinearFilter;\n\ttex.wrapS = THREE.ClampToEdgeWrapping;\n\ttex.wrapT = THREE.ClampToEdgeWrapping;\n\ttex.needsUpdate = true;\n\n\treturn tex;\n}\n","/**\n * TSL shader nodes for WebGPU based particle computation.\n * Handle position, rotation, scale, and color on the GPU from instanced attributes.\n *\n * Ported from the `threeparticles` project (MIT).\n * @module\n */\n// @ts-nocheck - TSL types are incompatible with TypeScript\nimport * as THREE from 'three/webgpu';\nimport {\n\tnormalize,\n\tmax,\n\tmin,\n\tvaryingProperty,\n\tIf,\n\tdistance,\n\tDiscard,\n\tselect,\n\tlength,\n\trange,\n\tinstanceIndex,\n\tvec3,\n\tfloat,\n\tint,\n\tmix,\n\ttexture,\n\tvec4,\n\tFn,\n\tvec2,\n\tsmoothstep,\n\tuv,\n\tuint,\n\tmodelWorldMatrix,\n\ttranspose,\n\tmat3,\n\tbool,\n} from 'three/tsl';\nimport { applyEasing } from './easing';\n\nconst idx7 = instanceIndex.mul(7);\nconst idx3 = instanceIndex.mul(3);\nconst idx2 = instanceIndex.mul(2);\n\nexport interface ParticleMaterialContext {\n\tattributes: Record<string, unknown>;\n\tuniforms: Record<string, unknown>;\n\tconfig: {\n\t\tparticles: {\n\t\t\tcolors: unknown[];\n\t\t\tintensity: number;\n\t\t\tfadeSize: [number, number];\n\t\t\tfadeAlpha: [number, number];\n\t\t\tfadeAlphaMap: [number, number];\n\t\t\tgravity: [number, number, number];\n\t\t};\n\t\temitter: {\n\t\t\tstatic: number;\n\t\t\tworldUpRight: boolean;\n\t\t};\n\t};\n\talphaMapCount: number;\n\teasingIndex: number;\n}\n\n/** TSL node for computing particle position based on time, velocity, and gravity. */\nconst positionNode = /*@__PURE__*/ Fn(\n\t([pos, age, duration, vProgress, uGravity, dir, speed, worldUpRight, easingIndex]) => {\n\t\tconst progress = age.div(duration);\n\t\tconst _pos = vec3(pos);\n\n\t\tIf(progress.lessThan(0.0).or(progress.greaterThan(1.0)), () => {\n\t\t\tvProgress.assign(1.0);\n\t\t\t_pos.assign(vec3(0, 9999, 0));\n\t\t}).Else(() => {\n\t\t\tvProgress.assign(applyEasing(progress, easingIndex));\n\t\t\tconst normalizedDirection = select(length(dir).greaterThan(0), normalize(dir), vec3(0));\n\t\t\tconst gravityForce = uGravity.mul(0.5).mul(age.mul(age));\n\t\t\tconst easedAge = vProgress.mul(duration);\n\t\t\tconst offset = normalizedDirection.mul(easedAge).mul(speed).add(gravityForce);\n\n\t\t\tIf(worldUpRight, () => {\n\t\t\t\tconst m = mat3(modelWorldMatrix);\n\t\t\t\tconst rot = mat3(normalize(m[0]), normalize(m[1]), normalize(m[2]));\n\t\t\t\tconst inverseRotation = transpose(rot);\n\t\t\t\tconst worldOffset = inverseRotation.mul(offset);\n\t\t\t\tconst blendedOffset = mix(offset, worldOffset, vProgress);\n\t\t\t\t_pos.addAssign(blendedOffset);\n\t\t\t}).Else(() => {\n\t\t\t\t_pos.addAssign(offset);\n\t\t\t});\n\t\t});\n\n\t\treturn _pos;\n\t},\n);\n\n/** TSL node for computing particle rotation over time. */\nconst rotationNode = /*@__PURE__*/ Fn(([rot, rotSpeed, age]) => {\n\tconst tau = float(Math.PI * 2.0).toConst();\n\tconst init = rot.z.add(1.0).mul(0.5).mul(tau);\n\tconst angle = init.add(rotSpeed.z.mul(age));\n\tconst wrapped = angle.mod(tau);\n\treturn wrapped.add(tau).mod(tau);\n});\n\n/** TSL node for computing particle scale with fade. */\nconst scaleNode = /*@__PURE__*/ Fn(([fadeSize, scale, vProgress]) => {\n\tconst uFadeSize = vec2(fadeSize[0], fadeSize[1]).toVar();\n\tconst fadeInEnd = min(max(uFadeSize.x, 0.0001), 0.9999);\n\tconst fadeOutStart = min(max(uFadeSize.y, 0.0001), 0.9999);\n\tconst fadeIn = smoothstep(0.0, fadeInEnd, vProgress);\n\tconst fadeOut = float(1.0).sub(smoothstep(fadeOutStart, 1.0, vProgress));\n\treturn fadeIn.mul(fadeOut).mul(scale);\n});\n\n/** TSL node for computing particle color with gradient lookup and alpha mapping. */\nconst colorNode = /*@__PURE__*/ Fn(\n\t([\n\t\tcolors,\n\t\tintensity,\n\t\tfadeAlpha,\n\t\tfadeAlphaMap,\n\t\tvProgress,\n\t\tuColorGradient,\n\t\tuAlphaMapCount,\n\t\tvAlphaMapUVOffsetX,\n\t\tvAlphaMapUVOffsetY,\n\t\talphaMap,\n\t]) => {\n\t\tconst vColorGradientRow = range(0, colors.length - 1).toVar();\n\t\tconst uColorGradientRows = float(colors.length).toVar();\n\t\tconst uIntensity = float(intensity).toVar();\n\t\tconst uFadeAlpha = vec2(fadeAlpha[0], fadeAlpha[1]).toVar();\n\t\tconst uFadeAlphaMap = vec2(fadeAlphaMap[0], fadeAlphaMap[1]).toVar();\n\n\t\tconst u = vProgress;\n\t\tconst v = vColorGradientRow.add(0.5).div(max(uColorGradientRows, 1.0));\n\t\tconst finalColor = uColorGradient.sample(vec2(u, v)).rgb;\n\t\tfinalColor.mulAssign(uIntensity);\n\n\t\tconst fadeInEnd = min(max(uFadeAlpha.x, 0.0001), 0.9999);\n\t\tconst fadeOutStart = min(max(uFadeAlpha.y, 0.0001), 0.9999);\n\t\tconst fadeIn = smoothstep(0.0, fadeInEnd, vProgress);\n\t\tconst fadeOut = float(1.0).sub(smoothstep(fadeOutStart, 1.0, vProgress));\n\t\tconst alpha = fadeIn.mul(fadeOut);\n\n\t\tconst vUv = uv();\n\n\t\tIf(uAlphaMapCount.equal(0), () => {\n\t\t\tconst center = vec2(0.5).toVar();\n\t\t\tconst dist = distance(vUv, center);\n\t\t\tconst radius = float(0.5);\n\t\t\tconst feather = float(0.98);\n\t\t\tconst _alpha = float(1.0).sub(smoothstep(radius.sub(feather), radius, dist));\n\t\t\talpha.assign(_alpha.mul(alpha));\n\t\t\tIf(_alpha.lessThan(0.01), () => Discard());\n\t\t}).ElseIf(uAlphaMapCount.greaterThan(0), () => {\n\t\t\tconst startU = vAlphaMapUVOffsetX.add(vUv.x).div(uAlphaMapCount);\n\t\t\tconst startUV = vec2(startU, vUv.y);\n\t\t\tconst startAlpha = alphaMap.sample(startUV).a;\n\n\t\t\tIf(uAlphaMapCount.greaterThan(1), () => {\n\t\t\t\tconst endU = vAlphaMapUVOffsetY.add(vUv.x).div(uAlphaMapCount);\n\t\t\t\tconst endUV = vec2(endU, vUv.y);\n\t\t\t\tconst endAlpha = alphaMap.sample(endUV).a;\n\t\t\t\tconst morphProgress = smoothstep(uFadeAlphaMap.x, uFadeAlphaMap.y, vProgress);\n\t\t\t\tconst morphedAlpha = mix(startAlpha, endAlpha, morphProgress);\n\t\t\t\talpha.assign(morphedAlpha.mul(alpha));\n\t\t\t}).Else(() => {\n\t\t\t\talpha.assign(startAlpha.mul(alpha));\n\t\t\t});\n\t\t});\n\n\t\treturn vec4(finalColor, alpha);\n\t},\n);\n\nfunction createInstancePositionNode(\n\tctx: ParticleMaterialContext,\n\tvProgress: ReturnType<typeof varyingProperty>,\n) {\n\treturn new (class extends THREE.Node {\n\t\tconstructor() {\n\t\t\tsuper('vec3');\n\t\t\tthis.updateType = THREE.NodeUpdateType.NONE;\n\t\t}\n\n\t\tsetup() {\n\t\t\tconst { attributes, uniforms, config, easingIndex } = ctx;\n\t\t\tconst uPosition = uniforms.uPosition;\n\t\t\tconst _static = float(config.emitter.static).toVar();\n\t\t\tconst pos = vec3(\n\t\t\t\tattributes.instance.element(idx7.add(0)),\n\t\t\t\tattributes.instance.element(idx7.add(1)),\n\t\t\t\tattributes.instance.element(idx7.add(2)),\n\t\t\t).add(uPosition.mul(_static));\n\n\t\t\tconst dir = vec3(\n\t\t\t\tattributes.instanceDirection.element(idx3.add(0)),\n\t\t\t\tattributes.instanceDirection.element(idx3.add(1)),\n\t\t\t\tattributes.instanceDirection.element(idx3.add(2)),\n\t\t\t);\n\t\t\tconst time = uniforms.uTime;\n\t\t\tconst uGravity = vec3(...config.particles.gravity);\n\t\t\tconst worldUpRight = bool(config.emitter.worldUpRight);\n\n\t\t\tconst startTime = attributes.instanceLifetime.element(idx2.add(0));\n\t\t\tconst duration = attributes.instanceLifetime.element(idx2.add(1));\n\t\t\tconst speed = attributes.instanceSpeed.element(instanceIndex).toVar();\n\t\t\tconst age = select(\n\t\t\t\tspeed.lessThan(0.0),\n\t\t\t\tduration.sub(time.sub(startTime)),\n\t\t\t\ttime.sub(startTime),\n\t\t\t);\n\n\t\t\treturn positionNode(\n\t\t\t\tpos,\n\t\t\t\tage,\n\t\t\t\tduration,\n\t\t\t\tvProgress,\n\t\t\t\tuGravity,\n\t\t\t\tdir,\n\t\t\t\tspeed,\n\t\t\t\tworldUpRight,\n\t\t\t\tint(easingIndex),\n\t\t\t);\n\t\t}\n\t})();\n}\n\nfunction createInstanceRotationNode(ctx: ParticleMaterialContext) {\n\treturn new (class extends THREE.Node {\n\t\tconstructor() {\n\t\t\tsuper('float');\n\t\t\tthis.updateType = THREE.NodeUpdateType.NONE;\n\t\t}\n\n\t\tsetup() {\n\t\t\tconst { attributes, uniforms } = ctx;\n\n\t\t\tconst rot = vec3(\n\t\t\t\tattributes.instance.element(idx7.add(3)),\n\t\t\t\tattributes.instance.element(idx7.add(4)),\n\t\t\t\tattributes.instance.element(idx7.add(5)),\n\t\t\t);\n\t\t\tconst rotSpeed = vec3(\n\t\t\t\tattributes.instanceRotationSpeed.element(idx3.add(0)),\n\t\t\t\tattributes.instanceRotationSpeed.element(idx3.add(1)),\n\t\t\t\tattributes.instanceRotationSpeed.element(idx3.add(2)),\n\t\t\t);\n\n\t\t\tconst time = uniforms.uTime;\n\t\t\tconst startTime = attributes.instanceLifetime.element(idx2.add(0));\n\t\t\tconst duration = attributes.instanceLifetime.element(idx2.add(1));\n\t\t\tconst speed = attributes.instanceSpeed.element(instanceIndex).toVar();\n\t\t\tconst age = select(\n\t\t\t\tspeed.lessThan(0.0),\n\t\t\t\tduration.sub(time.sub(startTime)),\n\t\t\t\ttime.sub(startTime),\n\t\t\t);\n\n\t\t\treturn rotationNode(rot, rotSpeed, age);\n\t\t}\n\t})();\n}\n\nfunction createInstanceScaleNode(\n\tctx: ParticleMaterialContext,\n\tvProgress: ReturnType<typeof varyingProperty>,\n) {\n\treturn new (class extends THREE.Node {\n\t\tconstructor() {\n\t\t\tsuper('float');\n\t\t\tthis.updateType = THREE.NodeUpdateType.NONE;\n\t\t}\n\n\t\tsetup() {\n\t\t\tconst { attributes, config } = ctx;\n\t\t\tconst scale = attributes.instance.element(idx7.add(6));\n\t\t\treturn scaleNode(config.particles.fadeSize, scale, vProgress);\n\t\t}\n\t})();\n}\n\nfunction createInstanceColorNode(\n\tctx: ParticleMaterialContext,\n\tvProgress: ReturnType<typeof varyingProperty>,\n) {\n\treturn new (class extends THREE.Node {\n\t\tconstructor() {\n\t\t\tsuper('vec4');\n\t\t\tthis.updateType = THREE.NodeUpdateType.NONE;\n\t\t}\n\n\t\tsetup() {\n\t\t\tconst { attributes, uniforms, config, alphaMapCount } = ctx;\n\t\t\tconst uAlphaMapCount = uint(alphaMapCount).toVar();\n\n\t\t\treturn colorNode(\n\t\t\t\tconfig.particles.colors,\n\t\t\t\tconfig.particles.intensity,\n\t\t\t\tconfig.particles.fadeAlpha,\n\t\t\t\tconfig.particles.fadeAlphaMap,\n\t\t\t\tvProgress,\n\t\t\t\tuniforms.uColorGradient,\n\t\t\t\tuAlphaMapCount,\n\t\t\t\tattributes.instanceAlphaMapUVOffset.element(idx2.add(0)),\n\t\t\t\tattributes.instanceAlphaMapUVOffset.element(idx2.add(1)),\n\t\t\t\tuniforms.alphaMap,\n\t\t\t);\n\t\t}\n\t})();\n}\n\nlet particleMaterialCounter = 0;\n\n/**\n * Builds a fresh sprite material wired to the instance nodes. Each system gets\n * its own material with a unique progress varying and bound attribute nodes.\n */\nexport function createParticleMaterialTemplate(\n\tctx: ParticleMaterialContext,\n): THREE.SpriteNodeMaterial {\n\tconst materialId = particleMaterialCounter++;\n\tconst vProgress = varyingProperty('float', `vProgress_${materialId}`);\n\n\tconst mat = new THREE.SpriteNodeMaterial();\n\tmat.positionNode = createInstancePositionNode(ctx, vProgress);\n\tmat.rotationNode = createInstanceRotationNode(ctx);\n\tmat.scaleNode = createInstanceScaleNode(ctx, vProgress);\n\tmat.colorNode = createInstanceColorNode(ctx, vProgress);\n\treturn mat;\n}\n","/**\n * TSL easing functions for WebGPU based particle animation.\n * All functions take a progress value t (0-1) and return the eased value.\n *\n * Ported from the `threeparticles` project (MIT).\n * @module\n */\n// @ts-nocheck - TSL types are incompatible with TypeScript\nimport { PI, float, mul, sub, pow, add, cos, sin, sqrt, select, Fn, If, Switch } from 'three/tsl';\n\n// Linear\nexport const easeLinear = /*@__PURE__*/ Fn(([t]) => t, { t: 'float', return: 'float' });\n\n// Power 1\nexport const easeInPower1 = /*@__PURE__*/ Fn(([t]) => t, { t: 'float', return: 'float' });\nexport const easeOutPower1 = /*@__PURE__*/ Fn(([t]) => sub(1.0, sub(1.0, t)), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeInOutPower1 = /*@__PURE__*/ Fn(([t]) => t, { t: 'float', return: 'float' });\n\n// Power 2\nexport const easeInPower2 = /*@__PURE__*/ Fn(([t]) => t.mul(t), { t: 'float', return: 'float' });\nexport const easeOutPower2 = /*@__PURE__*/ Fn(([t]) => sub(1.0, pow(sub(1.0, t), 2.0)), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeInOutPower2 = /*@__PURE__*/ Fn(\n\t([t]) =>\n\t\tselect(\n\t\t\tt.lessThan(0.5),\n\t\t\tmul(2.0, t).mul(t),\n\t\t\tsub(1.0, pow(float(-2.0).mul(t).add(2.0), 2.0).div(2.0)),\n\t\t),\n\t{ t: 'float', return: 'float' },\n);\n\n// Power 3\nexport const easeInPower3 = /*@__PURE__*/ Fn(([t]) => t.mul(t).mul(t), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeOutPower3 = /*@__PURE__*/ Fn(([t]) => sub(1.0, pow(sub(1.0, t), 3.0)), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeInOutPower3 = /*@__PURE__*/ Fn(\n\t([t]) =>\n\t\tselect(\n\t\t\tt.lessThan(0.5),\n\t\t\tmul(4.0, t).mul(t).mul(t),\n\t\t\tsub(1.0, pow(float(-2.0).mul(t).add(2.0), 3.0).div(2.0)),\n\t\t),\n\t{ t: 'float', return: 'float' },\n);\n\n// Power 4\nexport const easeInPower4 = /*@__PURE__*/ Fn(([t]) => t.mul(t).mul(t).mul(t), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeOutPower4 = /*@__PURE__*/ Fn(([t]) => sub(1.0, pow(sub(1.0, t), 4.0)), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeInOutPower4 = /*@__PURE__*/ Fn(\n\t([t]) =>\n\t\tselect(\n\t\t\tt.lessThan(0.5),\n\t\t\tmul(8.0, t).mul(t).mul(t).mul(t),\n\t\t\tsub(1.0, pow(float(-2.0).mul(t).add(2.0), 4.0).div(2.0)),\n\t\t),\n\t{ t: 'float', return: 'float' },\n);\n\n// Quad\nexport const easeInQuad = /*@__PURE__*/ Fn(([t]) => t.mul(t), { t: 'float', return: 'float' });\nexport const easeOutQuad = /*@__PURE__*/ Fn(([t]) => t.mul(sub(2.0, t)), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeInOutQuad = /*@__PURE__*/ Fn(\n\t([t]) =>\n\t\tselect(t.lessThan(0.5), mul(2.0, t).mul(t), float(-1.0).add(sub(4.0, mul(2.0, t)).mul(t))),\n\t{ t: 'float', return: 'float' },\n);\n\n// Cubic\nexport const easeInCubic = /*@__PURE__*/ Fn(([t]) => t.mul(t).mul(t), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeOutCubic = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst t1 = t.sub(1.0);\n\t\treturn add(1.0, t1.mul(t1).mul(t1));\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeInOutCubic = /*@__PURE__*/ Fn(\n\t([t]) =>\n\t\tselect(\n\t\t\tt.lessThan(0.5),\n\t\t\tmul(4.0, t).mul(t).mul(t),\n\t\t\tt.sub(1.0).mul(mul(2.0, t).sub(2.0)).mul(mul(2.0, t).sub(2.0)).add(1.0),\n\t\t),\n\t{ t: 'float', return: 'float' },\n);\n\n// Quart\nexport const easeInQuart = /*@__PURE__*/ Fn(([t]) => t.mul(t).mul(t).mul(t), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeOutQuart = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst t1 = t.sub(1.0);\n\t\treturn sub(1.0, t1.mul(t1).mul(t1).mul(t1));\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeInOutQuart = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst t1 = t.sub(1.0);\n\t\treturn select(\n\t\t\tt.lessThan(0.5),\n\t\t\tmul(8.0, t).mul(t).mul(t).mul(t),\n\t\t\tsub(1.0, mul(8.0, t1).mul(t1).mul(t1).mul(t1)),\n\t\t);\n\t},\n\t{ t: 'float', return: 'float' },\n);\n\n// Quint\nexport const easeInQuint = /*@__PURE__*/ Fn(([t]) => t.mul(t).mul(t).mul(t).mul(t), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeOutQuint = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst t1 = t.sub(1.0);\n\t\treturn add(1.0, t1.mul(t1).mul(t1).mul(t1).mul(t1));\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeInOutQuint = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst t1 = t.sub(1.0);\n\t\treturn select(\n\t\t\tt.lessThan(0.5),\n\t\t\tmul(16.0, t).mul(t).mul(t).mul(t).mul(t),\n\t\t\tadd(1.0, mul(16.0, t1).mul(t1).mul(t1).mul(t1).mul(t1)),\n\t\t);\n\t},\n\t{ t: 'float', return: 'float' },\n);\n\n// Sine\nexport const easeInSine = /*@__PURE__*/ Fn(\n\t([t]) => float(-1.0).mul(cos(t.mul(PI).mul(0.5))).add(1.0),\n\t{ t: 'float', return: 'float' },\n);\nexport const easeOutSine = /*@__PURE__*/ Fn(([t]) => sin(t.mul(PI).mul(0.5)), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeInOutSine = /*@__PURE__*/ Fn(([t]) => float(-0.5).mul(cos(PI.mul(t)).sub(1.0)), {\n\tt: 'float',\n\treturn: 'float',\n});\n\n// Expo\nexport const easeInExpo = /*@__PURE__*/ Fn(\n\t([t]) => select(t.equal(0.0), 0.0, pow(2.0, mul(10.0, t.sub(1.0)))),\n\t{ t: 'float', return: 'float' },\n);\nexport const easeOutExpo = /*@__PURE__*/ Fn(\n\t([t]) => select(t.equal(1.0), 1.0, sub(1.0, pow(2.0, float(-10.0).mul(t)))),\n\t{ t: 'float', return: 'float' },\n);\nexport const easeInOutExpo = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tIf(t.equal(0.0).or(t.equal(1.0)), () => t);\n\t\treturn select(\n\t\t\tt.lessThan(0.5),\n\t\t\tmul(0.5, pow(2.0, mul(20.0, t).sub(10.0))),\n\t\t\tmul(0.5, pow(2.0, float(-20.0).mul(t).add(10.0)).negate().add(2.0)),\n\t\t);\n\t},\n\t{ t: 'float', return: 'float' },\n);\n\n// Circ\nexport const easeInCirc = /*@__PURE__*/ Fn(\n\t([t]) => float(-1.0).mul(sqrt(sub(1.0, t.mul(t))).sub(1.0)),\n\t{ t: 'float', return: 'float' },\n);\nexport const easeOutCirc = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst t1 = t.sub(1.0);\n\t\treturn sqrt(sub(1.0, t1.mul(t1)));\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeInOutCirc = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst t1 = mul(2.0, t);\n\t\tconst t2 = t1.sub(2.0);\n\t\treturn select(\n\t\t\tt.lessThan(0.5),\n\t\t\tfloat(-0.5).mul(sqrt(sub(1.0, t1.mul(t1))).sub(1.0)),\n\t\t\tmul(0.5, sqrt(sub(1.0, t2.mul(t2))).add(1.0)),\n\t\t);\n\t},\n\t{ t: 'float', return: 'float' },\n);\n\n// Elastic\nexport const easeInElastic = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tIf(t.equal(0.0).or(t.equal(1.0)), () => t);\n\t\treturn pow(2.0, mul(10.0, t.sub(1.0)))\n\t\t\t.negate()\n\t\t\t.mul(sin(t.sub(1.075).mul(mul(2.0, PI)).div(0.3)));\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeOutElastic = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tIf(t.equal(0.0).or(t.equal(1.0)), () => t);\n\t\treturn pow(2.0, float(-10.0).mul(t))\n\t\t\t.mul(sin(t.sub(0.075).mul(mul(2.0, PI)).div(0.3)))\n\t\t\t.add(1.0);\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeInOutElastic = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tIf(t.lessThan(0.5), () =>\n\t\t\tfloat(-0.5)\n\t\t\t\t.mul(pow(2.0, mul(20.0, t).sub(10.0)))\n\t\t\t\t.mul(sin(mul(20.0, t).sub(11.125).mul(mul(2.0, PI)).div(4.5))),\n\t\t);\n\t\treturn pow(2.0, float(-20.0).mul(t).add(10.0))\n\t\t\t.mul(sin(mul(20.0, t).sub(11.125).mul(mul(2.0, PI)).div(4.5)))\n\t\t\t.mul(0.5)\n\t\t\t.add(1.0);\n\t},\n\t{ t: 'float', return: 'float' },\n);\n\n// Back\nexport const easeInBack = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst s = float(1.70158);\n\t\treturn t.mul(t).mul(s.add(1.0).mul(t).sub(s));\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeOutBack = /*@__PURE__*/ Fn(\n\t([t]) => {\n\t\tconst s = float(1.70158);\n\t\tconst t1 = t.sub(1.0);\n\t\treturn t1.mul(t1).mul(s.add(1.0).mul(t1).add(s)).add(1.0);\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeInOutBack = /*@__PURE__*/ Fn(\n\t([t_immutable]) => {\n\t\tconst t = t_immutable.toVar();\n\t\tconst s = float(1.70158 * 1.525);\n\t\tt.mulAssign(2.0);\n\t\tIf(t.lessThan(1.0), () => mul(0.5, t.mul(t).mul(s.add(1.0).mul(t).sub(s))));\n\t\tt.subAssign(2.0);\n\t\treturn mul(0.5, t.mul(t).mul(s.add(1.0).mul(t).add(s)).add(2.0));\n\t},\n\t{ t: 'float', return: 'float' },\n);\n\n// Bounce\nexport const easeOutBounce = /*@__PURE__*/ Fn(\n\t([t_immutable]) => {\n\t\tconst t = t_immutable.toVar();\n\t\tIf(t.lessThan(1.0 / 2.75), () => mul(7.5625, t).mul(t))\n\t\t\t.ElseIf(t.lessThan(2.0 / 2.75), () => {\n\t\t\t\tt.subAssign(1.5 / 2.75);\n\t\t\t\treturn mul(7.5625, t).mul(t).add(0.75);\n\t\t\t})\n\t\t\t.ElseIf(t.lessThan(2.5 / 2.75), () => {\n\t\t\t\tt.subAssign(2.25 / 2.75);\n\t\t\t\treturn mul(7.5625, t).mul(t).add(0.9375);\n\t\t\t})\n\t\t\t.Else(() => {\n\t\t\t\tt.subAssign(2.625 / 2.75);\n\t\t\t\treturn mul(7.5625, t).mul(t).add(0.984375);\n\t\t\t});\n\t},\n\t{ t: 'float', return: 'float' },\n);\nexport const easeInBounce = /*@__PURE__*/ Fn(([t]) => sub(1.0, easeOutBounce(sub(1.0, t))), {\n\tt: 'float',\n\treturn: 'float',\n});\nexport const easeInOutBounce = /*@__PURE__*/ Fn(\n\t([t]) =>\n\t\tselect(\n\t\t\tt.lessThan(0.5),\n\t\t\tsub(1.0, easeOutBounce(sub(1.0, mul(2.0, t)))).mul(0.5),\n\t\t\tadd(1.0, easeOutBounce(mul(2.0, t).sub(1.0))).mul(0.5),\n\t\t),\n\t{ t: 'float', return: 'float' },\n);\n\n/**\n * Applies an easing function based on its index in EASE_FUNCTIONS.\n * Used by the particle shader to select the correct easing at runtime.\n */\nexport const applyEasing = /*@__PURE__*/ Fn(\n\t([t, easingId]) => {\n\t\tconst result = t.toVar();\n\t\tSwitch(easingId)\n\t\t\t.Case(0, () => { result.assign(easeLinear(t)); })\n\t\t\t.Case(1, () => { result.assign(easeInPower1(t)); })\n\t\t\t.Case(2, () => { result.assign(easeOutPower1(t)); })\n\t\t\t.Case(3, () => { result.assign(easeInOutPower1(t)); })\n\t\t\t.Case(4, () => { result.assign(easeInPower2(t)); })\n\t\t\t.Case(5, () => { result.assign(easeOutPower2(t)); })\n\t\t\t.Case(6, () => { result.assign(easeInOutPower2(t)); })\n\t\t\t.Case(7, () => { result.assign(easeInPower3(t)); })\n\t\t\t.Case(8, () => { result.assign(easeOutPower3(t)); })\n\t\t\t.Case(9, () => { result.assign(easeInOutPower3(t)); })\n\t\t\t.Case(10, () => { result.assign(easeInPower4(t)); })\n\t\t\t.Case(11, () => { result.assign(easeOutPower4(t)); })\n\t\t\t.Case(12, () => { result.assign(easeInOutPower4(t)); })\n\t\t\t.Case(13, () => { result.assign(easeInQuad(t)); })\n\t\t\t.Case(14, () => { result.assign(easeOutQuad(t)); })\n\t\t\t.Case(15, () => { result.assign(easeInOutQuad(t)); })\n\t\t\t.Case(16, () => { result.assign(easeInCubic(t)); })\n\t\t\t.Case(17, () => { result.assign(easeOutCubic(t)); })\n\t\t\t.Case(18, () => { result.assign(easeInOutCubic(t)); })\n\t\t\t.Case(19, () => { result.assign(easeInQuart(t)); })\n\t\t\t.Case(20, () => { result.assign(easeOutQuart(t)); })\n\t\t\t.Case(21, () => { result.assign(easeInOutQuart(t)); })\n\t\t\t.Case(22, () => { result.assign(easeInQuint(t)); })\n\t\t\t.Case(23, () => { result.assign(easeOutQuint(t)); })\n\t\t\t.Case(24, () => { result.assign(easeInOutQuint(t)); })\n\t\t\t.Case(25, () => { result.assign(easeInSine(t)); })\n\t\t\t.Case(26, () => { result.assign(easeOutSine(t)); })\n\t\t\t.Case(27, () => { result.assign(easeInOutSine(t)); })\n\t\t\t.Case(28, () => { result.assign(easeInExpo(t)); })\n\t\t\t.Case(29, () => { result.assign(easeOutExpo(t)); })\n\t\t\t.Case(30, () => { result.assign(easeInOutExpo(t)); })\n\t\t\t.Case(31, () => { result.assign(easeInCirc(t)); })\n\t\t\t.Case(32, () => { result.assign(easeOutCirc(t)); })\n\t\t\t.Case(33, () => { result.assign(easeInOutCirc(t)); })\n\t\t\t.Case(34, () => { result.assign(easeInElastic(t)); })\n\t\t\t.Case(35, () => { result.assign(easeOutElastic(t)); })\n\t\t\t.Case(36, () => { result.assign(easeInOutElastic(t)); })\n\t\t\t.Case(37, () => { result.assign(easeInBack(t)); })\n\t\t\t.Case(38, () => { result.assign(easeOutBack(t)); })\n\t\t\t.Case(39, () => { result.assign(easeInOutBack(t)); });\n\t\treturn result;\n\t},\n\t{ t: 'float', easingId: 'int', return: 'float' },\n);\n","/** Generates a random float within [min, max). */\nexport function randFloat(min: number, max: number): number {\n\treturn Math.random() * (max - min) + min;\n}\n\n/** Generates a random integer within [min, max]. */\nexport function randInt(min: number, max: number): number {\n\treturn Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const electricityArcPreset = defineSemanticParticlePreset({\n\tfamily: 'electricity',\n\tvariant: 'arc',\n\tdescription: 'directed snapping bridge of charge',\n\taxes: {\n\t\t'continuity vs discontinuity': 'semi-continuous',\n\t\t'branching tendency': 'medium',\n\t\t'snap/crackle quality': 'high',\n\t\t'seeking behavior': 'medium',\n\t\t'charge buildup': 'medium',\n\t\t'rhythmic pulsing': 'low',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 0.7,\n\t\t\tlooping: true,\n\t\t\tcolor: '#60a5fa',\n\t\t\tlife: [0.12, 0.26],\n\t\t\tsize: [0.06, 0.14],\n\t\t\tspeed: [2.4, 4],\n\t\t\trotation: [-0.3, 0.3],\n\t\t\topacity: 0.96,\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'rate', rate: 28 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.06,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.05,\n\t\t\tspeed: [1.2, 2.4],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ffffff', 0],\n\t\t\t\t\t['#7dd3fc', 0.3],\n\t\t\t\t\t['#2563eb', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.2, 0],\n\t\t\t\t\t[1, 0.05],\n\t\t\t\t\t[0.46, 0.5],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.7, 0.96, 0.82, 0.26],\n\t\t\tspeedOverLife: [1.08, 0.94, 0.7, 0.38],\n\t\t\tnoise: {\n\t\t\t\tfrequency: [2.4, 4.8],\n\t\t\t\tpower: [0.05, 0.12],\n\t\t\t\tpositionAmount: [0.14, 0.28],\n\t\t\t\trotationAmount: [0.04, 0.12],\n\t\t\t},\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.62,\n\t\t\tlengthFactor: 1.16,\n\t\t},\n\t},\n});\n\nexport function arc(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(electricityArcPreset, options);\n}\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const electricityPulsePreset = defineSemanticParticlePreset({\n\tfamily: 'electricity',\n\tvariant: 'pulse',\n\tdescription: 'rhythmic swelling packet of charge',\n\taxes: {\n\t\t'continuity vs discontinuity': 'discrete rhythmic',\n\t\t'branching tendency': 'low',\n\t\t'snap/crackle quality': 'medium',\n\t\t'seeking behavior': 'low',\n\t\t'charge buildup': 'medium',\n\t\t'rhythmic pulsing': 'high',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 0.28,\n\t\t\tcolor: '#a5f3fc',\n\t\t\tlife: [0.14, 0.3],\n\t\t\tsize: [0.18, 0.34],\n\t\t\tspeed: [0.18, 0.42],\n\t\t\topacity: 0.88,\n\t\t},\n\t\temission: { type: 'burst', count: 10 },\n\t\tshape: {\n\t\t\ttype: 'sphere',\n\t\t\tradius: 0.04,\n\t\t\tthickness: 0.5,\n\t\t\tspeed: [0.02, 0.08],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ffffff', 0],\n\t\t\t\t\t['#a5f3fc', 0.4],\n\t\t\t\t\t['#0891b2', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.14, 0],\n\t\t\t\t\t[0.92, 0.08],\n\t\t\t\t\t[0.42, 0.54],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.2, 0.92, 1.26, 0.18],\n\t\t},\n\t},\n});\n\nexport function pulse(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(electricityPulsePreset, options);\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const electricitySparkPreset = defineSemanticParticlePreset({\n\tfamily: 'electricity',\n\tvariant: 'spark',\n\tdescription: 'tiny discontinuous discharge',\n\taxes: {\n\t\t'continuity vs discontinuity': 'highly discontinuous',\n\t\t'branching tendency': 'low',\n\t\t'snap/crackle quality': 'high',\n\t\t'seeking behavior': 'low',\n\t\t'charge buildup': 'low',\n\t\t'rhythmic pulsing': 'low',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 0.2,\n\t\t\tcolor: '#7dd3fc',\n\t\t\tlife: [0.08, 0.18],\n\t\t\tsize: [0.08, 0.16],\n\t\t\tspeed: [2.2, 4.2],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.92,\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'burst', count: 12 },\n\t\tshape: {\n\t\t\ttype: 'sphere',\n\t\t\tradius: 0.06,\n\t\t\tthickness: 0.95,\n\t\t\tspeed: [0.8, 1.6],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ffffff', 0],\n\t\t\t\t\t['#bae6fd', 0.3],\n\t\t\t\t\t['#38bdf8', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.22, 0],\n\t\t\t\t\t[1, 0.06],\n\t\t\t\t\t[0.48, 0.4],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.44, 0.98, 0.7, 0.04],\n\t\t\tspeedOverLife: [1.24, 0.9, 0.36, 0.04],\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.46,\n\t\t\tlengthFactor: 1.02,\n\t\t},\n\t},\n});\n\nexport function spark(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(electricitySparkPreset, options);\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const electricityStormPreset = defineSemanticParticlePreset({\n\tfamily: 'electricity',\n\tvariant: 'storm',\n\tdescription: 'restless volume of crackling atmospheric charge',\n\taxes: {\n\t\t'continuity vs discontinuity': 'mixed',\n\t\t'branching tendency': 'high',\n\t\t'snap/crackle quality': 'high',\n\t\t'seeking behavior': 'medium-high',\n\t\t'charge buildup': 'high',\n\t\t'rhythmic pulsing': 'medium',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 1.2,\n\t\t\tlooping: true,\n\t\t\tcolor: '#38bdf8',\n\t\t\tlife: [0.32, 0.82],\n\t\t\tsize: [0.08, 0.2],\n\t\t\tspeed: [2.2, 4.8],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.94,\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'rate', rate: 34 },\n\t\tshape: {\n\t\t\ttype: 'sphere',\n\t\t\tradius: 0.16,\n\t\t\tthickness: 0.98,\n\t\t\tspeed: [1, 2],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ffffff', 0],\n\t\t\t\t\t['#67e8f9', 0.25],\n\t\t\t\t\t['#2563eb', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.18, 0],\n\t\t\t\t\t[0.98, 0.06],\n\t\t\t\t\t[0.5, 0.5],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.62, 0.96, 0.84, 0.26],\n\t\t\tspeedOverLife: [1.18, 0.94, 0.66, 0.32],\n\t\t\tnoise: {\n\t\t\t\tfrequency: [4.8, 8.4],\n\t\t\t\tpower: [0.08, 0.18],\n\t\t\t\tpositionAmount: [0.18, 0.38],\n\t\t\t\trotationAmount: [0.08, 0.18],\n\t\t\t},\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.66,\n\t\t\tlengthFactor: 1.18,\n\t\t},\n\t},\n});\n\nexport function storm(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(electricityStormPreset, options);\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const electricitySurgePreset = defineSemanticParticlePreset({\n\tfamily: 'electricity',\n\tvariant: 'surge',\n\tdescription: 'charge-rich spike that overwhelms the space',\n\taxes: {\n\t\t'continuity vs discontinuity': 'bursting',\n\t\t'branching tendency': 'medium',\n\t\t'snap/crackle quality': 'high',\n\t\t'seeking behavior': 'medium',\n\t\t'charge buildup': 'high',\n\t\t'rhythmic pulsing': 'medium',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 0.34,\n\t\t\tcolor: '#38bdf8',\n\t\t\tlife: [0.18, 0.36],\n\t\t\tsize: [0.12, 0.26],\n\t\t\tspeed: [2.8, 5.2],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.98,\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'burst', count: 24 },\n\t\tshape: {\n\t\t\ttype: 'sphere',\n\t\t\tradius: 0.08,\n\t\t\tthickness: 0.98,\n\t\t\tspeed: [1.1, 2.2],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ffffff', 0],\n\t\t\t\t\t['#67e8f9', 0.22],\n\t\t\t\t\t['#0ea5e9', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.22, 0],\n\t\t\t\t\t[1, 0.04],\n\t\t\t\t\t[0.52, 0.44],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.32, 0.9, 0.84, 0.08],\n\t\t\tspeedOverLife: [1.22, 0.88, 0.42, 0.06],\n\t\t\tnoise: {\n\t\t\t\tfrequency: [4.5, 8],\n\t\t\t\tpower: [0.08, 0.18],\n\t\t\t\tpositionAmount: [0.22, 0.42],\n\t\t\t\trotationAmount: [0.08, 0.16],\n\t\t\t},\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.68,\n\t\t\tlengthFactor: 1.2,\n\t\t},\n\t},\n});\n\nexport function surge(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(electricitySurgePreset, options);\n}\n","export { arc, electricityArcPreset } from './arc';\nexport { pulse, electricityPulsePreset } from './pulse';\nexport { spark, electricitySparkPreset } from './spark';\nexport { storm, electricityStormPreset } from './storm';\nexport { surge, electricitySurgePreset } from './surge';\n\nimport { arc } from './arc';\nimport { pulse } from './pulse';\nimport { spark } from './spark';\nimport { storm } from './storm';\nimport { surge } from './surge';\n\nexport const electricityPresets = {\n\tspark,\n\tarc,\n\tsurge,\n\tpulse,\n\tstorm,\n} as const;\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const fireBlazePreset = defineSemanticParticlePreset({\n\tfamily: 'fire',\n\tvariant: 'blaze',\n\tdescription: 'sustained, strong open burning',\n\taxes: {\n\t\t'heat feel': 'intense',\n\t\t'hunger/spread tendency': 'high',\n\t\t'smoke affinity': 'medium',\n\t\tturbulence: 'high',\n\t\tresiduality: 'medium',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 1.8,\n\t\t\tlooping: true,\n\t\t\tcolor: '#f97316',\n\t\t\tlife: [0.55, 1.1],\n\t\t\tsize: [0.32, 0.62],\n\t\t\tspeed: [0.55, 1.4],\n\t\t\trotation: [-0.24, 0.24],\n\t\t\topacity: 0.96,\n\t\t\trenderMode: RenderMode.VerticalBillBoard,\n\t\t},\n\t\temission: { type: 'rate', rate: 42 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.18,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.28,\n\t\t\tspeed: [0.35, 0.95],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ffffff', 0],\n\t\t\t\t\t['#fde68a', 0.18],\n\t\t\t\t\t['#fb923c', 0.5],\n\t\t\t\t\t['#ef4444', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.18, 0],\n\t\t\t\t\t[1, 0.08],\n\t\t\t\t\t[0.56, 0.54],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.45, 0.92, 1.14, 0.22],\n\t\t\tspeedOverLife: [1.08, 0.96, 0.62, 0.16],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [0.38, 0.72],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [4.5, 6.5],\n\t\t\t\tpower: [0.1, 0.18],\n\t\t\t\tpositionAmount: [0.32, 0.55],\n\t\t\t\trotationAmount: [0.18, 0.3],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function blaze(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(fireBlazePreset, options);\n}\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const fireEmberPreset = defineSemanticParticlePreset({\n\tfamily: 'fire',\n\tvariant: 'ember',\n\tdescription: 'lingering, warm, residual, drifting',\n\taxes: {\n\t\t'heat feel': 'warm',\n\t\t'hunger/spread tendency': 'low',\n\t\t'smoke affinity': 'medium',\n\t\tturbulence: 'low',\n\t\tresiduality: 'high',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 2.2,\n\t\t\tlooping: true,\n\t\t\tcolor: '#fb923c',\n\t\t\tlife: [1.1, 2.2],\n\t\t\tsize: [0.05, 0.14],\n\t\t\tspeed: [0.08, 0.32],\n\t\t\trotation: [-0.45, 0.45],\n\t\t\topacity: 0.9,\n\t\t},\n\t\temission: { type: 'rate', rate: 8 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.12,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.22,\n\t\t\tspeed: [0.08, 0.26],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#fff7d1', 0],\n\t\t\t\t\t['#fb923c', 0.35],\n\t\t\t\t\t['#b45309', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.12, 0],\n\t\t\t\t\t[0.9, 0.12],\n\t\t\t\t\t[0.42, 0.7],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.42, 0.9, 0.72, 0.18],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [0.18, 0.42],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [1.2, 2.6],\n\t\t\t\tpower: [0.02, 0.08],\n\t\t\t\tpositionAmount: [0.06, 0.14],\n\t\t\t\trotationAmount: [0.04, 0.1],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function ember(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(fireEmberPreset, options);\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const fireFlameletPreset = defineSemanticParticlePreset({\n\tfamily: 'fire',\n\tvariant: 'flamelet',\n\tdescription: 'small coherent tongue of flame',\n\taxes: {\n\t\t'heat feel': 'hot',\n\t\t'hunger/spread tendency': 'medium',\n\t\t'smoke affinity': 'low',\n\t\tturbulence: 'medium',\n\t\tresiduality: 'low',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 1.2,\n\t\t\tlooping: true,\n\t\t\tcolor: '#fb923c',\n\t\t\tlife: [0.48, 0.9],\n\t\t\tsize: [0.2, 0.38],\n\t\t\tspeed: [0.35, 0.9],\n\t\t\trotation: [-0.18, 0.18],\n\t\t\topacity: 0.94,\n\t\t\trenderMode: RenderMode.VerticalBillBoard,\n\t\t},\n\t\temission: { type: 'rate', rate: 22 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.1,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.18,\n\t\t\tspeed: [0.3, 0.72],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#fff7d1', 0],\n\t\t\t\t\t['#fbbf24', 0.24],\n\t\t\t\t\t['#fb923c', 0.62],\n\t\t\t\t\t['#ef4444', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.16, 0],\n\t\t\t\t\t[0.94, 0.1],\n\t\t\t\t\t[0.48, 0.58],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.44, 0.92, 1.08, 0.16],\n\t\t\tspeedOverLife: [1.08, 0.95, 0.62, 0.18],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [0.3, 0.55],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [3, 5],\n\t\t\t\tpower: [0.08, 0.14],\n\t\t\t\tpositionAmount: [0.24, 0.42],\n\t\t\t\trotationAmount: [0.16, 0.24],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function flamelet(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(fireFlameletPreset, options);\n}\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const fireSmolderPreset = defineSemanticParticlePreset({\n\tfamily: 'fire',\n\tvariant: 'smolder',\n\tdescription: 'low-oxygen, persistent, smoky heat',\n\taxes: {\n\t\t'heat feel': 'buried-hot',\n\t\t'hunger/spread tendency': 'low',\n\t\t'smoke affinity': 'high',\n\t\tturbulence: 'low',\n\t\tresiduality: 'high',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 2.6,\n\t\t\tlooping: true,\n\t\t\tcolor: '#c2410c',\n\t\t\tlife: [1.4, 2.8],\n\t\t\tsize: [0.28, 0.58],\n\t\t\tspeed: [0.06, 0.22],\n\t\t\trotation: [-0.35, 0.35],\n\t\t\topacity: 0.76,\n\t\t},\n\t\temission: { type: 'rate', rate: 14 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.16,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.12,\n\t\t\tspeed: [0.04, 0.16],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#fed7aa', 0],\n\t\t\t\t\t['#c2410c', 0.28],\n\t\t\t\t\t['#525252', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.14, 0],\n\t\t\t\t\t[0.76, 0.12],\n\t\t\t\t\t[0.4, 0.68],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.34, 0.86, 1.08, 0.46],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [0.08, 0.2],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [1.6, 3.1],\n\t\t\t\tpower: [0.04, 0.12],\n\t\t\t\tpositionAmount: [0.12, 0.26],\n\t\t\t\trotationAmount: [0.06, 0.14],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function smolder(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(fireSmolderPreset, options);\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const fireSparkPreset = defineSemanticParticlePreset({\n\tfamily: 'fire',\n\tvariant: 'spark',\n\tdescription: 'tiny, sudden, energetic, fleeting',\n\taxes: {\n\t\t'heat feel': 'sharp-hot',\n\t\t'hunger/spread tendency': 'low',\n\t\t'smoke affinity': 'low',\n\t\tturbulence: 'high',\n\t\tresiduality: 'low',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 0.24,\n\t\t\tcolor: '#ffd166',\n\t\t\tlife: [0.12, 0.24],\n\t\t\tsize: [0.08, 0.16],\n\t\t\tspeed: [1.8, 4.6],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'burst', count: 10 },\n\t\tshape: {\n\t\t\ttype: 'sphere',\n\t\t\tradius: 0.05,\n\t\t\tthickness: 0.92,\n\t\t\tspeed: [0.45, 1.2],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ffffff', 0],\n\t\t\t\t\t['#fde68a', 0.2],\n\t\t\t\t\t['#fb923c', 0.62],\n\t\t\t\t\t['#ef4444', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.18, 0],\n\t\t\t\t\t[1, 0.08],\n\t\t\t\t\t[0.52, 0.5],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.48, 1.08, 0.88, 0.06],\n\t\t\tspeedOverLife: [1.18, 0.88, 0.42, 0.04],\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.55,\n\t\t\tlengthFactor: 1.08,\n\t\t},\n\t},\n});\n\nexport function spark(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(fireSparkPreset, options);\n}\n","export { blaze, fireBlazePreset } from './blaze';\nexport { ember, fireEmberPreset } from './ember';\nexport { flamelet, fireFlameletPreset } from './flamelet';\nexport { smolder, fireSmolderPreset } from './smolder';\nexport { spark, fireSparkPreset } from './spark';\n\nimport { blaze } from './blaze';\nimport { ember } from './ember';\nimport { flamelet } from './flamelet';\nimport { smolder } from './smolder';\nimport { spark } from './spark';\n\nexport const firePresets = {\n\tspark,\n\tember,\n\tflamelet,\n\tblaze,\n\tsmolder,\n} as const;\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const gasHazePreset = defineSemanticParticlePreset({\n\tfamily: 'gas',\n\tvariant: 'haze',\n\tdescription: 'broad, thin atmospheric contamination',\n\taxes: {\n\t\t'opacity feel': 'low',\n\t\ttoxicity: 'low-medium',\n\t\tbuoyancy: 'neutral',\n\t\t'spread tendency': 'high',\n\t\tthickness: 'thin',\n\t\t'staining / contaminating character': 'low',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 4.4,\n\t\t\tlooping: true,\n\t\t\tcolor: '#cbd5e1',\n\t\t\tlife: [3.4, 5.4],\n\t\t\tsize: [0.9, 1.7],\n\t\t\tspeed: [0.02, 0.08],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.18,\n\t\t},\n\t\temission: { type: 'rate', rate: 10 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.64,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.5,\n\t\t\tspeed: [0.01, 0.04],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#f8fafc', 0],\n\t\t\t\t\t['#cbd5e1', 0.4],\n\t\t\t\t\t['#94a3b8', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.04, 0],\n\t\t\t\t\t[0.2, 0.24],\n\t\t\t\t\t[0.08, 0.88],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.88, 1.08, 1.28, 1.42],\n\t\t\tnoise: {\n\t\t\t\tfrequency: [0.6, 1.4],\n\t\t\t\tpower: [0.02, 0.06],\n\t\t\t\tpositionAmount: [0.08, 0.16],\n\t\t\t\trotationAmount: [0.06, 0.1],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function haze(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(gasHazePreset, options);\n}\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const gasMiasmaPreset = defineSemanticParticlePreset({\n\tfamily: 'gas',\n\tvariant: 'miasma',\n\tdescription: 'thick, toxic, contaminating exhalation',\n\taxes: {\n\t\t'opacity feel': 'medium',\n\t\ttoxicity: 'high',\n\t\tbuoyancy: 'low-medium',\n\t\t'spread tendency': 'high',\n\t\tthickness: 'sticky',\n\t\t'staining / contaminating character': 'high',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 3.8,\n\t\t\tlooping: true,\n\t\t\tcolor: '#84cc16',\n\t\t\tlife: [2.8, 4.6],\n\t\t\tsize: [0.52, 1.08],\n\t\t\tspeed: [0.03, 0.16],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.5,\n\t\t},\n\t\temission: { type: 'rate', rate: 16 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.3,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.3,\n\t\t\tspeed: [0.02, 0.08],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ecfccb', 0],\n\t\t\t\t\t['#84cc16', 0.4],\n\t\t\t\t\t['#3f6212', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.08, 0],\n\t\t\t\t\t[0.58, 0.14],\n\t\t\t\t\t[0.24, 0.8],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.4, 0.92, 1.3, 1.9],\n\t\t\tnoise: {\n\t\t\t\tfrequency: [1.8, 3.8],\n\t\t\t\tpower: [0.08, 0.18],\n\t\t\t\tpositionAmount: [0.16, 0.34],\n\t\t\t\trotationAmount: [0.08, 0.18],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function miasma(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(gasMiasmaPreset, options);\n}\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const gasPlumePreset = defineSemanticParticlePreset({\n\tfamily: 'gas',\n\tvariant: 'plume',\n\tdescription: 'columnar rising release with strong lift',\n\taxes: {\n\t\t'opacity feel': 'medium',\n\t\ttoxicity: 'medium',\n\t\tbuoyancy: 'very-high',\n\t\t'spread tendency': 'medium',\n\t\tthickness: 'medium',\n\t\t'staining / contaminating character': 'medium',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 2.8,\n\t\t\tlooping: true,\n\t\t\tcolor: '#94a3b8',\n\t\t\tlife: [1.8, 3.2],\n\t\t\tsize: [0.32, 0.72],\n\t\t\tspeed: [0.16, 0.52],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.48,\n\t\t},\n\t\temission: { type: 'rate', rate: 22 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.18,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.18,\n\t\t\tspeed: [0.08, 0.24],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#e2e8f0', 0],\n\t\t\t\t\t['#94a3b8', 0.36],\n\t\t\t\t\t['#475569', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.06, 0],\n\t\t\t\t\t[0.54, 0.14],\n\t\t\t\t\t[0.2, 0.84],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.42, 0.92, 1.36, 1.84],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [0.28, 0.6],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [1.6, 3.4],\n\t\t\t\tpower: [0.08, 0.14],\n\t\t\t\tpositionAmount: [0.14, 0.28],\n\t\t\t\trotationAmount: [0.08, 0.16],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function plume(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(gasPlumePreset, options);\n}\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const gasSmokePreset = defineSemanticParticlePreset({\n\tfamily: 'gas',\n\tvariant: 'smoke',\n\tdescription: 'opaque, buoyant, lingering combustion residue',\n\taxes: {\n\t\t'opacity feel': 'medium-high',\n\t\ttoxicity: 'medium',\n\t\tbuoyancy: 'high',\n\t\t'spread tendency': 'medium',\n\t\tthickness: 'medium',\n\t\t'staining / contaminating character': 'medium',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 3.2,\n\t\t\tlooping: true,\n\t\t\tcolor: '#737373',\n\t\t\tlife: [2.4, 4.2],\n\t\t\tsize: [0.45, 0.92],\n\t\t\tspeed: [0.08, 0.3],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.58,\n\t\t},\n\t\temission: { type: 'rate', rate: 14 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.24,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.28,\n\t\t\tspeed: [0.04, 0.14],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#d4d4d8', 0],\n\t\t\t\t\t['#737373', 0.4],\n\t\t\t\t\t['#404040', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.08, 0],\n\t\t\t\t\t[0.68, 0.14],\n\t\t\t\t\t[0.24, 0.84],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.38, 0.88, 1.4, 2.08],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [0.12, 0.28],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [1.2, 2.8],\n\t\t\t\tpower: [0.08, 0.16],\n\t\t\t\tpositionAmount: [0.12, 0.26],\n\t\t\t\trotationAmount: [0.08, 0.18],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function smoke(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(gasSmokePreset, options);\n}\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const gasVaporPreset = defineSemanticParticlePreset({\n\tfamily: 'gas',\n\tvariant: 'vapor',\n\tdescription: 'visible gaseous release with light buoyancy',\n\taxes: {\n\t\t'opacity feel': 'light',\n\t\ttoxicity: 'neutral',\n\t\tbuoyancy: 'high',\n\t\t'spread tendency': 'medium',\n\t\tthickness: 'thin',\n\t\t'staining / contaminating character': 'low',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 3,\n\t\t\tlooping: true,\n\t\t\tcolor: '#e2e8f0',\n\t\t\tlife: [2.2, 3.6],\n\t\t\tsize: [0.38, 0.78],\n\t\t\tspeed: [0.04, 0.18],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.28,\n\t\t},\n\t\temission: { type: 'rate', rate: 18 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.28,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.36,\n\t\t\tspeed: [0.02, 0.08],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#f8fafc', 0],\n\t\t\t\t\t['#e2e8f0', 0.36],\n\t\t\t\t\t['#cbd5e1', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.06, 0],\n\t\t\t\t\t[0.34, 0.22],\n\t\t\t\t\t[0.12, 0.84],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.42, 0.9, 1.38, 1.98],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [0.06, 0.18],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [1, 2],\n\t\t\t\tpower: [0.04, 0.08],\n\t\t\t\tpositionAmount: [0.1, 0.2],\n\t\t\t\trotationAmount: [0.08, 0.14],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function vapor(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(gasVaporPreset, options);\n}\n","export { haze, gasHazePreset } from './haze';\nexport { miasma, gasMiasmaPreset } from './miasma';\nexport { plume, gasPlumePreset } from './plume';\nexport { smoke, gasSmokePreset } from './smoke';\nexport { vapor, gasVaporPreset } from './vapor';\n\nimport { haze } from './haze';\nimport { miasma } from './miasma';\nimport { plume } from './plume';\nimport { smoke } from './smoke';\nimport { vapor } from './vapor';\n\nexport const gasPresets = {\n\tvapor,\n\tsmoke,\n\thaze,\n\tplume,\n\tmiasma,\n} as const;\n","import {\n\tcreateMagicModifier,\n\ttype ParticleMagicModifierOptions,\n} from '../../preset-builder';\n\nexport function arcane(\n\toptions: Omit<ParticleMagicModifierOptions, 'alignment'> = {},\n) {\n\treturn createMagicModifier('arcane', options);\n}\n","import {\n\tcreateMagicModifier,\n\ttype ParticleMagicModifierOptions,\n} from '../../preset-builder';\n\nexport function corrupted(\n\toptions: Omit<ParticleMagicModifierOptions, 'alignment'> = {},\n) {\n\treturn createMagicModifier('corrupted', options);\n}\n","import {\n\tcreateMagicModifier,\n\ttype ParticleMagicModifierOptions,\n} from '../../preset-builder';\n\nexport function holy(\n\toptions: Omit<ParticleMagicModifierOptions, 'alignment'> = {},\n) {\n\treturn createMagicModifier('holy', options);\n}\n","import {\n\tcreateMagicModifier,\n\ttype ParticleMagicModifierOptions,\n} from '../../preset-builder';\n\nexport function nature(\n\toptions: Omit<ParticleMagicModifierOptions, 'alignment'> = {},\n) {\n\treturn createMagicModifier('nature', options);\n}\n","import {\n\tcreateMagicModifier,\n\ttype ParticleMagicModifierOptions,\n} from '../../preset-builder';\n\nexport function psychic(\n\toptions: Omit<ParticleMagicModifierOptions, 'alignment'> = {},\n) {\n\treturn createMagicModifier('psychic', options);\n}\n","import {\n\tcreateMagicModifier,\n\ttype ParticleMagicModifierOptions,\n} from '../../preset-builder';\n\nexport function voidMagic(\n\toptions: Omit<ParticleMagicModifierOptions, 'alignment'> = {},\n) {\n\treturn createMagicModifier('void', options);\n}\n","export { arcane } from './arcane';\nexport { corrupted } from './corrupted';\nexport { holy } from './holy';\nexport { nature } from './nature';\nexport { psychic } from './psychic';\nexport { voidMagic } from './void';\n\nimport { arcane } from './arcane';\nimport { corrupted } from './corrupted';\nimport { holy } from './holy';\nimport { nature } from './nature';\nimport { psychic } from './psychic';\nimport { voidMagic } from './void';\n\nexport const magicPresets = {\n\tarcane,\n\tholy,\n\tcorrupted,\n\tnature,\n\tvoid: voidMagic,\n\tpsychic,\n} as const;\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const waterDrizzlePreset = defineSemanticParticlePreset({\n\tfamily: 'water',\n\tvariant: 'drizzle',\n\tdescription: 'soft, continuous, light fall',\n\taxes: {\n\t\tpressure: 'low',\n\t\t'surface tension feel': 'light',\n\t\taeration: 'low',\n\t\tcoherence: 'discrete',\n\t\t'gravitational obedience': 'very-high',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 1.4,\n\t\t\tlooping: true,\n\t\t\tcolor: '#e0f2fe',\n\t\t\tlife: [0.6, 1.05],\n\t\t\tsize: [0.05, 0.1],\n\t\t\tspeed: [2.8, 4.4],\n\t\t\topacity: 0.62,\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'rate', rate: 26 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.46,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.04,\n\t\t\tspeed: [1.8, 2.6],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#f8fafc', 0],\n\t\t\t\t\t['#e0f2fe', 0.45],\n\t\t\t\t\t['#7dd3fc', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.12, 0],\n\t\t\t\t\t[0.78, 0.08],\n\t\t\t\t\t[0.52, 0.58],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tspeedOverLife: [1.02, 1, 0.94, 0.88],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [-8.2, -6.4],\n\t\t\t},\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.42,\n\t\t\tlengthFactor: 1.24,\n\t\t},\n\t},\n});\n\nexport function drizzle(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(waterDrizzlePreset, options);\n}\n","import {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const waterMistPreset = defineSemanticParticlePreset({\n\tfamily: 'water',\n\tvariant: 'mist',\n\tdescription: 'diffuse suspended moisture',\n\taxes: {\n\t\tpressure: 'low',\n\t\t'surface tension feel': 'soft',\n\t\taeration: 'low',\n\t\tcoherence: 'diffuse',\n\t\t'gravitational obedience': 'low',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 3.2,\n\t\t\tlooping: true,\n\t\t\tcolor: '#dbeafe',\n\t\t\tlife: [2.4, 3.8],\n\t\t\tsize: [0.4, 0.82],\n\t\t\tspeed: [0.05, 0.2],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.36,\n\t\t},\n\t\temission: { type: 'rate', rate: 16 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.32,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.42,\n\t\t\tspeed: [0.02, 0.08],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#f8fafc', 0],\n\t\t\t\t\t['#dbeafe', 0.35],\n\t\t\t\t\t['#bfdbfe', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.08, 0],\n\t\t\t\t\t[0.44, 0.2],\n\t\t\t\t\t[0.18, 0.82],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.38, 0.86, 1.42, 2.02],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [0.02, 0.12],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [0.8, 1.8],\n\t\t\t\tpower: [0.04, 0.1],\n\t\t\t\tpositionAmount: [0.1, 0.18],\n\t\t\t\trotationAmount: [0.08, 0.14],\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport function mist(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(waterMistPreset, options);\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const waterSplashPreset = defineSemanticParticlePreset({\n\tfamily: 'water',\n\tvariant: 'splash',\n\tdescription: 'sudden impact-driven burst',\n\taxes: {\n\t\tpressure: 'impact-driven',\n\t\t'surface tension feel': 'beaded',\n\t\taeration: 'medium',\n\t\tcoherence: 'shattering',\n\t\t'gravitational obedience': 'high',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 0.34,\n\t\t\tcolor: '#7dd3fc',\n\t\t\tlife: [0.26, 0.55],\n\t\t\tsize: [0.1, 0.22],\n\t\t\tspeed: [1.4, 3.1],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.82,\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'burst', count: 18 },\n\t\tshape: {\n\t\t\ttype: 'sphere',\n\t\t\tradius: 0.08,\n\t\t\tthickness: 0.96,\n\t\t\tspeed: [0.7, 1.4],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#ffffff', 0],\n\t\t\t\t\t['#bae6fd', 0.4],\n\t\t\t\t\t['#38bdf8', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.18, 0],\n\t\t\t\t\t[0.88, 0.08],\n\t\t\t\t\t[0.42, 0.54],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.32, 0.86, 0.92, 0.08],\n\t\t\tspeedOverLife: [1.12, 0.88, 0.46, 0.08],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [-4.4, -2.6],\n\t\t\t},\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.36,\n\t\t\tlengthFactor: 0.88,\n\t\t},\n\t},\n});\n\nexport function splash(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(waterSplashPreset, options);\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const waterSprayPreset = defineSemanticParticlePreset({\n\tfamily: 'water',\n\tvariant: 'spray',\n\tdescription: 'fine ejected droplets',\n\taxes: {\n\t\tpressure: 'medium-high',\n\t\t'surface tension feel': 'light',\n\t\taeration: 'medium',\n\t\tcoherence: 'broken',\n\t\t'gravitational obedience': 'high',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 1,\n\t\t\tlooping: true,\n\t\t\tcolor: '#93c5fd',\n\t\t\tlife: [0.45, 0.9],\n\t\t\tsize: [0.08, 0.16],\n\t\t\tspeed: [1.1, 2.3],\n\t\t\trotation: [-Math.PI, Math.PI],\n\t\t\topacity: 0.72,\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'rate', rate: 38 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.12,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.24,\n\t\t\tspeed: [0.85, 1.8],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#eff6ff', 0],\n\t\t\t\t\t['#93c5fd', 0.45],\n\t\t\t\t\t['#60a5fa', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.16, 0],\n\t\t\t\t\t[0.82, 0.08],\n\t\t\t\t\t[0.52, 0.58],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.72, 0.96, 0.82, 0.28],\n\t\t\tspeedOverLife: [1.04, 0.92, 0.68, 0.38],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [-5.8, -3.8],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [1.2, 2.2],\n\t\t\t\tpower: [0.04, 0.08],\n\t\t\t\tpositionAmount: [0.08, 0.16],\n\t\t\t\trotationAmount: [0.04, 0.08],\n\t\t\t},\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.5,\n\t\t\tlengthFactor: 0.95,\n\t\t},\n\t},\n});\n\nexport function spray(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(waterSprayPreset, options);\n}\n","import { RenderMode } from '../../preset-builder';\n\nimport {\n\tcreateSemanticParticleEffect,\n\tdefineSemanticParticlePreset,\n\ttype SemanticParticlePresetOptions,\n} from '../../preset-builder';\n\nexport const waterTorrentPreset = defineSemanticParticlePreset({\n\tfamily: 'water',\n\tvariant: 'torrent',\n\tdescription: 'strong, forceful, dense flow',\n\taxes: {\n\t\tpressure: 'high',\n\t\t'surface tension feel': 'driven',\n\t\taeration: 'medium',\n\t\tcoherence: 'strong',\n\t\t'gravitational obedience': 'high',\n\t},\n\tsystem: {\n\t\tdefaults: {\n\t\t\tduration: 1,\n\t\t\tlooping: true,\n\t\t\tcolor: '#38bdf8',\n\t\t\tlife: [0.35, 0.75],\n\t\t\tsize: [0.1, 0.22],\n\t\t\tspeed: [2.6, 4.9],\n\t\t\trotation: [-0.3, 0.3],\n\t\t\topacity: 0.84,\n\t\t\trenderMode: RenderMode.StretchedBillBoard,\n\t\t},\n\t\temission: { type: 'rate', rate: 60 },\n\t\tshape: {\n\t\t\ttype: 'cone',\n\t\t\tradius: 0.18,\n\t\t\tthickness: 1,\n\t\t\tangle: 0.12,\n\t\t\tspeed: [1.8, 3.1],\n\t\t},\n\t\tbehaviors: {\n\t\t\tcolorOverLife: {\n\t\t\t\tcolors: [\n\t\t\t\t\t['#f0f9ff', 0],\n\t\t\t\t\t['#7dd3fc', 0.35],\n\t\t\t\t\t['#0ea5e9', 1],\n\t\t\t\t],\n\t\t\t\talpha: [\n\t\t\t\t\t[0.18, 0],\n\t\t\t\t\t[0.92, 0.08],\n\t\t\t\t\t[0.56, 0.52],\n\t\t\t\t\t[0, 1],\n\t\t\t\t],\n\t\t\t},\n\t\t\tsizeOverLife: [0.72, 0.94, 0.84, 0.28],\n\t\t\tspeedOverLife: [1.04, 0.92, 0.68, 0.34],\n\t\t\tforceOverLife: {\n\t\t\t\ty: [-6.8, -4.8],\n\t\t\t},\n\t\t\tnoise: {\n\t\t\t\tfrequency: [1.4, 2.6],\n\t\t\t\tpower: [0.04, 0.09],\n\t\t\t\tpositionAmount: [0.08, 0.14],\n\t\t\t\trotationAmount: [0.06, 0.1],\n\t\t\t},\n\t\t},\n\t\trendererEmitterSettings: {\n\t\t\tspeedFactor: 0.56,\n\t\t\tlengthFactor: 1.08,\n\t\t},\n\t},\n});\n\nexport function torrent(\n\toptions: SemanticParticlePresetOptions = {},\n) {\n\treturn createSemanticParticleEffect(waterTorrentPreset, options);\n}\n","export { drizzle, waterDrizzlePreset } from './drizzle';\nexport { mist, waterMistPreset } from './mist';\nexport { splash, waterSplashPreset } from './splash';\nexport { spray, waterSprayPreset } from './spray';\nexport { torrent, waterTorrentPreset } from './torrent';\n\nimport { drizzle } from './drizzle';\nimport { mist } from './mist';\nimport { splash } from './splash';\nimport { spray } from './spray';\nimport { torrent } from './torrent';\n\nexport const waterPresets = {\n\tmist,\n\tspray,\n\tsplash,\n\tdrizzle,\n\ttorrent,\n} as const;\n"],"mappings":"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","names":["AdditiveBlending","THREE","texture","texture","THREE","If","select","float","Fn","Fn","If","select","float","min","max","texture","AdditiveBlending","count","range","min","max","spark","spark"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineBehavior
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EZNCCO4L.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/behaviors/screen-visibility/screen-visibility.descriptor.ts
|
|
6
6
|
import {
|
|
@@ -366,3 +366,4 @@ export {
|
|
|
366
366
|
ScreenVisibilityFSM,
|
|
367
367
|
ScreenVisibilityBehavior
|
|
368
368
|
};
|
|
369
|
+
//# sourceMappingURL=chunk-WOMHL23C.js.map
|