MC_io_obj.cpp
Go to the documentation of this file.00001
00002 #include <MC_string_helper.hpp>
00003 #include <MC_io_obj.hpp>
00004
00005 #include <MC_mesh_index_vector.hpp>
00006 #include <MC_mesh_index_vector_draw.hpp>
00007
00008 namespace mesh_conv
00009 {
00010
00011 std::pair <MC_v3d_vector,MC_connectivity_index> MC_io_obj::read_obj(std::istream& stream)
00012 {
00013
00014 MC_v3d_vector vertices;
00015 MC_connectivity_index connectivity;
00016
00017 if(stream.good()==false)
00018 {std::cout<<"Error in MC_io_off::read_obj(istream), file cannot be read"<<std::endl;exit(-1);}
00019
00020 std::string buffer;
00021 while(stream.good()==true)
00022 {
00023 if(stream.good())
00024 stream>>buffer;
00025
00026
00027 if(buffer=="v")
00028 {
00029 MC_v3d temp;
00030 for(int k_dim=0;k_dim<3;++k_dim){
00031 if(stream.good()){
00032 stream>>buffer;
00033 temp[k_dim]=MC_string_converter::value_of<double>(buffer);
00034 }
00035 }
00036 vertices.add(temp);
00037 }
00038
00039 else if(buffer=="f")
00040 {
00041 MC_int_vector index;
00042
00043
00044 std::getline(stream,buffer);
00045
00046 std::vector<std::string> vec=MC_string_converter::delete_empty(MC_string_tokenizer::tokenize(buffer," "));
00047 for(unsigned int k=0;k<vec.size();++k)
00048 {
00049 std::vector<std::string> poly=MC_string_tokenizer::tokenize(vec[k],"/");
00050
00051
00052 index.add(MC_string_converter::value_of<int>(poly[0])-1);
00053 }
00054 connectivity.add(index);
00055 }
00056 else
00057 std::getline(stream,buffer);
00058 }
00059
00060
00061 return std::make_pair(vertices,connectivity);
00062 }
00063
00064
00065 std::pair <MC_v3d_vector,MC_connectivity_index> MC_io_obj::read_obj_texture(std::istream& stream)
00066 {
00067
00068 MC_v3d_vector tex;
00069 MC_connectivity_index index_texture;
00070
00071 if(stream.good()==false)
00072 {std::cout<<"Error in MC_io_off::read_obj_texture(istream), file cannot be read"<<std::endl;exit(-1);}
00073
00074 std::string buffer;
00075 while(stream.good()==true)
00076 {
00077 if(stream.good())
00078 stream>>buffer;
00079
00080 if(buffer[0]=='#')
00081 std::getline(stream,buffer);
00082 if(buffer=="vt")
00083 {
00084 MC_v3d temp;
00085 for(int k_dim=0;k_dim<2;++k_dim){
00086 if(stream.good()){
00087 stream>>buffer;
00088 temp[k_dim]=MC_string_converter::value_of<double>(buffer);
00089 }
00090 }
00091
00092 tex.add(temp);
00093 }
00094
00095
00096 if(buffer=="f")
00097 {
00098 MC_int_vector index;
00099
00100
00101 std::getline(stream,buffer);
00102
00103 std::vector<std::string> vec=MC_string_converter::delete_empty(MC_string_tokenizer::tokenize(buffer," "));
00104 for(unsigned int k=0;k<vec.size();++k)
00105 {
00106 std::vector<std::string> poly=MC_string_converter::delete_empty(MC_string_tokenizer::tokenize(vec[k],"/"));
00107
00108 if(poly.size()==3)
00109 index.add(MC_string_converter::value_of<int>(poly[1])-1);
00110 else if(vec[k].find("/")!=std::string::npos)
00111 {
00112 poly=MC_string_converter::delete_empty(MC_string_tokenizer::tokenize(vec[k],"/"));
00113 index.add(MC_string_converter::value_of<int>(poly[1])-1);
00114 }
00115 }
00116
00117 index_texture.add(index);
00118 }
00119 }
00120
00121 return std::make_pair(tex,index_texture);
00122 }
00123
00124 std::pair <MC_v3d_vector,MC_connectivity_index> MC_io_obj::read_obj_file(const std::string& string_file)
00125 {
00126 std::ifstream ifile(string_file.c_str());
00127 if(ifile.good()!=true)
00128 {std::cout<<"Error in MC_io_obj::read_obj_file("<<string_file<<"), cannot open the file"<<std::endl;exit(-1);}
00129
00130 std::pair <MC_v3d_vector,MC_connectivity_index> input=MC_io_obj::read_obj(ifile);
00131 return input;
00132 }
00133
00134 std::ostream& MC_io_obj::write_obj(std::ostream& stream,const MC_mesh_index_vector_draw& to_write)
00135 {
00136 bool is_normal=to_write.normal().size()==to_write.vertex_number();
00137 bool is_texture=to_write.texture_connectivity().size()>0;
00138
00139
00140 for(int k=0,N=to_write.vertex_number();k<N;++k)
00141 {
00142 MC_v3d x=to_write.point_set()(k);
00143 stream<<"v "<<x[0]<<" "<<x[1]<<" "<<x[2]<<std::endl;
00144 }
00145
00146 if(is_normal==true)
00147 {
00148 for(int k=0,N=to_write.normal().size();k<N;++k)
00149 {
00150 MC_v3d n=to_write.normal()(k);
00151 stream<<"vn "<<n[0]<<" "<<n[1]<<" "<<n[2]<<std::endl;
00152 }
00153 }
00154
00155 if(is_texture==true)
00156 {
00157 for(int k=0,N=to_write.texture().size();k<N;++k)
00158 {
00159 MC_v3d t=to_write.texture()(k);
00160 stream<<"vt "<<t[0]<<" "<<t[1]<<std::endl;
00161 }
00162 }
00163
00164
00165
00166
00167 for(int k=0,N=to_write.polygon_number();k<N;++k)
00168 {
00169 MC_int_vector index=to_write.connectivity()(k)+1;
00170 stream<<"f ";
00171
00172 if(is_normal==false && is_texture==false)
00173 {
00174 for(int k_v=0,N_v=index.size();k_v<N_v;++k_v)
00175 stream<<index[k_v]<<" ";
00176 }
00177 if(is_normal==true && is_texture==false)
00178 {
00179 for(int k_v=0,N_v=index.size();k_v<N_v;++k_v)
00180 stream<<index[k_v]<<"//"<<index[k_v]<<" ";
00181 }
00182 if(is_normal==false && is_texture==true)
00183 {
00184 MC_int_vector index_texture=to_write.texture_connectivity()(k)+1;
00185 for(int k_v=0,N_v=index.size();k_v<N_v;++k_v)
00186 {
00187 stream<<index[k_v]<<"/"<<index_texture[k_v]<<" ";
00188 }
00189 }
00190 if(is_normal==true && is_texture==true)
00191 {
00192 MC_int_vector index_texture=to_write.texture_connectivity()(k)+1;
00193 for(int k_v=0,N_v=index.size();k_v<N_v;++k_v)
00194 {
00195 stream<<index[k_v]<<"/"<<index_texture[k_v]<<"/"<<index[k_v]<<" ";
00196 }
00197 }
00198
00199 stream<<std::endl;
00200 }
00201 return stream;
00202 }
00203
00204 std::ostream& MC_io_obj::write_obj(std::ostream& stream,const MC_mesh_index_vector& to_write)
00205 {
00206
00207 for(int k=0,N=to_write.vertex_number();k<N;++k)
00208 {
00209 MC_v3d x=to_write.point_set()(k);
00210 stream<<"v "<<x[0]<<" "<<x[1]<<" "<<x[2]<<std::endl;
00211 }
00212
00213 for(int k=0,N=to_write.polygon_number();k<N;++k)
00214 {
00215 MC_int_vector index=to_write.connectivity()(k)+1;
00216 stream<<"f ";
00217 for(int k_v=0,N_v=index.size();k_v<N_v;++k_v)
00218 stream<<index[k_v]<<" ";
00219 stream<<std::endl;
00220 }
00221 return stream;
00222 }
00223
00224
00225 std::pair <MC_v3d_vector,MC_connectivity_index> MC_io_obj::read_obj_texture_file(const std::string& file)
00226 {
00227 std::ifstream fid;
00228 fid.open(file.c_str(),std::ifstream::in);
00229 std::pair <MC_v3d_vector,MC_connectivity_index> tex=read_obj_texture(fid);
00230 fid.close();
00231 return tex;
00232 }
00233
00234
00235
00236 }
00237