1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
#include "Tray.hpp"
Tray::Tray(int n, int r) : m_size(n), m_idx(0), m_ray(r), m_vertices(), m_indices()
{
m_vertices.resize(n * VERTEX_SIZE * HEXAGONE_SIZE, 0.f);
m_indices.resize(n * INDICE_SIZE, 0);
glPrimitiveRestartIndex(PRIMITIVE_RESTART);
glGenVertexArrays (1, &m_vao);
glGenBuffers(1, &m_vbo);
glGenBuffers(1, &m_ibo);
glBindVertexArray(m_vao);
//VBO
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, m_vertices.size() * sizeof(GLfloat), &m_vertices[0], GL_STATIC_DRAW);
//IBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size() * sizeof(GLuint), &m_indices[0], GL_STATIC_DRAW);
//VAO
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), nullptr);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
Tray::~Tray()
{
glDeleteVertexArrays(1, &m_vao);
glDeleteBuffers(1, &m_ibo);
glDeleteBuffers(1, &m_vbo);
}
void Tray::add(int x, int y)
{
m_vertices[m_idx * VERTEX_SIZE * HEXAGONE_SIZE + 0] = x;
m_vertices[m_idx * VERTEX_SIZE * HEXAGONE_SIZE + 1] = y;
float rad;
for(int i=0; i < HEXAGONE_SIZE - 1; i++)
{
rad = M_PI * ((i*60.f)/180.f);
m_vertices[(i+1) * VERTEX_SIZE + m_idx * VERTEX_SIZE * HEXAGONE_SIZE + 0] = x + m_ray * std::cos(rad);
m_vertices[(i+1) * VERTEX_SIZE + m_idx * VERTEX_SIZE * HEXAGONE_SIZE + 1] = y + m_ray * std::sin(rad);
}
m_indices[m_idx * INDICE_SIZE + 0] = m_idx * HEXAGONE_SIZE + 0;
m_indices[m_idx * INDICE_SIZE + 1] = m_idx * HEXAGONE_SIZE + 1;
m_indices[m_idx * INDICE_SIZE + 2] = m_idx * HEXAGONE_SIZE + 2;
m_indices[m_idx * INDICE_SIZE + 3] = m_idx * HEXAGONE_SIZE + 3;
m_indices[m_idx * INDICE_SIZE + 4] = m_idx * HEXAGONE_SIZE + 4;
m_indices[m_idx * INDICE_SIZE + 5] = m_idx * HEXAGONE_SIZE + 5;
m_indices[m_idx * INDICE_SIZE + 6] = m_idx * HEXAGONE_SIZE + 6;
m_indices[m_idx * INDICE_SIZE + 7] = m_idx * HEXAGONE_SIZE + 1;
m_indices[m_idx * INDICE_SIZE + 8] = PRIMITIVE_RESTART;
m_idx++;
}
void Tray::flip()
{
GLfloat* data;
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
data = static_cast<GLfloat*>(glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY));
if(data != nullptr)
{
std::copy(m_vertices.begin(), m_vertices.end(), data);
glUnmapBuffer(GL_ARRAY_BUFFER);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_ibo);
data = static_cast<GLfloat*>(glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY));
if(data != nullptr)
{
std::copy(m_indices.begin(), m_indices.end(), data);
glUnmapBuffer(GL_ARRAY_BUFFER);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void Tray::render()
{
glBindVertexArray(m_vao);
//glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawElements(GL_TRIANGLE_FAN, m_idx * INDICE_SIZE, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
} |
Partager