diff --git a/BaseGLProject/ColorCube.cpp b/BaseGLProject/ColorCube.cpp index 0872d18..bdf6063 100644 --- a/BaseGLProject/ColorCube.cpp +++ b/BaseGLProject/ColorCube.cpp @@ -1,6 +1,6 @@ #include "ColorCube.h" -void ColorCube::setup() +void ColorCube::iboSetup() { std::vector 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 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(); diff --git a/BaseGLProject/ColorCube.h b/BaseGLProject/ColorCube.h index 398a465..dedb46e 100644 --- a/BaseGLProject/ColorCube.h +++ b/BaseGLProject/ColorCube.h @@ -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; diff --git a/BaseGLProject/MyGLWindow.cpp b/BaseGLProject/MyGLWindow.cpp index 2036037..1dba369 100644 --- a/BaseGLProject/MyGLWindow.cpp +++ b/BaseGLProject/MyGLWindow.cpp @@ -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); diff --git a/BaseGLProject/MyGLWindow.h b/BaseGLProject/MyGLWindow.h index 63b069c..972014d 100644 --- a/BaseGLProject/MyGLWindow.h +++ b/BaseGLProject/MyGLWindow.h @@ -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 _crane_boom; void setup(); - void setupRectBuffer(); - void setupCubeBuffer(); void setViewFromBox(glm::vec3 &eye, glm::vec3 &look, glm::vec3 &up); };