src/materials/CircleOfConfusionMaterial.js
import { PerspectiveCamera, ShaderMaterial, Uniform } from "three";
import fragmentShader from "./glsl/circle-of-confusion/shader.frag";
import vertexShader from "./glsl/common/shader.vert";
/**
* A CoC shader material.
*/
export class CircleOfConfusionMaterial extends ShaderMaterial {
/**
* Constructs a new CoC material.
*
* @param {Camera} camera - A camera.
*/
constructor(camera) {
super({
type: "CircleOfConfusionMaterial",
defines: {
DEPTH_PACKING: "0"
},
uniforms: {
depthBuffer: new Uniform(null),
focusDistance: new Uniform(0.0),
focalLength: new Uniform(0.0),
cameraNear: new Uniform(0.3),
cameraFar: new Uniform(1000)
},
fragmentShader,
vertexShader,
depthWrite: false,
depthTest: false
});
/** @ignore */
this.toneMapped = false;
this.adoptCameraSettings(camera);
}
/**
* The current depth packing.
*
* @type {Number}
*/
get depthPacking() {
return Number(this.defines.DEPTH_PACKING);
}
/**
* Sets the depth packing.
*
* @type {Number}
*/
set depthPacking(value) {
this.defines.DEPTH_PACKING = value.toFixed(0);
this.needsUpdate = true;
}
/**
* Adopts the settings of the given camera.
*
* @param {Camera} [camera=null] - A camera.
*/
adoptCameraSettings(camera = null) {
if(camera !== null) {
this.uniforms.cameraNear.value = camera.near;
this.uniforms.cameraFar.value = camera.far;
if(camera instanceof PerspectiveCamera) {
this.defines.PERSPECTIVE_CAMERA = "1";
} else {
delete this.defines.PERSPECTIVE_CAMERA;
}
this.needsUpdate = true;
}
}
}