style: Render unattached sketch vertices as filled circles with outline
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
@@ -761,32 +761,6 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<GLfloat> circleVertices;
|
|
||||||
const float radius = 0.005f * -m_camera->zoom();
|
|
||||||
const int numSegments = 16;
|
|
||||||
|
|
||||||
QMatrix4x4 invModelView = m_camera->modelViewMatrix().inverted();
|
|
||||||
QVector3D rightVec = invModelView.column(0).toVector3D();
|
|
||||||
QVector3D upVec = invModelView.column(1).toVector3D();
|
|
||||||
|
|
||||||
for (const auto& pair : vertexCounts) {
|
|
||||||
if (pair.second == 1) {
|
|
||||||
const gp_Pnt& centerPnt = pair.first;
|
|
||||||
QVector3D center(centerPnt.X(), centerPnt.Y(), centerPnt.Z());
|
|
||||||
|
|
||||||
for (int i = 0; i < numSegments; ++i) {
|
|
||||||
float angle1 = (2.0f * M_PI * float(i)) / float(numSegments);
|
|
||||||
float angle2 = (2.0f * M_PI * float(i + 1)) / float(numSegments);
|
|
||||||
|
|
||||||
QVector3D p1 = center + radius * (cos(angle1) * rightVec + sin(angle1) * upVec);
|
|
||||||
QVector3D p2 = center + radius * (cos(angle2) * rightVec + sin(angle2) * upVec);
|
|
||||||
|
|
||||||
circleVertices << p1.x() << p1.y() << p1.z();
|
|
||||||
circleVertices << p2.x() << p2.y() << p2.z();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_shaderProgram->setUniformValue(m_colorLoc, QVector4D(1.0f, 1.0f, 1.0f, 1.0f));
|
m_shaderProgram->setUniformValue(m_colorLoc, QVector4D(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
m_vbo.bind();
|
m_vbo.bind();
|
||||||
|
|
||||||
@@ -794,9 +768,57 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch)
|
|||||||
m_vbo.allocate(lineVertices.constData(), lineVertices.size() * sizeof(GLfloat));
|
m_vbo.allocate(lineVertices.constData(), lineVertices.size() * sizeof(GLfloat));
|
||||||
glDrawArrays(GL_LINES, 0, lineVertices.size() / 3);
|
glDrawArrays(GL_LINES, 0, lineVertices.size() / 3);
|
||||||
}
|
}
|
||||||
if (!circleVertices.isEmpty()) {
|
|
||||||
m_vbo.allocate(circleVertices.constData(), circleVertices.size() * sizeof(GLfloat));
|
QVector<gp_Pnt> unattachedVertices;
|
||||||
glDrawArrays(GL_LINES, 0, circleVertices.size() / 3);
|
for (const auto& pair : vertexCounts) {
|
||||||
|
if (pair.second == 1) {
|
||||||
|
unattachedVertices.append(pair.first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!unattachedVertices.isEmpty()) {
|
||||||
|
const float radius = 0.005f * -m_camera->zoom();
|
||||||
|
const int numSegments = 16;
|
||||||
|
QMatrix4x4 invModelView = m_camera->modelViewMatrix().inverted();
|
||||||
|
QVector3D rightVec = invModelView.column(0).toVector3D();
|
||||||
|
QVector3D upVec = invModelView.column(1).toVector3D();
|
||||||
|
|
||||||
|
QVector<GLfloat> circleFillVertices;
|
||||||
|
QVector<GLfloat> circleOutlineVertices;
|
||||||
|
|
||||||
|
for (const auto& centerPnt : unattachedVertices) {
|
||||||
|
QVector3D center(centerPnt.X(), centerPnt.Y(), centerPnt.Z());
|
||||||
|
|
||||||
|
circleFillVertices << center.x() << center.y() << center.z(); // Center vertex for fan
|
||||||
|
|
||||||
|
QVector3D firstCircumferencePoint;
|
||||||
|
for (int i = 0; i < numSegments; ++i) {
|
||||||
|
float angle = (2.0f * M_PI * float(i)) / float(numSegments);
|
||||||
|
QVector3D p = center + radius * (cos(angle) * rightVec + sin(angle) * upVec);
|
||||||
|
if (i == 0) {
|
||||||
|
firstCircumferencePoint = p;
|
||||||
|
}
|
||||||
|
circleFillVertices << p.x() << p.y() << p.z();
|
||||||
|
circleOutlineVertices << p.x() << p.y() << p.z();
|
||||||
|
}
|
||||||
|
circleFillVertices << firstCircumferencePoint.x() << firstCircumferencePoint.y() << firstCircumferencePoint.z();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw fills
|
||||||
|
m_shaderProgram->setUniformValue(m_colorLoc, QVector4D(0.2f, 0.3f, 0.3f, 1.0f));
|
||||||
|
m_vbo.allocate(circleFillVertices.constData(), circleFillVertices.size() * sizeof(GLfloat));
|
||||||
|
const int vertsPerFan = numSegments + 2;
|
||||||
|
for (size_t i = 0; i < unattachedVertices.size(); ++i) {
|
||||||
|
glDrawArrays(GL_TRIANGLE_FAN, i * vertsPerFan, vertsPerFan);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw outlines
|
||||||
|
m_shaderProgram->setUniformValue(m_colorLoc, QVector4D(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
|
m_vbo.allocate(circleOutlineVertices.constData(), circleOutlineVertices.size() * sizeof(GLfloat));
|
||||||
|
const int vertsPerLoop = numSegments;
|
||||||
|
for (size_t i = 0; i < unattachedVertices.size(); ++i) {
|
||||||
|
glDrawArrays(GL_LINE_LOOP, i * vertsPerLoop, vertsPerLoop);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|||||||
Reference in New Issue
Block a user