//----------------------------------------------------------------------------- // u p d a t e R e n d e r M o d e //----------------------------------------------------------------------------- void updateRenderMode(ISceneNode* node) { if(!node) return; if(node->getMaterialCount()) { for(u32 idx=0;idx<node->getMaterialCount();idx++) { SMaterial& mat = node->getMaterial(idx); switch(m_renderMode) { case 0: mat.setFlag(EMF_WIREFRAME,false); mat.setFlag(EMF_POINTCLOUD,false); break; case 1: mat.setFlag(EMF_WIREFRAME,true); mat.setFlag(EMF_POINTCLOUD,false); break; case 2: mat.setFlag(EMF_WIREFRAME,false); mat.setFlag(EMF_POINTCLOUD,true); break; } } } list<ISceneNode*> children = node->getChildren(); list<ISceneNode*>::Iterator itr = children.begin(); while(itr != children.end()) { ISceneNode* child = *itr; updateRenderMode(child); itr++; } }
bool OnEvent(const SEvent& event) { if (event.EventType == irr::EET_KEY_INPUT_EVENT) { printf("Key: %d, down: %d\n", event.KeyInput.Key, event.KeyInput.PressedDown); switch(event.KeyInput.Key) { case KEY_SPACE: { if(event.KeyInput.PressedDown) _jump(); } return true; case KEY_F1: { if(event.KeyInput.PressedDown) { m_helpPanel->setVisible(!m_helpPanel->isVisible()); } return true; } // adjust movement speed #ifdef USE_IRR case KEY_LSHIFT: case KEY_SHIFT: { if(!m_fpsAnimator) break; if(event.KeyInput.PressedDown) { m_fpsAnimator->setMoveSpeed(m_moveSpeed * 3.f); } else { m_fpsAnimator->setMoveSpeed(m_moveSpeed); } return true; } break; #endif // cycle render mode (normal/wireframe/pointcloud) case KEY_F3: { if(event.KeyInput.PressedDown) { ++m_renderMode; if(m_renderMode > 2) m_renderMode = 0; updateRenderMode(m_sceneManager->getRootSceneNode()); return true; } } break; // toggle physics debug case KEY_F4: if(!event.KeyInput.PressedDown) { m_displayPhysicsDebug = m_displayPhysicsDebug ? false : true; _enablePhysicsDebug(m_displayPhysicsDebug); m_debugNode->setVisible(m_displayPhysicsDebug); m_debugPanel->setVisible(m_displayPhysicsDebug); return true; } break; case KEY_F5: if(event.KeyInput.PressedDown) { _warp(m_startPos); return true; } break; // screen shot case KEY_SNAPSHOT: { if(!event.KeyInput.PressedDown) // key up { IImage* image = m_videoDriver->createScreenShot(); char buf[32]; sprintf(buf,"cap%.2d.png",m_capNumber++); m_videoDriver->writeImageToFile(image,buf); image->drop(); } break; } // quit the app case KEY_ESCAPE: if(!event.KeyInput.PressedDown) // key up m_running = false; return true; default: break; } } return _handleEvent(event); }
DeferredShading::DeferredShading(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags) { ui.setupUi(this); // Layouts QHBoxLayout *mainLayout = new QHBoxLayout; QVBoxLayout *secondLayout = new QVBoxLayout; QHBoxLayout *thirdLayout = new QHBoxLayout; // Menus // File QMenu *fileMenu = menuBar()->addMenu(tr("&File")); QAction *loadModelAct = new QAction(tr("&Load Model"), this); fileMenu->addAction(loadModelAct); // Render QMenu *renderMenu = menuBar()->addMenu(tr("&Render")); QAction *forwardRenderAct = new QAction(tr("&Forward"), this); QAction *forwardBlendRenderAct = new QAction(tr("&Forward(Blend)"), this); QAction *deferredRenderAct = new QAction(tr("&Deferred"), this); QAction *forwardPlusRenderAct = new QAction(tr("&Forward+"), this); QAction *forwardPlusCudaRenderAct = new QAction(tr("&Forward+(CUDA)"), this); QAction *positionRenderAct = new QAction(tr("&Position"), this); QAction *diffuseRenderAct = new QAction(tr("&Diffuse"), this); QAction *normalRenderAct = new QAction(tr("&Normal"), this); QAction *allRenderAct = new QAction(tr("&All"), this); QAction *depthRenderAct = new QAction(tr("&Depth"), this); QAction *gridRenderAct = new QAction(tr("&Lighting Grid"), this); renderMenu->addAction(forwardRenderAct); renderMenu->addAction(forwardBlendRenderAct); renderMenu->addAction(deferredRenderAct); renderMenu->addAction(forwardPlusRenderAct); renderMenu->addAction(forwardPlusCudaRenderAct); renderMenu->addSeparator(); renderMenu->addAction(positionRenderAct); renderMenu->addAction(diffuseRenderAct); renderMenu->addAction(normalRenderAct); renderMenu->addAction(allRenderAct); renderMenu->addSeparator(); renderMenu->addAction(depthRenderAct); renderMenu->addAction(gridRenderAct); // Validators QDoubleValidator *_doubleValidator = new QDoubleValidator(0.01,10.0,2); _doubleValidator->setNotation(QDoubleValidator::StandardNotation); QDoubleValidator *doubleValidator = new QDoubleValidator(0.01,10000.0,2); doubleValidator->setNotation(QDoubleValidator::StandardNotation); QIntValidator *intValidator = new QIntValidator(0,N_MAX_LIGHTS); QIntValidator *intValidator2 = new QIntValidator(0,4096); // Separators QFrame *line = new QFrame(); line->setFrameShape(QFrame::VLine); QFrame *line2 = new QFrame(); line2->setFrameShape(QFrame::VLine); QFrame *line3 = new QFrame(); line3->setFrameShape(QFrame::VLine); QFrame *line4 = new QFrame(); line4->setFrameShape(QFrame::VLine); // Camera Sensitivity QLabel *sensibilityLabel = new QLabel(); sensibilityLabel->setText("Sensitivity: "); QLineEdit *cameraSensitivityIn = new QLineEdit(); cameraSensitivityIn->setValidator(doubleValidator); cameraSensitivityIn->setText("0.1"); // Camera Speed QLabel *speedLabel = new QLabel(); speedLabel->setText("Speed: "); QLineEdit *cameraSpeedIn = new QLineEdit(); cameraSpeedIn->setValidator(doubleValidator); cameraSpeedIn->setText("1.0"); // Threshold (deferred only) QLabel *thresholdLabel = new QLabel(); thresholdLabel->setText("Threshold: "); QLineEdit *thresholdIn = new QLineEdit(); thresholdIn->setValidator(intValidator2); thresholdIn->setText("256"); // Billboards //QLabel *billboardsLabel = new QLabel(); //billboardsLabel->setText("Billboards: "); QCheckBox *billboardsCheckBox = new QCheckBox("Billboards:"); billboardsCheckBox->setLayoutDirection(Qt::RightToLeft); billboardsCheckBox->setChecked(false); // Light bounding box scale QLabel *lightBBScaleLabel = new QLabel(); lightBBScaleLabel->setText(" Bb scale: "); QLineEdit *lighBBScaleIn = new QLineEdit(); lighBBScaleIn->setValidator(doubleValidator); lighBBScaleIn->setText("1.0"); // Attenuation QLabel *attenuationLabel = new QLabel(); attenuationLabel->setText("Attenuation: "); QLineEdit *constantAttIn = new QLineEdit(); constantAttIn->setValidator(doubleValidator); constantAttIn->setText("1.0"); QLineEdit *linearAttIn = new QLineEdit(); linearAttIn->setValidator(doubleValidator); linearAttIn->setText("60.0"); QLineEdit *expAttIn = new QLineEdit(); expAttIn->setValidator(doubleValidator); expAttIn->setText("0.0"); // Light intensity QLabel *lightIntesityLabel = new QLabel(); lightIntesityLabel->setText("Intensity: "); QLineEdit *lighIntensityIn = new QLineEdit(); lighIntensityIn->setValidator(doubleValidator); lighIntensityIn->setText("1.0"); // Number of lights QLabel *nLightsLabel = new QLabel(); nLightsLabel->setText("N: "); std::stringstream sstm; sstm << INITIAL_LIGHTS; std::string s = sstm.str(); // QString::fromStdString desnt work on release #ifdef NDEBUG nLights = "20"; #else nLights = QString::fromStdString(s); #endif QLineEdit *nLightsIn = new QLineEdit(); nLightsIn->setValidator(intValidator); nLightsIn->setText(nLights); QPushButton *genLightsButton = new QPushButton("Gen. Lights"); // Render Mode QLabel *renderModeLabel = new QLabel(); renderModeLabel->setText("Forward"); renderModeLabel->setAlignment(Qt::AlignRight); // FPS QLabel *fpsLabelNum = new QLabel(); fpsLabelNum->setNum(0); fpsLabelNum->setAlignment(Qt::AlignRight); fpsLabelNum->setMaximumHeight(20); QLabel *fpsLabel = new QLabel(); fpsLabel->setText("FPS: "); fpsLabel->setAlignment(Qt::AlignRight); // GLWidget GLWidget *glWidget = new GLWidget; // Connect signals-slots connect(loadModelAct,SIGNAL(triggered()), this, SLOT(loadModelDia())); connect(this,SIGNAL(modelPathChange(std::string)), glWidget, SLOT(loadModel(std::string))); connect(forwardRenderAct,SIGNAL(triggered()), glWidget, SLOT(setForwardRenderMode())); connect(forwardBlendRenderAct,SIGNAL(triggered()), glWidget, SLOT(setForwardBlendRenderMode())); connect(forwardPlusRenderAct,SIGNAL(triggered()), glWidget, SLOT(setForwardPlusRenderMode())); connect(forwardPlusCudaRenderAct,SIGNAL(triggered()), glWidget, SLOT(setForwardPlusCudaRenderMode())); connect(deferredRenderAct,SIGNAL(triggered()), glWidget, SLOT(setDeferredRenderMode())); connect(positionRenderAct,SIGNAL(triggered()), glWidget, SLOT(setPositionRenderMode())); connect(diffuseRenderAct,SIGNAL(triggered()), glWidget, SLOT(setDiffuseRenderMode())); connect(normalRenderAct,SIGNAL(triggered()), glWidget, SLOT(setNormalRenderMode())); connect(allRenderAct,SIGNAL(triggered()), glWidget, SLOT(setAllRenderMode())); connect(depthRenderAct,SIGNAL(triggered()), glWidget, SLOT(setDepthRenderMode())); connect(gridRenderAct,SIGNAL(triggered()), glWidget, SLOT(setForwardDebugRenderMode())); connect(this,SIGNAL(keyPressed(int)), glWidget, SLOT(addKey(int))); connect(this,SIGNAL(keyReleased(int)), glWidget, SLOT(removeKey(int))); connect(cameraSensitivityIn,SIGNAL(textChanged(QString)),glWidget,SLOT(modifyCameraSensitivity(QString))); connect(cameraSpeedIn,SIGNAL(textChanged(QString)),glWidget,SLOT(modifyCameraSpeed(QString))); connect(glWidget, SIGNAL(updateFPSSignal(int)), fpsLabelNum, SLOT(setNum(int))); connect(nLightsIn,SIGNAL(textChanged(QString)),this,SLOT(modifyNLights(QString))); connect(genLightsButton, SIGNAL(clicked()), this, SLOT(genLights())); connect(this, SIGNAL(glGenLights(int)), glWidget, SLOT(genLightning(int))); connect(billboardsCheckBox, SIGNAL(stateChanged(int)), glWidget, SLOT(enableBillboards(int))); connect(lighBBScaleIn, SIGNAL(textChanged(QString)), glWidget, SLOT(modifyBoundingBoxScale(QString))); connect(lighIntensityIn, SIGNAL(textChanged(QString)), glWidget, SLOT(modifyMaxIntensity(QString))); connect(glWidget, SIGNAL(updateLightIntensityIn(QString)), lighIntensityIn, SLOT(setText(QString))); connect(glWidget, SIGNAL(updateRenderMode(QString)), renderModeLabel, SLOT(setText(QString))); connect(thresholdIn, SIGNAL(textChanged(QString)), glWidget, SLOT(modifyThreshold(QString))); connect(constantAttIn, SIGNAL(textChanged(QString)), glWidget, SLOT(modifyConstantAttenuation(QString))); connect(linearAttIn, SIGNAL(textChanged(QString)), glWidget, SLOT(modifyLinearAttenuation(QString))); connect(expAttIn, SIGNAL(textChanged(QString)), glWidget, SLOT(modifyExpAttenuation(QString))); // Set layout content mainLayout->addWidget(glWidget); thirdLayout->addWidget(sensibilityLabel); thirdLayout->addWidget(cameraSensitivityIn); thirdLayout->addWidget(speedLabel); thirdLayout->addWidget(cameraSpeedIn); thirdLayout->addWidget(line); thirdLayout->addWidget(thresholdLabel); thirdLayout->addWidget(thresholdIn); thirdLayout->addWidget(line2); thirdLayout->addWidget(billboardsCheckBox); thirdLayout->addWidget(lightBBScaleLabel); thirdLayout->addWidget(lighBBScaleIn); thirdLayout->addWidget(attenuationLabel); thirdLayout->addWidget(constantAttIn); thirdLayout->addWidget(linearAttIn); thirdLayout->addWidget(expAttIn); thirdLayout->addWidget(lightIntesityLabel); thirdLayout->addWidget(lighIntensityIn); thirdLayout->addWidget(nLightsLabel); thirdLayout->addWidget(nLightsIn); thirdLayout->addWidget(genLightsButton); thirdLayout->addWidget(line3); thirdLayout->addWidget(renderModeLabel); thirdLayout->addWidget(line4); thirdLayout->addWidget(fpsLabel); thirdLayout->addWidget(fpsLabelNum); secondLayout->addLayout(thirdLayout); secondLayout->addLayout(mainLayout); cameraSpeedIn->setFocus(); setWindowTitle("Deferred Shading"); ui.centralWidget->setLayout(secondLayout); setMinimumSize(1024,576); }