export class Object {
  constructor(app) {
    this.gl = app.gl;
    this.app = app;

    this.vertexPositions = new Float32Array([]);
    this.positionBuffer = null;
    this.textureBuffer = null;
  }

  initBuffer(data, draw = this.gl.STATIC_DRAW) {
    const buffer = this.gl.createBuffer();
    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);
    this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(data), draw);

    return buffer;
  }

  attachShader(shader) {
    this.shader = shader;
    this.vertexPosition = shader.location("aVertexPosition");
    this.textureCoord = shader.location("aTextureCoord");

    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionBuffer);
    this.gl.vertexAttribPointer(
      this.vertexPosition,
      2,
      this.gl.FLOAT,
      false,
      0,
      0
    );
    this.gl.enableVertexAttribArray(this.vertexPosition);

    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.textureBuffer);
    this.gl.vertexAttribPointer(
      this.textureCoord,
      2,
      this.gl.FLOAT,
      false,
      0,
      0
    );
    this.gl.enableVertexAttribArray(this.textureCoord);

    return this;
  }

  draw2D() {
    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionBuffer);
    this.shader.activate(this.app.projectionMatrix, this.app.modelViewMatrix);
    this.gl.drawArrays(
      this.gl.TRIANGLE_STRIP,
      0,
      this.vertexPositions.length / 2
    );
  }

  draw3D() {
    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionBuffer);
    this.shader.activate(this.app.projectionMatrix, this.app.modelViewMatrix);
    this.gl.drawArrays(
      this.gl.TRIANGLE_STRIP,
      0,
      this.vertexPositions.length / 3
    );
  }
}
