import * as THREE from 'three'; import vertexShader from '../shaders/petDepth.vert?raw'; import fragmentShader from '../shaders/petDepth.frag?raw'; export class PetDepthMesh extends THREE.Mesh { constructor(texture: THREE.Texture, depthMap: THREE.Texture, depthScale = 0.25, depthBias = 0) { const geometry = new THREE.PlaneGeometry(1, 1, 128, 128); const uniforms = { uTexture: { value: texture }, uDepthMap: { value: depthMap }, uDepthScale: { value: THREE.MathUtils.clamp(depthScale, 0, 0.4) }, uDepthBias: { value: depthBias }, uIsVideo: { value: false }, uUsePhotoAlpha: { value: false }, }; const material = new THREE.ShaderMaterial({ uniforms, vertexShader, fragmentShader, alphaToCoverage: true }); super(geometry, material); } setTexture(texture: THREE.Texture): void { this.material.uniforms.uTexture.value = texture; } setDepthMap(depthMap: THREE.Texture): void { this.material.uniforms.uDepthMap.value = depthMap; } setDepthScale(scale: number): void { this.material.uniforms.uDepthScale.value = THREE.MathUtils.clamp(scale, 0, 0.4); } setVideo(isVideo: boolean): void { this.material.uniforms.uIsVideo.value = isVideo; } get depthMap(): THREE.Texture { return this.material.uniforms.uDepthMap.value; } }