@codexo/exojs-particles 0.15.3 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -43
- package/dist/esm/ParticleStorage.d.ts +188 -0
- package/dist/esm/ParticleStorage.d.ts.map +1 -0
- package/dist/esm/ParticleStorage.js +208 -0
- package/dist/esm/ParticleStorage.js.map +1 -0
- package/dist/esm/ParticleSystem.d.ts +189 -60
- package/dist/esm/ParticleSystem.d.ts.map +1 -0
- package/dist/esm/ParticleSystem.js +660 -560
- package/dist/esm/ParticleSystem.js.map +1 -1
- package/dist/esm/distributions/BoxArea.d.ts +1 -0
- package/dist/esm/distributions/BoxArea.d.ts.map +1 -0
- package/dist/esm/distributions/BoxArea.js +38 -44
- package/dist/esm/distributions/BoxArea.js.map +1 -1
- package/dist/esm/distributions/CircleArea.d.ts +1 -0
- package/dist/esm/distributions/CircleArea.d.ts.map +1 -0
- package/dist/esm/distributions/CircleArea.js +30 -28
- package/dist/esm/distributions/CircleArea.js.map +1 -1
- package/dist/esm/distributions/ColorGradient.d.ts +3 -2
- package/dist/esm/distributions/ColorGradient.d.ts.map +1 -0
- package/dist/esm/distributions/ColorGradient.js +70 -75
- package/dist/esm/distributions/ColorGradient.js.map +1 -1
- package/dist/esm/distributions/ConeDirection.d.ts +2 -1
- package/dist/esm/distributions/ConeDirection.d.ts.map +1 -0
- package/dist/esm/distributions/ConeDirection.js +41 -39
- package/dist/esm/distributions/ConeDirection.js.map +1 -1
- package/dist/esm/distributions/Constant.d.ts +1 -0
- package/dist/esm/distributions/Constant.d.ts.map +1 -0
- package/dist/esm/distributions/Constant.js +32 -32
- package/dist/esm/distributions/Constant.js.map +1 -1
- package/dist/esm/distributions/Curve.d.ts +2 -1
- package/dist/esm/distributions/Curve.d.ts.map +1 -0
- package/dist/esm/distributions/Curve.js +46 -55
- package/dist/esm/distributions/Curve.js.map +1 -1
- package/dist/esm/distributions/Distribution.d.ts +4 -3
- package/dist/esm/distributions/Distribution.d.ts.map +1 -0
- package/dist/esm/distributions/LineSegment.d.ts +1 -0
- package/dist/esm/distributions/LineSegment.d.ts.map +1 -0
- package/dist/esm/distributions/LineSegment.js +25 -23
- package/dist/esm/distributions/LineSegment.js.map +1 -1
- package/dist/esm/distributions/Range.d.ts +1 -0
- package/dist/esm/distributions/Range.d.ts.map +1 -0
- package/dist/esm/distributions/Range.js +18 -16
- package/dist/esm/distributions/Range.js.map +1 -1
- package/dist/esm/distributions/VectorRange.d.ts +1 -0
- package/dist/esm/distributions/VectorRange.d.ts.map +1 -0
- package/dist/esm/distributions/VectorRange.js +29 -27
- package/dist/esm/distributions/VectorRange.js.map +1 -1
- package/dist/esm/distributions/index.d.ts +1 -0
- package/dist/esm/distributions/index.d.ts.map +1 -0
- package/dist/esm/gpu/ParticleGpuState.d.ts +143 -18
- package/dist/esm/gpu/ParticleGpuState.d.ts.map +1 -0
- package/dist/esm/gpu/ParticleGpuState.js +655 -497
- package/dist/esm/gpu/ParticleGpuState.js.map +1 -1
- package/dist/esm/gpu/shaders/particle-simulate.wgsl.js +6 -0
- package/dist/esm/gpu/shaders/particle-simulate.wgsl.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +39 -32
- package/dist/esm/modules/AlphaFadeOverLifetime.d.ts +4 -3
- package/dist/esm/modules/AlphaFadeOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/AlphaFadeOverLifetime.js +68 -55
- package/dist/esm/modules/AlphaFadeOverLifetime.js.map +1 -1
- package/dist/esm/modules/ApplyForce.d.ts +4 -3
- package/dist/esm/modules/ApplyForce.d.ts.map +1 -0
- package/dist/esm/modules/ApplyForce.js +49 -43
- package/dist/esm/modules/ApplyForce.js.map +1 -1
- package/dist/esm/modules/AttractToPoint.d.ts +4 -3
- package/dist/esm/modules/AttractToPoint.d.ts.map +1 -0
- package/dist/esm/modules/AttractToPoint.js +73 -62
- package/dist/esm/modules/AttractToPoint.js.map +1 -1
- package/dist/esm/modules/BurstSpawn.d.ts +6 -18
- package/dist/esm/modules/BurstSpawn.d.ts.map +1 -0
- package/dist/esm/modules/BurstSpawn.js +56 -91
- package/dist/esm/modules/BurstSpawn.js.map +1 -1
- package/dist/esm/modules/ColorOverLifetime.d.ts +4 -3
- package/dist/esm/modules/ColorOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/ColorOverLifetime.js +65 -53
- package/dist/esm/modules/ColorOverLifetime.js.map +1 -1
- package/dist/esm/modules/ColorOverSpeed.d.ts +5 -4
- package/dist/esm/modules/ColorOverSpeed.d.ts.map +1 -0
- package/dist/esm/modules/ColorOverSpeed.js +90 -75
- package/dist/esm/modules/ColorOverSpeed.js.map +1 -1
- package/dist/esm/modules/DeathModule.d.ts +26 -10
- package/dist/esm/modules/DeathModule.d.ts.map +1 -0
- package/dist/esm/modules/DeathModule.js +38 -22
- package/dist/esm/modules/DeathModule.js.map +1 -1
- package/dist/esm/modules/Drag.d.ts +3 -2
- package/dist/esm/modules/Drag.d.ts.map +1 -0
- package/dist/esm/modules/Drag.js +43 -37
- package/dist/esm/modules/Drag.js.map +1 -1
- package/dist/esm/modules/OrbitalForce.d.ts +4 -3
- package/dist/esm/modules/OrbitalForce.d.ts.map +1 -0
- package/dist/esm/modules/OrbitalForce.js +70 -58
- package/dist/esm/modules/OrbitalForce.js.map +1 -1
- package/dist/esm/modules/RateSpawn.d.ts +7 -22
- package/dist/esm/modules/RateSpawn.d.ts.map +1 -0
- package/dist/esm/modules/RateSpawn.js +39 -71
- package/dist/esm/modules/RateSpawn.js.map +1 -1
- package/dist/esm/modules/RepelFromPoint.d.ts +4 -3
- package/dist/esm/modules/RepelFromPoint.d.ts.map +1 -0
- package/dist/esm/modules/RepelFromPoint.js +72 -62
- package/dist/esm/modules/RepelFromPoint.js.map +1 -1
- package/dist/esm/modules/RotateOverLifetime.d.ts +3 -2
- package/dist/esm/modules/RotateOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/RotateOverLifetime.js +40 -36
- package/dist/esm/modules/RotateOverLifetime.js.map +1 -1
- package/dist/esm/modules/ScaleOverLifetime.d.ts +5 -4
- package/dist/esm/modules/ScaleOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/ScaleOverLifetime.js +60 -50
- package/dist/esm/modules/ScaleOverLifetime.js.map +1 -1
- package/dist/esm/modules/SpawnModule.d.ts +15 -12
- package/dist/esm/modules/SpawnModule.d.ts.map +1 -0
- package/dist/esm/modules/SpawnModule.js +32 -28
- package/dist/esm/modules/SpawnModule.js.map +1 -1
- package/dist/esm/modules/SpawnOnDeath.d.ts +13 -9
- package/dist/esm/modules/SpawnOnDeath.d.ts.map +1 -0
- package/dist/esm/modules/SpawnOnDeath.js +41 -43
- package/dist/esm/modules/SpawnOnDeath.js.map +1 -1
- package/dist/esm/modules/Turbulence.d.ts +4 -3
- package/dist/esm/modules/Turbulence.d.ts.map +1 -0
- package/dist/esm/modules/Turbulence.js +101 -89
- package/dist/esm/modules/Turbulence.js.map +1 -1
- package/dist/esm/modules/UpdateModule.d.ts +21 -13
- package/dist/esm/modules/UpdateModule.d.ts.map +1 -0
- package/dist/esm/modules/UpdateModule.js +65 -63
- package/dist/esm/modules/UpdateModule.js.map +1 -1
- package/dist/esm/modules/VelocityOverLifetime.d.ts +7 -6
- package/dist/esm/modules/VelocityOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/VelocityOverLifetime.js +75 -73
- package/dist/esm/modules/VelocityOverLifetime.js.map +1 -1
- package/dist/esm/modules/WgslContribution.d.ts +16 -15
- package/dist/esm/modules/WgslContribution.d.ts.map +1 -0
- package/dist/esm/modules/WgslContribution.js +37 -29
- package/dist/esm/modules/WgslContribution.js.map +1 -1
- package/dist/esm/modules/index.d.ts +3 -1
- package/dist/esm/modules/index.d.ts.map +1 -0
- package/dist/esm/modules/spawnFields.d.ts +32 -0
- package/dist/esm/modules/spawnFields.d.ts.map +1 -0
- package/dist/esm/modules/spawnFields.js +31 -0
- package/dist/esm/modules/spawnFields.js.map +1 -0
- package/dist/esm/particlesBuildInfo.d.ts +1 -0
- package/dist/esm/particlesBuildInfo.d.ts.map +1 -0
- package/dist/esm/particlesBuildInfo.js +6 -4
- package/dist/esm/particlesBuildInfo.js.map +1 -1
- package/dist/esm/particlesExtension.d.ts +13 -5
- package/dist/esm/particlesExtension.d.ts.map +1 -0
- package/dist/esm/particlesExtension.js +38 -42
- package/dist/esm/particlesExtension.js.map +1 -1
- package/dist/esm/public.d.ts +11 -0
- package/dist/esm/public.d.ts.map +1 -0
- package/dist/esm/renderModes/MeshParticles.d.ts +128 -0
- package/dist/esm/renderModes/MeshParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/MeshParticles.js +263 -0
- package/dist/esm/renderModes/MeshParticles.js.map +1 -0
- package/dist/esm/renderModes/ParticleBufferLayout.d.ts +59 -0
- package/dist/esm/renderModes/ParticleBufferLayout.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleBufferLayout.js +99 -0
- package/dist/esm/renderModes/ParticleBufferLayout.js.map +1 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.d.ts +58 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.js +173 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.js.map +1 -0
- package/dist/esm/renderModes/ParticleMaterial.d.ts +18 -0
- package/dist/esm/renderModes/ParticleMaterial.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleMaterial.js +24 -0
- package/dist/esm/renderModes/ParticleMaterial.js.map +1 -0
- package/dist/esm/renderModes/ParticleRenderMode.d.ts +114 -0
- package/dist/esm/renderModes/ParticleRenderMode.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleRenderMode.js +99 -0
- package/dist/esm/renderModes/ParticleRenderMode.js.map +1 -0
- package/dist/esm/renderModes/QuadParticles.d.ts +55 -0
- package/dist/esm/renderModes/QuadParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/QuadParticles.js +95 -0
- package/dist/esm/renderModes/QuadParticles.js.map +1 -0
- package/dist/esm/renderModes/RibbonParticles.d.ts +96 -0
- package/dist/esm/renderModes/RibbonParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/RibbonParticles.js +202 -0
- package/dist/esm/renderModes/RibbonParticles.js.map +1 -0
- package/dist/esm/renderModes/shaders/mesh-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/mesh-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/mesh.vert.js +6 -0
- package/dist/esm/renderModes/shaders/mesh.vert.js.map +1 -0
- package/dist/esm/renderModes/shaders/quad-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/quad-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon.frag.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon.frag.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon.vert.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon.vert.js.map +1 -0
- package/dist/esm/renderers/WebGl2ParticleRenderer.d.ts +48 -20
- package/dist/esm/renderers/WebGl2ParticleRenderer.d.ts.map +1 -0
- package/dist/esm/renderers/WebGl2ParticleRenderer.js +317 -321
- package/dist/esm/renderers/WebGl2ParticleRenderer.js.map +1 -1
- package/dist/esm/renderers/WebGpuParticleRenderer.d.ts +99 -18
- package/dist/esm/renderers/WebGpuParticleRenderer.d.ts.map +1 -0
- package/dist/esm/renderers/WebGpuParticleRenderer.js +542 -551
- package/dist/esm/renderers/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/renderers/shaders/particle.frag.js +6 -0
- package/dist/esm/renderers/shaders/particle.frag.js.map +1 -0
- package/dist/esm/renderers/shaders/particle.vert.js +6 -0
- package/dist/esm/renderers/shaders/particle.vert.js.map +1 -0
- package/package.json +8 -15
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/register.d.ts +0 -1
- package/dist/esm/register.js +0 -43
- package/dist/esm/register.js.map +0 -1
- package/dist/esm/renderers/glsl/particle.frag.js +0 -4
- package/dist/esm/renderers/glsl/particle.frag.js.map +0 -1
- package/dist/esm/renderers/glsl/particle.vert.js +0 -4
- package/dist/esm/renderers/glsl/particle.vert.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebGl2ParticleRenderer.js","sources":["../../../../src/renderers/WebGl2ParticleRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebGl2ParticleRenderer.js","names":[],"sources":["../../../src/renderers/WebGl2ParticleRenderer.ts"],"sourcesContent":["import type { AttributeType, GeometryUsage, Material, Topology } from '@codexo/exojs';\nimport type { BlendModes } from '@codexo/exojs/renderer-sdk';\nimport type { Texture } from '@codexo/exojs/renderer-sdk';\nimport type { View } from '@codexo/exojs/renderer-sdk';\nimport type { WebGl2Backend } from '@codexo/exojs/renderer-sdk';\nimport { BufferTypes, BufferUsage, RenderingPrimitives } from '@codexo/exojs/renderer-sdk';\nimport { Shader } from '@codexo/exojs/renderer-sdk';\nimport { AbstractWebGl2Renderer } from '@codexo/exojs/renderer-sdk';\nimport { uploadBufferRange, uploadBufferStore, WebGl2RenderBuffer, type WebGl2RenderBufferRuntime } from '@codexo/exojs/renderer-sdk';\nimport { createWebGl2ShaderProgram } from '@codexo/exojs/renderer-sdk';\nimport { WebGl2VertexArrayObject, type WebGl2VertexArrayObjectRuntime } from '@codexo/exojs/renderer-sdk';\n\nimport type { ParticleSystem } from '#ParticleSystem';\nimport { assertVertexGeometryCompatible } from '#renderModes/ParticleBufferLayout';\nimport type { ParticleRenderMode } from '#renderModes/ParticleRenderMode';\n\nconst resolvePrimitive = (topology: Topology): RenderingPrimitives => {\n switch (topology) {\n case 'triangle-list':\n return RenderingPrimitives.Triangles;\n case 'triangle-strip':\n return RenderingPrimitives.TriangleStrip;\n }\n};\n\nconst usageByGeometryUsage: Record<GeometryUsage, BufferUsage> = {\n static: BufferUsage.StaticDraw,\n dynamic: BufferUsage.DynamicDraw,\n stream: BufferUsage.StreamDraw,\n};\n\n/**\n * Attribute component types that reach the shader as raw integers rather than\n * as floats. Everything else - including normalised integer types such as the\n * quad mode's `u8x4` colour - goes through `vertexAttribPointer` and arrives as\n * a float, so only these two need `vertexAttribIPointer`.\n */\nconst integerAttributeTypes = new Set<AttributeType>(['u32', 'i32']);\n\nconst resolveAttributeType = (gl: WebGL2RenderingContext, type: AttributeType): number => {\n switch (type) {\n case 'f32':\n return gl.FLOAT;\n case 'u8':\n return gl.UNSIGNED_BYTE;\n case 'u16':\n return gl.UNSIGNED_SHORT;\n case 'u32':\n return gl.UNSIGNED_INT;\n case 'i32':\n return gl.INT;\n }\n};\n\ninterface ParticleRendererConnection {\n readonly gl: WebGL2RenderingContext;\n readonly buffers: Map<WebGl2RenderBuffer, { handle: WebGLBuffer; dataByteLength: number }>;\n}\n\n/**\n * The GL-side realisation of one render mode: its compiled program, its vertex\n * array object and the buffers behind it. Cached per {@link Material} - the\n * mode's material is its stable identity, and its `destroy()` evicts the entry.\n */\ninterface ParticleModeResources {\n readonly shader: Shader;\n readonly vao: WebGl2VertexArrayObject;\n readonly vertexBuffer: WebGl2RenderBuffer;\n /** Per-vertex buffer for a mode that supplies its own geometry, else null. */\n readonly meshBuffer: WebGl2RenderBuffer | null;\n /** Geometry version last uploaded into {@link meshBuffer}; -1 when there is none. */\n meshVersion: number;\n readonly indexBuffer: WebGl2RenderBuffer | null;\n readonly stride: number;\n readonly primitive: RenderingPrimitives;\n readonly instanced: boolean;\n /** Indices (or vertices, when the geometry carries none) per drawn element. */\n readonly indexCount: number;\n /** Byte view over the mode's scratch buffer, rebuilt whenever the mode grows it. */\n bytes: Uint8Array;\n source: ArrayBuffer | null;\n view: View | null;\n viewId: number;\n}\n\n/**\n * Particle renderer for WebGL2.\n *\n * One ParticleSystem = one batch. The system's {@link ParticleRenderMode} owns\n * the *how* - vertex layout, shader pair, draw model and the loop that fills\n * the buffer - and this renderer is the executor: each `render(system)` flushes\n * any pending batch, sets the system-level uniforms (transform, local bounds,\n * texture) and asks the mode to build its vertex data. The next `flush()`\n * uploads that data and issues the single draw the mode declares.\n *\n * Everything mode-specific is read off the mode's `dataLayout`/`Material`, so a\n * new primitive is a new mode rather than a change here: the vertex array\n * object is wired from the layout's named attributes, the draw is instanced or\n * plain per `ParticleRenderMode.instanced`, and its primitive comes from the\n * topology.\n *\n * A mode declaring a `vertexGeometry` adds a second buffer to that vertex array\n * object, stepping per vertex (divisor 0) beside the per-instance one, and its\n * geometry supplies the topology and indices instead.\n */\nexport class WebGl2ParticleRenderer extends AbstractWebGl2Renderer<ParticleSystem> {\n /**\n * The particle system's transform is bound as a `u_systemTransform` uniform and\n * each particle is positioned system-locally, so this renderer never reads the\n * shared {@link TransformBuffer}; the render-group upload boundary skips writing\n * transform records for particle draws.\n * @internal\n */\n public readonly _consumesSharedTransform = false;\n\n /** Particles the GL-side vertex store is pre-sized for. A hint, not a limit. */\n private readonly _batchSize: number;\n private readonly _resources = new Map<Material, ParticleModeResources>();\n /**\n * Materials this renderer already registered a dispose listener on.\n *\n * `Material` has no unsubscribe, and a disconnect clears {@link _resources}\n * without clearing the material's callback set - so registering on every\n * resource creation would leave one dead closure per material behind on\n * every device-loss/reconnect cycle. The listener stays valid across those\n * cycles (it resolves the entry through the map when it fires), so it is\n * registered once and this set remembers that. Weak, so a material dropped\n * without `destroy()` stays collectable.\n */\n private readonly _disposeListenerRegistered = new WeakSet<Material>();\n\n private _drawCount = 0;\n private _pendingMode: ParticleRenderMode | null = null;\n private _pendingResources: ParticleModeResources | null = null;\n private _currentTexture: Texture | null = null;\n private _currentBlendMode: BlendModes | null = null;\n private _connection: ParticleRendererConnection | null = null;\n\n public constructor(batchSize: number) {\n super();\n\n this._batchSize = batchSize;\n }\n\n public render(system: ParticleSystem): this {\n const backend = this.getBackend();\n const { texture, blendMode } = system;\n const textureChanged = texture !== this._currentTexture;\n const blendModeChanged = blendMode !== this._currentBlendMode;\n\n // System transform / texture / UV / local-bounds are uniforms, so\n // mixing systems in one batch is invalid. Flush any prior system\n // before setting up this one.\n this.flush();\n\n if (textureChanged) {\n this._currentTexture = texture;\n backend.bindTexture(texture);\n }\n\n if (blendModeChanged) {\n this._currentBlendMode = blendMode;\n backend.setBlendMode(blendMode);\n }\n\n const mode = system.renderMode;\n const resources = this._getOrCreateResources(mode);\n const shader = resources.shader;\n\n // System-level uniforms are set before building so the eventual flush()\n // can sync them in one go. Guarded by declaration: they are offers to the\n // mode's shader, not requirements on it.\n if (shader.uniforms.has('u_systemTransform')) {\n shader.getUniform('u_systemTransform').setValue(system.getGlobalTransform().toArray(false));\n }\n\n if (shader.uniforms.has('u_localBounds')) {\n shader.getUniform('u_localBounds').setValue(system.vertices);\n }\n\n mode.build(system, system._storage);\n\n this._pendingMode = mode;\n this._pendingResources = resources;\n this._drawCount = mode.count;\n\n return this;\n }\n\n public flush(): void {\n const backend = this.getBackendOrNull();\n const mode = this._pendingMode;\n const resources = this._pendingResources;\n\n if (this._drawCount === 0 || backend === null || mode === null || resources === null) {\n return;\n }\n\n const view = backend.view;\n\n if (resources.view !== view || resources.viewId !== view.updateId) {\n resources.view = view;\n resources.viewId = view.updateId;\n\n if (resources.shader.uniforms.has('u_projection')) {\n resources.shader.getUniform('u_projection').setValue(view.getTransform().toArray(false));\n }\n }\n\n resources.shader.sync();\n backend.bindVertexArrayObject(resources.vao);\n\n // Re-upload the mode's own geometry only when it was mutated since the last\n // draw. One integer comparison keeps an unchanging mesh off the bus.\n const meshGeometry = mode.vertexGeometry;\n\n if (meshGeometry !== null && resources.meshBuffer !== null && resources.meshVersion !== meshGeometry.version) {\n resources.meshVersion = meshGeometry.version;\n resources.meshBuffer.upload(meshGeometry.vertexData);\n }\n\n resources.vertexBuffer.upload(this._resolveUploadSource(mode, resources), 0, this._drawCount * resources.stride);\n\n const sampler = mode.material.sampler;\n\n if (sampler !== null) {\n backend.bindMaterialSampler(sampler, 0);\n }\n\n if (resources.instanced) {\n resources.vao.drawInstanced(resources.indexCount, 0, this._drawCount, resources.primitive);\n } else {\n resources.vao.draw(resources.indexBuffer !== null ? resources.indexCount : this._drawCount, 0, resources.primitive);\n }\n\n if (sampler !== null) {\n backend.unbindMaterialSampler(0);\n }\n\n backend.stats.batches++;\n backend.stats.drawCalls++;\n\n this._drawCount = 0;\n this._pendingMode = null;\n this._pendingResources = null;\n }\n\n protected onConnect(backend: WebGl2Backend): void {\n this._connection = { gl: backend.context, buffers: new Map() };\n }\n\n protected onDisconnect(): void {\n for (const resources of this._resources.values()) {\n this._destroyResources(resources);\n }\n\n this._resources.clear();\n this._connection = null;\n this._currentTexture = null;\n this._currentBlendMode = null;\n this._drawCount = 0;\n this._pendingMode = null;\n this._pendingResources = null;\n }\n\n public destroy(): void {\n this.disconnect();\n }\n\n /**\n * The mode's scratch buffer as bytes. The view is cached and only rebuilt\n * when the mode swaps in a larger backing buffer; how much of it this draw\n * uploads is expressed as an element count at the upload call, so a steady\n * frame allocates nothing at all.\n */\n private _resolveUploadSource(mode: ParticleRenderMode, resources: ParticleModeResources): Uint8Array {\n const data = mode.data;\n\n if (resources.source !== data) {\n resources.source = data;\n resources.bytes = new Uint8Array(data);\n }\n\n return resources.bytes;\n }\n\n private _getOrCreateResources(mode: ParticleRenderMode): ParticleModeResources {\n const connection = this._connection;\n\n if (connection === null) {\n throw new Error('WebGl2ParticleRenderer is not connected to a backend.');\n }\n\n const material = mode.material;\n const cached = this._resources.get(material);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const created = this._createResources(mode, material, connection);\n\n this._resources.set(material, created);\n\n if (!this._disposeListenerRegistered.has(material)) {\n this._disposeListenerRegistered.add(material);\n\n // A destroyed mode takes its GPU resources with it: `ParticleSystem.destroy`\n // destroys a mode it owns, which destroys the material.\n material._onDispose(() => {\n // `Material.destroy` drops its callbacks after firing them, so this\n // registration is gone - forget it, and the next creation re-registers.\n this._disposeListenerRegistered.delete(material);\n\n const stored = this._resources.get(material);\n\n if (stored === undefined) {\n return;\n }\n\n if (this._pendingResources === stored) {\n this._drawCount = 0;\n this._pendingMode = null;\n this._pendingResources = null;\n }\n\n this._destroyResources(stored);\n this._resources.delete(material);\n });\n }\n\n return created;\n }\n\n private _createResources(mode: ParticleRenderMode, material: Material, connection: ParticleRendererConnection): ParticleModeResources {\n const gl = connection.gl;\n const glsl = material.shader.glsl;\n\n if (glsl === null) {\n throw new Error('Particle material shader has no `glsl` source; cannot render through the WebGL2 backend.');\n }\n\n const layout = mode.dataLayout;\n const meshGeometry = mode.vertexGeometry;\n\n assertVertexGeometryCompatible(layout, meshGeometry, mode.instanced, mode.constructor.name);\n\n const shader = new Shader(glsl.vertex, glsl.fragment);\n\n shader.connect(createWebGl2ShaderProgram(gl));\n // Force the first finalize so the attribute/uniform maps read below are populated.\n shader.sync();\n\n // A mode with its own per-vertex geometry draws that geometry's topology\n // and indices; one without derives its vertices in the shader and carries\n // both on its layout instead.\n const indices = meshGeometry !== null ? meshGeometry.indices : layout.indices;\n const topology = meshGeometry !== null ? meshGeometry.topology : layout.topology;\n const indexCount = meshGeometry !== null ? meshGeometry.indexCount : layout.indexCount;\n const indexBuffer =\n indices !== null\n ? new WebGl2RenderBuffer(BufferTypes.ElementArrayBuffer, indices, BufferUsage.StaticDraw).connect(this._createBufferRuntime(connection))\n : null;\n\n // Pre-sized rather than capped: the mode grows its scratch buffer with the\n // live particle count and the GL store is re-sized from it on upload, so a\n // system drawing past the batch size still draws every particle.\n const vertexBuffer = new WebGl2RenderBuffer(\n BufferTypes.ArrayBuffer,\n new ArrayBuffer(this._batchSize * layout.stride),\n usageByGeometryUsage[layout.usage],\n ).connect(this._createBufferRuntime(connection));\n\n const meshBuffer =\n meshGeometry !== null\n ? new WebGl2RenderBuffer(BufferTypes.ArrayBuffer, meshGeometry.vertexData, usageByGeometryUsage[meshGeometry.usage]).connect(\n this._createBufferRuntime(connection),\n )\n : null;\n\n const vaoHandle = gl.createVertexArray();\n\n if (vaoHandle === null) {\n throw new Error('WebGl2ParticleRenderer: could not create vertex array object.');\n }\n\n // Per-instance for an instanced mode, per-vertex otherwise - the same\n // interleaved layout serves both draw models.\n const divisor = mode.instanced ? 1 : 0;\n const vao = new WebGl2VertexArrayObject();\n\n if (indexBuffer !== null) {\n vao.addIndex(indexBuffer);\n }\n\n for (const attribute of layout.attributes) {\n vao.addAttribute(\n vertexBuffer,\n shader.getAttribute(attribute.name),\n resolveAttributeType(gl, attribute.type),\n attribute.normalized,\n layout.stride,\n attribute.offset,\n !attribute.normalized && integerAttributeTypes.has(attribute.type),\n divisor,\n );\n }\n\n // The mesh's own vertices step once per vertex (divisor 0) beside the\n // per-instance records above, which is what lets one instanced draw expand\n // a shared shape per particle.\n if (meshGeometry !== null && meshBuffer !== null) {\n for (const attribute of meshGeometry.attributes) {\n vao.addAttribute(\n meshBuffer,\n shader.getAttribute(attribute.name),\n resolveAttributeType(gl, attribute.type),\n attribute.normalized,\n meshGeometry.stride,\n attribute.offset,\n !attribute.normalized && integerAttributeTypes.has(attribute.type),\n 0,\n );\n }\n }\n\n vao.connect(this._createVaoRuntime(connection, vaoHandle, indices instanceof Uint32Array ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT));\n\n return {\n shader,\n vao,\n vertexBuffer,\n meshBuffer,\n meshVersion: meshGeometry?.version ?? -1,\n indexBuffer,\n stride: layout.stride,\n primitive: resolvePrimitive(topology),\n instanced: mode.instanced,\n indexCount,\n bytes: new Uint8Array(0),\n source: null,\n view: null,\n viewId: -1,\n };\n }\n\n private _destroyResources(resources: ParticleModeResources): void {\n resources.vao.destroy();\n resources.vertexBuffer.destroy();\n resources.meshBuffer?.destroy();\n resources.indexBuffer?.destroy();\n resources.shader.destroy();\n }\n\n private _createBufferRuntime(connection: ParticleRendererConnection): WebGl2RenderBufferRuntime {\n const handle = connection.gl.createBuffer();\n\n if (handle === null) {\n throw new Error('WebGl2ParticleRenderer: could not create render buffer.');\n }\n\n return {\n bind: (buffer): void => {\n connection.gl.bindBuffer(buffer.type, handle);\n },\n upload: (buffer, offset): void => {\n const gl = connection.gl;\n const state = connection.buffers.get(buffer);\n\n gl.bindBuffer(buffer.type, handle);\n\n if (state && state.dataByteLength >= buffer.uploadByteLength) {\n uploadBufferRange(gl, buffer, offset);\n state.dataByteLength = buffer.uploadByteLength;\n } else {\n uploadBufferStore(gl, buffer);\n connection.buffers.set(buffer, { handle, dataByteLength: buffer.uploadByteLength });\n }\n },\n destroy: (buffer): void => {\n connection.gl.deleteBuffer(handle);\n connection.buffers.delete(buffer);\n buffer.disconnect();\n },\n };\n }\n\n private _createVaoRuntime(connection: ParticleRendererConnection, vaoHandle: WebGLVertexArrayObject, indexType: number): WebGl2VertexArrayObjectRuntime {\n let appliedVersion = -1;\n\n return {\n bind: (vao): void => {\n const gl = connection.gl;\n\n gl.bindVertexArray(vaoHandle);\n\n if (appliedVersion !== vao.version) {\n let lastBuffer: WebGl2RenderBuffer | null = null;\n\n for (const attribute of vao.attributes) {\n if (lastBuffer !== attribute.buffer) {\n attribute.buffer.bind();\n lastBuffer = attribute.buffer;\n }\n\n if (attribute.integer) {\n gl.vertexAttribIPointer(attribute.location, attribute.size, attribute.type, attribute.stride, attribute.start);\n } else {\n gl.vertexAttribPointer(attribute.location, attribute.size, attribute.type, attribute.normalized, attribute.stride, attribute.start);\n }\n\n gl.enableVertexAttribArray(attribute.location);\n gl.vertexAttribDivisor(attribute.location, attribute.divisor);\n }\n\n if (vao.indexBuffer) {\n vao.indexBuffer.bind();\n }\n\n appliedVersion = vao.version;\n }\n },\n unbind: (): void => {\n connection.gl.bindVertexArray(null);\n },\n draw: (vao, size, start, type): void => {\n const gl = connection.gl;\n\n if (vao.indexBuffer) {\n gl.drawElements(type, size, indexType, start);\n } else {\n gl.drawArrays(type, start, size);\n }\n },\n drawInstanced: (vao, count, start, instanceCount, type): void => {\n const gl = connection.gl;\n\n if (vao.indexBuffer) {\n gl.drawElementsInstanced(type, count, indexType, start, instanceCount);\n } else {\n gl.drawArraysInstanced(type, start, count, instanceCount);\n }\n },\n destroy: (vao): void => {\n connection.gl.deleteVertexArray(vaoHandle);\n vao.disconnect();\n },\n };\n }\n}\n"],"mappings":";;;;AAgBA,MAAM,oBAAoB,aAA4C;CACpE,QAAQ,UAAR;EACE,KAAK,iBACH,OAAO,oBAAoB;EAC7B,KAAK,kBACH,OAAO,oBAAoB;CAC/B;AACF;AAEA,MAAM,uBAA2D;CAC/D,QAAQ,YAAY;CACpB,SAAS,YAAY;CACrB,QAAQ,YAAY;AACtB;;;;;;;AAQA,MAAM,wCAAwB,IAAI,IAAmB,CAAC,OAAO,KAAK,CAAC;AAEnE,MAAM,wBAAwB,IAA4B,SAAgC;CACxF,QAAQ,MAAR;EACE,KAAK,OACH,OAAO,GAAG;EACZ,KAAK,MACH,OAAO,GAAG;EACZ,KAAK,OACH,OAAO,GAAG;EACZ,KAAK,OACH,OAAO,GAAG;EACZ,KAAK,OACH,OAAO,GAAG;CACd;AACF;;;;;;;;;;;;;;;;;;;;;AAqDA,IAAa,yBAAb,cAA4C,uBAAuC;;;;;;;;CAQjF,AAAgB,2BAA2B;;CAG3C,AAAiB;CACjB,AAAiB,6BAAa,IAAI,IAAqC;;;;;;;;;;;;CAYvE,AAAiB,6CAA6B,IAAI,QAAkB;CAEpE,AAAQ,aAAa;CACrB,AAAQ,eAA0C;CAClD,AAAQ,oBAAkD;CAC1D,AAAQ,kBAAkC;CAC1C,AAAQ,oBAAuC;CAC/C,AAAQ,cAAiD;CAEzD,AAAO,YAAY,WAAmB;EACpC,MAAM;EAEN,KAAK,aAAa;CACpB;CAEA,AAAO,OAAO,QAA8B;EAC1C,MAAM,UAAU,KAAK,WAAW;EAChC,MAAM,EAAE,SAAS,cAAc;EAC/B,MAAM,iBAAiB,YAAY,KAAK;EACxC,MAAM,mBAAmB,cAAc,KAAK;EAK5C,KAAK,MAAM;EAEX,IAAI,gBAAgB;GAClB,KAAK,kBAAkB;GACvB,QAAQ,YAAY,OAAO;EAC7B;EAEA,IAAI,kBAAkB;GACpB,KAAK,oBAAoB;GACzB,QAAQ,aAAa,SAAS;EAChC;EAEA,MAAM,OAAO,OAAO;EACpB,MAAM,YAAY,KAAK,sBAAsB,IAAI;EACjD,MAAM,SAAS,UAAU;EAKzB,IAAI,OAAO,SAAS,IAAI,mBAAmB,GACzC,OAAO,WAAW,mBAAmB,CAAC,CAAC,SAAS,OAAO,mBAAmB,CAAC,CAAC,QAAQ,KAAK,CAAC;EAG5F,IAAI,OAAO,SAAS,IAAI,eAAe,GACrC,OAAO,WAAW,eAAe,CAAC,CAAC,SAAS,OAAO,QAAQ;EAG7D,KAAK,MAAM,QAAQ,OAAO,QAAQ;EAElC,KAAK,eAAe;EACpB,KAAK,oBAAoB;EACzB,KAAK,aAAa,KAAK;EAEvB,OAAO;CACT;CAEA,AAAO,QAAc;EACnB,MAAM,UAAU,KAAK,iBAAiB;EACtC,MAAM,OAAO,KAAK;EAClB,MAAM,YAAY,KAAK;EAEvB,IAAI,KAAK,eAAe,KAAK,YAAY,QAAQ,SAAS,QAAQ,cAAc,MAC9E;EAGF,MAAM,OAAO,QAAQ;EAErB,IAAI,UAAU,SAAS,QAAQ,UAAU,WAAW,KAAK,UAAU;GACjE,UAAU,OAAO;GACjB,UAAU,SAAS,KAAK;GAExB,IAAI,UAAU,OAAO,SAAS,IAAI,cAAc,GAC9C,UAAU,OAAO,WAAW,cAAc,CAAC,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC,QAAQ,KAAK,CAAC;EAE3F;EAEA,UAAU,OAAO,KAAK;EACtB,QAAQ,sBAAsB,UAAU,GAAG;EAI3C,MAAM,eAAe,KAAK;EAE1B,IAAI,iBAAiB,QAAQ,UAAU,eAAe,QAAQ,UAAU,gBAAgB,aAAa,SAAS;GAC5G,UAAU,cAAc,aAAa;GACrC,UAAU,WAAW,OAAO,aAAa,UAAU;EACrD;EAEA,UAAU,aAAa,OAAO,KAAK,qBAAqB,MAAM,SAAS,GAAG,GAAG,KAAK,aAAa,UAAU,MAAM;EAE/G,MAAM,UAAU,KAAK,SAAS;EAE9B,IAAI,YAAY,MACd,QAAQ,oBAAoB,SAAS,CAAC;EAGxC,IAAI,UAAU,WACZ,UAAU,IAAI,cAAc,UAAU,YAAY,GAAG,KAAK,YAAY,UAAU,SAAS;OAEzF,UAAU,IAAI,KAAK,UAAU,gBAAgB,OAAO,UAAU,aAAa,KAAK,YAAY,GAAG,UAAU,SAAS;EAGpH,IAAI,YAAY,MACd,QAAQ,sBAAsB,CAAC;EAGjC,QAAQ,MAAM;EACd,QAAQ,MAAM;EAEd,KAAK,aAAa;EAClB,KAAK,eAAe;EACpB,KAAK,oBAAoB;CAC3B;CAEA,AAAU,UAAU,SAA8B;EAChD,KAAK,cAAc;GAAE,IAAI,QAAQ;GAAS,yBAAS,IAAI,IAAI;EAAE;CAC/D;CAEA,AAAU,eAAqB;EAC7B,KAAK,MAAM,aAAa,KAAK,WAAW,OAAO,GAC7C,KAAK,kBAAkB,SAAS;EAGlC,KAAK,WAAW,MAAM;EACtB,KAAK,cAAc;EACnB,KAAK,kBAAkB;EACvB,KAAK,oBAAoB;EACzB,KAAK,aAAa;EAClB,KAAK,eAAe;EACpB,KAAK,oBAAoB;CAC3B;CAEA,AAAO,UAAgB;EACrB,KAAK,WAAW;CAClB;;;;;;;CAQA,AAAQ,qBAAqB,MAA0B,WAA8C;EACnG,MAAM,OAAO,KAAK;EAElB,IAAI,UAAU,WAAW,MAAM;GAC7B,UAAU,SAAS;GACnB,UAAU,QAAQ,IAAI,WAAW,IAAI;EACvC;EAEA,OAAO,UAAU;CACnB;CAEA,AAAQ,sBAAsB,MAAiD;EAC7E,MAAM,aAAa,KAAK;EAExB,IAAI,eAAe,MACjB,MAAM,IAAI,MAAM,uDAAuD;EAGzE,MAAM,WAAW,KAAK;EACtB,MAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;EAE3C,IAAI,WAAW,QACb,OAAO;EAGT,MAAM,UAAU,KAAK,iBAAiB,MAAM,UAAU,UAAU;EAEhE,KAAK,WAAW,IAAI,UAAU,OAAO;EAErC,IAAI,CAAC,KAAK,2BAA2B,IAAI,QAAQ,GAAG;GAClD,KAAK,2BAA2B,IAAI,QAAQ;GAI5C,SAAS,iBAAiB;IAGxB,KAAK,2BAA2B,OAAO,QAAQ;IAE/C,MAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;IAE3C,IAAI,WAAW,QACb;IAGF,IAAI,KAAK,sBAAsB,QAAQ;KACrC,KAAK,aAAa;KAClB,KAAK,eAAe;KACpB,KAAK,oBAAoB;IAC3B;IAEA,KAAK,kBAAkB,MAAM;IAC7B,KAAK,WAAW,OAAO,QAAQ;GACjC,CAAC;EACH;EAEA,OAAO;CACT;CAEA,AAAQ,iBAAiB,MAA0B,UAAoB,YAA+D;EACpI,MAAM,KAAK,WAAW;EACtB,MAAM,OAAO,SAAS,OAAO;EAE7B,IAAI,SAAS,MACX,MAAM,IAAI,MAAM,0FAA0F;EAG5G,MAAM,SAAS,KAAK;EACpB,MAAM,eAAe,KAAK;EAE1B,+BAA+B,QAAQ,cAAc,KAAK,WAAW,KAAK,YAAY,IAAI;EAE1F,MAAM,SAAS,IAAI,OAAO,KAAK,QAAQ,KAAK,QAAQ;EAEpD,OAAO,QAAQ,0BAA0B,EAAE,CAAC;EAE5C,OAAO,KAAK;EAKZ,MAAM,UAAU,iBAAiB,OAAO,aAAa,UAAU,OAAO;EACtE,MAAM,WAAW,iBAAiB,OAAO,aAAa,WAAW,OAAO;EACxE,MAAM,aAAa,iBAAiB,OAAO,aAAa,aAAa,OAAO;EAC5E,MAAM,cACJ,YAAY,OACR,IAAI,mBAAmB,YAAY,oBAAoB,SAAS,YAAY,UAAU,CAAC,CAAC,QAAQ,KAAK,qBAAqB,UAAU,CAAC,IACrI;EAKN,MAAM,eAAe,IAAI,mBACvB,YAAY,aACZ,IAAI,YAAY,KAAK,aAAa,OAAO,MAAM,GAC/C,qBAAqB,OAAO,MAC9B,CAAC,CAAC,QAAQ,KAAK,qBAAqB,UAAU,CAAC;EAE/C,MAAM,aACJ,iBAAiB,OACb,IAAI,mBAAmB,YAAY,aAAa,aAAa,YAAY,qBAAqB,aAAa,MAAM,CAAC,CAAC,QACjH,KAAK,qBAAqB,UAAU,CACtC,IACA;EAEN,MAAM,YAAY,GAAG,kBAAkB;EAEvC,IAAI,cAAc,MAChB,MAAM,IAAI,MAAM,+DAA+D;EAKjF,MAAM,UAAU,KAAK,YAAY,IAAI;EACrC,MAAM,MAAM,IAAI,wBAAwB;EAExC,IAAI,gBAAgB,MAClB,IAAI,SAAS,WAAW;EAG1B,KAAK,MAAM,aAAa,OAAO,YAC7B,IAAI,aACF,cACA,OAAO,aAAa,UAAU,IAAI,GAClC,qBAAqB,IAAI,UAAU,IAAI,GACvC,UAAU,YACV,OAAO,QACP,UAAU,QACV,CAAC,UAAU,cAAc,sBAAsB,IAAI,UAAU,IAAI,GACjE,OACF;EAMF,IAAI,iBAAiB,QAAQ,eAAe,MAC1C,KAAK,MAAM,aAAa,aAAa,YACnC,IAAI,aACF,YACA,OAAO,aAAa,UAAU,IAAI,GAClC,qBAAqB,IAAI,UAAU,IAAI,GACvC,UAAU,YACV,aAAa,QACb,UAAU,QACV,CAAC,UAAU,cAAc,sBAAsB,IAAI,UAAU,IAAI,GACjE,CACF;EAIJ,IAAI,QAAQ,KAAK,kBAAkB,YAAY,WAAW,mBAAmB,cAAc,GAAG,eAAe,GAAG,cAAc,CAAC;EAE/H,OAAO;GACL;GACA;GACA;GACA;GACA,aAAa,cAAc,WAAW;GACtC;GACA,QAAQ,OAAO;GACf,WAAW,iBAAiB,QAAQ;GACpC,WAAW,KAAK;GAChB;GACA,uBAAO,IAAI,WAAW,CAAC;GACvB,QAAQ;GACR,MAAM;GACN,QAAQ;EACV;CACF;CAEA,AAAQ,kBAAkB,WAAwC;EAChE,UAAU,IAAI,QAAQ;EACtB,UAAU,aAAa,QAAQ;EAC/B,UAAU,YAAY,QAAQ;EAC9B,UAAU,aAAa,QAAQ;EAC/B,UAAU,OAAO,QAAQ;CAC3B;CAEA,AAAQ,qBAAqB,YAAmE;EAC9F,MAAM,SAAS,WAAW,GAAG,aAAa;EAE1C,IAAI,WAAW,MACb,MAAM,IAAI,MAAM,yDAAyD;EAG3E,OAAO;GACL,OAAO,WAAiB;IACtB,WAAW,GAAG,WAAW,OAAO,MAAM,MAAM;GAC9C;GACA,SAAS,QAAQ,WAAiB;IAChC,MAAM,KAAK,WAAW;IACtB,MAAM,QAAQ,WAAW,QAAQ,IAAI,MAAM;IAE3C,GAAG,WAAW,OAAO,MAAM,MAAM;IAEjC,IAAI,SAAS,MAAM,kBAAkB,OAAO,kBAAkB;KAC5D,kBAAkB,IAAI,QAAQ,MAAM;KACpC,MAAM,iBAAiB,OAAO;IAChC,OAAO;KACL,kBAAkB,IAAI,MAAM;KAC5B,WAAW,QAAQ,IAAI,QAAQ;MAAE;MAAQ,gBAAgB,OAAO;KAAiB,CAAC;IACpF;GACF;GACA,UAAU,WAAiB;IACzB,WAAW,GAAG,aAAa,MAAM;IACjC,WAAW,QAAQ,OAAO,MAAM;IAChC,OAAO,WAAW;GACpB;EACF;CACF;CAEA,AAAQ,kBAAkB,YAAwC,WAAmC,WAAmD;EACtJ,IAAI,iBAAiB;EAErB,OAAO;GACL,OAAO,QAAc;IACnB,MAAM,KAAK,WAAW;IAEtB,GAAG,gBAAgB,SAAS;IAE5B,IAAI,mBAAmB,IAAI,SAAS;KAClC,IAAI,aAAwC;KAE5C,KAAK,MAAM,aAAa,IAAI,YAAY;MACtC,IAAI,eAAe,UAAU,QAAQ;OACnC,UAAU,OAAO,KAAK;OACtB,aAAa,UAAU;MACzB;MAEA,IAAI,UAAU,SACZ,GAAG,qBAAqB,UAAU,UAAU,UAAU,MAAM,UAAU,MAAM,UAAU,QAAQ,UAAU,KAAK;WAE7G,GAAG,oBAAoB,UAAU,UAAU,UAAU,MAAM,UAAU,MAAM,UAAU,YAAY,UAAU,QAAQ,UAAU,KAAK;MAGpI,GAAG,wBAAwB,UAAU,QAAQ;MAC7C,GAAG,oBAAoB,UAAU,UAAU,UAAU,OAAO;KAC9D;KAEA,IAAI,IAAI,aACN,IAAI,YAAY,KAAK;KAGvB,iBAAiB,IAAI;IACvB;GACF;GACA,cAAoB;IAClB,WAAW,GAAG,gBAAgB,IAAI;GACpC;GACA,OAAO,KAAK,MAAM,OAAO,SAAe;IACtC,MAAM,KAAK,WAAW;IAEtB,IAAI,IAAI,aACN,GAAG,aAAa,MAAM,MAAM,WAAW,KAAK;SAE5C,GAAG,WAAW,MAAM,OAAO,IAAI;GAEnC;GACA,gBAAgB,KAAK,OAAO,OAAO,eAAe,SAAe;IAC/D,MAAM,KAAK,WAAW;IAEtB,IAAI,IAAI,aACN,GAAG,sBAAsB,MAAM,OAAO,WAAW,OAAO,aAAa;SAErE,GAAG,oBAAoB,MAAM,OAAO,OAAO,aAAa;GAE5D;GACA,UAAU,QAAc;IACtB,WAAW,GAAG,kBAAkB,SAAS;IACzC,IAAI,WAAW;GACjB;EACF;CACF;AACF"}
|
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
import type { WebGpuBackend } from '@codexo/exojs/renderer-sdk';
|
|
2
2
|
import { AbstractWebGpuRenderer } from '@codexo/exojs/renderer-sdk';
|
|
3
3
|
import type { ParticleSystem } from '#ParticleSystem';
|
|
4
|
+
/**
|
|
5
|
+
* Particle renderer for WebGPU.
|
|
6
|
+
*
|
|
7
|
+
* One ParticleSystem = one draw call. The system's {@link ParticleRenderMode}
|
|
8
|
+
* owns the *how* - vertex layout, shader, draw model and the loop that fills
|
|
9
|
+
* the buffer - and this renderer is the executor: it holds the system-level
|
|
10
|
+
* uniforms (projection, transform, local bounds, texture flags), uploads what
|
|
11
|
+
* the mode built and issues the draw the mode declares.
|
|
12
|
+
*
|
|
13
|
+
* Everything mode-specific is read off the mode's `dataLayout`/`Material`
|
|
14
|
+
* rather than hard-coded: the render pipeline's vertex layout comes from the
|
|
15
|
+
* layout's attributes and stride, its shader from the material's WGSL, and the
|
|
16
|
+
* draw is instanced or plain per `ParticleRenderMode.instanced`. A mode
|
|
17
|
+
* declaring a `vertexGeometry` gets a second buffer stepping per vertex, and
|
|
18
|
+
* that geometry supplies the topology and indices instead.
|
|
19
|
+
*
|
|
20
|
+
* WGSL binds vertex inputs by number rather than by name, and `GeometryAttribute`
|
|
21
|
+
* carries no location, so the binding rule is positional: `@location(i)` is
|
|
22
|
+
* `dataLayout.attributes[i]`, with any per-vertex attributes taking the
|
|
23
|
+
* locations after them. This is the WebGPU counterpart of the WebGL2 renderer's
|
|
24
|
+
* name lookup through the compiled program.
|
|
25
|
+
*
|
|
26
|
+
* A system running in GPU compute mode bypasses the mode's builder entirely:
|
|
27
|
+
* its compute pipeline has already written the interleaved instance data
|
|
28
|
+
* GPU-side, so that buffer is bound directly.
|
|
29
|
+
*/
|
|
4
30
|
export declare class WebGpuParticleRenderer extends AbstractWebGpuRenderer<ParticleSystem> {
|
|
5
31
|
/**
|
|
6
32
|
* The particle system's transform is bound as a uniform and each particle is
|
|
@@ -13,36 +39,91 @@ export declare class WebGpuParticleRenderer extends AbstractWebGpuRenderer<Parti
|
|
|
13
39
|
private _drawCallCount;
|
|
14
40
|
private readonly _uniformData;
|
|
15
41
|
private _device;
|
|
16
|
-
private _shaderModule;
|
|
17
42
|
private _uniformBindGroupLayout;
|
|
18
43
|
private _textureBindGroupLayout;
|
|
19
44
|
private _pipelineLayout;
|
|
20
45
|
private _uniformBuffer;
|
|
21
46
|
private _uniformBindGroup;
|
|
22
|
-
private
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
47
|
+
private _uniformBufferCapacity;
|
|
48
|
+
/**
|
|
49
|
+
* Slots of the uniform ring the open pass has consumed, and the pass they are
|
|
50
|
+
* scoped to. One draw call takes one slot; the base is added as the bind
|
|
51
|
+
* group's dynamic offset, so consecutive flushes append instead of all
|
|
52
|
+
* rewriting slot 0. Same identity-comparison rule as
|
|
53
|
+
* {@link ParticleModeResources.passRef}, one level up: the ring is shared by
|
|
54
|
+
* every mode this renderer draws.
|
|
55
|
+
*/
|
|
56
|
+
private _uniformPassSlots;
|
|
57
|
+
private _ownDrawsPass;
|
|
58
|
+
private readonly _resources;
|
|
59
|
+
/**
|
|
60
|
+
* Materials this renderer already registered a dispose listener on.
|
|
61
|
+
*
|
|
62
|
+
* `Material` has no unsubscribe, and a disconnect clears {@link _resources}
|
|
63
|
+
* without clearing the material's callback set - so registering on every
|
|
64
|
+
* resource creation would leave one dead closure per material behind on
|
|
65
|
+
* every device-loss/reconnect cycle. The listener stays valid across those
|
|
66
|
+
* cycles (it resolves the entry through the map when it fires), so it is
|
|
67
|
+
* registered once and this set remembers that. Weak, so a material dropped
|
|
68
|
+
* without `destroy()` stays collectable.
|
|
69
|
+
*/
|
|
70
|
+
private readonly _disposeListenerRegistered;
|
|
30
71
|
render(system: ParticleSystem): void;
|
|
31
72
|
flush(): void;
|
|
32
73
|
destroy(): void;
|
|
33
74
|
protected onConnect(backend: WebGpuBackend): void;
|
|
34
75
|
protected onDisconnect(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Append one system's draw at the open pass's cursors and record it, leaving
|
|
78
|
+
* the pass open. Ends (submits) the pass first only where appending cannot
|
|
79
|
+
* cover the hazard - see {@link _appendWouldAlias}.
|
|
80
|
+
*/
|
|
81
|
+
private _drawSystem;
|
|
82
|
+
/**
|
|
83
|
+
* Whether appending this draw would retroactively change what a draw already
|
|
84
|
+
* recorded into the open pass reads - in which case the caller ends (submits)
|
|
85
|
+
* that pass first, which restarts every cursor at 0.
|
|
86
|
+
*/
|
|
87
|
+
private _appendWouldAlias;
|
|
88
|
+
/**
|
|
89
|
+
* Bytes of the mode's vertex buffer `active` has consumed, or 0 when it holds
|
|
90
|
+
* none of that mode's draws (a different pass, or none open).
|
|
91
|
+
*/
|
|
92
|
+
private _modePassBytes;
|
|
93
|
+
/** Uniform ring slots `active` has consumed, or 0 when it holds no draws of ours. */
|
|
94
|
+
private _uniformPassBase;
|
|
95
|
+
/**
|
|
96
|
+
* Upload what the mode just built into this draw's sub-range of the mode's
|
|
97
|
+
* vertex buffer, growing it to the pass total first. Returns the buffer to
|
|
98
|
+
* bind, since growth replaces it.
|
|
99
|
+
*/
|
|
100
|
+
private _uploadModeData;
|
|
101
|
+
private _getOrCreateResources;
|
|
102
|
+
private _createResources;
|
|
103
|
+
/**
|
|
104
|
+
* Re-write the mode's own geometry only when it was mutated since the last
|
|
105
|
+
* draw. One integer comparison keeps an unchanging mesh off the bus.
|
|
106
|
+
*/
|
|
107
|
+
private _syncMeshBuffer;
|
|
108
|
+
private _destroyResources;
|
|
109
|
+
/**
|
|
110
|
+
* Grow the mode's vertex buffer to `requiredByteLength`, which is the whole
|
|
111
|
+
* open pass's consumption of it (this draw's append plus everything already
|
|
112
|
+
* written for the draws it holds), not just this draw's own bytes. Grow-only
|
|
113
|
+
* and doubling, matching the mode's own scratch-buffer policy; the returned
|
|
114
|
+
* buffer is the one this draw must bind, since growth replaces it.
|
|
115
|
+
*/
|
|
35
116
|
private _ensureCapacity;
|
|
36
|
-
private _writeUniformData;
|
|
37
|
-
private _writeInstanceData;
|
|
38
117
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
118
|
+
* Grow the uniform ring to `slots` draw-call slots - again the open pass's
|
|
119
|
+
* total, not this draw's one slot. Doubling and grow-only; growth frees the
|
|
120
|
+
* current buffer, so the caller must have ended any pass holding draws of
|
|
121
|
+
* ours that read it.
|
|
43
122
|
*/
|
|
44
|
-
private
|
|
45
|
-
|
|
46
|
-
private
|
|
123
|
+
private _ensureUniformCapacity;
|
|
124
|
+
/** (Re-)create the uniform ring and its bind group at `capacityBytes`. */
|
|
125
|
+
private _createUniformResources;
|
|
126
|
+
private _writeUniformData;
|
|
47
127
|
private _getPipeline;
|
|
48
128
|
}
|
|
129
|
+
//# sourceMappingURL=WebGpuParticleRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebGpuParticleRenderer.d.ts","sourceRoot":"","sources":["../../../src/renderers/WebGpuParticleRenderer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA0B,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAGxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAIpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAoGtD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,sBAAuB,SAAQ,sBAAsB,CAAC,cAAc,CAAC;IAChF;;;;;OAKG;IACH,SAAgB,wBAAwB,SAAS;IAEjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwE;IAErG,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,uBAAuB,CAAmC;IAClE,OAAO,CAAC,uBAAuB,CAAmC;IAClE,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAAK;IACnC;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8C;IACzE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAA2B;IAE/D,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAgCpC,KAAK,IAAI,IAAI;IAgDb,OAAO,IAAI,IAAI;IAItB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAwCjD,SAAS,CAAC,YAAY,IAAI,IAAI;IAuB9B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA4HnB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA6CzB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAItB,qFAAqF;IACrF,OAAO,CAAC,gBAAgB;IAIxB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,gBAAgB;IA8FxB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,iBAAiB;IAYzB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAwBvB;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAW9B,0EAA0E;IAC1E,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,iBAAiB;IAwEzB,OAAO,CAAC,YAAY;CA8CrB"}
|