X-Git-Url: https://git.sur5r.net/?p=fstl;a=blobdiff_plain;f=src%2Fcanvas.cpp;fp=src%2Fcanvas.cpp;h=b42a2be85957b2679696a0029c4371019c0a9f22;hp=dd645a538838f790a1ea61e75ffbe67f3762187b;hb=ff02a2cf9b32c9cbe26785150d32ccb251149cf4;hpb=0ff67c7a2411f6ebd661f293305d6401d07ec0b5 diff --git a/src/canvas.cpp b/src/canvas.cpp index dd645a5..b42a2be 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -10,9 +10,14 @@ 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); +}