feat: Implement middle-mouse rotation around grid intersection with visual pivot

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-17 13:04:33 -07:00
parent 68eeeb11ec
commit 88199a9d51
3 changed files with 90 additions and 0 deletions

View File

@@ -153,6 +153,29 @@ void ViewportWidget::paintGL()
m_snapping->paintGL();
if (m_camera->isRotating()) {
const float radius = 0.004f * -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;
QVector3D center = m_camera->rotationPivot();
circleFillVertices << center.x() << center.y() << center.z(); // Center vertex for fan
for (int i = 0; i <= numSegments; ++i) { // <= to close the circle
float angle = (2.0f * M_PI * float(i)) / float(numSegments);
QVector3D p = center + radius * (cos(angle) * rightVec + sin(angle) * upVec);
circleFillVertices << p.x() << p.y() << p.z();
}
m_shaderProgram->setUniformValue(m_colorLoc, QVector4D(0.0f, 0.0f, 1.0f, 1.0f)); // Blue
m_vbo.bind();
m_vbo.allocate(circleFillVertices.constData(), circleFillVertices.size() * sizeof(GLfloat));
glDrawArrays(GL_TRIANGLE_FAN, 0, circleFillVertices.size() / 3);
}
if (m_activeSketchTool) {
m_activeSketchTool->paintGL();
}
@@ -196,6 +219,11 @@ void ViewportWidget::mousePressEvent(QMouseEvent *event)
{
m_camera->mousePressEvent(event);
if (event->button() == Qt::MiddleButton && !(QApplication::keyboardModifiers() & Qt::ShiftModifier)) {
m_camera->startRotation(unproject(event->pos(), m_currentPlane));
update();
}
if (event->button() == Qt::LeftButton) {
if (m_isSelectingPlane) {
if (m_highlightedPlane != SketchPlane::NONE) {
@@ -270,6 +298,15 @@ void ViewportWidget::keyPressEvent(QKeyEvent *event)
QOpenGLWidget::keyPressEvent(event);
}
void ViewportWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::MiddleButton) {
m_camera->stopRotation();
update();
}
QOpenGLWidget::mouseReleaseEvent(event);
}
void ViewportWidget::addLine(const gp_Pnt& start, const gp_Pnt& end)
{
emit lineAdded(start, end);