some modifications

This commit is contained in:
Nico Pietroni 2004-12-21 17:38:42 +00:00
parent c618354a24
commit dcfa1f4bad
7 changed files with 722 additions and 324 deletions

View File

@ -15,9 +15,9 @@ int main( int argc, char ** argv )
s=new Segmentator();
//s->LoadFromDir("./venacava/","prova.txt");//to chANGE
//s->InitSegmentation(0.5,0.2,20,10.f);
//
QApplication a( argc, argv );
SegmentForm w;
@ -26,12 +26,19 @@ int main( int argc, char ** argv )
//assign pointer to pricipal form
w.simpleGLWidget1->w=&w;
#ifdef _TORUS
w.simpleGLWidget1->SetExtractionParameters();
s->BBox().min=Point3f(0.f,0.f,0.f);
s->BBox().max=Point3f(300.f,300.f,300.f);
s->InitSegmentation(Point3f(0.f,100.f,0.f));
#endif
/*s=new Segmentator();*/
//s->LoadFromDir("./venacava/","prova.txt");//to chANGE
//s->InitSegmentation(0.5,0.2,20,10.f);
////s->InitSegmentation(0.5,0.2,20,10.f);
//w.simpleGLWidget1->path="./venacava/";
timer = new QTimer(w.simpleGLWidget1 );
QTimer::connect( timer, SIGNAL(timeout()), w.simpleGLWidget1, SLOT(Update()) );

View File

