UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

83 lines (80 loc) 3.33 kB
import { CULLFACE_NONE, PRIMITIVE_TRIANGLES } from '../../platform/graphics/constants.js'; import { BLEND_PREMULTIPLIED } from '../constants.js'; import { ShaderMaterial } from '../materials/shader-material.js'; import { MeshInstance } from '../mesh-instance.js'; import { Mesh } from '../mesh.js'; class GSplatTileComposite { destroy() { this._material.destroy(); this._mesh.destroy(); this._meshInstance.destroy(); this._pickMaterial?.destroy(); this._pickMeshInstance?.destroy(); } get material() { return this._material; } get meshInstance() { return this._meshInstance; } update(drawSlot, outputTexture, rasterizeTileList, numTilesX, screenWidth, screenHeight) { this._meshInstance.setIndirect(null, drawSlot, 1); this._material.setParameter('source', outputTexture); this._material.setParameter('rasterizeTileList', rasterizeTileList); this._material.setParameter('numTilesX', numTilesX); this._material.setParameter('screenWidth', screenWidth); this._material.setParameter('screenHeight', screenHeight); } prepareForPicking(drawSlot, pickIdTexture, pickDepthTexture, rasterizeTileList, numTilesX, screenWidth, screenHeight) { if (!this._pickMaterial) { this._pickMaterial = new ShaderMaterial({ uniqueName: 'GSplatTileCompositePick', vertexWGSL: '#include "gsplatTileCompositeVS"', fragmentWGSL: '#include "gsplatTileCompositePS"' }); this._pickMaterial.setDefine('PICK_MODE', true); this._pickMaterial.cull = CULLFACE_NONE; this._pickMaterial.depthWrite = false; this._pickMaterial.update(); this._pickMeshInstance = new MeshInstance(this._mesh, this._pickMaterial); this._pickMeshInstance.node = this._node; this._pickMeshInstance.instancingCount = 1; } const pickMI = this._pickMeshInstance; const pickMat = this._pickMaterial; pickMI.setIndirect(null, drawSlot, 1); pickMat.setParameter('pickIdTexture', pickIdTexture); pickMat.setParameter('pickDepthTexture', pickDepthTexture); pickMat.setParameter('rasterizeTileList', rasterizeTileList); pickMat.setParameter('numTilesX', numTilesX); pickMat.setParameter('screenWidth', screenWidth); pickMat.setParameter('screenHeight', screenHeight); return pickMI; } constructor(device, node, isVisibleFunc){ this._pickMaterial = null; this._pickMeshInstance = null; this.device = device; this._node = node; this._material = new ShaderMaterial({ uniqueName: 'GSplatTileComposite', vertexWGSL: '#include "gsplatTileCompositeVS"', fragmentWGSL: '#include "gsplatTileCompositePS"' }); this._material.blendType = BLEND_PREMULTIPLIED; this._material.cull = CULLFACE_NONE; this._material.depthWrite = false; this._material.update(); this._mesh = new Mesh(device); this._mesh.primitive[0].type = PRIMITIVE_TRIANGLES; this._mesh.primitive[0].base = 0; this._mesh.primitive[0].count = 0; this._mesh.primitive[0].indexed = false; this._meshInstance = new MeshInstance(this._mesh, this._material); this._meshInstance.node = node; this._meshInstance.instancingCount = 1; this._meshInstance.isVisibleFunc = isVisibleFunc; this._meshInstance.pick = false; } } export { GSplatTileComposite };