- Timestamp:
- 12/02/15 18:42:02 (10 years ago)
- Location:
- trunk/src
- Files:
-
- 6 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/skeleton_instance.cc
r483 r484 52 52 for ( uint32 n = 0; n < skeleton.size(); ++n ) 53 53 { 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]; 55 58 } 56 59 } … … 74 77 } 75 78 76 void nv::skeleton_transforms::interpolate ( const skeleton_transforms& a, const skeleton_transforms& b, float t )79 void nv::skeleton_transforms::interpolate_linear( const skeleton_transforms& a, const skeleton_transforms& b, float t ) 77 80 { 78 81 NV_ASSERT( a.size() == b.size(), "!!!" ); … … 81 84 for ( uint32 n = 0; n < a.size(); ++n ) 82 85 { 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 96 void 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 115 void 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 { 83 122 m_transforms[n] = nv::interpolate( a.m_transforms[n], b.m_transforms[n], t ); 84 123 } 124 } 125 126 void 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 171 void 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 85 199 } 86 200 … … 101 215 { 102 216 if ( node->size() > 0 ) 217 { 103 218 m_transforms[bone_id] = raw_channel_interpolator( node, binding.m_key ).get< transform >( frame ); 219 } 104 220 int confirm_that_not_needed; 105 221 // else … … 189 305 void nv::bone_transforms::prepare( const data_node_list& bone_data ) 190 306 { 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 } -
trunk/src/io/c_stream.cc
r442 r484 93 93 } 94 94 } 95 96 bool nv::c_stream::eof() 97 { 98 if ( m_file != nullptr ) 99 { 100 return ::feof( reinterpret_cast<FILE*>( m_file ) ); 101 } 102 }
Note: See TracChangeset
for help on using the changeset viewer.