@ -0,0 +1,202 @@
/****************************************************************************
* 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 $
Revision 1.6 2004/05/14 00:34:36 ganovelli
header added
****************************************************************************/
#ifndef __VCG_MINDISTPOINT
#define __VCG_MINDISTPOINT
#include <math.h>
#include <vcg/space/point3.h>
#include <vcg/space/box3.h>
#include <vcg/space/point4.h>
#include <vcg/math/base.h>
#include <vcg/space/index/grid_static_ptr.h>
using namespace vcg;
/*
aka MetroCore
data una mesh m e una ug sulle sue facce trova il punto di m piu' vicino ad
un punto dato.
*/
// input: mesh, punto, griglia, distanza limite
// output: normale alla faccia e punto piu' vicino su di essa
// Nota che il parametro template GRID non ci dovrebbe essere, visto che deve essere
// UGrid<MESH::FaceContainer >, ma non sono riuscito a definirlo implicitamente
template <class MESH, class GRID, class SCALAR>
void MinDistPoint( MESH & mesh, const Point3<SCALAR> & p, GRID & gr, SCALAR & mdist,
Point3<SCALAR> & normf, Point3<SCALAR> & bestq, typename MESH::FaceType * &f, Point3<SCALAR> &ip)
{
typedef SCALAR scalar;
typedef Point3<scalar> Point3x;
typedef Box3<SCALAR> Box3x;
if(!gr.bbox.IsIn(p)) return;
typedef typename GridStaticPtr<typename MESH::FaceContainer>::Link A2UGridLink;
scalar ax = p[0] - gr.bbox.min[0]; // Real coodinate of point refer to
scalar ay = p[1] - gr.bbox.min[1];
scalar az = p[2] - gr.bbox.min[2];
int gx = int( ax/gr.voxel[0] ); // Integer coordinate of the point
int gy = int( ay/gr.voxel[1] ); // voxel
int gz = int( az/gr.voxel[2] );
scalar vx = gr.bbox.min[0]+gx*gr.voxel[0]; // Real world coordinate of the Voxel
scalar vy = gr.bbox.min[1]+gy*gr.voxel[1]; // origin
scalar vz = gr.bbox.min[2]+gz*gr.voxel[2];
scalar dx = math::Min(p[0] - vx, vx+gr.voxel[0]-p[0]); // Dist from the voxel
scalar dy = math::Min(p[1] - vy, vy+gr.voxel[1]-p[1]);
scalar dz = math::Min(p[2] - vz, vz+gr.voxel[2]-p[2]);
scalar vdist,vstep;
if(dx<dy && dx<dz)
{
vdist = dx;
vstep = gr.voxel[0];
}
else if(dy<dz)
{
vdist = dy;
vstep = gr.voxel[1];
}
else
{
vdist = dz;
vstep = gr.voxel[2];
}
//scalar error = gr.bbox.SquaredDiag();
//scalar error = gr.bbox.Diag();
scalar error = mdist;
Point3x q;
typename MESH::FaceIterator bestf = (typename MESH::FaceIterator)0;
mesh.UnMarkAll();
int mxsd = gr.siz[0];
if(mxsd<gr.siz[1]) mxsd = gr.siz[1];
if(mxsd<gr.siz[2]) mxsd = gr.siz[2];
for(int s=0;s<mxsd;++s)
{
if(s==0)
{
A2UGridLink *first, *last, *l;
gr.Grid( gx, gy, gz, first, last );
for(l=first;l!=last;++l)
if( ! mesh.IsMarked( &*(l->Elem())) )
{
if( Dist((*(l->Elem())), p, error, q) )
{
bestq = q;
bestf = l->Elem();
typename MESH::ScalarType alfa=1, beta=1, gamma=1;
//bestf->InterpolationParameters(q, alfa, beta);
//calcolo normale con interpolazione trilineare
/*normf = (1-(alfa+beta))*(bestf->V(0)->Normal())+
(alfa*(bestf->V(1)->Normal()))+
(beta*(bestf->V(2)->Normal()));*/
bool ret=bestf->InterpolationParameters(q, alfa, beta, gamma);
//assert(ret);
normf = (bestf->V(0)->cN())*alfa+
(bestf->V(1)->cN())*beta+
(bestf->V(2)->cN())*gamma;
normf.Normalize();
ip[0]=alfa;ip[1]=beta;ip[2]=gamma;
}
mesh.Mark( &*(l->Elem()) );
}
}
else
{
for(int ix=gx-s;ix<=gx+s;++ix)
if( ix>=0 && ix<gr.siz[0] )
{
for(int iy=gy-s;iy<=gy+s;++iy)
if( iy>=0 && iy<gr.siz[1] )
{
int sz = ( ix==gx-s || ix==gx+s ||
iy==gy-s || iy==gy+s )?1:2*s;
for(int iz=gz-s;iz<=gz+s;iz+=sz)
if( iz>=0 && iz<gr.siz[2] )
{
A2UGridLink *first, *last, *l;
gr.Grid( ix, iy, iz, first, last );
for(l=first;l!=last;++l)
if( ! mesh.IsMarked( &*(l->Elem())) )
{
if( Dist((*(l->Elem())), p, error, q) )
{
bestq = q;
bestf = l->Elem();
typename MESH::ScalarType alfa, beta, gamma;
//bestf->InterpolationParameters(q, alfa, beta);
//calcolo normale con interpolazione trilineare
bestf->InterpolationParameters(q, alfa, beta, gamma);
normf = (bestf->V(0)->cN())*alfa+
(bestf->V(1)->cN())*beta+
(bestf->V(2)->cN())*gamma ;
ip[0]=alfa;ip[1]=beta;ip[2]=gamma;
//normf.Normalize(); inutile si assume le normali ai vertici benfatte
}
mesh.Mark(&*l->Elem());
}
}
}
}
}
if( fabs(error)<vdist )
break;
vdist += vstep;
}
f=&*bestf;
mdist = scalar(fabs(error));
}
template <class MESH, class GRID, class SCALAR>
void MinDistPoint( MESH & mesh, const Point3<SCALAR> & p, GRID & gr, SCALAR & mdist,
Point3<SCALAR> & normf, Point3<SCALAR> & bestq, typename MESH::face_type * &f)
{
Point3<SCALAR> ip;
MinDistPoint(mesh,p,gr,mdist,normf,bestq,f,ip);
}
#endif

View File

