Ignore:
Timestamp:
07/20/15 13:25:20 (10 years ago)
Author:
epyon
Message:
  • cleanup of mesh_node_data
File:
1 edited

Legend:

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

    r425 r427  
    7171
    7272        m_node_data  = nullptr;
    73         m_node_array = nullptr;
    7473}
    7574
     
    10099        nmd_animation_header animation_header;
    101100        source.read( &animation_header, sizeof( animation_header ), 1 );
    102         m_node_array = new mesh_node_data[ e.children ];
     101        m_node_data = new mesh_nodes_data( e.name, animation_header.frame_rate, animation_header.duration, animation_header.flat );
    103102        for ( uint32 i = 0; i < e.children; ++i )
    104103        {
     
    107106                skip_attributes( source, element_header.attributes );
    108107                NV_ASSERT( element_header.type == nmd_type::NODE, "NODE expected!" );
    109                 m_node_array[i].data = data_channel_set_creator::create_set( element_header.children );
    110                 load_channel_set( source, m_node_array[i].data, element_header );
    111         }
    112         m_node_data = new mesh_nodes_data( e.name, e.children, m_node_array, animation_header.frame_rate, animation_header.duration, animation_header.flat );
     108                data_channel_set* set = data_channel_set_creator::create_set( element_header.children );
     109                load_channel_set( source, set, element_header );
     110                m_node_data->push_back( set );
     111        }
    113112        return true;
    114113}
     
    144143                mesh_nodes_data* result = m_node_data;
    145144                m_node_data = nullptr;
    146                 m_node_array = nullptr;
    147145                return result;
    148146        }
     
    153151// nmd format dump
    154152// HACK : TEMPORARY - will go to it's own file, probably nmd_io
    155 static void nmd_dump_channel( const raw_data_channel* channel , stream& stream_out )
    156 {
    157         nmd_channel_header sheader;
    158         sheader.format = channel->descriptor();
    159         sheader.count = channel->size();
    160         stream_out.write( &sheader, sizeof( sheader ), 1 );
    161         stream_out.write( channel->raw_data(), channel->element_size(), channel->size() );
    162 }
    163 
    164 static void nmd_dump_channel_set( const data_channel_set* channel_set, stream& stream_out )
    165 {
    166         for ( auto& channel : *channel_set )
    167         {
    168                 nmd_dump_channel( &channel, stream_out );
    169         }
    170 }
    171 
    172 static void nmd_dump_node( const mesh_node_data* node, stream& stream_out )
    173 {
    174         uint32 chan_size = 0;
    175         uint32 chan_count = ( node->data ? node->data->size() : 0 );
    176         for ( uint32 c = 0; c < chan_count; ++c )
    177         {
    178                 chan_size += sizeof( nmd_channel_header );
    179                 chan_size += node->data->get_channel( c )->raw_size();
    180         }
    181 
    182         nmd_element_header eheader;
    183         eheader.type = nmd_type::NODE;
    184         eheader.children   = static_cast<uint16>( chan_count );
    185         eheader.size       = chan_size;
    186         eheader.name       = node->data->get_name();
    187         eheader.parent_id  = node->data->get_parent_id();
    188         eheader.transform  = node->data->get_transform();
    189         eheader.attributes = 0;
    190         stream_out.write( &eheader, sizeof( eheader ), 1 );
    191         if ( chan_count > 0 ) nmd_dump_channel_set( node->data, stream_out );
    192 }
    193153
    194154void nv::nmd_dump_header( stream& stream_out, uint32 elements, uint64 name )
     
    203163}
    204164
    205 void nv::nmd_dump_mesh( stream& stream_out, const data_channel_set& mesh )
     165void nv::nmd_dump_element( stream& stream_out, const data_channel_set& data, nmd_type type )
    206166{
    207167        uint32 size = 0;
    208         for ( auto& chan : mesh )
     168        for ( auto& chan : data )
    209169        {
    210170                size += sizeof( nmd_channel_header );
     
    213173
    214174        nmd_element_header eheader;
    215         eheader.type       = nmd_type::MESH;
    216         eheader.children   = static_cast<uint16>( mesh.size() );
     175        eheader.type       = type;
     176        eheader.children   = static_cast<uint16>( data.size() );
    217177        eheader.size       = size;
    218         eheader.name       = mesh.get_name();
    219         eheader.transform  = mesh.get_transform();
    220         eheader.parent_id  = mesh.get_parent_id();
     178        eheader.name       = data.get_name();
     179        eheader.transform  = data.get_transform();
     180        eheader.parent_id  = data.get_parent_id();
    221181        eheader.attributes = 0;
    222182        stream_out.write( &eheader, sizeof( eheader ), 1 );
    223         nmd_dump_channel_set( &mesh, stream_out );
     183        for ( auto& channel : data )
     184        {
     185                nmd_channel_header cheader;
     186                cheader.format = channel.descriptor();
     187                cheader.count = channel.size();
     188                stream_out.write( &cheader, sizeof( cheader ), 1 );
     189                stream_out.write( channel.raw_data(), channel.element_size(), channel.size() );
     190        }
    224191}
    225192
     
    227194{
    228195        uint32 total = sizeof( nmd_animation_header );
    229         for ( uint32 i = 0; i < nodes.get_count(); ++i )
    230         {
    231                 const mesh_node_data* node = nodes.get_node( i );
     196        for ( auto node : nodes )
     197        {
    232198                total += sizeof( nmd_element_header );
    233                 if ( node->data )
    234                         for ( uint32 c = 0; c < node->data->size(); ++c )
    235                         {
    236                                 total += sizeof( nmd_channel_header );
    237                                 total += node->data->get_channel( c )->raw_size();
    238                         }
     199                for ( uint32 c = 0; c < node->size(); ++c )
     200                {
     201                        total += sizeof( nmd_channel_header );
     202                        total += node->get_channel( c )->raw_size();
     203                }
    239204        }
    240205
     
    256221        stream_out.write( &aheader, sizeof( aheader ), 1 );
    257222
    258         for ( uint32 i = 0; i < nodes.get_count(); ++i )
    259         {
    260                 nmd_dump_node( nodes.get_node( i ), stream_out );
     223        for ( auto node : nodes )
     224        {
     225                nmd_dump_element( stream_out, *node, nv::nmd_type::NODE );
    261226        }
    262227}
     
    284249        for ( uint32 i = 0; i < model->get_count(); ++i )
    285250        {
    286                 nmd_dump_mesh( stream_out, *model->get_mesh( i ) );
     251                nmd_dump_element( stream_out, *model->get_mesh( i ), nv::nmd_type::MESH );
    287252        }
    288253
Note: See TracChangeset for help on using the changeset viewer.