feat: Update SketchGrid to use shaders and re-enable drawing
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
#include "SketchGrid.h"
|
#include "SketchGrid.h"
|
||||||
|
#include <QOpenGLShaderProgram>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
SketchGrid::SketchGrid()
|
SketchGrid::SketchGrid()
|
||||||
{
|
{
|
||||||
@@ -11,102 +13,107 @@ SketchGrid::~SketchGrid()
|
|||||||
void SketchGrid::initializeGL()
|
void SketchGrid::initializeGL()
|
||||||
{
|
{
|
||||||
initializeOpenGLFunctions();
|
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);
|
QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);
|
||||||
glLoadMatrixf(projection.constData());
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
|
||||||
glLoadMatrixf(modelview.constData());
|
|
||||||
|
|
||||||
glPushAttrib(GL_LINE_BIT | GL_POINT_BIT | GL_CURRENT_BIT);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
drawGridLines(plane);
|
drawGridLines(plane, shaderProgram, colorLoc);
|
||||||
drawAxes(plane);
|
drawAxes(plane, shaderProgram, colorLoc);
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glPopAttrib();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SketchGrid::drawGridLines(SketchPlane plane)
|
void SketchGrid::drawGridLines(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc)
|
||||||
{
|
{
|
||||||
const int gridSize = 50;
|
const int gridSize = 50;
|
||||||
const float darkFactor = 0.8f;
|
const float darkFactor = 0.8f;
|
||||||
|
QVector<GLfloat> lightLines;
|
||||||
|
QVector<GLfloat> darkLines;
|
||||||
|
|
||||||
// Lighter lines
|
|
||||||
glColor3f(0.5f, 0.5f, 0.5f);
|
|
||||||
glLineWidth(1.0f);
|
|
||||||
glBegin(GL_LINES);
|
|
||||||
for (int i = -gridSize; i <= gridSize; ++i)
|
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;
|
if (i == 0) continue;
|
||||||
|
QVector<GLfloat>& current_vector = (i % 5 == 0) ? darkLines : lightLines;
|
||||||
if (plane == XY) {
|
if (plane == XY) {
|
||||||
glVertex3f(i, 0, -gridSize); glVertex3f(i, 0, gridSize);
|
current_vector << i << 0 << -gridSize << i << 0 << gridSize;
|
||||||
glVertex3f(-gridSize, 0, i); glVertex3f(gridSize, 0, i);
|
current_vector << -gridSize << 0 << i << gridSize << 0 << i;
|
||||||
} else if (plane == XZ) {
|
} else if (plane == XZ) {
|
||||||
glVertex3f(i, -gridSize, 0); glVertex3f(i, gridSize, 0);
|
current_vector << i << -gridSize << 0 << i << gridSize << 0;
|
||||||
glVertex3f(-gridSize, i, 0); glVertex3f(gridSize, i, 0);
|
current_vector << -gridSize << i << 0 << gridSize << i << 0;
|
||||||
} else { // YZ
|
} else { // YZ
|
||||||
glVertex3f(0, i, -gridSize); glVertex3f(0, i, gridSize);
|
current_vector << 0 << i << -gridSize << 0 << i << gridSize;
|
||||||
glVertex3f(0, -gridSize, i); glVertex3f(0, gridSize, i);
|
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;
|
const int axisLength = 50;
|
||||||
|
QVector<GLfloat> vertices;
|
||||||
|
|
||||||
glLineWidth(2.0f);
|
glLineWidth(2.0f);
|
||||||
glBegin(GL_LINES);
|
m_vbo.bind();
|
||||||
|
|
||||||
// X Axis (Red)
|
// X Axis (Red)
|
||||||
if (plane == XY || plane == XZ) {
|
if (plane == XY || plane == XZ) {
|
||||||
glColor3f(1.0f, 0.0f, 0.0f);
|
vertices.clear();
|
||||||
glVertex3f(-axisLength, 0, 0);
|
vertices << -axisLength << 0 << 0 << axisLength << 0 << 0;
|
||||||
glVertex3f(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)
|
// Y Axis (Green)
|
||||||
if (plane == XY || plane == YZ) {
|
if (plane == XY || plane == YZ) {
|
||||||
glColor3f(0.0f, 1.0f, 0.0f);
|
vertices.clear();
|
||||||
glVertex3f(0, 0, -axisLength);
|
vertices << 0 << 0 << -axisLength << 0 << 0 << axisLength;
|
||||||
glVertex3f(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)
|
// Z Axis (Blue)
|
||||||
if (plane == XZ || plane == YZ) {
|
if (plane == XZ || plane == YZ) {
|
||||||
glColor3f(0.0f, 0.0f, 1.0f);
|
vertices.clear();
|
||||||
glVertex3f(0, -axisLength, 0);
|
vertices << 0 << -axisLength << 0 << 0 << axisLength << 0;
|
||||||
glVertex3f(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
|
// Origin dot
|
||||||
glPointSize(5.0f);
|
glPointSize(5.0f);
|
||||||
glColor3f(1.0f, 1.0f, 1.0f); // White
|
vertices.clear();
|
||||||
glBegin(GL_POINTS);
|
vertices << 0.0f << 0.0f << 0.0f;
|
||||||
glVertex3f(0, 0, 0);
|
shaderProgram->setUniformValue(colorLoc, QVector4D(1.0f, 1.0f, 1.0f, 1.0f)); // White
|
||||||
glEnd();
|
m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(GLfloat));
|
||||||
|
glDrawArrays(GL_POINTS, 0, 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#include <QOpenGLFunctions>
|
#include <QOpenGLFunctions>
|
||||||
#include <QMatrix4x4>
|
#include <QMatrix4x4>
|
||||||
|
#include <QOpenGLVertexArrayObject>
|
||||||
|
#include <QOpenGLBuffer>
|
||||||
|
|
||||||
|
class QOpenGLShaderProgram;
|
||||||
|
|
||||||
class SketchGrid : protected QOpenGLFunctions
|
class SketchGrid : protected QOpenGLFunctions
|
||||||
{
|
{
|
||||||
@@ -17,11 +21,14 @@ public:
|
|||||||
~SketchGrid();
|
~SketchGrid();
|
||||||
|
|
||||||
void initializeGL();
|
void initializeGL();
|
||||||
void paintGL(SketchPlane plane, const QMatrix4x4& projection, const QMatrix4x4& modelview);
|
void paintGL(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void drawGridLines(SketchPlane plane);
|
void drawGridLines(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc);
|
||||||
void drawAxes(SketchPlane plane);
|
void drawAxes(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc);
|
||||||
|
|
||||||
|
QOpenGLVertexArrayObject m_vao;
|
||||||
|
QOpenGLBuffer m_vbo;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SKETCHGRID_H
|
#endif // SKETCHGRID_H
|
||||||
|
|||||||
@@ -108,15 +108,15 @@ void ViewportWidget::paintGL()
|
|||||||
|
|
||||||
QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);
|
QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);
|
||||||
|
|
||||||
// Sketch grid rendering - temporarily disabled as it uses the fixed-function pipeline
|
// Sketch grid rendering
|
||||||
// if (m_isSelectingPlane) {
|
if (m_isSelectingPlane) {
|
||||||
// if (m_highlightedPlane != SketchPlane::NONE) {
|
if (m_highlightedPlane != SketchPlane::NONE) {
|
||||||
// m_sketchGrid->paintGL(static_cast<SketchGrid::SketchPlane>(m_highlightedPlane), projection, model);
|
m_sketchGrid->paintGL(static_cast<SketchGrid::SketchPlane>(m_highlightedPlane), m_shaderProgram, m_colorLoc);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// if (m_currentPlane != SketchPlane::NONE) {
|
if (m_currentPlane != SketchPlane::NONE) {
|
||||||
// m_sketchGrid->paintGL(static_cast<SketchGrid::SketchPlane>(m_currentPlane), projection, model);
|
m_sketchGrid->paintGL(static_cast<SketchGrid::SketchPlane>(m_currentPlane), m_shaderProgram, m_colorLoc);
|
||||||
// }
|
}
|
||||||
|
|
||||||
if (m_isSelectingPlane) {
|
if (m_isSelectingPlane) {
|
||||||
drawSelectionPlanes();
|
drawSelectionPlanes();
|
||||||
|
|||||||
Reference in New Issue
Block a user