playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
91 lines (90 loc) • 3.22 kB
JavaScript
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
};