This repository has been archived on 2020-09-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
libs/qglview/mainwindow.cpp

310 lines
10 KiB
C++

/*
Stanley Designer
Copyright (C) 2012 Ivan Pelipenko peri4ko@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "mainwindow.h"
#include "loader_qgl.h"
#include "loader_ase.h"
#include "loader_3ds.h"
#include "loader_obj.h"
#include "loader_dae.h"
#include <QGraphicsRectItem>
#include <QImageReader>
#include <QMessageBox>
MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow() {
setupUi(this);
icon_geo = QIcon(":/icons/type-geo.png");
icon_camera = QIcon(":/icons/type-camera.png");
icon_light = QIcon(":/icons/type-light.png");
sel_obj = 0;
view->camera().setAim(QVector3D());
view->camera().setPos(QVector3D(2, 2, 2));
view->setFrameShape(QFrame::NoFrame);
view->setRenderer(new RendererDeferredShading(view));
view->setMouseRotateEnabled(true);
view->setMouseSelectionEnabled(true);
view->setSelectionHaloEnabled(true);
view->setHoverHaloEnabled(true);
view->setHoverHaloFillAlpha(0.);
view->setSelectionHaloFillAlpha(0.);
view->setBackColor(Qt::lightGray);
view->setDepthStart(1.);
view->setDepthEnd(10000.);
spinFOV->setValue(view->FOV());
spinDepthStart->setValue(view->depthStart());
spinDepthEnd->setValue(view->depthEnd());
groupHoverHalo->setChecked(view->isHoverHaloEnabled());
groupSelectionHalo->setChecked(view->isSelectionHaloEnabled());
spinHoverHaloFill->setValue(view->hoverHaloFillAlpha());
spinSelectionHaloFill->setValue(view->selectionHaloFillAlpha());
colorHoverHalo->setColor(view->hoverHaloColor());
colorSelectionHalo->setColor(view->selectionHaloColor());
checkFXAA->setChecked(view->isFeatureEnabled(QGLView::qglFXAA));
checkMSAA->setChecked(view->isFeatureEnabled(QGLView::qglMSAA));
colorBack->setColor(view->backColor());
colorAmbient->setColor(view->ambientColor());
checkCameraOrbit->setChecked(view->isCameraOrbit());
groupShadows->setChecked(view->isFeatureEnabled(QGLView::qglShadowsEnabled));
groupEyeAccomodation->setChecked(view->isFeatureEnabled(QGLView::qglEyeAccomodationEnabled));
groupBloom->setChecked(view->isFeatureEnabled(QGLView::qglBloomEnabled));
groupMotionBlur->setChecked(view->isFeatureEnabled(QGLView::qglMotionBlurEnabled));
groupReflections->setChecked(view->isFeatureEnabled(QGLView::qglDynamicReflectionsEnabled));
checkSoftShadows->setChecked(view->isFeatureEnabled(QGLView::qglShadowsSoftEnabled));
spinAccom->setValue(view->isFeatureEnabled(QGLView::qglEyeAccomodationTime));
spinAccomMS->setValue(view->isFeatureEnabled(QGLView::qglEyeAccomodationMaxSpeed));
spinCubemapSize->setValue(view->isFeatureEnabled(QGLView::qglDynamicReflectionsMapSize));
spinShadowmapSize->setValue(view->isFeatureEnabled(QGLView::qglShadowsMapSize));
spinMotionBlurFactor->setValue(view->isFeatureEnabled(QGLView::qglMotionBlurFactor));
spinMotionBlurSteps->setValue(view->isFeatureEnabled(QGLView::qglMotionBlurSteps));
spinBloomFactor->setValue(view->isFeatureEnabled(QGLView::qglBloomFactor));
spinBloomRadius->setValue(view->isFeatureEnabled(QGLView::qglBloomRadius));
spinBloomThreshold->setValue(view->isFeatureEnabled(QGLView::qglBloomThreshold));
axis = new GLObjectBase();
GLObjectBase * obj;
double al = 1.;
obj = new GLPrimitiveLine(QVector3D(0, 0, -al), QVector3D(0, 0, al));
obj->material().color_diffuse = Qt::darkBlue; obj->setAcceptLight(false);
axis->addChild(obj);
obj = new GLPrimitiveLine(QVector3D(-al, 0, 0), QVector3D(al, 0, 0));
obj->material().color_diffuse = Qt::darkRed; obj->setAcceptLight(false);
axis->addChild(obj);
obj = new GLPrimitiveLine(QVector3D(0, -al, 0), QVector3D(0, al, 0));
obj->material().color_diffuse = Qt::darkGreen; obj->setAcceptLight(false);
axis->addChild(obj);
view->addObject(axis);
cam_light = new Light(view->camera().pos());
cam_light->intensity = 0.5;
cam_light->setName("camera");
view->camera().addChild(cam_light);
view->start(-1);
startTimer(1000/60);
connect(view, SIGNAL(selectionChanged(GLObjectBase*,GLObjectBase*)), this, SLOT(selectionChanged(GLObjectBase*,GLObjectBase*)));
connect(matEditor, SIGNAL(changed()), this, SLOT(materialChanged()));
}
MainWindow::~MainWindow() {
//delete ps;
}
void MainWindow::changeEvent(QEvent * e) {
QMainWindow::changeEvent(e);
if (e->type() == QEvent::LanguageChange) {
retranslateUi(this);
return;
}
}
void MainWindow::timerEvent(QTimerEvent * ) {
//static double t = 0.;
cam_light->setVisible(checkCameraLight->isChecked());
//((RendererSimple*)(view->renderer()))->mpos = view->mapFromGlobal(QCursor::pos());
statusBar()->showMessage(QString("FPS: %1").arg(QString::number(view->currentFPS(), 'f', 2)));
}
void MainWindow::on_view_glKeyPressEvent(QKeyEvent * e) {
if (e->key() != Qt::Key_F11) return;
if (view->windowState().testFlag(Qt::WindowFullScreen)) {
centralwidget->layout()->addWidget(view);
} else {
view->setParent(0);
view->showFullScreen();
}
}
void MainWindow::loadFile(const QString & path) {
prev_path = path;
importFile(path);
}
void MainWindow::importFile(const QString & path) {
QApplication::setOverrideCursor(Qt::WaitCursor);
QFileInfo fi(path);
GLObjectBase * o = 0;
if (fi.completeSuffix().toLower() == "qgl") o = loadFromQGLFile(path);
if (fi.completeSuffix().toLower() == "ase") o = loadFromASEFile(path);
if (fi.completeSuffix().toLower() == "3ds") o = loadFrom3DSFile(path);
if (fi.completeSuffix().toLower() == "obj") o = loadFromOBJFile(path);
if (fi.completeSuffix().toLower() == "dae") o = loadFromDAEFile(path);
QApplication::restoreOverrideCursor();
if (!o) {
QMessageBox::critical(this, "Import", "Can`t load " + path + "!");
return;
}
o->setName(fi.baseName());
view->addObject(o);
objectsTreeChanged();
}
void MainWindow::makeObjetTree(const GLObjectBase * o, QTreeWidgetItem * ti) {
if (o == axis) return;
for (int i = 0; i < o->childCount(); ++i) {
const GLObjectBase * co = o->child(i);
QTreeWidgetItem * ci = new QTreeWidgetItem(ti);
ci->setText(0, co->name());
ci->setData(0, Qt::UserRole, quintptr(co));
switch (co->type()) {
case GLObjectBase::glMesh: ci->setIcon(0, icon_geo); break;
case GLObjectBase::glLight: ci->setIcon(0, icon_light); break;
case GLObjectBase::glCamera: ci->setIcon(0, icon_camera); break;
default: break;
}
makeObjetTree(co, ci);
}
}
void MainWindow::selectionChanged(GLObjectBase * cur, GLObjectBase * prev) {
sel_obj = cur;
//qDebug() << "selected" << (cur != 0 ? cur->name() : "0");
labelName->setText(cur != 0 ? cur->name() : "");
/**if (cur == 0) box->hide();
else {
box->setScale(cur->boundingBox().size());
box->setPos(cur->boundingBox().pos());
Box3D b = cur->boundingBox().movedTo(-cur->boundingBox().center());
b.z = -b.z - b.height;
ps->setEmitterRect(b);
cur->addChild(box);
box->show();
}*/
objectEditor->setObject(sel_obj);
if (sel_obj == 0) return;
matEditor->setMaterial(sel_obj->material());
}
void MainWindow::materialChanged() {
if (sel_obj == 0) return;
sel_obj->setMaterial(matEditor->material());
}
void MainWindow::on_comboRenderer_currentIndexChanged(int val) {
GLRendererBase * pr = 0;
switch (val) {
case 0: view->setRenderer(new RendererSimple(view), &pr); break;
case 1: view->setRenderer(new RendererDeferredShading(view), &pr); break;
}
if (pr != 0) delete pr;
}
void MainWindow::on_actionReset_triggered() {
view->removeObject(axis, false);
view->clearObjects(true);
view->addObject(axis);
}
void MainWindow::on_actionImport_triggered() {
QStringList fl = QFileDialog::getOpenFileNames(this, "Select files", prev_path, "Supported types(*.qgl *.ase *.3ds *.obj *.dae);;"
"QGLView(*.qgl);;"
"Ascii Scene Export(*.ase);;"
"3D Studio(*.3ds);;"
"Wavefront OBJ(*.obj);;"
"Collada(*.dae)");
if (fl.isEmpty()) return;
prev_path = fl.back();
foreach (QString f, fl)
importFile(f);
}
void MainWindow::on_actionSave_triggered() {
QString f = QFileDialog::getSaveFileName(this, "Select file", prev_path, "QGLView(*.qgl)");
if (f.isEmpty()) return;
if (f.right(4).toLower() != ".qgl")
f += ".qgl";
prev_path = f;
view->removeObject(axis);
saveToQGLFile(f, &(view->rootObject()));
view->addObject(axis);
}
void MainWindow::on_actionOpen_triggered() {
QString f = QFileDialog::getOpenFileName(this, "Select file", prev_path, "Supported types(*.qgl *.ase *.3ds *.obj *.dae);;"
"QGLView(*.qgl);;"
"Ascii Scene Export(*.ase);;"
"3D Studio(*.3ds);;"
"Wavefront OBJ(*.obj);;"
"Collada(*.dae)");
if (f.isEmpty()) return;
prev_path = f;
importFile(f);
}
void MainWindow::on_view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m) {
//qDebug() << k;
double spd = 0.2;
if (m.testFlag(Qt::ShiftModifier))
spd = 0.5;
switch (k) {
case Qt::Key_W: view->camera().moveForward(spd); break;
case Qt::Key_S: view->camera().moveBackward(spd); break;
case Qt::Key_A: view->camera().moveLeft(spd); break;
case Qt::Key_D: view->camera().moveRight(spd); break;
default: break;
}
}
void MainWindow::on_treeObjects_itemClicked(QTreeWidgetItem * ti, int col) {
((GLObjectBase*)(ti->data(0, Qt::UserRole).toULongLong()))->select();
}
void MainWindow::objectsTreeChanged() {
treeObjects->clear();
makeObjetTree(&(view->rootObject()), treeObjects->invisibleRootItem());
}
void MainWindow::on_pushButton_clicked() {
//view->removeLight(view->lightsCount() - 1);
//setWindowTitle(QString::number(view->lightsCount()));
QVector3D wp = view->light(0)->worldPos();
view->camera().setPos(wp);
view->camera().setAim(wp + (view->light(0)->worldTransform() * QVector4D(view->light(0)->direction)).toVector3D()*100);
}
void MainWindow::on_pushButton_3_clicked() {
QList<GLObjectBase * > ol = view->objects(true);
qDebug() << ol.size();
foreach (GLObjectBase * i, ol) {
i->VBO().rebuffer();
}
}