import {
  Vector2,
  Scene,
  Camera,
  Object3D,
  Color,
  Matrix4,
  MeshBasicMaterial,
  MeshDepthMaterial,
  ShaderMaterial,
  WebGLRenderTarget
} from '../../../src/Three';

import { Pass } from './Pass';

export class OutlinePass extends Pass {
  constructor(resolution: Vector2, scene: Scene, camera: Camera, selectedObjects?: Object3D[]);
  renderScene: Scene;
  renderCamera: Camera;
  selectedObjects: Object3D[];
  visibleEdgeColor: Color;
  hiddenEdgeColor: Color;
  edgeGlow: number;
  usePatternTexture: boolean;
  edgeThickness: number;
  edgeStrength: number;
  downSampleRatio: number;
  pulsePeriod: number;
  resolution: Vector2;

  maskBufferMaterial: MeshBasicMaterial;
  renderTargetMaskBuffer: WebGLRenderTarget;
  depthMaterial: MeshDepthMaterial;
  prepareMaskMaterial: ShaderMaterial;
  renderTargetDepthBuffer: WebGLRenderTarget;
  renderTargetMaskDownSampleBuffer: WebGLRenderTarget;
  renderTargetBlurBuffer1: WebGLRenderTarget;
  renderTargetBlurBuffer2: WebGLRenderTarget;
  edgeDetectionMaterial: ShaderMaterial;
  renderTargetEdgeBuffer1: WebGLRenderTarget;
  renderTargetEdgeBuffer2: WebGLRenderTarget;
  separableBlurMaterial1: ShaderMaterial;
  separableBlurMaterial2: ShaderMaterial;
  overlayMaterial: ShaderMaterial;
  copyUniforms: object;
  materialCopy: ShaderMaterial;
  oldClearColor: Color;
  oldClearAlpha: number;
  fsQuad: object;
  tempPulseColor1: Color;
  tempPulseColor2: Color;
  textureMatrix: Matrix4;

  dispose(): void;
  changeVisibilityOfSelectedObjects(bVisible: boolean): void;
  changeVisibilityOfNonSelectedObjects(bVisible: boolean): void;
  updateTextureMatrix(): void;
  getPrepareMaskMaterial(): ShaderMaterial;
  getEdgeDetectionMaterial(): ShaderMaterial;
  getSeperableBlurMaterial(): ShaderMaterial;
  getOverlayMaterial(): ShaderMaterial;
}
