paysages3d/src/interface/modeler/MainModelerWindow.cpp

176 lines
5.6 KiB
C++
Raw Normal View History

2014-08-28 08:29:12 +00:00
#include "MainModelerWindow.h"
#include "Logs.h"
2014-08-28 08:29:12 +00:00
#include "OpenGLView.h"
#include "Scenery.h"
#include "OpenGLRenderer.h"
2014-08-28 13:09:47 +00:00
#include "AtmosphereModeler.h"
#include "WaterModeler.h"
#include "ModelerCameras.h"
2014-09-09 15:56:52 +00:00
#include "RenderPreviewProvider.h"
#include "RenderProcess.h"
#include "RenderConfig.h"
#include <QQmlEngine>
2015-07-22 16:05:24 +00:00
#include <QGuiApplication>
2014-08-28 08:29:12 +00:00
MainModelerWindow::MainModelerWindow() {
2015-12-07 22:32:55 +00:00
QSurfaceFormat new_format = format();
new_format.setVersion(OPENGL_MAJOR_VERSION, OPENGL_MINOR_VERSION);
new_format.setProfile(QSurfaceFormat::CoreProfile);
2015-12-07 22:32:55 +00:00
setFormat(new_format);
2015-08-18 20:29:18 +00:00
scenery = new Scenery();
scenery->autoPreset();
2015-08-18 20:29:18 +00:00
renderer = new OpenGLRenderer(scenery);
2014-08-28 08:29:12 +00:00
2014-09-09 15:56:52 +00:00
render_preview_provider = new RenderPreviewProvider();
2014-08-28 08:29:12 +00:00
qmlRegisterType<OpenGLView>("Paysages", 1, 0, "OpenGLView");
2014-09-09 15:56:52 +00:00
engine()->addImageProvider("renderpreviewprovider", render_preview_provider);
2014-08-28 08:29:12 +00:00
2015-09-14 23:26:05 +00:00
setMinimumSize(QSize(1280, 720));
2014-08-28 08:29:12 +00:00
setTitle(QObject::tr("Paysages 3D"));
setResizeMode(QQuickView::SizeRootObjectToView);
setSource(QUrl("qrc:///main.qml"));
2014-08-28 13:09:47 +00:00
atmosphere = new AtmosphereModeler(this);
water = new WaterModeler(this);
2015-12-30 19:32:26 +00:00
cameras = new ModelerCameras(this);
render_process = new RenderProcess(this, render_preview_provider);
2015-08-19 23:15:08 +00:00
connectQmlSignal("tool_file_new", SIGNAL(clicked()), this, SLOT(newFile()));
connectQmlSignal("tool_file_save", SIGNAL(clicked()), this, SLOT(saveFile()));
connectQmlSignal("tool_file_load", SIGNAL(clicked()), this, SLOT(loadFile()));
connectQmlSignal("tool_file_exit", SIGNAL(clicked()), this, SLOT(exit()));
connectQmlSignal("root", SIGNAL(stopped()), this, SLOT(effectiveExit()));
2014-08-28 08:29:12 +00:00
}
MainModelerWindow::~MainModelerWindow() {
// TODO Should be done automatically for all tools
cameras->unregister();
atmosphere->destroy();
water->destroy();
2014-08-28 13:09:47 +00:00
delete atmosphere;
delete water;
delete cameras;
2014-08-28 13:09:47 +00:00
// delete render_preview_provider; // don't delete it, addImageProvider took ownership
2014-09-09 15:56:52 +00:00
delete render_process;
2014-08-28 08:29:12 +00:00
delete renderer;
2015-08-18 20:47:18 +00:00
delete scenery;
2014-08-28 08:29:12 +00:00
}
2014-08-28 13:09:47 +00:00
QObject *MainModelerWindow::findQmlObject(const string &objectName) {
if (objectName == "ui" || objectName == "root") {
return rootObject();
} else {
return rootObject()->findChild<QObject *>(QString::fromStdString(objectName));
}
2014-08-28 13:09:47 +00:00
}
2014-09-09 15:56:52 +00:00
void MainModelerWindow::setQmlProperty(const string &objectName, const string &propertyName, const QVariant &value) {
QObject *item = findQmlObject(objectName);
if (item) {
item->setProperty(propertyName.c_str(), value);
} else {
Logs::error("UI") << "QML object not found :" << objectName << endl;
}
}
void MainModelerWindow::connectQmlSignal(const string &objectName, const char *signal, const QObject *receiver,
const char *method) {
QObject *item = findQmlObject(objectName);
if (item) {
connect(item, signal, receiver, method);
} else {
Logs::error("UI") << "QML object not found :" << objectName << endl;
}
}
string MainModelerWindow::getState() const {
return rootObject()->property("state").toString().toStdString();
}
void MainModelerWindow::setState(const string &stateName) {
rootObject()->setProperty("state", QString::fromStdString(stateName));
}
void MainModelerWindow::newFile() {
2015-08-19 23:15:08 +00:00
getScenery()->autoPreset();
renderer->reset();
}
void MainModelerWindow::saveFile() {
2015-08-19 23:15:08 +00:00
getScenery()->saveGlobal("saved.p3d");
}
void MainModelerWindow::loadFile() {
2015-08-19 23:15:08 +00:00
Scenery loaded;
if (loaded.loadGlobal("saved.p3d") == Scenery::FILE_OPERATION_OK) {
2015-08-19 23:15:08 +00:00
loaded.copy(scenery);
renderer->reset();
}
}
void MainModelerWindow::exit() {
renderer->stop();
2015-08-19 23:15:08 +00:00
}
void MainModelerWindow::keyReleaseEvent(QKeyEvent *event) {
if (event->modifiers() & Qt::ControlModifier && event->key() == Qt::Key_Q) {
2015-09-09 22:40:47 +00:00
exit();
} else if (getState() == "Render Dialog") {
if (event->key() == Qt::Key_Escape) {
render_process->stopRender();
2015-07-22 16:05:24 +00:00
}
} else {
if (event->key() == Qt::Key_F5) {
// Start render in a thread
if ((event->modifiers() & Qt::ControlModifier) and (event->modifiers() & Qt::ShiftModifier)) {
render_process->startFinalRender();
} else if (event->modifiers() & Qt::ControlModifier) {
render_process->startMediumRender();
} else {
render_process->startQuickRender();
}
} else if (event->key() == Qt::Key_F6) {
render_process->showPreviousRender();
} else if (event->key() == Qt::Key_F12) {
2016-02-01 19:38:29 +00:00
Logs::warning("UI") << "Current scenery dump:" << endl << scenery->toString() << endl;
} else if (event->key() == Qt::Key_N) {
if (event->modifiers() & Qt::ControlModifier) {
2015-08-19 23:15:08 +00:00
newFile();
}
} else if (event->key() == Qt::Key_S) {
if (event->modifiers() & Qt::ControlModifier) {
2015-08-19 23:15:08 +00:00
saveFile();
}
} else if (event->key() == Qt::Key_L or event->key() == Qt::Key_O) {
if (event->modifiers() & Qt::ControlModifier) {
2015-08-19 23:15:08 +00:00
loadFile();
}
} else if (event->key() == Qt::Key_Z) {
if (event->modifiers() & Qt::ControlModifier) {
if (event->modifiers() & Qt::ShiftModifier) {
2015-12-13 21:25:46 +00:00
getScenery()->redo();
} else {
2015-12-13 21:25:46 +00:00
getScenery()->undo();
}
}
} else if (event->key() == Qt::Key_Y) {
if (event->modifiers() & Qt::ControlModifier) {
2015-12-13 21:25:46 +00:00
getScenery()->redo();
}
}
}
2014-09-09 15:56:52 +00:00
}
void MainModelerWindow::effectiveExit() {
close();
}