UNPKG

playcanvas

Version:

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

91 lines (90 loc) 3.22 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 { device; _material; _mesh; _meshInstance; _pickMaterial = null; _pickMeshInstance = null; _node; constructor(device, node, isVisibleFunc) { 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; } 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; } } export { GSplatTileComposite };