Changeset 484 for trunk/src/gfx


Ignore:
Timestamp:
12/02/15 18:42:02 (10 years ago)
Author:
epyon
Message:
  • resource manager updates
  • nv-image added
  • missing stl memory added
  • several other missing files
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gfx/skeleton_instance.cc

    r483 r484  
    5252        for ( uint32 n = 0; n < skeleton.size(); ++n )
    5353        {
    54                 m_matrix[n] = transforms[n].extract() * bones.m_offsets[n];
     54                transform tr( bones.m_offsets[n] );
     55                tr.set_orientation( normalize( tr.get_orientation() ) );
     56                m_matrix[n] = ( transforms[n] * tr ).extract();
     57        //      m_matrix[n] = transforms[n].extract() * bones.m_offsets[n];
    5558        }
    5659}
     
    7477}
    7578
    76 void nv::skeleton_transforms::interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t )
     79void nv::skeleton_transforms::interpolate_linear( const skeleton_transforms& a, const skeleton_transforms& b, float t )
    7780{
    7881        NV_ASSERT( a.size() == b.size(), "!!!" );
     
    8184        for ( uint32 n = 0; n < a.size(); ++n )
    8285        {
     86                m_transforms[n] = transform(
     87                        math::mix( a.m_transforms[n].get_position(), b.m_transforms[n].get_position(), t ),
     88                        math::lerp( a.m_transforms[n].get_orientation(), b.m_transforms[n].get_orientation(), t )
     89                        );
     90        }
     91
     92        if ( m_transforms.size() > 0 )
     93                m_transforms[0] = nv::interpolate( a.m_transforms[0], b.m_transforms[0], t );
     94}
     95
     96void nv::skeleton_transforms::interpolate_nlerp( const skeleton_transforms& a, const skeleton_transforms& b, float t )
     97{
     98        NV_ASSERT( a.size() == b.size(), "!!!" );
     99        if ( m_transforms.size() != a.size() )
     100                m_transforms.resize( a.size() );
     101
     102        for ( uint32 n = 0; n < a.size(); ++n )
     103        {
     104                m_transforms[n] = transform(
     105                        math::mix( a.m_transforms[n].get_position(), b.m_transforms[n].get_position(), t ),
     106                        math::nlerp( a.m_transforms[n].get_orientation(), b.m_transforms[n].get_orientation(), t )
     107                        );
     108        }
     109
     110        if ( m_transforms.size() > 0 )
     111                m_transforms[0] = nv::interpolate( a.m_transforms[0], b.m_transforms[0], t );
     112}
     113
     114
     115void nv::skeleton_transforms::interpolate_slerp( const skeleton_transforms& a, const skeleton_transforms& b, float t )
     116{
     117        NV_ASSERT( a.size() == b.size(), "!!!" );
     118        if ( m_transforms.size() != a.size() )
     119                m_transforms.resize( a.size() );
     120        for ( uint32 n = 0; n < a.size(); ++n )
     121        {
    83122                m_transforms[n] = nv::interpolate( a.m_transforms[n], b.m_transforms[n], t );
    84123        }
     124}
     125
     126void nv::skeleton_transforms::interpolate4( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t )
     127{
     128        NV_ASSERT( s1.size() == s2.size(), "!!!" );
     129        NV_ASSERT( v1.size() == v2.size(), "!!!" );
     130        NV_ASSERT( s1.size() == v1.size(), "!!!" );
     131        if ( m_transforms.size() != s1.size() )
     132                m_transforms.resize( s1.size() );
     133        float interp_squared = t*t;
     134        float interp_cubed = interp_squared*t;
     135        float weights[4];
     136        weights[0] = 0.5f * ( -interp_cubed + 2.0f * interp_squared - t );
     137        weights[1] = 0.5f * ( 3.0f * interp_cubed - 5.0f * interp_squared + 2.0f );
     138        weights[2] = 0.5f * ( -3.0f * interp_cubed + 4.0f * interp_squared + t );
     139        weights[3] = 0.5f * ( interp_cubed - interp_squared );
     140
     141        for ( uint32 n = 0; n < s1.size(); ++n )
     142        {
     143                quat qs1 = s1.m_transforms[n].get_orientation();
     144                quat qs2 = s2.m_transforms[n].get_orientation();
     145                quat qv1 = v1.m_transforms[n].get_orientation();
     146                quat qv2 = v2.m_transforms[n].get_orientation();
     147
     148                float a = dot( qv1, qv2 ) > 0.0f ? 1.0f : -1.0f;
     149
     150                quat qr = weights[0] * qs1
     151                                + weights[1] * (a * qv1 )
     152                                + weights[2] * qv2
     153                                + weights[3] * qs2;
     154
     155                qr = normalize( qr );
     156
     157                if ( n == 0 )
     158                        qr = nv::math::slerp( v1.m_transforms[n].get_orientation(), v2.m_transforms[n].get_orientation(), t );
     159
     160                m_transforms[n] = transform(
     161                        weights[0] * s1.m_transforms[n].get_position() +
     162                        weights[1] * v1.m_transforms[n].get_position() +
     163                        weights[2] * v2.m_transforms[n].get_position() +
     164                        weights[3] * s2.m_transforms[n].get_position(),
     165                        qr
     166                );
     167        }
     168}
     169
     170
     171void nv::skeleton_transforms::interpolate_squad( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t )
     172{
     173        NV_ASSERT( s1.size() == s2.size(), "!!!" );
     174        NV_ASSERT( v1.size() == v2.size(), "!!!" );
     175        NV_ASSERT( s1.size() == v1.size(), "!!!" );
     176        if ( m_transforms.size() != s1.size() )
     177                m_transforms.resize( s1.size() );
     178
     179        for ( uint32 n = 0; n < s1.size(); ++n )
     180        {
     181                nv::quat ss1 = s1.m_transforms[n].get_orientation();
     182                nv::quat ss2 = s2.m_transforms[n].get_orientation();
     183                nv::quat q = normalize( nv::math::squad(
     184                        v1.m_transforms[n].get_orientation(),
     185                        v2.m_transforms[n].get_orientation(),
     186                        nv::math::intermediate( ss1, v1.m_transforms[n].get_orientation(), v2.m_transforms[n].get_orientation() ),
     187                        nv::math::intermediate( v1.m_transforms[n].get_orientation(), v2.m_transforms[n].get_orientation(), ss2 ),
     188                        t ) );
     189                if ( n == 0 ) q = nv::math::slerp(
     190                        v1.m_transforms[n].get_orientation(),
     191                        v2.m_transforms[n].get_orientation(), t );
     192
     193                m_transforms[n] = transform(
     194                        mix( v1.m_transforms[n].get_position(), v2.m_transforms[n].get_position(), t ),
     195                        q
     196                        );
     197        }
     198
    85199}
    86200
     
    101215                {
    102216                        if ( node->size() > 0 )
     217                        {
    103218                                m_transforms[bone_id] = raw_channel_interpolator( node, binding.m_key ).get< transform >( frame );
     219                        }
    104220                        int confirm_that_not_needed;
    105221//                      else
     
    189305void nv::bone_transforms::prepare( const data_node_list& bone_data )
    190306{
    191         if ( m_offsets.empty() )
    192         {
    193                 m_offsets.resize( bone_data.size() );
    194 
    195                 for ( nv::uint16 bi = 0; bi < bone_data.size(); ++bi )
    196                         m_offsets[bi] = bone_data[bi].transform;
    197         }
    198 }
     307        m_offsets.resize( bone_data.size() );
     308
     309        for ( nv::uint16 bi = 0; bi < bone_data.size(); ++bi )
     310                m_offsets[bi] = bone_data[bi].transform;
     311}
Note: See TracChangeset for help on using the changeset viewer.