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()
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();
update();
}
+void Canvas::set_perspective(float p)
+{
+ perspective = p;
+ update();
+}
+
void Canvas::clear_status()
{
status = "";
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;
}
m.scale(-1, width() / float(height()), 0.5);
}
m.scale(zoom, zoom, 1);
+ m(3, 2) = perspective;
return m;
}
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)
center += b - a;
update();
}
+
+void Canvas::resizeGL(int width, int height)
+{
+ glViewport(0, 0, width, height);
+}