forkkmuopengl/BaseGLProject/CheckeredFloor.cpp

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;
}