Changeset 482 for trunk/src/gfx/mesh_creator.cc
- Timestamp:
- 11/12/15 19:02:08 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/mesh_creator.cc
r480 r482 13 13 struct nv_key_transform { nv::transform tform; }; 14 14 15 void nv::mesh_nodes_creator::pre_transform_keys()16 {17 if ( m_data->m_flat ) return;18 merge_keys();19 uint16 max_frames = 0;20 21 nv::vector< sint16 > ids;22 {23 // TODO: simplify this shit!24 // The complexity here is that we cannot pre-transform in any order25 // as the bones depend on previous bones, but ARE NOT IN ORDER26 //27 // Either rewrite this a lot nicer, or sort the bones on creation28 // by tree-order.29 30 ids.reserve( m_data->m_data.size() );31 {32 nv::vector< sint16 > ids_next;33 ids_next.reserve( m_data->m_data.size() );34 ids_next.push_back( -1 );35 while ( !ids_next.empty() )36 {37 sint16 pid = ids_next.back();38 ids_next.pop_back();39 for ( sint16 i = 0; i < sint16(m_data->m_data.size()); ++i )40 if ( m_data->m_data[i]->get_parent_id() == pid )41 {42 sint16* it = nv::find( ids.begin(), ids.end(), i );43 if ( it == ids.end() )44 {45 ids.push_back( i );46 ids_next.push_back( i );47 }48 }49 }50 }51 52 if ( ids.size() != m_data->m_data.size() )53 {54 NV_LOG_WARNING( "Bad skeleton!" );55 }56 }57 58 NV_LOG_DEBUG( "ID/PID" );59 for ( auto id : ids )60 {61 data_channel_set* keys = m_data->m_data[id];62 sint16 parent_id = keys->get_parent_id();63 NV_LOG_DEBUG( "Id : ", id, " PID", parent_id );64 data_channel_set* pkeys = ( parent_id != -1 ? m_data->m_data[parent_id] : nullptr );65 size_t count = ( keys ? keys->get_channel_size(0) : 0 );66 size_t pcount = ( pkeys ? pkeys->get_channel_size(0) : 0 );67 max_frames = nv::max<uint16>( uint16( count ), max_frames );68 if ( pkeys && pkeys->size() > 0 && keys && keys->size() > 0 )69 {70 data_channel_access< nv_key_transform > channel_creator( keys, 0 );71 72 nv_key_transform* channel = channel_creator.data();73 const nv_key_transform* pchannel = pkeys->get_channel(0)->data_cast< nv_key_transform >();74 for ( unsigned n = 0; n < count; ++n )75 {76 channel[n].tform = pchannel[ nv::min( n, pcount-1 ) ].tform * channel[n].tform;77 }78 }79 }80 81 // DAE pre_transform hack82 if ( m_data->m_frame_rate == 1 )83 {84 m_data->m_frame_rate = 32;85 m_data->m_frame_count = max_frames;86 }87 88 m_data->m_flat = true;89 }90 91 92 15 void nv::mesh_nodes_creator::merge_keys() 93 16 { … … 110 33 data_channel_set* new_keys = data_channel_set_creator::create_set( 1 ); 111 34 data_channel_set_creator nk_access( new_keys ); 112 nk_access.set_name( old_keys->get_name() );113 nk_access.set_parent_id( old_keys->get_parent_id() );114 nk_access.set_transform( old_keys->get_transform() );115 35 data_channel_access< nv_key_transform > kt_channel( nk_access.add_channel<nv_key_transform>( max_keys ) ); 116 36 … … 145 65 for ( auto node : m_data->m_data ) 146 66 { 147 node->m_transform = pre_transform * node->m_transform * post_transform;148 149 67 for ( size_t c = 0; c < node->size(); ++c ) 150 68 { … … 158 76 } 159 77 } 78 79 void nv::data_node_list_creator::transform( float scale, const mat3& r33 ) 80 { 81 mat3 ri33 = math::inverse( r33 ); 82 mat4 pre_transform( scale * r33 ); 83 mat4 post_transform( 1.f / scale * ri33 ); 84 85 for ( auto& node : m_data->m_data ) 86 node.transform = pre_transform * node.transform * post_transform; 87 } 88 160 89 161 90 void nv::mesh_data_creator::transform( float scale, const mat3& r33 ) … … 209 138 nv::vec4 tangent; 210 139 }; 140 211 141 212 142 void nv::mesh_data_creator::flip_normals() … … 434 364 } 435 365 366 436 367 template < typename T > 437 368 static inline void swap_culling_impl( nv::raw_data_channel* index_channel ) … … 650 581 initialize(); 651 582 } 652
Note: See TracChangeset
for help on using the changeset viewer.