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 doxygen 1.5.6