@ -0,0 +1,29 @@
TEMPLATE = app
LANGUAGE = C++
CONFIG += qt warn_on release
FORMS = segmentform.ui
unix {
UI_DIR = .ui
MOC_DIR = .moc
OBJECTS_DIR = .obj
}

View File

@ -234,6 +234,21 @@ private:
return (MyTriMesh::CoordType(x,y,z));
}
#ifdef _TORUS
///torus version
float getColor(MyTriMesh::CoordType p)
{
static float ray=100.f;
static float diameter=20.f;
Point3f center=BBox().Center();
float dist=(p-center).Norm();
float difference=abs(ray-dist);
if(difference<diameter)
return 100.f;
else
return (100.f+difference*5.f);
}
#else
///return integer coordinete in volumetric dataset
float getColor(MyTriMesh::CoordType p)
{
@ -262,6 +277,7 @@ private:
return color;
}
#endif
///maximixe the gradient of the movement
MyTriMesh::CoordType Gradient(MyTriMesh::CoordType p,float h=0.01f)
@ -307,13 +323,11 @@ private:
///return true if a coordinate is out of limits
bool OutOfLimits(MyTriMesh::CoordType p)
{
/*Point3f max=Scale(MapToSpace(V.Max()));
Point3f min=Scale(MapToSpace(V.Min()));
Point3f test=(Scale(p));*/
Point3f test=p;
Point3f max=UnScale(MapToSpace(V.Max()));
Point3f min=UnScale(MapToSpace(V.Min()));
/*Point3f max=UnScale(MapToSpace(V.Max()));
Point3f min=UnScale(MapToSpace(V.Min()));*/
Point3f max=BBox().max;//last change
Point3f min=BBox().min;//last change
for (int i=0;i<3;i++)
{
if(((test.V(i)>=max.V(i))||(test.V(i)<=min.V(i))))
@ -430,6 +444,7 @@ MyTriMesh::CoordType GradientFactor(MyTriMesh::VertexType *v)
}
///add the external forces to the deformable mesh
void AddExtForces()
{
Part_VertexContainer::iterator vi;
@ -682,8 +697,10 @@ void SetSegmentParameters(int color,int tol,float Mass=0.5f,float K_elanst=0.2f,
time_stamp=Time_stamp;
k_dihedral=Dihedral;
scale=ScaleFactor;
bbox=vcg::Box3<float>(UnScale(MapToSpace(V.Min())),(UnScale(MapToSpace(V.Max()))));//last change!
}
///init the segmentation of the mesh
void InitSegmentation(MyTriMesh::CoordType b)
{
@ -708,8 +725,6 @@ void InitSegmentation(MyTriMesh::CoordType b)
ReinitPhysicMesh();
CollDet->Init(bbox.min,bbox.max,5.f);
}
///return the bounding box of the mesh
@ -740,7 +755,7 @@ void Step(float t,float _edge_size)
void Smooth()
{
ScaleLaplacianSmooth<MyTriMesh>(m,2,0.5);
ScaleLaplacianSmooth<MyTriMesh>(m,1,0.5);
}
void AutoStep()

View File

@ -30,30 +30,6 @@
<property name="title">
<string></string>
</property>
<widget class="QPushButton">
<property name="name">
<cstring>SlidesButton</cstring>
</property>
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>80</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Slides</string>
</property>
<property name="toggleButton">
<bool>true</bool>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>ResultButton</cstring>
@ -150,6 +126,30 @@
<bool>true</bool>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>SlidesButton</cstring>
</property>
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>80</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Slides</string>
</property>
<property name="toggleButton">
<bool>true</bool>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>WireButton</cstring>
@ -196,243 +196,6 @@
<property name="title">
<string></string>
</property>
<widget class="QPushButton">
<property name="name">
<cstring>SaveButton</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>560</y>
<width>140</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>SavePly</string>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>SmoothButton</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>520</y>
<width>140</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="cursor">
<cursor>1</cursor>
</property>
<property name="text">
<string>Smooth</string>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>SegmentButton</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>480</y>
<width>141</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Extract</string>
</property>
<property name="toggleButton">
<bool>true</bool>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>Color</cstring>
</property>
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>390</y>
<width>70</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="frameShape">
<enum>LineEditPanel</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="text">
<string></string>
</property>
<property name="cursorPosition">
<number>0</number>
</property>
</widget>
<widget class="QLabel">
<property name="name">
<cstring>textLabel1_2_2_2_2</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>370</y>
<width>116</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>color</string>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>Tolerance</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>330</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>10</string>
</property>
<property name="cursorPosition">
<number>2</number>
</property>
</widget>
<widget class="QLabel">
<property name="name">
<cstring>textLabel1_2_2_2</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>310</y>
<width>116</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>tolerance</string>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>E_size</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>270</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>4</string>
</property>
<property name="cursorPosition">
<number>1</number>
</property>
</widget>
<widget class="QLabel">
<property name="name">
<cstring>textLabel1_2_2</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>250</y>
<width>116</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>minimum edge size</string>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>T_step</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>210</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>0.2</string>
</property>
<property name="cursorPosition">
<number>3</number>
</property>
</widget>
<widget class="QLabel">
<property name="name">
<cstring>textLabel1_2</cstring>
@ -598,27 +361,6 @@
<string>mass of particles</string>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>ApplyButton</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>440</y>
<width>141</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Apply</string>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>ClearButton</cstring>
@ -626,7 +368,7 @@
<property name="geometry">
<rect>
<x>30</x>
<y>600</y>
<y>700</y>
<width>141</width>
<height>31</height>
</rect>
@ -640,6 +382,315 @@
<string>Clear</string>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>SaveButton</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>660</y>
<width>140</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>SavePly</string>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>SmoothButton</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>620</y>
<width>140</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="cursor">
<cursor>1</cursor>
</property>
<property name="text">
<string>Smooth</string>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>SegmentButton</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>580</y>
<width>141</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Extract</string>
</property>
<property name="toggleButton">
<bool>true</bool>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>ApplyButton</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>540</y>
<width>141</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Apply</string>
</property>
</widget>
<widget class="QLabel">
<property name="name">
<cstring>textLabel1_2_2_2_3</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>300</y>
<width>140</width>
<height>50</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Slide dinstance (pixel)</string>
</property>
</widget>
<widget class="QLabel">
<property name="name">
<cstring>textLabel1_2_2</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>250</y>
<width>116</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>minimum edge size</string>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>S_dist</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>340</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>1</string>
</property>
<property name="cursorPosition">
<number>1</number>
</property>
</widget>
<widget class="QLabel">
<property name="name">
<cstring>textLabel1_2_2_2</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>380</y>
<width>116</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>tolerance</string>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>Tolerance</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>400</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>10</string>
</property>
<property name="cursorPosition">
<number>2</number>
</property>
</widget>
<widget class="QLabel">
<property name="name">
<cstring>textLabel1_2_2_2_2</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>440</y>
<width>116</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>color</string>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>Color</cstring>
</property>
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>460</y>
<width>70</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="frameShape">
<enum>LineEditPanel</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="text">
<string></string>
</property>
<property name="cursorPosition">
<number>0</number>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>E_size</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>270</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>4</string>
</property>
<property name="cursorPosition">
<number>1</number>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>T_step</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>210</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="frameShape">
<enum>LineEditPanel</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="text">
<string>0.2</string>
</property>
<property name="cursorPosition">
<number>3</number>
</property>
</widget>
</widget>
<widget class="SimpleGLWidget">
<property name="name">
@ -648,7 +699,7 @@
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<y>50</y>
<width>1030</width>
<height>880</height>
</rect>

View File

@ -1,6 +1,7 @@
#include <SimpleGLWidget.h>
#include <qlineedit.h>
#include <qfiledialog.h>
#include <qimage.h>
#include <qdir.h>
#include <qmessagebox.h>
@ -23,6 +24,7 @@ QGLWidget(parent, name)
Track.Reset();
Track.radius= 100;
zoom=1;
path="";
}
void SimpleGLWidget::SaveMatrix()
@ -40,35 +42,102 @@ void SimpleGLWidget::LoadMatrix()
glLoadMatrixd(modelMatrix);
}
//load as texture the i jpg of the directory
void SimpleGLWidget::LoadTexture(QString p,int level)
{
QImage qI=QImage();
QDir Qd=QDir(p);
QString qformat;
QString Path=QString(p);
Qd.setNameFilter("*.jpg");
Qd.setSorting(QDir::Name);
QString PathFile=Path;
PathFile.append(Qd[level]);
bool b=qI.load(PathFile,qformat);
QImage tx = QGLWidget::convertToGLFormat (qI);
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
glTexImage2D( GL_TEXTURE_2D, 0, 3, tx.width(), tx.height(), 0,GL_RGBA, GL_UNSIGNED_BYTE, tx.bits() );
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
}
void SimpleGLWidget::drawSlide()
{
glBegin(GL_QUADS);
for (int x=0;x<((s->V.dimX())-1);x++)
for (int y=0;y<((s->V.dimY())-1);y++)
{
glPushAttrib(GL_ALL_ATTRIB_BITS);
glPolygonMode(GL_FRONT,GL_FILL);
glMatrixMode (GL_TEXTURE);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glEnable(GL_NORMALIZE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
float dx=s->BBox().DimX();
float dy=s->BBox().DimY();
//to change take scale from segmentator.. better!
float n=atof(w->S_dist->text());
float level=((float)_numslide)*n;
Point3f p0=s->BBox().min;
p0+=Point3f(0.f,0.f,level);
Point3f p1=p0+Point3f(dx,0.f,0.f);
Point3f p2=p0+Point3f(dx,dy,0.f);
Point3f p3=p0+Point3f(0.f,dy,0.f);
glColor3d(1,1,1);
///texture
//_numslide
glBegin(GL_QUADS);
glNormal(Point3d(0,0,1));
Point3<int> p0=Point3<int>(x,y,_numslide);
double color=((double)s->V.getAt(p0))/256.f;
glColor3d(color,color,color);
glTexCoord(Point3f(0,1,0));
glVertex(p0);
Point3<int> p1=Point3<int>(x+1,y,_numslide);
color=((double)s->V.getAt(p1))/256.f;
glColor3d(color,color,color);
glTexCoord(Point3f(1,1,0));
glVertex(p1);
Point3<int> p2=Point3<int>(x+1,y+1,_numslide);
color=((double)s->V.getAt(p2))/256.f;
glColor3d(color,color,color);
glTexCoord(Point3f(1,0,0));
glVertex(p2);
Point3<int> p3=Point3<int>(x,y+1,_numslide);
color=((double)s->V.getAt(p3))/256.f;
glColor3d(color,color,color);
glTexCoord(Point3f(0,0,0));
glVertex(p3);
}
glEnd();
glEnd();
glPopAttrib();
//glBegin(GL_QUADS);
//for (int x=0;x<((s->V.dimX())-1);x++)
// for (int y=0;y<((s->V.dimY())-1);y++)
// {
// glNormal(Point3d(0,0,1));
// Point3<int> p0=Point3<int>(x,y,_numslide);
// double color=((double)s->V.getAt(p0))/256.f;
// glColor3d(color,color,color);
// glVertex(p0);
//
// Point3<int> p1=Point3<int>(x+1,y,_numslide);
// color=((double)s->V.getAt(p1))/256.f;
// glColor3d(color,color,color);
// glVertex(p1);
//
// Point3<int> p2=Point3<int>(x+1,y+1,_numslide);
// color=((double)s->V.getAt(p2))/256.f;
// glColor3d(color,color,color);
// glVertex(p2);
//
// Point3<int> p3=Point3<int>(x,y+1,_numslide);
// color=((double)s->V.getAt(p3))/256.f;
// glColor3d(color,color,color);
// glVertex(p3);
// }
//glEnd();
}
void drawForces(Segmentator::Part_VertexContainer *pv,int typeForce)
@ -115,8 +184,8 @@ void SimpleGLWidget::Save()
"Choose a filename to save under" );
if (filename!=NULL)
{
const char *path=filename.ascii();
vcg::tri::io::ExporterPLY<Segmentator::MyTriMesh>::Save(s->m,path);
const char *path_save=filename.ascii();
vcg::tri::io::ExporterPLY<Segmentator::MyTriMesh>::Save(s->m,path_save);
}
}
@ -202,7 +271,7 @@ void SimpleGLWidget::glDraw(){
Track.GetView();
Track.Apply();
Track.Draw();
glScalef(1/s->BBox().Diag(),1/s->BBox().Diag(),1/s->BBox().Diag());
glScalef(1.f/s->BBox().Diag(),1.f/s->BBox().Diag(),1.f/s->BBox().Diag());
glScalef(GLfloat(zoom),GLfloat(zoom),GLfloat(zoom));
glTranslate(-p);
//save transformation matrixes
@ -240,6 +309,7 @@ void SimpleGLWidget::glDraw(){
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glDisable(GL_TEXTURE_2D);
Segmentator::MyTriMesh::FaceIterator fi;
@ -292,9 +362,14 @@ void SimpleGLWidget::OpenDirectory()
if (filename!=NULL)
{
filename+="/";
const char *path=filename.ascii();
char *p=(char*)path;
path=filename;
const char *pa=filename.ascii();
char *p=(char*)pa;
s->LoadFromDir(p,"prova.txt");
LoadTexture(p,0);
_showslides=true;
w->SlidesButton->setOn(true);
repaint();
}
}
@ -340,7 +415,8 @@ void SimpleGLWidget::mousePressEvent ( QMouseEvent * e )
//w->Color->text()=color;
SetExtractionParameters();
//s->SetInitialBarycenter(Point3f(x,y,_numslide));
s->InitSegmentation(Point3f(x,y,_numslide));
//s->InitSegmentation(Point3f(x,y,_numslide));
s->InitSegmentation(Point3f(x,y,z));
repaint();
}
//vcg::tri::UpdateBounding<Segmentator::MyTriMesh>::Box(s->m);
@ -359,6 +435,10 @@ void SimpleGLWidget::wheelEvent(QWheelEvent *e)
_numslide+=e->delta()/120.f;
if ((_numslide<0)||(_numslide>=s->V.dimZ()))
_numslide=oldnum;
if (s!=0)
{
LoadTexture(path,_numslide);
}
}
repaint();

View File

@ -8,6 +8,7 @@
#include <vcg/complex/trimesh/update/bounding.h>
#include <wrap/io_trimesh/export_ply.h>
#include <segmentform.h>
#include <qpushbutton.h>
class SimpleGLWidget: public QGLWidget{
@ -29,10 +30,12 @@ private :
bool intForces;
bool resultForces;
bool continue_int;
GLuint texName;
//vcg::GlTrimesh<Segmentator::MyTriMesh> *Wrap;
public:
QString path;
SegmentForm *w;
SimpleGLWidget( QWidget * parent = 0, const char * name = 0, const QGLWidget * shareWidget = 0, WFlags f = 0 );
@ -48,6 +51,7 @@ public:
virtual void SaveMatrix();
virtual void Save();
void LoadMatrix();
void LoadTexture(QString path,int level);
void drawSlide();
void SmoothMesh();
void Step();
@ -121,6 +125,16 @@ public:
void Extract()
{
continue_int=!continue_int;
if (continue_int)
{
_showslides=false;
w->SlidesButton->setOn(false);
}
else
{
_showslides=true;
w->SlidesButton->setOn(true);
}
}
void Update()