MeshLoaderOBJ.cpp
Go to the documentation of this file.00001 /**<!--------------------------------------------------------------------> 00002 @file MeshLoaderOBJ.h 00003 @author Travis Fischer (fisch0920@gmail.com) 00004 @author Matthew Jacobs (jacobs.mh@gmail.com) 00005 @date Spring 2008 00006 00007 @brief 00008 Loads OBJ meshes from an external source ('.obj' file extension). 00009 Wrapper around obj-parser-0.1 00010 <!-------------------------------------------------------------------->**/ 00011 00012 #include "MeshLoaderOBJ.h" 00013 #include <MeshTriangle.h> 00014 #include <Mesh.h> 00015 00016 #include <cstdlib> 00017 #include <cstring> 00018 #include <fstream> 00019 #include <iostream> 00020 00021 bool MeshLoaderOBJ::_load(std::istream &istream, MeshData &data) { 00022 using namespace std::tr1::placeholders; 00023 00024 _data = data; 00025 00026 obj::obj_parser::flags_type obj_parser_flags = 0; 00027 obj_parser_flags |= obj::obj_parser::parse_blank_lines_as_comment; 00028 obj_parser_flags |= obj::obj_parser::triangulate_faces; 00029 obj_parser_flags |= obj::obj_parser::translate_negative_indices; 00030 00031 obj::obj_parser obj_parser(obj_parser_flags); 00032 00033 obj_parser.info_callback(std::tr1::bind(&MeshLoaderOBJ::info_callback, this, data.fileName, _1, _2)); 00034 obj_parser.warning_callback(std::tr1::bind(&MeshLoaderOBJ::warning_callback, this, data.fileName, _1, _2)); 00035 obj_parser.error_callback(std::tr1::bind(&MeshLoaderOBJ::error_callback, this, data.fileName, _1, _2)); 00036 00037 obj_parser.geometric_vertex_callback(std::tr1::bind(&MeshLoaderOBJ::geometric_vertex_callback, this, _1, _2, _3)); 00038 obj_parser.texture_vertex_callback(std::tr1::bind(&MeshLoaderOBJ::texture_vertex_callback, this, _1, _2)); 00039 obj_parser.vertex_normal_callback(std::tr1::bind(&MeshLoaderOBJ::vertex_normal_callback, this, _1, _2, _3)); 00040 obj_parser.face_callbacks( 00041 std::tr1::bind(&MeshLoaderOBJ::triangular_face_geometric_vertices_callback, this, _1, _2, _3), 00042 std::tr1::bind(&MeshLoaderOBJ::triangular_face_geometric_vertices_texture_vertices_callback, this, _1, _2, _3), 00043 std::tr1::bind(&MeshLoaderOBJ::triangular_face_geometric_vertices_vertex_normals_callback, this, _1, _2, _3), 00044 std::tr1::bind(&MeshLoaderOBJ::triangular_face_geometric_vertices_texture_vertices_vertex_normals_callback, this, _1, _2, _3), 00045 NULL, //std::tr1::bind(&MeshLoaderOBJ::quadrilateral_face_geometric_vertices_callback, this, _1, _2, _3, _4), 00046 NULL, //std::tr1::bind(&MeshLoaderOBJ::quadrilateral_face_geometric_vertices_texture_vertices_callback, this, _1, _2, _3, _4), 00047 NULL, //std::tr1::bind(&MeshLoaderOBJ::quadrilateral_face_geometric_vertices_vertex_normals_callback, this, _1, _2, _3, _4), 00048 NULL, //std::tr1::bind(&MeshLoaderOBJ::quadrilateral_face_geometric_vertices_texture_vertices_vertex_normals_callback, this, _1, _2, _3, _4), 00049 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_begin_callback, this, _1, _2, _3), 00050 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_vertex_callback, this, _1), 00051 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_end_callback, this), 00052 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_texture_vertices_begin_callback, this, _1, _2, _3), 00053 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_texture_vertices_vertex_callback, this, _1), 00054 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_texture_vertices_end_callback, this), 00055 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_vertex_normals_begin_callback, this, _1, _2, _3), 00056 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_vertex_normals_vertex_callback, this, _1), 00057 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_vertex_normals_end_callback, this), 00058 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_texture_vertices_vertex_normals_begin_callback, this, _1, _2, _3), 00059 NULL, //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_texture_vertices_vertex_normals_vertex_callback, this, _1), 00060 NULL //std::tr1::bind(&MeshLoaderOBJ::polygonal_face_geometric_vertices_texture_vertices_vertex_normals_end_callback, this) 00061 ); 00062 /*obj_parser.group_name_callback(std::tr1::bind(&MeshLoaderOBJ::group_name_callback, this, _1)); 00063 obj_parser.smoothing_group_callback(std::tr1::bind(&MeshLoaderOBJ::smoothing_group_callback, this, _1)); 00064 obj_parser.object_name_callback(std::tr1::bind(&MeshLoaderOBJ::object_name_callback, this, _1)); 00065 obj_parser.material_library_callback(std::tr1::bind(&MeshLoaderOBJ::material_library_callback, this, _1)); 00066 obj_parser.material_name_callback(std::tr1::bind(&MeshLoaderOBJ::material_name_callback, this, _1)); 00067 obj_parser.comment_callback(std::tr1::bind(&MeshLoaderOBJ::comment_callback, this, _1));*/ 00068 00069 return obj_parser.parse(istream); 00070 } 00071 00072 void MeshLoaderOBJ::info_callback(const std::string &filename, 00073 std::size_t line_number, 00074 const std::string &message) 00075 { 00076 std::cerr << filename << ":" << line_number << ": " << "info: " << message << std::endl; 00077 } 00078 00079 void MeshLoaderOBJ::warning_callback(const std::string &filename, 00080 std::size_t line_number, 00081 const std::string &message) 00082 { 00083 std::cerr << filename << ":" << line_number << ": " << "warning: " << message << std::endl; 00084 } 00085 00086 void MeshLoaderOBJ::error_callback(const std::string &filename, 00087 std::size_t line_number, 00088 const std::string &message) 00089 { 00090 std::cerr << filename << ":" << line_number << ": " << "error: " << message << std::endl; 00091 } 00092 00093 void MeshLoaderOBJ::geometric_vertex_callback(obj::float_type x, 00094 obj::float_type y, 00095 obj::float_type z) 00096 { 00097 //(*ostream_) << "v " << x << " " << y << " " << z << "\n"; 00098 _data.vertices.push_back(Vertex(x, y, z)); 00099 } 00100 00101 void MeshLoaderOBJ::texture_vertex_callback(obj::float_type u, 00102 obj::float_type v) 00103 { 00104 //(*ostream_) << "vt " << u << " " << v << "\n"; 00105 _data.uvs.push_back(UV(u, v)); 00106 } 00107 00108 void MeshLoaderOBJ::vertex_normal_callback(obj::float_type x, 00109 obj::float_type y, 00110 obj::float_type z) 00111 { 00112 //(*ostream_) << "vn " << x << " " << y << " " << z << "\n"; 00113 _data.normals.push_back(Vector3(x, y, z)); 00114 } 00115 00116 void MeshLoaderOBJ::triangular_face_geometric_vertices_callback(obj::index_type v1, 00117 obj::index_type v2, 00118 obj::index_type v3) 00119 { 00120 //(*ostream_) << "f " << v1 << " " << v2 << " " << v3 << "\n"; 00121 _data.triangles.push_back(MeshTriangle(v1 - 1, v2 - 1, v3 - 1)); 00122 00123 ASSERT(_data.triangles[_data.triangles.size() - 1].A == (unsigned) v1 - 1); 00124 ASSERT(_data.triangles[_data.triangles.size() - 1].B == (unsigned) v2 - 1); 00125 ASSERT(_data.triangles[_data.triangles.size() - 1].C == (unsigned) v3 - 1); 00126 } 00127 00128 void MeshLoaderOBJ::triangular_face_geometric_vertices_texture_vertices_callback(const obj::index_2_tuple_type &v1_vt1, 00129 const obj::index_2_tuple_type &v2_vt2, 00130 const obj::index_2_tuple_type &v3_vt3) 00131 { 00132 //texture_vertex_callback(tr1::get<0>(v1_vt1), tr1::get<0>(v2_vt2), tr1::get<0>(v3_vt3)); 00133 //triangular_face_geometric_vertices_callback(tr1::get<0>(v1_vt1), tr1::get<0>(v2_vt2), tr1::get<0>(v3_vt3)); 00134 NYI(); 00135 00136 _data.triangles.push_back(MeshTriangle(tr1::get<0>(v1_vt1) - 1, tr1::get<0>(v2_vt2) - 1, tr1::get<0>(v3_vt3) - 1, 00137 0, 0, 0, 00138 tr1::get<1>(v1_vt1) - 1, tr1::get<1>(v2_vt2) - 1, tr1::get<1>(v3_vt3) - 1)); 00139 00140 ASSERT(_data.triangles[_data.triangles.size() - 1].A == (unsigned) tr1::get<0>(v1_vt1) - 1); 00141 ASSERT(_data.triangles[_data.triangles.size() - 1].B == (unsigned) tr1::get<0>(v2_vt2) - 1); 00142 ASSERT(_data.triangles[_data.triangles.size() - 1].C == (unsigned) tr1::get<0>(v2_vt2) - 1); 00143 } 00144 00145 void MeshLoaderOBJ::triangular_face_geometric_vertices_vertex_normals_callback(const obj::index_2_tuple_type &v1_vn1, 00146 const obj::index_2_tuple_type &v2_vn2, 00147 const obj::index_2_tuple_type &v3_vn3) 00148 { 00149 _data.triangles.push_back(MeshTriangle(tr1::get<0>(v1_vn1) - 1, tr1::get<0>(v2_vn2) - 1, tr1::get<0>(v3_vn3) - 1, 00150 tr1::get<1>(v1_vn1) - 1, tr1::get<1>(v2_vn2) - 1, tr1::get<1>(v3_vn3) - 1)); 00151 } 00152 00153 void MeshLoaderOBJ::triangular_face_geometric_vertices_texture_vertices_vertex_normals_callback(const obj::index_3_tuple_type &v1_vt1_vn1, 00154 const obj::index_3_tuple_type &v2_vt2_vn2, 00155 const obj::index_3_tuple_type &v3_vt3_vn3) 00156 { 00157 _data.triangles.push_back(MeshTriangle(tr1::get<0>(v1_vt1_vn1) - 1, tr1::get<0>(v2_vt2_vn2) - 1, tr1::get<0>(v3_vt3_vn3) - 1, 00158 tr1::get<2>(v1_vt1_vn1) - 1, tr1::get<2>(v2_vt2_vn2) - 1, tr1::get<2>(v3_vt3_vn3) - 1, 00159 tr1::get<1>(v1_vt1_vn1) - 1, tr1::get<1>(v2_vt2_vn2) - 1, tr1::get<1>(v3_vt3_vn3) - 1)); 00160 } 00161
Generated on 28 Feb 2009 for Milton by
1.5.6