00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00046
00047
00048
00049
00050
00051
00052 #define OPENMESH_DECIMATER_MODPROGMESH_CC
00053
00054
00055
00056
00057 #include <vector>
00058 #include <fstream>
00059
00060 #include <OpenMesh/Core/Utils/vector_cast.hh>
00061 #include <OpenMesh/Core/IO/BinaryHelper.hh>
00062 #include <OpenMesh/Core/Utils/Endian.hh>
00063
00064 #include <OpenMesh/Tools/Decimater/ModProgMeshT.hh>
00065
00066
00067
00068
00069 namespace OpenMesh {
00070 namespace Decimater {
00071
00072
00073
00074
00075
00076
00077 template <class DecimaterType>
00078 bool
00079 ModProgMeshT<DecimaterType>::
00080 write( const std::string& _ofname )
00081 {
00082
00083 size_t i=0, N=Base::mesh().n_vertices(), n_base_vertices(0), n_base_faces(0);
00084 std::vector<typename Mesh::VertexHandle> vhandles(N);
00085
00086
00087
00088 typename Mesh::VertexIter
00089 v_it=Base::mesh().vertices_begin(),
00090 v_end=Base::mesh().vertices_end();
00091
00092 for (; v_it != v_end; ++v_it)
00093 if (!Base::mesh().status(v_it).deleted())
00094 {
00095 vhandles[i] = v_it.handle();
00096 Base::mesh().property( idx_, v_it ) = i;
00097 ++i;
00098 }
00099 n_base_vertices = i;
00100
00101
00102
00103 typename InfoList::reverse_iterator
00104 r_it=pmi_.rbegin(), r_end=pmi_.rend();
00105
00106 for (; r_it!=r_end; ++r_it)
00107 {
00108 vhandles[i] = r_it->v0;
00109 Base::mesh().property( idx_, r_it->v0) = i;
00110 ++i;
00111 }
00112
00113
00114
00115 typename Mesh::ConstFaceIter f_it = Base::mesh().faces_begin(),
00116 f_end = Base::mesh().faces_end();
00117 for (; f_it != f_end; ++f_it)
00118 if (!Base::mesh().status(f_it).deleted())
00119 ++n_base_faces;
00120
00121
00122
00123 std::ofstream out( _ofname.c_str(), std::ios::binary );
00124
00125 if (!out)
00126 return false;
00127
00128
00129 bool swap = Endian::local() != Endian::LSB;
00130
00131
00132 out << "ProgMesh";
00133 IO::store( out, n_base_vertices, swap );
00134 IO::store( out, n_base_faces , swap );
00135 IO::store( out, pmi_.size() , swap );
00136
00137 Vec3f p;
00138
00139
00140 for (i=0; i<n_base_vertices; ++i)
00141 {
00142 assert (!Base::mesh().status(vhandles[i]).deleted());
00143 p = vector_cast< Vec3f >( Base::mesh().point(vhandles[i]) );
00144
00145 IO::store( out, p, swap );
00146 }
00147
00148
00149
00150 for (f_it=Base::mesh().faces_begin(); f_it != f_end; ++f_it)
00151 {
00152 if (!Base::mesh().status(f_it).deleted())
00153 {
00154 typename Mesh::ConstFaceVertexIter fv_it(Base::mesh(), f_it.handle());
00155
00156 IO::store( out, Base::mesh().property( idx_, fv_it ) );
00157 IO::store( out, Base::mesh().property( idx_, ++fv_it ) );
00158 IO::store( out, Base::mesh().property( idx_, ++fv_it ) );
00159 }
00160 }
00161
00162
00163
00164 for (r_it=pmi_.rbegin(); r_it!=r_end; ++r_it)
00165 {
00166
00167 IO::store( out, vector_cast<Vec3f>(Base::mesh().point(r_it->v0)));
00168 IO::store( out, Base::mesh().property( idx_, r_it->v1 ) );
00169 IO::store( out,
00170 r_it->vl.is_valid() ? Base::mesh().property(idx_, r_it->vl) : -1 );
00171 IO::store( out,
00172 r_it->vr.is_valid() ? Base::mesh().property(idx_, r_it->vr) : -1 );
00173 }
00174
00175 return true;
00176 }
00177
00178
00179
00180
00181 }
00182 }
00183
00184