]> git.sur5r.net Git - fstl/blobdiff - src/canvas.cpp
New upstream version 0.9.3
[fstl] / src / canvas.cpp
index dd645a538838f790a1ea61e75ffbe67f3762187b..b42a2be85957b2679696a0029c4371019c0a9f22 100644 (file)
 
 Canvas::Canvas(const QGLFormat& format, QWidget *parent)
     : QGLWidget(format, parent), mesh(NULL),
-      scale(1), zoom(1), tilt(90), yaw(0), status(" ")
+      scale(1), zoom(1), tilt(90), yaw(0),
+      perspective(0.25), anim(this, "perspective"), status(" ")
 {
-    // Nothing to do here
+    QFile styleFile(":/qt/style.qss");
+    styleFile.open( QFile::ReadOnly );
+    setStyleSheet(styleFile.readAll());
+
+    anim.setDuration(100);
 }
 
 Canvas::~Canvas()
@@ -20,21 +25,39 @@ Canvas::~Canvas()
     delete mesh;
 }
 
-void Canvas::load_mesh(Mesh* m)
+void Canvas::view_anim(float v)
+{
+    anim.setStartValue(perspective);
+    anim.setEndValue(v);
+    anim.start();
+}
+
+void Canvas::view_orthographic()
+{
+    view_anim(0);
+}
+
+void Canvas::view_perspective()
+{
+    view_anim(0.25);
+}
+
+void Canvas::load_mesh(Mesh* m, bool is_reload)
 {
     mesh = new GLMesh(m);
-    center = QVector3D(m->xmin() + m->xmax(),
-                       m->ymin() + m->ymax(),
-                       m->zmin() + m->zmax()) / 2;
-    scale = 2 / sqrt(
-                pow(m->xmax() - m->xmin(), 2) +
-                pow(m->ymax() - m->ymin(), 2) +
-                pow(m->zmax() - m->zmin(), 2));
-
-    // Reset other camera parameters
-    zoom = 1;
-    yaw = 0;
-    tilt = 90;
+
+    if (!is_reload)
+    {
+        QVector3D lower(m->xmin(), m->ymin(), m->zmin());
+        QVector3D upper(m->xmax(), m->ymax(), m->zmax());
+        center = (lower + upper) / 2;
+        scale = 2 / (upper - lower).length();
+
+        // Reset other camera parameters
+        zoom = 1;
+        yaw = 0;
+        tilt = 90;
+    }
 
     update();
 
@@ -47,6 +70,12 @@ void Canvas::set_status(const QString &s)
     update();
 }
 
+void Canvas::set_perspective(float p)
+{
+    perspective = p;
+    update();
+}
+
 void Canvas::clear_status()
 {
     status = "";
@@ -115,7 +144,7 @@ QMatrix4x4 Canvas::transform_matrix() const
     QMatrix4x4 m;
     m.rotate(tilt, QVector3D(1, 0, 0));
     m.rotate(yaw,  QVector3D(0, 0, 1));
-    m.scale(scale);
+    m.scale(-scale, scale, -scale);
     m.translate(-center);
     return m;
 }
@@ -132,6 +161,7 @@ QMatrix4x4 Canvas::view_matrix() const
         m.scale(-1, width() / float(height()), 0.5);
     }
     m.scale(zoom, zoom, 1);
+    m(3, 2) = perspective;
     return m;
 }
 
@@ -159,10 +189,11 @@ void Canvas::mouseMoveEvent(QMouseEvent* event)
     auto p = event->pos();
     auto d = p - mouse_pos;
 
+
     if (event->buttons() & Qt::LeftButton)
     {
         yaw = fmod(yaw - d.x(), 360);
-        tilt = fmax(0, fmin(180, tilt - d.y()));
+        tilt = fmod(tilt - d.y(), 360);
         update();
     }
     else if (event->buttons() & Qt::RightButton)
@@ -203,3 +234,8 @@ void Canvas::wheelEvent(QWheelEvent *event)
     center += b - a;
     update();
 }
+
+void Canvas::resizeGL(int width, int height)
+{
+    glViewport(0, 0, width, height);
+}