2014-08-19 13:49:08 +00:00
|
|
|
#include "OpenGLView.h"
|
|
|
|
|
|
|
|
#include <QQuickWindow>
|
2014-08-27 16:19:48 +00:00
|
|
|
#include <QHoverEvent>
|
2014-08-28 08:29:12 +00:00
|
|
|
#include "MainModelerWindow.h"
|
2014-08-19 13:49:08 +00:00
|
|
|
#include "OpenGLRenderer.h"
|
2014-09-26 15:46:39 +00:00
|
|
|
#include "ModelerCameras.h"
|
2014-08-19 13:49:08 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
OpenGLView::OpenGLView(QQuickItem *parent) : QQuickItem(parent) {
|
2014-08-19 13:49:08 +00:00
|
|
|
initialized = false;
|
2014-08-27 16:19:48 +00:00
|
|
|
window = NULL;
|
2014-08-28 08:29:12 +00:00
|
|
|
renderer = NULL;
|
2015-09-14 17:25:54 +00:00
|
|
|
delayed = 10;
|
2014-08-19 13:49:08 +00:00
|
|
|
|
2014-08-27 16:19:48 +00:00
|
|
|
setAcceptedMouseButtons(Qt::AllButtons);
|
2015-09-06 23:15:59 +00:00
|
|
|
setAcceptHoverEvents(true);
|
2014-09-26 15:46:39 +00:00
|
|
|
|
|
|
|
mouse_button = Qt::NoButton;
|
2014-08-19 13:49:08 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
connect(this, SIGNAL(windowChanged(QQuickWindow *)), this, SLOT(handleWindowChanged(QQuickWindow *)));
|
2015-08-24 17:38:59 +00:00
|
|
|
connect(this, SIGNAL(widthChanged()), this, SLOT(handleResize()));
|
|
|
|
connect(this, SIGNAL(heightChanged()), this, SLOT(handleResize()));
|
2014-08-19 13:49:08 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::handleWindowChanged(QQuickWindow *win) {
|
|
|
|
if (win) {
|
2014-08-28 08:29:12 +00:00
|
|
|
window = qobject_cast<MainModelerWindow *>(win);
|
2015-11-09 21:30:46 +00:00
|
|
|
if (window) {
|
2014-08-28 08:29:12 +00:00
|
|
|
renderer = window->getRenderer();
|
2015-12-03 22:04:50 +00:00
|
|
|
initialized = false;
|
2014-08-19 13:49:08 +00:00
|
|
|
|
2014-08-28 08:29:12 +00:00
|
|
|
win->setClearBeforeRendering(false);
|
2014-08-19 13:49:08 +00:00
|
|
|
|
2015-12-03 22:04:50 +00:00
|
|
|
connect(win, SIGNAL(sceneGraphInitialized()), this, SLOT(handleSceneGraphReady()));
|
2014-08-28 08:29:12 +00:00
|
|
|
}
|
2014-08-19 13:49:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::paint() {
|
|
|
|
if (delayed > 1) {
|
2015-09-14 17:25:54 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-12-10 22:41:42 +00:00
|
|
|
if (renderer->isStopped()) {
|
|
|
|
emit stopped();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (not initialized or not renderer) {
|
2014-08-28 08:29:12 +00:00
|
|
|
renderer->initialize();
|
2014-08-19 13:49:08 +00:00
|
|
|
initialized = true;
|
2015-08-24 17:38:59 +00:00
|
|
|
resized = true;
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (resized) {
|
2015-08-24 17:38:59 +00:00
|
|
|
renderer->resize(width(), height());
|
|
|
|
resized = false;
|
2014-08-19 13:49:08 +00:00
|
|
|
}
|
|
|
|
|
2015-12-07 22:32:55 +00:00
|
|
|
renderer->prepareOpenGLState(false);
|
|
|
|
renderer->paint(false);
|
2014-08-19 15:01:42 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (window) {
|
2014-08-27 16:19:48 +00:00
|
|
|
window->resetOpenGLState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::handleResize() {
|
2015-08-24 17:38:59 +00:00
|
|
|
resized = true;
|
|
|
|
}
|
|
|
|
|
2015-12-03 22:04:50 +00:00
|
|
|
void OpenGLView::handleSceneGraphReady() {
|
|
|
|
connect(window, SIGNAL(beforeRendering()), this, SLOT(paint()), Qt::DirectConnection);
|
|
|
|
startTimer(50);
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::wheelEvent(QWheelEvent *event) {
|
|
|
|
if (not acceptInputs()) {
|
2015-08-18 16:22:16 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-07-22 19:30:56 +00:00
|
|
|
double factor = getSpeedFactor(event);
|
2015-12-17 00:13:20 +00:00
|
|
|
window->getCamera()->processZoom(0.01 * factor * to_double(event->angleDelta().y()));
|
2014-09-26 15:46:39 +00:00
|
|
|
}
|
2014-08-28 08:29:12 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::mousePressEvent(QMouseEvent *event) {
|
|
|
|
if (not acceptInputs()) {
|
2015-08-18 16:22:16 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-09-26 15:46:39 +00:00
|
|
|
mouse_button = event->button();
|
|
|
|
mouse_pos = event->windowPos();
|
|
|
|
}
|
2014-08-27 16:19:48 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::mouseReleaseEvent(QMouseEvent *) {
|
|
|
|
if (not acceptInputs()) {
|
2015-08-18 16:22:16 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-09-26 15:46:39 +00:00
|
|
|
mouse_button = Qt::NoButton;
|
|
|
|
}
|
2014-08-27 16:19:48 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::mouseMoveEvent(QMouseEvent *event) {
|
|
|
|
if (not acceptInputs()) {
|
2015-08-18 16:22:16 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-07-22 19:30:56 +00:00
|
|
|
double factor = getSpeedFactor(event);
|
2014-09-26 15:46:39 +00:00
|
|
|
QPointF diff = event->windowPos() - mouse_pos;
|
2015-11-09 21:30:46 +00:00
|
|
|
if (mouse_button == Qt::LeftButton) {
|
2015-08-20 17:02:11 +00:00
|
|
|
window->getCamera()->processPanning(0.002 * factor * diff.x(), 0.001 * factor * diff.y());
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (mouse_button == Qt::RightButton) {
|
2015-08-20 17:02:11 +00:00
|
|
|
window->getCamera()->processScroll(-0.02 * factor * diff.x(), 0.02 * factor * diff.y());
|
2015-07-22 16:05:24 +00:00
|
|
|
}
|
2014-09-26 15:46:39 +00:00
|
|
|
mouse_pos = event->windowPos();
|
2015-09-06 23:15:59 +00:00
|
|
|
|
|
|
|
renderer->setMouseLocation(event->pos().x(), height() - event->pos().y());
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::hoverMoveEvent(QHoverEvent *event) {
|
2015-09-06 23:15:59 +00:00
|
|
|
renderer->setMouseLocation(event->pos().x(), height() - event->pos().y());
|
2014-08-27 16:19:48 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void OpenGLView::timerEvent(QTimerEvent *) {
|
|
|
|
if (delayed > 1) {
|
2015-09-14 17:25:54 +00:00
|
|
|
delayed--;
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (delayed == 1) {
|
|
|
|
if (renderer->isDisplayed()) {
|
2015-09-14 17:25:54 +00:00
|
|
|
delayed = 0;
|
|
|
|
window->setState("Init");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (window) {
|
2014-08-27 16:19:48 +00:00
|
|
|
window->update();
|
|
|
|
}
|
2014-08-19 13:49:08 +00:00
|
|
|
}
|
2015-07-22 19:30:56 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
bool OpenGLView::acceptInputs() const {
|
2015-08-18 16:22:16 +00:00
|
|
|
return window->getState() != "Render Dialog";
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
double OpenGLView::getSpeedFactor(QInputEvent *event) {
|
|
|
|
if (event->modifiers() & Qt::ControlModifier) {
|
2015-07-22 19:30:56 +00:00
|
|
|
return 0.2;
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (event->modifiers() & Qt::ShiftModifier) {
|
2015-07-22 19:30:56 +00:00
|
|
|
return 3.0;
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-07-22 19:30:56 +00:00
|
|
|
return 1.0;
|
|
|
|
}
|
|
|
|
}
|