first draft. Working but ugly interface. right mouse of the button to place a pos, then prss buttons.

This commit is contained in:
ganovelli 2006-12-10 19:55:09 +00:00
parent f57a022c06
commit 812ce8a9b1
7 changed files with 604 additions and 0 deletions

View File

@ -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 <QtGui>
#include <GL/glew.h>
#include <QtOpenGL>
#include <math.h>
#include <wrap/io_trimesh/import_PLY.h>
#include <wrap/gl/picking.h>
#include <wrap/gl/space.h>
#include <wrap/gl/pos.h>
#include <vcg/complex/trimesh/update/bounding.h>
#include <vcg/complex/trimesh/update/normal.h>
#include <vcg/complex/trimesh/update/topology.h>
#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<MyStraightMesh>::Open(mesh,namefile);
vcg::tri::UpdateBounding<MyStraightMesh>::Box(mesh);
vcg::tri::UpdateNormals<MyStraightMesh>::PerFace(mesh);
vcg::tri::UpdateNormals<MyStraightMesh>::PerVertex(mesh);
vcg::tri::UpdateTopology<MyStraightMesh>::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<MyStraightMesh::FaceType*> res;
int yes = vcg::Pick<MyStraightMesh::FaceContainer>(pic_x,ScreenH-pic_y+1,mesh.face,res,vcg::glTriangle3<MyStraightMesh::FaceType>,1,1);
if(yes)
{fp = res[0];
pos.Set(fp,0,fp->V(0));
}
doPick=false;
}
glWrap.Draw<vcg::GLW::DMFlatWire,vcg::GLW::CMNone,vcg::GLW::TMNone> ();
if(pos.f!=NULL) {
glPushAttrib(0xffffffff);
glDisable(GL_LIGHTING);
glColor3f(0.0,1.0,0.0);
glDepthRange(0.0,0.999);
vcg::GlPos<vcg::face::Pos<MyStraightMesh::FaceType> >::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();
}

View File

@ -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 <GL/glew.h>
#include <QGLWidget>
#include "mesh_type.h"
#include <wrap/gui/trackball.h>
#include <wrap/gl/trimesh.h>
#include <vcg/simplex/face/pos.h>
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<MyStraightMesh> glWrap;
vcg::Trackball track;
int ScreenH,ScreenW,pic_x,pic_y,keypress;
bool doPick;
vcg::face::Pos<typename MyStraightMesh::FaceType> 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

View File

@ -0,0 +1,11 @@
#include <QApplication>
#include "window.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Window wdw;
wdw.show();
return app.exec();
}

View File

@ -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<vcg/simplex/vertexplus/base.h>
/** the definition of face */
#include<vcg/simplex/faceplus/base.h>
/** definition of triangle mesh */
#include<vcg/complex/trimesh/base.h>
/** allocation vertices and faces of triangle mesh */
#include<wrap/io_trimesh/import_PLY.h>
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<StraightVertex>,std::vector<StraightFace> >{};
/****************************************************************************************************************************/

View File

@ -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

View File

@ -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 <QtGui>
#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;
}

View File

@ -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 <QWidget>
#include <QPushButton>
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