diff --git a/src/SketchGrid.cpp b/src/SketchGrid.cpp index b934c59..b78c51a 100644 --- a/src/SketchGrid.cpp +++ b/src/SketchGrid.cpp @@ -1,4 +1,6 @@ #include "SketchGrid.h" +#include +#include SketchGrid::SketchGrid() { @@ -11,102 +13,107 @@ SketchGrid::~SketchGrid() void SketchGrid::initializeGL() { initializeOpenGLFunctions(); + + m_vao.create(); + QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao); + + m_vbo.create(); + m_vbo.bind(); + m_vbo.allocate(nullptr, 0); // Allocate when drawing + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nullptr); + + m_vbo.release(); } -void SketchGrid::paintGL(SketchPlane plane, const QMatrix4x4& projection, const QMatrix4x4& modelview) +void SketchGrid::paintGL(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc) { - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(projection.constData()); - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf(modelview.constData()); - - glPushAttrib(GL_LINE_BIT | GL_POINT_BIT | GL_CURRENT_BIT); + QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao); glDisable(GL_DEPTH_TEST); - drawGridLines(plane); - drawAxes(plane); + drawGridLines(plane, shaderProgram, colorLoc); + drawAxes(plane, shaderProgram, colorLoc); glEnable(GL_DEPTH_TEST); - glPopAttrib(); } -void SketchGrid::drawGridLines(SketchPlane plane) +void SketchGrid::drawGridLines(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc) { const int gridSize = 50; const float darkFactor = 0.8f; + QVector lightLines; + QVector darkLines; - // Lighter lines - glColor3f(0.5f, 0.5f, 0.5f); - glLineWidth(1.0f); - glBegin(GL_LINES); for (int i = -gridSize; i <= gridSize; ++i) - { - if (i == 0 || i % 5 == 0) continue; - if (plane == XY) { - glVertex3f(i, 0, -gridSize); glVertex3f(i, 0, gridSize); - glVertex3f(-gridSize, 0, i); glVertex3f(gridSize, 0, i); - } else if (plane == XZ) { - glVertex3f(i, -gridSize, 0); glVertex3f(i, gridSize, 0); - glVertex3f(-gridSize, i, 0); glVertex3f(gridSize, i, 0); - } else { // YZ - glVertex3f(0, i, -gridSize); glVertex3f(0, i, gridSize); - glVertex3f(0, -gridSize, i); glVertex3f(0, gridSize, i); - } - } - glEnd(); - - // Darker lines - glColor3f(0.5f * darkFactor, 0.5f * darkFactor, 0.5f * darkFactor); - glLineWidth(1.5f); - glBegin(GL_LINES); - for (int i = -gridSize; i <= gridSize; i += 5) { if (i == 0) continue; + QVector& current_vector = (i % 5 == 0) ? darkLines : lightLines; if (plane == XY) { - glVertex3f(i, 0, -gridSize); glVertex3f(i, 0, gridSize); - glVertex3f(-gridSize, 0, i); glVertex3f(gridSize, 0, i); + current_vector << i << 0 << -gridSize << i << 0 << gridSize; + current_vector << -gridSize << 0 << i << gridSize << 0 << i; } else if (plane == XZ) { - glVertex3f(i, -gridSize, 0); glVertex3f(i, gridSize, 0); - glVertex3f(-gridSize, i, 0); glVertex3f(gridSize, i, 0); + current_vector << i << -gridSize << 0 << i << gridSize << 0; + current_vector << -gridSize << i << 0 << gridSize << i << 0; } else { // YZ - glVertex3f(0, i, -gridSize); glVertex3f(0, i, gridSize); - glVertex3f(0, -gridSize, i); glVertex3f(0, gridSize, i); + current_vector << 0 << i << -gridSize << 0 << i << gridSize; + current_vector << 0 << -gridSize << i << 0 << gridSize << i; } } - glEnd(); + + m_vbo.bind(); + + // Draw lighter lines + shaderProgram->setUniformValue(colorLoc, QVector4D(0.5f, 0.5f, 0.5f, 1.0f)); + glLineWidth(1.0f); + m_vbo.allocate(lightLines.constData(), lightLines.size() * sizeof(GLfloat)); + glDrawArrays(GL_LINES, 0, lightLines.size() / 3); + + // Draw darker lines + shaderProgram->setUniformValue(colorLoc, QVector4D(0.5f * darkFactor, 0.5f * darkFactor, 0.5f * darkFactor, 1.0f)); + glLineWidth(1.5f); + m_vbo.allocate(darkLines.constData(), darkLines.size() * sizeof(GLfloat)); + glDrawArrays(GL_LINES, 0, darkLines.size() / 3); } -void SketchGrid::drawAxes(SketchPlane plane) +void SketchGrid::drawAxes(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc) { const int axisLength = 50; + QVector vertices; glLineWidth(2.0f); - glBegin(GL_LINES); + m_vbo.bind(); // X Axis (Red) if (plane == XY || plane == XZ) { - glColor3f(1.0f, 0.0f, 0.0f); - glVertex3f(-axisLength, 0, 0); - glVertex3f(axisLength, 0, 0); + vertices.clear(); + vertices << -axisLength << 0 << 0 << axisLength << 0 << 0; + shaderProgram->setUniformValue(colorLoc, QVector4D(1.0f, 0.0f, 0.0f, 1.0f)); + m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(GLfloat)); + glDrawArrays(GL_LINES, 0, 2); } // Y Axis (Green) if (plane == XY || plane == YZ) { - glColor3f(0.0f, 1.0f, 0.0f); - glVertex3f(0, 0, -axisLength); - glVertex3f(0, 0, axisLength); + vertices.clear(); + vertices << 0 << 0 << -axisLength << 0 << 0 << axisLength; + shaderProgram->setUniformValue(colorLoc, QVector4D(0.0f, 1.0f, 0.0f, 1.0f)); + m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(GLfloat)); + glDrawArrays(GL_LINES, 0, 2); } // Z Axis (Blue) if (plane == XZ || plane == YZ) { - glColor3f(0.0f, 0.0f, 1.0f); - glVertex3f(0, -axisLength, 0); - glVertex3f(0, axisLength, 0); + vertices.clear(); + vertices << 0 << -axisLength << 0 << 0 << axisLength << 0; + shaderProgram->setUniformValue(colorLoc, QVector4D(0.0f, 0.0f, 1.0f, 1.0f)); + m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(GLfloat)); + glDrawArrays(GL_LINES, 0, 2); } - glEnd(); - + // Origin dot glPointSize(5.0f); - glColor3f(1.0f, 1.0f, 1.0f); // White - glBegin(GL_POINTS); - glVertex3f(0, 0, 0); - glEnd(); + vertices.clear(); + vertices << 0.0f << 0.0f << 0.0f; + shaderProgram->setUniformValue(colorLoc, QVector4D(1.0f, 1.0f, 1.0f, 1.0f)); // White + m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(GLfloat)); + glDrawArrays(GL_POINTS, 0, 1); } diff --git a/src/SketchGrid.h b/src/SketchGrid.h index 6027c03..2de391c 100644 --- a/src/SketchGrid.h +++ b/src/SketchGrid.h @@ -3,6 +3,10 @@ #include #include +#include +#include + +class QOpenGLShaderProgram; class SketchGrid : protected QOpenGLFunctions { @@ -17,11 +21,14 @@ public: ~SketchGrid(); void initializeGL(); - void paintGL(SketchPlane plane, const QMatrix4x4& projection, const QMatrix4x4& modelview); + void paintGL(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc); private: - void drawGridLines(SketchPlane plane); - void drawAxes(SketchPlane plane); + void drawGridLines(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc); + void drawAxes(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc); + + QOpenGLVertexArrayObject m_vao; + QOpenGLBuffer m_vbo; }; #endif // SKETCHGRID_H diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index 4726bfa..00acd12 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -108,15 +108,15 @@ void ViewportWidget::paintGL() QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao); - // Sketch grid rendering - temporarily disabled as it uses the fixed-function pipeline - // if (m_isSelectingPlane) { - // if (m_highlightedPlane != SketchPlane::NONE) { - // m_sketchGrid->paintGL(static_cast(m_highlightedPlane), projection, model); - // } - // } - // if (m_currentPlane != SketchPlane::NONE) { - // m_sketchGrid->paintGL(static_cast(m_currentPlane), projection, model); - // } + // Sketch grid rendering + if (m_isSelectingPlane) { + if (m_highlightedPlane != SketchPlane::NONE) { + m_sketchGrid->paintGL(static_cast(m_highlightedPlane), m_shaderProgram, m_colorLoc); + } + } + if (m_currentPlane != SketchPlane::NONE) { + m_sketchGrid->paintGL(static_cast(m_currentPlane), m_shaderProgram, m_colorLoc); + } if (m_isSelectingPlane) { drawSelectionPlanes();