diff --git a/apps/sample/trimesh_pos_demo/glwidget.cpp b/apps/sample/trimesh_pos_demo/glwidget.cpp new file mode 100644 index 00000000..76f2db1e --- /dev/null +++ b/apps/sample/trimesh_pos_demo/glwidget.cpp @@ -0,0 +1,311 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* 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 2 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 (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "glwidget.h" + +GLWidget::GLWidget(QWidget *parent) + : QGLWidget(parent) +{ + object = 0; + + trolltechGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0); + trolltechPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0); + track.SetPosition(vcg::Point3f(0.0,0.0,0.0)); + track.SetIdentity(); + track.radius = 0.4; + pos.f=NULL; +} + +GLWidget::~GLWidget() +{ + makeCurrent(); + glDeleteLists(object, 1); +} + +QSize GLWidget::minimumSizeHint() const +{ + return QSize(50, 50); +} + +QSize GLWidget::sizeHint() const +{ + return QSize(400, 400); +} + +void GLWidget::LoadTriMesh( char* namefile) +{ + vcg::tri::io::ImporterPLY::Open(mesh,namefile); + vcg::tri::UpdateBounding::Box(mesh); + vcg::tri::UpdateNormals::PerFace(mesh); + vcg::tri::UpdateNormals::PerVertex(mesh); + vcg::tri::UpdateTopology::FaceFace(mesh); + pos.f=0; +} + +void GLWidget::OpenFile(){ + QStringList filters; + + + QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"),".", filters.join("\n")); + + if (fileName.isEmpty()) return; + else + LoadTriMesh((char*)fileName.data()); + +} + +void GLWidget::flipV( ){ + if(pos.f) pos.FlipV(); + repaint(); +} +void GLWidget::flipE( ){ + if(pos.f) pos.FlipE(); + repaint(); +} +void GLWidget::flipF( ){ + if(pos.f) pos.FlipF(); + repaint(); +} +void GLWidget::nextE( ){ + if(pos.f) pos.NextE(); + repaint(); +} + +void GLWidget::initializeGL() +{ + qglClearColor(trolltechPurple.dark()); + object = makeObject(); + glShadeModel(GL_FLAT); + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); +} + +void GLWidget::paintGL() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(0,0,2, 0,0,0, 0,1,0); + + track.GetView(); + track.Apply(); + + + glScalef(1/glWrap.m->bbox.Diag(),1/glWrap.m->bbox.Diag(),1/glWrap.m->bbox.Diag()); + glTranslate(-glWrap.m->bbox.Center()); + + // to do some picking + MyStraightMesh::FaceType* fp=NULL; + if(doPick) + { + std::vector res; + int yes = vcg::Pick(pic_x,ScreenH-pic_y+1,mesh.face,res,vcg::glTriangle3,1,1); + if(yes) + {fp = res[0]; + pos.Set(fp,0,fp->V(0)); + } + doPick=false; + } + + glWrap.Draw (); + + if(pos.f!=NULL) { + glPushAttrib(0xffffffff); + glDisable(GL_LIGHTING); + glColor3f(0.0,1.0,0.0); + glDepthRange(0.0,0.999); + vcg::GlPos >::Draw(pos); + glPopAttrib(); + } +} + + + + + +void GLWidget::mouseMoveEvent(QMouseEvent *e) +{ + track.MouseMove(e->x(),ScreenH-e->y()+1); + repaint(); + + //if (event->buttons() & Qt::LeftButton) { + // setXRotation(xRot + 8 * dy); + //} else if (event->buttons() & Qt::RightButton) { + // setXRotation(xRot + 8 * dy); + //} + // lastPos = event->pos(); +} + void GLWidget::keyPressEvent ( QKeyEvent * e ) { + if((keypress == Qt::Key_Control)&&(e->key()==Qt::Key_Control)) + keypress = -1; + else + keypress = e->key(); + } + +GLuint GLWidget::makeObject() +{ + GLuint list = glGenLists(1); + glNewList(list, GL_COMPILE); + + glBegin(GL_QUADS); + + GLdouble x1 = +0.06; + GLdouble y1 = -0.14; + GLdouble x2 = +0.14; + GLdouble y2 = -0.06; + GLdouble x3 = +0.08; + GLdouble y3 = +0.00; + GLdouble x4 = +0.30; + GLdouble y4 = +0.22; + + quad(x1, y1, x2, y2, y2, x2, y1, x1); + quad(x3, y3, x4, y4, y4, x4, y3, x3); + + extrude(x1, y1, x2, y2); + extrude(x2, y2, y2, x2); + extrude(y2, x2, y1, x1); + extrude(y1, x1, x1, y1); + extrude(x3, y3, x4, y4); + extrude(x4, y4, y4, x4); + extrude(y4, x4, y3, x3); + + const double Pi = 3.14159265358979323846; + const int NumSectors = 200; + + for (int i = 0; i < NumSectors; ++i) { + double angle1 = (i * 2 * Pi) / NumSectors; + GLdouble x5 = 0.30 * sin(angle1); + GLdouble y5 = 0.30 * cos(angle1); + GLdouble x6 = 0.20 * sin(angle1); + GLdouble y6 = 0.20 * cos(angle1); + + double angle2 = ((i + 1) * 2 * Pi) / NumSectors; + GLdouble x7 = 0.20 * sin(angle2); + GLdouble y7 = 0.20 * cos(angle2); + GLdouble x8 = 0.30 * sin(angle2); + GLdouble y8 = 0.30 * cos(angle2); + + quad(x5, y5, x6, y6, x7, y7, x8, y8); + + extrude(x6, y6, x7, y7); + extrude(x8, y8, x5, y5); + } + + glEnd(); + + glEndList(); + return list; +} + +void GLWidget::quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2, + GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4) +{ + qglColor(trolltechGreen); + + glVertex3d(x1, y1, -0.05); + glVertex3d(x2, y2, -0.05); + glVertex3d(x3, y3, -0.05); + glVertex3d(x4, y4, -0.05); + + glVertex3d(x4, y4, +0.05); + glVertex3d(x3, y3, +0.05); + glVertex3d(x2, y2, +0.05); + glVertex3d(x1, y1, +0.05); +} + +void GLWidget::extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) +{ + qglColor(trolltechGreen.dark(250 + int(100 * x1))); + + glVertex3d(x1, y1, +0.05); + glVertex3d(x2, y2, +0.05); + glVertex3d(x2, y2, -0.05); + glVertex3d(x1, y1, -0.05); +} + +void GLWidget::normalizeAngle(int *angle) +{ + while (*angle < 0) + *angle += 360 * 16; + while (*angle > 360 * 16) + *angle -= 360 * 16; +} + + void GLWidget:: mousePressEvent(QMouseEvent *e) +{ + if( (keypress==Qt::Key_Control) && (e->button() == Qt::LeftButton) ) + track.MouseDown(e->x(),ScreenH-e->y()+1,vcg::Trackball::KEY_CTRL|vcg::Trackball::BUTTON_LEFT ); + else + if(e->button() == Qt::LeftButton ) + track.MouseDown(e->x(),ScreenH-e->y()+1,vcg::Trackball::BUTTON_LEFT); + else + if(e->button() == Qt::RightButton) + { + doPick=true; + pic_x = e->x(); + pic_y = e->y(); + } + repaint(); + } + + void GLWidget::mouseReleaseEvent ( QMouseEvent * e ){ + + if( (keypress==Qt::Key_Control) && (e->button() == Qt::LeftButton) ) + track.MouseUp(e->x(),ScreenH-e->y()+1,vcg::Trackball::KEY_CTRL ); + else + if(e->button() == Qt::LeftButton ) + track.MouseUp(e->x(),ScreenH-e->y()+1,vcg::Trackball::BUTTON_LEFT); + repaint(); + } + + + void GLWidget::resizeGL(int w,int h){ + ScreenW=w; ScreenH=h; + glViewport(0,0,w,h); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45,ScreenW/(float)ScreenH,0.01,5); + } + void GLWidget::wheelEvent ( QWheelEvent * e ){ + int v = e->delta()/(float) 120; + track.MouseWheel(v); + repaint(); + } diff --git a/apps/sample/trimesh_pos_demo/glwidget.h b/apps/sample/trimesh_pos_demo/glwidget.h new file mode 100644 index 00000000..0734e0c1 --- /dev/null +++ b/apps/sample/trimesh_pos_demo/glwidget.h @@ -0,0 +1,87 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* 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 2 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 (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ +*/ +#ifndef GLWIDGET_H_POS_DEMO +#define GLWIDGET_H_POS_DEMO + +#include +#include +#include "mesh_type.h" +#include +#include +#include + +class GLWidget : public QGLWidget +{ + Q_OBJECT + +public: + GLWidget(QWidget *parent = 0); + ~GLWidget(); + + QSize minimumSizeHint() const; + QSize sizeHint() const; + int xRotation() const { return xRot; } + MyStraightMesh mesh; + vcg::GlTrimesh glWrap; + vcg::Trackball track; + int ScreenH,ScreenW,pic_x,pic_y,keypress; + bool doPick; + vcg::face::Pos pos; +public slots: + void flipV( ); + void flipE( ); + void flipF( ); + void nextE( ); + void LoadTriMesh( char* namefile); + void OpenFile(); + +protected: + void initializeGL(); + void paintGL(); + void resizeGL(int width, int height); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void wheelEvent ( QWheelEvent * e ); + void keyPressEvent ( QKeyEvent * e ); + +private: + GLuint makeObject(); + void quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2, + GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4); + void extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); + void normalizeAngle(int *angle); + + GLuint object; + int xRot; + QPoint lastPos; + QColor trolltechGreen; + QColor trolltechPurple; +}; + +#endif diff --git a/apps/sample/trimesh_pos_demo/main.cpp b/apps/sample/trimesh_pos_demo/main.cpp new file mode 100644 index 00000000..875bb747 --- /dev/null +++ b/apps/sample/trimesh_pos_demo/main.cpp @@ -0,0 +1,11 @@ + +#include +#include "window.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + Window wdw; + wdw.show(); + return app.exec(); +} diff --git a/apps/sample/trimesh_pos_demo/mesh_type.h b/apps/sample/trimesh_pos_demo/mesh_type.h new file mode 100644 index 00000000..eedb6ffe --- /dev/null +++ b/apps/sample/trimesh_pos_demo/mesh_type.h @@ -0,0 +1,55 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* 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 2 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 (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ +*/ +#pragma once +/** the definition of vertex */ +#include +/** the definition of face */ +#include +/** definition of triangle mesh */ +#include + +/** allocation vertices and faces of triangle mesh */ +#include + + +class DummyEdge; +class StraightFace; + +/**************************************************************************************************************************/ +/* DEFINITION OF A VERY STRAIGHT MESH. No optional atributes, just normals in the vertices and flags in vertices and faces*/ + +/** definition of a very simple vertex type. Just coordinates and normal as attributes*/ +class StraightVertex: public vcg::VertexSimp2< StraightVertex, DummyEdge, StraightFace, vcg::vert::Coord3f,vcg::vert::Normal3f,vcg::vert::BitFlags>{}; + +/** definition of a very simple face type. Just color and reference to vertices as attribute*/ +class StraightFace: public vcg::FaceSimp2< StraightVertex, DummyEdge, StraightFace, vcg:: face::VertexRef, vcg:: face::FFAdj,vcg:: face::Normal3f,vcg::face::BitFlags > {}; + +/** definition of a very simple mesh*/ +class MyStraightMesh: public vcg::tri::TriMesh< std::vector,std::vector >{}; + +/****************************************************************************************************************************/ diff --git a/apps/sample/trimesh_pos_demo/trimesh_pos_demo.pro b/apps/sample/trimesh_pos_demo/trimesh_pos_demo.pro new file mode 100644 index 00000000..f9cd09c2 --- /dev/null +++ b/apps/sample/trimesh_pos_demo/trimesh_pos_demo.pro @@ -0,0 +1,19 @@ +INCLUDEPATH += . ../../.. ../../../../code/lib +HEADERS = glwidget.h \ + window.h \ + mesh_type +SOURCES = glwidget.cpp \ + main.cpp \ + window.cpp\ + ../../../wrap/ply/plylib.cpp\ + ../../../wrap/gui/trackball.cpp\ + ../../../wrap/gui/trackmode.cpp\ + ../../../wrap/gui/trackball.cpp +QT += opengl + +# install +target.path = $$./debug +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS trimesh_pos_demo.pro +sources.path = ./ +INSTALLS += target sources + diff --git a/apps/sample/trimesh_pos_demo/window.cpp b/apps/sample/trimesh_pos_demo/window.cpp new file mode 100644 index 00000000..c0c5c445 --- /dev/null +++ b/apps/sample/trimesh_pos_demo/window.cpp @@ -0,0 +1,70 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* 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 2 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 (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ +*/ +#include + +#include "glwidget.h" +#include "window.h" +#include "mesh_type.h" + + +Window::Window() +{ + glWidget = new GLWidget; + + fvButton = createButton("FlipV()",SLOT(flipV( ))); + feButton = createButton("FlipE()",SLOT(flipE( ))); + ffButton = createButton("FlipF()",SLOT(flipF( ))); + neButton = createButton("NextE()",SLOT(nextE( ))); + ldButton = createButton("Load",SLOT(OpenFile( ))); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(glWidget); + mainLayout->addWidget(fvButton); + mainLayout->addWidget(feButton); + mainLayout->addWidget(ffButton); + mainLayout->addWidget(neButton); + + mainLayout->addWidget(ldButton); + setLayout(mainLayout); + + glWidget->LoadTriMesh("torus.ply"); + glWidget->glWrap.m = &glWidget->mesh; + + setWindowTitle(tr("TriMesh Pos Demo")); +} + + +QPushButton *Window::createButton(const char *text, const char *setterSlot) +{ + QPushButton *button = new QPushButton( text,0); + button-> resize ( 50, 20 ); + + if(!connect(button, SIGNAL(clicked()), glWidget, setterSlot)) + exit(0); + return button; +} diff --git a/apps/sample/trimesh_pos_demo/window.h b/apps/sample/trimesh_pos_demo/window.h new file mode 100644 index 00000000..2e60998b --- /dev/null +++ b/apps/sample/trimesh_pos_demo/window.h @@ -0,0 +1,51 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* 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 2 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 (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ +*/ +#ifndef WINDOW_H_POS_DEMO +#define WINDOW_H_POS_DEMO + +#include +#include + +class QSlider; +class GLWidget; + +class Window : public QWidget +{ + Q_OBJECT + +public: + Window(); + +private: + QPushButton *createButton(const char *changedSignal, const char *setterSlot); + + GLWidget *glWidget; + QPushButton * fvButton,*feButton,*ffButton,*neButton,*ldButton; +}; + +#endif