1 line
14 KiB
Plaintext
1 line
14 KiB
Plaintext
{"version":3,"file":"TilingSpritePipe.mjs","sources":["../../../src/scene/sprite-tiling/TilingSpritePipe.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { ExtensionType } from '../../extensions/Extensions';\nimport { getAdjustedBlendModeBlend } from '../../rendering/renderers/shared/state/getAdjustedBlendModeBlend';\nimport { State } from '../../rendering/renderers/shared/state/State';\nimport { type Renderer, RendererType } from '../../rendering/renderers/types';\nimport { color32BitToUniform } from '../graphics/gpu/colorToUniform';\nimport { BatchableMesh } from '../mesh/shared/BatchableMesh';\nimport { MeshGeometry } from '../mesh/shared/MeshGeometry';\nimport { TilingSpriteShader } from './shader/TilingSpriteShader';\nimport { QuadGeometry } from './utils/QuadGeometry';\nimport { setPositions } from './utils/setPositions';\nimport { setUvs } from './utils/setUvs';\n\nimport type { WebGLRenderer } from '../../rendering/renderers/gl/WebGLRenderer';\nimport type { InstructionSet } from '../../rendering/renderers/shared/instructions/InstructionSet';\nimport type { RenderPipe } from '../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Container } from '../container/Container';\nimport type { TilingSprite } from './TilingSprite';\n\ninterface RenderableData\n{\n canBatch: boolean;\n renderable: TilingSprite\n batchableMesh?: BatchableMesh;\n geometry?: MeshGeometry;\n shader?: TilingSpriteShader;\n}\n\nconst sharedQuad = new QuadGeometry();\n\nexport class TilingSpritePipe implements RenderPipe<TilingSprite>\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLPipes,\n ExtensionType.WebGPUPipes,\n ExtensionType.CanvasPipes,\n ],\n name: 'tilingSprite',\n } as const;\n\n private _renderer: Renderer;\n private readonly _state: State = State.default2d;\n private readonly _tilingSpriteDataHash: Record<number, RenderableData> = Object.create(null);\n private readonly _destroyRenderableBound = this.destroyRenderable.bind(this) as (renderable: Container) => void;\n\n constructor(renderer: Renderer)\n {\n this._renderer = renderer;\n }\n\n public validateRenderable(renderable: TilingSprite): boolean\n {\n const tilingSpriteData = this._getTilingSpriteData(renderable);\n\n const couldBatch = tilingSpriteData.canBatch;\n\n this._updateCanBatch(renderable);\n\n const canBatch = tilingSpriteData.canBatch;\n\n if (canBatch && canBatch === couldBatch)\n {\n const { batchableMesh } = tilingSpriteData;\n\n // we are batching.. check a texture change!\n if (batchableMesh && batchableMesh.texture._source !== renderable.texture._source)\n {\n return !batchableMesh._batcher.checkAndUpdateTexture(batchableMesh, renderable.texture);\n }\n }\n\n return (couldBatch !== canBatch);\n\n // // TODO - only update if required?\n // // only texture\n // // only uvs\n // // only positions?\n }\n\n public addRenderable(tilingSprite: TilingSprite, instructionSet: InstructionSet)\n {\n const batcher = this._renderer.renderPipes.batch;\n\n // init\n this._updateCanBatch(tilingSprite);\n\n const tilingSpriteData = this._getTilingSpriteData(tilingSprite);\n\n const { geometry, canBatch } = tilingSpriteData;\n\n if (canBatch)\n {\n tilingSpriteData.batchableMesh ||= new BatchableMesh();\n\n const batchableMesh = tilingSpriteData.batchableMesh;\n\n if (tilingSprite._didTilingSpriteUpdate)\n {\n tilingSprite._didTilingSpriteUpdate = false;\n\n this._updateBatchableMesh(tilingSprite);\n\n batchableMesh.geometry = geometry;\n batchableMesh.renderable = tilingSprite;\n batchableMesh.transform = tilingSprite.groupTransform;\n batchableMesh.texture = tilingSprite._texture;\n }\n\n batchableMesh.roundPixels = (this._renderer._roundPixels | tilingSprite._roundPixels) as 0 | 1;\n\n batcher.addToBatch(batchableMesh, instructionSet);\n }\n else\n {\n batcher.break(instructionSet);\n\n tilingSpriteData.shader ||= new TilingSpriteShader();\n\n this.updateRenderable(tilingSprite);\n\n instructionSet.add(tilingSprite);\n }\n }\n\n public execute(tilingSprite: TilingSprite)\n {\n const { shader } = this._tilingSpriteDataHash[tilingSprite.uid];\n\n shader.groups[0] = this._renderer.globalUniforms.bindGroup;\n\n // deal with local uniforms...\n const localUniforms = shader.resources.localUniforms.uniforms;\n\n localUniforms.uTransformMatrix = tilingSprite.groupTransform;\n localUniforms.uRound = this._renderer._roundPixels | tilingSprite._roundPixels;\n\n color32BitToUniform(\n tilingSprite.groupColorAlpha,\n localUniforms.uColor,\n 0\n );\n\n this._state.blendMode = getAdjustedBlendModeBlend(tilingSprite.groupBlendMode, tilingSprite.texture._source);\n\n this._renderer.encoder.draw({\n geometry: sharedQuad,\n shader,\n state: this._state,\n });\n }\n\n public updateRenderable(tilingSprite: TilingSprite)\n {\n const tilingSpriteData = this._getTilingSpriteData(tilingSprite);\n\n const { canBatch } = tilingSpriteData;\n\n if (canBatch)\n {\n const { batchableMesh } = tilingSpriteData;\n\n if (tilingSprite._didTilingSpriteUpdate) this._updateBatchableMesh(tilingSprite);\n\n batchableMesh._batcher.updateElement(batchableMesh);\n }\n else if (tilingSprite._didTilingSpriteUpdate)\n {\n const { shader } = tilingSpriteData;\n // now update uniforms...\n\n shader.updateUniforms(\n tilingSprite.width,\n tilingSprite.height,\n tilingSprite._tileTransform.matrix,\n tilingSprite.anchor.x,\n tilingSprite.anchor.y,\n tilingSprite.texture,\n );\n }\n\n tilingSprite._didTilingSpriteUpdate = false;\n }\n\n public destroyRenderable(tilingSprite: TilingSprite)\n {\n const tilingSpriteData = this._getTilingSpriteData(tilingSprite);\n\n tilingSpriteData.batchableMesh = null;\n\n tilingSpriteData.shader?.destroy();\n\n this._tilingSpriteDataHash[tilingSprite.uid] = null;\n\n tilingSprite.off('destroyed', this._destroyRenderableBound);\n }\n\n private _getTilingSpriteData(renderable: TilingSprite): RenderableData\n {\n return this._tilingSpriteDataHash[renderable.uid] || this._initTilingSpriteData(renderable);\n }\n\n private _initTilingSpriteData(tilingSprite: TilingSprite): RenderableData\n {\n const geometry = new MeshGeometry({\n indices: sharedQuad.indices,\n positions: sharedQuad.positions.slice(),\n uvs: sharedQuad.uvs.slice(),\n });\n\n this._tilingSpriteDataHash[tilingSprite.uid] = {\n canBatch: true,\n renderable: tilingSprite,\n geometry,\n };\n\n tilingSprite.on('destroyed', this._destroyRenderableBound);\n\n return this._tilingSpriteDataHash[tilingSprite.uid];\n }\n\n private _updateBatchableMesh(tilingSprite: TilingSprite)\n {\n const renderableData = this._getTilingSpriteData(tilingSprite);\n\n const { geometry } = renderableData;\n\n const style = tilingSprite.texture.source.style;\n\n if (style.addressMode !== 'repeat')\n {\n style.addressMode = 'repeat';\n style.update();\n }\n\n setUvs(tilingSprite, geometry.uvs);\n setPositions(tilingSprite, geometry.positions);\n }\n\n public destroy()\n {\n for (const i in this._tilingSpriteDataHash)\n {\n this.destroyRenderable(this._tilingSpriteDataHash[i].renderable);\n }\n\n (this._tilingSpriteDataHash as null) = null;\n this._renderer = null;\n }\n\n private _updateCanBatch(tilingSprite: TilingSprite)\n {\n const renderableData = this._getTilingSpriteData(tilingSprite);\n const texture = tilingSprite.texture;\n\n let _nonPowOf2wrapping = true;\n\n if (this._renderer.type === RendererType.WEBGL)\n {\n _nonPowOf2wrapping = (this._renderer as WebGLRenderer).context.supports.nonPowOf2wrapping;\n }\n\n renderableData.canBatch = texture.textureMatrix.isSimple && (_nonPowOf2wrapping || texture.source.isPowerOfTwo);\n\n return renderableData.canBatch;\n }\n}\n\n"],"names":[],"mappings":"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"} |