2004-07-12 00:13:30 +02:00
|
|
|
/****************************************************************************
|
2004-09-30 02:57:42 +02:00
|
|
|
* 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. *
|
|
|
|
* *
|
|
|
|
****************************************************************************/
|
2004-07-12 00:13:30 +02:00
|
|
|
/****************************************************************************
|
|
|
|
History
|
|
|
|
|
|
|
|
$Log: not supported by cvs2svn $
|
2006-01-10 14:20:42 +01:00
|
|
|
Revision 1.10 2005/11/12 06:48:47 cignoni
|
|
|
|
Version 1.0
|
|
|
|
Added management of point set, correct bug in printing on the screen,
|
|
|
|
|
2005-11-12 07:48:47 +01:00
|
|
|
Revision 1.9 2005/01/03 13:59:54 cignoni
|
|
|
|
Resolved min/max macro conflict
|
|
|
|
|
2005-01-03 14:59:54 +01:00
|
|
|
Revision 1.8 2004/09/30 00:57:42 ponchio
|
|
|
|
Reference to temporary fixed and indented.
|
|
|
|
|
2004-09-30 02:57:42 +02:00
|
|
|
Revision 1.7 2004/09/28 09:46:51 cignoni
|
|
|
|
Added MapFalseColor
|
|
|
|
|
2004-09-28 11:46:51 +02:00
|
|
|
Revision 1.6 2004/09/16 14:08:35 ponchio
|
|
|
|
gamma is a math function.
|
|
|
|
|
2004-09-16 16:08:35 +02:00
|
|
|
Revision 1.5 2004/09/10 14:02:20 cignoni
|
|
|
|
Added Cone directions
|
|
|
|
|
2004-09-10 16:02:20 +02:00
|
|
|
Revision 1.4 2004/09/09 22:34:38 cignoni
|
|
|
|
Integrated lost modifications...
|
|
|
|
|
2004-09-10 00:37:48 +02:00
|
|
|
Revision 1.3 2004/09/09 14:35:54 ponchio
|
|
|
|
Various changes for gcc compatibility
|
|
|
|
|
2004-09-09 16:35:54 +02:00
|
|
|
Revision 1.2 2004/07/11 22:13:30 cignoni
|
|
|
|
Added GPL comments
|
|
|
|
|
2004-07-12 00:13:30 +02:00
|
|
|
|
|
|
|
****************************************************************************/
|
2004-06-09 19:01:29 +02:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
2004-09-10 00:37:48 +02:00
|
|
|
#include <stdarg.h>
|
2004-06-09 19:01:29 +02:00
|
|
|
#include <time.h>
|
2005-01-03 14:59:54 +01:00
|
|
|
// this define is mandatory to avoid the conflicts due to the silly definition of
|
|
|
|
// min and max macros in windows.h (included by glut...)
|
|
|
|
#define NOMINMAX
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
#include <GL/glew.h>
|
|
|
|
#include <GL/glut.h>
|
|
|
|
#include <wrap/gl/space.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include <wrap/callback.h>
|
2004-09-10 16:02:20 +02:00
|
|
|
#include <vcg/math/base.h>
|
2004-06-09 19:01:29 +02:00
|
|
|
#include <wrap/gui/trackball.h>
|
|
|
|
#include <vcg/simplex/vertex/with/vcvn.h>
|
|
|
|
#include <vcg/simplex/vertex/with/vcvn.h>
|
2004-09-28 11:46:51 +02:00
|
|
|
#include <vcg/simplex/face/with/fn.h>
|
2004-06-09 19:01:29 +02:00
|
|
|
#include <vcg/space/index/grid_static_ptr.h>
|
|
|
|
#include <vcg/complex/trimesh/base.h>
|
|
|
|
#include<wrap/io_trimesh/export_ply.h>
|
|
|
|
#include<wrap/io_trimesh/import_ply.h>
|
|
|
|
#include<vcg/complex/trimesh/update/normal.h>
|
|
|
|
#include<vcg/complex/trimesh/update/bounding.h>
|
2004-09-10 00:37:48 +02:00
|
|
|
#include<vcg/complex/trimesh/update/color.h>
|
2004-06-09 19:01:29 +02:00
|
|
|
|
|
|
|
#include "visshader.h"
|
|
|
|
using namespace vcg;
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Vertex, Face, Mesh and Grid definitions.
|
|
|
|
class MyEdge;
|
|
|
|
class AFace;
|
|
|
|
class AVertex : public VertexVCVN< float ,MyEdge,AFace > {};
|
2004-09-28 11:46:51 +02:00
|
|
|
class AFace : public FaceFN< AVertex,MyEdge,AFace > {};
|
2004-06-09 19:01:29 +02:00
|
|
|
class AMesh : public tri::TriMesh< vector<AVertex>, vector<AFace> > {};
|
|
|
|
|
|
|
|
///////// Global ////////
|
|
|
|
|
2004-09-10 00:37:48 +02:00
|
|
|
int SampleNum=64;
|
2004-06-09 19:01:29 +02:00
|
|
|
int WindowRes=800;
|
2004-09-10 00:37:48 +02:00
|
|
|
unsigned int TexInd=0;
|
2004-06-09 19:01:29 +02:00
|
|
|
bool SwapFlag=false;
|
2004-09-10 00:37:48 +02:00
|
|
|
bool CullFlag=false;
|
|
|
|
bool ClosedFlag=false;
|
2004-09-10 16:02:20 +02:00
|
|
|
Point3f ConeDir(0,1,0);
|
|
|
|
float ConeAngleRad = math::ToRad(180.0f);
|
2004-09-10 00:37:48 +02:00
|
|
|
|
2004-09-16 16:08:35 +02:00
|
|
|
float lopass=0,hipass=1,gamma_correction=1;
|
2004-09-10 00:37:48 +02:00
|
|
|
float diff=.8;
|
|
|
|
float ambi=.2;
|
2004-06-09 19:01:29 +02:00
|
|
|
|
|
|
|
bool LightFlag=true;
|
|
|
|
bool ColorFlag=true;
|
2004-09-28 11:46:51 +02:00
|
|
|
bool FalseColorFlag=false;
|
2004-09-10 00:37:48 +02:00
|
|
|
bool ShowDirFlag=false;
|
|
|
|
int imgcnt=0;
|
2004-06-09 19:01:29 +02:00
|
|
|
|
2004-09-10 00:37:48 +02:00
|
|
|
Color4b BaseColor=Color4b::White;
|
|
|
|
Trackball QV;
|
|
|
|
Trackball QL;
|
|
|
|
Trackball *Q=&QV;
|
2004-06-09 19:01:29 +02:00
|
|
|
|
|
|
|
int ScreenH,ScreenW;
|
2004-09-10 00:37:48 +02:00
|
|
|
float ViewAngle=33;
|
|
|
|
vector<Point3f> ViewVector;
|
2004-06-09 19:01:29 +02:00
|
|
|
|
|
|
|
bool cb(const char *buf)
|
|
|
|
{
|
2004-09-30 02:57:42 +02:00
|
|
|
printf(buf);
|
|
|
|
return true;
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
|
2004-09-10 00:37:48 +02:00
|
|
|
void BuildOnePixelTexture(Color4b c, unsigned int &TexInd)
|
|
|
|
{
|
|
|
|
if(TexInd==0) glGenTextures(1,&TexInd);
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_1D,TexInd);
|
|
|
|
glTexImage1D(GL_TEXTURE_1D,0,GL_RGBA,1,0,GL_RGBA,GL_UNSIGNED_BYTE,&c);
|
|
|
|
glEnable(GL_TEXTURE_1D);
|
|
|
|
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
|
|
|
|
}
|
|
|
|
void glutPrintf(int x, int y, const char * f, ... )
|
|
|
|
{
|
|
|
|
glMatrixMode (GL_PROJECTION);
|
|
|
|
glPushMatrix();
|
|
|
|
glLoadIdentity ();
|
|
|
|
glOrtho(0,ScreenW,0,ScreenH,-1,1);
|
|
|
|
glMatrixMode (GL_MODELVIEW);
|
|
|
|
glPushMatrix();
|
|
|
|
glLoadIdentity ();
|
|
|
|
|
|
|
|
int len, i;
|
|
|
|
char buf[4096];
|
|
|
|
va_list marker;
|
|
|
|
va_start( marker, f );
|
|
|
|
|
|
|
|
int n = vsprintf(buf,f,marker);
|
|
|
|
va_end( marker );
|
2005-11-12 07:48:47 +01:00
|
|
|
glPushAttrib(GL_ENABLE_BIT);
|
|
|
|
glDisable(GL_LIGHTING);
|
2004-09-10 00:37:48 +02:00
|
|
|
glColor3f(0,0,0);
|
|
|
|
glRasterPos2f(x, y);
|
|
|
|
len = (int) strlen(buf);
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, buf[i]);
|
|
|
|
}
|
|
|
|
glMatrixMode (GL_PROJECTION);
|
|
|
|
glPopMatrix();
|
|
|
|
glMatrixMode (GL_MODELVIEW);
|
|
|
|
glPopMatrix();
|
2005-11-12 07:48:47 +01:00
|
|
|
glPopAttrib();
|
2004-09-10 00:37:48 +02:00
|
|
|
}
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
// prototypes
|
|
|
|
void SaveTexturedGround();
|
|
|
|
|
2004-09-10 00:37:48 +02:00
|
|
|
void DrawViewVector()
|
|
|
|
{
|
|
|
|
glDisable(GL_LIGHTING);
|
|
|
|
glColor3f(0,0,1);
|
|
|
|
glBegin(GL_LINES);
|
|
|
|
for(unsigned int i=0;i<ViewVector.size();++i)
|
2004-09-30 02:57:42 +02:00
|
|
|
{
|
|
|
|
glVertex3f(0,0,0);glVertex(ViewVector[i]);
|
|
|
|
}
|
2004-09-10 00:37:48 +02:00
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
void DrawLightVector()
|
|
|
|
{
|
|
|
|
const int sz=5;
|
|
|
|
glPushMatrix();
|
|
|
|
QL.Apply();
|
|
|
|
glDisable(GL_LIGHTING);
|
|
|
|
glBegin(GL_LINES);
|
|
|
|
glColor3f(1,1,0);
|
|
|
|
for(unsigned int i=0;i<=sz;++i)
|
|
|
|
for(unsigned int j=0;j<=sz;++j)
|
|
|
|
{
|
|
|
|
glColor3f(1,1,0);
|
|
|
|
glVertex3f(-1.0f+i*2.0/sz,-1.0f+j*2.0/sz,-1);
|
|
|
|
glVertex3f(-1.0f+i*2.0/sz,-1.0f+j*2.0/sz, 1);
|
|
|
|
}
|
|
|
|
glEnd();
|
|
|
|
glPopMatrix();
|
|
|
|
}
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
void Draw(AMesh &mm)
|
|
|
|
{
|
2005-11-12 07:48:47 +01:00
|
|
|
if(mm.face.empty())
|
|
|
|
{
|
|
|
|
glPushAttrib(GL_ENABLE_BIT);
|
|
|
|
glDisable(GL_LIGHTING);
|
|
|
|
AMesh::VertexIterator vi;
|
|
|
|
glBegin(GL_POINTS);
|
|
|
|
for(vi=mm.vert.begin();vi!=mm.vert.end();++vi)
|
|
|
|
{
|
|
|
|
if(ColorFlag) glColor((*vi).C());
|
|
|
|
glVertex((*vi).P());
|
|
|
|
}
|
|
|
|
glEnd();
|
|
|
|
glPopAttrib();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
AMesh::FaceIterator fi;
|
|
|
|
glBegin(GL_TRIANGLES);
|
|
|
|
for(fi=mm.face.begin();fi!=mm.face.end();++fi)
|
|
|
|
{
|
|
|
|
glNormal((*fi).V(0)->N()); if(ColorFlag) glColor((*fi).V(0)->C()); glVertex((*fi).V(0)->P());
|
|
|
|
glNormal((*fi).V(1)->N()); if(ColorFlag) glColor((*fi).V(1)->C()); glVertex((*fi).V(1)->P());
|
|
|
|
glNormal((*fi).V(2)->N()); if(ColorFlag) glColor((*fi).V(2)->C()); glVertex((*fi).V(2)->P());
|
|
|
|
}
|
|
|
|
glEnd();
|
|
|
|
}
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
AMesh m;
|
|
|
|
VertexVisShader<AMesh> Vis(m);
|
|
|
|
|
|
|
|
string OutNameMsh;
|
|
|
|
|
|
|
|
|
|
|
|
/* Called when the window is first opened and whenever
|
|
|
|
* the window is reconfigured (moved or resized).
|
|
|
|
*/
|
|
|
|
void ViewReshape(GLsizei w, GLsizei h)
|
|
|
|
{
|
2004-09-30 02:57:42 +02:00
|
|
|
ScreenW=w; ScreenH=h;
|
2004-09-10 00:37:48 +02:00
|
|
|
glViewport(0,0,w,h);
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ViewDisplay (void)
|
|
|
|
{
|
2004-09-10 00:37:48 +02:00
|
|
|
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
2004-06-09 19:01:29 +02:00
|
|
|
glMatrixMode (GL_PROJECTION);
|
|
|
|
glLoadIdentity ();
|
2004-09-10 00:37:48 +02:00
|
|
|
gluPerspective(ViewAngle,(float)ScreenW/ScreenH,1,7);
|
2004-06-09 19:01:29 +02:00
|
|
|
glMatrixMode (GL_MODELVIEW);
|
|
|
|
glLoadIdentity ();
|
2004-09-10 00:37:48 +02:00
|
|
|
glPushMatrix();
|
|
|
|
QL.Apply();
|
2004-09-30 02:57:42 +02:00
|
|
|
glutPrintf(5,5,"Diffuse %04.2f Ambient %04.2f "
|
2005-11-12 07:48:47 +01:00
|
|
|
" LowPass %04.2f HiPass %04.2f Gamma %04.2f rgb = %03i:%03i:%03i",
|
|
|
|
diff,ambi,lopass,hipass,gamma_correction,BaseColor[0],BaseColor[1],BaseColor[2]);
|
2004-09-30 02:57:42 +02:00
|
|
|
|
2004-09-10 00:37:48 +02:00
|
|
|
GLfloat light_position0[] = {0.0, 10.0, 300.0, 0.0};
|
2004-09-30 02:57:42 +02:00
|
|
|
glLightfv(GL_LIGHT0, GL_POSITION, light_position0);
|
2004-09-10 00:37:48 +02:00
|
|
|
glPopMatrix();
|
2004-06-09 19:01:29 +02:00
|
|
|
glTranslatef(0,0,-4);
|
2004-09-10 00:37:48 +02:00
|
|
|
if(Q==&QL) DrawLightVector();
|
|
|
|
QL.GetView();
|
|
|
|
QV.GetView();
|
2005-11-12 07:48:47 +01:00
|
|
|
QV.Apply(false);
|
2004-09-10 00:37:48 +02:00
|
|
|
if(ShowDirFlag) DrawViewVector();
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
float d = 2.0/m.bbox.Diag();
|
|
|
|
glScalef(d, d, d);
|
2004-09-10 00:37:48 +02:00
|
|
|
glColor3f(diff,diff,diff);
|
2004-06-09 19:01:29 +02:00
|
|
|
glTranslate(-m.bbox.Center());
|
|
|
|
if(LightFlag) glEnable(GL_LIGHTING);
|
2004-09-30 02:57:42 +02:00
|
|
|
else glDisable(GL_LIGHTING);
|
2004-06-09 19:01:29 +02:00
|
|
|
if(ColorFlag) glEnable(GL_COLOR_MATERIAL);
|
2004-09-30 02:57:42 +02:00
|
|
|
else glDisable(GL_COLOR_MATERIAL);
|
2004-09-28 11:46:51 +02:00
|
|
|
if(FalseColorFlag) glColorMaterial(GL_FRONT,GL_DIFFUSE);
|
2004-09-30 02:57:42 +02:00
|
|
|
else glColorMaterial(GL_FRONT,GL_AMBIENT);
|
|
|
|
|
2004-09-10 00:37:48 +02:00
|
|
|
glMateriali(GL_FRONT,GL_SHININESS,0);
|
|
|
|
float spec[4]={0,0,0,1};
|
|
|
|
float ambientV[4]={ambi,ambi,ambi,1};
|
|
|
|
float diffuseV[4]={diff,diff,diff,1};
|
|
|
|
glMaterialfv(GL_FRONT,GL_SPECULAR,spec);
|
|
|
|
glMaterialfv(GL_FRONT,GL_AMBIENT, ambientV);
|
|
|
|
glMaterialfv(GL_FRONT,GL_DIFFUSE, diffuseV);
|
|
|
|
glCullFace(GL_BACK);
|
|
|
|
|
|
|
|
if(CullFlag) glEnable(GL_CULL_FACE);
|
|
|
|
else glDisable(GL_CULL_FACE);
|
|
|
|
|
|
|
|
BuildOnePixelTexture(BaseColor,TexInd);
|
2004-06-09 19:01:29 +02:00
|
|
|
Draw(m);
|
|
|
|
glutSwapBuffers();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ViewSpecialKey(int , int , int )
|
|
|
|
{
|
|
|
|
glutPostRedisplay();
|
|
|
|
}
|
|
|
|
void Toggle(bool &flag) {flag = !flag;}
|
2004-09-10 00:37:48 +02:00
|
|
|
void UpdateVis()
|
|
|
|
{
|
2004-09-30 02:57:42 +02:00
|
|
|
if( LightFlag && !FalseColorFlag)
|
|
|
|
Vis.MapVisibility(gamma_correction,lopass,hipass,ambi);
|
|
|
|
if(!LightFlag && !FalseColorFlag)
|
|
|
|
Vis.MapVisibility(gamma_correction,lopass,hipass,1.0);
|
|
|
|
if(FalseColorFlag)
|
|
|
|
Vis.MapFalseColor();
|
2004-09-10 00:37:48 +02:00
|
|
|
}
|
2004-06-09 19:01:29 +02:00
|
|
|
/*********************************************************************/
|
|
|
|
/*********************************************************************/
|
|
|
|
/*********************************************************************/
|
2004-09-30 02:57:42 +02:00
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
void ViewKey(unsigned char key, int , int )
|
|
|
|
{
|
2004-09-30 02:57:42 +02:00
|
|
|
Point3f dir;
|
2004-06-09 19:01:29 +02:00
|
|
|
switch (key) {
|
|
|
|
case 27: exit(0); break;
|
2004-09-10 00:37:48 +02:00
|
|
|
case 9: if(Q==&QV) Q=&QL;else Q=&QV; break;
|
2004-09-30 02:57:42 +02:00
|
|
|
case 'l' :
|
|
|
|
lopass=lopass+.05;
|
|
|
|
printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma_correction);
|
|
|
|
UpdateVis(); break;
|
|
|
|
case 'L' :
|
|
|
|
lopass=lopass-.05;
|
|
|
|
printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma_correction);
|
|
|
|
UpdateVis(); break;
|
|
|
|
case 'h' :
|
|
|
|
hipass=hipass-.05;
|
|
|
|
printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma_correction);
|
|
|
|
UpdateVis(); break;
|
|
|
|
case 'H' :
|
|
|
|
hipass=hipass+.05;
|
|
|
|
printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma_correction);
|
|
|
|
UpdateVis(); break;
|
2004-09-10 00:37:48 +02:00
|
|
|
case 'd' : diff+=.05; printf("Ambient %f Diffuse %f, \n",ambi,diff); UpdateVis(); break;
|
|
|
|
case 'D' : diff-=.05; printf("Ambient %f Diffuse %f, \n",ambi,diff); UpdateVis(); break;
|
|
|
|
case 'a' : ambi+=.05; printf("Ambient %f Diffuse %f, \n",ambi,diff); UpdateVis(); break;
|
|
|
|
case 'A' : ambi-=.05; printf("Ambient %f Diffuse %f, \n",ambi,diff); UpdateVis(); break;
|
2004-09-30 02:57:42 +02:00
|
|
|
|
|
|
|
case 'e' : ambi+=.05; diff-=.05;
|
|
|
|
printf("Ambient %f Diffuse %f, \n",ambi,diff);
|
|
|
|
UpdateVis(); break;
|
|
|
|
case 'E' : ambi-=.05; diff+=.05;
|
|
|
|
printf("Ambient %f Diffuse %f, \n",ambi,diff);
|
|
|
|
UpdateVis(); break;
|
|
|
|
case 'p' :
|
|
|
|
gamma_correction=gamma_correction-.05;
|
|
|
|
printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma_correction);
|
|
|
|
UpdateVis(); break;
|
|
|
|
case 'P' :
|
|
|
|
gamma_correction=gamma_correction+.05;
|
|
|
|
printf("Lo %f, Hi %f Gamma %f\n",lopass,hipass,gamma_correction);
|
|
|
|
UpdateVis(); break;
|
|
|
|
case 13 :
|
|
|
|
//Vis.ComputeUniform(SampleNum,ViewVector,cb);
|
2004-09-10 16:02:20 +02:00
|
|
|
Vis.ComputeUniformCone(SampleNum,ViewVector, ConeAngleRad,ConeDir,cb);
|
2004-09-30 02:57:42 +02:00
|
|
|
UpdateVis(); break;
|
2004-06-09 19:01:29 +02:00
|
|
|
case ' ' : {
|
2004-09-10 00:37:48 +02:00
|
|
|
Point3f dir = Q->camera.ViewPoint();
|
2004-06-09 19:01:29 +02:00
|
|
|
printf("ViewPoint %f %f %f\n",dir[0],dir[1],dir[2]);
|
|
|
|
dir.Normalize();
|
2004-09-10 00:37:48 +02:00
|
|
|
dir=Inverse(Q->track.Matrix())*dir;
|
2004-06-09 19:01:29 +02:00
|
|
|
printf("ViewPoint %f %f %f\n",dir[0],dir[1],dir[2]);
|
|
|
|
dir.Normalize();
|
2004-09-30 02:57:42 +02:00
|
|
|
Vis.ComputeSingle(dir,ViewVector,cb);
|
|
|
|
UpdateVis();
|
|
|
|
} break;
|
2005-11-12 07:48:47 +01:00
|
|
|
case 'r' : BaseColor[0]=min(255,BaseColor[0]+2); break;
|
|
|
|
case 'R' : BaseColor[0]=max( 0,BaseColor[0]-2); break;
|
|
|
|
case 'g' : BaseColor[1]=min(255,BaseColor[1]+2); break;
|
|
|
|
case 'G' : BaseColor[1]=max( 0,BaseColor[1]-2); break;
|
|
|
|
case 'b' : BaseColor[2]=min(255,BaseColor[2]+2); break;
|
|
|
|
case 'B' : BaseColor[2]=max( 0,BaseColor[2]-2); break;
|
2004-09-30 02:57:42 +02:00
|
|
|
|
2004-09-10 00:37:48 +02:00
|
|
|
case 'v' : Toggle(ShowDirFlag); break;
|
|
|
|
case 'V' :
|
|
|
|
{
|
|
|
|
SimplePic<Color4b> snapC;
|
|
|
|
snapC.OpenGLSnap();
|
|
|
|
char buf[128];
|
|
|
|
sprintf(buf,"Snap%03i.ppm",imgcnt++);
|
|
|
|
snapC.SavePPM(buf);
|
|
|
|
}
|
2004-09-30 02:57:42 +02:00
|
|
|
case 's' :
|
|
|
|
Vis.SmoothVisibility();
|
|
|
|
UpdateVis(); break;
|
2005-11-12 07:48:47 +01:00
|
|
|
case 't' :
|
|
|
|
Vis.SmoothVisibility(true);
|
|
|
|
UpdateVis(); break;
|
2004-06-09 19:01:29 +02:00
|
|
|
case 'S' :
|
|
|
|
{
|
|
|
|
vcg::tri::io::PlyInfo p;
|
2006-01-10 14:20:42 +01:00
|
|
|
p.mask|=vcg::tri::io::Mask::IOM_VERTCOLOR /* | vcg::ply::PLYMask::PM_VERTQUALITY*/ ;
|
2004-06-09 19:01:29 +02:00
|
|
|
tri::io::ExporterPLY<AMesh>::Save(m,OutNameMsh.c_str(),false,p);
|
|
|
|
}
|
2004-09-30 02:57:42 +02:00
|
|
|
break;
|
|
|
|
case 'C' : LightFlag = !LightFlag;
|
|
|
|
printf("Toggled Light %s\n",LightFlag?"on":"off");
|
|
|
|
UpdateVis(); break;
|
|
|
|
case 'c' : ColorFlag = !ColorFlag;
|
|
|
|
printf("Toggled Color %s\n",ColorFlag?"on":"off"); break;
|
|
|
|
case 'f' : FalseColorFlag = !FalseColorFlag;
|
|
|
|
printf("Toggled FalseColor %s\n",ColorFlag?"on":"off");
|
|
|
|
UpdateVis(); break;
|
|
|
|
|
2004-09-16 16:08:35 +02:00
|
|
|
case '1' : diff=0.80f; ambi=0.10f; gamma_correction=1.0; lopass=0.00f; hipass=1.00f; ColorFlag=false; UpdateVis(); break;
|
|
|
|
case '2' : diff=0.65f; ambi=0.30f; gamma_correction=1.0; lopass=0.15f; hipass=0.80f; ColorFlag=true; UpdateVis(); break;
|
|
|
|
case '3' : diff=0.45f; ambi=0.50f; gamma_correction=1.0; lopass=0.20f; hipass=0.75f; ColorFlag=true; UpdateVis(); break;
|
|
|
|
case '4' : diff=0.35f; ambi=0.60f; gamma_correction=1.0; lopass=0.25f; hipass=0.70f; ColorFlag=true; UpdateVis(); break;
|
2004-09-30 02:57:42 +02:00
|
|
|
}
|
|
|
|
glutPostRedisplay(); ;
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
void ViewMenu(int val)
|
|
|
|
{
|
2004-09-30 02:57:42 +02:00
|
|
|
ViewKey(val, 0, 0);
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
/*********************************************************************/
|
|
|
|
// TrackBall Functions
|
|
|
|
/*********************************************************************/
|
|
|
|
|
|
|
|
int GW,GH; // Grandezza della finestra
|
|
|
|
|
|
|
|
void ViewMouse(int button, int state, int x, int y)
|
|
|
|
{
|
2004-09-10 00:37:48 +02:00
|
|
|
static int KeyMod=0;
|
2004-06-09 19:01:29 +02:00
|
|
|
static int glut_buttons=0;
|
2004-09-10 00:37:48 +02:00
|
|
|
//printf("ViewMouse %i %i %i %i\n",x,y,button,state);
|
2004-06-09 19:01:29 +02:00
|
|
|
int m_mask = 0;
|
|
|
|
if(state == GLUT_DOWN) {
|
2004-09-10 00:37:48 +02:00
|
|
|
KeyMod=glutGetModifiers();
|
|
|
|
if(GLUT_ACTIVE_SHIFT & KeyMod) m_mask |= Trackball::KEY_SHIFT;
|
|
|
|
if(GLUT_ACTIVE_ALT & KeyMod) m_mask |= Trackball::KEY_ALT;
|
|
|
|
if(GLUT_ACTIVE_CTRL & KeyMod) m_mask |= Trackball::KEY_CTRL;
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
glut_buttons |= (1<<button);
|
2004-09-10 00:37:48 +02:00
|
|
|
Q->MouseDown(x, ScreenH-y, glut_buttons | m_mask);
|
2004-06-09 19:01:29 +02:00
|
|
|
} else {
|
2004-09-10 00:37:48 +02:00
|
|
|
if(GLUT_ACTIVE_SHIFT & KeyMod) m_mask |= Trackball::KEY_SHIFT;
|
|
|
|
if(GLUT_ACTIVE_ALT & KeyMod) m_mask |= Trackball::KEY_ALT;
|
|
|
|
if(GLUT_ACTIVE_CTRL & KeyMod) m_mask |= Trackball::KEY_CTRL;
|
|
|
|
glut_buttons |= (1<<button);
|
|
|
|
Q->MouseUp(x, ScreenH-y, glut_buttons | m_mask);
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ViewMouseMotion(int x, int y)
|
|
|
|
{
|
2004-09-30 02:57:42 +02:00
|
|
|
Q->MouseMove(x,ScreenH-y);
|
|
|
|
glutPostRedisplay();
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void SetLight()
|
|
|
|
{
|
|
|
|
GLfloat light_ambient0[] = {0.0, 0.0, 0.0, 1.0};
|
|
|
|
GLfloat light_diffuse0[] = {1.0, 1.0, 1.0, 1.0};
|
|
|
|
GLfloat light_position0[] = {0.0, 10.0, 300.0, 0.0};
|
2004-09-30 02:57:42 +02:00
|
|
|
glLightfv(GL_LIGHT0, GL_POSITION, light_position0);
|
|
|
|
glLightfv(GL_LIGHT0, GL_AMBIENT, light_diffuse0);
|
|
|
|
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse0);
|
|
|
|
glEnable(GL_LIGHT0);
|
2004-09-10 00:37:48 +02:00
|
|
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,light_ambient0);
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ViewInit (void) {
|
|
|
|
SetLight();
|
2004-09-30 02:57:42 +02:00
|
|
|
Q->Reset();
|
2004-09-10 00:37:48 +02:00
|
|
|
Q->radius= 1;
|
2004-06-09 19:01:29 +02:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
2004-09-30 02:57:42 +02:00
|
|
|
glDepthFunc(GL_LEQUAL);
|
|
|
|
glClearColor (0.8, 0.8, 0.8, 0.0);
|
|
|
|
glEnable(GL_NORMALIZE);
|
|
|
|
glEnable(GL_LIGHTING);
|
|
|
|
|
|
|
|
// glEnable(GL_BLEND);
|
|
|
|
glShadeModel(GL_SMOOTH);
|
|
|
|
// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
|
2004-06-09 19:01:29 +02:00
|
|
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
|
|
|
glEnable(GL_CULL_FACE);
|
2004-09-30 02:57:42 +02:00
|
|
|
glCullFace(GL_BACK);
|
2004-06-09 19:01:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv)
|
|
|
|
{
|
2004-09-30 02:57:42 +02:00
|
|
|
if(argc<2) {
|
|
|
|
printf(
|
|
|
|
"shadevis 1.0 \n"__DATE__"\n"
|
|
|
|
"Copyright 2003-2004 Visual Computing Lab I.S.T.I. C.N.R.\n"
|
|
|
|
"Paolo Cignoni (cignoni@isti.cnr.it)\n\n"
|
|
|
|
"Usage: shadevis file.ply [options]\n"
|
|
|
|
"Options:\n"
|
|
|
|
" -w# WindowResolution (default 600)\n"
|
|
|
|
" -n# Sample Directions (default 64)\n"
|
|
|
|
" -z# z offset (default 1e-3)\n"
|
|
|
|
" -c assume that the mesh is closed (slightly faster, default false)\n"
|
|
|
|
" -f Flip normal of the model\n"
|
|
|
|
" -da # Cone Direction Angle in degree (default 180)\n"
|
|
|
|
" -dv # # # Cone Direction vector (default 0 0 1)\n"
|
|
|
|
);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
srand(time(0));
|
2004-06-09 19:01:29 +02:00
|
|
|
int i=1;
|
2004-09-30 02:57:42 +02:00
|
|
|
while(i<argc && (argv[i][0]=='-'))
|
|
|
|
{
|
|
|
|
switch(argv[i][1])
|
|
|
|
{
|
|
|
|
case 'd' :
|
|
|
|
if(argv[i][2] == 'a') {
|
|
|
|
ConeAngleRad = math::ToRad(atof(argv[i+1])); ++i; break;
|
|
|
|
}
|
|
|
|
if(argv[i][2] == 'v') {
|
|
|
|
Point3f p(atof(argv[i+1]),atof(argv[i+2]),atof(argv[i+3]));
|
|
|
|
ConeDir = Normalize(p);
|
|
|
|
i+=3; break;
|
|
|
|
}
|
|
|
|
printf("Error unable to parse option '%s'\n",argv[i]);
|
|
|
|
exit(0);
|
|
|
|
break;
|
|
|
|
case 'n' : SampleNum = atoi(argv[i]+2); break;
|
|
|
|
case 'f' : SwapFlag=false; break;
|
|
|
|
case 'c' : ClosedFlag=true; break;
|
|
|
|
case 'w' : WindowRes= atoi(argv[i]+2);
|
|
|
|
printf("Set WindowRes to %i\n",WindowRes ); break;
|
|
|
|
case 's' : Vis.SplitNum= atoi(argv[i]+2);
|
|
|
|
printf("Set SplitNum to %i\n",Vis.SplitNum ); break;
|
|
|
|
case 'z' : Vis.ZTWIST = atof(argv[i]+2);
|
|
|
|
printf("Set ZTWIST to %f\n",Vis.ZTWIST ); break;
|
|
|
|
default: {
|
|
|
|
printf("Error unable to parse option '%s'\n",argv[i]);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
++i;
|
|
|
|
}
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
|
|
|
|
string basename = argv[i];
|
2004-09-30 02:57:42 +02:00
|
|
|
if(!(basename.substr(basename.length()-4)==".ply")) {
|
|
|
|
printf("Error: Unknown file extension %s\n",basename.c_str());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
// loading original mesh
|
|
|
|
int ret=tri::io::ImporterPLY<AMesh>::Open(m,argv[i]);
|
2005-01-03 14:59:54 +01:00
|
|
|
if(ret) {printf("Error unable to open mesh %s : '%s' \n",argv[i],tri::io::ImporterPLY<AMesh>::ErrorMsg(ret));exit(-1);}
|
2004-06-09 19:01:29 +02:00
|
|
|
tri::UpdateNormals<AMesh>::PerVertexNormalized(m);
|
|
|
|
tri::UpdateBounding<AMesh>::Box(m);
|
2004-09-10 00:37:48 +02:00
|
|
|
tri::UpdateColor<AMesh>::VertexConstant(m,Color4b::White);
|
|
|
|
Vis.IsClosedFlag=ClosedFlag;
|
|
|
|
Vis.Init();
|
|
|
|
UpdateVis();
|
2004-06-09 19:01:29 +02:00
|
|
|
|
2004-09-30 02:57:42 +02:00
|
|
|
printf("Mesh bbox (%f %f %f)-(%f %f %f)\n\n",
|
|
|
|
m.bbox.min[0],m.bbox.min[1],m.bbox.min[2],
|
|
|
|
m.bbox.max[0],m.bbox.max[1],m.bbox.max[2]);
|
2004-06-09 19:01:29 +02:00
|
|
|
|
2004-09-30 02:57:42 +02:00
|
|
|
OutNameMsh=(string(argv[i]).substr(0,strlen(argv[i])-4));
|
|
|
|
OutNameMsh+="_vis.ply";
|
|
|
|
|
|
|
|
printf("Mesh Output filename %s\n",OutNameMsh.c_str());
|
|
|
|
|
|
|
|
printf("Mesh %iv %if bbox Diag %g\n",m.vn,m.fn,m.bbox.Diag());
|
|
|
|
|
|
|
|
glutInit(&argc, argv);
|
|
|
|
|
2004-06-09 19:01:29 +02:00
|
|
|
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
|
|
|
|
glutInitWindowSize(WindowRes, WindowRes);
|
|
|
|
glutInitWindowPosition (10,10);
|
|
|
|
glutCreateWindow ("shadevis - Visual Computing Lab - vcg.isti.cnr.it ");
|
|
|
|
glutDisplayFunc(ViewDisplay);
|
2004-09-30 02:57:42 +02:00
|
|
|
glutReshapeFunc(ViewReshape);
|
|
|
|
glutKeyboardFunc(ViewKey);
|
|
|
|
glutSpecialFunc(ViewSpecialKey);
|
|
|
|
glutMouseFunc(ViewMouse);
|
|
|
|
glutMotionFunc(ViewMouseMotion);
|
|
|
|
|
|
|
|
ViewInit();
|
2004-06-09 19:01:29 +02:00
|
|
|
glewInit();
|
2004-09-30 02:57:42 +02:00
|
|
|
glutMainLoop();
|
|
|
|
|
|
|
|
return(0);
|
2004-09-09 16:35:54 +02:00
|
|
|
}
|