- Timestamp:
- 10/23/15 19:35:39 (10 years ago)
- Location:
- trunk/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/engine/program_manager.cc
r474 r477 16 16 } 17 17 18 nv::res_id nv::program_manager::load_resource( lua::table_guard& table)18 bool nv::program_manager::load_resource( lua::table_guard& table, shash64 id ) 19 19 { 20 20 NV_LOG_DEBUG( table.get_string("id") ); … … 36 36 } 37 37 38 nv::program* program = new nv::program( m_context->get_device()->create_program( vsource, fsource ));39 return add( program );38 add( m_context->get_device()->create_program( vsource, fsource ), id ); 39 return true; 40 40 } 41 41 42 void nv::program_manager::release( program *p )42 void nv::program_manager::release( program p ) 43 43 { 44 m_context->get_device()->release( *p ); 45 delete p; 44 m_context->get_device()->release( p ); 46 45 } 47 46 -
trunk/src/engine/resource_system.cc
r474 r477 9 9 #include "nv/lua/lua_nova.hh" 10 10 11 void nv:: resource_manager_base::initialize( lua::state* a_lua_state )11 void nv::lua_resource_manager_base::initialize( lua::state* a_lua_state ) 12 12 { 13 13 m_lua = a_lua_state; … … 16 16 } 17 17 18 nv::res_id nv::resource_manager_base::load_resource( const string_view& id )18 bool nv::lua_resource_manager_base::load_resource( const string_view& id ) 19 19 { 20 20 lua::table_guard table( m_lua, lua::path( get_storage_name(), id ) ); 21 res_id rid = load_resource( table ); 22 if ( rid != 0 ) m_names[ id ] = rid; 23 return rid; 21 load_resource( table, id ); 22 return true; 24 23 } 25 24 26 void nv:: resource_manager_base::load_all()25 void nv::lua_resource_manager_base::load_all() 27 26 { 28 27 clear(); … … 31 30 for ( auto i : range( count ) ) 32 31 { 33 lua::table_guard sub_table( table, i+1 ); 34 res_id rid = load_resource( sub_table ); 35 if ( rid != 0 ) m_names[ sub_table.get_string_hash_64("id") ] = rid; 32 lua::table_guard sub_table( table, i + 1 ); 33 load_resource( sub_table, sub_table.get_string_hash_64( "id" ) ); 36 34 } 37 35 } 36 -
trunk/src/gfx/skeletal_mesh.cc
r475 r477 13 13 #include "nv/core/logging.hh" 14 14 15 void nv::skeletal_animation_entry::update_skeleton( mat4*data, uint32 a_ms_time ) const15 void nv::skeletal_animation_entry::update_skeleton( skeleton_instance& data, uint32 a_ms_time ) const 16 16 { 17 17 float fframe = ( a_ms_time * 0.001f ) * m_fps; … … 38 38 } 39 39 40 m_data.animate( data, fframe ); 40 if ( data.size() == 0 ) 41 data.initialize( m_temp_anim->size() ); 42 data.animate( m_temp_anim, m_data, fframe ); 41 43 } 42 44 43 45 void nv::skeletal_animation_entry::prepare( const mesh_nodes_data* bones ) 44 46 { 45 m_data.prepare( bones);47 m_data.prepare( m_temp_anim, bones ? bones : m_temp_anim ); 46 48 } 47 49 48 50 nv::skeletal_mesh::skeletal_mesh( context* a_context, const data_channel_set* a_mesh, const mesh_nodes_data* a_bone_data ) 49 : m_ context( a_context ), m_bone_data( a_bone_data ), m_index_count( 0 ), m_transform( nullptr), m_parent_id(-1)51 : m_skeleton( a_bone_data ? a_bone_data->size() : 0 ), m_context( a_context ), m_bone_data( a_bone_data ), m_index_count( 0 ), m_parent_id(-1) 50 52 { 51 53 if ( a_mesh ) … … 55 57 m_parent_id = a_mesh->get_parent_id(); 56 58 } 57 if ( m_bone_data )58 {59 m_transform = new mat4[ m_bone_data->size() ];60 }61 59 } 62 60 63 void nv::skeletal_mesh::update_animation( animation_entry *a_anim, uint32 a_anim_time )61 void nv::skeletal_mesh::update_animation( animation_entry& a_anim, uint32 a_anim_time ) 64 62 { 65 if ( m_bone_data && a_anim ) 66 { 67 skeletal_animation_entry * anim = static_cast<skeletal_animation_entry*>( a_anim ); 68 anim->prepare( m_bone_data ); 69 anim->update_skeleton( m_transform, a_anim_time ); 70 } 63 skeletal_animation_entry& anim = static_cast<skeletal_animation_entry&>( a_anim ); 64 anim.prepare( m_bone_data ); 65 anim.update_skeleton( m_skeleton, a_anim_time ); 71 66 } 72 67 73 void nv::skeletal_mesh::update ( program a_program )68 void nv::skeletal_mesh::update_program( program a_program ) 74 69 { 75 if ( m_bone_data ) 76 m_context->get_device()->set_opt_uniform_array( a_program, "nv_m_bones", m_transform, m_bone_data->size() ); 70 m_context->get_device()->set_opt_uniform_array( a_program, "nv_m_bones", m_skeleton.transforms(), m_skeleton.size() ); 77 71 } 78 72 79 73 nv::transform nv::skeletal_mesh::get_node_transform( uint32 node_id ) const 80 74 { 81 return transform( m_transform[ node_id ]);75 return transform( get_node_matrix( node_id ) ); 82 76 } 83 77 84 78 nv::mat4 nv::skeletal_mesh::get_node_matrix( uint32 node_id ) const 85 79 { 86 return m_ transform[ node_id ];80 return m_skeleton.transforms()[ node_id ]; 87 81 } -
trunk/src/gfx/skeleton_instance.cc
r475 r477 7 7 #include "nv/gfx/skeleton_instance.hh" 8 8 9 void nv::skeleton_ instance::prepare( const mesh_nodes_data* bones)9 void nv::skeleton_binding::prepare( const mesh_nodes_data* node_data, const mesh_nodes_data* bone_data ) 10 10 { 11 if ( m_offsets || m_indices ) return; 12 hash_store< shash64, uint16 > bone_names; 13 m_offsets = new mat4[bones->size()]; 14 m_indices = new sint16[m_data->size()]; 11 if ( !m_offsets || !m_indices ) 12 { 13 // TODO: either fixed size struct or static allocator 14 hash_store< shash64, uint16 > bone_names; 15 m_offsets = new mat4[bone_data->size()]; 16 m_indices = new sint16[node_data->size()]; 15 17 16 for ( nv::uint16 bi = 0; bi < bones->size(); ++bi ) 17 { 18 const data_channel_set* bone = ( *bones )[bi]; 19 bone_names[bone->get_name()] = bi; 20 m_offsets[bi] = bone->get_transform(); 18 for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi ) 19 { 20 const data_channel_set* bone = ( *bone_data )[bi]; 21 bone_names[bone->get_name()] = bi; 22 m_offsets[bi] = bone->get_transform(); 23 } 24 25 for ( uint32 n = 0; n < node_data->size(); ++n ) 26 { 27 const data_channel_set* node = ( *node_data )[n]; 28 sint16 bone_id = -1; 29 30 auto bi = bone_names.find( node->get_name() ); 31 if ( bi != bone_names.end() ) 32 { 33 bone_id = sint16( bi->second ); 34 } 35 m_indices[n] = bone_id; 36 37 } 21 38 } 22 39 23 for ( uint32 n = 0; n < m_data->size(); ++n)40 if ( m_key.size() == 0 ) 24 41 { 25 const data_channel_set* node = ( *m_data )[n]; 26 sint16 bone_id = -1; 42 for ( uint32 n = 0; n < node_data->size(); ++n ) 43 if ( ( *node_data )[n]->size() > 0 ) 44 { 45 m_key = ( *node_data )[n]->get_interpolation_key(); 46 break; 47 } 48 } 27 49 28 auto bi = bone_names.find( node->get_name() ); 29 if ( bi != bone_names.end() ) 50 } 51 52 void nv::skeleton_instance::animate( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame ) 53 { 54 if ( m_transform.size() > 0 ) 55 { 56 if ( node_data->is_flat() ) 30 57 { 31 bone_id = sint16( bi->second);58 animate_flat( node_data, binding, frame ); 32 59 } 33 m_indices[n] = bone_id; 34 35 if ( m_key.size() == 0 && node->size() > 0 ) 36 m_key = node->get_interpolation_key(); 60 else 61 { 62 for ( uint32 n = 0; n < node_data->size(); ++n ) 63 if ( ( *node_data )[n]->get_parent_id() == -1 ) 64 animate_rec( node_data, binding, frame, n, mat4() ); 65 } 37 66 } 38 67 } 39 68 40 void nv::skeleton_instance::animate( mat4* data, float frame ) const 41 { 42 if ( m_data->is_flat() ) 43 { 44 animate_flat( data, frame ); 45 } 46 else 47 { 48 for ( uint32 n = 0; n < m_data->size(); ++n ) 49 if ( ( *m_data )[n]->get_parent_id() == -1 ) 50 animate_rec( data, frame, n, mat4() ); 51 } 52 } 53 54 void nv::skeleton_instance::animate_flat( mat4* data, float frame ) const 55 { 56 for ( uint32 n = 0; n < m_data->size(); ++n ) 57 if ( m_indices[n] >= 0 ) 58 { 59 const data_channel_set* node = ( *m_data )[n]; 60 nv::mat4 node_mat( node->get_transform() ); 61 62 if ( node->size() > 0 ) 63 { 64 raw_channel_interpolator interpolator( node, m_key ); 65 node_mat = interpolator.get< mat4 >( frame ); 66 } 67 68 sint16 bone_id = m_indices[n]; 69 data[bone_id] = node_mat * m_offsets[bone_id]; 70 } 71 } 72 73 void nv::skeleton_instance::animate_rec( mat4* data, float frame, uint32 id, const mat4& parent ) const 69 void nv::skeleton_instance::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const mat4& parent ) 74 70 { 75 71 // TODO: fix transforms, which are now embedded, 76 72 // see note in assimp_loader.cc:load_node 77 const data_channel_set* node = ( * m_data )[id];73 const data_channel_set* node = ( *node_data )[id]; 78 74 mat4 node_mat( node->get_transform() ); 79 75 80 76 if ( node->size() > 0 ) 81 77 { 82 raw_channel_interpolator interpolator( node, m_key );78 raw_channel_interpolator interpolator( node, binding.m_key ); 83 79 node_mat = interpolator.get< mat4 >( frame ); 84 80 } … … 86 82 mat4 global_mat = parent * node_mat; 87 83 88 sint16 bone_id = m_indices[id];84 sint16 bone_id = binding.m_indices[id]; 89 85 if ( bone_id >= 0 ) 90 86 { 91 data[bone_id] = global_mat *m_offsets[bone_id];87 m_transform[bone_id] = global_mat * binding.m_offsets[bone_id]; 92 88 } 93 89 94 for ( auto child : m_data->children( id ) )90 for ( auto child : node_data->children( id ) ) 95 91 { 96 animate_rec( data, frame, child, global_mat );92 animate_rec( node_data, binding, frame, child, global_mat ); 97 93 } 98 94 } 95 96 void nv::skeleton_instance::animate_flat( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame ) 97 { 98 for ( uint32 n = 0; n < node_data->size(); ++n ) 99 if ( binding.m_indices[n] >= 0 ) 100 { 101 const data_channel_set* node = ( *node_data )[n]; 102 nv::mat4 node_mat( node->get_transform() ); 103 104 if ( node->size() > 0 ) 105 { 106 raw_channel_interpolator interpolator( node, binding.m_key ); 107 node_mat = interpolator.get< mat4 >( frame ); 108 } 109 110 sint16 bone_id = binding.m_indices[n]; 111 m_transform[bone_id] = node_mat * binding.m_offsets[bone_id]; 112 } 113 } -
trunk/src/gl/gl_device.cc
r473 r477 389 389 glGetProgramInfoLog( p->glid, buffer_size, &length, buffer ); 390 390 NV_LOG_ERROR( "Program #", p->glid, " validation error : ", buffer ); 391 return false;391 //return false; 392 392 } 393 393 load_attributes( p );
Note: See TracChangeset
for help on using the changeset viewer.