import {
  BufferGeometry,
  Material,
  ImmediateRenderObject
} from '../../../src/Three';

export class MarchingCubes extends ImmediateRenderObject {
  constructor(resolution: number, material: Material, enableUvs?: boolean, enableColors?: boolean);

  enableUvs: boolean;
  enableColors: boolean;

  resolution: number;

  // parameters

  isolation: number;

  // size of field, 32 is pushing it in Javascript :)

  size: number;
  size2: number;
  size3: number;
  halfsize: number;

  // deltas

  delta: number;
  yd: number;
  zd: number;

  field: Float32Array;
  normal_cache: Float32Array;
  palette: Float32Array;

  maxCount: number;
  count: number;

  hasPositions: boolean;
  hasNormals: boolean;
  hasColors: boolean;
  hasUvs: boolean;

  positionArray: Float32Array;
  normalArray: Float32Array;

  uvArray: Float32Array;
  colorArray: Float32Array;

  begin(): void;
  end(): void;

  addBall( ballx: number, bally: number, ballz: number, strength: number, subtract: number, colors: any ): void;

  addPlaneX( strength: number, subtract: number ): void;
  addPlaneY( strength: number, subtract: number ): void;
  addPlaneZ( strength: number, subtract: number ): void;

  setCell ( x: number, y: number, z: number, value: number ): void;
  getCell ( x: number, y: number, z: number ): number;

  blur( intensity: number ): void;

  reset(): void;
  render( renderCallback: any ): void;
  generateGeometry(): BufferGeometry;
  generateBufferGeometry(): BufferGeometry;

}

export const edgeTable: Int32Array[];
export const triTable: Int32Array[];

