diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index fcc1df1..dbae993 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -761,32 +761,6 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch) } } - QVector 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_vbo.bind(); @@ -794,9 +768,57 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch) m_vbo.allocate(lineVertices.constData(), lineVertices.size() * sizeof(GLfloat)); glDrawArrays(GL_LINES, 0, lineVertices.size() / 3); } - if (!circleVertices.isEmpty()) { - m_vbo.allocate(circleVertices.constData(), circleVertices.size() * sizeof(GLfloat)); - glDrawArrays(GL_LINES, 0, circleVertices.size() / 3); + + QVector unattachedVertices; + 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 circleFillVertices; + QVector 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);