24 #include "manipulatedFrame.h"
25 #include "manipulatedCameraFrame.h"
26 #include "qglviewer.h"
31 #include <QMouseEvent>
33 using namespace qglviewer;
44 : action_(
QGLViewer::NO_MOUSE_ACTION), keepsGrabbingMouse_(false)
54 previousConstraint_ = NULL;
56 connect(&spinningTimer_, SIGNAL(timeout()), SLOT(spinUpdate()));
72 keepsGrabbingMouse_ =
false;
73 action_ = QGLViewer::NO_MOUSE_ACTION;
95 const int thresold = 10;
97 setGrabsMouse(keepsGrabbingMouse_ || ((fabs(x-proj.x) < thresold) && (fabs(y-proj.y) < thresold)));
119 QDomElement mp = document.createElement(
"ManipulatedParameters");
146 QDomElement child=element.firstChild().toElement();
147 while (!child.isNull())
149 if (child.tagName() ==
"ManipulatedParameters")
158 child = child.nextSibling().toElement();
176 return action_ != QGLViewer::NO_MOUSE_ACTION;
186 spinningTimer_.start(updateInterval);
200 void ManipulatedFrame::spinUpdate()
215 previousConstraint_ = NULL;
224 case QGLViewer::ROTATE:
225 case QGLViewer::SCREEN_ROTATE:
230 case QGLViewer::SCREEN_TRANSLATE:
243 const QPoint delta = (e->pos() - prevPos_);
244 const float dist = sqrt(static_cast<float>(delta.x()*delta.x() + delta.y()*delta.y()));
245 delay_ = last_move_time.restart();
250 mouseSpeed_ = dist/delay_;
257 static bool horiz =
true;
261 const QPoint delta = e->pos() - pressPos_;
262 dirIsFixed_ = abs(delta.x()) != abs(delta.y());
263 horiz = abs(delta.x()) > abs(delta.y());
276 float dx = float(event->x() - prevPos_.x()) / camera->
screenWidth();
277 float dy = float(event->y() - prevPos_.y()) / camera->
screenHeight();
279 float value = fabs(dx) > fabs(dy) ? dx : dy;
284 static const float WHEEL_SENSITIVITY_COEF = 8E-4f;
288 void ManipulatedFrame::zoom(
float delta,
const Camera *
const camera) {
310 keepsGrabbingMouse_ =
true;
317 prevPos_ = pressPos_ =
event->pos();
333 case QGLViewer::TRANSLATE:
335 const QPoint delta =
event->pos() - prevPos_;
336 Vec trans(static_cast<float>(delta.x()), static_cast<float>(-delta.y()), 0.0);
338 switch (camera->
type())
340 case Camera::PERSPECTIVE :
343 case Camera::ORTHOGRAPHIC :
360 case QGLViewer::ZOOM:
366 case QGLViewer::SCREEN_ROTATE:
370 const double prev_angle = atan2(prevPos_.y()-trans[1], prevPos_.x()-trans[0]);
371 const double angle = atan2(event->y()-trans[1],
event->x()-trans[0]);
382 case QGLViewer::SCREEN_TRANSLATE:
387 trans.
setValue(static_cast<float>(event->x() - prevPos_.x()), 0.0, 0.0);
389 trans.
setValue(0.0, static_cast<float>(prevPos_.y() -
event->y()), 0.0);
391 switch (camera->
type())
393 case Camera::PERSPECTIVE :
396 case Camera::ORTHOGRAPHIC :
415 case QGLViewer::ROTATE:
419 trans =
Vec(-rot[0], -rot[1], -rot[2]);
432 case QGLViewer::MOVE_FORWARD:
433 case QGLViewer::MOVE_BACKWARD:
434 case QGLViewer::LOOK_AROUND:
435 case QGLViewer::ROLL:
436 case QGLViewer::DRIVE:
437 case QGLViewer::ZOOM_ON_REGION:
441 case QGLViewer::NO_MOUSE_ACTION:
447 if (action_ != QGLViewer::NO_MOUSE_ACTION)
449 prevPos_ =
event->pos();
466 keepsGrabbingMouse_ =
false;
468 if (previousConstraint_)
471 if (((action_ == QGLViewer::ROTATE) || (action_ == QGLViewer::SCREEN_ROTATE)) && (mouseSpeed_ >=
spinningSensitivity()))
474 action_ = QGLViewer::NO_MOUSE_ACTION;
484 if (event->modifiers() == Qt::NoModifier)
485 switch (event->button())
500 if (action_ == QGLViewer::ZOOM)
507 if (previousConstraint_)
510 action_ = QGLViewer::NO_MOUSE_ACTION;
520 static float projectOnBall(
float x,
float y)
523 const float size = 1.0f;
524 const float size2 = size*size;
525 const float size_limit = size2*0.5;
527 const float d = x*x + y*y;
528 return d < size_limit ? sqrt(size2 - d) : size_limit/sqrt(d);
542 const Vec p1(px, py, projectOnBall(px, py));
543 const Vec p2(dx, dy, projectOnBall(dx, dy));
546 const Vec axis = cross(p2,p1);