diff --git a/src/main.cpp b/src/main.cpp index 91f87dc..ccfec73 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,7 +19,7 @@ int main(int argc, char *argv[]) // Instantiate and layout the viewer. Viewer *v = new Viewer(); - w.addViewer(v); + w.addViewer(v); w.show(); return a.exec(); diff --git a/src/viewer/simpleViewer.cpp b/src/viewer/simpleViewer.cpp index b3b34d3..e76dff9 100644 --- a/src/viewer/simpleViewer.cpp +++ b/src/viewer/simpleViewer.cpp @@ -41,17 +41,17 @@ using namespace std; namespace { -const int numVerticesCube = 12*3; -const double frame_limit = 5; -const double inc_mult = 5; -const double inc_offset = 1.05; + const int numVerticesCube = 12*3; + const double frame_limit = 5; + const double inc_mult = 5; + const double inc_offset = 1.05; } Viewer::Viewer() { activeColor = new QColor(255, 255, 255, 255); activeCell = nullptr; - activeShape = 0; + activeShape = 0; } Viewer::~Viewer() @@ -76,48 +76,49 @@ void Viewer::cleanup() void Viewer::draw() { - m_program->bind(); + m_program->bind(); // Get projection and camera transformations - QMatrix4x4 projectionMatrix; + QMatrix4x4 projectionMatrix; QMatrix4x4 modelViewMatrix; camera()->getProjectionMatrix(projectionMatrix); camera()->getModelViewMatrix(modelViewMatrix); // Prepare a transformation stack - // stack modelStack; + // stack modelStack; modelViewMatrix.scale(0.95); - modelViewMatrix.rotate(45, 0, 1, 0); - rot = QQuaternion::fromAxisAndAngle(1, 0, 1, 90/60 * frame); - // uncomment this and the cube translation in init() - // to see the cube spin - modelViewMatrix.rotate(rot); - projectionMatrix.translate(0, -5, 0); - projectionMatrix.rotate(15, 1, 0, 0); - m_program->setUniformValue(m_projMatrixLocation, projectionMatrix); - m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); + //modelViewMatrix.rotate(45, 0, 1, 0); + // uncomment this and the cube translation in init() + // to see the cube spin + /*rot = QQuaternion::fromAxisAndAngle(1, 0, 1, 90/60 * frame); + modelViewMatrix.rotate(rot); + projectionMatrix.translate(0, -5, 0); + projectionMatrix.rotate(15, 1, 0, 0);//*/ - // Traverse the Scene in order to draw its components + m_program->setUniformValue(m_projMatrixLocation, projectionMatrix); + m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); - modelStack.push(modelViewMatrix); - root.accept(*this); - frame++; - update(); + // Traverse the Scene in order to draw its components + + modelStack.push(modelViewMatrix); + root.accept(*this); + frame++; + update(); } void Viewer::mouseMoveEvent(QMouseEvent* e) { cout << "Viewer::mouseMoveEvent(QMouseEvent* e)" << endl; // Normal QGLViewer behavior. - //QGLViewer::mouseMoveEvent(e); + //QGLViewer::mouseMoveEvent(e); } void Viewer::mousePressEvent(QMouseEvent* e) { - // Auto Return, but old code left in as reference - return; + // Auto Return, but old code left in as reference + return; - /*cout << "Viewer::mouseMoveEvent(QMouseEvent* e) : " << e->button() << endl; + /*cout << "Viewer::mouseMoveEvent(QMouseEvent* e) : " << e->button() << endl; if(e->button() == 1){ // LMB @@ -139,23 +140,23 @@ void Viewer::mousePressEvent(QMouseEvent* e) { Shape* s = nullptr; if(activeShape == 1){ - s = new Triangle(); + s = new Triangle(); }else if(activeShape == 2){ - s = new Square(); + s = new Square(); }else if(activeShape == 3){ - s = new Circle(); + s = new Circle(); } // WARNING: END OF CODE DEGEULASSE - //activeCell->getChildren()->at(0) = s; + //activeCell->getChildren()->at(0) = s; if(s != nullptr){ s->setColor(*activeColor); cell->addChild(s); this->update(); deselect(); - activeCell = cell; - } + activeCell = cell; + } } } @@ -174,7 +175,7 @@ void Viewer::mousePressEvent(QMouseEvent* e) { int shapeId = 0; if(typeid(*(activeCell->getChildren()->at(0))) == typeid(Triangle)) shapeId = 1; - if(typeid(*(activeCell->getChildren()->at(0))) == typeid(Square)) + if(typeid(*(activeCell->getChildren()->at(0))) == typeid(Square)) shapeId = 2; if(typeid(*(activeCell->getChildren()->at(0))) == typeid(Circle)) shapeId = 3; @@ -183,7 +184,7 @@ void Viewer::mousePressEvent(QMouseEvent* e) { emit shapeSelected(0); } } - }//*/ + }//*/ } void Viewer::deselect(){ @@ -208,13 +209,10 @@ void Viewer::mouseReleaseEvent(QMouseEvent* e) { void Viewer::init() { - // We want to restrict ourselves to a 2D viewer. - //camera()->setType(qglviewer::Camera::ORTHOGRAPHIC); - setMouseBinding(Qt::NoModifier, Qt::LeftButton, CAMERA, SCREEN_ROTATE); - //setMouseBinding(Qt::AltModifier, Qt::LeftButton, CAMERA, NO_MOUSE_ACTION);//*/ - //setMouseBinding(Qt::NoModifier, Qt::MouseButton(Qt::LeftButton + Qt::MidButton), CAMERA, NO_MOUSE_ACTION); - //setMouseBinding(Qt::ControlModifier, Qt::MouseButton(Qt::LeftButton + Qt::MidButton), CAMERA, NO_MOUSE_ACTION); - //setMouseBinding(Qt::ShiftModifier, Qt::MouseButton(Qt::LeftButton + Qt::MidButton), CAMERA, NO_MOUSE_ACTION); + // We want to restrict ourselves to a 2D viewer. + //camera()->setType(qglviewer::Camera::ORTHOGRAPHIC); + //setMouseBinding(Qt::NoModifier, Qt::LeftButton, CAMERA, SCREEN_ROTATE); + //setMouseBinding(Qt::AltModifier, Qt::LeftButton, CAMERA, NO_MOUSE_ACTION);//*/ // Our scene will be from -5 to 5 in X and Y (the grid will be 10x10). setSceneRadius(5); @@ -226,16 +224,20 @@ void Viewer::init() // Init shaders & geometry initShaders(); - initGeometries(); + initGeometries(); - Shape* cube = new Cube(); - cube->setColor(*activeColor); - // uncomment this and the quaternion transformation in draw() - // to see the cube rotate. - // cube->transform.translate(3, 0, 0); - SceneGroup *c = new SceneGroup(); - c->addChild(cube); - root.addChild(c); + { + Shape* cube = new Cube(); + cube->setColor(*activeColor); + + // uncomment this and the quaternion transformation in draw() + // to see the cube rotate. This is how we can easily make the sun. + // cube->transform.translate(3, 0, 0); + + SceneGroup *c = new SceneGroup(); + c->addChild(cube); + root.addChild(c); + } } void Viewer::initShaders() @@ -273,9 +275,12 @@ void Viewer::initShaders() // Creates the basic shapes in memory. We only have 3, so we just prep them all in advance. void Viewer::initGeometries() { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable( GL_BLEND ); - glClearColor(0.0,0.0,0.0,0.0); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable( GL_BLEND ); + glEnable( GL_CULL_FACE ); + glFrontFace( GL_CCW ); + glCullFace( GL_BACK ); + glClearColor(0.0,0.0,0.0,0.0); // Create our VertexArrays Objects and VertexBuffer Objects glGenVertexArrays(NumVAOs, m_VAOs); @@ -283,30 +288,30 @@ void Viewer::initGeometries() // Create our pentagone object, store its vertices on the graphic card, and // bind the data to the vPosition attribute of the shader - GLfloat verticesCube[numVerticesCube][3] = { // 12 triangles == 6 squares - //Front, if Z is towards us - { -0.5, 0.5, 0.5 }, { -0.5, -0.5, 0.5 }, { 0.5, -0.5, 0.5 }, - { 0.5, -0.5, 0.5 }, { 0.5, 0.5, 0.5 }, { -0.5, 0.5, 0.5 }, - //Back - { -0.5, 0.5, -0.5 }, { 0.5, 0.5, -0.5 }, { 0.5, -0.5, -0.5 }, - { 0.5, -0.5, -0.5 }, { -0.5, -0.5, -0.5 }, { -0.5, 0.5, -0.5 }, - //Right - { -0.5, 0.5, 0.5 }, { -0.5, 0.5, -0.5 }, { -0.5, -0.5, -0.5 }, - { -0.5, -0.5, -0.5 }, { -0.5, -0.5, 0.5 }, { -0.5, 0.5, 0.5 }, - //Left - { 0.5, 0.5, 0.5 }, { 0.5, -0.5, -0.5 }, { 0.5, 0.5, -0.5 }, - { 0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 }, { 0.5, -0.5, 0.5 }, - //Top - { -0.5, 0.5, 0.5 }, { 0.5, 0.5, 0.5 }, { 0.5, 0.5, -0.5 }, - { 0.5, 0.5, -0.5 }, { -0.5, 0.5, -0.5 }, { -0.5, 0.5, 0.5 }, - //Bottom - { -0.5, -0.5, 0.5 }, { 0.5, -0.5, 0.5 }, { 0.5, -0.5, -0.5 }, - { 0.5, -0.5, -0.5 }, { -0.5, -0.5, -0.5 }, { -0.5, -0.5, 0.5 } + GLfloat verticesCube[numVerticesCube][3] = { // 12 triangles == 6 squares + //Front, if Z is towards us + { -0.5, 0.5, 0.5 }, { -0.5, -0.5, 0.5 }, { 0.5, -0.5, 0.5 }, + { 0.5, -0.5, 0.5 }, { 0.5, 0.5, 0.5 }, { -0.5, 0.5, 0.5 }, + //Back + { -0.5, 0.5, -0.5 }, { 0.5, 0.5, -0.5 }, { 0.5, -0.5, -0.5 }, + { 0.5, -0.5, -0.5 }, { -0.5, -0.5, -0.5 }, { -0.5, 0.5, -0.5 }, + //Right + { -0.5, 0.5, 0.5 }, { -0.5, 0.5, -0.5 }, { -0.5, -0.5, -0.5 }, + { -0.5, -0.5, -0.5 }, { -0.5, -0.5, 0.5 }, { -0.5, 0.5, 0.5 }, + //Left + { 0.5, 0.5, 0.5 }, { 0.5, -0.5, -0.5 }, { 0.5, 0.5, -0.5 }, + { 0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 }, { 0.5, -0.5, 0.5 }, + //Top + { -0.5, 0.5, 0.5 }, { 0.5, 0.5, 0.5 }, { 0.5, 0.5, -0.5 }, + { 0.5, 0.5, -0.5 }, { -0.5, 0.5, -0.5 }, { -0.5, 0.5, 0.5 }, + //Bottom + { -0.5, -0.5, 0.5 }, { 0.5, -0.5, -0.5 }, { 0.5, -0.5, 0.5 }, + { 0.5, -0.5, -0.5 }, { -0.5, -0.5, 0.5 }, { -0.5, -0.5, -0.5 } }; - glBindVertexArray(m_VAOs[VAO_Cube]); - glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[VBO_Cube]); - glBufferData(GL_ARRAY_BUFFER, sizeof(verticesCube), verticesCube, GL_STATIC_DRAW); + glBindVertexArray(m_VAOs[VAO_Cube]); + glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[VBO_Cube]); + glBufferData(GL_ARRAY_BUFFER, sizeof(verticesCube), verticesCube, GL_STATIC_DRAW); glVertexAttribPointer(m_vPositionLocation, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(m_vPositionLocation); @@ -316,14 +321,14 @@ void Viewer::visit(Cube &s) { QMatrix4x4 modelViewMatrix = modelStack.top() * QMatrix4x4(s.transform); - int faces = floor(numVerticesCube/6); - for(int i = 0; i < faces; i++){ // 6 vertexes par face - glBindVertexArray(m_VAOs[VAO_Cube]); - m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); - m_program->setUniformValue(m_colorLocation, QColor::fromHsv(360/6*i, 255, 255, 200)); + int faces = floor(numVerticesCube/6); + for(int i = 0; i < faces; i++){ // 6 vertexes par face + glBindVertexArray(m_VAOs[VAO_Cube]); + m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); + m_program->setUniformValue(m_colorLocation, QColor::fromHsv(360/6*i, 255, 255, 200)); - glDrawArrays(GL_TRIANGLES, i*6, 6); - } + glDrawArrays(GL_TRIANGLES, i*6, 6); + } } void Viewer::visit(SceneGroup &s)