From f657ab9c6c64a53626c73cf0791d0171e3c4d120 Mon Sep 17 00:00:00 2001 From: cignoni Date: Wed, 3 Mar 2004 16:11:46 +0000 Subject: [PATCH] First working version (tetrahedron!) --- vcg/complex/trimesh/platonic.h | 1030 ++++++++++++++++---------------- 1 file changed, 512 insertions(+), 518 deletions(-) diff --git a/vcg/complex/trimesh/platonic.h b/vcg/complex/trimesh/platonic.h index 99770800..75064510 100644 --- a/vcg/complex/trimesh/platonic.h +++ b/vcg/complex/trimesh/platonic.h @@ -1,518 +1,512 @@ -/*#*************************************************************************** - * VertexBase.h o o * - * o o * - * Visual Computing Group _ O _ * - * IEI Institute, CNUCE Institute, CNR Pisa \/)\/ * - * /\/| * - * Copyright(C) 1999 by Paolo Cignoni, Claudio Rocchini | * - * All rights reserved. \ * - * * - * Permission to use, copy, modify, distribute and sell this software and * - * its documentation for any purpose is hereby granted without fee, provided * - * that the above copyright notice appear in all copies and that both that * - * copyright notice and this permission notice appear in supporting * - * documentation. the author makes no representations about the suitability * - * of this software for any purpose. It is provided "as is" without express * - * or implied warranty. * - * * - *****************************************************************************/ - -/**************************************************************************** - History - - 2000 Jul 23 First Working release (only the tetrahedron) - 30 Added Octahedron - Aug 4 Added Icosahedron - Nov 22 Added Hexahedron (cube) - 2001 Apr 19 Added HalfOctahedron - 20 Added Square - May 16 Added Sphere Function (CR) (PC) - " Cone " " " - " Box (CR) - Jul 09 Aggiunta Build (CR) -****************************************************************************/ - - -#ifndef __VCGLIB_PLATONIC -#define __VCGLIB_PLATONIC - -#include - -template -void Tetrahedron(MESH_TYPE &in) -{ - in.vn=4; - in.fn=4; - in.vert.clear(); - in.face.clear(); - MESH_TYPE::vertex_type tv;tv.Supervisor_Flags()=0; - MESH_TYPE::vectorial_type tp; - tp=MESH_TYPE::vectorial_type ( 1, 1, 1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (-1, 1,-1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (-1,-1, 1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 1,-1,-1); tv.P()=tp; in.vert.push_back(tv); - - vector index(in.vn); - - MESH_TYPE::face_type f;f.Supervisor_Flags()=0; - - MESH_TYPE::vertex_iterator vi; - int j; - for(j=0,vi=in.vert.begin();j -void Octahedron(MESH_TYPE &in) -{ - in.vn=6; - in.fn=8; - in.vert.clear(); - in.face.clear(); - MESH_TYPE::vertex_type tv;tv.Supervisor_Flags()=0; - MESH_TYPE::vectorial_type tp; - tp=MESH_TYPE::vectorial_type ( 1, 0, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0, 1, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0, 0, 1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (-1, 0, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0,-1, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0, 0,-1); tv.P()=tp; in.vert.push_back(tv); - - vector index(in.vn); - - MESH_TYPE::face_type f;f.Supervisor_Flags()=0; - - MESH_TYPE::vertex_iterator vi; - int j; - for(j=0,vi=in.vert.begin();j -void Icosahedron(MESH_TYPE &in) -{ - MESH_TYPE::scalar_type L=(Sqrt(5.0)+1.0)/2.0; - MESH_TYPE::vectorial_type vv[12]={ - MESH_TYPE::vectorial_type ( 0, L, 1), - MESH_TYPE::vectorial_type ( 0, L,-1), - MESH_TYPE::vectorial_type ( 0,-L, 1), - MESH_TYPE::vectorial_type ( 0,-L,-1), - - MESH_TYPE::vectorial_type ( L, 1, 0), - MESH_TYPE::vectorial_type ( L,-1, 0), - MESH_TYPE::vectorial_type (-L, 1, 0), - MESH_TYPE::vectorial_type (-L,-1, 0), - - MESH_TYPE::vectorial_type ( 1, 0, L), - MESH_TYPE::vectorial_type (-1, 0, L), - MESH_TYPE::vectorial_type ( 1, 0,-L), - MESH_TYPE::vectorial_type (-1, 0,-L) - }; - - int ff[20][3]={ - {1,0,4},{0,1,6},{2,3,5},{3,2,7}, - {4,5,10},{5,4,8},{6,7,9},{7,6,11}, - {8,9,2},{9,8,0},{10,11,1},{11,10,3}, - {0,8,4},{0,6,9},{1,4,10},{1,11,6}, - {2,5,8},{2,9,7},{3,10,5},{3,7,11} - }; - - in.vn=12; - in.fn=20; - in.vert.clear(); - in.face.clear(); - MESH_TYPE::vertex_type tv;tv.Supervisor_Flags()=0; - MESH_TYPE::vectorial_type tp; - for(int i=0;i index(in.vn); - - MESH_TYPE::face_type f;f.Supervisor_Flags()=0; - - MESH_TYPE::vertex_iterator vi; - int j; - for(j=0,vi=in.vert.begin();j -void Hexahedron(MESH_TYPE &in) -{ - in.vn=8; - in.fn=12; - in.vert.clear(); - in.face.clear(); - MESH_TYPE::vertex_type tv;tv.Supervisor_Flags()=0; - MESH_TYPE::vectorial_type tp; - tp=MESH_TYPE::vectorial_type (-1,-1,-1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 1,-1,-1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (-1, 1,-1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 1, 1,-1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (-1,-1, 1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 1,-1, 1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (-1, 1, 1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 1, 1, 1); tv.P()=tp; in.vert.push_back(tv); - - vector index(in.vn); - - MESH_TYPE::face_type f;f.Supervisor_Flags()=0; - - MESH_TYPE::vertex_iterator vi; - int j; - for(j=0,vi=in.vert.begin();j -void HalfOctahedron(MESH_TYPE &in) -{ - in.vn=5; - in.fn=4; - in.vert.clear(); - in.face.clear(); - MESH_TYPE::vertex_type tv;tv.Supervisor_Flags()=0; - MESH_TYPE::vectorial_type tp; - tp=MESH_TYPE::vectorial_type ( 1, 0, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0, 1, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0, 0, 1); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (-1, 0, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0,-1, 0); tv.P()=tp; in.vert.push_back(tv); - - vector index(in.vn); - - MESH_TYPE::face_type f;f.Supervisor_Flags()=0; - - MESH_TYPE::vertex_iterator vi; - int j; - for(j=0,vi=in.vert.begin();j -void Square(MESH_TYPE &in) -{ - in.vn=4; - in.fn=2; - in.vert.clear(); - in.face.clear(); - MESH_TYPE::vertex_type tv;tv.Supervisor_Flags()=0; - MESH_TYPE::vectorial_type tp; - tp=MESH_TYPE::vectorial_type ( 1, 0, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0, 1, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (-1, 0, 0); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type ( 0,-1, 0); tv.P()=tp; in.vert.push_back(tv); - - vector index(in.vn); - - MESH_TYPE::face_type f;f.Supervisor_Flags()=0; - - MESH_TYPE::vertex_iterator vi; - int j; - for(j=0,vi=in.vert.begin();j -void Sphere(MESH_TYPE &in, const int subdiv = 3 ) -{ - Icosahedron(in); - in.ComputeBorderFlag(); - int lastsize = 0; - for(int i=0;i >(in,MidPoint(),0); - MESH_TYPE::vertex_iterator vi; - - for(vi = in.vert.begin()+lastsize;vi!=in.vert.end();++vi) - vi->P().Normalize(); - - lastsize = in.vert.size(); - } -} - - - /// r1 = raggio 1, r2 = raggio2, h = altezza (asse y) -template -void Cone( MESH_TYPE & in, - const MESH_TYPE::scalar_type r1, - const MESH_TYPE::scalar_type r2, - const MESH_TYPE::scalar_type h ) -{ - const int D = 24; - int i,b1,b2; - - if(r1==0 || r2==0) - { - in.vn=D+2; - in.fn=D*2; - } - else - { - in.vn=D*2+2; - in.fn=D*4; - } - - in.vert.clear(); - in.face.clear(); - - MESH_TYPE::vertex_type tv;tv.Supervisor_Flags()=0; - MESH_TYPE::vectorial_type tp; - - tp=MESH_TYPE::vectorial_type ( 0,-h/2,0 ); - tv.P()=tp; - in.vert.push_back(tv); - - tp=MESH_TYPE::vectorial_type ( 0, h/2,0 ); - tv.P()=tp; - in.vert.push_back(tv); - - b1 = b2 = 2; - - if(r1!=0) - { - for(i=0;i index(in.vn); - - MESH_TYPE::face_type f; - f.Supervisor_Flags()=0; - - MESH_TYPE::vertex_iterator vi; - int j; - for(j=0,vi=in.vert.begin();j -void Box(MESH_TYPE &in, const MESH_TYPE::BOX_TYPE & bb ) -{ - in.vn=8; - in.fn=12; - in.vert.clear(); - in.face.clear(); - MESH_TYPE::vertex_type tv;tv.Supervisor_Flags()=0; - MESH_TYPE::vectorial_type tp; - tp=MESH_TYPE::vectorial_type (bb.min[0],bb.min[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (bb.max[0],bb.min[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (bb.min[0],bb.max[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (bb.max[0],bb.max[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (bb.min[0],bb.min[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (bb.max[0],bb.min[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (bb.min[0],bb.max[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); - tp=MESH_TYPE::vectorial_type (bb.max[0],bb.max[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); - - vector index(in.vn); - - MESH_TYPE::face_type f;f.Supervisor_Flags()=0; - - MESH_TYPE::vertex_iterator vi; - int j; - for(j=0,vi=in.vert.begin();j -void Build( M & in, const V & v, const F & f) -{ - in.vn = v.size(); - in.fn = f.size(); - - in.vert.clear(); - in.face.clear(); - - V::const_iterator vi; - - M::vertex_type tv; - tv.Supervisor_Flags()=0; - - for(vi=v.begin();vi!=v.end();++vi) - { - tv.P() = M::vectorial_type( - (M::scalar_type)(*vi).Ext(0), - (M::scalar_type)(*vi).Ext(1), - (M::scalar_type)(*vi).Ext(2) - ); - in.vert.push_back(tv); - } - - vector index(in.vn); - M::vertex_iterator j; - int k; - for(k=0,j=in.vert.begin();j!=in.vert.end();++j,++k) - index[k] = &*j; - - F::const_iterator fi; - - M::face_type ft; - ft.Supervisor_Flags()=0; - - for(fi=f.begin();fi!=f.end();++fi) - { - assert( (*fi)[0]>=0 ); - assert( (*fi)[1]>=0 ); - assert( (*fi)[2]>=0 ); - assert( (*fi)[0] +#include +namespace vcg { +namespace tri { + +template +void Tetrahedron(MESH_TYPE &in) +{ + in.Clear(); + Allocator::AddVertices(in,4); + Allocator::AddFaces(in,4); + + MESH_TYPE::VertexPointer ivp[4]; + + MESH_TYPE::VertexIterator vi=in.vert.begin(); + ivp[0]=&*vi;(*vi).P()=MESH_TYPE::CoordType ( 1, 1, 1); ++vi; + ivp[1]=&*vi;(*vi).P()=MESH_TYPE::CoordType (-1, 1,-1); ++vi; + ivp[2]=&*vi;(*vi).P()=MESH_TYPE::CoordType (-1,-1, 1); ++vi; + ivp[3]=&*vi;(*vi).P()=MESH_TYPE::CoordType ( 1,-1,-1); + + MESH_TYPE::FaceIterator fi=in.face.begin(); + (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[1]; (*fi).V(2)=ivp[2]; ++fi; + (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[2]; (*fi).V(2)=ivp[3]; ++fi; + (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[3]; (*fi).V(2)=ivp[1]; ++fi; + (*fi).V(0)=ivp[3]; (*fi).V(1)=ivp[2]; (*fi).V(2)=ivp[1]; +} + +template +void Octahedron(MESH_TYPE &in) +{ + in.vn=6; + in.fn=8; + in.vert.clear(); + in.face.clear(); + MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; + MESH_TYPE::CoordType tp; + tp=MESH_TYPE::CoordType ( 1, 0, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0, 1, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0, 0, 1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (-1, 0, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0,-1, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0, 0,-1); tv.P()=tp; in.vert.push_back(tv); + + vector index(in.vn); + + MESH_TYPE::face_type f;f.Supervisor_Flags()=0; + + MESH_TYPE::vertex_iterator vi; + int j; + for(j=0,vi=in.vert.begin();j +void Icosahedron(MESH_TYPE &in) +{ + MESH_TYPE::ScalarType L=(Sqrt(5.0)+1.0)/2.0; + MESH_TYPE::CoordType vv[12]={ + MESH_TYPE::CoordType ( 0, L, 1), + MESH_TYPE::CoordType ( 0, L,-1), + MESH_TYPE::CoordType ( 0,-L, 1), + MESH_TYPE::CoordType ( 0,-L,-1), + + MESH_TYPE::CoordType ( L, 1, 0), + MESH_TYPE::CoordType ( L,-1, 0), + MESH_TYPE::CoordType (-L, 1, 0), + MESH_TYPE::CoordType (-L,-1, 0), + + MESH_TYPE::CoordType ( 1, 0, L), + MESH_TYPE::CoordType (-1, 0, L), + MESH_TYPE::CoordType ( 1, 0,-L), + MESH_TYPE::CoordType (-1, 0,-L) + }; + + int ff[20][3]={ + {1,0,4},{0,1,6},{2,3,5},{3,2,7}, + {4,5,10},{5,4,8},{6,7,9},{7,6,11}, + {8,9,2},{9,8,0},{10,11,1},{11,10,3}, + {0,8,4},{0,6,9},{1,4,10},{1,11,6}, + {2,5,8},{2,9,7},{3,10,5},{3,7,11} + }; + + in.vn=12; + in.fn=20; + in.vert.clear(); + in.face.clear(); + MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; + MESH_TYPE::CoordType tp; + for(int i=0;i index(in.vn); + + MESH_TYPE::face_type f;f.Supervisor_Flags()=0; + + MESH_TYPE::vertex_iterator vi; + int j; + for(j=0,vi=in.vert.begin();j +void Hexahedron(MESH_TYPE &in) +{ + in.vn=8; + in.fn=12; + in.vert.clear(); + in.face.clear(); + MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; + MESH_TYPE::CoordType tp; + tp=MESH_TYPE::CoordType (-1,-1,-1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 1,-1,-1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (-1, 1,-1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 1, 1,-1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (-1,-1, 1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 1,-1, 1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (-1, 1, 1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 1, 1, 1); tv.P()=tp; in.vert.push_back(tv); + + vector index(in.vn); + + MESH_TYPE::face_type f;f.Supervisor_Flags()=0; + + MESH_TYPE::vertex_iterator vi; + int j; + for(j=0,vi=in.vert.begin();j +void HalfOctahedron(MESH_TYPE &in) +{ + in.vn=5; + in.fn=4; + in.vert.clear(); + in.face.clear(); + MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; + MESH_TYPE::CoordType tp; + tp=MESH_TYPE::CoordType ( 1, 0, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0, 1, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0, 0, 1); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (-1, 0, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0,-1, 0); tv.P()=tp; in.vert.push_back(tv); + + vector index(in.vn); + + MESH_TYPE::face_type f;f.Supervisor_Flags()=0; + + MESH_TYPE::vertex_iterator vi; + int j; + for(j=0,vi=in.vert.begin();j +void Square(MESH_TYPE &in) +{ + in.vn=4; + in.fn=2; + in.vert.clear(); + in.face.clear(); + MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; + MESH_TYPE::CoordType tp; + tp=MESH_TYPE::CoordType ( 1, 0, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0, 1, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (-1, 0, 0); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType ( 0,-1, 0); tv.P()=tp; in.vert.push_back(tv); + + vector index(in.vn); + + MESH_TYPE::face_type f;f.Supervisor_Flags()=0; + + MESH_TYPE::vertex_iterator vi; + int j; + for(j=0,vi=in.vert.begin();j +void Sphere(MESH_TYPE &in, const int subdiv = 3 ) +{ + Icosahedron(in); + in.ComputeBorderFlag(); + int lastsize = 0; + for(int i=0;i >(in,MidPoint(),0); + MESH_TYPE::vertex_iterator vi; + + for(vi = in.vert.begin()+lastsize;vi!=in.vert.end();++vi) + vi->P().Normalize(); + + lastsize = in.vert.size(); + } +} + + + /// r1 = raggio 1, r2 = raggio2, h = altezza (asse y) +template +void Cone( MESH_TYPE & in, + const typename MESH_TYPE::ScalarType r1, + const typename MESH_TYPE::ScalarType r2, + const typename MESH_TYPE::ScalarType h ) +{ + const int D = 24; + int i,b1,b2; + + if(r1==0 || r2==0) + { + in.vn=D+2; + in.fn=D*2; + } + else + { + in.vn=D*2+2; + in.fn=D*4; + } + + in.vert.clear(); + in.face.clear(); + + MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; + MESH_TYPE::CoordType tp; + + tp=MESH_TYPE::CoordType ( 0,-h/2,0 ); + tv.P()=tp; + in.vert.push_back(tv); + + tp=MESH_TYPE::CoordType ( 0, h/2,0 ); + tv.P()=tp; + in.vert.push_back(tv); + + b1 = b2 = 2; + + if(r1!=0) + { + for(i=0;i index(in.vn); + + MESH_TYPE::face_type f; + f.Supervisor_Flags()=0; + + MESH_TYPE::vertex_iterator vi; + int j; + for(j=0,vi=in.vert.begin();j +void Box(MESH_TYPE &in, const typename MESH_TYPE::BoxType & bb ) +{ + in.vn=8; + in.fn=12; + in.vert.clear(); + in.face.clear(); + MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; + MESH_TYPE::CoordType tp; + tp=MESH_TYPE::CoordType (bb.min[0],bb.min[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (bb.max[0],bb.min[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (bb.min[0],bb.max[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (bb.max[0],bb.max[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (bb.min[0],bb.min[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (bb.max[0],bb.min[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (bb.min[0],bb.max[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); + tp=MESH_TYPE::CoordType (bb.max[0],bb.max[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); + + vector index(in.vn); + + MESH_TYPE::face_type f;f.Supervisor_Flags()=0; + + MESH_TYPE::vertex_iterator vi; + int j; + for(j=0,vi=in.vert.begin();j +void Build( M & in, const V & v, const F & f) +{ + in.vn = v.size(); + in.fn = f.size(); + + in.vert.clear(); + in.face.clear(); + + V::const_iterator vi; + + M::VertexType tv; + tv.Supervisor_Flags()=0; + + for(vi=v.begin();vi!=v.end();++vi) + { + tv.P() = M::CoordType( + (M::ScalarType)(*vi).Ext(0), + (M::ScalarType)(*vi).Ext(1), + (M::ScalarType)(*vi).Ext(2) + ); + in.vert.push_back(tv); + } + + vector index(in.vn); + M::vertex_iterator j; + int k; + for(k=0,j=in.vert.begin();j!=in.vert.end();++j,++k) + index[k] = &*j; + + F::const_iterator fi; + + M::face_type ft; + ft.Supervisor_Flags()=0; + + for(fi=f.begin();fi!=f.end();++fi) + { + assert( (*fi)[0]>=0 ); + assert( (*fi)[1]>=0 ); + assert( (*fi)[2]>=0 ); + assert( (*fi)[0]