diff --git a/.gitignore b/.gitignore index bf0d469..d8f2dc8 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ release *_LOCAL_* *_BASE_* *_REMOTE_* +*.orig diff --git a/src/glnodes/shapes.cpp b/src/glnodes/shapes.cpp index 55de8f2..5ea289c 100644 --- a/src/glnodes/shapes.cpp +++ b/src/glnodes/shapes.cpp @@ -2,43 +2,16 @@ #include #include -void Square::accept(Visitor &v) { - v.visit(*this); -} - -void Circle::accept(Visitor &v) { - v.visit(*this); -} - -void Triangle::accept(Visitor &v) { +void Cube::accept(Visitor &v) { v.visit(*this); } // *** -void Square::setColor(QColor& c) { +void Cube::setColor(QColor& c) { color = QColor(c); } -void Circle::setColor(QColor& c) { - color = QColor(c); -} - -void Triangle::setColor(QColor& c) { - color = QColor(c); -} - - -QColor Triangle::getColor(){ - return color; -}; - - -QColor Circle::getColor(){ - return color; -}; - - -QColor Square::getColor(){ +QColor Cube::getColor(){ return color; }; diff --git a/src/glnodes/shapes.h b/src/glnodes/shapes.h index 2f92c5b..5d058ae 100644 --- a/src/glnodes/shapes.h +++ b/src/glnodes/shapes.h @@ -11,28 +11,10 @@ public: virtual QColor getColor() = 0; }; -class Circle : public Shape +class Cube : public Shape { public: - Circle(){} - QColor color; - void accept(Visitor& v) override; - void setColor(QColor& c); - QColor getColor(); -}; -class Triangle : public Shape -{ -public: - Triangle(){} - QColor color; - void accept(Visitor& v) override; - void setColor(QColor& c); - QColor getColor(); -}; -class Square : public Shape -{ -public: - Square(){} + Cube(){} QColor color; void accept(Visitor& v) override; void setColor(QColor& c); diff --git a/src/interfaces/visitor.h b/src/interfaces/visitor.h index 9786fb9..999f5c7 100644 --- a/src/interfaces/visitor.h +++ b/src/interfaces/visitor.h @@ -1,15 +1,11 @@ #ifndef VISITOR_H #define VISITOR_H class SceneGroup; -class Square; -class Circle; -class Triangle; +class Cube; class Visitor { public: virtual void visit(SceneGroup &n) = 0; - virtual void visit(Square &s) = 0; - virtual void visit(Circle &s) = 0; - virtual void visit(Triangle &s) = 0; + virtual void visit(Cube &s) = 0; }; #endif // VISITOR_H diff --git a/src/main.cpp b/src/main.cpp index 2c5842c..ccfec73 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,9 +20,6 @@ int main(int argc, char *argv[]) // Instantiate and layout the viewer. Viewer *v = new Viewer(); w.addViewer(v); - - //w.setFixedSize(dw.width() * 0.7, dw.height() * 0.7); - w.show(); return a.exec(); diff --git a/src/viewer/simpleViewer.cpp b/src/viewer/simpleViewer.cpp index 3f9409a..1e25414 100644 --- a/src/viewer/simpleViewer.cpp +++ b/src/viewer/simpleViewer.cpp @@ -41,12 +41,10 @@ using namespace std; namespace { -const int numVerticesSquare = 5; -const int numVerticesTriangle = 3; -const int numVerticesCircle = 26; -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() @@ -90,10 +88,16 @@ void Viewer::draw() // Prepare a transformation stack // stack modelStack; - - modelViewMatrix.translate(-4.5, -4.5); modelViewMatrix.scale(0.95); + //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);//*/ + m_program->setUniformValue(m_projMatrixLocation, projectionMatrix); m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); @@ -101,6 +105,7 @@ void Viewer::draw() modelStack.push(modelViewMatrix); root.accept(*this); + frame++; update(); } @@ -112,8 +117,10 @@ void Viewer::mouseMoveEvent(QMouseEvent* e) { void Viewer::mousePressEvent(QMouseEvent* e) { // Auto Return, but old code left in as reference - int x = this->x() + e->x() + 10; - int y = this->parentWidget()->height() - e->y() + 21; + + // TODO: figure out how to get this weird offset ↓↓ frame position maybe? + int x = this->x() + e->x() + 10; + int y = this->parentWidget()->height() - e->y() + 21; std::cout << "--------------------------------------------------\nPicking shape at " << x << " (" << this->x() << " + " << e->x() << "), " << y << endl; std::cout << "Window geom: " << this->window()->size().width() << "w, " << this->window()->size().height() << "h" << endl; Shape* selectedShape = pickGeom(x, y); @@ -161,16 +168,20 @@ void Viewer::init() // Init shaders & geometry initShaders(); - initGeometries(); - //initGrid(); + initGeometries(); - /*QColor* color = new QColor(255, 128, 0, 255); - Circle* c = new Circle; - c->setColor(*color); - SceneGroup* cell = new SceneGroup; - cell->addChild(c); - root.addChild(cell);//*/ - //update(); + { + 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() @@ -237,8 +248,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); @@ -246,92 +261,47 @@ 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 verticesSquare[numVerticesSquare][3] = { - { -0.5, 0.5, 0 }, - { -0.5, -0.5, 0 }, - { 0.5, -0.5, 0 }, - { 0.5, 0.5, 0 }, - { -0.5, 0.5, 0 } + 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_Square]); - glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[VBO_Square]); - glBufferData(GL_ARRAY_BUFFER, sizeof(verticesSquare), verticesSquare, 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); +} - // Create our triangle object, store its vertices on the graphic card, and - // bind the data to the vPosition attribute of the shader - GLfloat verticesTriangle[numVerticesTriangle][3] = { - { -0.5, -0.5, 0.0 }, - { 0.5, -0.5, 0.0 }, - { 0.0, 0.5, 0.0 } - }; +void Viewer::visit(Cube &s) +{ + QMatrix4x4 modelViewMatrix = modelStack.top() * QMatrix4x4(s.transform); - glBindVertexArray(m_VAOs[VAO_Triangle]); - glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[VBO_Triangle]); - glBufferData(GL_ARRAY_BUFFER, sizeof(verticesTriangle), verticesTriangle, GL_STATIC_DRAW); + 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, s.getColor()); - glVertexAttribPointer(m_vPositionLocation, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); - glEnableVertexAttribArray(m_vPositionLocation); - - // Create our Circle Object, and store its vertices with its bindings - - GLfloat verticesCircle[numVerticesCircle][3]; - - const float PI = 3.1415926f; - double increment = 2.0f * PI / (numVerticesCircle - 2); - - verticesCircle[0][0] = 0; - verticesCircle[0][1] = 0; - verticesCircle[0][2] = 0; - - for(int i = 1; i < numVerticesCircle; i++) { - double angle = increment * (i); - - verticesCircle[i][0] = 0.5 * cos(angle); - verticesCircle[i][1] = 0.5 * sin(angle); - verticesCircle[i][2] = 0; + glDrawArrays(GL_TRIANGLES, i*6, 6); } - - glBindVertexArray(m_VAOs[VAO_Circle]); - glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[VBO_Circle]); - glBufferData(GL_ARRAY_BUFFER, sizeof(verticesCircle), verticesCircle, GL_STATIC_DRAW); - - glVertexAttribPointer(m_vPositionLocation, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); - glEnableVertexAttribArray(m_vPositionLocation); -} - -void Viewer::visit(Square &s) -{ - QMatrix4x4 modelViewMatrix = modelStack.top() * QMatrix4x4(s.transform); - - glBindVertexArray(m_VAOs[VAO_Square]); - m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); - m_program->setUniformValue(m_colorLocation, s.color); - - glDrawArrays(GL_TRIANGLE_FAN, 0, numVerticesSquare); -} -void Viewer::visit(Circle &s) -{ - QMatrix4x4 modelViewMatrix = modelStack.top() * QMatrix4x4(s.transform); - - glBindVertexArray(m_VAOs[VAO_Circle]); - m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); - m_program->setUniformValue(m_colorLocation, s.color); - - glDrawArrays(GL_TRIANGLE_FAN, 0, numVerticesCircle); -} -void Viewer::visit(Triangle &s) -{ - QMatrix4x4 modelViewMatrix = modelStack.top() * QMatrix4x4(s.transform); - - glBindVertexArray(m_VAOs[VAO_Triangle]); - m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); - m_program->setUniformValue(m_colorLocation, s.color); - - glDrawArrays(GL_TRIANGLES, 0, numVerticesTriangle); } void Viewer::visit(SceneGroup &s) @@ -364,7 +334,7 @@ void Viewer::changeColor(QColor c){ Shape* Viewer::pickGeom(int x, int y){ QMap mapColorToShape; QColor c; - QRgb startColor = 0xFFFF00ee; // alpha must be 100%, glReadPixels doesn't resturn alpha + QRgb startColor = 0xFF0001; // alpha must be 100%, glReadPixels doesn't resturn alpha unsigned char pixelData[3]; // Traverse tree /* TODO: Make this recurse through SceneGroups, with like "populateMap(map, root, color)" @@ -390,35 +360,34 @@ Shape* Viewer::pickGeom(int x, int y){ if(currentCube) { - c.setRgba(startColor); - mapColorToShape.insert(c.rgba(), currentCube); + c.setRgb(startColor); + mapColorToShape.insert(c.rgb(), currentCube); std::cout << "Setting " << currentCube << " to " << c.red() << " " << c.green() << " " << c.blue() << " " << c.alpha() << endl; currentCube->setColor(c); - startColor++; + startColor+=6; } } - root.accept(*this); + update(); - draw(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // for debugging purposes - /*QImage *im = new QImage(64, 64, QImage::Format_RGB32); - for(int i = 0; i< 64; i++){ - for(int j = 0; j< 64; j++){ - glReadPixels(x-31+i, y+31-j, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelData); + /*QImage *im = new QImage(128,128, QImage::Format_RGB32); + for(int i = 0; i< 128; i++){ + for(int j = 0; j< 128; j++){ + glReadPixels(x-64+i, y+64-j, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelData); QColor* pickedColor = new QColor(pixelData[0], pixelData[1], pixelData[2]); - if(i==32&&j==32) pickedColor->setRgba(0xFFFFFFFF); + if(i==64&&j==64) pickedColor->setRgba(0xFFFFFFFF); im->setPixelColor(i, j, pickedColor->rgb()); } } im->save("./screenshot.bmp");//*/ - // TODO: figure out how to get this weird offset ↓↓ frame position maybe? glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelData); QColor* pickedColor = new QColor(pixelData[0], pixelData[1], pixelData[2]); - Shape* pickedShape = mapColorToShape.value(pickedColor->rgba()); + unsigned int pickedInt = pickedColor->rgb(); + Shape* pickedShape = mapColorToShape.value(pickedInt - (pickedInt % 6) + 1); std::cout << "Picked Color: " << pickedColor->red() << " " << pickedColor->green() << " " << pickedColor->blue() << " " << pickedColor->alpha() << endl; std::cout << "Picked Shape: " << pickedShape << endl; diff --git a/src/viewer/simpleViewer.h b/src/viewer/simpleViewer.h index fbff682..3933e09 100644 --- a/src/viewer/simpleViewer.h +++ b/src/viewer/simpleViewer.h @@ -46,9 +46,7 @@ public: ~Viewer(); virtual void visit(SceneGroup &s); - virtual void visit(Square &s); - virtual void visit(Circle &s); - virtual void visit(Triangle &s); + virtual void visit(Cube &s); public slots: void cleanup(); @@ -83,19 +81,20 @@ private: int m_projMatrixLocation; int m_mvMatrixLocation; - SceneGroup* activeCell; QColor* activeColor; int activeShape; - enum VAO_IDs { VAO_Square, VAO_Triangle, VAO_Circle, NumVAOs }; - enum Buffer_IDs { VBO_Square, VBO_Triangle, VBO_Circle, NumBuffers }; + enum VAO_IDs { VAO_Cube, NumVAOs }; + enum Buffer_IDs { VBO_Cube, NumBuffers }; GLuint m_VAOs[NumVAOs]; GLuint m_Buffers[NumBuffers]; Shape* generateShapeFromIndex(int); + QQuaternion rot; + unsigned int frame; }; #endif // SIMPLEVIEWER_H