- Timestamp:
- 08/11/14 11:56:19 (11 years ago)
- Location:
- trunk/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/formats/md3_loader.cc
r291 r304 233 233 static bool s_normal_ready = false; 234 234 235 md3_loader::md3_loader( )236 : m_md3( nullptr ) 235 md3_loader::md3_loader( bool merge_all ) 236 : m_md3( nullptr ), m_merge_all( merge_all ) 237 237 { 238 238 if ( !s_normal_ready ) … … 319 319 }; 320 320 321 mesh_data* nv::md3_loader::release_mesh_data( size_t )321 mesh_data* nv::md3_loader::release_mesh_data( size_t index ) 322 322 { 323 323 mesh_data* data = new mesh_data; 324 release_mesh_frame( data, -1 );324 release_mesh_frame( data, -1, index ); 325 325 return data; 326 326 } 327 327 328 void nv::md3_loader::release_mesh_frame( mesh_data* data, sint32 frame )328 void nv::md3_loader::release_mesh_frame( mesh_data* data, sint32 frame, sint32 surface ) 329 329 { 330 330 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; 333 333 sint32 current_frame = ( frame == -1 ? 0 : frame ); 334 334 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 } 335 350 336 351 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 ); 337 354 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; 340 386 while ( frame_count > 0 ) 341 387 { 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]; 345 394 sint32 vcount = surface.header.num_verts; 346 395 sint32 offset = vcount * current_frame; … … 353 402 index++; 354 403 } 355 404 ++current_surf; 405 --surf_count; 356 406 } 357 407 ++current_frame; 358 408 --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;396 409 } 397 410 … … 427 440 mesh_data_pack* nv::md3_loader::release_mesh_data_pack() 428 441 { 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() ); 432 462 } 433 463 -
trunk/src/gfx/keyframed_mesh.cc
r303 r304 47 47 transform keyframed_mesh::get_node_transform( uint32 node_id ) const 48 48 { 49 NV_ASSERT( m_tag_map, "TAGMAP FAIL");49 if ( !m_tag_map ) return transform(); 50 50 NV_ASSERT( node_id < m_tag_map->get_count(), "TAGMAP FAIL" ); 51 51 const key_data* data = m_tag_map->get_node( node_id )->data; -
trunk/src/gl/gl_window.cc
r295 r304 115 115 case SDL_BUTTON_MIDDLE : mevent.mbutton.button = MOUSE_MIDDLE; break; 116 116 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 119 129 default : break; 120 130 } … … 122 132 return mevent.mbutton.button != MOUSE_NONE; 123 133 } 134 135 #if NV_SDL_VERSION == NV_SDL_20 136 static 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 124 144 125 145 static bool sdl_mouse_motion_to_io_event( const SDL_MouseMotionEvent& mm, io_event& mevent ) … … 180 200 case SDL_MOUSEBUTTONDOWN : return sdl_mouse_button_to_io_event( e.button, ioevent ); 181 201 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 182 205 /* // SDL 2.0 incompatible 183 206 case SDL_ACTIVEEVENT : -
trunk/src/io_event.cc
r214 r304 96 96 db->create_type<mouse_move_event>("mouse_move_event").fields( mouse_move_fields ); 97 97 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 98 104 type_field joy_button_fields[] = { 99 105 type_field( "id", &joy_button_event::id ),
Note: See TracChangeset
for help on using the changeset viewer.