text: import { PerspectiveCamera, ShaderMaterial, Uniform } from "super-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;
  
  		}
  
  	}
  
  }
  