Changeset 292 for trunk/src


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
Files:
5 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}
  • trunk/src/gl/gl_device.cc

    r245 r292  
    8181                return nullptr;
    8282        }
    83         image_data* data = new image_data( glm::ivec2( image->w, image->h ), image->format->BytesPerPixel, (nv::uint8*)image->pixels );
     83        // TODO: BGR vs RGB, single channel
     84        assert( image->format->BytesPerPixel > 2 );
     85        image_format format(image->format->BytesPerPixel == 3 ? RGB : RGBA, UBYTE );
     86        image_data* data = new image_data( format, glm::ivec2( image->w, image->h ), (nv::uint8*)image->pixels );
    8487        return data;
    8588}
    8689
    87 texture2d* gl_device::create_texture2d( ivec2 size, image_format aformat, datatype adatatype, sampler asampler, void* data /*= nullptr */ )
     90texture2d* gl_device::create_texture2d( ivec2 size, pixel_format aformat, datatype adatatype, sampler asampler, void* data /*= nullptr */ )
    8891{
    8992        return new gl_texture2d( size, aformat, adatatype, asampler, data );
  • trunk/src/gl/gl_enum.cc

    r237 r292  
    147147}
    148148
    149 unsigned int nv::image_format_to_enum( image_format format )
     149unsigned int nv::image_format_to_enum( pixel_format format )
    150150{
    151151        switch( format )
  • trunk/src/gl/gl_texture2d.cc

    r204 r292  
    1010using namespace nv;
    1111
    12 nv::gl_texture2d::gl_texture2d( ivec2 size, image_format aformat, datatype adatatype, sampler asampler, void* data /*= nullptr */ )
     12nv::gl_texture2d::gl_texture2d( ivec2 size, pixel_format aformat, datatype adatatype, sampler asampler, void* data /*= nullptr */ )
    1313        : texture2d( size, aformat, adatatype, asampler ), m_name()
    1414{
     
    3838{
    3939        glBindTexture( GL_TEXTURE_2D, m_name.get_value() );
    40         glTexImage2D( GL_TEXTURE_2D, 0, (GLint)nv::image_format_to_enum(m_format), m_size.x, m_size.y, 0, nv::image_format_to_enum(m_format), nv::datatype_to_gl_enum(m_datatype), data );
     40        glTexImage2D( GL_TEXTURE_2D, 0, (GLint)nv::image_format_to_enum(m_format.format), m_size.x, m_size.y, 0, nv::image_format_to_enum(m_format.format), nv::datatype_to_gl_enum(m_format.type), data );
    4141        glBindTexture( GL_TEXTURE_2D, 0 );
    4242}
Note: See TracChangeset for help on using the changeset viewer.