/* 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 . */ #include "mainwindow.h" #include "loader_obj.h" #include "loader_dae.h" #include #include #define EARTH_H 6356863.019 // m #define EARTH_WL 6378245.000 // m MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow() { setupUi(this); colorHalo->setColor(view->selectionHaloColor()); sel_obj = 0; treeProperties->assignObject(view); //spinSliderShine->setDecimals(2); view->setFrameShape(QFrame::NoFrame); //view->setRenderer(new RendererDeferredShading(view)); view->setRenderer(new RendererDeferredShading(view)); view->setMouseSelectionEnabled(false); view->setMouseRotateEnabled(true); view->setBackColor(Qt::lightGray); //view->setLightingMode(QGLView::PerPixel); /*MaterialEditor * o = new MaterialEditor(); o->setWindowOpacity(.666); view->addObject(o, Qt::Window);*/ /**obj = loadFrom3DSFile("data/test.3DS", 0.15); m.reflectivity = 1; m.reflection.loadPathesFromDirectory("data/e"); obj->child("sphere001")->setMaterial(m);*/ //m.shine = 40; //m.shine_strength = 1; //m.diffuse.bitmap_path = "celtic_010.jpg"; //m.bump.bitmap_path = "celtic_010n.jpg"; /*obj->child("cone")->setMaterial(m); m.diffuse.bitmap_path = "proj_plane_d.tga"; m.bump.bitmap_path = "proj_plane_n.tga"; obj->child("tor")->setMaterial(m); m.reflectivity = 1.; obj->child("sphere")->setMaterial(m);*/ //obj->child("teapot")->setRenderMode(GLObjectBase::Point); //obj->child("teapot")->setLineWidth(2.); //obj->child("cone")->setRenderMode(GLObjectBase::Line); //view->camera().setAim(obj->child("sphere001")->pos()); GLTextureManager::addSearchPath("data"); GLTextureManager::addSearchPath("data/images"); GLTextureManager::addSearchPath("data/SU-33_maps"); obj = loadFromDAEFile("data/earth.dae");//new GLPrimitiveEllipsoid(EARTH_WL / 1E+6, EARTH_WL / 1E+6, EARTH_H / 1E+6, 500, 500);//GLPrimitiveCube(); obj->setScale(0.1); //obj = new GLPrimitiveEllipsoid(100, 100, 100, 100, 100);//GLPrimitiveCube(); for (int i = 0; i < obj->childCount(); ++i) if (obj->child(i)->type() == GLObjectBase::Light) ((Light*)obj->child(i))->intensity = 0.; view->addObject(obj); //obj->child("Box001")->addChild(&(view->camera())); //view->camera().flyToDistance(30); double al = 7.; obj = new GLPrimitiveLine(QVector3D(0, 0, -al), QVector3D(0, 0, al)); obj->material().color_diffuse = Qt::darkBlue; obj->setAcceptLight(false); view->addObject(obj); obj = new GLPrimitiveLine(QVector3D(-al, 0, 0), QVector3D(al, 0, 0)); obj->material().color_diffuse = Qt::darkRed; obj->setAcceptLight(false); view->addObject(obj); obj = new GLPrimitiveLine(QVector3D(0, -al, 0), QVector3D(0, al, 0)); obj->material().color_diffuse = Qt::darkGreen; obj->setAcceptLight(false); view->addObject(obj); double lat = deg2rad*(-85.), lng = deg2rad*(15.); obj = new GLPrimitiveLine(QVector3D(), QVector3D(cos(lng)*cos(lat), sin(lng)*cos(lat), sin(lat)/*(EARTH_H/EARTH_WL)*/)*5); view->addObject(obj); view->camera().setPos(QVector3D(10, -20, 20)); view->camera().setAim(QVector3D()); view->camera().flyToDistance(100); //view->camera().setMode(Camera::AimMatrix); view->setMouseSelectionEnabled(false); view->setSelectionHaloEnabled(false); view->setHoverHaloEnabled(false); Light * l = new Light(view->camera().pos()); l->intensity = 0.5; l->setName("camera"); view->addObject(l); view->start(-1); //view->light(0)->light_type = Light::Omni; //obj = loadFrom3DSFile("34.3DS", 0.03); //view->addObject(obj); //view->camera().moveUp(5, true); /**ps = new GLParticlesSystem(QVector3D(0,0,5)); ps->setEmitterType(GLParticlesSystem::Box); ps->setBirthRate(5); ps->setSize(1.); ps->setLifeDuration(5.); ps->setInitialSpeed(.5); ps->setFadeTime(1.); ps->setSpeedDirectionJitter(1); //ps->setTextureScale(2, 2); ps->setAddVerticalFaceEnabled(true); ps->addForce(QVector3D(0,0,-0.98/20));*/ //ps->material().diffuse.bitmap_path = "expl_07.png"; //view->addObject(ps); /**box = new GLPrimitiveCube(); box->setSelectable(false); box->setRenderMode(GLObjectBase::Line); box->setLineWidth(2.); view->addObject(box); box->hide();*/ //while (view->lightsCount() >= 5) view->removeLight(view->lightsCount() - 1); //view->addObject(box); //obj = obj->clone(true); //obj->move(QVector3D(10,10,0)); //view->addObject(obj); //view->addObject(obj); //obj = obj->clone(true); //obj->move(QVector3D(10,10,0)); //view->addObject(obj); /*int h = 0, dh = 360 / view->lights().size(); foreach (Light * i, view->lights()) { i->setColor(QColor::fromHsv(h, 255, 255)); i->intensity *= 2; h += dh; }*/ startTimer(1000/60); //connect(view, SIGNAL(hoverChanged(GLObjectBase*,GLObjectBase*)), this, SLOT(hoverChanged(GLObjectBase*,GLObjectBase*))); connect(view, SIGNAL(selectionChanged(GLObjectBase*,GLObjectBase*)), this, SLOT(selectionChanged(GLObjectBase*,GLObjectBase*))); connect(view, SIGNAL(glInitializeDone()), this, SLOT(glInit())); connect(matEditor, SIGNAL(changed()), this, SLOT(materialChanged())); //view->addObject(new Light(view->camera().pos())); //show(); //comboBox->setCurrentIndex(2); } 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.; view->light(view->lightsCount() - 1)->setPos(view->camera().worldPos()); ((RendererSimple*)(view->renderer()))->mpos = view->mapFromGlobal(QCursor::pos()); //qDebug() << view->camera().angles(); //cam_mat.rotate(e->y(), 0., 1., 0.); //view->camera().setTransform(cam_mat); /*obj->child("tor")->rotateX(0.5); obj->child("tor")->rotateZ(0.1); obj->child("cone")->rotateZ(1); obj->child("teapot")->rotateY(sin(t)); obj->child("sphere")->setPosZ(fabs(sin(t)*5)-0.75);*/ t += 0.1; setWindowTitle(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::on_view_glMouseMoveEvent(QMouseEvent * e) { cam_mat.rotate(e->x(), 0., 0., 1.); cam_mat.rotate(e->y(), 0., 1., 0.); view->camera().setTransform(cam_mat); } void MainWindow::glInit() { //view->bindTexture(QImage("e/bottom.jpg")); } void MainWindow::loadFile(const QString & path) { prev_path = path; QCursor pcur = cursor(); setCursor(Qt::WaitCursor); setCursor(pcur); } 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_pushButton_3_clicked() { QList ol = view->objects(true); qDebug() << ol.size(); foreach (GLObjectBase * i, ol) { i->VBO().rebuffer(); } } void MainWindow::on_comboBox_currentIndexChanged(int val) { GLRendererBase * pr = 0; switch (val) { case 0: view->setRenderer(new RendererSimple(view), &pr); break; case 2: view->setRenderer(new RendererDeferredShading(view), &pr); break; } if (pr != 0) delete pr; } 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; } }