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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user