Changeset 304 for trunk


Ignore:
Timestamp:
08/11/14 11:56:19 (11 years ago)
Author:
epyon
Message:
  • mouse wheel support for both SDL 1.2 and 2.0
  • optional unmerged MD3 import
  • selective delete mesh form mesh_creator
  • minor fixes
Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/detail/io_event_list.inc

    r184 r304  
    22NV_IO_EVENT( EV_MOUSE_BUTTON )
    33NV_IO_EVENT( EV_MOUSE_MOVE )
     4NV_IO_EVENT( EV_MOUSE_WHEEL )
    45NV_IO_EVENT( EV_JOY_BUTTON )
    56NV_IO_EVENT( EV_JOY_AXIS )
  • trunk/nv/detail/mouse_list.inc

    r67 r304  
    33NV_MOUSE( MOUSE_MIDDLE,     2 )
    44NV_MOUSE( MOUSE_RIGHT,      3 )
    5 NV_MOUSE( MOUSE_WHEEL_UP,   4 )
    6 NV_MOUSE( MOUSE_WHEEL_DOWN, 5 )
  • trunk/nv/formats/md3_loader.hh

    r291 r304  
    3232        {
    3333        public:
    34                 md3_loader();
     34                md3_loader( bool merge_all = true );
    3535                virtual ~md3_loader();
    3636                virtual bool load( stream& source );
     
    4242                virtual mesh_nodes_data* release_mesh_nodes_data( size_t = 0 );
    4343        private:
    44                 void release_mesh_frame( mesh_data* data, sint32 frame );
     44                void release_mesh_frame( mesh_data* data, sint32 frame, sint32 surface );
    4545                key_raw_channel* load_tags( const std::string& tag );
     46                bool m_merge_all;
    4647                void* m_md3;
    4748        };
  • trunk/nv/gfx/keyframed_mesh.hh

    r303 r304  
    2828                virtual void update_animation( animation_entry*, uint32 a_anim_time );
    2929                virtual void update( program a_program );
     30                virtual void update( uint32 ms ) { animated_mesh::update(ms); }
    3031                virtual ~keyframed_mesh();
    3132        protected:
  • trunk/nv/gfx/mesh_creator.hh

    r295 r304  
    5050        public:
    5151                mesh_creator( mesh_data_pack* pack ) : m_pack( pack ) {}
     52                void delete_mesh( uint32 index )
     53                {
     54                        if ( index < m_pack->get_count() )
     55                        {
     56                                m_pack->m_meshes[ index ].destroy();
     57                                m_pack->m_meshes[ m_pack->m_count-1 ].move_to( m_pack->m_meshes[ index ] );
     58                                m_pack->m_count--;
     59                        }
     60                }
    5261                // assumes that keys are equally spaced
    5362                void pre_transform_keys()
  • trunk/nv/interface/mesh_data.hh

    r302 r304  
    202202                }
    203203
     204                void destroy()
     205                {
     206                        for ( auto channel : m_channels ) delete channel;
     207                        m_channels.clear();
     208                        m_index_channel = nullptr;
     209                }
     210
    204211                virtual ~mesh_data()
    205212                {
    206                         for ( auto channel : m_channels ) delete channel;
     213                        destroy();
    207214                }
    208215        private:
  • trunk/nv/io_event.hh

    r262 r304  
    7777                /// Mouse button code
    7878                mouse_code code;
     79        };
     80
     81        struct mouse_wheel_event
     82        {
     83                /// amount scrolled horizontally positive to the right
     84                sint32 x;
     85                /// amount scrolled vertically
     86                sint32 y;
    7987        };
    8088
     
    166174                        mouse_button_event mbutton;
    167175                        mouse_move_event   mmove;
     176                        mouse_wheel_event  mwheel;
    168177                        joy_button_event   jbutton;
    169178                        joy_axis_event     jaxis;
  • trunk/src/formats/md3_loader.cc

    r291 r304  
    233233static bool s_normal_ready = false;
    234234
    235 md3_loader::md3_loader()
    236         : m_md3( nullptr )
     235md3_loader::md3_loader( bool merge_all )
     236        : m_md3( nullptr ), m_merge_all( merge_all )
    237237{
    238238        if ( !s_normal_ready )
     
    319319};
    320320
    321 mesh_data* nv::md3_loader::release_mesh_data( size_t )
     321mesh_data* nv::md3_loader::release_mesh_data( size_t index )
    322322{
    323323        mesh_data* data = new mesh_data;
    324         release_mesh_frame( data, -1 );
     324        release_mesh_frame( data, -1, index );
    325325        return data;
    326326}
    327327
    328 void nv::md3_loader::release_mesh_frame( mesh_data* data, sint32 frame )
     328void nv::md3_loader::release_mesh_frame( mesh_data* data, sint32 frame, sint32 surface )
    329329{
    330330        md3_t* md3 = (md3_t*)m_md3;
    331         sint32 num_surfaces = md3->header.num_surfaces;
    332         sint32 num_verts    = md3->vertices_per_frame;
     331        sint32 num_surfaces  = md3->header.num_surfaces;
     332        sint32 num_verts     = 0;
    333333        sint32 current_frame = ( frame == -1 ? 0 : frame );
    334334        sint32 frame_count   = ( frame == -1 ? md3->header.num_frames : 1 );
     335        sint32 current_surf  = ( surface == -1 ? 0 : surface );
     336        sint32 surf_count    = ( surface == -1 ? md3->header.num_surfaces : 1 );
     337        sint32 index_count   = 0;
     338
     339        if ( surface >= 0 )
     340        {
     341                index_count = md3->surfaces[surface].header.num_triangles * 3;
     342                num_verts   = md3->surfaces[surface].header.num_verts;
     343        }
     344        else
     345                for ( sint32 i = 0; i < num_surfaces; ++i )
     346                {
     347                        index_count += md3->surfaces[i].header.num_triangles * 3;
     348                        num_verts   += md3->surfaces[i].header.num_verts;
     349                }
    335350
    336351        mesh_raw_channel* mc_pn = mesh_raw_channel::create< vtx_md3_pn >( num_verts * frame_count );
     352        mesh_raw_channel* mc_t  = mesh_raw_channel::create< vtx_md3_t >( num_verts );
     353        mesh_raw_channel* ic = mesh_raw_channel::create_index< uint16 >( index_count );
    337354        vtx_md3_pn* vtx_pn = (vtx_md3_pn*)mc_pn->data;
    338 
    339         uint32 index = 0;
     355        vtx_md3_t*  vtx_t  = (vtx_md3_t*) mc_t->data;
     356        uint16*     icp    = (uint16*)ic->data;
     357
     358        uint32 index  = 0;
     359        uint32 iindex = 0;
     360        sint32 index_base = 0;
     361
     362        while ( surf_count > 0 )
     363        {
     364                const md3_surface_t& surface = md3->surfaces[ current_surf ];
     365                const uint32         vcount  = static_cast< uint32 >( surface.header.num_verts );
     366                const uint32         tcount  = static_cast< uint32 >( surface.header.num_triangles );
     367
     368                for (uint32 j = 0; j < vcount; ++j )
     369                {
     370                        vtx_t[index++].texcoord = md3_texcoord( surface.st[j] );
     371                }
     372
     373                for (size_t j = 0; j < tcount; ++j )
     374                {
     375                        const md3_triangle_t& t = surface.triangles[j];
     376                        icp[iindex++] = static_cast< uint16 >( index_base + t.indexes[0] );
     377                        icp[iindex++] = static_cast< uint16 >( index_base + t.indexes[1] );
     378                        icp[iindex++] = static_cast< uint16 >( index_base + t.indexes[2] );
     379                }
     380                index_base += surface.header.num_verts;
     381                ++current_surf;
     382                --surf_count;
     383        }
     384
     385        index = 0;
    340386        while ( frame_count > 0 )
    341387        {
    342                 for ( sint32 i = 0; i < num_surfaces; ++i )
    343                 {
    344                         md3_surface_t& surface = md3->surfaces[i];
     388                current_surf  = ( surface == -1 ? 0 : surface );
     389                surf_count    = ( surface == -1 ? md3->header.num_surfaces : 1 );
     390
     391                while ( surf_count > 0 )
     392                {
     393                        md3_surface_t& surface = md3->surfaces[current_surf];
    345394                        sint32         vcount  = surface.header.num_verts;
    346395                        sint32         offset  = vcount * current_frame;
     
    353402                                index++;
    354403                        }
    355 
     404                        ++current_surf;
     405                        --surf_count;
    356406                }
    357407                ++current_frame;
    358408                --frame_count;
    359         }
    360 
    361         index = 0;
    362         mesh_raw_channel* mc_t = mesh_raw_channel::create< vtx_md3_t >( num_verts );
    363         vtx_md3_t* vtx_t = (vtx_md3_t*)mc_t->data;
    364         for ( sint32 i = 0; i < num_surfaces; ++i )
    365         {
    366                 const md3_surface_t& surface = md3->surfaces[i];
    367                 const uint32         vcount  = static_cast< uint32 >( surface.header.num_verts );
    368                 for (uint32 j = 0; j < vcount; ++j )
    369                 {
    370                         vtx_t[index++].texcoord = md3_texcoord( surface.st[j] );
    371                 }
    372         }
    373 
    374         sint32 index_count = 0;
    375         for ( sint32 i = 0; i < num_surfaces; ++i )
    376         {
    377                 index_count += md3->surfaces[i].header.num_triangles * 3;
    378         }
    379 
    380         index = 0;
    381         sint32 index_base = 0;
    382         mesh_raw_channel* ic = mesh_raw_channel::create_index< uint16 >( index_count );
    383         uint16* icp = (uint16*)ic->data;
    384         for ( sint32 i = 0; i < num_surfaces; ++i )
    385         {
    386                 const md3_surface_t& surface = md3->surfaces[i];
    387                 const size_t         tcount  = static_cast< size_t >( surface.header.num_triangles );
    388                 for (size_t j = 0; j < tcount; ++j )
    389                 {
    390                         const md3_triangle_t& t = surface.triangles[j];
    391                         icp[index++] = static_cast< uint16 >( index_base + t.indexes[0] );
    392                         icp[index++] = static_cast< uint16 >( index_base + t.indexes[1] );
    393                         icp[index++] = static_cast< uint16 >( index_base + t.indexes[2] );
    394                 }
    395                 index_base += surface.header.num_verts;
    396409        }
    397410
     
    427440mesh_data_pack* nv::md3_loader::release_mesh_data_pack()
    428441{
    429         mesh_data* data = new mesh_data[1];
    430         release_mesh_frame( &data[0], -1 );
    431         return new mesh_data_pack( 1, data, release_mesh_nodes_data() );
     442        md3_t* md3 = (md3_t*)m_md3;
     443        uint32 count = 1;
     444        mesh_data* data = nullptr;
     445        if ( m_merge_all )
     446        {
     447                data = new mesh_data[1];
     448                release_mesh_frame( &data[0], -1, -1 );
     449                data[0].set_name( (char*)md3->header.name );
     450        }
     451        else
     452        {
     453                count = md3->header.num_surfaces;
     454                data = new mesh_data[ count ];
     455                for ( uint32 i = 0; i < count; ++i )
     456                {
     457                        release_mesh_frame( &data[i], -1, i );
     458                        data[i].set_name( (char*)md3->surfaces[i].header.name );
     459                }
     460        }
     461        return new mesh_data_pack( count, data, release_mesh_nodes_data() );
    432462}
    433463
  • trunk/src/gfx/keyframed_mesh.cc

    r303 r304  
    4747transform keyframed_mesh::get_node_transform( uint32 node_id ) const
    4848{
    49         NV_ASSERT( m_tag_map, "TAGMAP FAIL" );
     49        if ( !m_tag_map ) return transform();
    5050        NV_ASSERT( node_id < m_tag_map->get_count(), "TAGMAP FAIL" );
    5151        const key_data* data = m_tag_map->get_node( node_id )->data;
  • trunk/src/gl/gl_window.cc

    r295 r304  
    115115        case SDL_BUTTON_MIDDLE    : mevent.mbutton.button = MOUSE_MIDDLE; break;
    116116        case SDL_BUTTON_RIGHT     : mevent.mbutton.button = MOUSE_RIGHT; break;
    117         //case SDL_BUTTON_WHEELUP   : mevent.mbutton.button = MOUSE_WHEEL_UP; break;
    118         //case SDL_BUTTON_WHEELDOWN : mevent.mbutton.button = MOUSE_WHEEL_DOWN; break;
     117#if NV_SDL_VERSION == NV_SDL_12
     118        case SDL_BUTTON_WHEELUP   :
     119                mevent.type           = EV_MOUSE_WHEEL;
     120                mevent.mwheel.x       = 0;
     121                mevent.mwheel.y       = 3;
     122                return true;
     123        case SDL_BUTTON_WHEELDOWN :
     124                mevent.type           = EV_MOUSE_WHEEL;
     125                mevent.mwheel.x       = 0;
     126                mevent.mwheel.y       = -3;
     127                return true;
     128#endif
    119129        default : break;
    120130        }
     
    122132        return mevent.mbutton.button != MOUSE_NONE;
    123133}
     134
     135#if NV_SDL_VERSION == NV_SDL_20
     136static bool sdl_mouse_wheel_to_io_event( const SDL_MouseWheelEvent& mm, io_event& mevent )
     137{
     138        mevent.type          = EV_MOUSE_WHEEL;
     139        mevent.mwheel.x      = static_cast< sint32 >( mm.x );
     140        mevent.mwheel.y      = static_cast< sint32 >( mm.y );
     141        return true;
     142}
     143#endif
    124144
    125145static bool sdl_mouse_motion_to_io_event( const SDL_MouseMotionEvent& mm, io_event& mevent )
     
    180200        case SDL_MOUSEBUTTONDOWN : return sdl_mouse_button_to_io_event( e.button, ioevent );
    181201        case SDL_MOUSEBUTTONUP   : return sdl_mouse_button_to_io_event( e.button, ioevent );
     202#if NV_SDL_VERSION == NV_SDL_20
     203        case SDL_MOUSEWHEEL      : return sdl_mouse_wheel_to_io_event( e.wheel, ioevent );
     204#endif
    182205/* // SDL 2.0 incompatible
    183206        case SDL_ACTIVEEVENT     :
  • trunk/src/io_event.cc

    r214 r304  
    9696        db->create_type<mouse_move_event>("mouse_move_event").fields( mouse_move_fields );
    9797
     98        type_field mouse_wheel_fields[] = {
     99                type_field( "x",       &mouse_wheel_event::x ),
     100                type_field( "y",       &mouse_wheel_event::y ),
     101        };
     102        db->create_type<mouse_wheel_event>("mouse_wheel_event").fields( mouse_wheel_fields );
     103
    98104        type_field joy_button_fields[] = {
    99105                type_field( "id",      &joy_button_event::id ),
  • trunk/tests/md3_test/md3_test.cc

    r239 r304  
    77#include <nv/interface/context.hh>
    88#include <nv/interface/window.hh>
    9 #include <nv/interface/program.hh>
    10 #include <nv/interface/texture2d.hh>
    119#include <nv/interface/mesh_loader.hh>
    1210#include <nv/io/c_file_system.hh>
     
    2220#include <glm/gtx/matrix_interpolation.hpp>
    2321
    24 bool GPU_ANIMATION = false;
     22bool GPU_ANIMATION = true;
    2523
    2624class mesh_part
    2725{
    2826public:
    29         mesh_part( const std::string& path, nv::program* program, nv::window* window )
     27        mesh_part( const std::string& path, nv::window* window )
    3028        {
    3129                NV_PROFILE("mesh_construct");
     
    4240                {
    4341                        NV_PROFILE("create_mesh_data");
    44                         m_mesh_data = loader->release_mesh_data();
    45                         m_tag_map   = loader->create_tag_map();
     42                        m_mesh_data = loader->release_mesh_data_pack();
    4643                }
    4744                delete loader;
    48 
     45                m_entry = nullptr;
    4946                {
    5047                        NV_PROFILE("create_mesh");
    5148                        if ( GPU_ANIMATION )
    52                                 m_mesh      = new nv::keyframed_mesh_gpu( window->get_context(), m_mesh_data, m_tag_map, program );
     49                                m_mesh      = new nv::keyframed_mesh_gpu( window->get_context(), m_mesh_data->get_mesh(0), m_mesh_data->get_nodes() );
    5350                        else
    54                                 m_mesh      = new nv::keyframed_mesh_cpu( window->get_context(), m_mesh_data, m_tag_map );
    55                 }
    56 
    57         }
    58 
    59         nv::mat4 get_transform( const std::string& tag )
    60         {
    61                 return m_mesh->get_tag( tag ).extract();
     51                                m_mesh      = new nv::keyframed_mesh_cpu( window->get_context(), m_mesh_data->get_mesh(0), m_mesh_data->get_nodes() );
     52                }
     53
     54        }
     55
     56        nv::mat4 get_transform( nv::uint32 id )
     57        {
     58                return m_mesh->get_node_transform( id ).extract();
    6259        }
    6360
    6461        void setup_animation( nv::uint32 start, nv::uint32 stop, nv::uint32 fps, bool loop )
    6562        {
    66                 m_mesh->setup_animation( start, stop, fps, loop );
    67         }
    68 
    69         void update( nv::uint32 ms, nv::program* program )
     63                delete m_entry;
     64                m_entry = new nv::animation_entry("test", loop, fps, (float)start, float(stop-1) );
     65                m_mesh->run_animation( m_entry );
     66        }
     67
     68        void update( nv::uint32 ms, nv::program program )
    7069        {
    7170                m_mesh->update( ms );
     71                m_mesh->update_animation( m_entry, ms );
    7272                m_mesh->update( program );
    7373        }
     
    8282        ~mesh_part()
    8383        {
    84                 delete m_tag_map;
    8584                delete m_mesh_data;
    8685                delete m_mesh;
     
    8887
    8988private:
    90         nv::tag_map*        m_tag_map;
    91         nv::mesh_data*      m_mesh_data;
    92         nv::keyframed_mesh* m_mesh;
     89        nv::mesh_data_pack*  m_mesh_data;
     90        nv::keyframed_mesh*  m_mesh;
     91        nv::animation_entry* m_entry;
    9392};
    9493
     
    102101protected:
    103102        nv::device*       m_device;
     103        nv::context*      m_context;
    104104        nv::window*       m_window;
    105         nv::texture2d*    m_diffuse;
    106         nv::texture2d*    m_diffuse_weapon;
     105        nv::texture       m_diffuse;
     106        nv::texture       m_diffuse_weapon;
    107107
    108108        nv::clear_state   m_clear_state;
     
    114114        mesh_part* m_head;
    115115        mesh_part* m_weapon;
    116         nv::program* m_program;
     116        nv::program m_program;
    117117};
    118118
     
    120120{
    121121        NV_PROFILE( "app_construct" );
    122         m_device = new nv::gl_device();
    123         m_window = m_device->create_window( 800, 600, false );
     122        m_device  = new nv::gl_device();
     123        m_window  = m_device->create_window( 800, 600, false );
     124        m_context = m_window->get_context();
    124125
    125126        nv::sampler sampler( nv::sampler::LINEAR, nv::sampler::REPEAT );
    126127        nv::image_data* data = m_device->create_image_data( "data/doom.png" );
    127         m_diffuse  = m_device->create_texture2d( data->get_size(), nv::RGBA, nv::UBYTE, sampler, (void*)data->get_data() );
     128        m_diffuse  = m_device->create_texture( data->get_size(), nv::image_format( nv::RGBA, nv::UBYTE ), sampler, (void*)data->get_data() );
    128129        delete data;
    129130        data = m_device->create_image_data( "data/rocketl.png" );
    130         m_diffuse_weapon = m_device->create_texture2d( data->get_size(), nv::RGBA, nv::UBYTE, sampler, (void*)data->get_data() );
     131        m_diffuse_weapon = m_device->create_texture( data->get_size(), nv::image_format( nv::RGBA, nv::UBYTE ), sampler, (void*)data->get_data() );
    131132        delete data;
    132133
     
    148149                nv::slurp( "obj.frag" )
    149150        );
    150         m_torso   = new mesh_part( "data/upper.md3", m_program, m_window );
    151         m_legs    = new mesh_part( "data/lower.md3", m_program, m_window );
    152         m_head    = new mesh_part( "data/head.md3", m_program, m_window );
    153         m_weapon  = new mesh_part( "data/rocketl.md3", m_program, m_window );
     151        m_torso   = new mesh_part( "data/upper.md3", m_window );
     152        m_legs    = new mesh_part( "data/lower.md3", m_window );
     153        m_head    = new mesh_part( "data/head.md3", m_window );
     154        m_weapon  = new mesh_part( "data/rocketl.md3", m_window );
    154155        return true;
    155156}
     
    176177                ticks      = m_device->get_ticks();
    177178                nv::uint32 elapsed = ticks - last_ticks;
    178                 m_torso->update( elapsed, m_program );
    179                 m_legs->update( elapsed, m_program );
     179                m_torso->update( ticks, m_program );
     180                m_legs->update( ticks, m_program );
    180181                {
    181182                        NV_PROFILE( "clear" );
    182                         m_window->get_context()->clear( m_clear_state );
     183                        m_context->clear( m_clear_state );
    183184                }
    184185
     
    194195                        m_scene_state.get_camera().set_perspective(60.0f, 1.0f*800.0f/600.0f, 0.1f, 1000.0f);
    195196
    196                         m_diffuse->bind( 0 );
    197                         m_program->set_uniform( "light_position", glm::vec3(120.0, 120.0, 0) );
    198                         m_program->set_uniform( "light_diffuse",  glm::vec4(1.0,1.0,1.0,1.0) );
    199                         m_program->set_uniform( "light_specular", glm::vec4(1.0,1.0,1.0,1.0) );
     197                        m_context->bind( m_diffuse, nv::TEX_DIFFUSE );
     198                        m_device->set_uniform( m_program, "light_position", glm::vec3(120.0, 120.0, 0) );
     199                        m_device->set_uniform( m_program, "light_diffuse",  glm::vec4(1.0,1.0,1.0,1.0) );
     200                        m_device->set_uniform( m_program, "light_specular", glm::vec4(1.0,1.0,1.0,1.0) );
    200201                }
    201202
     
    208209
    209210                        //model = m_legs->get_transform( "tag_torso", last_legs_frame, legs_frame, legs_interpolate );
    210                         model = m_legs->get_transform( "tag_torso" );
     211                        model = m_legs->get_transform( 0 );
    211212                        m_scene_state.set_model( model );
    212213                        m_window->get_context()->draw( m_render_state, m_scene_state, m_program, m_torso->get_mesh() );
    213214
    214                         glm::mat4 head = model * m_torso->get_transform( "tag_head" ); //, last_torso_frame, torso_frame, torso_interpolate );
     215                        glm::mat4 head = model * m_torso->get_transform( 0 ); //, last_torso_frame, torso_frame, torso_interpolate );
    215216                        m_scene_state.set_model( head );
    216217                        m_window->get_context()->draw( m_render_state, m_scene_state, m_program, m_head->get_mesh() );
    217218
    218                         glm::mat4 weapon = model * m_torso->get_transform( "tag_weapon" ); //, last_torso_frame, torso_frame, torso_interpolate );
     219                        glm::mat4 weapon = model * m_torso->get_transform( 2 ); //, last_torso_frame, torso_frame, torso_interpolate );
    219220                        m_scene_state.set_model( weapon );
    220                         m_diffuse_weapon->bind( 0 );
    221                         m_window->get_context()->draw( m_render_state, m_scene_state, m_program, m_weapon->get_mesh() );
     221                        m_context->bind( m_diffuse_weapon, nv::TEX_DIFFUSE );
     222                        m_context->draw( m_render_state, m_scene_state, m_program, m_weapon->get_mesh() );
    222223
    223224                }
     
    273274application::~application()
    274275{
    275         delete m_program;
     276        m_device->release( m_program );
    276277        delete m_torso;
    277278        delete m_legs;
    278279        delete m_head;
    279280        delete m_weapon;
    280         delete m_diffuse;
    281         delete m_diffuse_weapon;
     281        m_device->release( m_diffuse );
     282        m_device->release( m_diffuse_weapon );
    282283        delete m_window;
    283284        delete m_device;
Note: See TracChangeset for help on using the changeset viewer.