2014-09-09 15:56:52 +00:00
|
|
|
#include "RenderProcess.h"
|
|
|
|
|
|
|
|
#include <QSize>
|
2015-09-13 20:38:44 +00:00
|
|
|
#include <QTime>
|
2015-09-13 23:35:25 +00:00
|
|
|
#include <QQuickItem>
|
2015-07-22 17:23:22 +00:00
|
|
|
#include "MainModelerWindow.h"
|
2014-09-09 15:56:52 +00:00
|
|
|
#include "SoftwareCanvasRenderer.h"
|
|
|
|
#include "RenderPreviewProvider.h"
|
|
|
|
#include "RenderConfig.h"
|
2015-09-13 20:38:44 +00:00
|
|
|
#include "RenderProgress.h"
|
2014-09-09 15:56:52 +00:00
|
|
|
#include "Thread.h"
|
|
|
|
#include "Canvas.h"
|
|
|
|
#include "CanvasPreview.h"
|
2015-08-18 17:12:54 +00:00
|
|
|
#include "OpenGLRenderer.h"
|
2014-09-09 15:56:52 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
class RenderThread : public Thread {
|
|
|
|
public:
|
|
|
|
RenderThread(SoftwareCanvasRenderer *renderer) : renderer(renderer) {
|
|
|
|
}
|
|
|
|
virtual void run() override {
|
2014-09-09 15:56:52 +00:00
|
|
|
renderer->render();
|
|
|
|
}
|
2015-11-09 21:30:46 +00:00
|
|
|
|
|
|
|
private:
|
2014-09-09 15:56:52 +00:00
|
|
|
SoftwareCanvasRenderer *renderer;
|
|
|
|
};
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
RenderProcess::RenderProcess(MainModelerWindow *window, RenderPreviewProvider *destination)
|
|
|
|
: window(window), destination(destination) {
|
2015-07-22 22:28:27 +00:00
|
|
|
has_render = false;
|
2014-09-09 15:56:52 +00:00
|
|
|
rendering = false;
|
|
|
|
renderer = NULL;
|
|
|
|
render_thread = NULL;
|
|
|
|
|
2015-07-22 22:28:27 +00:00
|
|
|
QObject *button_quick = window->findQmlObject("tool_render_quick");
|
|
|
|
if (button_quick) {
|
|
|
|
connect(button_quick, SIGNAL(clicked()), this, SLOT(startQuickRender()));
|
|
|
|
}
|
|
|
|
|
2015-09-13 22:48:55 +00:00
|
|
|
QObject *button_medium = window->findQmlObject("tool_render_medium");
|
|
|
|
if (button_medium) {
|
|
|
|
connect(button_medium, SIGNAL(clicked()), this, SLOT(startMediumRender()));
|
|
|
|
}
|
|
|
|
|
2015-08-20 22:41:14 +00:00
|
|
|
QObject *button_final = window->findQmlObject("tool_render_final");
|
|
|
|
if (button_final) {
|
|
|
|
connect(button_final, SIGNAL(clicked()), this, SLOT(startFinalRender()));
|
|
|
|
}
|
|
|
|
|
|
|
|
QObject *button_show = window->findQmlObject("tool_render_show");
|
|
|
|
if (button_show) {
|
|
|
|
button_show->setProperty("enabled", false);
|
|
|
|
connect(button_show, SIGNAL(clicked()), this, SLOT(showPreviousRender()));
|
|
|
|
}
|
|
|
|
|
2015-09-13 23:35:25 +00:00
|
|
|
QObject *button_cancel = window->findQmlObject("render_cancel");
|
|
|
|
if (button_cancel) {
|
|
|
|
connect(button_cancel, SIGNAL(clicked()), this, SLOT(stopRender()));
|
|
|
|
}
|
|
|
|
|
2015-09-14 23:26:05 +00:00
|
|
|
QObject *dialog_save = window->findQmlObject("render_save_dialog");
|
|
|
|
if (dialog_save) {
|
|
|
|
connect(dialog_save, SIGNAL(saveRequired(QString)), this, SLOT(savePicture(QString)));
|
|
|
|
}
|
|
|
|
|
2014-09-09 15:56:52 +00:00
|
|
|
startTimer(100);
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
RenderProcess::~RenderProcess() {
|
|
|
|
if (rendering) {
|
2014-09-09 15:56:52 +00:00
|
|
|
renderer->interrupt();
|
|
|
|
}
|
|
|
|
|
|
|
|
rendering = false;
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (render_thread) {
|
2014-09-09 15:56:52 +00:00
|
|
|
render_thread->join();
|
|
|
|
delete render_thread;
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (renderer) {
|
2014-09-09 15:56:52 +00:00
|
|
|
delete renderer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProcess::startRender(Scenery *scenery, const RenderConfig &config) {
|
|
|
|
if (rendering) {
|
2014-09-09 15:56:52 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-08-20 22:41:14 +00:00
|
|
|
// Enable "show last render" button
|
2015-09-14 23:26:05 +00:00
|
|
|
window->setQmlProperty("tool_render_show", "enabled", true);
|
|
|
|
window->setQmlProperty("render_dialog", "rendering", true);
|
2015-08-20 22:41:14 +00:00
|
|
|
|
2015-07-22 22:28:27 +00:00
|
|
|
has_render = true;
|
2014-09-09 15:56:52 +00:00
|
|
|
rendering = true;
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (renderer) {
|
2014-09-09 15:56:52 +00:00
|
|
|
delete renderer;
|
|
|
|
}
|
|
|
|
|
2015-08-18 20:29:18 +00:00
|
|
|
renderer = new SoftwareCanvasRenderer(scenery);
|
2014-09-09 15:56:52 +00:00
|
|
|
renderer->setConfig(config);
|
|
|
|
|
|
|
|
destination->setCanvas(renderer->getCanvas());
|
|
|
|
|
2015-07-22 22:28:27 +00:00
|
|
|
// Resize preview
|
|
|
|
QSize preview_size = getPreviewSize();
|
2015-09-13 23:35:25 +00:00
|
|
|
QObject *image = window->findQmlObject("render_preview_image");
|
2015-07-22 22:28:27 +00:00
|
|
|
if (image) {
|
|
|
|
image->setProperty("width", preview_size.width());
|
|
|
|
image->setProperty("height", preview_size.height());
|
|
|
|
}
|
|
|
|
|
2015-08-18 17:12:54 +00:00
|
|
|
// Pause OpenGL renderer
|
|
|
|
window->getRenderer()->pause();
|
|
|
|
|
2015-07-22 22:28:27 +00:00
|
|
|
// Start render thread
|
2014-09-09 15:56:52 +00:00
|
|
|
render_thread = new RenderThread(renderer);
|
|
|
|
render_thread->start();
|
2015-07-22 22:28:27 +00:00
|
|
|
|
|
|
|
// Show render dialog
|
|
|
|
window->setState("Render Dialog");
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProcess::startQuickRender() {
|
2015-09-13 22:48:55 +00:00
|
|
|
startRender(window->getScenery(), RenderConfig(480, 270, 1, 3));
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProcess::startMediumRender() {
|
2015-09-13 22:48:55 +00:00
|
|
|
startRender(window->getScenery(), RenderConfig(800, 450, 1, 5));
|
2015-07-22 22:28:27 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProcess::startFinalRender() {
|
2015-07-22 22:28:27 +00:00
|
|
|
startRender(window->getScenery(), RenderConfig(1920, 1080, 4, 8));
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProcess::showPreviousRender() {
|
|
|
|
if (not rendering and has_render) {
|
2015-09-13 23:35:25 +00:00
|
|
|
destination->setCanvas(renderer->getCanvas());
|
|
|
|
destination->releaseCanvas();
|
|
|
|
|
2015-07-22 22:28:27 +00:00
|
|
|
window->setState("Render Dialog");
|
|
|
|
}
|
2014-09-09 15:56:52 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProcess::stopRender() {
|
|
|
|
if (rendering) {
|
2014-09-09 15:56:52 +00:00
|
|
|
renderer->interrupt();
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-09-13 23:35:25 +00:00
|
|
|
destination->hide();
|
2015-12-29 23:20:20 +00:00
|
|
|
window->setState(window->rootObject()->property("previous_state").toString().toStdString());
|
2015-09-13 23:35:25 +00:00
|
|
|
}
|
2014-09-09 15:56:52 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProcess::savePicture(QString path) {
|
2015-09-14 23:26:05 +00:00
|
|
|
renderer->saveToDisk(path.replace("file://", "").toStdString());
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
const QSize RenderProcess::getPreviewSize() {
|
|
|
|
if (renderer) {
|
2014-09-09 15:56:52 +00:00
|
|
|
return QSize(renderer->getCanvas()->getPreview()->getWidth(), renderer->getCanvas()->getPreview()->getHeight());
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2014-09-09 15:56:52 +00:00
|
|
|
return QSize(10, 10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProcess::timerEvent(QTimerEvent *) {
|
|
|
|
if (rendering and renderer->isFinished()) {
|
2014-09-09 15:56:52 +00:00
|
|
|
destination->releaseCanvas();
|
|
|
|
rendering = false;
|
|
|
|
|
|
|
|
render_thread->join();
|
|
|
|
delete render_thread;
|
|
|
|
render_thread = NULL;
|
2015-08-18 17:12:54 +00:00
|
|
|
|
2015-09-14 23:26:05 +00:00
|
|
|
window->setQmlProperty("render_dialog", "rendering", false);
|
2015-08-18 17:12:54 +00:00
|
|
|
window->getRenderer()->resume();
|
2014-09-09 15:56:52 +00:00
|
|
|
}
|
2015-07-22 17:23:22 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (renderer) {
|
2015-09-13 20:38:44 +00:00
|
|
|
QTime t = QTime(0, 0, 0).addMSecs(renderer->getProgressHelper()->getDuration());
|
|
|
|
QString info = QString("Elapsed time: ") + t.toString("hh:mm:ss");
|
2015-11-09 21:30:46 +00:00
|
|
|
if (rendering) {
|
2015-09-13 20:38:44 +00:00
|
|
|
unsigned long remaining = renderer->getProgressHelper()->estimateRemainingTime();
|
2015-11-09 21:30:46 +00:00
|
|
|
if (remaining > 0) {
|
2015-11-02 22:39:34 +00:00
|
|
|
t = QTime(0, 0, 0).addMSecs(999 + remaining);
|
2015-09-13 20:38:44 +00:00
|
|
|
info += " - Remaining: ~" + t.toString("hh:mm:ss");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
window->setQmlProperty("render_timing", "text", info);
|
|
|
|
|
2015-07-22 22:28:27 +00:00
|
|
|
window->setQmlProperty("render_progress", "value", renderer->getProgress());
|
2015-07-22 17:23:22 +00:00
|
|
|
}
|
2014-09-09 15:56:52 +00:00
|
|
|
}
|