import {
  WebGLRenderer,
  RenderTarget,
  Texture,
  DataTexture,
  Material,
  ShaderMaterial,
  Wrapping,
  TextureFilter

} from '../../../src/Three';

export interface Variable {
  name: string;
  initialValueTexture: Texture;
  material: Material;
  dependencies: Variable[];
  renderTargets: RenderTarget[];
  wrapS: number;
  wrapT: number;
  minFilter: number;
  magFilter: number;
}

export class GPUComputationRenderer {
  constructor(sizeX: number, sizeY: number, renderer: WebGLRenderer);

  addVariable(variableName: string, computeFragmentShader: string, initialValueTexture: Texture): Variable;
  setVariableDependencies(variable: Variable, dependencies: Variable[] | null): void;

  init(): string | null;
  compute(): void;

  getCurrentRenderTarget(variable: Variable): RenderTarget;
  getAlternateRenderTarget(variable: Variable): RenderTarget;
  addResolutionDefine(materialShader: ShaderMaterial): void;
  createRenderTarget(sizeXTexture: number, sizeYTexture: number, wrapS: Wrapping, wrapT: number, minFilter: TextureFilter, magFilter: TextureFilter): RenderTarget;
  createTexture(): DataTexture;
  renderTexture(input: Texture, output: Texture): void;
  doRenderTarget( material: Material, output: RenderTarget ): void;
}
