Changeset 292 for trunk/src/formats


Ignore:
Timestamp:
07/26/14 04:25:23 (11 years ago)
Author:
epyon
Message:
  • nmd_loader now (temporarily) holds nmd dump code
  • image_data now holds pixel format information
  • minor cleanups
Location:
trunk/src/formats
Files:
2 edited

Legend:

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

    r291 r292  
    6363bool nv::assimp_loader::load( stream& source )
    6464{
     65        load_assimp_library();
    6566        if ( m_scene != nullptr ) aiReleaseImport( (const aiScene*)m_scene );
    6667        m_scene = nullptr;
    6768        m_mesh_count = 0;
    68         load_assimp_library();
    6969        NV_LOG( nv::LOG_NOTICE, "AssImp loading file..." );
    7070        int size = (int)source.size();
  • trunk/src/formats/nmd_loader.cc

    r291 r292  
    157157}
    158158
     159// ----------------------------------------------------------------
     160// nmd format dump
     161// HACK : TEMPORARY - will go to it's own file, probably nmd_io
     162static void nmd_dump_mesh( const mesh_data* mesh, stream& stream_out )
     163{
     164        const std::vector< mesh_raw_channel* >& data  = mesh->get_raw_channels();
     165
     166        uint32 size = sizeof( nmd_element_header );
     167        for ( auto chan : data )
     168        {
     169                size += sizeof( nmd_element_header ) + sizeof( nmd_stream_header );
     170                size += chan->size();
     171        }
     172
     173        nmd_element_header eheader;
     174        eheader.type     = nmd_type::MESH;
     175        eheader.name     = 0;
     176        eheader.children = (uint16)data.size();
     177        eheader.size     = size;
     178        stream_out.write( &eheader, sizeof( eheader ), 1 );
     179
     180        for ( auto chan : data )
     181        {
     182                nmd_element_header cheader;
     183                eheader.name     = 0;
     184                cheader.type     = nmd_type::STREAM;
     185                cheader.children = 0;
     186                cheader.size     = chan->size() + sizeof( nmd_stream_header );
     187                stream_out.write( &cheader, sizeof( cheader ), 1 );
     188
     189                nmd_stream_header sheader;
     190                sheader.format = chan->desc;
     191                sheader.count  = chan->count;
     192                stream_out.write( &sheader, sizeof( sheader ), 1 );
     193                stream_out.write( chan->data, chan->desc.size, chan->count );
     194        }
     195}
     196
     197static void nmd_dump_nodes_data( const mesh_nodes_data* nodes, stream& stream_out, string_table_creator* strings )
     198{
     199        uint32 total = sizeof( nmd_animation_header );
     200        for ( uint32 i = 0; i < nodes->get_count(); ++i )
     201        {
     202                const mesh_node_data* node = nodes->get_node(i);
     203                total += sizeof( nmd_element_header ) + sizeof( nmd_node_header );
     204                if ( node->data )
     205                        for ( uint32 c = 0; c < node->data->get_channel_count(); ++c )
     206                        {
     207                                total += sizeof( nmd_element_header ) + sizeof( nmd_key_channel_header );
     208                                total += node->data->get_channel(c)->size();
     209                        }
     210        }
     211
     212        nmd_element_header header;
     213        header.name     = 0;
     214        header.type     = nmd_type::ANIMATION;
     215        header.children = (uint16)nodes->get_count();
     216        header.size     = total;
     217        stream_out.write( &header, sizeof( header ), 1 );
     218
     219        nmd_animation_header aheader;
     220        aheader.frame_rate  = nodes->get_frame_rate();
     221        aheader.duration    = nodes->get_duration();
     222        aheader.flat        = nodes->is_flat();
     223        stream_out.write( &aheader, sizeof( aheader ), 1 );
     224
     225        for ( uint32 i = 0; i < nodes->get_count(); ++i )
     226        {
     227                const mesh_node_data* node = nodes->get_node(i);
     228                uint32 chan_size  = 0;
     229                uint32 chan_count = ( node->data ? node->data->get_channel_count() : 0 );
     230                for ( uint32 c = 0; c < chan_count; ++c )
     231                {
     232                        chan_size += sizeof( nmd_element_header ) + sizeof( nv::nmd_key_channel_header );
     233                        chan_size += node->data->get_channel(c)->size();
     234                }
     235
     236                nmd_element_header eheader;
     237                eheader.type     = nmd_type::NODE;
     238                eheader.name     = strings->insert( node->name );
     239                eheader.children = (uint16)chan_count;
     240                eheader.size     = sizeof( nmd_node_header ) + chan_size;
     241                stream_out.write( &eheader, sizeof( eheader ), 1 );
     242
     243                nmd_node_header nheader;
     244                nheader.parent_id = (uint16)node->parent_id;
     245                nheader.transform = node->transform;
     246                stream_out.write( &nheader, sizeof( nheader ), 1 );
     247
     248                for ( uint32 c = 0; c < chan_count; ++c )
     249                {
     250                        const key_raw_channel* channel = node->data->get_channel(c);
     251
     252                        eheader.type     = nmd_type::KEY_CHANNEL;
     253                        eheader.children = 0;
     254                        eheader.size     = sizeof( nmd_key_channel_header ) + channel->size();
     255                        stream_out.write( &eheader, sizeof( eheader ), 1 );
     256
     257                        nmd_key_channel_header cheader;
     258                        cheader.format    = channel->desc;
     259                        cheader.count     = channel->count;
     260                        stream_out.write( &cheader, sizeof( cheader ), 1 );
     261                        stream_out.write( channel->data, channel->desc.size, channel->count );
     262                }
     263        }
     264}
     265
     266void nv::nmd_dump( const mesh_data_pack* model, stream& stream_out )
     267{
     268        string_table_creator strings;
     269        {
     270                nmd_header header;
     271                header.id       = four_cc<'n','m','f','1'>::value;
     272                header.elements = 1; // +1 string array
     273                header.elements += model->get_count();
     274                if ( model->get_nodes() && model->get_nodes()->get_count() > 0 )
     275                        header.elements += 1;//  +1 bone array
     276                header.version  = 1;
     277                stream_out.write( &header, sizeof( header ), 1 );
     278        }
     279
     280        for ( uint32 i = 0; i < model->get_count(); ++i )
     281        {
     282                const mesh_data* mesh = model->get_mesh(i);
     283                nmd_dump_mesh( mesh, stream_out );
     284        }
     285
     286        if ( model->get_nodes() && model->get_nodes()->get_count() > 0 )
     287        {
     288                nmd_dump_nodes_data( model->get_nodes(), stream_out, &strings );
     289        }
     290
     291        nmd_element_header sheader;
     292        sheader.type     = nv::nmd_type::STRING_TABLE;
     293        sheader.name     = 0;
     294        sheader.size     = strings.dump_size();
     295        sheader.children = 0;
     296        stream_out.write( &sheader, sizeof( sheader ), 1 );
     297        strings.dump( &stream_out );
     298}
Note: See TracChangeset for help on using the changeset viewer.