Ignore:
Timestamp:
06/18/14 20:05:35 (11 years ago)
Author:
epyon
Message:
  • md5_loader using dynamic_array
  • skeleton animation via pointer, not vector
  • minor fixes
File:
1 edited

Legend:

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

    r259 r261  
    4545bool md5_loader::load( stream& source )
    4646{
     47        NV_PROFILE( "Load MD5" ); // 16XXms original
    4748        std_stream sstream( &source );
    4849        std::string command;
    49         std::vector< md5_weight > weights;
    50         std::vector< md5_weight_info > weight_info;
     50        dynamic_array< md5_weight > weights;
     51        dynamic_array< md5_weight_info > weight_info;
    5152
    5253        sstream >> command;
     
    6566                {
    6667                        sstream >> m_num_joints;
    67                         m_joints.reserve( m_num_joints );
     68                        m_joints.resize( m_num_joints );
    6869                }
    6970                else if ( command == "numMeshes" )
    7071                {
    7172                        sstream >> m_num_meshes;
    72                         m_meshes.reserve( m_num_meshes );
     73                        m_meshes.resize( m_num_meshes );
     74                        m_num_meshes = 0;
    7375                }
    7476                else if ( command == "joints" )
     
    8789                                remove_quotes( joint.name );
    8890                                unit_quat_w( joint.orient );
    89                                 m_joints.push_back( joint );
     91                                m_joints[i] = joint;
    9092                                next_line( sstream );
    9193                        }
     
    168170                                {
    169171                                        sstream >> num_weights;
    170                                         weights.reserve( num_weights );
     172                                        weights.resize( num_weights );
    171173                                        next_line( sstream );
    172174                                        std::string line;
     
    177179                                                std::getline( sstream, line );
    178180                                                sscanf( line.c_str(), "%*s %*u %u %f ( %f %f %f )", &(weight.joint_id), &(weight.bias), &(weight.pos.x), &(weight.pos.y), &(weight.pos.z));
    179                                                 weights.push_back(weight);
     181                                                weights[i] = weight;
    180182                                        }
    181183                                }
     
    188190                        }
    189191
    190                         prepare_mesh( mesh, weights, weight_info );
    191 
    192                         m_meshes.push_back(mesh);
     192                        prepare_mesh( mesh, weights.data(), weight_info.data() );
     193
     194                        m_meshes[ m_num_meshes ] = mesh;
     195                        m_num_meshes++;
    193196                }
    194197                sstream >> command;
    195198        }
    196199
    197         assert( m_joints.size() == m_num_joints );
    198         assert( m_meshes.size() == m_num_meshes );
    199200        return true;
    200201}
    201202
    202 bool md5_loader::prepare_mesh( md5_mesh_data* mdata, std::vector< md5_weight >& weights, std::vector< md5_weight_info >& weight_info )
     203bool md5_loader::prepare_mesh( md5_mesh_data* mdata, md5_weight* weights, md5_weight_info* weight_info )
    203204{
    204205        uint32 vtx_count = mdata->m_vtx_data.size();
    205206        md5_vtx_pnt* vtcs = mdata->m_pntdata;
    206207
    207         for ( auto joint : m_joints )
    208         {
    209                 transform j( joint.pos, joint.orient );
    210                 mdata->m_bone_offset.push_back(j.inverse());
     208        mdata->m_bone_offset.resize( m_joints.size() );
     209        for ( uint32 i = 0; i < m_joints.size(); ++i )
     210        {
     211                transform j( m_joints[i].pos, m_joints[i].orient );
     212                mdata->m_bone_offset[i] = j.inverse();
    211213        }
    212214
     
    222224                vtc.tangent  = glm::vec3(0);
    223225
    224                 std::sort( weights.begin() + start_weight, weights.begin() + start_weight + weight_count, [](const md5_weight& a, const md5_weight& b) -> bool { return a.bias > b.bias; } );
     226                std::sort( weights + start_weight, weights + start_weight + weight_count, [](const md5_weight& a, const md5_weight& b) -> bool { return a.bias > b.bias; } );
    225227
    226228                if ( weight_count > 4 )
     
    475477
    476478
    477 void nv::md5_animation::update_skeleton( std::vector<transform>& skeleton, float anim_time ) const
    478 {
    479         NV_ASSERT( skeleton.size() == m_num_joints, "Incompatible skeleton passed!" );
     479void nv::md5_animation::update_skeleton( transform* skeleton, float anim_time ) const
     480{
    480481        anim_time = glm::clamp( anim_time, 0.0f, m_anim_duration );
    481482        float frame_num = anim_time * (float)m_frame_rate;
     
    551552
    552553nv::md5_mesh_instance::md5_mesh_instance( const md5_mesh_data* a_data )
    553         : m_data( a_data ), m_size( 0 ), m_indices( 0 ), m_pntdata( nullptr )
    554 {
    555         m_size = m_data->m_vtx_data.size();
     554        : m_data( a_data ), m_indices( 0 )
     555{
    556556        m_indices = m_data->get_count();
    557         m_pntdata = new md5_vtx_pnt[ m_size ];
    558         std::copy_n( m_data->m_pntdata, m_size, m_pntdata );
    559 }
    560 
    561 void nv::md5_mesh_instance::apply( const std::vector< transform >& skeleton )
     557        m_pntdata.assign( m_data->m_pntdata, m_data->m_vtx_data.size() );
     558}
     559
     560void nv::md5_mesh_instance::apply( const transform* skeleton )
    562561{
    563562        NV_PROFILE("md5::apply");
    564         m_pos_offset.resize( skeleton.size() );
    565         for ( unsigned int i = 0; i < skeleton.size(); ++i )
     563        size_t skeleton_size = m_data->m_bone_offset.size();
     564        size_t vertex_count  = m_pntdata.size();
     565        m_pos_offset.resize( skeleton_size );
     566        for ( unsigned int i = 0; i < skeleton_size; ++i )
    566567        {
    567568                m_pos_offset[i] = skeleton[i] * m_data->m_bone_offset[i];
    568569        }
    569570
    570         char* fill_ptr = (char*)&(m_pntdata[0]);
    571         std::fill( fill_ptr, fill_ptr + m_size * ( sizeof( md5_vtx_pnt ) ), 0 );
    572         for ( unsigned int i = 0; i < m_size; ++i )
     571        std::fill( m_pntdata.raw_data(), m_pntdata.raw_data() + m_pntdata.raw_size(), 0 );
     572        for ( unsigned int i = 0; i < vertex_count; ++i )
    573573        {
    574574                const md5_vtx_data& vert = m_data->m_vtx_data[i];
     
    579579                        int   index  = vert.boneindex[j];
    580580                        float weight = vert.boneweight[j];
    581                         transform joint  = skeleton[index];
    582                         transform offset = m_pos_offset[index];
     581                        const quat& orient      = skeleton[index].get_orientation();
     582                        const transform& offset = m_pos_offset[index];
    583583                        result.position += offset.transformed( vert.position )        * weight;
    584                         result.normal   += ( joint.get_orientation() * vert.normal  ) * weight;
    585                         result.tangent  += ( joint.get_orientation() * vert.tangent ) * weight;
    586                 }
    587         }
    588 }
     584                        result.normal   += ( orient * vert.normal  ) * weight;
     585                        result.tangent  += ( orient * vert.tangent ) * weight;
     586                }
     587        }
     588}
Note: See TracChangeset for help on using the changeset viewer.