From 7802cec13614045dcf34077fc0a80c6e944f87c3 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Thu, 22 Dec 2005 20:01:23 +0000 Subject: [PATCH] - Added support for more than one shader - Some methods renamed - Adjusted some accelerators keys - Fixed up minor visual issues --- src/meshlab/glarea.cpp | 75 +++++++++++++++--------------- src/meshlab/glarea.h | 23 ++++++--- src/meshlab/mainwindow.h | 7 +++ src/meshlab/mainwindow_Init.cpp | 16 +++++-- src/meshlab/mainwindow_RunTime.cpp | 39 +++++++++++----- 5 files changed, 102 insertions(+), 58 deletions(-) diff --git a/src/meshlab/glarea.cpp b/src/meshlab/glarea.cpp index b7667f94d..892a8fbd4 100644 --- a/src/meshlab/glarea.cpp +++ b/src/meshlab/glarea.cpp @@ -24,6 +24,12 @@ History $Log$ +Revision 1.59 2005/12/22 20:01:23 glvertex +- Added support for more than one shader +- Some methods renamed +- Adjusted some accelerators keys +- Fixed up minor visual issues + Revision 1.58 2005/12/22 10:33:37 vannini Removed old code On SaveSnapshotDialog, "Save" button is default @@ -242,7 +248,7 @@ using namespace vcg; GLArea::GLArea(QWidget *parent) : QGLWidget(parent) { - iRender=0; //MeshRender support + iRenderer=0; //Shader support iDecoratorsList=0; currentTime=0; lastTime=0; @@ -254,6 +260,7 @@ GLArea::GLArea(QWidget *parent) takeSnapTile=false; infoAreaVisible = false; trackBallVisible = true; + currentSharder = NULL; time.start(); } @@ -262,12 +269,12 @@ GLArea::GLArea(QWidget *parent) void GLArea::displayModelInfo() { QString strMessage; - QString strVertex="Vertex "+QString("").setNum(mm->cm.vert.size(),10); - QString strTriangle="Triangle "+QString("").setNum(mm->cm.face.size(),10); + QString strVertex="Vertices "+QString("").setNum(mm->cm.vert.size(),10); + QString strTriangle="Faces "+QString("").setNum(mm->cm.face.size(),10); //strVertex+=strVertex.setNum(mm->cm.vert.size(),10); //strTriangle.setNum(mm->cm.face.size(),10); - renderText(currentWidth-currentWidth*0.15,currentHeight-25,strVertex); - renderText(currentWidth-currentWidth*0.15,currentHeight-45,strTriangle); + renderText(currentWidth-currentWidth*0.15,currentHeight-45,strVertex); + renderText(currentWidth-currentWidth*0.15,currentHeight-30,strTriangle); } @@ -284,16 +291,12 @@ void GLArea::initializeGL() { glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); - //glEnable(GL_CULL_FACE); glEnable(GL_NORMALIZE); GLfloat pfront[] = {0,0,1,0}; glLightfv(GL_LIGHT0,GL_POSITION,pfront); glEnable(GL_LIGHT0); - - /*glLightfv(GL_LIGHT1,GL_POSITION,pback); - glLightfv(GL_LIGHT1,GL_DIFFUSE,l_diffuseFancy);*/ glEnable(GL_LIGHTING); } @@ -397,7 +400,6 @@ void GLArea::paintGL() GLint old_matrixMode; lastTime=time.elapsed(); initTexture(); - glDisable(GL_TEXTURE_2D); // FIX FIX FIX to move in trimesh.h ? glClearColor(1.0,1.0,1.0,0.0); //vannini: alpha was 1.0 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); @@ -426,8 +428,6 @@ void GLArea::paintGL() trackball.Apply(trackBallVisible && !takeSnapTile); glColor3f(1.f,1.f,1.f); - //Box3f bb(Point3f(-.5,-.5,-.5),Point3f(.5,.5,.5)); - //glBoxWire(bb); float d=2.0f/mm->cm.bbox.Diag(); glScale(d); glTranslate(-mm->cm.bbox.Center()); @@ -452,13 +452,15 @@ void GLArea::paintGL() glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); } - if(iRender) { - iRender->Render(new QAction("Toon Shader", this), *mm, rm, this); + if(iRenderer && currentSharder) { + //iRender->Render(new QAction("Toon Shader", this), *mm, rm, this); + iRenderer->Render(currentSharder, *mm, rm, this); + } mm->Render(rm.drawMode,rm.colorMode,rm.textureMode); - if(iRender) { + if(iRenderer) { glUseProgramObjectARB(0); } @@ -508,22 +510,19 @@ void GLArea::paintGL() glColor4f(1,1,1,1); if(logVisible) log.glDraw(this,0,3); - // More info to add..... + + displayModelInfo(); currentTime=time.elapsed(); deltaTime=currentTime-lastTime; updateFps(); if ((cfps>0) && (cfps<200)) renderFps(); - displayModelInfo(); - glPopAttrib(); glPopMatrix(); } - // ============================== - } void GLArea::resizeGL(int _width, int _height) @@ -608,23 +607,25 @@ void GLArea::setColorMode(vcg::GLW::ColorMode mode) void GLArea::initTexture() { if(!mm->cm.textures.empty() && mm->glw.TMId.empty()){ - for(unsigned int i =0; i< mm->cm.textures.size();++i){ - QImage img, imgGL; - img.load(mm->cm.textures[i].c_str()); - imgGL=convertToGLFormat(img); - qDebug("loaded texture %s. with id %i w %i h %i",mm->cm.textures[i].c_str(),i, imgGL.width(), imgGL.height()); - mm->glw.TMId.push_back(0); - glEnable(GL_TEXTURE_2D); - glGenTextures( 1, &(mm->glw.TMId.back()) ); - glBindTexture( GL_TEXTURE_2D, mm->glw.TMId.back() ); - glTexImage2D( GL_TEXTURE_2D, 0, 3, imgGL.width(), imgGL.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, imgGL.bits() ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - qDebug("loaded texture %s. in %i",mm->cm.textures[i].c_str(),mm->glw.TMId[i]); - } - } + glEnable(GL_TEXTURE_2D); + for(unsigned int i =0; i< mm->cm.textures.size();++i){ + QImage img, imgGL; + img.load(mm->cm.textures[i].c_str()); + imgGL=convertToGLFormat(img); + qDebug("loaded texture %s. with id %i w %i h %i",mm->cm.textures[i].c_str(),i, imgGL.width(), imgGL.height()); + mm->glw.TMId.push_back(0); + + glGenTextures( 1, &(mm->glw.TMId.back()) ); + glBindTexture( GL_TEXTURE_2D, mm->glw.TMId.back() ); + glTexImage2D( GL_TEXTURE_2D, 0, 3, imgGL.width(), imgGL.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, imgGL.bits() ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + qDebug("loaded texture %s. in %i",mm->cm.textures[i].c_str(),mm->glw.TMId[i]); + } + } + glDisable(GL_TEXTURE_2D); } void GLArea::setTextureMode(vcg::GLW::TextureMode mode) diff --git a/src/meshlab/glarea.h b/src/meshlab/glarea.h index c6357a0ff..b7e693057 100644 --- a/src/meshlab/glarea.h +++ b/src/meshlab/glarea.h @@ -24,6 +24,12 @@ History $Log$ +Revision 1.39 2005/12/22 20:01:23 glvertex +- Added support for more than one shader +- Some methods renamed +- Adjusted some accelerators keys +- Fixed up minor visual issues + Revision 1.38 2005/12/14 22:25:26 cignoni Added preliminary supprot for editing/selection plugins. @@ -285,11 +291,9 @@ public: void resetTrackBall(); list > *iDecoratorsList; - //shader support - MeshRenderInterface *iRender; - void setRender(MeshRenderInterface *rend){ iRender = rend; } - MeshRenderInterface * getRender() { return iRender; } - MeshEditInterface *iEdit; + void setRenderer(MeshRenderInterface *rend, QAction *shader){ iRenderer = rend; currentSharder = shader;} + MeshRenderInterface * getRenderer() { return iRenderer; } + void setEdit(MeshEditInterface *edit){ iEdit = edit; } protected: @@ -310,6 +314,14 @@ private: bool logVisible; // Prints out log infos ? bool infoAreaVisible; // Draws the lower info area ? bool trackBallVisible; // Draws the trackball ? + + //shader support + MeshRenderInterface *iRenderer; + QAction *currentSharder; + + // Editing support + MeshEditInterface *iEdit; + RenderMode rm; ColorSetting cs; float cfps; @@ -324,7 +336,6 @@ private: QImage tileBuffer; bool takeSnapTile; int vpWidth, vpHeight, tileCol, tileRow, totalCols, totalRows; - }; diff --git a/src/meshlab/mainwindow.h b/src/meshlab/mainwindow.h index 69e8faeaa..b0bdb31b2 100644 --- a/src/meshlab/mainwindow.h +++ b/src/meshlab/mainwindow.h @@ -23,6 +23,12 @@ /**************************************************************************** History $Log$ +Revision 1.51 2005/12/22 20:01:23 glvertex +- Added support for more than one shader +- Some methods renamed +- Adjusted some accelerators keys +- Fixed up minor visual issues + Revision 1.50 2005/12/19 19:03:06 davide_portelli Now decorations in render menu are consistent when we have tiled windows. @@ -183,6 +189,7 @@ private: QMenu *filterMenu; QMenu *editMenu; //Render Menu and SubMenu //// + QMenu *shadersMenu; QMenu *renderMenu; QMenu *renderModeMenu; QMenu *lightingModeMenu; diff --git a/src/meshlab/mainwindow_Init.cpp b/src/meshlab/mainwindow_Init.cpp index 926ebca63..34bd8daea 100644 --- a/src/meshlab/mainwindow_Init.cpp +++ b/src/meshlab/mainwindow_Init.cpp @@ -24,6 +24,12 @@ History $Log$ +Revision 1.32 2005/12/22 20:01:23 glvertex +- Added support for more than one shader +- Some methods renamed +- Adjusted some accelerators keys +- Fixed up minor visual issues + Revision 1.31 2005/12/19 19:03:31 davide_portelli Now decorations in render menu are consistent when we have tiled windows. @@ -343,7 +349,7 @@ void MainWindow::createActions() saveAsAct->setShortcut(Qt::CTRL+Qt::Key_S); connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); - saveSnapshotAct = new QAction(QIcon(":/images/save.png"),tr("&Save snapshot"), this); + saveSnapshotAct = new QAction(QIcon(":/images/save.png"),tr("Save snapsho&t"), this); connect(saveSnapshotAct, SIGNAL(triggered()), this, SLOT(saveSnapshot())); for (int i = 0; i < MAXRECENTFILES; ++i) { @@ -472,7 +478,7 @@ void MainWindow::createActions() setCustomizeAct = new QAction(tr("&Options..."),this); connect(setCustomizeAct, SIGNAL(triggered()), this, SLOT(setCustomize())); - setSaveMaskObjAct = new QAction(tr("&Options Save Obj"),this); + setSaveMaskObjAct = new QAction(tr("Ob&j saving options..."),this); connect(setSaveMaskObjAct, SIGNAL(triggered()), this, SLOT(setSaveMaskObj())); //////////////Action Menu About /////////////////////////////////////////////////////////////////////////// @@ -532,7 +538,9 @@ void MainWindow::createMenus() lightingModeMenu->addAction(setDoubleLightingAct); lightingModeMenu->addAction(setFancyLightingAct); - colorModeMenu=renderMenu->addMenu(tr("Color")); + colorModeMenu = renderMenu->addMenu(tr("Color")); + shadersMenu = renderMenu->addMenu(tr("Shaders")); + shadersMenu->addAction("None",this,SLOT(applyRenderMode())); //////////////////// Menu View //////////////////////////////////////////////////////////////////////////// viewMenu = menuBar()->addMenu(tr("&View")); @@ -606,7 +614,7 @@ void MainWindow::loadPlugins() MeshRenderInterface *iRender = qobject_cast(plugin); if (iRender) - addToMenu(iRender->actions(), renderMenu, SLOT(applyRenderMode())); + addToMenu(iRender->actions(), shadersMenu, SLOT(applyRenderMode())); MeshEditInterface *iEdit = qobject_cast(plugin); if (iEdit) diff --git a/src/meshlab/mainwindow_RunTime.cpp b/src/meshlab/mainwindow_RunTime.cpp index df92691b2..350566e20 100644 --- a/src/meshlab/mainwindow_RunTime.cpp +++ b/src/meshlab/mainwindow_RunTime.cpp @@ -24,6 +24,12 @@ History $Log$ +Revision 1.54 2005/12/22 20:01:23 glvertex +- Added support for more than one shader +- Some methods renamed +- Adjusted some accelerators keys +- Fixed up minor visual issues + Revision 1.53 2005/12/22 15:18:19 mariolatronico passed GLA() to applyFilter in order to use log @@ -485,16 +491,29 @@ void MainWindow::applyEditMode() void MainWindow::applyRenderMode() { QAction *action = qobject_cast(sender()); // find the action which has sent the signal + + if(action->text() == tr("None")) + { + GLA()->log.Log(GLLogStream::Info,"No Shader"); + GLA()->setRenderer(0,0); //vertex and fragment programs not supported + return; + } + // Make the call to the plugin core MeshRenderInterface *iRenderTemp = qobject_cast(action->parent()); iRenderTemp->Init(action,*(GLA()->mm),GLA()); - if(iRenderTemp->isSupported()) { - GLA()->setRender(iRenderTemp); - } else { - GLA()->setRender(0); //vertex and fragment programs not supported + if(iRenderTemp->isSupported()) + { + GLA()->setRenderer(iRenderTemp,action); + GLA()->log.Log(GLLogStream::Info,"%s",action->text().toLocal8Bit().constData()); // Prints out action name } - GLA()->log.Log(GLLogStream::Info,"%s",action->text().toLocal8Bit().constData()); // Prints out action name + else + { + GLA()->setRenderer(0,0); //vertex and fragment programs not supported + GLA()->log.Log(GLLogStream::Warning,"Shader not supported!"); + } + } @@ -504,10 +523,10 @@ void MainWindow::applyColorMode() MeshColorizeInterface *iColorTemp = qobject_cast(action->parent()); iColorTemp->Compute(action,*(GLA()->mm ),GLA()->getCurrentRenderMode(), GLA()); if (action->isChecked()) { - action->setChecked(true); + //action->setChecked(true); GLA()->log.Log(GLLogStream::Info,"Applied colorize %s",action->text().toLocal8Bit().constData()); } else { - action->setChecked(false); + //action->setChecked(false); GLA()->log.Log(GLLogStream::Info,"Turning off colorize %s",action->text().toLocal8Bit().constData()); } } @@ -556,15 +575,13 @@ void MainWindow::setLight() void MainWindow::setDoubleLighting() { const RenderMode &rm=GLA()->getCurrentRenderMode(); - if (rm.doubleSideLighting) GLA()->setLightMode(false,LDOUBLE); - else GLA()->setLightMode(true,LDOUBLE); + GLA()->setLightMode(!rm.doubleSideLighting,LDOUBLE); } void MainWindow::setFancyLighting() { const RenderMode &rm=GLA()->getCurrentRenderMode(); - if (rm.fancyLighting) GLA()->setLightMode(false,LFANCY); - else GLA()->setLightMode(true,LFANCY); + GLA()->setLightMode(!rm.fancyLighting,LFANCY); } void MainWindow::toggleBackFaceCulling()