Changeset 304
- Timestamp:
- 08/11/14 11:56:19 (11 years ago)
- Location:
- trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/detail/io_event_list.inc
r184 r304 2 2 NV_IO_EVENT( EV_MOUSE_BUTTON ) 3 3 NV_IO_EVENT( EV_MOUSE_MOVE ) 4 NV_IO_EVENT( EV_MOUSE_WHEEL ) 4 5 NV_IO_EVENT( EV_JOY_BUTTON ) 5 6 NV_IO_EVENT( EV_JOY_AXIS ) -
trunk/nv/detail/mouse_list.inc
r67 r304 3 3 NV_MOUSE( MOUSE_MIDDLE, 2 ) 4 4 NV_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 32 32 { 33 33 public: 34 md3_loader( );34 md3_loader( bool merge_all = true ); 35 35 virtual ~md3_loader(); 36 36 virtual bool load( stream& source ); … … 42 42 virtual mesh_nodes_data* release_mesh_nodes_data( size_t = 0 ); 43 43 private: 44 void release_mesh_frame( mesh_data* data, sint32 frame );44 void release_mesh_frame( mesh_data* data, sint32 frame, sint32 surface ); 45 45 key_raw_channel* load_tags( const std::string& tag ); 46 bool m_merge_all; 46 47 void* m_md3; 47 48 }; -
trunk/nv/gfx/keyframed_mesh.hh
r303 r304 28 28 virtual void update_animation( animation_entry*, uint32 a_anim_time ); 29 29 virtual void update( program a_program ); 30 virtual void update( uint32 ms ) { animated_mesh::update(ms); } 30 31 virtual ~keyframed_mesh(); 31 32 protected: -
trunk/nv/gfx/mesh_creator.hh
r295 r304 50 50 public: 51 51 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 } 52 61 // assumes that keys are equally spaced 53 62 void pre_transform_keys() -
trunk/nv/interface/mesh_data.hh
r302 r304 202 202 } 203 203 204 void destroy() 205 { 206 for ( auto channel : m_channels ) delete channel; 207 m_channels.clear(); 208 m_index_channel = nullptr; 209 } 210 204 211 virtual ~mesh_data() 205 212 { 206 for ( auto channel : m_channels ) delete channel;213 destroy(); 207 214 } 208 215 private: -
trunk/nv/io_event.hh
r262 r304 77 77 /// Mouse button code 78 78 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; 79 87 }; 80 88 … … 166 174 mouse_button_event mbutton; 167 175 mouse_move_event mmove; 176 mouse_wheel_event mwheel; 168 177 joy_button_event jbutton; 169 178 joy_axis_event jaxis; -
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 ), -
trunk/tests/md3_test/md3_test.cc
r239 r304 7 7 #include <nv/interface/context.hh> 8 8 #include <nv/interface/window.hh> 9 #include <nv/interface/program.hh>10 #include <nv/interface/texture2d.hh>11 9 #include <nv/interface/mesh_loader.hh> 12 10 #include <nv/io/c_file_system.hh> … … 22 20 #include <glm/gtx/matrix_interpolation.hpp> 23 21 24 bool GPU_ANIMATION = false;22 bool GPU_ANIMATION = true; 25 23 26 24 class mesh_part 27 25 { 28 26 public: 29 mesh_part( const std::string& path, nv:: program* program, nv::window* window )27 mesh_part( const std::string& path, nv::window* window ) 30 28 { 31 29 NV_PROFILE("mesh_construct"); … … 42 40 { 43 41 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(); 46 43 } 47 44 delete loader; 48 45 m_entry = nullptr; 49 46 { 50 47 NV_PROFILE("create_mesh"); 51 48 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() ); 53 50 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(); 62 59 } 63 60 64 61 void setup_animation( nv::uint32 start, nv::uint32 stop, nv::uint32 fps, bool loop ) 65 62 { 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 ) 70 69 { 71 70 m_mesh->update( ms ); 71 m_mesh->update_animation( m_entry, ms ); 72 72 m_mesh->update( program ); 73 73 } … … 82 82 ~mesh_part() 83 83 { 84 delete m_tag_map;85 84 delete m_mesh_data; 86 85 delete m_mesh; … … 88 87 89 88 private: 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; 93 92 }; 94 93 … … 102 101 protected: 103 102 nv::device* m_device; 103 nv::context* m_context; 104 104 nv::window* m_window; 105 nv::texture 2d*m_diffuse;106 nv::texture 2d*m_diffuse_weapon;105 nv::texture m_diffuse; 106 nv::texture m_diffuse_weapon; 107 107 108 108 nv::clear_state m_clear_state; … … 114 114 mesh_part* m_head; 115 115 mesh_part* m_weapon; 116 nv::program *m_program;116 nv::program m_program; 117 117 }; 118 118 … … 120 120 { 121 121 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(); 124 125 125 126 nv::sampler sampler( nv::sampler::LINEAR, nv::sampler::REPEAT ); 126 127 nv::image_data* data = m_device->create_image_data( "data/doom.png" ); 127 m_diffuse = m_device->create_texture 2d( 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() ); 128 129 delete data; 129 130 data = m_device->create_image_data( "data/rocketl.png" ); 130 m_diffuse_weapon = m_device->create_texture 2d( 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() ); 131 132 delete data; 132 133 … … 148 149 nv::slurp( "obj.frag" ) 149 150 ); 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 ); 154 155 return true; 155 156 } … … 176 177 ticks = m_device->get_ticks(); 177 178 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 ); 180 181 { 181 182 NV_PROFILE( "clear" ); 182 m_ window->get_context()->clear( m_clear_state );183 m_context->clear( m_clear_state ); 183 184 } 184 185 … … 194 195 m_scene_state.get_camera().set_perspective(60.0f, 1.0f*800.0f/600.0f, 0.1f, 1000.0f); 195 196 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) ); 200 201 } 201 202 … … 208 209 209 210 //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 ); 211 212 m_scene_state.set_model( model ); 212 213 m_window->get_context()->draw( m_render_state, m_scene_state, m_program, m_torso->get_mesh() ); 213 214 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 ); 215 216 m_scene_state.set_model( head ); 216 217 m_window->get_context()->draw( m_render_state, m_scene_state, m_program, m_head->get_mesh() ); 217 218 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 ); 219 220 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() ); 222 223 223 224 } … … 273 274 application::~application() 274 275 { 275 delete m_program;276 m_device->release( m_program ); 276 277 delete m_torso; 277 278 delete m_legs; 278 279 delete m_head; 279 280 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 ); 282 283 delete m_window; 283 284 delete m_device;
Note: See TracChangeset
for help on using the changeset viewer.