public void drawShapes() {
    gl.clear(ClearBufferMask.COLOR_BUFFER_BIT, ClearBufferMask.DEPTH_BUFFER_BIT);

    MODELVIEW.push();
    float[] gt = getState().translation;
    if (gt != null) {
      MODELVIEW.translate(gt[0], gt[1], gt[2]);
    }

    for (int i = 0; i < vertices.length; ++i) {
      WebGLState s = getState();

      MODELVIEW.push();
      MODELVIEW.translate(s.shapes[i].tx, s.shapes[i].ty, s.shapes[i].tz);

      MODELVIEW.rotateX(s.shapes[i].rx);
      MODELVIEW.rotateY(s.shapes[i].ry);
      MODELVIEW.rotateZ(s.shapes[i].rz);

      setMatrixUniforms();
      MODELVIEW.pop();

      gl.bindBuffer(BufferTarget.ARRAY_BUFFER, vertices[i]);
      gl.vertexAttribPointer(vertexPositionAttribute, 3, DataType.FLOAT, false, 0, 0);

      gl.bindBuffer(BufferTarget.ARRAY_BUFFER, colors[i]);
      gl.vertexAttribPointer(vertexColorAttribute, 4, DataType.FLOAT, false, 0, 0);

      if (indices[i] != null) {
        gl.bindBuffer(BufferTarget.ELEMENT_ARRAY_BUFFER, indices[i]);
        gl.drawElements(BeginMode.TRIANGLES, 36, DrawElementsType.UNSIGNED_SHORT, 0);
      } else {
        gl.drawArrays(BeginMode.TRIANGLE_STRIP, 0, 3);
      }
    }

    MODELVIEW.pop();
  }
 private void setMatrixUniforms() {
   gl.uniformMatrix(shader.getUniformLocation("uMVMatrix"), MODELVIEW.get());
 }