// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <vector>

#include "cobalt/renderer/rasterizer/skia/vertex_buffer_object.h"

#include "cobalt/renderer/backend/egl/utils.h"

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace skia {

VertexBufferObject::VertexBufferObject(
    scoped_ptr<std::vector<render_tree::Mesh::Vertex> > vertices,
    GLenum draw_mode)
    : vertex_count_(vertices->size()), draw_mode_(draw_mode) {
  scoped_array<float> buffer(new float[5 * vertex_count_]);

  for (size_t i = 0; i < vertices->size(); i++) {
    buffer[5 * i] = vertices->at(i).x;
    buffer[5 * i + 1] = vertices->at(i).y;
    buffer[5 * i + 2] = vertices->at(i).z;
    buffer[5 * i + 3] = vertices->at(i).u;
    buffer[5 * i + 4] = vertices->at(i).v;
  }

  // Setup position and texture coordinate vertex buffer.
  GL_CALL(glGenBuffers(1, &mesh_vertex_buffer_));
  DLOG(INFO) << "Created VBO with buffer id " << mesh_vertex_buffer_;
  GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, mesh_vertex_buffer_));
  GL_CALL(glBufferData(GL_ARRAY_BUFFER, vertex_count_ * 5 * sizeof(float),
                       buffer.get(), GL_STATIC_DRAW));

  // Vertex list data object is deleted at this point.
}

VertexBufferObject::~VertexBufferObject() {
  DLOG(INFO) << "Deleted VBO with buffer id " << mesh_vertex_buffer_;
  GL_CALL(glDeleteBuffers(1, &mesh_vertex_buffer_));
}

void VertexBufferObject::Bind() const {
  GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, mesh_vertex_buffer_));
}

}  // namespace skia
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt
