CubeColor can be spawned with IBO or VAO in preparation of lighthing application

This commit is contained in:
Hugo Willaume 2018-11-21 10:53:42 +09:00
parent 0b6282a21b
commit 7e546f7d23
4 changed files with 106 additions and 109 deletions

View File

@ -1,6 +1,6 @@
#include "ColorCube.h"
void ColorCube::setup()
void ColorCube::iboSetup()
{
std::vector<glm::vec3> cube_vertices =
{ { -1.0, -1.0, 1.0},
@ -10,7 +10,7 @@ void ColorCube::setup()
{ -1.0, -1.0, -1.0},
{ 1.0, -1.0, -1.0},
{ 1.0, 1.0, -1.0},
{ -1.0, 1.0, -1.0} };
{ -1.0, 1.0, -1.0} };
GLfloat cube_colors[] = {
// front colors
@ -70,9 +70,95 @@ void ColorCube::setup()
glBindVertexArray(0);
}
ColorCube::ColorCube()
void ColorCube::vaoSetup()
{
std::vector<glm::vec3> cube_vertices =
{ { -1.0, -1.0, 1.0}, { 1.0, -1.0, 1.0}, { 1.0, 1.0, 1.0},
{ 1.0, 1.0, 1.0}, { -1.0, 1.0, 1.0}, { -1.0, -1.0, 1.0},
{ 1.0, -1.0, 1.0}, { 1.0, -1.0, -1.0}, { 1.0, 1.0, -1.0},
{ 1.0, 1.0, -1.0}, { 1.0, 1.0, 1.0}, { 1.0, -1.0, 1.0},
{ -1.0, 1.0, -1.0}, { 1.0, 1.0, -1.0}, { 1.0, -1.0, -1.0},
{ 1.0, -1.0, -1.0}, { -1.0, -1.0, -1.0}, { -1.0, 1.0, -1.0},
{ -1.0, -1.0, -1.0}, { -1.0, -1.0, 1.0}, { -1.0, 1.0, 1.0},
{ -1.0, 1.0, 1.0}, { -1.0, 1.0, -1.0}, { -1.0, -1.0, -1.0},
{ -1.0, -1.0, -1.0}, { 1.0, -1.0, -1.0}, { 1.0, -1.0, 1.0},
{ 1.0, -1.0, 1.0}, { -1.0, -1.0, 1.0}, { -1.0, -1.0, -1.0},
{ -1.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 1.0, -1.0},
{ 1.0, 1.0, -1.0}, { -1.0, 1.0, -1.0}, { -1.0, 1.0, 1.0} };
GLushort cube_elements[] = {
0, 1, 2, 2, 3, 0, 1, 5, 6,
6, 2, 1, 7, 6, 5, 5, 4, 7,
4, 0, 3, 3, 7, 4, 4, 5, 1,
1, 0, 4, 3, 2, 6, 6, 7, 3,
};
GLfloat cube_colors[] = {
1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0,
0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0,
1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0,
0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0,
1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0,
1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,
0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
};
GLfloat cube_colorss[] = {
1.0, 0.0, 0.0, // 0
0.0, 1.0, 0.0, // 1
0.0, 0.0, 1.0, // 2
1.0, 1.0, 1.0, // 3
1.0, 0.0, 0.0, // 4
0.0, 1.0, 0.0, // 5
0.0, 0.0, 1.0, // 6
1.0, 1.0, 1.0, // 7
};
glGenVertexArrays(1, &_vaoHandle);
glBindVertexArray(_vaoHandle);
glGenBuffers(1, &_vbo_vertices);
glBindBuffer(GL_ARRAY_BUFFER, _vbo_vertices);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * cube_vertices.size() * 3, cube_vertices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(
0, //attr number = 0
3,
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) * cube_vertices.size() * 3, cube_colors, GL_STATIC_DRAW);
glVertexAttribPointer(
1,
3,
GL_FLOAT,
GL_FALSE,
0,
(void*)0);
glEnableVertexAttribArray(1);
glBindVertexArray(0);
}
ColorCube::ColorCube(bool usingIBO)
{
setup();
ibo_used = usingIBO;
if (usingIBO)
iboSetup();
else
vaoSetup();
}
@ -85,7 +171,10 @@ void ColorCube::draw(ShaderProgram *shader, glm::mat4x4 pv)
glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
glm::mat4 mvpMatrix = pv * _model.getMatrix();
glUniformMatrix4fv(shader->uniform("mvp"), 1, GL_FALSE, glm::value_ptr(mvpMatrix));
glDrawElements(GL_TRIANGLES, size / sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
if (ibo_used)
glDrawElements(GL_TRIANGLES, size / sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
else
glDrawArrays(GL_TRIANGLES, 0, 36);
_model.glPopMatrix();

View File

@ -12,10 +12,13 @@ private:
GLuint _iboHandle;
GLuint _vbo_vertices, _vbo_colors;
void setup();
bool ibo_used;
void iboSetup();
void vaoSetup();
public:
ColorCube();
ColorCube(bool usingIBO);
void draw(ShaderProgram *shader, glm::mat4x4 pv) override;
DrawableType getType() override;

View File

@ -36,14 +36,12 @@ glm::mat4x4 lookAt(glm::vec3 campos, glm::vec3 look, glm::vec3 up)
MyGlWindow::MyGlWindow(int w, int h) :
viewer(glm::vec3(5, 5, 5), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0), 45.0f, (w / (float)h)),
_floor(50, 16)
viewer(glm::vec3(5, 5, 5), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0), 45.0f, (w / (float)h))
{
m_width = w;
m_height = h;
setup();
setupCubeBuffer();
}
MyGlWindow::~MyGlWindow()
@ -61,99 +59,12 @@ void MyGlWindow::setup()
{
_shaderProgram = new ShaderProgram();
_shaderProgram->initFromFiles("simple.vert", "simple.frag");
_static_drawables.emplace_back(new CheckeredFloor(50, 16));
_static_drawables.emplace_back(new WireCube());
_static_drawables.back()->addTranslation(glm::vec4(0, 1.01, 0, 0));
_static_drawables.emplace_back(new WireCube());
_static_drawables.back()->addTranslation(glm::vec4(0, 3.01, 0, 0));
_static_drawables.emplace_back(new WireCube());
_static_drawables.back()->addTranslation(glm::vec4(0, 5.01, 0, 0));
_static_drawables.emplace_back(new WireCube());
_static_drawables.back()->addTranslation(glm::vec4(0, 7.01, 0, 0));
_crane_boom.emplace_back(new WireCube());
_crane_boom.back()->addTranslation(glm::vec4(0, 9.01, 0, 0));
_crane_boom.emplace_back(new WireCube());
_crane_boom.back()->addTranslation(glm::vec4(-2, 9.01, 0, 0));
_crane_boom.emplace_back(new WireCube());
_crane_boom.back()->addTranslation(glm::vec4(2, 9.01, 0, 0));
_crane_boom.emplace_back(new WireCube());
_crane_boom.back()->addTranslation(glm::vec4(4, 9.01, 0, 0));
_crane_boom.emplace_back(new WireCube());
_crane_boom.back()->addTranslation(glm::vec4(6, 9.01, 0, 0));
_crane_boom.push_back(new ColorCube());
_crane_boom.back()->addTranslation(glm::vec4(8, 7.01, 0, 0));
_crane_boom.emplace_back(new WireCube());
_crane_boom.back()->addTranslation(glm::vec4(8, 9.01, 0, 0));
_crane_boom.emplace_back(new LineSegment());
_crane_boom.back()->addTranslation(glm::vec4(8, 8.01, 0, 0));
}
void MyGlWindow::setupCubeBuffer()
{
}
void MyGlWindow::setupRectBuffer()
{
GLuint vbo_cube_vertices;
glGenVertexArrays(1, &_vaoHandle);
glBindVertexArray(_vaoHandle);
vertexAttr* verts = new vertexAttr[6];
verts[0].posX = -0.3f; verts[0].posY = 0.4f; verts[0].posZ = 0;
verts[0].r = 1; verts[0].g = 0; verts[0].b = 0;
verts[1].posX = -0.3f; verts[1].posY = -0.4f; verts[1].posZ = 0;
verts[1].r = 0; verts[1].g = 1; verts[1].b = 0;
verts[2].posX = 0.3f; verts[2].posY = -0.4f; verts[2].posZ = 0;
verts[2].r = 0; verts[2].g = 0; verts[2].b = 1;
verts[3].posX = 0.3f; verts[3].posY = -0.4f; verts[3].posZ = 0;
verts[3].r = 0; verts[3].g = 0; verts[3].b = 1;
verts[4].posX = 0.3f; verts[4].posY = 0.4f; verts[4].posZ = 0;
verts[4].r = 0; verts[4].g = 1; verts[4].b = 0;
verts[5].posX = -0.3f; verts[5].posY = 0.4f; verts[5].posZ = 0;
verts[5].r = 1; verts[5].g = 0; verts[5].b = 0;
glGenBuffers(1, &vbo_cube_vertices);
glBindBuffer(GL_ARRAY_BUFFER, vbo_cube_vertices);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexAttr) * 6, verts, GL_STATIC_DRAW);
glVertexAttribPointer(
0, //attr number = 0
3,
GL_FLOAT,
GL_FALSE,
sizeof(vertexAttr),
(void*)0);
glEnableVertexAttribArray(0); //attr number = 0
glVertexAttribPointer(
1,
3,
GL_FLOAT,
GL_FALSE,
sizeof(vertexAttr),
(void*)(sizeof(GLfloat) * 3));
glEnableVertexAttribArray(1);
glBindVertexArray(0);
_static_drawables.push_back(new ColorCube(true));
_static_drawables.back()->addTranslation(glm::vec4(-2, 1.1f, 0, 0));
_static_drawables.push_back(new ColorCube(false));
_static_drawables.back()->addTranslation(glm::vec4(2, 1.1f, 0, 0));
}
void MyGlWindow::setViewFromBox(glm::vec3 &eye, glm::vec3 &look, glm::vec3 &up)
@ -184,9 +95,7 @@ void MyGlWindow::draw()
glm::vec3 eye(viewer.getViewPoint().x, viewer.getViewPoint().y, viewer.getViewPoint().z);
glm::vec3 look(viewer.getViewCenter().x, viewer.getViewCenter().y, viewer.getViewCenter().z);
glm::vec3 up(viewer.getUpVector().x, viewer.getUpVector().y, viewer.getUpVector().z);
if (view_from_box)
setViewFromBox(eye, look, up);
glm::vec3 up(viewer.getUpVector().x, viewer.getUpVector().y, viewer.getUpVector().z);
glm::mat4 view = lookAt(eye, look, up); //Calculate view matrix from paramters of m_viewer
glm::mat4 projection = perspective(45.0f, m_width / m_height, 0.1f, 500.0f);

View File

@ -37,8 +37,6 @@ private:
ShaderProgram *_shaderProgram;
int m_width;
int m_height;
ColorCube _cube;
CheckeredFloor _floor;
float _bgColor[3];
@ -50,7 +48,5 @@ private:
std::vector<ADrawable *> _crane_boom;
void setup();
void setupRectBuffer();
void setupCubeBuffer();
void setViewFromBox(glm::vec3 &eye, glm::vec3 &look, glm::vec3 &up);
};