babylon.quarks 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/dist/babylon.quarks.cjs +2 -0
  3. package/dist/babylon.quarks.cjs.map +1 -0
  4. package/dist/babylon.quarks.esm.js +2 -0
  5. package/dist/babylon.quarks.esm.js.map +1 -0
  6. package/dist/types/BatchedParticleRenderer.d.ts +2 -0
  7. package/dist/types/BatchedRenderer.d.ts +40 -0
  8. package/dist/types/MeshSurfaceEmitter.d.ts +19 -0
  9. package/dist/types/ParticleEmitter.d.ts +16 -0
  10. package/dist/types/ParticleSystem.d.ts +226 -0
  11. package/dist/types/QuarksLoader.d.ts +28 -0
  12. package/dist/types/QuarksPrefab.d.ts +48 -0
  13. package/dist/types/QuarksUtil.d.ts +14 -0
  14. package/dist/types/SpriteBatch.d.ts +32 -0
  15. package/dist/types/TrailBatch.d.ts +27 -0
  16. package/dist/types/VFXBatch.d.ts +51 -0
  17. package/dist/types/index.d.ts +19 -0
  18. package/dist/types/materials/ParticleMaterials.d.ts +12 -0
  19. package/dist/types/materials/index.d.ts +1 -0
  20. package/dist/types/shaders/chunks/index.d.ts +1 -0
  21. package/dist/types/shaders/chunks/register-shader-chunks.d.ts +3 -0
  22. package/dist/types/shaders/chunks/soft_fragment.glsl.d.ts +2 -0
  23. package/dist/types/shaders/chunks/soft_pars_fragment.glsl.d.ts +2 -0
  24. package/dist/types/shaders/chunks/soft_pars_vertex.glsl.d.ts +2 -0
  25. package/dist/types/shaders/chunks/soft_vertex.glsl.d.ts +2 -0
  26. package/dist/types/shaders/chunks/tile_fragment.glsl.d.ts +2 -0
  27. package/dist/types/shaders/chunks/tile_pars_fragment.glsl.d.ts +2 -0
  28. package/dist/types/shaders/chunks/tile_pars_vertex.glsl.d.ts +2 -0
  29. package/dist/types/shaders/chunks/tile_vertex.glsl.d.ts +2 -0
  30. package/dist/types/shaders/index.d.ts +9 -0
  31. package/dist/types/shaders/local_particle_physics_vert.glsl.d.ts +2 -0
  32. package/dist/types/shaders/local_particle_vert.glsl.d.ts +2 -0
  33. package/dist/types/shaders/particle_frag.glsl.d.ts +2 -0
  34. package/dist/types/shaders/particle_physics_frag.glsl.d.ts +2 -0
  35. package/dist/types/shaders/particle_vert.glsl.d.ts +2 -0
  36. package/dist/types/shaders/stretched_bb_particle_vert.glsl.d.ts +2 -0
  37. package/dist/types/shaders/trail_frag.glsl.d.ts +2 -0
  38. package/dist/types/shaders/trail_vert.glsl.d.ts +2 -0
  39. package/package.json +58 -0
  40. package/src/BatchedParticleRenderer.ts +3 -0
  41. package/src/BatchedRenderer.ts +135 -0
  42. package/src/MeshSurfaceEmitter.ts +137 -0
  43. package/src/ParticleEmitter.ts +86 -0
  44. package/src/ParticleSystem.ts +1162 -0
  45. package/src/QuarksLoader.ts +503 -0
  46. package/src/QuarksPrefab.ts +307 -0
  47. package/src/QuarksUtil.ts +66 -0
  48. package/src/SpriteBatch.ts +391 -0
  49. package/src/TrailBatch.ts +345 -0
  50. package/src/VFXBatch.ts +102 -0
  51. package/src/index.ts +54 -0
  52. package/src/materials/ParticleMaterials.ts +23 -0
  53. package/src/materials/index.ts +1 -0
  54. package/src/shaders/chunks/index.ts +1 -0
  55. package/src/shaders/chunks/register-shader-chunks.ts +32 -0
  56. package/src/shaders/chunks/soft_fragment.glsl.ts +13 -0
  57. package/src/shaders/chunks/soft_pars_fragment.glsl.ts +20 -0
  58. package/src/shaders/chunks/soft_pars_vertex.glsl.ts +6 -0
  59. package/src/shaders/chunks/soft_vertex.glsl.ts +6 -0
  60. package/src/shaders/chunks/tile_fragment.glsl.ts +9 -0
  61. package/src/shaders/chunks/tile_pars_fragment.glsl.ts +9 -0
  62. package/src/shaders/chunks/tile_pars_vertex.glsl.ts +28 -0
  63. package/src/shaders/chunks/tile_vertex.glsl.ts +18 -0
  64. package/src/shaders/index.ts +9 -0
  65. package/src/shaders/local_particle_physics_vert.glsl.ts +66 -0
  66. package/src/shaders/local_particle_vert.glsl.ts +50 -0
  67. package/src/shaders/particle_frag.glsl.ts +61 -0
  68. package/src/shaders/particle_physics_frag.glsl.ts +67 -0
  69. package/src/shaders/particle_vert.glsl.ts +85 -0
  70. package/src/shaders/stretched_bb_particle_vert.glsl.ts +74 -0
  71. package/src/shaders/trail_frag.glsl.ts +21 -0
  72. package/src/shaders/trail_vert.glsl.ts +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"babylon.quarks.esm.js","sources":["../src/MeshSurfaceEmitter.ts","../src/shaders/chunks/register-shader-chunks.ts","../src/shaders/chunks/tile_pars_vertex.glsl.ts","../src/shaders/chunks/tile_vertex.glsl.ts","../src/shaders/chunks/tile_pars_fragment.glsl.ts","../src/shaders/chunks/tile_fragment.glsl.ts","../src/shaders/chunks/soft_pars_vertex.glsl.ts","../src/shaders/chunks/soft_vertex.glsl.ts","../src/shaders/chunks/soft_pars_fragment.glsl.ts","../src/shaders/chunks/soft_fragment.glsl.ts","../src/shaders/particle_vert.glsl.ts","../src/VFXBatch.ts","../src/shaders/particle_frag.glsl.ts","../src/shaders/local_particle_vert.glsl.ts","../src/shaders/local_particle_physics_vert.glsl.ts","../src/shaders/particle_physics_frag.glsl.ts","../src/shaders/stretched_bb_particle_vert.glsl.ts","../src/shaders/trail_vert.glsl.ts","../src/shaders/trail_frag.glsl.ts","../src/SpriteBatch.ts","../src/TrailBatch.ts","../src/BatchedRenderer.ts","../src/BatchedParticleRenderer.ts","../src/ParticleEmitter.ts","../src/ParticleSystem.ts","../src/QuarksUtil.ts","../src/QuarksPrefab.ts","../src/QuarksLoader.ts","../src/materials/ParticleMaterials.ts","../src/index.ts"],"sourcesContent":["import {Mesh} from '@babylonjs/core/Meshes/mesh';\r\nimport {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\r\nimport {\r\n Particle,\r\n EmitterShape,\r\n ShapeJSON,\r\n IParticleSystem,\r\n Vector3,\r\n Plugin,\r\n} from 'quarks.core';\r\n\r\nexport class MeshSurfaceEmitter implements EmitterShape {\r\n type = 'mesh_surface';\r\n\r\n private _triangleIndexToArea: number[] = [];\r\n private _mesh?: Mesh;\r\n private _positions?: Float32Array;\r\n private _indices?: Uint32Array | Int32Array;\r\n private _meshReferenceId?: string;\r\n\r\n get mesh() {\r\n return this._mesh;\r\n }\r\n\r\n set mesh(mesh: Mesh | undefined) {\r\n this._mesh = mesh;\r\n if (!mesh) return;\r\n\r\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = mesh.getIndices();\r\n if (!positions || !indices) return;\r\n\r\n this._positions = new Float32Array(positions);\r\n this._indices = new Int32Array(indices);\r\n\r\n this._triangleIndexToArea.length = 0;\r\n let area = 0;\r\n const triCount = indices.length / 3;\r\n this._triangleIndexToArea.push(0);\r\n\r\n const a = new Vector3();\r\n const b = new Vector3();\r\n const c = new Vector3();\r\n\r\n for (let i = 0; i < triCount; i++) {\r\n const i0 = indices[i * 3];\r\n const i1 = indices[i * 3 + 1];\r\n const i2 = indices[i * 3 + 2];\r\n\r\n a.set(positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2]);\r\n b.set(positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);\r\n c.set(positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);\r\n\r\n b.sub(a);\r\n c.sub(a);\r\n const cross = new Vector3();\r\n cross.crossVectors(b, c);\r\n area += cross.length() * 0.5;\r\n this._triangleIndexToArea.push(area);\r\n }\r\n }\r\n\r\n constructor(mesh?: Mesh, meshReferenceId?: string) {\r\n this._meshReferenceId = meshReferenceId;\r\n if (mesh) this.mesh = mesh;\r\n }\r\n\r\n initialize(p: Particle) {\r\n if (!this._positions || !this._indices) {\r\n p.position.set(0, 0, 0);\r\n p.velocity.set(0, 0, 1).multiplyScalar(p.startSpeed);\r\n return;\r\n }\r\n\r\n const triCount = this._triangleIndexToArea.length - 1;\r\n let left = 0, right = triCount;\r\n const target = Math.random() * this._triangleIndexToArea[triCount];\r\n\r\n while (left + 1 < right) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (target < this._triangleIndexToArea[mid]) {\r\n right = mid;\r\n } else {\r\n left = mid;\r\n }\r\n }\r\n\r\n let u1 = Math.random();\r\n let u2 = Math.random();\r\n if (u1 + u2 > 1) {\r\n u1 = 1 - u1;\r\n u2 = 1 - u2;\r\n }\r\n\r\n const idx0 = this._indices[left * 3];\r\n const idx1 = this._indices[left * 3 + 1];\r\n const idx2 = this._indices[left * 3 + 2];\r\n\r\n const ax = this._positions[idx0 * 3], ay = this._positions[idx0 * 3 + 1], az = this._positions[idx0 * 3 + 2];\r\n const bx = this._positions[idx1 * 3] - ax, by = this._positions[idx1 * 3 + 1] - ay, bz = this._positions[idx1 * 3 + 2] - az;\r\n const cx = this._positions[idx2 * 3] - ax, cy = this._positions[idx2 * 3 + 1] - ay, cz = this._positions[idx2 * 3 + 2] - az;\r\n\r\n p.position.set(ax + bx * u1 + cx * u2, ay + by * u1 + cy * u2, az + bz * u1 + cz * u2);\r\n\r\n const nx = by * cz - bz * cy;\r\n const ny = bz * cx - bx * cz;\r\n const nz = bx * cy - by * cx;\r\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz) || 1;\r\n p.velocity.set(nx / len, ny / len, nz / len).multiplyScalar(p.startSpeed);\r\n }\r\n\r\n toJSON(): ShapeJSON {\r\n return {type: 'mesh_surface', mesh: this._mesh ? (this._mesh as any).uniqueId?.toString() : this._meshReferenceId ?? ''};\r\n }\r\n\r\n static fromJSON(json: any): MeshSurfaceEmitter {\r\n return new MeshSurfaceEmitter(undefined, json?.mesh);\r\n }\r\n\r\n clone(): EmitterShape {\r\n return new MeshSurfaceEmitter(this._mesh, this._meshReferenceId);\r\n }\r\n\r\n update(_system: IParticleSystem, _delta: number): void {}\r\n}\r\n\r\nexport const MeshSurfaceEmitterPlugin: Plugin = {\r\n id: 'babylon.quarks',\r\n initialize: () => {},\r\n emitterShapes: [{\r\n type: 'mesh_surface',\r\n params: [['mesh', ['mesh']]],\r\n constructor: MeshSurfaceEmitter,\r\n loadJSON: (json: any) => MeshSurfaceEmitter.fromJSON(json),\r\n }],\r\n behaviors: [],\r\n};\r\n","import softFragment from './soft_fragment.glsl';\r\nimport softParsFragment from './soft_pars_fragment.glsl';\r\nimport softParsVertex from './soft_pars_vertex.glsl';\r\nimport softVertex from './soft_vertex.glsl';\r\nimport tileFragment from './tile_fragment.glsl';\r\nimport tileParsFragment from './tile_pars_fragment.glsl';\r\nimport tileParsVertex from './tile_pars_vertex.glsl';\r\nimport tileVertex from './tile_vertex.glsl';\r\n\r\nconst shaderChunks: Record<string, string> = {};\r\nlet registered = false;\r\n\r\nexport function registerShaderChunks(): void {\r\n if (registered) return;\r\n shaderChunks.tile_pars_vertex = tileParsVertex;\r\n shaderChunks.tile_vertex = tileVertex;\r\n shaderChunks.tile_pars_fragment = tileParsFragment;\r\n shaderChunks.tile_fragment = tileFragment;\r\n shaderChunks.soft_pars_vertex = softParsVertex;\r\n shaderChunks.soft_vertex = softVertex;\r\n shaderChunks.soft_pars_fragment = softParsFragment;\r\n shaderChunks.soft_fragment = softFragment;\r\n registered = true;\r\n}\r\n\r\nexport function getShaderChunk(chunkName: string): string | undefined {\r\n return shaderChunks[chunkName];\r\n}\r\n\r\nexport function getRegisteredShaderChunks(): Readonly<Record<string, string>> {\r\n return shaderChunks;\r\n}\r\n","export default /* glsl */ `\r\n#ifdef UV_TILE\r\n attribute float uvTile;\r\n uniform vec2 tileCount;\r\n\r\n mat3 makeTileTransform(float tileIndex) {\r\n float col = mod(tileIndex, tileCount.x);\r\n float row = (tileCount.y - floor(tileIndex / tileCount.x) - 1.0);\r\n return mat3(\r\n 1.0 / tileCount.x, 0.0, 0.0,\r\n 0.0, 1.0 / tileCount.y, 0.0,\r\n col / tileCount.x, row / tileCount.y, 1.0\r\n );\r\n }\r\n#else\r\n mat3 makeTileTransform(float tileIndex) {\r\n return mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);\r\n }\r\n#endif\r\n\r\n#if defined(USE_UV)\r\n varying vec2 vUv;\r\n #ifdef TILE_BLEND\r\n varying vec2 vUvNext;\r\n varying float vUvBlend;\r\n #endif\r\n#endif\r\n`;\r\n","export default /* glsl */ `\r\n#ifdef UV_TILE\r\n mat3 tileTransform = makeTileTransform(floor(uvTile));\r\n #ifdef TILE_BLEND\r\n mat3 nextTileTransform = makeTileTransform(ceil(uvTile));\r\n vUvBlend = fract(uvTile);\r\n #endif\r\n#else\r\n mat3 tileTransform = makeTileTransform(0.0);\r\n#endif\r\n\r\n#if defined(USE_UV)\r\n vUv = (tileTransform * vec3(uv, 1.0)).xy;\r\n #if defined(TILE_BLEND) && defined(UV_TILE)\r\n vUvNext = (nextTileTransform * vec3(uv, 1.0)).xy;\r\n #endif\r\n#endif\r\n`;\r\n","export default /* glsl */ `\r\n#if defined(USE_UV)\r\n varying vec2 vUv;\r\n #ifdef TILE_BLEND\r\n varying vec2 vUvNext;\r\n varying float vUvBlend;\r\n #endif\r\n#endif\r\n`;\r\n","export default /* glsl */ `\r\n#ifdef USE_MAP\r\n vec4 texelColor = texture2D(map, vUv);\r\n #ifdef TILE_BLEND\r\n texelColor = mix(texelColor, texture2D(map, vUvNext), vUvBlend);\r\n #endif\r\n diffuseColor *= texelColor;\r\n#endif\r\n`;\r\n","export default /* glsl */ `\r\n#ifdef SOFT_PARTICLES\r\n varying vec4 projPosition;\r\n varying float linearDepth;\r\n#endif\r\n`;\r\n","export default /* glsl */ `\r\n#ifdef SOFT_PARTICLES\r\n projPosition = gl_Position;\r\n linearDepth = -mvPosition.z;\r\n#endif\r\n`;\r\n","export default /* glsl */ `\r\n#ifdef SOFT_PARTICLES\r\n uniform sampler2D depthTexture;\r\n uniform vec4 projParams;\r\n uniform vec2 softParams;\r\n\r\n varying vec4 projPosition;\r\n varying float linearDepth;\r\n\r\n #define SOFT_NEAR_FADE softParams.x\r\n #define SOFT_INV_FADE_DISTANCE softParams.y\r\n\r\n #define zNear projParams.x\r\n #define zFar projParams.y\r\n\r\n float linearize_depth(float d) {\r\n return (zFar * zNear) / (zFar - d * (zFar - zNear));\r\n }\r\n#endif\r\n`;\r\n","export default /* glsl */ `\r\n#ifdef SOFT_PARTICLES\r\n\r\n vec2 p2 = projPosition.xy / projPosition.w;\r\n p2 = 0.5 * p2 + 0.5;\r\n\r\n float readDepth = texture2D(depthTexture, p2.xy).r;\r\n float viewDepth = linearize_depth(readDepth);\r\n float softParticlesFade = saturate(SOFT_INV_FADE_DISTANCE * ((viewDepth - SOFT_NEAR_FADE) - linearDepth));\r\n\r\n gl_FragColor *= softParticlesFade;\r\n#endif\r\n`;\r\n","export default /* glsl */ `\r\n// Per-vertex attributes\r\nattribute vec3 position;\r\nattribute vec2 uv;\r\n\r\n// Per-instance attributes\r\nattribute vec3 offset;\r\nattribute vec4 color;\r\nattribute vec3 size;\r\nattribute float rotation;\r\nattribute float uvTile;\r\n\r\n// Uniforms\r\nuniform mat4 world;\r\nuniform mat4 view;\r\nuniform mat4 projection;\r\nuniform mat4 worldViewProjection;\r\n\r\n#ifdef UV_TILE\r\nuniform float tileCountX;\r\nuniform float tileCountY;\r\n#endif\r\n\r\n// Varyings\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\n#ifdef TILE_BLEND\r\nvarying vec2 vUV2;\r\nvarying float vTileBlend;\r\n#endif\r\n#ifdef SOFT_PARTICLES\r\nvarying vec4 projPosition;\r\nvarying float linearDepth;\r\n#endif\r\n\r\nvoid main() {\r\n float c = cos(rotation);\r\n float s = sin(rotation);\r\n\r\n vec2 alignedPosition = position.xy * size.xy;\r\n vec2 rotatedPosition;\r\n rotatedPosition.x = c * alignedPosition.x - s * alignedPosition.y;\r\n rotatedPosition.y = s * alignedPosition.x + c * alignedPosition.y;\r\n\r\n#ifdef HORIZONTAL\r\n vec4 mvPosition = world * vec4(offset, 1.0);\r\n mvPosition.x += rotatedPosition.x;\r\n mvPosition.z -= rotatedPosition.y;\r\n mvPosition = view * mvPosition;\r\n#elif defined(VERTICAL)\r\n vec4 mvPosition = world * vec4(offset, 1.0);\r\n mvPosition.y += rotatedPosition.y;\r\n mvPosition = view * mvPosition;\r\n mvPosition.x += rotatedPosition.x;\r\n#else\r\n vec4 mvPosition = view * world * vec4(offset, 1.0);\r\n mvPosition.xy += rotatedPosition;\r\n#endif\r\n\r\n gl_Position = projection * mvPosition;\r\n#ifdef SOFT_PARTICLES\r\n projPosition = gl_Position;\r\n linearDepth = -mvPosition.z;\r\n#endif\r\n\r\n #ifdef UV_TILE\r\n vec2 tc = vec2(tileCountX, tileCountY);\r\n float baseTile = floor(uvTile);\r\n float tileU = mod(baseTile, tc.x) / tc.x;\r\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\r\n vUV = uv / tc + vec2(tileU, tileV);\r\n #ifdef TILE_BLEND\r\n float nextTile = ceil(uvTile);\r\n float nextU = mod(nextTile, tc.x) / tc.x;\r\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\r\n vUV2 = uv / tc + vec2(nextU, nextV);\r\n vTileBlend = fract(uvTile);\r\n #endif\r\n #else\r\n vUV = uv;\r\n #endif\r\n\r\n vColor = color;\r\n}\r\n`;\r\n","import {Mesh} from '@babylonjs/core/Meshes/mesh';\r\nimport {Scene} from '@babylonjs/core/scene';\r\nimport {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\r\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\r\nimport {IParticleSystem} from 'quarks.core';\r\nimport {VFXBatchSettings} from './BatchedRenderer';\r\n\r\nexport enum RenderMode {\r\n BillBoard = 0,\r\n StretchedBillBoard = 1,\r\n Mesh = 2,\r\n Trail = 3,\r\n HorizontalBillBoard = 4,\r\n VerticalBillBoard = 5,\r\n}\r\n\r\nexport interface StoredBatchSettings {\r\n instancingGeometry: Float32Array;\r\n instancingIndices: Uint32Array | Uint16Array;\r\n instancingUVs?: Float32Array;\r\n instancingNormals?: Float32Array;\r\n renderMode: RenderMode;\r\n renderOrder: number;\r\n uTileCount: number;\r\n vTileCount: number;\r\n blendTiles: boolean;\r\n softParticles: boolean;\r\n softNearFade: number;\r\n softFarFade: number;\r\n materialBlendMode: number;\r\n materialTransparent: boolean;\r\n materialDepthTest: boolean;\r\n materialDepthWrite: boolean;\r\n materialAlphaTest: number;\r\n texture: any;\r\n layerMask: number;\r\n}\r\n\r\nexport abstract class VFXBatch {\r\n mesh: Mesh;\r\n systems: Set<IParticleSystem>;\r\n settings: StoredBatchSettings;\r\n protected maxParticles: number;\r\n protected scene: Scene;\r\n\r\n protected constructor(settings: VFXBatchSettings, scene: Scene) {\r\n this.scene = scene;\r\n this.maxParticles = 1000;\r\n this.systems = new Set<IParticleSystem>();\r\n this.settings = {\r\n instancingGeometry: settings.instancingGeometry,\r\n instancingIndices: settings.instancingIndices,\r\n instancingUVs: settings.instancingUVs,\r\n instancingNormals: settings.instancingNormals,\r\n renderMode: settings.renderMode,\r\n renderOrder: settings.renderOrder,\r\n uTileCount: settings.uTileCount,\r\n vTileCount: settings.vTileCount,\r\n blendTiles: settings.blendTiles,\r\n softParticles: settings.softParticles,\r\n softNearFade: settings.softNearFade,\r\n softFarFade: settings.softFarFade,\r\n materialBlendMode: settings.materialBlendMode,\r\n materialTransparent: settings.materialTransparent,\r\n materialDepthTest: settings.materialDepthTest,\r\n materialDepthWrite: settings.materialDepthWrite,\r\n materialAlphaTest: settings.materialAlphaTest,\r\n texture: settings.texture,\r\n layerMask: settings.layerMask,\r\n };\r\n this.mesh = new Mesh('vfxBatch', scene);\r\n this.mesh.alwaysSelectAsActiveMesh = true;\r\n }\r\n\r\n addSystem(system: IParticleSystem) {\r\n this.systems.add(system);\r\n }\r\n\r\n removeSystem(system: IParticleSystem) {\r\n this.systems.delete(system);\r\n }\r\n\r\n getVisibleSystems(): IParticleSystem[] {\r\n return Array.from(this.systems).filter((system) => system.emitter.visible);\r\n }\r\n\r\n applyDepthTexture(depthTexture: BaseTexture | null): void {\r\n const material = this.mesh.material;\r\n if (material && material instanceof ShaderMaterial) {\r\n material.setTexture('depthTexture', depthTexture);\r\n }\r\n }\r\n\r\n abstract setupBuffers(): void;\r\n abstract expandBuffers(target: number): void;\r\n abstract rebuildMaterial(): void;\r\n abstract update(): void;\r\n\r\n dispose(): void {\r\n this.mesh.dispose();\r\n }\r\n}\r\n","export default /* glsl */ `\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\n\r\n#ifdef TILE_BLEND\r\nvarying vec2 vUV2;\r\nvarying float vTileBlend;\r\n#endif\r\n\r\n#ifdef USE_MAP\r\nuniform sampler2D map;\r\n#endif\r\n\r\n#ifdef SOFT_PARTICLES\r\nuniform sampler2D depthTexture;\r\nuniform vec2 softParams;\r\nuniform vec4 projParams;\r\nvarying vec4 projPosition;\r\nvarying float linearDepth;\r\n#endif\r\n\r\n#ifdef USE_ALPHATEST\r\nuniform float alphaTest;\r\n#endif\r\n\r\nvoid main() {\r\n vec4 baseColor = vColor;\r\n\r\n#ifdef USE_MAP\r\n vec4 texColor = texture2D(map, vUV);\r\n #ifdef TILE_BLEND\r\n vec4 texColor2 = texture2D(map, vUV2);\r\n texColor = mix(texColor, texColor2, vTileBlend);\r\n #endif\r\n baseColor *= texColor;\r\n#endif\r\n\r\n#ifdef USE_COLOR_AS_ALPHA\r\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\r\n#endif\r\n\r\n#ifdef USE_ALPHATEST\r\n if (baseColor.a < alphaTest) discard;\r\n#else\r\n if (baseColor.a < 0.01) discard;\r\n#endif\r\n\r\n gl_FragColor = baseColor;\r\n\r\n#ifdef SOFT_PARTICLES\r\n vec2 p2 = projPosition.xy / projPosition.w;\r\n p2 = 0.5 * p2 + 0.5;\r\n float readDepth = texture2D(depthTexture, p2.xy).r;\r\n float zNear = projParams.x;\r\n float zFar = projParams.y;\r\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\r\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\r\n gl_FragColor *= fade;\r\n#endif\r\n}\r\n`;\r\n","export default /* glsl */ `\r\n// Per-vertex attributes\r\nattribute vec3 position;\r\nattribute vec2 uv;\r\n\r\n// Per-instance attributes\r\nattribute vec3 offset;\r\nattribute vec4 color;\r\nattribute vec3 size;\r\nattribute vec4 rotation;\r\nattribute float uvTile;\r\n\r\n// Uniforms\r\nuniform mat4 worldViewProjection;\r\n\r\n#ifdef UV_TILE\r\nuniform float tileCountX;\r\nuniform float tileCountY;\r\n#endif\r\n\r\n// Varyings\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\n\r\nvec3 applyQuaternion(vec3 v, vec4 q) {\r\n vec3 qVec = q.xyz;\r\n float qW = q.w;\r\n vec3 t = 2.0 * cross(qVec, v);\r\n return v + qW * t + cross(qVec, t);\r\n}\r\n\r\nvoid main() {\r\n vec3 rotatedPosition = applyQuaternion(position * size, rotation);\r\n vec3 worldPos = rotatedPosition + offset;\r\n\r\n gl_Position = worldViewProjection * vec4(worldPos, 1.0);\r\n\r\n #ifdef UV_TILE\r\n vec2 tc = vec2(tileCountX, tileCountY);\r\n float baseTile = floor(uvTile);\r\n float tileU = mod(baseTile, tc.x) / tc.x;\r\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\r\n vUV = uv / tc + vec2(tileU, tileV);\r\n #else\r\n vUV = uv;\r\n #endif\r\n\r\n vColor = color;\r\n}\r\n`;\r\n","export default /* glsl */ `\r\nattribute vec3 position;\r\nattribute vec2 uv;\r\nattribute vec3 normal;\r\nattribute vec3 offset;\r\nattribute vec4 color;\r\nattribute vec3 size;\r\nattribute vec4 rotation;\r\nattribute float uvTile;\r\n\r\nuniform mat4 world;\r\nuniform mat4 view;\r\nuniform mat4 projection;\r\n\r\n#ifdef UV_TILE\r\nuniform float tileCountX;\r\nuniform float tileCountY;\r\n#endif\r\n\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\nvarying vec3 vNormal;\r\nvarying vec3 vWorldPos;\r\n\r\n#ifdef SOFT_PARTICLES\r\nvarying vec4 projPosition;\r\nvarying float linearDepth;\r\n#endif\r\n\r\nvec3 applyQuaternion(vec3 v, vec4 q) {\r\n vec3 qVec = q.xyz;\r\n float qW = q.w;\r\n vec3 t = 2.0 * cross(qVec, v);\r\n return v + qW * t + cross(qVec, t);\r\n}\r\n\r\nvoid main() {\r\n vec3 scaledPosition = position * size;\r\n vec3 rotatedPosition = applyQuaternion(scaledPosition, rotation);\r\n vec3 rotatedNormal = normalize(applyQuaternion(normal, rotation));\r\n vec3 localPos = rotatedPosition + offset;\r\n\r\n vec4 worldPos = world * vec4(localPos, 1.0);\r\n vec4 viewPos = view * worldPos;\r\n gl_Position = projection * viewPos;\r\n\r\n vWorldPos = worldPos.xyz;\r\n vNormal = normalize((world * vec4(rotatedNormal, 0.0)).xyz);\r\n\r\n#ifdef SOFT_PARTICLES\r\n projPosition = gl_Position;\r\n linearDepth = -viewPos.z;\r\n#endif\r\n\r\n#ifdef UV_TILE\r\n vec2 tc = vec2(tileCountX, tileCountY);\r\n float tileU = mod(uvTile, tc.x) / tc.x;\r\n float tileV = 1.0 - floor(uvTile / tc.x) / tc.y - 1.0 / tc.y;\r\n vUV = uv / tc + vec2(tileU, tileV);\r\n#else\r\n vUV = uv;\r\n#endif\r\n\r\n vColor = color;\r\n}\r\n`;\r\n","export default /* glsl */ `\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\nvarying vec3 vNormal;\r\n\r\nuniform vec3 lightDirection;\r\nuniform vec3 lightColor;\r\nuniform vec3 ambientColor;\r\n\r\n#ifdef TILE_BLEND\r\nvarying vec2 vUV2;\r\nvarying float vTileBlend;\r\n#endif\r\n\r\n#ifdef USE_MAP\r\nuniform sampler2D map;\r\n#endif\r\n\r\n#ifdef SOFT_PARTICLES\r\nuniform sampler2D depthTexture;\r\nuniform vec2 softParams;\r\nuniform vec4 projParams;\r\nvarying vec4 projPosition;\r\nvarying float linearDepth;\r\n#endif\r\n\r\n#ifdef USE_ALPHATEST\r\nuniform float alphaTest;\r\n#endif\r\n\r\nvoid main() {\r\n vec4 baseColor = vColor;\r\n\r\n#ifdef USE_MAP\r\n vec4 texColor = texture2D(map, vUV);\r\n #ifdef TILE_BLEND\r\n vec4 texColor2 = texture2D(map, vUV2);\r\n texColor = mix(texColor, texColor2, vTileBlend);\r\n #endif\r\n baseColor *= texColor;\r\n#endif\r\n\r\n#ifdef USE_ALPHATEST\r\n if (baseColor.a < alphaTest) discard;\r\n#else\r\n if (baseColor.a < 0.01) discard;\r\n#endif\r\n\r\n vec3 N = normalize(vNormal);\r\n vec3 L = normalize(-lightDirection);\r\n float NdotL = max(dot(N, L), 0.0);\r\n vec3 litColor = ambientColor + lightColor * NdotL;\r\n\r\n gl_FragColor = vec4(baseColor.rgb * litColor, baseColor.a);\r\n\r\n#ifdef SOFT_PARTICLES\r\n vec2 p2 = projPosition.xy / projPosition.w;\r\n p2 = 0.5 * p2 + 0.5;\r\n float readDepth = texture2D(depthTexture, p2.xy).r;\r\n float zNear = projParams.x;\r\n float zFar = projParams.y;\r\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\r\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\r\n gl_FragColor *= fade;\r\n#endif\r\n}\r\n`;\r\n","export default /* glsl */ `\r\n// Per-vertex attributes\r\nattribute vec3 position;\r\nattribute vec2 uv;\r\n\r\n// Per-instance attributes\r\nattribute vec3 offset;\r\nattribute vec4 color;\r\nattribute vec3 size;\r\nattribute float rotation;\r\nattribute float uvTile;\r\nattribute vec4 velocity;\r\n\r\n// Uniforms\r\nuniform mat4 world;\r\nuniform mat4 view;\r\nuniform mat4 projection;\r\nuniform float speedFactor;\r\n\r\n#ifdef UV_TILE\r\nuniform float tileCountX;\r\nuniform float tileCountY;\r\n#endif\r\n\r\n// Varyings\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\n#ifdef TILE_BLEND\r\nvarying vec2 vUV2;\r\nvarying float vTileBlend;\r\n#endif\r\n#ifdef SOFT_PARTICLES\r\nvarying vec4 projPosition;\r\nvarying float linearDepth;\r\n#endif\r\n\r\nvoid main() {\r\n float lengthFactor = velocity.w;\r\n float avgSize = (size.x + size.y) * 0.5;\r\n vec4 mvPosition = view * world * vec4(offset, 1.0);\r\n vec3 viewVelocity = mat3(view * world) * velocity.xyz;\r\n float vlength = length(viewVelocity);\r\n if (vlength < 0.0001) {\r\n vlength = 0.0001;\r\n viewVelocity = vec3(0.0, 0.0, 1.0);\r\n }\r\n mvPosition.xyz += position.y * normalize(cross(mvPosition.xyz, viewVelocity)) * avgSize;\r\n mvPosition.xyz -= (position.x + 0.5) * viewVelocity * (1.0 + lengthFactor / vlength) * avgSize;\r\n gl_Position = projection * mvPosition;\r\n#ifdef SOFT_PARTICLES\r\n projPosition = gl_Position;\r\n linearDepth = -mvPosition.z;\r\n#endif\r\n\r\n #ifdef UV_TILE\r\n vec2 tc = vec2(tileCountX, tileCountY);\r\n float baseTile = floor(uvTile);\r\n float tileU = mod(baseTile, tc.x) / tc.x;\r\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\r\n vUV = uv / tc + vec2(tileU, tileV);\r\n #ifdef TILE_BLEND\r\n float nextTile = ceil(uvTile);\r\n float nextU = mod(nextTile, tc.x) / tc.x;\r\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\r\n vUV2 = uv / tc + vec2(nextU, nextV);\r\n vTileBlend = fract(uvTile);\r\n #endif\r\n #else\r\n vUV = uv;\r\n #endif\r\n\r\n vColor = color;\r\n}\r\n`;\r\n","export default /* glsl */ `\r\nattribute vec3 position;\r\nattribute vec3 previous;\r\nattribute vec3 next;\r\nattribute float side;\r\nattribute float width;\r\nattribute vec2 uv;\r\nattribute vec4 color;\r\n\r\nuniform mat4 view;\r\nuniform mat4 projection;\r\nuniform float lineWidth;\r\nuniform vec2 resolution;\r\nuniform float sizeAttenuation;\r\n\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\n\r\nvec2 fix(vec4 i, float aspect) {\r\n vec2 res = i.xy / i.w;\r\n res.x *= aspect;\r\n return res;\r\n}\r\n\r\nvoid main() {\r\n float aspect = resolution.x / resolution.y;\r\n vec4 finalPosition = projection * view * vec4(position, 1.0);\r\n vec4 prevPos = projection * view * vec4(previous, 1.0);\r\n vec4 nextPos = projection * view * vec4(next, 1.0);\r\n\r\n vec2 currentP = fix(finalPosition, aspect);\r\n vec2 prevP = fix(prevPos, aspect);\r\n vec2 nextP = fix(nextPos, aspect);\r\n\r\n float w = lineWidth * width;\r\n vec2 dir;\r\n if (distance(nextP, currentP) < 0.0001) {\r\n dir = normalize(currentP - prevP);\r\n } else if (distance(prevP, currentP) < 0.0001) {\r\n dir = normalize(nextP - currentP);\r\n } else {\r\n vec2 dir1 = normalize(currentP - prevP);\r\n vec2 dir2 = normalize(nextP - currentP);\r\n dir = normalize(dir1 + dir2);\r\n }\r\n vec4 normal = vec4(-dir.y, dir.x, 0.0, 1.0);\r\n normal.xy *= 0.5 * w;\r\n normal *= projection;\r\n if (sizeAttenuation == 0.0) {\r\n normal.xy *= finalPosition.w;\r\n normal.xy /= (vec4(resolution, 0.0, 1.0) * projection).xy;\r\n }\r\n finalPosition.xy += normal.xy * side;\r\n gl_Position = finalPosition;\r\n vUV = uv;\r\n vColor = color;\r\n}\r\n`;\r\n","export default /* glsl */ `\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\n\r\n#ifdef USE_MAP\r\nuniform sampler2D map;\r\n#endif\r\n\r\nvoid main() {\r\n vec4 baseColor = vColor;\r\n\r\n#ifdef USE_MAP\r\n vec4 texColor = texture2D(map, vUV);\r\n baseColor *= texColor;\r\n#endif\r\n\r\n if (baseColor.a < 0.01) discard;\r\n\r\n gl_FragColor = baseColor;\r\n}\r\n`;\r\n","import {Mesh} from '@babylonjs/core/Meshes/mesh';\r\nimport {VertexData} from '@babylonjs/core/Meshes/mesh.vertexData';\r\nimport {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\r\nimport {Effect} from '@babylonjs/core/Materials/effect';\r\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\r\nimport {Scene} from '@babylonjs/core/scene';\r\nimport {Constants} from '@babylonjs/core/Engines/constants';\r\nimport {Vector2 as BVector2, Vector3 as BVector3, Vector4 as BVector4} from '@babylonjs/core/Maths/math.vector';\r\nimport {\r\n Vector3,\r\n Vector4,\r\n Quaternion,\r\n Matrix3,\r\n SpriteParticle,\r\n StretchedBillBoardSettings,\r\n} from 'quarks.core';\r\nimport {VFXBatch, RenderMode} from './VFXBatch';\r\nimport {VFXBatchSettings} from './BatchedRenderer';\r\nimport particle_vert from './shaders/particle_vert.glsl';\r\nimport particle_frag from './shaders/particle_frag.glsl';\r\nimport particle_physics_frag from './shaders/particle_physics_frag.glsl';\r\nimport stretched_bb_particle_vert from './shaders/stretched_bb_particle_vert.glsl';\r\nimport local_particle_physics_vert from './shaders/local_particle_physics_vert.glsl';\r\n\r\nexport class SpriteBatch extends VFXBatch {\r\n private offsetBuffer!: Float32Array;\r\n private rotationBuffer!: Float32Array;\r\n private sizeBuffer!: Float32Array;\r\n private colorBuffer!: Float32Array;\r\n private uvTileBuffer!: Float32Array;\r\n private velocityBuffer?: Float32Array;\r\n\r\n private offsetVB!: VertexBuffer;\r\n private rotationVB!: VertexBuffer;\r\n private sizeVB!: VertexBuffer;\r\n private colorVB!: VertexBuffer;\r\n private uvTileVB!: VertexBuffer;\r\n private velocityVB?: VertexBuffer;\r\n\r\n constructor(settings: VFXBatchSettings, scene: Scene) {\r\n super(settings, scene);\r\n this.maxParticles = 1000;\r\n this.setupBuffers();\r\n this.rebuildMaterial();\r\n }\r\n\r\n setupBuffers(): void {\r\n this.mesh.dispose();\r\n this.mesh = new Mesh('spriteBatch', this.scene);\r\n this.mesh.alwaysSelectAsActiveMesh = true;\r\n\r\n const vertexData = new VertexData();\r\n vertexData.positions = Array.from(this.settings.instancingGeometry);\r\n vertexData.indices = Array.from(this.settings.instancingIndices);\r\n if (this.settings.instancingUVs) {\r\n vertexData.uvs = Array.from(this.settings.instancingUVs);\r\n }\r\n if (this.settings.instancingNormals) {\r\n vertexData.normals = Array.from(this.settings.instancingNormals);\r\n }\r\n vertexData.applyToMesh(this.mesh, false);\r\n\r\n this.buildExpandableBuffers();\r\n }\r\n\r\n private buildExpandableBuffers(): void {\r\n const engine = this.scene.getEngine();\r\n\r\n this.offsetBuffer = new Float32Array(this.maxParticles * 3);\r\n this.offsetVB = new VertexBuffer(engine, this.offsetBuffer, 'offset', true, false, 3, true);\r\n this.mesh.setVerticesBuffer(this.offsetVB);\r\n\r\n this.colorBuffer = new Float32Array(this.maxParticles * 4);\r\n this.colorVB = new VertexBuffer(engine, this.colorBuffer, 'color', true, false, 4, true);\r\n this.mesh.setVerticesBuffer(this.colorVB);\r\n\r\n this.sizeBuffer = new Float32Array(this.maxParticles * 3);\r\n this.sizeVB = new VertexBuffer(engine, this.sizeBuffer, 'size', true, false, 3, true);\r\n this.mesh.setVerticesBuffer(this.sizeVB);\r\n\r\n this.uvTileBuffer = new Float32Array(this.maxParticles);\r\n this.uvTileVB = new VertexBuffer(engine, this.uvTileBuffer, 'uvTile', true, false, 1, true);\r\n this.mesh.setVerticesBuffer(this.uvTileVB);\r\n\r\n if (this.settings.renderMode === RenderMode.Mesh) {\r\n this.rotationBuffer = new Float32Array(this.maxParticles * 4);\r\n this.rotationVB = new VertexBuffer(engine, this.rotationBuffer, 'rotation', true, false, 4, true);\r\n } else {\r\n this.rotationBuffer = new Float32Array(this.maxParticles);\r\n this.rotationVB = new VertexBuffer(engine, this.rotationBuffer, 'rotation', true, false, 1, true);\r\n }\r\n this.mesh.setVerticesBuffer(this.rotationVB);\r\n\r\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\r\n this.velocityBuffer = new Float32Array(this.maxParticles * 4);\r\n this.velocityVB = new VertexBuffer(engine, this.velocityBuffer, 'velocity', true, false, 4, true);\r\n this.mesh.setVerticesBuffer(this.velocityVB);\r\n }\r\n\r\n this.mesh.forcedInstanceCount = 0;\r\n this.mesh.doNotSyncBoundingInfo = true;\r\n }\r\n\r\n expandBuffers(target: number): void {\r\n while (target >= this.maxParticles) {\r\n this.maxParticles *= 2;\r\n }\r\n this.setupBuffers();\r\n this.rebuildMaterial();\r\n }\r\n\r\n rebuildMaterial(): void {\r\n const shaderName = `quarksParticle_${this.settings.renderMode}_${Date.now()}`;\r\n let vertexShader: string;\r\n let fragmentShader: string;\r\n const defines: string[] = [];\r\n\r\n if (this.settings.renderMode === RenderMode.Mesh) {\r\n vertexShader = local_particle_physics_vert;\r\n fragmentShader = particle_physics_frag;\r\n } else if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\r\n vertexShader = stretched_bb_particle_vert;\r\n fragmentShader = particle_frag;\r\n } else {\r\n vertexShader = particle_vert;\r\n fragmentShader = particle_frag;\r\n }\r\n\r\n if (this.settings.texture) {\r\n defines.push('USE_MAP');\r\n }\r\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\r\n defines.push('UV_TILE');\r\n }\r\n if (this.settings.blendTiles) {\r\n defines.push('TILE_BLEND');\r\n }\r\n if (this.settings.softParticles) {\r\n defines.push('SOFT_PARTICLES');\r\n }\r\n if (this.settings.materialAlphaTest > 0) {\r\n defines.push('USE_ALPHATEST');\r\n }\r\n if (this.settings.renderMode === RenderMode.VerticalBillBoard) {\r\n defines.push('VERTICAL');\r\n }\r\n if (this.settings.renderMode === RenderMode.HorizontalBillBoard) {\r\n defines.push('HORIZONTAL');\r\n }\r\n\r\n Effect.ShadersStore[shaderName + 'VertexShader'] = vertexShader;\r\n Effect.ShadersStore[shaderName + 'FragmentShader'] = fragmentShader;\r\n\r\n const attributes = ['position', 'uv', 'offset', 'color', 'size', 'rotation', 'uvTile'];\r\n if (this.settings.renderMode === RenderMode.Mesh) {\r\n attributes.push('normal');\r\n }\r\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\r\n attributes.push('velocity');\r\n }\r\n\r\n const uniforms = ['world', 'view', 'projection', 'worldView', 'worldViewProjection'];\r\n const samplers: string[] = [];\r\n\r\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\r\n uniforms.push('tileCountX');\r\n uniforms.push('tileCountY');\r\n }\r\n if (this.settings.texture) {\r\n samplers.push('map');\r\n }\r\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\r\n uniforms.push('speedFactor');\r\n }\r\n if (this.settings.softParticles) {\r\n uniforms.push('softParams');\r\n uniforms.push('projParams');\r\n samplers.push('depthTexture');\r\n }\r\n if (this.settings.materialAlphaTest > 0) {\r\n uniforms.push('alphaTest');\r\n }\r\n if (this.settings.renderMode === RenderMode.Mesh) {\r\n uniforms.push('lightDirection');\r\n uniforms.push('lightColor');\r\n uniforms.push('ambientColor');\r\n }\r\n\r\n const mat = new ShaderMaterial(shaderName, this.scene,\r\n {vertex: shaderName, fragment: shaderName},\r\n {\r\n attributes,\r\n uniforms,\r\n samplers,\r\n defines,\r\n needAlphaBlending: this.settings.materialTransparent,\r\n }\r\n );\r\n\r\n if (this.settings.texture) {\r\n mat.setTexture('map', this.settings.texture);\r\n }\r\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\r\n mat.setFloat('tileCountX', this.settings.uTileCount);\r\n mat.setFloat('tileCountY', this.settings.vTileCount);\r\n }\r\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\r\n mat.setFloat('speedFactor', this.settings.softNearFade > 0 ? this.settings.softNearFade : 1.0);\r\n }\r\n if (this.settings.softParticles) {\r\n mat.setVector2('softParams', new BVector2(this.settings.softNearFade, 1.0 / Math.max(this.settings.softFarFade - this.settings.softNearFade, 0.0001)));\r\n mat.onBindObservable.add(() => {\r\n const camera = this.scene.activeCamera;\r\n if (camera) {\r\n mat.setVector4('projParams', new BVector4(camera.minZ, camera.maxZ, 0, 0));\r\n }\r\n });\r\n }\r\n if (this.settings.materialAlphaTest > 0) {\r\n mat.setFloat('alphaTest', this.settings.materialAlphaTest);\r\n }\r\n if (this.settings.renderMode === RenderMode.Mesh) {\r\n mat.setVector3('lightDirection', new BVector3(0.4, -1, 0.6));\r\n mat.setVector3('lightColor', new BVector3(1, 1, 1));\r\n mat.setVector3('ambientColor', new BVector3(0.35, 0.35, 0.35));\r\n }\r\n\r\n mat.backFaceCulling = false;\r\n\r\n if (this.settings.materialTransparent) {\r\n mat.alphaMode = this.settings.materialBlendMode;\r\n } else {\r\n mat.alphaMode = Constants.ALPHA_DISABLE;\r\n }\r\n mat.needDepthPrePass = this.settings.materialDepthWrite;\r\n mat.forceDepthWrite = this.settings.materialDepthWrite;\r\n mat.disableDepthWrite = !this.settings.materialDepthWrite;\r\n\r\n this.mesh.material = mat;\r\n }\r\n\r\n private vector_ = new Vector3();\r\n private vector2_ = new Vector3();\r\n private vector3_ = new Vector3();\r\n private quaternion_ = new Quaternion();\r\n private quaternion2_ = new Quaternion();\r\n private quaternion3_ = new Quaternion();\r\n private rotationMat_ = new Matrix3();\r\n private rotationMat2_ = new Matrix3();\r\n\r\n update(): void {\r\n let index = 0;\r\n let particleCount = 0;\r\n\r\n const visibleSystems = this.getVisibleSystems();\r\n for (const system of visibleSystems) {\r\n particleCount += system.particleNum;\r\n }\r\n if (particleCount > this.maxParticles) {\r\n this.expandBuffers(particleCount);\r\n }\r\n\r\n for (const system of visibleSystems) {\r\n const particles = system.particles;\r\n const particleNum = system.particleNum;\r\n const rotation = this.quaternion2_;\r\n const translation = this.vector2_;\r\n const scale = this.vector3_;\r\n system.emitter.matrixWorld.decompose(translation, rotation, scale);\r\n this.rotationMat_.setFromMatrix4(system.emitter.matrixWorld);\r\n\r\n for (let j = 0; j < particleNum; j++, index++) {\r\n const particle = particles[j] as SpriteParticle;\r\n\r\n if (this.settings.renderMode === RenderMode.Mesh) {\r\n let q: Quaternion;\r\n if (system.worldSpace) {\r\n q = particle.rotation as Quaternion;\r\n } else {\r\n let parentQ: Quaternion;\r\n if (particle.parentMatrix) {\r\n parentQ = this.quaternion3_.setFromRotationMatrix(particle.parentMatrix);\r\n } else {\r\n parentQ = rotation;\r\n }\r\n q = this.quaternion_;\r\n q.copy(parentQ).multiply(particle.rotation as Quaternion);\r\n }\r\n const ri = index * 4;\r\n this.rotationBuffer[ri] = q.x;\r\n this.rotationBuffer[ri + 1] = q.y;\r\n this.rotationBuffer[ri + 2] = q.z;\r\n this.rotationBuffer[ri + 3] = q.w;\r\n } else {\r\n this.rotationBuffer[index] = particle.rotation as number;\r\n }\r\n\r\n let vec: Vector3;\r\n if (system.worldSpace) {\r\n vec = particle.position;\r\n } else {\r\n vec = this.vector_;\r\n if (particle.parentMatrix) {\r\n vec.copy(particle.position).applyMatrix4(particle.parentMatrix);\r\n } else {\r\n vec.copy(particle.position).applyMatrix4(system.emitter.matrixWorld);\r\n }\r\n }\r\n\r\n const oi = index * 3;\r\n this.offsetBuffer[oi] = vec.x;\r\n this.offsetBuffer[oi + 1] = vec.y;\r\n this.offsetBuffer[oi + 2] = vec.z;\r\n\r\n const ci = index * 4;\r\n this.colorBuffer[ci] = particle.color.x;\r\n this.colorBuffer[ci + 1] = particle.color.y;\r\n this.colorBuffer[ci + 2] = particle.color.z;\r\n this.colorBuffer[ci + 3] = particle.color.w;\r\n\r\n const si = index * 3;\r\n if (system.worldSpace) {\r\n this.sizeBuffer[si] = particle.size.x;\r\n this.sizeBuffer[si + 1] = particle.size.y;\r\n this.sizeBuffer[si + 2] = particle.size.z;\r\n } else {\r\n if (particle.parentMatrix) {\r\n this.sizeBuffer[si] = particle.size.x;\r\n this.sizeBuffer[si + 1] = particle.size.y;\r\n this.sizeBuffer[si + 2] = particle.size.z;\r\n } else {\r\n this.sizeBuffer[si] = particle.size.x * Math.abs(scale.x);\r\n this.sizeBuffer[si + 1] = particle.size.y * Math.abs(scale.y);\r\n this.sizeBuffer[si + 2] = particle.size.z * Math.abs(scale.z);\r\n }\r\n }\r\n\r\n this.uvTileBuffer[index] = particle.uvTile;\r\n\r\n if (this.settings.renderMode === RenderMode.StretchedBillBoard && this.velocityBuffer) {\r\n let speedFactor = (system.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor;\r\n if (speedFactor === 0) speedFactor = 0.001;\r\n const lengthFactor = (system.rendererEmitterSettings as StretchedBillBoardSettings).lengthFactor;\r\n let vel: Vector3;\r\n if (system.worldSpace) {\r\n vel = particle.velocity;\r\n } else {\r\n vel = this.vector_;\r\n if (particle.parentMatrix) {\r\n this.rotationMat2_.setFromMatrix4(particle.parentMatrix);\r\n vel.copy(particle.velocity).applyMatrix3(this.rotationMat2_);\r\n } else {\r\n vel.copy(particle.velocity).applyMatrix3(this.rotationMat_);\r\n }\r\n }\r\n const vi = index * 4;\r\n this.velocityBuffer[vi] = vel.x * speedFactor;\r\n this.velocityBuffer[vi + 1] = vel.y * speedFactor;\r\n this.velocityBuffer[vi + 2] = vel.z * speedFactor;\r\n this.velocityBuffer[vi + 3] = lengthFactor;\r\n }\r\n }\r\n }\r\n\r\n if (this.settings.renderMode === RenderMode.StretchedBillBoard && this.mesh.material instanceof ShaderMaterial && visibleSystems.length > 0) {\r\n const speedFactor = (visibleSystems[0].rendererEmitterSettings as StretchedBillBoardSettings).speedFactor ?? 1.0;\r\n this.mesh.material.setFloat('speedFactor', speedFactor === 0 ? 0.001 : speedFactor);\r\n }\r\n\r\n this.mesh.forcedInstanceCount = index;\r\n this.mesh.setEnabled(index > 0);\r\n\r\n if (index > 0) {\r\n this.offsetVB.update(this.offsetBuffer);\r\n this.sizeVB.update(this.sizeBuffer);\r\n this.colorVB.update(this.colorBuffer);\r\n this.uvTileVB.update(this.uvTileBuffer);\r\n this.rotationVB.update(this.rotationBuffer);\r\n if (this.settings.renderMode === RenderMode.StretchedBillBoard && this.velocityVB && this.velocityBuffer) {\r\n this.velocityVB.update(this.velocityBuffer);\r\n }\r\n }\r\n }\r\n\r\n dispose(): void {\r\n if (this.mesh.material) {\r\n this.mesh.material.dispose();\r\n }\r\n super.dispose();\r\n }\r\n}\r\n","import {Mesh} from '@babylonjs/core/Meshes/mesh';\r\nimport {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\r\nimport {Effect} from '@babylonjs/core/Materials/effect';\r\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\r\nimport {Scene} from '@babylonjs/core/scene';\r\nimport {BoundingInfo} from '@babylonjs/core/Culling/boundingInfo';\r\nimport {Vector3 as BVector3} from '@babylonjs/core/Maths/math.vector';\r\nimport {Vector2 as BVector2} from '@babylonjs/core/Maths/math.vector';\r\nimport {Constants} from '@babylonjs/core/Engines/constants';\r\nimport {Matrix4, Quaternion, RecordState, TrailParticle, Vector3} from 'quarks.core';\r\nimport {VFXBatch, RenderMode} from './VFXBatch';\r\nimport {VFXBatchSettings} from './BatchedRenderer';\r\nimport trail_vert from './shaders/trail_vert.glsl';\r\nimport trail_frag from './shaders/trail_frag.glsl';\r\n\r\nexport class TrailBatch extends VFXBatch {\r\n private positionBuffer!: Float32Array;\r\n private previousBuffer!: Float32Array;\r\n private nextBuffer!: Float32Array;\r\n private uvBuffer!: Float32Array;\r\n private sideBuffer!: Float32Array;\r\n private widthBuffer!: Float32Array;\r\n private colorBuffer!: Float32Array;\r\n private indexBuffer!: Uint32Array;\r\n private previousVB!: VertexBuffer;\r\n private nextVB!: VertexBuffer;\r\n private sideVB!: VertexBuffer;\r\n private widthVB!: VertexBuffer;\r\n\r\n constructor(settings: VFXBatchSettings, scene: Scene) {\r\n super(settings, scene);\r\n this.maxParticles = 10000;\r\n this.setupBuffers();\r\n this.rebuildMaterial();\r\n this.mesh.setEnabled(false);\r\n }\r\n\r\n setupBuffers(): void {\r\n this.mesh.dispose();\r\n this.mesh = new Mesh('trailBatch', this.scene);\r\n this.mesh.alwaysSelectAsActiveMesh = true;\r\n\r\n this.positionBuffer = new Float32Array(this.maxParticles * 6);\r\n this.previousBuffer = new Float32Array(this.maxParticles * 6);\r\n this.nextBuffer = new Float32Array(this.maxParticles * 6);\r\n this.uvBuffer = new Float32Array(this.maxParticles * 4);\r\n this.sideBuffer = new Float32Array(this.maxParticles * 2);\r\n this.widthBuffer = new Float32Array(this.maxParticles * 2);\r\n this.colorBuffer = new Float32Array(this.maxParticles * 8);\r\n this.indexBuffer = new Uint32Array(this.maxParticles * 6);\r\n\r\n // Initialize with full-capacity buffers (updatable) and a dummy triangle\r\n this.positionBuffer[0] = 0; this.positionBuffer[1] = 0; this.positionBuffer[2] = 0;\r\n this.positionBuffer[3] = 1; this.positionBuffer[4] = 0; this.positionBuffer[5] = 0;\r\n this.positionBuffer[6] = 0; this.positionBuffer[7] = 1; this.positionBuffer[8] = 0;\r\n this.positionBuffer[9] = 1; this.positionBuffer[10] = 1; this.positionBuffer[11] = 0;\r\n this.indexBuffer[0] = 0; this.indexBuffer[1] = 1; this.indexBuffer[2] = 2;\r\n this.indexBuffer[3] = 1; this.indexBuffer[4] = 3; this.indexBuffer[5] = 2;\r\n\r\n // Set standard vertex data with full buffer capacity (updatable)\r\n this.mesh.setVerticesData(VertexBuffer.PositionKind, this.positionBuffer, true);\r\n this.mesh.setVerticesData(VertexBuffer.UVKind, this.uvBuffer, true);\r\n this.mesh.setVerticesData(VertexBuffer.ColorKind, this.colorBuffer, true, 4);\r\n this.mesh.setIndices(Array.from(this.indexBuffer.subarray(0, 6)), null, true);\r\n const engine = this.scene.getEngine();\r\n this.previousVB = new VertexBuffer(engine, this.previousBuffer, 'previous', true, false, 3, false);\r\n this.nextVB = new VertexBuffer(engine, this.nextBuffer, 'next', true, false, 3, false);\r\n this.sideVB = new VertexBuffer(engine, this.sideBuffer, 'side', true, false, 1, false);\r\n this.widthVB = new VertexBuffer(engine, this.widthBuffer, 'width', true, false, 1, false);\r\n this.mesh.setVerticesBuffer(this.previousVB);\r\n this.mesh.setVerticesBuffer(this.nextVB);\r\n this.mesh.setVerticesBuffer(this.sideVB);\r\n this.mesh.setVerticesBuffer(this.widthVB);\r\n\r\n // Disable bounding info recomputation\r\n this.mesh.doNotSyncBoundingInfo = true;\r\n const min = new BVector3(-10000, -10000, -10000);\r\n const max = new BVector3(10000, 10000, 10000);\r\n this.mesh.setBoundingInfo(new BoundingInfo(min, max));\r\n if (this.mesh.subMeshes) {\r\n for (const sub of this.mesh.subMeshes) {\r\n (sub as any)._boundingInfo = this.mesh.getBoundingInfo();\r\n }\r\n }\r\n\r\n }\r\n\r\n expandBuffers(target: number): void {\r\n while (target >= this.maxParticles) {\r\n this.maxParticles *= 2;\r\n }\r\n this.setupBuffers();\r\n this.rebuildMaterial();\r\n }\r\n\r\n rebuildMaterial(): void {\r\n const shaderName = `quarksTrail_${Date.now()}`;\r\n const defines: string[] = [];\r\n\r\n if (this.settings.texture) {\r\n defines.push('USE_MAP');\r\n }\r\n\r\n Effect.ShadersStore[shaderName + 'VertexShader'] = trail_vert;\r\n Effect.ShadersStore[shaderName + 'FragmentShader'] = trail_frag;\r\n\r\n const attributes = ['position', 'previous', 'next', 'side', 'width', 'uv', 'color'];\r\n const uniforms = ['world', 'view', 'projection', 'worldViewProjection', 'lineWidth', 'resolution', 'sizeAttenuation'];\r\n const samplers: string[] = [];\r\n\r\n if (this.settings.texture) {\r\n samplers.push('map');\r\n }\r\n\r\n const mat = new ShaderMaterial(shaderName, this.scene,\r\n {vertex: shaderName, fragment: shaderName},\r\n {\r\n attributes,\r\n uniforms,\r\n samplers,\r\n defines,\r\n needAlphaBlending: this.settings.materialTransparent,\r\n }\r\n );\r\n\r\n if (this.settings.texture) {\r\n mat.setTexture('map', this.settings.texture);\r\n }\r\n const engine = this.scene.getEngine();\r\n mat.setFloat('lineWidth', 1);\r\n mat.setVector2('resolution', new BVector2(engine.getRenderWidth(), engine.getRenderHeight()));\r\n mat.setFloat('sizeAttenuation', 1);\r\n mat.onBindObservable.add(() => {\r\n const renderEngine = this.scene.getEngine();\r\n mat.setVector2('resolution', new BVector2(renderEngine.getRenderWidth(), renderEngine.getRenderHeight()));\r\n });\r\n\r\n mat.backFaceCulling = false;\r\n\r\n if (this.settings.materialTransparent) {\r\n mat.alphaMode = this.settings.materialBlendMode;\r\n } else {\r\n mat.alphaMode = Constants.ALPHA_DISABLE;\r\n }\r\n mat.needDepthPrePass = this.settings.materialDepthWrite;\r\n mat.forceDepthWrite = this.settings.materialDepthWrite;\r\n mat.disableDepthWrite = !this.settings.materialDepthWrite;\r\n\r\n this.mesh.material = mat;\r\n }\r\n\r\n private vector_ = new Vector3();\r\n private vector2_ = new Vector3();\r\n private vector3_ = new Vector3();\r\n private quaternion_ = new Quaternion();\r\n\r\n update(): void {\r\n let index = 0;\r\n let triangles = 0;\r\n\r\n let particleCount = 0;\r\n const visibleSystems = this.getVisibleSystems();\r\n for (const system of visibleSystems) {\r\n for (let j = 0; j < system.particleNum; j++) {\r\n particleCount += (system.particles[j] as TrailParticle).previous.length * 2;\r\n }\r\n }\r\n if (particleCount > this.maxParticles) {\r\n this.expandBuffers(particleCount);\r\n }\r\n\r\n for (const system of visibleSystems) {\r\n // Ensure world matrix is up to date\r\n if ((system.emitter as any).computeWorldMatrix) {\r\n (system.emitter as any).computeWorldMatrix(true);\r\n }\r\n const rotation = this.quaternion_;\r\n const translation = this.vector2_;\r\n const scale = this.vector3_;\r\n system.emitter.matrixWorld.decompose(translation, rotation, scale);\r\n\r\n const particles = system.particles;\r\n const particleNum = system.particleNum;\r\n const uTileCount = this.settings.uTileCount;\r\n const vTileCount = this.settings.vTileCount;\r\n const tileWidth = 1 / uTileCount;\r\n const tileHeight = 1 / vTileCount;\r\n\r\n for (let j = 0; j < particleNum; j++) {\r\n const particle = particles[j] as TrailParticle;\r\n const col = particle.uvTile % vTileCount;\r\n const row = Math.floor(particle.uvTile / vTileCount + 0.001);\r\n\r\n const iter = particle.previous.values();\r\n let curIter = iter.next();\r\n let previous: RecordState = curIter.value as RecordState;\r\n let current: RecordState = previous;\r\n if (!curIter.done) curIter = iter.next();\r\n let next: RecordState;\r\n if (curIter.value !== undefined) {\r\n next = curIter.value as RecordState;\r\n } else {\r\n next = current;\r\n }\r\n\r\n for (let i = 0; i < particle.previous.length; i++, index += 2) {\r\n let pos: Vector3;\r\n if (system.worldSpace) {\r\n pos = current.position;\r\n } else {\r\n if (particle.parentMatrix) {\r\n this.vector_.copy(current.position).applyMatrix4(particle.parentMatrix as unknown as Matrix4);\r\n } else {\r\n this.vector_.copy(current.position).applyMatrix4(system.emitter.matrixWorld);\r\n }\r\n pos = this.vector_;\r\n }\r\n const pi = index * 3;\r\n this.positionBuffer[pi] = pos.x;\r\n this.positionBuffer[pi + 1] = pos.y;\r\n this.positionBuffer[pi + 2] = pos.z;\r\n this.positionBuffer[pi + 3] = pos.x;\r\n this.positionBuffer[pi + 4] = pos.y;\r\n this.positionBuffer[pi + 5] = pos.z;\r\n\r\n let prevPos: Vector3;\r\n if (system.worldSpace) {\r\n prevPos = previous.position;\r\n } else {\r\n if (particle.parentMatrix) {\r\n this.vector_.copy(previous.position).applyMatrix4(particle.parentMatrix as unknown as Matrix4);\r\n } else {\r\n this.vector_.copy(previous.position).applyMatrix4(system.emitter.matrixWorld);\r\n }\r\n prevPos = this.vector_;\r\n }\r\n this.previousBuffer[pi] = prevPos.x;\r\n this.previousBuffer[pi + 1] = prevPos.y;\r\n this.previousBuffer[pi + 2] = prevPos.z;\r\n this.previousBuffer[pi + 3] = prevPos.x;\r\n this.previousBuffer[pi + 4] = prevPos.y;\r\n this.previousBuffer[pi + 5] = prevPos.z;\r\n\r\n let nextPos: Vector3;\r\n if (system.worldSpace) {\r\n nextPos = next.position;\r\n } else {\r\n if (particle.parentMatrix) {\r\n this.vector_.copy(next.position).applyMatrix4(particle.parentMatrix as unknown as Matrix4);\r\n } else {\r\n this.vector_.copy(next.position).applyMatrix4(system.emitter.matrixWorld);\r\n }\r\n nextPos = this.vector_;\r\n }\r\n this.nextBuffer[pi] = nextPos.x;\r\n this.nextBuffer[pi + 1] = nextPos.y;\r\n this.nextBuffer[pi + 2] = nextPos.z;\r\n this.nextBuffer[pi + 3] = nextPos.x;\r\n this.nextBuffer[pi + 4] = nextPos.y;\r\n this.nextBuffer[pi + 5] = nextPos.z;\r\n\r\n this.sideBuffer[index] = 1;\r\n this.sideBuffer[index + 1] = -1;\r\n\r\n if (system.worldSpace || particle.parentMatrix) {\r\n this.widthBuffer[index] = current.size;\r\n this.widthBuffer[index + 1] = current.size;\r\n } else {\r\n const objectScale = (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z)) / 3;\r\n this.widthBuffer[index] = current.size * objectScale;\r\n this.widthBuffer[index + 1] = current.size * objectScale;\r\n }\r\n\r\n const ui = index * 2;\r\n this.uvBuffer[ui] = (i / particle.previous.length + col) * tileWidth;\r\n this.uvBuffer[ui + 1] = (vTileCount - row - 1) * tileHeight;\r\n this.uvBuffer[ui + 2] = (i / particle.previous.length + col) * tileWidth;\r\n this.uvBuffer[ui + 3] = (vTileCount - row) * tileHeight;\r\n\r\n const cci = index * 4;\r\n this.colorBuffer[cci] = current.color.x;\r\n this.colorBuffer[cci + 1] = current.color.y;\r\n this.colorBuffer[cci + 2] = current.color.z;\r\n this.colorBuffer[cci + 3] = current.color.w;\r\n this.colorBuffer[cci + 4] = current.color.x;\r\n this.colorBuffer[cci + 5] = current.color.y;\r\n this.colorBuffer[cci + 6] = current.color.z;\r\n this.colorBuffer[cci + 7] = current.color.w;\r\n\r\n if (i + 1 < particle.previous.length) {\r\n this.indexBuffer[triangles * 3] = index;\r\n this.indexBuffer[triangles * 3 + 1] = index + 1;\r\n this.indexBuffer[triangles * 3 + 2] = index + 2;\r\n triangles++;\r\n this.indexBuffer[triangles * 3] = index + 2;\r\n this.indexBuffer[triangles * 3 + 1] = index + 1;\r\n this.indexBuffer[triangles * 3 + 2] = index + 3;\r\n triangles++;\r\n }\r\n\r\n previous = current;\r\n current = next;\r\n if (!curIter.done) {\r\n curIter = iter.next();\r\n if (curIter.value !== undefined) {\r\n next = curIter.value as RecordState;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (index > 0 && triangles > 0) {\r\n this.mesh.updateVerticesData(VertexBuffer.PositionKind, this.positionBuffer);\r\n this.mesh.updateVerticesData(VertexBuffer.UVKind, this.uvBuffer);\r\n this.mesh.updateIndices(Array.from(this.indexBuffer.subarray(0, triangles * 3)));\r\n this.previousVB.update(this.previousBuffer);\r\n this.nextVB.update(this.nextBuffer);\r\n this.sideVB.update(this.sideBuffer);\r\n this.widthVB.update(this.widthBuffer);\r\n\r\n const colorVB = this.mesh.getVertexBuffer(VertexBuffer.ColorKind);\r\n if (colorVB) colorVB.update(this.colorBuffer);\r\n\r\n this.mesh.setEnabled(true);\r\n if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\r\n const meshBoundingInfo = this.mesh.getBoundingInfo();\r\n for (const subMesh of this.mesh.subMeshes) {\r\n (subMesh as any)._boundingInfo = meshBoundingInfo;\r\n }\r\n this.mesh.subMeshes[0].indexCount = triangles * 3;\r\n this.mesh.subMeshes[0].verticesCount = index;\r\n }\r\n } else {\r\n this.mesh.setEnabled(false);\r\n }\r\n }\r\n\r\n dispose(): void {\r\n if (this.mesh.material) {\r\n this.mesh.material.dispose();\r\n }\r\n super.dispose();\r\n }\r\n}\r\n","import {TransformNode} from '@babylonjs/core/Meshes/transformNode';\r\nimport {Scene} from '@babylonjs/core/scene';\r\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\r\nimport {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\r\nimport {IParticleSystem} from 'quarks.core';\r\nimport {VFXBatch, RenderMode, StoredBatchSettings} from './VFXBatch';\r\nimport {SpriteBatch} from './SpriteBatch';\r\nimport {TrailBatch} from './TrailBatch';\r\nimport {ParticleSystem} from './ParticleSystem';\r\n\r\nexport interface VFXBatchSettings {\r\n instancingGeometry: Float32Array;\r\n instancingIndices: Uint32Array | Uint16Array;\r\n instancingUVs?: Float32Array;\r\n instancingNormals?: Float32Array;\r\n renderMode: RenderMode;\r\n renderOrder: number;\r\n uTileCount: number;\r\n vTileCount: number;\r\n blendTiles: boolean;\r\n softParticles: boolean;\r\n softNearFade: number;\r\n softFarFade: number;\r\n materialBlendMode: number;\r\n materialTransparent: boolean;\r\n materialDepthTest: boolean;\r\n materialDepthWrite: boolean;\r\n materialAlphaTest: number;\r\n texture: Texture | null;\r\n layerMask: number;\r\n}\r\n\r\nexport class BatchedRenderer extends TransformNode {\r\n batches: Array<VFXBatch> = [];\r\n systemToBatchIndex: Map<IParticleSystem, number> = new Map<IParticleSystem, number>();\r\n depthTexture: BaseTexture | null = null;\r\n\r\n constructor(name: string, scene: Scene) {\r\n super(name, scene);\r\n }\r\n\r\n private static equals(a: StoredBatchSettings, b: VFXBatchSettings): boolean {\r\n return (\r\n a.materialBlendMode === b.materialBlendMode &&\r\n a.materialTransparent === b.materialTransparent &&\r\n a.materialDepthTest === b.materialDepthTest &&\r\n a.materialDepthWrite === b.materialDepthWrite &&\r\n a.materialAlphaTest === b.materialAlphaTest &&\r\n a.texture === b.texture &&\r\n a.renderMode === b.renderMode &&\r\n a.blendTiles === b.blendTiles &&\r\n a.softParticles === b.softParticles &&\r\n a.softFarFade === b.softFarFade &&\r\n a.softNearFade === b.softNearFade &&\r\n a.uTileCount === b.uTileCount &&\r\n a.vTileCount === b.vTileCount &&\r\n a.instancingGeometry === b.instancingGeometry &&\r\n a.renderOrder === b.renderOrder &&\r\n a.layerMask === b.layerMask\r\n );\r\n }\r\n\r\n addSystem(system: IParticleSystem) {\r\n (system as unknown as ParticleSystem)._renderer = this;\r\n const settings = (system as unknown as ParticleSystem).getRendererSettings();\r\n for (let i = 0; i < this.batches.length; i++) {\r\n if (BatchedRenderer.equals(this.batches[i].settings, settings)) {\r\n this.batches[i].addSystem(system);\r\n this.systemToBatchIndex.set(system, i);\r\n return;\r\n }\r\n }\r\n let batch: VFXBatch;\r\n const scene = this.getScene();\r\n switch (settings.renderMode) {\r\n case RenderMode.Trail:\r\n batch = new TrailBatch(settings, scene);\r\n break;\r\n case RenderMode.Mesh:\r\n case RenderMode.BillBoard:\r\n case RenderMode.VerticalBillBoard:\r\n case RenderMode.HorizontalBillBoard:\r\n case RenderMode.StretchedBillBoard:\r\n batch = new SpriteBatch(settings, scene);\r\n break;\r\n default:\r\n throw new Error(`Unsupported render mode: ${settings.renderMode}`);\r\n }\r\n batch.mesh.parent = this;\r\n if (this.depthTexture) {\r\n batch.applyDepthTexture(this.depthTexture);\r\n }\r\n batch.addSystem(system);\r\n this.batches.push(batch);\r\n this.systemToBatchIndex.set(system, this.batches.length - 1);\r\n }\r\n\r\n deleteSystem(system: IParticleSystem) {\r\n const batchIndex = this.systemToBatchIndex.get(system);\r\n if (batchIndex !== undefined) {\r\n this.batches[batchIndex].removeSystem(system);\r\n this.systemToBatchIndex.delete(system);\r\n }\r\n }\r\n\r\n updateSystem(system: IParticleSystem) {\r\n this.deleteSystem(system);\r\n this.addSystem(system);\r\n }\r\n\r\n setDepthTexture(depthTexture: BaseTexture | null) {\r\n this.depthTexture = depthTexture;\r\n for (const batch of this.batches) {\r\n batch.applyDepthTexture(depthTexture);\r\n }\r\n }\r\n\r\n update(delta: number) {\r\n this.systemToBatchIndex.forEach((_value, ps) => {\r\n (ps as any).update(delta);\r\n });\r\n for (let i = 0; i < this.batches.length; i++) {\r\n this.batches[i].update();\r\n }\r\n }\r\n\r\n dispose(): void {\r\n for (const batch of this.batches) {\r\n batch.dispose();\r\n }\r\n this.batches = [];\r\n this.systemToBatchIndex.clear();\r\n super.dispose();\r\n }\r\n}\r\n","import {BatchedRenderer} from './BatchedRenderer';\r\n\r\nexport const BatchedParticleRenderer = BatchedRenderer;\r\n","import {TransformNode} from '@babylonjs/core/Meshes/transformNode';\r\nimport {Scene} from '@babylonjs/core/scene';\r\nimport {Matrix4, IParticleSystem, SerializationOptions} from 'quarks.core';\r\n\r\nexport class ParticleEmitter extends TransformNode {\r\n system: IParticleSystem;\r\n private _matrixWorld: Matrix4 = new Matrix4();\r\n\r\n get matrixWorld(): Matrix4 {\r\n const m = this.getWorldMatrix();\r\n const e = this._matrixWorld.elements;\r\n e[0] = m.m[0]; e[1] = m.m[1]; e[2] = m.m[2]; e[3] = m.m[3];\r\n e[4] = m.m[4]; e[5] = m.m[5]; e[6] = m.m[6]; e[7] = m.m[7];\r\n e[8] = m.m[8]; e[9] = m.m[9]; e[10] = m.m[10]; e[11] = m.m[11];\r\n e[12] = m.m[12]; e[13] = m.m[13]; e[14] = m.m[14]; e[15] = m.m[15];\r\n return this._matrixWorld;\r\n }\r\n\r\n get visible(): boolean {\r\n return this.isEnabled();\r\n }\r\n\r\n set visible(value: boolean) {\r\n this.setEnabled(value);\r\n }\r\n\r\n get uuid(): string {\r\n return this.uniqueId.toString();\r\n }\r\n\r\n constructor(system: IParticleSystem, scene?: Scene) {\r\n super('particleEmitter', scene || undefined);\r\n this.system = system;\r\n }\r\n\r\n dispose(): void {\r\n super.dispose();\r\n }\r\n\r\n extractFromCache(cache: any): any[] {\r\n const values: any[] = [];\r\n for (const key in cache) {\r\n const data = cache[key];\r\n if (data && typeof data === 'object') {\r\n delete data.metadata;\r\n }\r\n values.push(data);\r\n }\r\n return values;\r\n }\r\n\r\n clone(name?: string): ParticleEmitter {\r\n const clonedSystem = this.system.clone();\r\n const clonedEmitter = clonedSystem.emitter as ParticleEmitter;\r\n clonedEmitter.name = name ?? this.name;\r\n clonedEmitter.position.copyFrom(this.position);\r\n clonedEmitter.rotation.copyFrom(this.rotation);\r\n clonedEmitter.scaling.copyFrom(this.scaling);\r\n if (this.rotationQuaternion) {\r\n clonedEmitter.rotationQuaternion = this.rotationQuaternion.clone();\r\n }\r\n clonedEmitter.setEnabled(this.isEnabled());\r\n return clonedEmitter;\r\n }\r\n\r\n toJSON(meta?: any, options: SerializationOptions = {}): any {\r\n return {\r\n uuid: (this as any)._quarksUUID ?? this.uniqueId.toString(),\r\n type: 'ParticleEmitter',\r\n name: this.name,\r\n position: [this.position.x, this.position.y, this.position.z],\r\n rotation: [this.rotation.x, this.rotation.y, this.rotation.z],\r\n quaternion: this.rotationQuaternion\r\n ? [\r\n this.rotationQuaternion.x,\r\n this.rotationQuaternion.y,\r\n this.rotationQuaternion.z,\r\n this.rotationQuaternion.w,\r\n ]\r\n : undefined,\r\n scale: [this.scaling.x, this.scaling.y, this.scaling.z],\r\n visible: this.isEnabled(),\r\n ps: this.system.toJSON(meta, options),\r\n };\r\n }\r\n}\r\n","import {Scene} from '@babylonjs/core/scene';\r\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\r\nimport {Constants} from '@babylonjs/core/Engines/constants';\r\nimport {\r\n AxisAngleGenerator,\r\n ColorGenerator,\r\n ColorGeneratorFromJSON,\r\n ConstantColor,\r\n ConstantValue,\r\n FunctionColorGenerator,\r\n FunctionJSON,\r\n FunctionValueGenerator,\r\n GeneratorFromJSON,\r\n ValueGenerator,\r\n ValueGeneratorFromJSON,\r\n Behavior,\r\n BehaviorFromJSON,\r\n Particle,\r\n SpriteParticle,\r\n TrailParticle,\r\n EmitterFromJSON,\r\n EmitterShape,\r\n SphereEmitter,\r\n RendererEmitterSettings,\r\n RotationGenerator,\r\n IParticleSystem,\r\n EmissionState,\r\n GeneratorMemory,\r\n TrailSettings,\r\n StretchedBillBoardSettings,\r\n SerializationOptions,\r\n Vector3,\r\n Vector4,\r\n Matrix3,\r\n Matrix4,\r\n Quaternion,\r\n Vector3Generator,\r\n ParticleSystemEvent,\r\n ParticleSystemEventType,\r\n} from 'quarks.core';\r\nimport {ParticleEmitter} from './ParticleEmitter';\r\nimport {RenderMode} from './VFXBatch';\r\nimport {BatchedRenderer, VFXBatchSettings} from './BatchedRenderer';\r\n\r\nexport interface BurstParameters {\r\n time: number;\r\n count: ValueGenerator | FunctionValueGenerator;\r\n cycle: number;\r\n interval: number;\r\n probability: number;\r\n}\r\n\r\nconst UP = new Vector3(0, 0, 1);\r\nconst tempQ = new Quaternion();\r\nconst tempV = new Vector3();\r\nconst tempV2 = new Vector3();\r\nconst PREWARM_FPS = 60;\r\n\r\nconst DEFAULT_POSITIONS = new Float32Array([\r\n -0.5, -0.5, 0,\r\n 0.5, -0.5, 0,\r\n 0.5, 0.5, 0,\r\n -0.5, 0.5, 0,\r\n]);\r\nconst DEFAULT_UVS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);\r\nconst DEFAULT_INDICES = new Uint32Array([0, 1, 2, 0, 2, 3]);\r\n\r\nexport interface ParticleSystemParameters {\r\n autoDestroy?: boolean;\r\n looping?: boolean;\r\n prewarm?: boolean;\r\n duration?: number;\r\n shape?: EmitterShape;\r\n startLife?: ValueGenerator | FunctionValueGenerator;\r\n startSpeed?: ValueGenerator | FunctionValueGenerator;\r\n startRotation?: ValueGenerator | FunctionValueGenerator | RotationGenerator;\r\n startSize?: ValueGenerator | FunctionValueGenerator | Vector3Generator;\r\n startLength?: ValueGenerator | FunctionValueGenerator;\r\n startColor?: ColorGenerator | FunctionColorGenerator;\r\n emissionOverTime?: ValueGenerator | FunctionValueGenerator;\r\n emissionOverDistance?: ValueGenerator | FunctionValueGenerator;\r\n emissionBursts?: Array<BurstParameters>;\r\n onlyUsedByOther?: boolean;\r\n behaviors?: Array<Behavior>;\r\n instancingGeometry?: Float32Array;\r\n instancingIndices?: Uint32Array | Uint16Array;\r\n instancingUVs?: Float32Array;\r\n instancingNormals?: Float32Array;\r\n renderMode?: RenderMode;\r\n rendererEmitterSettings?: RendererEmitterSettings;\r\n speedFactor?: number;\r\n material?: any;\r\n texture?: Texture | null;\r\n startTileIndex?: ValueGenerator;\r\n uTileCount?: number;\r\n vTileCount?: number;\r\n blendTiles?: boolean;\r\n softParticles?: boolean;\r\n softFarFade?: number;\r\n softNearFade?: number;\r\n renderOrder?: number;\r\n worldSpace?: boolean;\r\n blendMode?: number;\r\n transparent?: boolean;\r\n depthTest?: boolean;\r\n depthWrite?: boolean;\r\n alphaTest?: number;\r\n layerMask?: number;\r\n scene?: Scene;\r\n}\r\n\r\nexport interface BurstParametersJSON {\r\n time: number;\r\n count: FunctionJSON | number;\r\n cycle: number;\r\n interval: number;\r\n probability: number;\r\n}\r\n\r\nexport interface ParticleSystemJSONParameters {\r\n version: string;\r\n autoDestroy: boolean;\r\n looping: boolean;\r\n prewarm: boolean;\r\n duration: number;\r\n shape: any;\r\n startLife: FunctionJSON;\r\n startSpeed: FunctionJSON;\r\n startRotation: FunctionJSON;\r\n startSize: FunctionJSON;\r\n startColor: FunctionJSON;\r\n emissionOverTime: FunctionJSON;\r\n emissionOverDistance: FunctionJSON;\r\n emissionBursts?: Array<BurstParametersJSON>;\r\n onlyUsedByOther: boolean;\r\n rendererEmitterSettings: RendererEmitterSettings;\r\n instancingGeometry?: any;\r\n renderMode: number;\r\n renderOrder?: number;\r\n speedFactor?: number;\r\n texture?: string;\r\n material?: string;\r\n layers?: number;\r\n startTileIndex: FunctionJSON | number;\r\n uTileCount: number;\r\n vTileCount: number;\r\n blendTiles?: boolean;\r\n softParticles?: boolean;\r\n softFarFade?: number;\r\n softNearFade?: number;\r\n blending?: number;\r\n transparent?: boolean;\r\n depthTest?: boolean;\r\n depthWrite?: boolean;\r\n alphaTest?: number;\r\n behaviors: Array<any>;\r\n worldSpace: boolean;\r\n}\r\n\r\nexport interface BabylonMetaData {\r\n textures: {[uuid: string]: Texture | null};\r\n materials: {[uuid: string]: any};\r\n geometries: {[uuid: string]: any};\r\n images?: {[uuid: string]: any};\r\n shapes?: {[uuid: string]: any};\r\n skeletons?: {[uuid: string]: any};\r\n animations?: {[uuid: string]: any};\r\n nodes?: {[uuid: string]: any};\r\n}\r\n\r\nexport class ParticleSystem implements IParticleSystem {\r\n private static serializationCounter = 0;\r\n\r\n autoDestroy: boolean;\r\n prewarm: boolean;\r\n looping: boolean;\r\n duration: number;\r\n startLife: ValueGenerator | FunctionValueGenerator;\r\n startSpeed: ValueGenerator | FunctionValueGenerator;\r\n startRotation: ValueGenerator | FunctionValueGenerator | RotationGenerator;\r\n startSize: ValueGenerator | FunctionValueGenerator | Vector3Generator;\r\n startColor: ColorGenerator | FunctionColorGenerator;\r\n startTileIndex: ValueGenerator;\r\n rendererEmitterSettings: RendererEmitterSettings;\r\n emissionOverTime: ValueGenerator | FunctionValueGenerator;\r\n emissionOverDistance: ValueGenerator | FunctionValueGenerator;\r\n emissionBursts: Array<BurstParameters>;\r\n onlyUsedByOther: boolean;\r\n worldSpace: boolean;\r\n particleNum: number;\r\n paused: boolean;\r\n particles: Array<Particle>;\r\n emitterShape: EmitterShape;\r\n emitter: ParticleEmitter;\r\n rendererSettings: VFXBatchSettings;\r\n neededToUpdateRender: boolean;\r\n behaviors: Array<Behavior>;\r\n emissionState: EmissionState;\r\n\r\n private prewarmed: boolean;\r\n private emitEnded: boolean;\r\n private markForDestroy: boolean;\r\n private temp: Vector3 = new Vector3();\r\n private normalMatrix: Matrix3 = new Matrix3();\r\n private memory: GeneratorMemory = [];\r\n private listeners: {[event: string]: Array<(event: ParticleSystemEvent) => void>} = {};\r\n private readonly layerMaskProxy: {mask: number};\r\n private materialRef: any = null;\r\n /** @internal **/\r\n _renderer?: BatchedRenderer;\r\n\r\n set time(time: number) {\r\n this.emissionState.time = time;\r\n }\r\n\r\n get time(): number {\r\n return this.emissionState.time;\r\n }\r\n\r\n get layers() {\r\n return this.layerMaskProxy;\r\n }\r\n\r\n get texture() {\r\n return this.rendererSettings.texture;\r\n }\r\n\r\n set texture(texture: Texture | null) {\r\n this.rendererSettings.texture = texture;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get material() {\r\n return this.materialRef;\r\n }\r\n\r\n set material(material: any) {\r\n this.materialRef = material;\r\n this.applyMaterialSettings(material);\r\n }\r\n\r\n get uTileCount() {\r\n return this.rendererSettings.uTileCount;\r\n }\r\n\r\n set uTileCount(u: number) {\r\n this.rendererSettings.uTileCount = u;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get vTileCount() {\r\n return this.rendererSettings.vTileCount;\r\n }\r\n\r\n set vTileCount(v: number) {\r\n this.rendererSettings.vTileCount = v;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get blendTiles() {\r\n return this.rendererSettings.blendTiles;\r\n }\r\n\r\n set blendTiles(v: boolean) {\r\n this.rendererSettings.blendTiles = v;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get softParticles() {\r\n return this.rendererSettings.softParticles;\r\n }\r\n\r\n set softParticles(v: boolean) {\r\n this.rendererSettings.softParticles = v;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get softNearFade() {\r\n return this.rendererSettings.softNearFade;\r\n }\r\n\r\n set softNearFade(v: number) {\r\n this.rendererSettings.softNearFade = v;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get softFarFade() {\r\n return this.rendererSettings.softFarFade;\r\n }\r\n\r\n set softFarFade(v: number) {\r\n this.rendererSettings.softFarFade = v;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get instancingGeometry(): Float32Array {\r\n return this.rendererSettings.instancingGeometry;\r\n }\r\n\r\n set instancingGeometry(geometry: Float32Array) {\r\n this.restart();\r\n this.particles.length = 0;\r\n this.rendererSettings.instancingGeometry = geometry;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get blending() {\r\n return this.rendererSettings.materialBlendMode;\r\n }\r\n\r\n set blending(blending: number) {\r\n this.rendererSettings.materialBlendMode = blending;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n get renderMode(): RenderMode {\r\n return this.rendererSettings.renderMode;\r\n }\r\n\r\n set renderMode(renderMode: RenderMode) {\r\n if (this.rendererSettings.renderMode !== renderMode) {\r\n let needRestart = false;\r\n if (this.rendererSettings.renderMode === RenderMode.Trail) {\r\n needRestart = true;\r\n }\r\n if (this.rendererSettings.renderMode === RenderMode.Mesh) {\r\n this.startRotation = new ConstantValue(0);\r\n }\r\n switch (renderMode) {\r\n case RenderMode.Trail:\r\n this.rendererEmitterSettings = {startLength: new ConstantValue(30), followLocalOrigin: false};\r\n needRestart = true;\r\n break;\r\n case RenderMode.Mesh:\r\n this.rendererEmitterSettings = {};\r\n this.startRotation = new AxisAngleGenerator(new Vector3(0, 1, 0), new ConstantValue(0));\r\n break;\r\n case RenderMode.StretchedBillBoard:\r\n this.rendererEmitterSettings = {speedFactor: 0, lengthFactor: 2};\r\n break;\r\n case RenderMode.BillBoard:\r\n case RenderMode.VerticalBillBoard:\r\n case RenderMode.HorizontalBillBoard:\r\n this.rendererEmitterSettings = {};\r\n break;\r\n }\r\n this.rendererSettings.renderMode = renderMode;\r\n if (needRestart) {\r\n this.restart();\r\n this.particles.length = 0;\r\n }\r\n this.neededToUpdateRender = true;\r\n }\r\n }\r\n\r\n get renderOrder(): number {\r\n return this.rendererSettings.renderOrder;\r\n }\r\n\r\n set renderOrder(renderOrder: number) {\r\n this.rendererSettings.renderOrder = renderOrder;\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n constructor(parameters: ParticleSystemParameters) {\r\n this.layerMaskProxy = {mask: parameters.layerMask ?? 0x0FFFFFFF};\r\n Object.defineProperty(this.layerMaskProxy, 'mask', {\r\n enumerable: true,\r\n get: () => this.rendererSettings.layerMask,\r\n set: (mask: number) => {\r\n this.rendererSettings.layerMask = mask;\r\n this.neededToUpdateRender = true;\r\n },\r\n });\r\n\r\n this.autoDestroy = parameters.autoDestroy ?? false;\r\n this.duration = parameters.duration ?? 1;\r\n this.looping = parameters.looping ?? true;\r\n this.prewarm = parameters.prewarm ?? false;\r\n this.startLife = parameters.startLife ?? new ConstantValue(5);\r\n this.startSpeed = parameters.startSpeed ?? new ConstantValue(0);\r\n this.startRotation = parameters.startRotation ?? new ConstantValue(0);\r\n this.startSize = parameters.startSize ?? new ConstantValue(1);\r\n this.startColor = parameters.startColor ?? new ConstantColor(new Vector4(1, 1, 1, 1));\r\n this.emissionOverTime = parameters.emissionOverTime ?? new ConstantValue(10);\r\n this.emissionOverDistance = parameters.emissionOverDistance ?? new ConstantValue(0);\r\n this.emissionBursts = parameters.emissionBursts ?? [];\r\n this.onlyUsedByOther = parameters.onlyUsedByOther ?? false;\r\n this.emitterShape = parameters.shape ?? new SphereEmitter();\r\n this.behaviors = parameters.behaviors ?? [];\r\n this.worldSpace = parameters.worldSpace ?? false;\r\n this.rendererEmitterSettings = parameters.rendererEmitterSettings ?? {};\r\n\r\n if (parameters.renderMode === RenderMode.StretchedBillBoard) {\r\n const settings = this.rendererEmitterSettings as StretchedBillBoardSettings;\r\n if (parameters.speedFactor !== undefined) {\r\n settings.speedFactor = parameters.speedFactor;\r\n }\r\n settings.speedFactor = settings.speedFactor ?? 0;\r\n settings.lengthFactor = settings.lengthFactor ?? 0;\r\n }\r\n\r\n this.rendererSettings = {\r\n instancingGeometry: parameters.instancingGeometry ?? DEFAULT_POSITIONS,\r\n instancingIndices: parameters.instancingIndices ?? DEFAULT_INDICES,\r\n instancingUVs: parameters.instancingUVs ?? DEFAULT_UVS,\r\n instancingNormals: parameters.instancingNormals,\r\n renderMode: parameters.renderMode ?? RenderMode.BillBoard,\r\n renderOrder: parameters.renderOrder ?? 0,\r\n uTileCount: parameters.uTileCount ?? 1,\r\n vTileCount: parameters.vTileCount ?? 1,\r\n blendTiles: parameters.blendTiles ?? false,\r\n softParticles: parameters.softParticles ?? false,\r\n softNearFade: parameters.softNearFade ?? 0,\r\n softFarFade: parameters.softFarFade ?? 0,\r\n materialBlendMode: parameters.blendMode ?? Constants.ALPHA_ADD,\r\n materialTransparent: parameters.transparent ?? true,\r\n materialDepthTest: parameters.depthTest ?? true,\r\n materialDepthWrite: parameters.depthWrite ?? false,\r\n materialAlphaTest: parameters.alphaTest ?? 0,\r\n texture: parameters.texture ?? null,\r\n layerMask: parameters.layerMask ?? 0x0FFFFFFF,\r\n };\r\n if (this.rendererSettings.renderMode === RenderMode.Mesh && !this.rendererSettings.instancingNormals) {\r\n this.rendererSettings.instancingNormals = ParticleSystem.createFallbackNormals(this.rendererSettings.instancingGeometry);\r\n }\r\n\r\n this.materialRef = parameters.material ?? null;\r\n this.applyMaterialSettings(this.materialRef, {\r\n blendMode: parameters.blendMode,\r\n transparent: parameters.transparent,\r\n depthTest: parameters.depthTest,\r\n depthWrite: parameters.depthWrite,\r\n alphaTest: parameters.alphaTest,\r\n texture: parameters.texture,\r\n layerMask: parameters.layerMask,\r\n });\r\n this.neededToUpdateRender = true;\r\n\r\n this.particles = [];\r\n this.startTileIndex = parameters.startTileIndex || new ConstantValue(0);\r\n this.emitter = new ParticleEmitter(this, parameters.scene);\r\n\r\n this.paused = false;\r\n this.particleNum = 0;\r\n this.emissionState = {\r\n isBursting: false,\r\n burstParticleIndex: 0,\r\n burstParticleCount: 0,\r\n burstIndex: 0,\r\n burstWaveIndex: 0,\r\n time: 0,\r\n waitEmiting: 0,\r\n travelDistance: 0,\r\n };\r\n\r\n this.emissionBursts.forEach((burst) => burst.count.startGen(this.memory));\r\n this.emissionOverDistance.startGen(this.memory);\r\n\r\n this.emitEnded = false;\r\n this.markForDestroy = false;\r\n this.prewarmed = false;\r\n }\r\n\r\n private applyMaterialSettings(\r\n material: any,\r\n overrides: {\r\n blendMode?: number;\r\n transparent?: boolean;\r\n depthTest?: boolean;\r\n depthWrite?: boolean;\r\n alphaTest?: number;\r\n texture?: Texture | null;\r\n layerMask?: number;\r\n } = {}\r\n ) {\r\n if (!this.rendererSettings) {\r\n return;\r\n }\r\n\r\n const resolvedTexture =\r\n overrides.texture !== undefined\r\n ? overrides.texture\r\n : (material?.albedoTexture ??\r\n material?.diffuseTexture ??\r\n material?.emissiveTexture ??\r\n material?.opacityTexture ??\r\n material?.baseTexture ??\r\n this.rendererSettings.texture ??\r\n null);\r\n const resolvedBlendMode =\r\n overrides.blendMode ??\r\n (typeof material?.alphaMode === 'number' ? material.alphaMode : this.rendererSettings.materialBlendMode);\r\n const resolvedTransparent =\r\n overrides.transparent ??\r\n (typeof material?.needAlphaBlending === 'function'\r\n ? material.needAlphaBlending()\r\n : typeof material?.alpha === 'number'\r\n ? material.alpha < 1\r\n : this.rendererSettings.materialTransparent);\r\n const resolvedDepthTest =\r\n overrides.depthTest ??\r\n (typeof material?.disableDepthTest === 'boolean'\r\n ? !material.disableDepthTest\r\n : this.rendererSettings.materialDepthTest);\r\n const resolvedDepthWrite =\r\n overrides.depthWrite ??\r\n (typeof material?.disableDepthWrite === 'boolean'\r\n ? !material.disableDepthWrite\r\n : typeof material?.forceDepthWrite === 'boolean'\r\n ? material.forceDepthWrite\r\n : this.rendererSettings.materialDepthWrite);\r\n const resolvedAlphaTest =\r\n overrides.alphaTest ??\r\n (typeof material?.alphaCutOff === 'number'\r\n ? material.alphaCutOff\r\n : typeof material?.alphaCutOffValue === 'number'\r\n ? material.alphaCutOffValue\r\n : this.rendererSettings.materialAlphaTest);\r\n\r\n this.rendererSettings.texture = resolvedTexture;\r\n this.rendererSettings.materialBlendMode = resolvedBlendMode;\r\n this.rendererSettings.materialTransparent = resolvedTransparent;\r\n this.rendererSettings.materialDepthTest = resolvedDepthTest;\r\n this.rendererSettings.materialDepthWrite = resolvedDepthWrite;\r\n this.rendererSettings.materialAlphaTest = resolvedAlphaTest;\r\n if (overrides.layerMask !== undefined) {\r\n this.rendererSettings.layerMask = overrides.layerMask;\r\n }\r\n this.neededToUpdateRender = true;\r\n }\r\n\r\n pause() { this.paused = true; }\r\n play() { this.paused = false; }\r\n stop() { this.restart(); this.pause(); }\r\n\r\n private spawn(count: number, emissionState: EmissionState, matrix: Matrix4) {\r\n tempQ.setFromRotationMatrix(matrix);\r\n const translation = tempV;\r\n const scale = tempV2;\r\n matrix.decompose(translation, tempQ, scale);\r\n\r\n for (let i = 0; i < count; i++) {\r\n emissionState.burstParticleIndex = i;\r\n this.particleNum++;\r\n while (this.particles.length < this.particleNum) {\r\n if (this.rendererSettings.renderMode === RenderMode.Trail) {\r\n this.particles.push(new TrailParticle());\r\n } else {\r\n this.particles.push(new SpriteParticle());\r\n }\r\n }\r\n const particle = this.particles[this.particleNum - 1];\r\n particle.reset();\r\n particle.speedModifier = 1;\r\n this.startColor.startGen(particle.memory);\r\n this.startColor.genColor(particle.memory, particle.startColor, this.emissionState.time);\r\n particle.color.copy(particle.startColor);\r\n this.startSpeed.startGen(particle.memory);\r\n particle.startSpeed = this.startSpeed.genValue(particle.memory, emissionState.time / this.duration);\r\n this.startLife.startGen(particle.memory);\r\n particle.life = this.startLife.genValue(particle.memory, emissionState.time / this.duration);\r\n particle.age = 0;\r\n this.startSize.startGen(particle.memory);\r\n if (this.startSize.type === 'vec3function') {\r\n (this.startSize as Vector3Generator).genValue(particle.memory, particle.startSize, emissionState.time / this.duration);\r\n } else {\r\n const size = (this.startSize as FunctionValueGenerator).genValue(particle.memory, emissionState.time / this.duration);\r\n particle.startSize.set(size, size, size);\r\n }\r\n this.startTileIndex.startGen(particle.memory);\r\n particle.uvTile = this.startTileIndex.genValue(particle.memory);\r\n particle.size.copy(particle.startSize);\r\n\r\n if (\r\n this.rendererSettings.renderMode === RenderMode.Mesh ||\r\n this.rendererSettings.renderMode === RenderMode.BillBoard ||\r\n this.rendererSettings.renderMode === RenderMode.VerticalBillBoard ||\r\n this.rendererSettings.renderMode === RenderMode.HorizontalBillBoard ||\r\n this.rendererSettings.renderMode === RenderMode.StretchedBillBoard\r\n ) {\r\n const sprite = particle as SpriteParticle;\r\n this.startRotation.startGen(particle.memory);\r\n if (this.rendererSettings.renderMode === RenderMode.Mesh) {\r\n if (!(sprite.rotation instanceof Quaternion)) {\r\n sprite.rotation = new Quaternion();\r\n }\r\n if (this.startRotation.type === 'rotation') {\r\n this.startRotation.genValue(particle.memory, sprite.rotation as Quaternion, 1, emissionState.time / this.duration);\r\n } else {\r\n (sprite.rotation as Quaternion).setFromAxisAngle(UP, this.startRotation.genValue(sprite.memory, emissionState.time / this.duration));\r\n }\r\n } else {\r\n if (this.startRotation.type === 'rotation') {\r\n sprite.rotation = 0;\r\n } else {\r\n sprite.rotation = this.startRotation.genValue(sprite.memory, emissionState.time / this.duration);\r\n }\r\n }\r\n } else if (this.rendererSettings.renderMode === RenderMode.Trail) {\r\n const trail = particle as TrailParticle;\r\n (this.rendererEmitterSettings as TrailSettings).startLength.startGen(trail.memory);\r\n trail.length = (this.rendererEmitterSettings as TrailSettings).startLength.genValue(trail.memory, emissionState.time / this.duration);\r\n }\r\n\r\n this.emitterShape.initialize(particle, emissionState);\r\n\r\n if (this.rendererSettings.renderMode === RenderMode.Trail && (this.rendererEmitterSettings as TrailSettings).followLocalOrigin) {\r\n const trail = particle as TrailParticle;\r\n trail.localPosition = new Vector3().copy(trail.position);\r\n }\r\n\r\n if (this.worldSpace) {\r\n particle.position.applyMatrix4(matrix);\r\n particle.startSize.multiply(scale).abs();\r\n particle.size.copy(particle.startSize);\r\n particle.velocity.multiply(scale).applyMatrix3(this.normalMatrix);\r\n if (particle.rotation && particle.rotation instanceof Quaternion) {\r\n particle.rotation.multiplyQuaternions(tempQ, particle.rotation);\r\n }\r\n } else {\r\n if (this.onlyUsedByOther) {\r\n particle.parentMatrix = matrix;\r\n }\r\n }\r\n\r\n for (let j = 0; j < this.behaviors.length; j++) {\r\n this.behaviors[j].initialize(particle, this);\r\n }\r\n }\r\n }\r\n\r\n endEmit() {\r\n this.emitEnded = true;\r\n if (this.autoDestroy) {\r\n this.markForDestroy = true;\r\n }\r\n this.fire({type: 'emitEnd', particleSystem: this});\r\n }\r\n\r\n dispose() {\r\n if (this._renderer) this._renderer.deleteSystem(this);\r\n this.emitter.dispose();\r\n this.fire({type: 'destroy', particleSystem: this});\r\n }\r\n\r\n restart() {\r\n this.memory.length = 0;\r\n this.paused = false;\r\n this.particleNum = 0;\r\n this.emissionState.isBursting = false;\r\n this.emissionState.burstIndex = 0;\r\n this.emissionState.burstWaveIndex = 0;\r\n this.emissionState.time = 0;\r\n this.emissionState.waitEmiting = 0;\r\n this.behaviors.forEach((behavior) => behavior.reset());\r\n this.emitEnded = false;\r\n this.markForDestroy = false;\r\n this.prewarmed = false;\r\n this.emissionBursts.forEach((burst) => burst.count.startGen(this.memory));\r\n this.emissionOverDistance.startGen(this.memory);\r\n }\r\n\r\n private firstTimeUpdate = true;\r\n\r\n /** @internal */\r\n update(delta: number) {\r\n if (this.paused) return;\r\n\r\n if (this.firstTimeUpdate) {\r\n this.firstTimeUpdate = false;\r\n this.emitter.computeWorldMatrix(true);\r\n }\r\n\r\n if (this.emitEnded && this.particleNum === 0) {\r\n if (this.markForDestroy) this.dispose();\r\n return;\r\n }\r\n\r\n if (this.looping && this.prewarm && !this.prewarmed) {\r\n this.prewarmed = true;\r\n for (let i = 0; i < this.duration * PREWARM_FPS; i++) {\r\n this.update(1.0 / PREWARM_FPS);\r\n }\r\n }\r\n\r\n if (delta > 0.1) {\r\n delta = 0.1;\r\n }\r\n\r\n if (this.neededToUpdateRender) {\r\n if (this._renderer) this._renderer.updateSystem(this);\r\n this.neededToUpdateRender = false;\r\n }\r\n\r\n if (!this.onlyUsedByOther) {\r\n this.emit(delta, this.emissionState, this.emitter.matrixWorld);\r\n }\r\n\r\n this.emitterShape.update(this, delta);\r\n for (let j = 0; j < this.behaviors.length; j++) {\r\n this.behaviors[j].frameUpdate(delta);\r\n for (let i = 0; i < this.particleNum; i++) {\r\n if (!this.particles[i].died) {\r\n this.behaviors[j].update(this.particles[i], delta);\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.particleNum; i++) {\r\n if (\r\n (this.rendererEmitterSettings as TrailSettings).followLocalOrigin &&\r\n (this.particles[i] as TrailParticle).localPosition\r\n ) {\r\n this.particles[i].position.copy((this.particles[i] as TrailParticle).localPosition!);\r\n if (this.particles[i].parentMatrix) {\r\n this.particles[i].position.applyMatrix4(this.particles[i].parentMatrix!);\r\n } else {\r\n this.particles[i].position.applyMatrix4(this.emitter.matrixWorld);\r\n }\r\n } else {\r\n this.particles[i].position.addScaledVector(this.particles[i].velocity, delta * this.particles[i].speedModifier);\r\n }\r\n this.particles[i].age += delta;\r\n }\r\n\r\n if (this.rendererSettings.renderMode === RenderMode.Trail) {\r\n for (let i = 0; i < this.particleNum; i++) {\r\n (this.particles[i] as TrailParticle).update();\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.particleNum; i++) {\r\n const particle = this.particles[i];\r\n if (particle.died && (!(particle instanceof TrailParticle) || particle.previous.length === 0)) {\r\n this.particles[i] = this.particles[this.particleNum - 1];\r\n this.particles[this.particleNum - 1] = particle;\r\n this.particleNum--;\r\n i--;\r\n this.fire({type: 'particleDied', particleSystem: this, particle: particle});\r\n }\r\n }\r\n }\r\n\r\n emit(delta: number, emissionState: EmissionState, emitterMatrix: Matrix4) {\r\n if (emissionState.time > this.duration) {\r\n if (this.looping) {\r\n emissionState.time -= this.duration;\r\n emissionState.burstIndex = 0;\r\n this.behaviors.forEach((behavior) => behavior.reset());\r\n } else {\r\n if (!this.emitEnded && !this.onlyUsedByOther) {\r\n this.endEmit();\r\n }\r\n }\r\n }\r\n\r\n this.normalMatrix.getNormalMatrix(emitterMatrix);\r\n\r\n const totalSpawn = Math.ceil(emissionState.waitEmiting);\r\n this.spawn(totalSpawn, emissionState, emitterMatrix);\r\n emissionState.waitEmiting -= totalSpawn;\r\n\r\n while (\r\n emissionState.burstIndex < this.emissionBursts.length &&\r\n this.emissionBursts[emissionState.burstIndex].time <= emissionState.time\r\n ) {\r\n if (Math.random() < this.emissionBursts[emissionState.burstIndex].probability) {\r\n const count = this.emissionBursts[emissionState.burstIndex].count.genValue(this.memory, this.time);\r\n emissionState.isBursting = true;\r\n emissionState.burstParticleCount = count;\r\n this.spawn(count, emissionState, emitterMatrix);\r\n emissionState.isBursting = false;\r\n }\r\n emissionState.burstIndex++;\r\n }\r\n\r\n if (!this.emitEnded) {\r\n emissionState.waitEmiting += delta * this.emissionOverTime.genValue(this.memory, emissionState.time / this.duration);\r\n\r\n if (emissionState.previousWorldPos != undefined) {\r\n this.temp.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);\r\n emissionState.travelDistance += emissionState.previousWorldPos.distanceTo(this.temp);\r\n const emitPerMeter = this.emissionOverDistance.genValue(this.memory, emissionState.time / this.duration);\r\n if (emissionState.travelDistance * emitPerMeter > 0) {\r\n const count = Math.floor(emissionState.travelDistance * emitPerMeter);\r\n emissionState.travelDistance -= count / emitPerMeter;\r\n emissionState.waitEmiting += count;\r\n }\r\n }\r\n }\r\n if (emissionState.previousWorldPos === undefined) emissionState.previousWorldPos = new Vector3();\r\n emissionState.previousWorldPos.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);\r\n emissionState.time += delta;\r\n }\r\n\r\n toJSON(metaData?: BabylonMetaData | string, _options: SerializationOptions = {}): ParticleSystemJSONParameters {\r\n const isRootObject = metaData === undefined || typeof metaData === 'string';\r\n const meta: BabylonMetaData = isRootObject\r\n ? {\r\n geometries: {},\r\n materials: {},\r\n textures: {},\r\n images: {},\r\n shapes: {},\r\n skeletons: {},\r\n animations: {},\r\n nodes: {},\r\n }\r\n : metaData;\r\n\r\n const geometryUUID = this.ensureGeometryMeta(meta);\r\n const materialUUID = this.ensureMaterialMeta(meta);\r\n const rendererEmitterSettingsJSON = this.toRendererSettingsJSON();\r\n\r\n return {\r\n version: '3.0',\r\n autoDestroy: this.autoDestroy,\r\n looping: this.looping,\r\n prewarm: this.prewarm,\r\n duration: this.duration,\r\n shape: this.emitterShape.toJSON(),\r\n startLife: this.startLife.toJSON(),\r\n startSpeed: this.startSpeed.toJSON(),\r\n startRotation: this.startRotation.toJSON(),\r\n startSize: this.startSize.toJSON(),\r\n startColor: this.startColor.toJSON(),\r\n emissionOverTime: this.emissionOverTime.toJSON(),\r\n emissionOverDistance: this.emissionOverDistance.toJSON(),\r\n emissionBursts: this.emissionBursts.map((burst) => ({\r\n time: burst.time,\r\n count: burst.count.toJSON(),\r\n probability: burst.probability,\r\n interval: burst.interval,\r\n cycle: burst.cycle,\r\n })),\r\n onlyUsedByOther: this.onlyUsedByOther,\r\n instancingGeometry: geometryUUID,\r\n renderMode: this.renderMode,\r\n renderOrder: this.renderOrder,\r\n rendererEmitterSettings: rendererEmitterSettingsJSON,\r\n material: materialUUID,\r\n layers: this.rendererSettings.layerMask,\r\n startTileIndex: this.startTileIndex.toJSON(),\r\n uTileCount: this.rendererSettings.uTileCount,\r\n vTileCount: this.rendererSettings.vTileCount,\r\n blendTiles: this.rendererSettings.blendTiles,\r\n softParticles: this.rendererSettings.softParticles,\r\n softFarFade: this.rendererSettings.softFarFade,\r\n softNearFade: this.rendererSettings.softNearFade,\r\n blending: this.rendererSettings.materialBlendMode,\r\n transparent: this.rendererSettings.materialTransparent,\r\n depthTest: this.rendererSettings.materialDepthTest,\r\n depthWrite: this.rendererSettings.materialDepthWrite,\r\n alphaTest: this.rendererSettings.materialAlphaTest,\r\n behaviors: this.behaviors.map((b) => b.toJSON()),\r\n worldSpace: this.worldSpace,\r\n };\r\n }\r\n\r\n static fromJSON(\r\n json: ParticleSystemJSONParameters,\r\n meta: BabylonMetaData,\r\n dependencies: {[uuid: string]: Behavior} = {},\r\n scene?: Scene\r\n ): ParticleSystem {\r\n const shape = EmitterFromJSON(json.shape, meta as any);\r\n let rendererEmitterSettings: RendererEmitterSettings;\r\n if (json.renderMode === RenderMode.Trail) {\r\n const trailSettings = json.rendererEmitterSettings as TrailSettings;\r\n rendererEmitterSettings = {\r\n startLength:\r\n trailSettings?.startLength !== undefined\r\n ? ValueGeneratorFromJSON(trailSettings.startLength)\r\n : new ConstantValue(30),\r\n followLocalOrigin: trailSettings?.followLocalOrigin ?? false,\r\n };\r\n } else if (json.renderMode === RenderMode.StretchedBillBoard) {\r\n rendererEmitterSettings = {...(json.rendererEmitterSettings ?? {})};\r\n if (json.speedFactor !== undefined) {\r\n (rendererEmitterSettings as StretchedBillBoardSettings).speedFactor = json.speedFactor;\r\n }\r\n } else {\r\n rendererEmitterSettings = {};\r\n }\r\n\r\n const materialMeta = json.material ? meta.materials?.[json.material] : undefined;\r\n const materialTextureRef = materialMeta?.texture ?? json.texture;\r\n const texture =\r\n typeof materialTextureRef === 'string'\r\n ? meta.textures?.[materialTextureRef] ?? null\r\n : materialTextureRef ?? null;\r\n const resolvedGeometryEntry =\r\n typeof json.instancingGeometry === 'string'\r\n ? meta.geometries?.[json.instancingGeometry]\r\n : json.instancingGeometry;\r\n const resolvedGeometry = ParticleSystem.resolveGeometryData(resolvedGeometryEntry);\r\n\r\n const ps = new ParticleSystem({\r\n scene,\r\n autoDestroy: json.autoDestroy,\r\n looping: json.looping,\r\n prewarm: json.prewarm,\r\n duration: json.duration,\r\n shape,\r\n startLife: ValueGeneratorFromJSON(json.startLife),\r\n startSpeed: ValueGeneratorFromJSON(json.startSpeed),\r\n startRotation: GeneratorFromJSON(json.startRotation) as RotationGenerator | ValueGenerator | FunctionValueGenerator,\r\n startSize: GeneratorFromJSON(json.startSize) as Vector3Generator | ValueGenerator | FunctionValueGenerator,\r\n startColor: ColorGeneratorFromJSON(json.startColor) as ColorGenerator,\r\n emissionOverTime: ValueGeneratorFromJSON(json.emissionOverTime),\r\n emissionOverDistance: ValueGeneratorFromJSON(json.emissionOverDistance),\r\n emissionBursts: json.emissionBursts?.map((burst: any) => ({\r\n time: burst.time,\r\n count: typeof burst.count === 'number' ? new ConstantValue(burst.count) : ValueGeneratorFromJSON(burst.count),\r\n probability: burst.probability ?? 1,\r\n interval: burst.interval ?? 0.1,\r\n cycle: burst.cycle ?? burst.cycleCount ?? 1,\r\n })),\r\n onlyUsedByOther: json.onlyUsedByOther,\r\n instancingGeometry: resolvedGeometry.positions,\r\n instancingIndices: resolvedGeometry.indices,\r\n instancingUVs: resolvedGeometry.uvs,\r\n instancingNormals: resolvedGeometry.normals,\r\n renderMode: json.renderMode,\r\n rendererEmitterSettings,\r\n renderOrder: json.renderOrder,\r\n texture,\r\n material: materialMeta?.sourceMaterial,\r\n blendMode: materialMeta?.alphaMode ?? json.blending ?? Constants.ALPHA_ADD,\r\n transparent: materialMeta?.transparent ?? json.transparent ?? true,\r\n depthTest: materialMeta?.depthTest ?? json.depthTest ?? true,\r\n depthWrite: materialMeta?.depthWrite ?? json.depthWrite ?? false,\r\n alphaTest: materialMeta?.alphaTest ?? json.alphaTest ?? 0,\r\n startTileIndex:\r\n typeof json.startTileIndex === 'number'\r\n ? new ConstantValue(json.startTileIndex)\r\n : (ValueGeneratorFromJSON(json.startTileIndex) as ValueGenerator),\r\n uTileCount: json.uTileCount,\r\n vTileCount: json.vTileCount,\r\n blendTiles: json.blendTiles,\r\n softParticles: json.softParticles,\r\n softFarFade: json.softFarFade,\r\n softNearFade: json.softNearFade,\r\n behaviors: [],\r\n worldSpace: json.worldSpace,\r\n layerMask: json.layers,\r\n });\r\n ps.behaviors = (json.behaviors ?? [])\r\n .map((behaviorJson) => {\r\n const behavior = BehaviorFromJSON(behaviorJson, ps);\r\n if (behavior && behavior.type === 'EmitSubParticleSystem') {\r\n dependencies[(behaviorJson as any).subParticleSystem] = behavior;\r\n }\r\n return behavior;\r\n })\r\n .filter((behavior) => behavior !== null) as Behavior[];\r\n return ps;\r\n }\r\n\r\n private static nextSerializationId(prefix: string): string {\r\n ParticleSystem.serializationCounter += 1;\r\n return `${prefix}_${ParticleSystem.serializationCounter}`;\r\n }\r\n\r\n private static createFallbackNormals(positions: Float32Array): Float32Array {\r\n const normals = new Float32Array(positions.length);\r\n for (let i = 0; i < normals.length; i += 3) {\r\n normals[i] = 0;\r\n normals[i + 1] = 0;\r\n normals[i + 2] = 1;\r\n }\r\n return normals;\r\n }\r\n\r\n private toRendererSettingsJSON(): RendererEmitterSettings {\r\n if (this.renderMode === RenderMode.Trail) {\r\n return {\r\n startLength: (this.rendererEmitterSettings as TrailSettings).startLength.toJSON(),\r\n followLocalOrigin: (this.rendererEmitterSettings as TrailSettings).followLocalOrigin,\r\n };\r\n }\r\n if (this.renderMode === RenderMode.StretchedBillBoard) {\r\n return {\r\n speedFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor,\r\n lengthFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).lengthFactor,\r\n };\r\n }\r\n return {};\r\n }\r\n\r\n private ensureGeometryMeta(meta: BabylonMetaData): string {\r\n const geometryUUID = ParticleSystem.nextSerializationId('quarks_geometry');\r\n meta.geometries[geometryUUID] = {\r\n uuid: geometryUUID,\r\n type: 'QuarksGeometry',\r\n positions: Array.from(this.rendererSettings.instancingGeometry),\r\n indices: Array.from(this.rendererSettings.instancingIndices),\r\n uvs: this.rendererSettings.instancingUVs ? Array.from(this.rendererSettings.instancingUVs) : undefined,\r\n normals: this.rendererSettings.instancingNormals ? Array.from(this.rendererSettings.instancingNormals) : undefined,\r\n };\r\n return geometryUUID;\r\n }\r\n\r\n private ensureMaterialMeta(meta: BabylonMetaData): string {\r\n const texture = this.rendererSettings.texture;\r\n let textureUUID: string | undefined;\r\n if (texture) {\r\n textureUUID = ParticleSystem.nextSerializationId('quarks_texture');\r\n meta.textures[textureUUID] = texture;\r\n }\r\n\r\n const materialUUID = ParticleSystem.nextSerializationId('quarks_material');\r\n meta.materials[materialUUID] = {\r\n uuid: materialUUID,\r\n type: 'QuarksMaterial',\r\n transparent: this.rendererSettings.materialTransparent,\r\n alphaMode: this.rendererSettings.materialBlendMode,\r\n depthTest: this.rendererSettings.materialDepthTest,\r\n depthWrite: this.rendererSettings.materialDepthWrite,\r\n alphaTest: this.rendererSettings.materialAlphaTest,\r\n texture: textureUUID,\r\n sourceMaterial: this.materialRef ?? undefined,\r\n };\r\n return materialUUID;\r\n }\r\n\r\n private static resolveGeometryData(entry: any): {\r\n positions: Float32Array;\r\n indices: Uint32Array | Uint16Array;\r\n uvs?: Float32Array;\r\n normals?: Float32Array;\r\n } {\r\n if (entry?.positions && entry?.indices) {\r\n return {\r\n positions: entry.positions instanceof Float32Array ? entry.positions : new Float32Array(entry.positions),\r\n indices:\r\n entry.indices instanceof Uint16Array || entry.indices instanceof Uint32Array\r\n ? entry.indices\r\n : new Uint32Array(entry.indices),\r\n uvs: entry.uvs\r\n ? entry.uvs instanceof Float32Array\r\n ? entry.uvs\r\n : new Float32Array(entry.uvs)\r\n : undefined,\r\n normals: entry.normals\r\n ? entry.normals instanceof Float32Array\r\n ? entry.normals\r\n : new Float32Array(entry.normals)\r\n : undefined,\r\n };\r\n }\r\n\r\n const data = entry?.data ?? entry;\r\n if (data?.attributes?.position?.array && data?.index?.array) {\r\n const indexType = data.index.type === 'Uint16Array' ? Uint16Array : Uint32Array;\r\n return {\r\n positions: new Float32Array(data.attributes.position.array),\r\n indices: new indexType(data.index.array),\r\n uvs: data.attributes.uv?.array ? new Float32Array(data.attributes.uv.array) : undefined,\r\n normals: data.attributes.normal?.array ? new Float32Array(data.attributes.normal.array) : undefined,\r\n };\r\n }\r\n\r\n return {\r\n positions: DEFAULT_POSITIONS,\r\n indices: DEFAULT_INDICES,\r\n uvs: DEFAULT_UVS,\r\n };\r\n }\r\n\r\n addBehavior(behavior: Behavior) {\r\n this.behaviors.push(behavior);\r\n }\r\n\r\n getRendererSettings(): VFXBatchSettings {\r\n return this.rendererSettings;\r\n }\r\n\r\n addEventListener(event: ParticleSystemEventType, callback: (event: ParticleSystemEvent) => void): void {\r\n if (!this.listeners[event]) this.listeners[event] = [];\r\n this.listeners[event].push(callback);\r\n }\r\n\r\n removeAllEventListeners(event: ParticleSystemEventType): void {\r\n if (this.listeners[event]) this.listeners[event] = [];\r\n }\r\n\r\n removeEventListener(event: ParticleSystemEventType, callback: (event: ParticleSystemEvent) => void): void {\r\n if (this.listeners[event]) {\r\n const index = this.listeners[event].indexOf(callback);\r\n if (index !== -1) this.listeners[event].splice(index, 1);\r\n }\r\n }\r\n\r\n private fire(event: ParticleSystemEvent) {\r\n if (this.listeners[event.type]) {\r\n this.listeners[event.type].forEach((callback) => callback(event));\r\n }\r\n }\r\n\r\n clone(): ParticleSystem {\r\n const newBehaviors: Array<Behavior> = this.behaviors.map((b) => b.clone());\r\n let rendererEmitterSettings: RendererEmitterSettings;\r\n\r\n if (this.renderMode === RenderMode.Trail) {\r\n rendererEmitterSettings = {\r\n startLength: (this.rendererEmitterSettings as TrailSettings).startLength.clone(),\r\n followLocalOrigin: (this.rendererEmitterSettings as TrailSettings).followLocalOrigin,\r\n };\r\n } else if (this.renderMode === RenderMode.StretchedBillBoard) {\r\n rendererEmitterSettings = {\r\n lengthFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).lengthFactor,\r\n speedFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor,\r\n };\r\n } else {\r\n rendererEmitterSettings = {};\r\n }\r\n\r\n return new ParticleSystem({\r\n autoDestroy: this.autoDestroy,\r\n looping: this.looping,\r\n prewarm: this.prewarm,\r\n duration: this.duration,\r\n shape: this.emitterShape.clone(),\r\n startLife: this.startLife.clone(),\r\n startSpeed: this.startSpeed.clone(),\r\n startRotation: this.startRotation.clone(),\r\n startSize: this.startSize.clone(),\r\n startColor: this.startColor.clone(),\r\n emissionOverTime: this.emissionOverTime.clone(),\r\n emissionOverDistance: this.emissionOverDistance.clone(),\r\n emissionBursts: this.emissionBursts.map((b) => ({...b})),\r\n onlyUsedByOther: this.onlyUsedByOther,\r\n instancingGeometry: this.rendererSettings.instancingGeometry,\r\n instancingIndices: this.rendererSettings.instancingIndices,\r\n instancingUVs: this.rendererSettings.instancingUVs,\r\n instancingNormals: this.rendererSettings.instancingNormals,\r\n renderMode: this.renderMode,\r\n renderOrder: this.renderOrder,\r\n rendererEmitterSettings,\r\n material: this.materialRef,\r\n texture: this.rendererSettings.texture,\r\n startTileIndex: this.startTileIndex,\r\n uTileCount: this.rendererSettings.uTileCount,\r\n vTileCount: this.rendererSettings.vTileCount,\r\n blendTiles: this.rendererSettings.blendTiles,\r\n softParticles: this.rendererSettings.softParticles,\r\n softFarFade: this.rendererSettings.softFarFade,\r\n softNearFade: this.rendererSettings.softNearFade,\r\n behaviors: newBehaviors,\r\n worldSpace: this.worldSpace,\r\n blendMode: this.rendererSettings.materialBlendMode,\r\n transparent: this.rendererSettings.materialTransparent,\r\n depthTest: this.rendererSettings.materialDepthTest,\r\n depthWrite: this.rendererSettings.materialDepthWrite,\r\n alphaTest: this.rendererSettings.materialAlphaTest,\r\n layerMask: this.rendererSettings.layerMask,\r\n scene: this.emitter.getScene(),\r\n });\r\n }\r\n}\r\n","import {Node} from '@babylonjs/core/node';\r\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\r\nimport {ParticleEmitter} from './ParticleEmitter';\r\nimport {ParticleSystem} from './ParticleSystem';\r\nimport {BatchedRenderer} from './BatchedRenderer';\r\nimport {IParticleSystem} from 'quarks.core';\r\n\r\nexport class QuarksUtil {\r\n static runOnAllParticleEmitters(root: Node, callback: (emitter: ParticleEmitter) => void): void {\r\n QuarksUtil.traverseNode(root, (node) => {\r\n if (node instanceof ParticleEmitter) {\r\n callback(node);\r\n }\r\n });\r\n }\r\n\r\n static addToBatchRenderer(root: Node, batchRenderer: BatchedRenderer): void {\r\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\r\n batchRenderer.addSystem(emitter.system);\r\n });\r\n }\r\n\r\n static play(root: Node): void {\r\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\r\n (emitter.system as unknown as ParticleSystem).play();\r\n });\r\n }\r\n\r\n static stop(root: Node): void {\r\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\r\n (emitter.system as unknown as ParticleSystem).stop();\r\n });\r\n }\r\n\r\n static pause(root: Node): void {\r\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\r\n (emitter.system as unknown as ParticleSystem).pause();\r\n });\r\n }\r\n\r\n static restart(root: Node): void {\r\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\r\n (emitter.system as unknown as ParticleSystem).restart();\r\n });\r\n }\r\n\r\n static setAutoDestroy(root: Node, autoDestroy: boolean): void {\r\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\r\n (emitter.system as unknown as ParticleSystem).autoDestroy = autoDestroy;\r\n });\r\n }\r\n\r\n static endEmit(root: Node): void {\r\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\r\n (emitter.system as unknown as ParticleSystem).endEmit();\r\n });\r\n }\r\n\r\n private static traverseNode(node: Node, callback: (node: Node) => void): void {\r\n callback(node);\r\n const children = node.getChildren();\r\n for (const child of children) {\r\n QuarksUtil.traverseNode(child, callback);\r\n }\r\n }\r\n}\r\n","import {IAnimationData, IPrefab} from 'quarks.core';\r\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\r\nimport {Scene} from '@babylonjs/core/scene';\r\nimport {ParticleEmitter} from './ParticleEmitter';\r\nimport {BatchedRenderer} from './BatchedRenderer';\r\n\r\ninterface QuarksTimelineClip {\r\n uuid?: string;\r\n duration?: number;\r\n play?: () => void;\r\n pause?: () => void;\r\n stop?: () => void;\r\n setTime?: (time: number) => void;\r\n}\r\n\r\ninterface AnimationData extends IAnimationData {\r\n type: 'three' | 'ps';\r\n target: TransformNode;\r\n loop: boolean;\r\n clip?: QuarksTimelineClip;\r\n clipUUID?: string;\r\n}\r\n\r\ninterface AnimationJSON {\r\n startTime: number;\r\n duration: number;\r\n type: 'three' | 'ps';\r\n targetUUID: string;\r\n clipUUID?: string;\r\n loop: boolean;\r\n}\r\n\r\nexport class QuarksPrefab extends TransformNode implements IPrefab {\r\n type = 'QuarksPrefab';\r\n animationData: Array<AnimationData> = [];\r\n isPlaying = false;\r\n currentTime = -0.00001;\r\n timeScale = 1;\r\n duration = 0;\r\n\r\n private _lastUpdateTimeMs = Date.now();\r\n private _batchedRenderer?: BatchedRenderer;\r\n private _tempAnimationJSON: Array<AnimationJSON> = [];\r\n\r\n constructor(name = 'QuarksPrefab', scene?: Scene) {\r\n super(name, scene);\r\n }\r\n\r\n registerBatchedRenderer(renderer: BatchedRenderer): void {\r\n this._batchedRenderer = renderer;\r\n }\r\n\r\n addParticleSystemAnimation(\r\n emitter: ParticleEmitter,\r\n startTime = 0,\r\n duration = 0,\r\n loop = false\r\n ): AnimationData {\r\n const animationDuration = duration > 0 ? duration : emitter.system.duration;\r\n const data: AnimationData = {\r\n startTime,\r\n duration: animationDuration,\r\n type: 'ps',\r\n loop,\r\n target: emitter,\r\n };\r\n this.animationData.push(data);\r\n this.pause();\r\n this.updateDuration();\r\n return data;\r\n }\r\n\r\n addThreeAnimation(\r\n target: TransformNode,\r\n clip?: QuarksTimelineClip,\r\n startTime = 0,\r\n duration = clip?.duration ?? 0,\r\n loop = false,\r\n clipUUID?: string\r\n ): AnimationData {\r\n const animationDuration = duration > 0 ? duration : clip?.duration ?? 0;\r\n const data: AnimationData = {\r\n startTime,\r\n duration: animationDuration,\r\n type: 'three',\r\n loop,\r\n target,\r\n clip,\r\n clipUUID: clipUUID ?? clip?.uuid,\r\n };\r\n this.animationData.push(data);\r\n this.updateDuration();\r\n return data;\r\n }\r\n\r\n removeAnimation(index: number): void {\r\n this.animationData.splice(index, 1);\r\n this.updateDuration();\r\n }\r\n\r\n play(): void {\r\n if (this.isPlaying) return;\r\n this.isPlaying = true;\r\n this._lastUpdateTimeMs = Date.now();\r\n }\r\n\r\n pause(): void {\r\n if (!this.isPlaying) return;\r\n this.isPlaying = false;\r\n this.animationData.forEach((animation) => {\r\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\r\n animation.target.system.pause();\r\n return;\r\n }\r\n animation.clip?.pause?.();\r\n });\r\n }\r\n\r\n stop(): void {\r\n this.pause();\r\n this.currentTime = -0.00001;\r\n this.animationData.forEach((animation) => {\r\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\r\n animation.target.system.stop();\r\n return;\r\n }\r\n animation.clip?.stop?.();\r\n });\r\n }\r\n\r\n update(forceDelta?: number): void {\r\n if (!this.isPlaying) return;\r\n const now = Date.now();\r\n const delta = forceDelta ?? Math.max((now - this._lastUpdateTimeMs) / 1000, 0);\r\n this._lastUpdateTimeMs = now;\r\n const previousTime = this.currentTime;\r\n this.currentTime += delta * this.timeScale;\r\n\r\n if (this.currentTime > this.duration) {\r\n this.stop();\r\n return;\r\n }\r\n\r\n this.animationData.forEach((animation) => {\r\n const startTime = animation.startTime;\r\n const endTime = animation.startTime + animation.duration;\r\n const isActive = this.currentTime >= startTime && this.currentTime <= endTime;\r\n const wasActive = previousTime >= startTime && previousTime <= endTime;\r\n if (isActive && !wasActive) {\r\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\r\n animation.target.system.restart();\r\n if (this._batchedRenderer) {\r\n this._batchedRenderer.addSystem(animation.target.system);\r\n }\r\n } else {\r\n animation.clip?.play?.();\r\n }\r\n return;\r\n }\r\n\r\n if (!isActive && wasActive) {\r\n if (animation.loop && animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\r\n animation.target.system.restart();\r\n return;\r\n }\r\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\r\n animation.target.system.endEmit();\r\n } else if (animation.loop) {\r\n animation.clip?.play?.();\r\n } else {\r\n animation.clip?.stop?.();\r\n }\r\n }\r\n });\r\n }\r\n\r\n setTime(time: number): void {\r\n const previousTime = this.currentTime;\r\n this.currentTime = time;\r\n this.animationData.forEach((animation) => {\r\n const startTime = animation.startTime;\r\n const endTime = animation.startTime + animation.duration;\r\n const isActive = this.currentTime >= startTime && this.currentTime < endTime;\r\n const wasActive = previousTime >= startTime && previousTime < endTime;\r\n if (isActive && !wasActive) {\r\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\r\n animation.target.system.restart();\r\n } else {\r\n animation.clip?.play?.();\r\n }\r\n return;\r\n }\r\n if (!isActive && wasActive) {\r\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\r\n animation.target.system.endEmit();\r\n } else {\r\n animation.clip?.stop?.();\r\n }\r\n return;\r\n }\r\n if (isActive && animation.type === 'three') {\r\n animation.clip?.setTime?.(Math.max(time - startTime, 0));\r\n }\r\n });\r\n }\r\n\r\n getDuration(): number {\r\n return this.duration;\r\n }\r\n\r\n resolveReferences(root: TransformNode): void {\r\n const nodesMap: {[uuid: string]: TransformNode} = {};\r\n const traverse = (node: TransformNode) => {\r\n if ((node as any)._quarksUUID) {\r\n nodesMap[(node as any)._quarksUUID] = node;\r\n }\r\n nodesMap[node.uniqueId.toString()] = node;\r\n const children = node.getChildren();\r\n for (const child of children) {\r\n if (child instanceof TransformNode) {\r\n traverse(child);\r\n }\r\n }\r\n };\r\n traverse(root);\r\n\r\n this._tempAnimationJSON.forEach((animationJSON) => {\r\n const target = nodesMap[animationJSON.targetUUID];\r\n if (animationJSON.type === 'ps' && target instanceof ParticleEmitter) {\r\n this.addParticleSystemAnimation(\r\n target,\r\n animationJSON.startTime,\r\n animationJSON.duration,\r\n animationJSON.loop\r\n );\r\n return;\r\n }\r\n if (animationJSON.type === 'three' && target) {\r\n const clip = this.resolveTimelineClip(target, animationJSON.clipUUID);\r\n this.addThreeAnimation(\r\n target,\r\n clip,\r\n animationJSON.startTime,\r\n animationJSON.duration,\r\n animationJSON.loop,\r\n animationJSON.clipUUID\r\n );\r\n }\r\n });\r\n this.updateDuration();\r\n this._tempAnimationJSON = [];\r\n }\r\n\r\n toJSON(): any {\r\n return {\r\n type: this.type,\r\n name: this.name,\r\n animationData: this.animationData.map((animation) => ({\r\n startTime: animation.startTime,\r\n duration: animation.duration,\r\n type: animation.type,\r\n targetUUID: (animation.target as any)._quarksUUID ?? animation.target.uniqueId.toString(),\r\n clipUUID: animation.type === 'three' ? animation.clipUUID ?? animation.clip?.uuid : undefined,\r\n loop: animation.loop,\r\n })),\r\n };\r\n }\r\n\r\n static fromJSON(json: any, scene?: Scene): QuarksPrefab {\r\n const prefab = new QuarksPrefab(json.name || 'QuarksPrefab', scene);\r\n if (Array.isArray(json.animationData)) {\r\n prefab._tempAnimationJSON = json.animationData.filter((item: any) => item?.type === 'ps' || item?.type === 'three');\r\n }\r\n return prefab;\r\n }\r\n\r\n private resolveTimelineClip(target: TransformNode, clipUUID?: string): QuarksTimelineClip | undefined {\r\n const animationSources = [\r\n (target as any).animations,\r\n (target as any).animationGroups,\r\n (target.metadata as any)?.animations,\r\n (target.metadata as any)?.animationGroups,\r\n ];\r\n for (const source of animationSources) {\r\n if (!Array.isArray(source)) continue;\r\n if (!clipUUID) {\r\n return source[0];\r\n }\r\n const found = source.find((item: any) => item?.uuid === clipUUID);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private updateDuration(): void {\r\n let maxDuration = 0;\r\n this.animationData.forEach((animation) => {\r\n const endTime = animation.startTime + animation.duration;\r\n if (endTime > maxDuration) {\r\n maxDuration = endTime;\r\n }\r\n });\r\n this.duration = maxDuration;\r\n }\r\n}\r\n","import {Scene} from '@babylonjs/core/scene';\r\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\r\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\r\nimport {VertexData} from '@babylonjs/core/Meshes/mesh.vertexData';\r\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\r\nimport {StandardMaterial} from '@babylonjs/core/Materials/standardMaterial';\r\nimport {Constants} from '@babylonjs/core/Engines/constants';\r\nimport {Matrix, Quaternion, Vector3} from '@babylonjs/core/Maths/math.vector';\r\nimport {\r\n Behavior,\r\n EmitSubParticleSystem,\r\n} from 'quarks.core';\r\nimport {ParticleSystem} from './ParticleSystem';\r\nimport {ParticleEmitter} from './ParticleEmitter';\r\nimport {QuarksPrefab} from './QuarksPrefab';\r\n\r\nexport interface QuarksLoaderOptions {\r\n baseUrl?: string;\r\n}\r\n\r\ninterface ParsedGeometry {\r\n positions: Float32Array;\r\n indices: Uint32Array | Uint16Array;\r\n uvs?: Float32Array;\r\n normals?: Float32Array;\r\n}\r\n\r\ninterface LoadedMeta {\r\n textures: {[uuid: string]: Texture | null};\r\n geometries: {[uuid: string]: ParsedGeometry};\r\n materials: {[uuid: string]: any};\r\n}\r\n\r\nexport class QuarksLoader {\r\n private scene: Scene;\r\n private options: QuarksLoaderOptions;\r\n\r\n constructor(scene: Scene, options: QuarksLoaderOptions = {}) {\r\n this.scene = scene;\r\n this.options = options;\r\n }\r\n\r\n async load(url: string): Promise<TransformNode> {\r\n const baseUrl = this.options.baseUrl || url.substring(0, url.lastIndexOf('/') + 1);\r\n const response = await fetch(url);\r\n const json = await response.json();\r\n return this.parse(json, baseUrl);\r\n }\r\n\r\n parse(json: any, baseUrl: string = ''): TransformNode {\r\n const meta: LoadedMeta = {\r\n textures: {},\r\n geometries: {},\r\n materials: {},\r\n };\r\n\r\n if (json.geometries) {\r\n this.parseGeometries(json.geometries, meta);\r\n }\r\n if (json.images) {\r\n this.parseImages(json.images, baseUrl, meta);\r\n }\r\n if (json.textures) {\r\n this.parseTextures(json.textures, meta);\r\n }\r\n if (json.materials) {\r\n this.parseMaterials(json.materials, meta);\r\n }\r\n\r\n const root = this.parseObject(json.object, meta);\r\n this.linkReferences(root);\r\n return root;\r\n }\r\n\r\n private parseGeometries(geometries: any[], meta: LoadedMeta): void {\r\n for (const geom of geometries) {\r\n if (geom.type === 'PlaneGeometry') {\r\n const w = geom.width || 1;\r\n const h = geom.height || 1;\r\n const hw = w / 2;\r\n const hh = h / 2;\r\n meta.geometries[geom.uuid] = {\r\n positions: new Float32Array([-hw, -hh, 0, hw, -hh, 0, hw, hh, 0, -hw, hh, 0]),\r\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\r\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\r\n normals: new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]),\r\n };\r\n } else if (geom.type === 'SphereGeometry') {\r\n meta.geometries[geom.uuid] = this.parseSphereGeometry(geom);\r\n } else if (geom.type === 'BufferGeometry' && geom.data) {\r\n const parsed = this.parseBufferGeometry(geom.data);\r\n meta.geometries[geom.uuid] = parsed;\r\n }\r\n }\r\n }\r\n\r\n private parseSphereGeometry(geom: any): ParsedGeometry {\r\n const radius = geom.radius ?? 0.5;\r\n const widthSegments = Math.max(3, Math.floor(geom.widthSegments ?? 16));\r\n const heightSegments = Math.max(2, Math.floor(geom.heightSegments ?? 8));\r\n const phiStart = geom.phiStart ?? 0;\r\n const phiLength = geom.phiLength ?? Math.PI * 2;\r\n const thetaStart = geom.thetaStart ?? 0;\r\n const thetaLength = geom.thetaLength ?? Math.PI;\r\n\r\n const positions: number[] = [];\r\n const normals: number[] = [];\r\n const uvs: number[] = [];\r\n const indices: number[] = [];\r\n const grid: number[][] = [];\r\n\r\n let index = 0;\r\n\r\n for (let iy = 0; iy <= heightSegments; iy++) {\r\n const verticesRow: number[] = [];\r\n const v = iy / heightSegments;\r\n const theta = thetaStart + v * thetaLength;\r\n\r\n for (let ix = 0; ix <= widthSegments; ix++) {\r\n const u = ix / widthSegments;\r\n const phi = phiStart + u * phiLength;\r\n\r\n const x = -radius * Math.cos(phi) * Math.sin(theta);\r\n const y = radius * Math.cos(theta);\r\n const z = radius * Math.sin(phi) * Math.sin(theta);\r\n\r\n positions.push(x, y, z);\r\n const length = Math.hypot(x, y, z) || 1;\r\n normals.push(x / length, y / length, z / length);\r\n uvs.push(u, 1 - v);\r\n\r\n verticesRow.push(index++);\r\n }\r\n\r\n grid.push(verticesRow);\r\n }\r\n\r\n const thetaEnd = thetaStart + thetaLength;\r\n const isTopFull = thetaStart <= 0;\r\n const isBottomFull = thetaEnd >= Math.PI;\r\n\r\n for (let iy = 0; iy < heightSegments; iy++) {\r\n for (let ix = 0; ix < widthSegments; ix++) {\r\n const a = grid[iy][ix + 1];\r\n const b = grid[iy][ix];\r\n const c = grid[iy + 1][ix];\r\n const d = grid[iy + 1][ix + 1];\r\n\r\n if (iy !== 0 || !isTopFull) {\r\n indices.push(a, b, d);\r\n }\r\n if (iy !== heightSegments - 1 || !isBottomFull) {\r\n indices.push(b, c, d);\r\n }\r\n }\r\n }\r\n\r\n const typedIndices = positions.length / 3 > 65535 ? new Uint32Array(indices) : new Uint16Array(indices);\r\n return {\r\n positions: new Float32Array(positions),\r\n indices: typedIndices,\r\n uvs: new Float32Array(uvs),\r\n normals: new Float32Array(normals),\r\n };\r\n }\r\n\r\n private parseBufferGeometry(data: any): ParsedGeometry {\r\n let positions = new Float32Array(0);\r\n let indices: Uint32Array | Uint16Array = new Uint32Array(0);\r\n let uvs: Float32Array | undefined;\r\n let normals: Float32Array | undefined;\r\n\r\n if (data.interleavedBuffers && data.arrayBuffers) {\r\n const buffers: {[uuid: string]: {data: Float32Array; stride: number}} = {};\r\n for (const [uuid, ibDef] of Object.entries(data.interleavedBuffers) as any[]) {\r\n const arrayBuffer = data.arrayBuffers[ibDef.buffer];\r\n if (arrayBuffer) {\r\n const floatArray = new Float32Array(\r\n Array.isArray(arrayBuffer) ? this.int32ArrayToFloat32(arrayBuffer) : arrayBuffer\r\n );\r\n buffers[uuid] = {data: floatArray, stride: ibDef.stride};\r\n }\r\n }\r\n\r\n if (data.attributes) {\r\n if (data.attributes.position?.isInterleavedBufferAttribute) {\r\n const attr = data.attributes.position;\r\n const buf = buffers[attr.data];\r\n if (buf) positions = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\r\n }\r\n if (data.attributes.uv?.isInterleavedBufferAttribute) {\r\n const attr = data.attributes.uv;\r\n const buf = buffers[attr.data];\r\n if (buf) uvs = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\r\n }\r\n if (data.attributes.normal?.isInterleavedBufferAttribute) {\r\n const attr = data.attributes.normal;\r\n const buf = buffers[attr.data];\r\n if (buf) normals = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\r\n }\r\n }\r\n } else if (data.attributes) {\r\n if (data.attributes.position?.array) {\r\n positions = new Float32Array(data.attributes.position.array);\r\n }\r\n if (data.attributes.uv?.array) {\r\n uvs = new Float32Array(data.attributes.uv.array);\r\n }\r\n if (data.attributes.normal?.array) {\r\n normals = new Float32Array(data.attributes.normal.array);\r\n }\r\n }\r\n\r\n if (data.index) {\r\n if (data.index.type === 'Uint16Array') {\r\n indices = new Uint16Array(data.index.array);\r\n } else {\r\n indices = new Uint32Array(data.index.array);\r\n }\r\n }\r\n\r\n return {positions, indices, uvs, normals};\r\n }\r\n\r\n private extractInterleavedAttribute(buffer: Float32Array, stride: number, offset: number, itemSize: number): any {\r\n const count = Math.floor(buffer.length / stride);\r\n const result = new Float32Array(count * itemSize);\r\n for (let i = 0; i < count; i++) {\r\n for (let j = 0; j < itemSize; j++) {\r\n result[i * itemSize + j] = buffer[i * stride + offset + j];\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n private int32ArrayToFloat32(intArray: number[]): Float32Array {\r\n const buffer = new ArrayBuffer(intArray.length * 4);\r\n const int32View = new Int32Array(buffer);\r\n for (let i = 0; i < intArray.length; i++) {\r\n int32View[i] = intArray[i];\r\n }\r\n return new Float32Array(buffer) as any;\r\n }\r\n\r\n private parseImages(images: any[], baseUrl: string, _meta: LoadedMeta): void {\r\n (this as any)._images = {};\r\n for (const img of images) {\r\n (this as any)._images[img.uuid] = img.url ? baseUrl + img.url : null;\r\n }\r\n }\r\n\r\n private parseTextures(textures: any[], meta: LoadedMeta): void {\r\n const images = (this as any)._images || {};\r\n for (const texDef of textures) {\r\n const imageUrl = images[texDef.image];\r\n if (imageUrl) {\r\n const texture = new Texture(imageUrl, this.scene);\r\n if (Array.isArray(texDef.wrap)) {\r\n texture.wrapU = this.mapWrapMode(texDef.wrap[0]);\r\n texture.wrapV = this.mapWrapMode(texDef.wrap[1] ?? texDef.wrap[0]);\r\n }\r\n if (Array.isArray(texDef.repeat)) {\r\n texture.uScale = texDef.repeat[0] ?? 1;\r\n texture.vScale = texDef.repeat[1] ?? 1;\r\n }\r\n if (Array.isArray(texDef.offset)) {\r\n texture.uOffset = texDef.offset[0] ?? 0;\r\n texture.vOffset = texDef.offset[1] ?? 0;\r\n }\r\n if (typeof texDef.rotation === 'number') {\r\n texture.wAng = texDef.rotation;\r\n }\r\n meta.textures[texDef.uuid] = texture;\r\n } else {\r\n meta.textures[texDef.uuid] = null;\r\n }\r\n }\r\n }\r\n\r\n private mapWrapMode(wrapMode?: number): number {\r\n switch (wrapMode) {\r\n case 1001: // ClampToEdgeWrapping (three.js)\r\n return Texture.CLAMP_ADDRESSMODE;\r\n case 1002: // MirroredRepeatWrapping (three.js)\r\n return Texture.MIRROR_ADDRESSMODE;\r\n case 1000: // RepeatWrapping (three.js)\r\n default:\r\n return Texture.WRAP_ADDRESSMODE;\r\n }\r\n }\r\n\r\n private parseMaterials(materials: any[], meta: LoadedMeta): void {\r\n for (const matDef of materials) {\r\n const matInfo: any = {\r\n uuid: matDef.uuid,\r\n transparent: matDef.transparent ?? true,\r\n blending: matDef.blending ?? 1,\r\n side: matDef.side ?? 2,\r\n depthTest: matDef.depthTest ?? true,\r\n depthWrite: matDef.depthWrite ?? false,\r\n alphaTest: matDef.alphaTest ?? 0,\r\n texture: null,\r\n };\r\n\r\n if (matDef.map) {\r\n matInfo.texture = meta.textures[matDef.map] || null;\r\n }\r\n\r\n const blendingToAlphaMode: {[key: number]: number} = {\r\n 1: Constants.ALPHA_COMBINE,\r\n 2: Constants.ALPHA_ADD,\r\n 3: Constants.ALPHA_SUBTRACT,\r\n 4: Constants.ALPHA_MULTIPLY,\r\n };\r\n matInfo.alphaMode = blendingToAlphaMode[matDef.blending] || Constants.ALPHA_COMBINE;\r\n\r\n meta.materials[matDef.uuid] = matInfo;\r\n }\r\n }\r\n\r\n private getGeometry(meta: LoadedMeta, geometryId: string | undefined): ParsedGeometry | undefined {\r\n if (!geometryId) return undefined;\r\n return meta.geometries[geometryId];\r\n }\r\n\r\n private getMaterial(meta: LoadedMeta, materialId: string | string[] | undefined): any | undefined {\r\n if (!materialId) return undefined;\r\n const selectedId = Array.isArray(materialId) ? materialId[0] : materialId;\r\n return meta.materials[selectedId];\r\n }\r\n\r\n private createPlaceholderNode(type: string, name?: string): TransformNode {\r\n const node = new TransformNode(name || type || 'node', this.scene);\r\n (node as any).quarksOriginalType = type;\r\n return node;\r\n }\r\n\r\n private createMeshNode(data: any, meta: LoadedMeta): Mesh {\r\n const mesh = new Mesh(data.name || data.type || 'mesh', this.scene);\r\n const geometry = this.getGeometry(meta, data.geometry);\r\n if (geometry && geometry.positions.length > 0 && geometry.indices.length > 0) {\r\n const vertexData = new VertexData();\r\n vertexData.positions = Array.from(geometry.positions);\r\n vertexData.indices = Array.from(geometry.indices);\r\n if (geometry.uvs && geometry.uvs.length > 0) {\r\n vertexData.uvs = Array.from(geometry.uvs);\r\n }\r\n if (geometry.normals && geometry.normals.length > 0) {\r\n vertexData.normals = Array.from(geometry.normals);\r\n }\r\n vertexData.applyToMesh(mesh, true);\r\n }\r\n\r\n const materialInfo = this.getMaterial(meta, data.material);\r\n if (materialInfo) {\r\n const material = new StandardMaterial(`quarks_loader_material_${materialInfo.uuid}`, this.scene);\r\n material.alphaMode = materialInfo.alphaMode ?? Constants.ALPHA_COMBINE;\r\n material.backFaceCulling = materialInfo.side !== 2;\r\n material.alphaCutOff = materialInfo.alphaTest ?? 0;\r\n material.disableDepthWrite = !(materialInfo.depthWrite ?? false);\r\n if (materialInfo.texture) {\r\n material.diffuseTexture = materialInfo.texture;\r\n material.opacityTexture = materialInfo.texture;\r\n }\r\n mesh.material = material;\r\n }\r\n return mesh;\r\n }\r\n\r\n private parseObject(data: any, meta: LoadedMeta): TransformNode {\r\n let node: TransformNode;\r\n switch (data.type) {\r\n case 'QuarksPrefab':\r\n node = QuarksPrefab.fromJSON(data, this.scene);\r\n break;\r\n case 'ParticleEmitter':\r\n if (data.ps) {\r\n const ps = this.parseParticleSystem(data.ps, meta);\r\n node = ps.emitter;\r\n break;\r\n }\r\n node = this.createPlaceholderNode(data.type, data.name);\r\n break;\r\n case 'Mesh':\r\n case 'SkinnedMesh':\r\n case 'InstancedMesh':\r\n case 'BatchedMesh':\r\n node = this.createMeshNode(data, meta);\r\n break;\r\n case 'Scene':\r\n case 'Group':\r\n case 'Object3D':\r\n case 'PerspectiveCamera':\r\n case 'OrthographicCamera':\r\n case 'AmbientLight':\r\n case 'DirectionalLight':\r\n case 'PointLight':\r\n case 'RectAreaLight':\r\n case 'SpotLight':\r\n case 'HemisphereLight':\r\n case 'LightProbe':\r\n case 'LOD':\r\n case 'Line':\r\n case 'LineSegments':\r\n case 'LineLoop':\r\n case 'PointCloud':\r\n case 'Points':\r\n case 'Sprite':\r\n case 'Bone':\r\n node = this.createPlaceholderNode(data.type, data.name);\r\n break;\r\n default:\r\n node = new TransformNode(data.name || data.type || 'node', this.scene);\r\n }\r\n\r\n if (data.uuid) (node as any)._quarksUUID = data.uuid;\r\n if (data.name) node.name = data.name;\r\n\r\n if (data.matrix) {\r\n const matrix = Matrix.FromArray(data.matrix);\r\n const scaling = new Vector3(1, 1, 1);\r\n const rotation = Quaternion.Identity();\r\n const translation = new Vector3(0, 0, 0);\r\n matrix.decompose(scaling, rotation, translation);\r\n node.position.copyFrom(translation);\r\n node.scaling.copyFrom(scaling);\r\n node.rotationQuaternion = rotation;\r\n } else {\r\n if (data.position) node.position.set(data.position[0], data.position[1], data.position[2]);\r\n if (data.scale) node.scaling.set(data.scale[0], data.scale[1], data.scale[2]);\r\n if (data.quaternion) {\r\n node.rotationQuaternion = new Quaternion(data.quaternion[0], data.quaternion[1], data.quaternion[2], data.quaternion[3]);\r\n } else if (data.rotation) {\r\n node.rotation.set(data.rotation[0], data.rotation[1], data.rotation[2]);\r\n }\r\n }\r\n\r\n if (data.visible !== undefined) node.setEnabled(data.visible);\r\n\r\n if (data.children) {\r\n for (const childData of data.children) {\r\n const child = this.parseObject(childData, meta);\r\n child.parent = node;\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n private parseParticleSystem(json: any, meta: LoadedMeta): ParticleSystem {\r\n const dependencies: {[uuid: string]: Behavior} = {};\r\n const ps = ParticleSystem.fromJSON(json, meta as any, dependencies, this.scene);\r\n (ps as any)._meshSurfaceReferenceUUID = json?.shape?.type === 'mesh_surface' ? json?.shape?.mesh : undefined;\r\n return ps;\r\n }\r\n\r\n private linkReferences(root: TransformNode): void {\r\n const nodesMap: {[uuid: string]: TransformNode} = {};\r\n\r\n const traverse = (node: TransformNode) => {\r\n if ((node as any)._quarksUUID) {\r\n nodesMap[(node as any)._quarksUUID] = node;\r\n }\r\n for (const child of node.getChildren()) {\r\n if (child instanceof TransformNode) {\r\n traverse(child);\r\n }\r\n }\r\n };\r\n traverse(root);\r\n\r\n const linkNode = (node: TransformNode) => {\r\n if (node instanceof QuarksPrefab) {\r\n node.resolveReferences(root);\r\n }\r\n if (node instanceof ParticleEmitter) {\r\n const system = node.system as ParticleSystem;\r\n const meshSurfaceUUID = (system as any)._meshSurfaceReferenceUUID;\r\n if (meshSurfaceUUID && (system.emitterShape as any).type === 'mesh_surface') {\r\n const targetNode = nodesMap[meshSurfaceUUID];\r\n if (targetNode instanceof Mesh) {\r\n (system.emitterShape as any).mesh = targetNode;\r\n }\r\n }\r\n for (let i = 0; i < system.behaviors.length; i++) {\r\n if (system.behaviors[i] instanceof EmitSubParticleSystem) {\r\n const subEmitter = system.behaviors[i] as EmitSubParticleSystem;\r\n const targetUUID = subEmitter.subParticleSystem as any;\r\n if (typeof targetUUID === 'string' && nodesMap[targetUUID]) {\r\n (subEmitter as any).subParticleSystem = nodesMap[targetUUID];\r\n }\r\n }\r\n }\r\n }\r\n for (const child of node.getChildren()) {\r\n if (child instanceof TransformNode) {\r\n linkNode(child);\r\n }\r\n }\r\n };\r\n linkNode(root);\r\n }\r\n}\r\n","import {Scene} from '@babylonjs/core/scene';\r\nimport {PBRMaterial} from '@babylonjs/core/Materials/PBR/pbrMaterial';\r\nimport {StandardMaterial} from '@babylonjs/core/Materials/standardMaterial';\r\n\r\nexport type BabylonParticleMaterialParameters = Record<string, any>;\r\n\r\nexport class ParticleMeshStandardMaterial extends StandardMaterial {\r\n readonly isParticleMeshStandardMaterial = true;\r\n\r\n constructor(name: string, scene?: Scene, parameters: BabylonParticleMaterialParameters = {}) {\r\n super(name, scene);\r\n Object.assign(this, parameters);\r\n }\r\n}\r\n\r\nexport class ParticleMeshPhysicsMaterial extends PBRMaterial {\r\n readonly isParticleMeshPhysicsMaterial = true;\r\n\r\n constructor(name: string, scene?: Scene, parameters: BabylonParticleMaterialParameters = {}) {\r\n super(name, scene);\r\n Object.assign(this, parameters);\r\n }\r\n}\r\n","import {loadPlugin} from 'quarks.core';\r\nimport {MeshSurfaceEmitterPlugin} from './MeshSurfaceEmitter';\r\nimport {registerShaderChunks} from './shaders';\r\n\r\nexport {BatchedRenderer} from './BatchedRenderer';\r\nexport type {VFXBatchSettings} from './BatchedRenderer';\r\nexport {BatchedParticleRenderer} from './BatchedParticleRenderer';\r\nexport {VFXBatch, RenderMode} from './VFXBatch';\r\nexport type {StoredBatchSettings} from './VFXBatch';\r\nexport {SpriteBatch} from './SpriteBatch';\r\nexport {TrailBatch} from './TrailBatch';\r\nexport {ParticleSystem} from './ParticleSystem';\r\nexport type {ParticleSystemParameters, BurstParameters} from './ParticleSystem';\r\nexport {ParticleEmitter} from './ParticleEmitter';\r\nexport {QuarksUtil} from './QuarksUtil';\r\nexport {QuarksLoader} from './QuarksLoader';\r\nexport type {QuarksLoaderOptions} from './QuarksLoader';\r\nexport {QuarksPrefab} from './QuarksPrefab';\r\nexport {MeshSurfaceEmitter, MeshSurfaceEmitterPlugin} from './MeshSurfaceEmitter';\r\nexport * from './shaders/';\r\nexport * from './materials/';\r\nexport * from 'quarks.core';\r\n\r\n\r\n// Re-export quarks.core types (interfaces - type-only)\r\nexport type {\r\n IParticleSystem,\r\n IParticle,\r\n Particle,\r\n EmissionState,\r\n RendererEmitterSettings,\r\n TrailSettings,\r\n StretchedBillBoardSettings,\r\n BillBoardSettings,\r\n MeshSettings,\r\n IEmitter,\r\n ParticleSystemEvent,\r\n ParticleSystemEventType,\r\n SerializationOptions,\r\n Behavior,\r\n EmitterShape,\r\n ValueGenerator,\r\n FunctionValueGenerator,\r\n ColorGenerator,\r\n FunctionColorGenerator,\r\n RotationGenerator,\r\n Vector3Generator,\r\n} from 'quarks.core';\r\n\r\nregisterShaderChunks();\r\nloadPlugin(MeshSurfaceEmitterPlugin);\r\n// remove this line if you have pro license\r\nconsole.log('%c Particle system powered by babylon.quarks. https://quarks.art/', 'font-size: 14px; font-weight: bold;');\r\n\r\n"],"names":["MeshSurfaceEmitter","mesh","this","_mesh","positions","getVerticesData","VertexBuffer","PositionKind","indices","getIndices","_positions","Float32Array","_indices","Int32Array","_triangleIndexToArea","length","area","triCount","push","a","Vector3","b","c","i","i0","i1","i2","set","sub","cross","crossVectors","constructor","meshReferenceId","type","_meshReferenceId","initialize","p","position","velocity","multiplyScalar","startSpeed","left","right","target","Math","random","mid","floor","u1","u2","idx0","idx1","idx2","ax","ay","az","bx","by","bz","cx","cy","cz","nx","ny","nz","len","sqrt","toJSON","uniqueId","toString","fromJSON","json","undefined","clone","update","_system","_delta","MeshSurfaceEmitterPlugin","id","emitterShapes","params","loadJSON","behaviors","shaderChunks","registered","registerShaderChunks","tile_pars_vertex","tile_vertex","tile_pars_fragment","tile_fragment","soft_pars_vertex","soft_vertex","soft_pars_fragment","soft_fragment","getShaderChunk","chunkName","getRegisteredShaderChunks","RenderMode","particle_vert","particle_frag","local_particle_vert_glsl","local_particle_physics_vert","particle_physics_frag","stretched_bb_particle_vert","trail_vert","trail_frag","VFXBatch","settings","scene","maxParticles","systems","Set","instancingGeometry","instancingIndices","instancingUVs","instancingNormals","renderMode","renderOrder","uTileCount","vTileCount","blendTiles","softParticles","softNearFade","softFarFade","materialBlendMode","materialTransparent","materialDepthTest","materialDepthWrite","materialAlphaTest","texture","layerMask","Mesh","alwaysSelectAsActiveMesh","addSystem","system","add","removeSystem","delete","getVisibleSystems","Array","from","filter","emitter","visible","applyDepthTexture","depthTexture","material","ShaderMaterial","setTexture","dispose","SpriteBatch","super","vector_","vector2_","vector3_","quaternion_","Quaternion","quaternion2_","quaternion3_","rotationMat_","Matrix3","rotationMat2_","setupBuffers","rebuildMaterial","vertexData","VertexData","uvs","normals","applyToMesh","buildExpandableBuffers","engine","getEngine","offsetBuffer","offsetVB","setVerticesBuffer","colorBuffer","colorVB","sizeBuffer","sizeVB","uvTileBuffer","uvTileVB","rotationBuffer","rotationVB","StretchedBillBoard","velocityBuffer","velocityVB","forcedInstanceCount","doNotSyncBoundingInfo","expandBuffers","shaderName","Date","now","vertexShader","fragmentShader","defines","VerticalBillBoard","HorizontalBillBoard","Effect","ShadersStore","attributes","uniforms","samplers","mat","vertex","fragment","needAlphaBlending","setFloat","setVector2","BVector2","max","onBindObservable","camera","activeCamera","setVector4","BVector4","minZ","maxZ","setVector3","BVector3","backFaceCulling","alphaMode","Constants","ALPHA_DISABLE","needDepthPrePass","forceDepthWrite","disableDepthWrite","index","particleCount","visibleSystems","particleNum","particles","rotation","translation","scale","matrixWorld","decompose","setFromMatrix4","j","particle","q","worldSpace","parentQ","parentMatrix","setFromRotationMatrix","copy","multiply","ri","x","y","z","w","vec","applyMatrix4","oi","ci","color","si","size","abs","uvTile","speedFactor","rendererEmitterSettings","lengthFactor","vel","applyMatrix3","vi","setEnabled","TrailBatch","positionBuffer","previousBuffer","nextBuffer","uvBuffer","sideBuffer","widthBuffer","indexBuffer","Uint32Array","setVerticesData","UVKind","ColorKind","setIndices","subarray","previousVB","nextVB","sideVB","widthVB","min","setBoundingInfo","BoundingInfo","subMeshes","_boundingInfo","getBoundingInfo","getRenderWidth","getRenderHeight","renderEngine","triangles","previous","computeWorldMatrix","tileWidth","tileHeight","col","row","iter","values","next","curIter","value","current","done","pos","pi","prevPos","nextPos","objectScale","ui","cci","updateVerticesData","updateIndices","getVertexBuffer","meshBoundingInfo","subMesh","indexCount","verticesCount","BatchedRenderer","TransformNode","name","batches","systemToBatchIndex","Map","equals","_renderer","getRendererSettings","batch","getScene","Trail","BillBoard","Error","parent","deleteSystem","batchIndex","get","updateSystem","setDepthTexture","delta","forEach","_value","ps","clear","BatchedParticleRenderer","ParticleEmitter","m","getWorldMatrix","e","_matrixWorld","elements","isEnabled","uuid","Matrix4","extractFromCache","cache","key","data","metadata","clonedEmitter","copyFrom","scaling","rotationQuaternion","meta","options","_quarksUUID","quaternion","UP","tempQ","tempV","tempV2","DEFAULT_POSITIONS","DEFAULT_UVS","DEFAULT_INDICES","ParticleSystem","time","emissionState","layers","layerMaskProxy","rendererSettings","neededToUpdateRender","materialRef","applyMaterialSettings","u","v","geometry","restart","blending","needRestart","startRotation","ConstantValue","startLength","followLocalOrigin","AxisAngleGenerator","parameters","temp","normalMatrix","memory","listeners","firstTimeUpdate","mask","Object","defineProperty","enumerable","autoDestroy","duration","looping","prewarm","startLife","startSize","startColor","ConstantColor","Vector4","emissionOverTime","emissionOverDistance","emissionBursts","onlyUsedByOther","emitterShape","shape","SphereEmitter","blendMode","ALPHA_ADD","transparent","depthTest","depthWrite","alphaTest","createFallbackNormals","startTileIndex","paused","isBursting","burstParticleIndex","burstParticleCount","burstIndex","burstWaveIndex","waitEmiting","travelDistance","burst","count","startGen","emitEnded","markForDestroy","prewarmed","overrides","resolvedTexture","albedoTexture","diffuseTexture","emissiveTexture","opacityTexture","baseTexture","resolvedBlendMode","resolvedTransparent","alpha","resolvedDepthTest","disableDepthTest","resolvedDepthWrite","resolvedAlphaTest","alphaCutOff","alphaCutOffValue","pause","play","stop","spawn","matrix","TrailParticle","SpriteParticle","reset","speedModifier","genColor","genValue","life","age","sprite","setFromAxisAngle","trail","localPosition","multiplyQuaternions","endEmit","fire","particleSystem","behavior","emit","frameUpdate","died","addScaledVector","emitterMatrix","getNormalMatrix","totalSpawn","ceil","probability","previousWorldPos","distanceTo","emitPerMeter","metaData","_options","geometries","materials","textures","images","shapes","skeletons","animations","nodes","geometryUUID","ensureGeometryMeta","materialUUID","ensureMaterialMeta","rendererEmitterSettingsJSON","toRendererSettingsJSON","version","map","interval","cycle","dependencies","EmitterFromJSON","trailSettings","ValueGeneratorFromJSON","materialMeta","materialTextureRef","resolvedGeometryEntry","resolvedGeometry","resolveGeometryData","GeneratorFromJSON","ColorGeneratorFromJSON","cycleCount","sourceMaterial","behaviorJson","BehaviorFromJSON","subParticleSystem","nextSerializationId","prefix","serializationCounter","textureUUID","entry","Uint16Array","array","indexType","uv","normal","addBehavior","addEventListener","event","callback","removeAllEventListeners","removeEventListener","indexOf","splice","newBehaviors","QuarksUtil","runOnAllParticleEmitters","root","traverseNode","node","addToBatchRenderer","batchRenderer","setAutoDestroy","children","getChildren","child","QuarksPrefab","animationData","isPlaying","currentTime","timeScale","_lastUpdateTimeMs","_tempAnimationJSON","registerBatchedRenderer","renderer","_batchedRenderer","addParticleSystemAnimation","startTime","loop","updateDuration","addThreeAnimation","clip","clipUUID","removeAnimation","animation","forceDelta","previousTime","endTime","isActive","wasActive","setTime","getDuration","resolveReferences","nodesMap","traverse","animationJSON","targetUUID","resolveTimelineClip","prefab","isArray","item","animationSources","animationGroups","source","found","find","maxDuration","QuarksLoader","load","url","baseUrl","substring","lastIndexOf","response","fetch","parse","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","object","linkReferences","geom","hw","width","hh","height","parseSphereGeometry","parsed","parseBufferGeometry","radius","widthSegments","heightSegments","phiStart","phiLength","PI","thetaStart","thetaLength","grid","iy","verticesRow","theta","ix","phi","cos","sin","hypot","isTopFull","isBottomFull","d","typedIndices","interleavedBuffers","arrayBuffers","buffers","ibDef","entries","arrayBuffer","buffer","floatArray","int32ArrayToFloat32","stride","isInterleavedBufferAttribute","attr","buf","extractInterleavedAttribute","offset","itemSize","result","intArray","ArrayBuffer","int32View","_meta","_images","img","texDef","imageUrl","image","Texture","wrap","wrapU","mapWrapMode","wrapV","repeat","uScale","vScale","uOffset","vOffset","wAng","wrapMode","CLAMP_ADDRESSMODE","MIRROR_ADDRESSMODE","WRAP_ADDRESSMODE","matDef","matInfo","side","blendingToAlphaMode","ALPHA_COMBINE","ALPHA_SUBTRACT","ALPHA_MULTIPLY","getGeometry","geometryId","getMaterial","materialId","selectedId","createPlaceholderNode","quarksOriginalType","createMeshNode","materialInfo","StandardMaterial","parseParticleSystem","Matrix","FromArray","Identity","childData","_meshSurfaceReferenceUUID","linkNode","meshSurfaceUUID","targetNode","EmitSubParticleSystem","subEmitter","ParticleMeshStandardMaterial","isParticleMeshStandardMaterial","assign","ParticleMeshPhysicsMaterial","PBRMaterial","isParticleMeshPhysicsMaterial","loadPlugin","console","log"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { BatchedRenderer } from './BatchedRenderer';
2
+ export declare const BatchedParticleRenderer: typeof BatchedRenderer;