Changeset 467 for trunk/src/gfx/skeletal_mesh.cc
- Timestamp:
- 09/08/15 18:40:48 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/skeletal_mesh.cc
r458 r467 11 11 #include "nv/stl/unordered_map.hh" 12 12 13 nv::skeletal_mesh_cpu::skeletal_mesh_cpu( context* a_context, const data_channel_set* a_mesh_data, const mesh_nodes_data* bones ) 14 : skeletal_mesh( a_context ) 15 { 16 const raw_data_channel* pnt_chan = a_mesh_data->get_channel<md5_vtx_pnt>(); 17 const raw_data_channel* pntiw_chan = a_mesh_data->get_channel<md5_vtx_pntiw>(); 18 19 m_pntdata.assign( pnt_chan->data_cast< md5_vtx_pnt >(), pnt_chan->size() ); 20 m_bone_offset.resize( bones->size() ); 21 m_transform.resize( bones->size() ); 22 23 for ( uint32 i = 0; i < bones->size(); ++i ) 24 { 25 m_bone_offset[i] = transform( (*bones)[i]->get_transform() ); 26 } 27 28 m_vtx_data = a_mesh_data->get_channel_data<md5_vtx_pntiw>(); 29 m_indices = a_mesh_data->get_channel_size( slot::INDEX ); 30 m_va = a_context->create_vertex_array(); 31 32 //array_view< raw_data_channel* > channels = a_mesh_data->get_raw_channels(); 33 for ( auto& channel : *a_mesh_data ) 34 { 35 //const raw_data_channel* channel = channels[ch]; 36 if ( channel.size() > 0 && &channel != pntiw_chan ) 37 { 38 const data_descriptor& desc = channel.descriptor(); 39 if ( desc[0].vslot == slot::INDEX ) 40 { 41 buffer b = a_context->get_device()->create_buffer( INDEX_BUFFER, STREAM_DRAW, channel.raw_size(), channel.raw_data() ); 42 a_context->set_index_buffer( m_va, b, desc[0].etype, true ); 43 } 44 else 45 { 46 buffer b = a_context->get_device()->create_buffer( VERTEX_BUFFER, STREAM_DRAW, channel.raw_size(), channel.raw_data() ); 47 a_context->add_vertex_buffers( m_va, b, desc ); 48 } 49 } 50 } 51 52 m_pbuffer = a_context->find_buffer( m_va, slot::POSITION ); 53 } 54 55 void nv::skeletal_mesh_cpu::update_animation( animation_entry* a_anim, uint32 a_anim_time ) 56 { 57 if ( a_anim ) 58 { 59 skeletal_animation_entry_cpu * anim = static_cast<skeletal_animation_entry_cpu*>( a_anim ); 60 anim->update_skeleton( m_transform.data(), static_cast<float>( a_anim_time ) ); 61 { 62 size_t skeleton_size = m_bone_offset.size(); 63 size_t vertex_count = m_pntdata.size(); 64 m_pos_offset.resize( skeleton_size ); 65 for ( unsigned int i = 0; i < skeleton_size; ++i ) 66 { 67 m_pos_offset[i] = m_transform[i] * m_bone_offset[i]; 68 } 69 70 fill( m_pntdata.raw_data(), m_pntdata.raw_data() + m_pntdata.raw_size(), 0 ); 71 for ( unsigned int i = 0; i < vertex_count; ++i ) 72 { 73 const md5_vtx_pntiw& vert = m_vtx_data[i]; 74 75 for ( int j = 0; j < 4; ++j ) 76 { 77 unsigned index = unsigned( vert.boneindex[j] ); 78 float weight = vert.boneweight[j]; 79 const quat& orient = m_transform[index].get_orientation(); 80 const transform& offset = m_pos_offset[index]; 81 m_pntdata[i].position += offset.transformed( vert.position ) * weight; 82 m_pntdata[i].normal += ( orient * vert.normal ) * weight; 83 m_pntdata[i].tangent += ( orient * vert.tangent ) * weight; 84 } 85 } 86 } 87 88 m_context->update( m_pbuffer, m_pntdata.data(), 0, m_pntdata.raw_size() ); 89 } 90 } 91 92 93 void nv::skeletal_animation_entry_cpu::initialize() 94 { 95 for ( auto bone : *m_node_data ) 96 { 97 if ( bone->size() > 0 ) 98 { 99 m_interpolation_key = bone->get_interpolation_key(); 100 break; 101 } 102 } 103 } 104 105 void nv::skeletal_animation_entry_cpu::update_skeleton( transform* skeleton, float time ) const 106 { 107 float frame_duration = 1000.f / static_cast<float>( m_node_data->get_frame_rate() ); 108 float anim_duration = frame_duration * m_node_data->get_duration(); 109 float new_time = fmodf( time, anim_duration ) * 0.001f; 110 111 float frame_num = new_time * m_node_data->get_frame_rate(); 112 for ( size_t i = 0; i < m_node_data->size(); ++i ) 113 { 114 raw_channel_interpolator interpolator( (*m_node_data)[i], m_interpolation_key ); 115 skeleton[i] = interpolator.get< transform >( frame_num ); 116 } 117 } 118 119 void nv::skeletal_animation_entry_gpu::initialize() 13 void nv::skeletal_animation_entry::initialize() 120 14 { 121 15 m_prepared = false; … … 140 34 } 141 35 142 void nv::skeletal_animation_entry _gpu::update_skeleton( mat4* data, uint32 time ) const36 void nv::skeletal_animation_entry::update_skeleton( mat4* data, uint32 time ) const 143 37 { 144 38 float tick_time = ( time * 0.001f ) * m_frame_rate; … … 169 63 } 170 64 171 void nv::skeletal_animation_entry _gpu::prepare( const mesh_nodes_data* bones )65 void nv::skeletal_animation_entry::prepare( const mesh_nodes_data* bones ) 172 66 { 173 67 if ( m_prepared ) return; … … 200 94 } 201 95 202 void nv::skeletal_animation_entry _gpu::animate_rec( mat4* data, float time, uint32 node_id, const mat4& parent_mat ) const96 void nv::skeletal_animation_entry::animate_rec( mat4* data, float time, uint32 node_id, const mat4& parent_mat ) const 203 97 { 204 98 // TODO: fix transforms, which are now embedded, … … 227 121 } 228 122 229 nv::skeletal_animation_entry _gpu::~skeletal_animation_entry_gpu()123 nv::skeletal_animation_entry::~skeletal_animation_entry() 230 124 { 231 125 delete[] m_offsets; … … 234 128 } 235 129 236 nv::skeletal_mesh _gpu::skeletal_mesh_gpu( context* a_context, const data_channel_set* a_mesh, const mesh_nodes_data* a_bone_data )237 : skeletal_mesh( a_context ), m_bone_data( a_bone_data ), m_index_count( 0 ), m_transform( nullptr )130 nv::skeletal_mesh::skeletal_mesh( context* a_context, const data_channel_set* a_mesh, const mesh_nodes_data* a_bone_data ) 131 : m_context( a_context ), m_bone_data( a_bone_data ), m_index_count( 0 ), m_transform( nullptr ) 238 132 { 239 133 if ( a_mesh ) … … 248 142 } 249 143 250 void nv::skeletal_mesh _gpu::update_animation( animation_entry* a_anim, uint32 a_anim_time )144 void nv::skeletal_mesh::update_animation( animation_entry* a_anim, uint32 a_anim_time ) 251 145 { 252 146 if ( m_bone_data && a_anim ) 253 147 { 254 skeletal_animation_entry _gpu * anim = static_cast<skeletal_animation_entry_gpu*>( a_anim );148 skeletal_animation_entry * anim = static_cast<skeletal_animation_entry*>( a_anim ); 255 149 anim->prepare( m_bone_data ); 256 150 anim->update_skeleton( m_transform, a_anim_time ); … … 258 152 } 259 153 260 void nv::skeletal_mesh _gpu::update( program a_program )154 void nv::skeletal_mesh::update( program a_program ) 261 155 { 262 156 if ( m_bone_data ) … … 264 158 } 265 159 266 nv::transform nv::skeletal_mesh _gpu::get_node_transform( uint32 node_id ) const160 nv::transform nv::skeletal_mesh::get_node_transform( uint32 node_id ) const 267 161 { 268 162 if ( node_id == 0 ) return transform(); … … 271 165 } 272 166 273 nv::mat4 nv::skeletal_mesh _gpu::get_node_matrix( uint32 node_id ) const167 nv::mat4 nv::skeletal_mesh::get_node_matrix( uint32 node_id ) const 274 168 { 275 169 return m_transform[ node_id ];
Note: See TracChangeset
for help on using the changeset viewer.