100 lines
2.5 KiB
C++
100 lines
2.5 KiB
C++
#include "CheckeredFloor.h"
|
|
|
|
void CheckeredFloor::genVertices(std::vector<glm::vec4> &vertices,
|
|
std::vector<glm::vec3> &colors)
|
|
{
|
|
float maxX = _size / 2.f, maxY = _size / 2.f;
|
|
float minX = -_size / 2.f, minY = -_size / 2.f;
|
|
float side_size = _size / (float)_squares;
|
|
int color = 1;
|
|
|
|
for (float x = minX; x < maxX; x += side_size)
|
|
{
|
|
for (float y = minY; y < maxY; y += side_size)
|
|
{
|
|
color *= -1;
|
|
glm::vec3 tile_color = (color > 0) ? _light_color : _dark_color;
|
|
//gen 1 carré
|
|
vertices.emplace_back(x, 0, y, 1); //upleft
|
|
vertices.emplace_back(x, 0, y + side_size, 1); //downleft
|
|
vertices.emplace_back(x + side_size, 0, y + side_size, 1); //downright
|
|
|
|
vertices.emplace_back(x + side_size, 0, y + side_size, 1); //downright
|
|
vertices.emplace_back(x + side_size, 0, y, 1); //upright
|
|
vertices.emplace_back(x, 0, y, 1); //upleft
|
|
|
|
|
|
|
|
for (int z = 0; z < 6; z++)
|
|
colors.push_back(tile_color);
|
|
}
|
|
color *= -1;
|
|
}
|
|
}
|
|
|
|
void CheckeredFloor::setup()
|
|
{
|
|
std::vector<glm::vec4> floor_vertices;
|
|
std::vector<glm::vec3> floor_colors;
|
|
|
|
glGenVertexArrays(1, &_vaoHandle);
|
|
glBindVertexArray(_vaoHandle);
|
|
|
|
genVertices(floor_vertices, floor_colors);
|
|
|
|
glGenBuffers(1, &_vbo_vertices);
|
|
glBindBuffer(GL_ARRAY_BUFFER, _vbo_vertices);
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * floor_vertices.size() * 4, floor_vertices.data(), GL_STATIC_DRAW);
|
|
|
|
glVertexAttribPointer(
|
|
0, //attr number = 0
|
|
4,
|
|
GL_FLOAT,
|
|
GL_FALSE,
|
|
0,
|
|
(void*)0);
|
|
glEnableVertexAttribArray(0); //attr number = 0
|
|
|
|
|
|
glGenBuffers(1, &_vbo_colors);
|
|
glBindBuffer(GL_ARRAY_BUFFER, _vbo_colors);
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * floor_colors.size() * 3, floor_colors.data(), GL_STATIC_DRAW);
|
|
|
|
glVertexAttribPointer(
|
|
1,
|
|
3,
|
|
GL_FLOAT,
|
|
GL_FALSE,
|
|
0,
|
|
(void *)0);
|
|
glEnableVertexAttribArray(1);
|
|
|
|
glBindVertexArray(0);
|
|
}
|
|
|
|
CheckeredFloor::CheckeredFloor(int size, int squares) :
|
|
_size(size), _squares(squares)
|
|
{
|
|
setup();
|
|
}
|
|
|
|
CheckeredFloor::~CheckeredFloor()
|
|
{
|
|
}
|
|
|
|
void CheckeredFloor::draw(ShaderProgram * shader, glm::mat4x4 proj_matrix, glm::mat4x4 view_matrix)
|
|
{
|
|
_model.glPushMatrix();
|
|
effectTransformations();
|
|
glBindVertexArray(_vaoHandle);
|
|
glm::mat4 mvpMatrix = proj_matrix * view_matrix * _model.getMatrix();
|
|
glUniformMatrix4fv(shader->uniform("mvp"), 1, GL_FALSE, glm::value_ptr(mvpMatrix));
|
|
glDrawArrays(GL_TRIANGLES, 0, _squares * _squares * 6);
|
|
_model.glPopMatrix();
|
|
}
|
|
|
|
DrawableType CheckeredFloor::getType()
|
|
{
|
|
return DrawableType::CHECKERED_FLOOR;
|
|
}
|