2014-08-28 08:29:12 +00:00
|
|
|
#include "MainModelerWindow.h"
|
|
|
|
|
2015-08-12 15:02:27 +00:00
|
|
|
#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"
|
2014-09-18 15:38:37 +00:00
|
|
|
#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
|
|
|
|
2015-11-09 21:30:46 +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);
|
2015-12-03 22:04:50 +00:00
|
|
|
new_format.setProfile(QSurfaceFormat::CoreProfile);
|
2015-12-07 22:32:55 +00:00
|
|
|
setFormat(new_format);
|
2015-12-03 22:04:50 +00:00
|
|
|
|
2015-08-18 20:29:18 +00:00
|
|
|
scenery = new Scenery();
|
|
|
|
scenery->autoPreset();
|
2015-08-12 15:02:27 +00:00
|
|
|
|
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);
|
2015-07-22 22:28:27 +00:00
|
|
|
|
|
|
|
render_process = new RenderProcess(this, render_preview_provider);
|
2015-08-19 23:15:08 +00:00
|
|
|
|
2015-12-10 22:41:42 +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
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
MainModelerWindow::~MainModelerWindow() {
|
2014-08-28 13:09:47 +00:00
|
|
|
delete atmosphere;
|
|
|
|
delete water;
|
2014-09-18 15:38:37 +00:00
|
|
|
delete cameras;
|
2014-08-28 13:09:47 +00:00
|
|
|
|
2015-11-09 21:30:46 +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
|
|
|
|
2015-12-29 23:20:20 +00:00
|
|
|
QObject *MainModelerWindow::findQmlObject(const string &objectName) {
|
2015-11-09 21:30:46 +00:00
|
|
|
if (objectName == "ui" || objectName == "root") {
|
2015-09-21 21:12:43 +00:00
|
|
|
return rootObject();
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-12-29 23:20:20 +00:00
|
|
|
return rootObject()->findChild<QObject *>(QString::fromStdString(objectName));
|
2015-09-21 21:12:43 +00:00
|
|
|
}
|
2014-08-28 13:09:47 +00:00
|
|
|
}
|
2014-09-09 15:56:52 +00:00
|
|
|
|
2015-12-29 23:20:20 +00:00
|
|
|
void MainModelerWindow::setQmlProperty(const string &objectName, const string &propertyName, const QVariant &value) {
|
2015-07-22 22:28:27 +00:00
|
|
|
QObject *item = findQmlObject(objectName);
|
2015-11-09 21:30:46 +00:00
|
|
|
if (item) {
|
2015-12-29 23:20:20 +00:00
|
|
|
item->setProperty(propertyName.c_str(), value);
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-12-29 23:20:20 +00:00
|
|
|
Logs::error("UI") << "QML object not found :" << objectName << endl;
|
2015-09-21 21:12:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-29 23:20:20 +00:00
|
|
|
void MainModelerWindow::connectQmlSignal(const string &objectName, const char *signal, const QObject *receiver,
|
2015-11-09 21:30:46 +00:00
|
|
|
const char *method) {
|
2015-09-21 21:12:43 +00:00
|
|
|
QObject *item = findQmlObject(objectName);
|
2015-11-09 21:30:46 +00:00
|
|
|
if (item) {
|
2015-09-21 21:12:43 +00:00
|
|
|
connect(item, signal, receiver, method);
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-12-29 23:20:20 +00:00
|
|
|
Logs::error("UI") << "QML object not found :" << objectName << endl;
|
2015-09-21 21:12:43 +00:00
|
|
|
}
|
2015-07-22 22:28:27 +00:00
|
|
|
}
|
|
|
|
|
2015-12-29 23:20:20 +00:00
|
|
|
string MainModelerWindow::getState() const {
|
|
|
|
return rootObject()->property("state").toString().toStdString();
|
2015-08-18 16:22:16 +00:00
|
|
|
}
|
|
|
|
|
2015-12-29 23:20:20 +00:00
|
|
|
void MainModelerWindow::setState(const string &stateName) {
|
|
|
|
rootObject()->setProperty("state", QString::fromStdString(stateName));
|
2015-07-22 22:28:27 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void MainModelerWindow::newFile() {
|
2015-08-19 23:15:08 +00:00
|
|
|
getScenery()->autoPreset();
|
|
|
|
renderer->reset();
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void MainModelerWindow::saveFile() {
|
2015-08-19 23:15:08 +00:00
|
|
|
getScenery()->saveGlobal("saved.p3d");
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void MainModelerWindow::loadFile() {
|
2015-08-19 23:15:08 +00:00
|
|
|
Scenery loaded;
|
2015-11-09 21:30:46 +00:00
|
|
|
if (loaded.loadGlobal("saved.p3d") == Scenery::FILE_OPERATION_OK) {
|
2015-08-19 23:15:08 +00:00
|
|
|
loaded.copy(scenery);
|
|
|
|
renderer->reset();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void MainModelerWindow::exit() {
|
2015-12-10 22:41:42 +00:00
|
|
|
renderer->stop();
|
2015-08-19 23:15:08 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +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();
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (getState() == "Render Dialog") {
|
|
|
|
if (event->key() == Qt::Key_Escape) {
|
2015-08-18 16:22:16 +00:00
|
|
|
render_process->stopRender();
|
2015-07-22 16:05:24 +00:00
|
|
|
}
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
|
|
|
if (event->key() == Qt::Key_F5) {
|
2015-08-18 16:22:16 +00:00
|
|
|
// Start render in a thread
|
2015-11-09 21:30:46 +00:00
|
|
|
if ((event->modifiers() & Qt::ControlModifier) and (event->modifiers() & Qt::ShiftModifier)) {
|
2015-08-18 16:22:16 +00:00
|
|
|
render_process->startFinalRender();
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (event->modifiers() & Qt::ControlModifier) {
|
2015-09-13 22:48:55 +00:00
|
|
|
render_process->startMediumRender();
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-08-18 16:22:16 +00:00
|
|
|
render_process->startQuickRender();
|
2015-08-17 20:55:30 +00:00
|
|
|
}
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (event->key() == Qt::Key_F6) {
|
2015-08-18 16:22:16 +00:00
|
|
|
render_process->showPreviousRender();
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (event->key() == Qt::Key_F12) {
|
2015-12-13 19:08:38 +00:00
|
|
|
Logs::warning("UI") << "Current scenery dump:" << endl
|
|
|
|
<< scenery->toString() << endl;
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (event->key() == Qt::Key_N) {
|
|
|
|
if (event->modifiers() & Qt::ControlModifier) {
|
2015-08-19 23:15:08 +00:00
|
|
|
newFile();
|
2015-08-19 18:06:47 +00:00
|
|
|
}
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (event->key() == Qt::Key_S) {
|
|
|
|
if (event->modifiers() & Qt::ControlModifier) {
|
2015-08-19 23:15:08 +00:00
|
|
|
saveFile();
|
2015-08-19 18:06:47 +00:00
|
|
|
}
|
2015-11-09 21:30:46 +00:00
|
|
|
} 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();
|
2015-08-19 18:06:47 +00:00
|
|
|
}
|
2015-11-09 21:30:46 +00:00
|
|
|
} 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();
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-12-13 21:25:46 +00:00
|
|
|
getScenery()->undo();
|
2015-08-18 16:22:16 +00:00
|
|
|
}
|
|
|
|
}
|
2015-11-09 21:30:46 +00:00
|
|
|
} else if (event->key() == Qt::Key_Y) {
|
|
|
|
if (event->modifiers() & Qt::ControlModifier) {
|
2015-12-13 21:25:46 +00:00
|
|
|
getScenery()->redo();
|
2015-08-18 16:22:16 +00:00
|
|
|
}
|
2015-08-17 20:55:30 +00:00
|
|
|
}
|
|
|
|
}
|
2014-09-09 15:56:52 +00:00
|
|
|
}
|
2015-12-10 22:41:42 +00:00
|
|
|
|
|
|
|
void MainModelerWindow::effectiveExit() {
|
|
|
|
close();
|
|
|
|
}
|