Ignore:
Timestamp:
01/02/14 20:52:34 (11 years ago)
Author:
epyon
Message:
  • universal mesh format
  • removed keyframed_mesh_data
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/formats/obj_loader.cc

    r204 r224  
    119119struct mesh_obj_reader : public obj_reader
    120120{
    121         mesh_obj_reader( mesh* m ) : m_position( nullptr ), m_normal( nullptr ), m_tex_coord( nullptr ), m_tangent( nullptr ), m_mesh( m ) {}
     121        mesh_obj_reader( mesh_data_creator* m ) : m_mesh( m ) {}
    122122        virtual std::size_t add_face( uint32* v, uint32* t, uint32* n, size_t count );
    123123        virtual void calculate_tangents();
    124124
    125         vertex_attribute< vec3 >* m_position;
    126         vertex_attribute< vec3 >* m_normal;
    127         vertex_attribute< vec2 >* m_tex_coord;
    128         vertex_attribute< vec4 >* m_tangent;
    129         mesh* m_mesh;
     125        mesh_data_creator* m_mesh;
    130126};
    131127
     
    138134        }
    139135
    140         if ( m_position == nullptr )
    141         {
    142                 m_position  = m_mesh->add_attribute< vec3 >( "nv_position" );
    143         }
    144         if ( m_tex_coord == nullptr )
    145         {
    146                 m_tex_coord = m_mesh->add_attribute< vec2 >( "nv_texcoord" );
    147         }
    148         if ( m_normal == nullptr && ni != nullptr )
    149         {
    150                 m_normal = m_mesh->add_attribute< vec3 >( "nv_normal" );
    151         }
    152 
    153136        // TODO : support if normals not present;
    154137
    155         std::vector< vec3 >& vp = m_position->get();
    156         std::vector< vec2 >& vt = m_tex_coord->get();
    157         std::vector< vec3 >& vn = m_normal->get();
     138        std::vector< vec3 >& vp = m_mesh->get_positions();
     139        std::vector< vec3 >& vn = m_mesh->get_normals();
     140        std::vector< vec2 >& vt = m_mesh->get_texcoords();
    158141
    159142        std::size_t result = 0;
     
    174157void mesh_obj_reader::calculate_tangents()
    175158{
    176         m_tangent = m_mesh->add_attribute< vec4 >( "nv_tangent" );
    177 
    178         std::vector< vec3 >& vp = m_position->get();
    179         std::vector< vec2 >& vt = m_tex_coord->get();
    180         std::vector< vec3 >& vn = m_normal->get();
    181         std::vector< vec4 >& tg = m_tangent->get();
     159        const std::vector< vec3 >& vp = m_mesh->get_positions();
     160        const std::vector< vec2 >& vt = m_mesh->get_texcoords();
     161        const std::vector< vec3 >& vn = m_mesh->get_normals();
     162        std::vector< vec3 >& tg = m_mesh->get_tangents();
    182163
    183164        size_t count  = vp.size();
     
    225206                tan1[i3] += sdir;
    226207
     208                // tan2 not needed anymore??
    227209                tan2[i1] += tdir;
    228210                tan2[i2] += tdir;
     
    235217                const vec3& t = tan1[a];
    236218
    237                 tg[a] = vec4( glm::normalize(t - n * glm::dot( n, t )),
    238                     (glm::dot(glm::cross(n, t), tan2[a]) < 0.0f) ? -1.0f : 1.0f );
     219                tg[a] = vec3( glm::normalize(t - n * glm::dot( n, t )) );
     220                //tg[a][3] =    (glm::dot(glm::cross(n, t), tan2[a]) < 0.0f) ? -1.0f : 1.0f;
    239221        }
    240222
     
    258240                delete m_mesh;
    259241        }
    260         m_mesh = new mesh();
    261         mesh_obj_reader reader( m_mesh );
     242        mesh_data_creator creator;
     243        mesh_obj_reader reader( &creator );
    262244        std_stream sstream( &source );
    263245        reader.read_stream( sstream );
     
    267249                reader.calculate_tangents();
    268250        }
     251        m_mesh = creator.release();
    269252        return true;
    270253}
Note: See TracChangeset for help on using the changeset viewer.