Changeset 486 for trunk/src/gfx/skeleton_instance.cc
- Timestamp:
- 02/24/16 18:47:54 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/skeleton_instance.cc
r485 r486 8 8 9 9 #include "nv/core/profiler.hh" 10 #include "nv/interface/interpolate.hh" 10 11 11 12 void nv::skeleton_binding::assign( const skeleton_binding& other ) … … 78 79 } 79 80 80 81 void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const skeleton_binding& binding, const bone_transforms& bones )82 {83 if ( bones.size() != m_matrix.size() )84 m_matrix.resize( bones.size() );85 const transform* transforms = skeleton.xforms();86 for ( uint32 n = 0; n < skeleton.size(); ++n )87 {88 sint16 bone_id = binding.m_indices[n];89 if ( bone_id >= 0 )90 {91 int too_complex;92 transform tr( bones.m_offsets[bone_id] );93 tr.set_orientation( normalize( tr.get_orientation() ) );94 m_matrix[bone_id] = ( transforms[n] * tr ).extract();95 }96 }97 }98 99 100 void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const bone_transforms& bones )101 {102 if ( bones.size() != m_matrix.size() )103 m_matrix.resize( bones.size() );104 const transform* transforms = skeleton.xforms();105 for ( uint32 n = 0; n < skeleton.size(); ++n )106 {107 transform tr( bones.m_offsets[n] );108 tr.set_orientation( normalize( tr.get_orientation() ) );109 m_matrix[n] = ( transforms[n] * tr ).extract();110 // m_matrix[n] = transforms[n].extract() * bones.m_offsets[n];111 }112 }113 114 void nv::skeleton_instance::assign( const bone_transforms& bones )115 {116 if ( bones.size() != m_matrix.size() )117 m_matrix.resize( bones.size() );118 }119 120 81 void nv::skeleton_transforms::assign( const data_node_list* node_data ) 121 82 { … … 125 86 for ( uint32 n = 0; n < node_data->size(); ++n ) 126 87 { 127 const data_node_info& info = (*node_data)[ n ]; 128 m_transforms[n] = transform( info.transform ); 88 m_transforms[n] = transform( ( *node_data )[n].transform ); 129 89 } 130 90 } 131 91 132 void nv::skeleton_transforms::interpolate_linear( const skeleton_transforms& a, const skeleton_transforms& b, float t ) 92 void nv::skeleton_transforms::assign( const skeleton_transforms& other, const array_view< bool >& mask ) 93 { 94 if ( m_transforms.size() != other.size() ) m_transforms.resize( other.size() ); 95 if ( mask.size() == 0 ) 96 m_transforms.assign( other.m_transforms ); 97 else 98 for ( uint32 i = 0; i < other.size(); ++i ) 99 if ( mask[i] ) 100 m_transforms[i] = other.m_transforms[i]; 101 } 102 103 void nv::skeleton_transforms::interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i ) 104 { 105 if ( m_transforms.size() != a.size() ) m_transforms.resize( a.size() ); 106 ::nv::interpolate( m_transforms, t, i, a.m_transforms, b.m_transforms ); 107 } 108 109 void nv::skeleton_transforms::interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, const array_view< bool >& mask ) 110 { 111 if ( m_transforms.size() != a.size() ) m_transforms.resize( a.size() ); 112 if ( mask.size() > 0 ) 113 ::nv::interpolate( m_transforms, t, i, mask, a.m_transforms, b.m_transforms ); 114 else 115 ::nv::interpolate( m_transforms, t, i, a.m_transforms, b.m_transforms ); 116 } 117 118 void nv::skeleton_transforms::interpolate( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i ) 119 { 120 if ( m_transforms.size() != s1.size() ) m_transforms.resize( s1.size() ); 121 ::nv::interpolate( m_transforms, t, i, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 122 } 123 124 void nv::skeleton_transforms::interpolate( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, const array_view< bool >& mask ) 125 { 126 if ( m_transforms.size() != s1.size() ) m_transforms.resize( s1.size() ); 127 if ( mask.size() > 0 ) 128 ::nv::interpolate( m_transforms, t, i, mask, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 129 else 130 ::nv::interpolate( m_transforms, t, i, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 131 } 132 133 void nv::skeleton_transforms::blend( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, float blend, interpolation bi ) 133 134 { 134 135 NV_ASSERT( a.size() == b.size(), "!!!" ); 135 136 if ( m_transforms.size() != a.size() ) 136 137 m_transforms.resize( a.size() ); 137 for ( uint32 n = 0; n < a.size(); ++n ) 138 { 139 m_transforms[n] = transform( 140 math::mix( a.m_transforms[n].get_position(), b.m_transforms[n].get_position(), t ), 141 math::lerp( a.m_transforms[n].get_orientation(), b.m_transforms[n].get_orientation(), t ) 142 ); 143 } 144 145 // if ( m_transforms.size() > 0 ) 146 // m_transforms[0] = nv::interpolate( a.m_transforms[0], b.m_transforms[0], t, interpolation::SPHERICAL ); 138 ::nv::interpolate( m_transforms, t, i, blend, bi, a.m_transforms, b.m_transforms ); 147 139 } 148 140 149 void nv::skeleton_transforms:: interpolate_nlerp( const skeleton_transforms& a, const skeleton_transforms& b, float t)141 void nv::skeleton_transforms::blend( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, float blend, interpolation bi, const array_view< bool >& mask ) 150 142 { 151 143 NV_ASSERT( a.size() == b.size(), "!!!" ); 152 144 if ( m_transforms.size() != a.size() ) 153 145 m_transforms.resize( a.size() ); 154 155 for ( uint32 n = 0; n < a.size(); ++n ) 156 { 157 m_transforms[n] = transform( 158 math::mix( a.m_transforms[n].get_position(), b.m_transforms[n].get_position(), t ), 159 math::nlerp( a.m_transforms[n].get_orientation(), b.m_transforms[n].get_orientation(), t ) 160 ); 161 } 146 if ( mask.size() > 0 ) 147 ::nv::interpolate( m_transforms, t, i, blend, bi, mask, a.m_transforms, b.m_transforms ); 148 else 149 ::nv::interpolate( m_transforms, t, i, blend, bi, a.m_transforms, b.m_transforms ); 162 150 } 163 151 164 165 void nv::skeleton_transforms::interpolate_slerp( const skeleton_transforms& a, const skeleton_transforms& b, float t ) 152 void nv::skeleton_transforms::blend( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, float blend, interpolation bi ) 166 153 { 167 NV_ASSERT( a.size() == b.size(), "!!!" ); 168 if ( m_transforms.size() != a.size() ) 169 m_transforms.resize( a.size() ); 170 for ( uint32 n = 0; n < a.size(); ++n ) 171 { 172 m_transforms[n] = nv::interpolate( a.m_transforms[n], b.m_transforms[n], t, interpolation::SPHERICAL ); 173 } 154 if ( m_transforms.size() != s1.size() ) m_transforms.resize( s1.size() ); 155 ::nv::interpolate( m_transforms, t, i, blend, bi, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 174 156 } 175 157 176 void nv::skeleton_transforms::blend _slerp( const skeleton_transforms& a, const skeleton_transforms& b, float t, float blend)158 void nv::skeleton_transforms::blend( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, float blend, interpolation bi, const array_view< bool >& mask ) 177 159 { 178 NV_ASSERT( a.size() == b.size(), "!!!" ); 179 if ( m_transforms.size() != a.size() ) 180 m_transforms.resize( a.size() ); 181 for ( uint32 n = 0; n < a.size(); ++n ) 182 { 183 transform tr = nv::interpolate( a.m_transforms[n], b.m_transforms[n], t, interpolation::SPHERICAL ); 184 m_transforms[n] = nv::interpolate( m_transforms[n], tr, blend, interpolation::SPHERICAL ); 185 } 186 } 187 188 189 190 void nv::skeleton_transforms::interpolate4( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t ) 191 { 192 NV_ASSERT( s1.size() == s2.size(), "!!!" ); 193 NV_ASSERT( v1.size() == v2.size(), "!!!" ); 194 NV_ASSERT( s1.size() == v1.size(), "!!!" ); 195 if ( m_transforms.size() != s1.size() ) 196 m_transforms.resize( s1.size() ); 197 float interp_squared = t*t; 198 float interp_cubed = interp_squared*t; 199 float weights[4]; 200 weights[0] = 0.5f * ( -interp_cubed + 2.0f * interp_squared - t ); 201 weights[1] = 0.5f * ( 3.0f * interp_cubed - 5.0f * interp_squared + 2.0f ); 202 weights[2] = 0.5f * ( -3.0f * interp_cubed + 4.0f * interp_squared + t ); 203 weights[3] = 0.5f * ( interp_cubed - interp_squared ); 204 205 for ( uint32 n = 0; n < s1.size(); ++n ) 206 { 207 quat qs1 = s1.m_transforms[n].get_orientation(); 208 quat qs2 = s2.m_transforms[n].get_orientation(); 209 quat qv1 = v1.m_transforms[n].get_orientation(); 210 quat qv2 = v2.m_transforms[n].get_orientation(); 211 212 float a = dot( qv1, qv2 ) > 0.0f ? 1.0f : -1.0f; 213 214 quat qr = weights[0] * qs1 215 + weights[1] * (a * qv1 ) 216 + weights[2] * qv2 217 + weights[3] * qs2; 218 219 qr = normalize( qr ); 220 221 m_transforms[n] = transform( 222 weights[0] * s1.m_transforms[n].get_position() + 223 weights[1] * v1.m_transforms[n].get_position() + 224 weights[2] * v2.m_transforms[n].get_position() + 225 weights[3] * s2.m_transforms[n].get_position(), 226 qr 227 ); 228 } 229 } 230 231 232 void nv::skeleton_transforms::interpolate_squad( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t ) 233 { 234 NV_ASSERT( s1.size() == s2.size(), "!!!" ); 235 NV_ASSERT( v1.size() == v2.size(), "!!!" ); 236 NV_ASSERT( s1.size() == v1.size(), "!!!" ); 237 if ( m_transforms.size() != s1.size() ) 238 m_transforms.resize( s1.size() ); 239 240 for ( uint32 n = 0; n < s1.size(); ++n ) 241 { 242 nv::quat ss1 = s1.m_transforms[n].get_orientation(); 243 nv::quat ss2 = s2.m_transforms[n].get_orientation(); 244 nv::quat sv1 = v1.m_transforms[n].get_orientation(); 245 nv::quat sv2 = v2.m_transforms[n].get_orientation(); 246 247 nv::quat q = normalize( nv::math::squad( 248 sv1, sv2, 249 nv::math::intermediate( ss1, sv1, sv2 ), 250 nv::math::intermediate( sv1, sv2, ss2 ), 251 t ) ); 252 253 m_transforms[n] = transform( 254 mix( v1.m_transforms[n].get_position(), v2.m_transforms[n].get_position(), t ), 255 q 256 ); 257 } 258 160 if ( m_transforms.size() != s1.size() ) m_transforms.resize( s1.size() ); 161 if ( mask.size() > 0 ) 162 ::nv::interpolate( m_transforms, t, i, blend, bi, mask, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 163 else 164 ::nv::interpolate( m_transforms, t, i, blend, bi, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 259 165 } 260 166 … … 264 170 } 265 171 266 // void nv::skeleton_transforms::blend_local( const mesh_nodes_data* node_data, float frame, float blend )267 // {268 // if ( m_transforms.size() != node_data->size() )269 // m_transforms.resize( node_data->size() );270 // for ( uint32 n = 0; n < node_data->size(); ++n )271 // {272 // const data_channel_set* node = ( *node_data )[n];273 // int inefficient_store_key;274 //275 // transform tr = node->size() > 0 ? raw_channel_interpolator( node ).get< transform >( frame ) : transform( /*node->get_transform()*/ ); int confirm_that_not_needed;276 // m_transforms[n] = nv::interpolate( m_transforms[n], tr, blend, interpolation::SPHERICAL );277 // }278 // }279 //280 // void nv::skeleton_transforms::animate_local( const mesh_nodes_data* node_data, float frame )281 // {282 // if ( m_transforms.size() != node_data->size() )283 // m_transforms.resize( node_data->size() );284 // for ( uint32 n = 0; n < node_data->size(); ++n )285 // {286 // const data_channel_set* node = ( *node_data )[n];287 // if ( node->size() > 0 )288 // {289 // int inefficient_store_key;290 // m_transforms[n] = raw_channel_interpolator( node ).get< transform >( frame );291 // }292 // }293 // }294 172 295 173 void nv::skeleton_transforms::delocalize_rec( const data_node_tree& node_data, uint32 id, const transform& parent ) … … 304 182 } 305 183 306 // void nv::skeleton_transforms::blend_rec( const mesh_nodes_data* node_data, float frame, uint32 id, const transform& parent, bool local, float blend )307 // {308 // const data_channel_set* node = ( *node_data )[id];309 // int confirm_that_not_needed;310 // transform node_mat/*( node->get_transform() )*/;311 //312 // if ( node->size() > 0 )313 // {314 // int inefficient_store_key;315 //316 // raw_channel_interpolator interpolator( node );317 // node_mat = interpolator.get< transform >( frame );318 // }319 // transform global_mat = parent * node_mat;320 // m_transforms[id] = nv::interpolate( m_transforms[id], local ? node_mat : global_mat, blend, interpolation::SPHERICAL );321 // for ( auto child : node_data->children( id ) )322 // {323 // blend_rec( node_data, frame, child, global_mat, local, blend );324 // }325 //326 // }327 //328 // void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, float frame, uint32 id, const transform& parent, bool local )329 // {330 // const data_channel_set* node = ( *node_data )[id];331 // transform node_mat;332 // int inefficient_store_key;333 //334 // if ( node->size() > 0 )335 // node_mat = raw_channel_interpolator( node ).get< transform >( frame );336 // int confirm_that_not_needed;337 // // else338 // // node_mat = transform( node->get_transform() );339 // transform global_mat = parent * node_mat;340 // m_transforms[id] = local ? node_mat : global_mat;341 // for ( auto child : node_data->children( id ) )342 // {343 // animate_rec( node_data, frame, child, global_mat, local );344 // }345 //346 // }347 348 void nv::bone_transforms::prepare( const data_node_list& bone_data )349 {350 m_offsets.resize( bone_data.size() );351 352 for ( nv::uint16 bi = 0; bi < bone_data.size(); ++bi )353 m_offsets[bi] = bone_data[bi].transform;354 }
Note: See TracChangeset
for help on using the changeset viewer.