@@ -339,7 +339,6 @@ StudioSlerpBones
339339void  CStudioModelRenderer::StudioSlerpBones ( vec4_t  q1[], float  pos1[][3 ], vec4_t  q2[], float  pos2[][3 ], float  s )
340340{
341341	int  i;
342- 	vec4_t  q3;
343342	float  s1;
344343
345344	if ( s < 0 .0f  )
@@ -349,13 +348,28 @@ void CStudioModelRenderer::StudioSlerpBones( vec4_t q1[], float pos1[][3], vec4_
349348
350349	s1 = 1 .0f  - s;
351350
351+ 	switch  (m_pStudioHeader->numbones  % 4 )
352+ 	{
353+ 	case  3 :
354+ 		QuaternionSlerp ( q1[0 ], q2[0 ], s, q1[0 ] );
355+ 		QuaternionSlerp ( q1[1 ], q2[1 ], s, q1[1 ] );
356+ 		QuaternionSlerp ( q1[2 ], q2[2 ], s, q1[2 ] );
357+ 		break ;
358+ 	case  2 :
359+ 		QuaternionSlerp ( q1[0 ], q2[0 ], s, q1[0 ] );
360+ 		QuaternionSlerp ( q1[1 ], q2[1 ], s, q1[1 ] );
361+ 		break ;
362+ 	case  1 :
363+ 		QuaternionSlerp ( q1[0 ], q2[0 ], s, q1[0 ] );
364+ 		break ;
365+ 	case  0 :
366+ 		break ;
367+ 	}
368+ 	for  ( i = m_pStudioHeader->numbones  % 4 ; i < m_pStudioHeader->numbones ; i += 4  )
369+ 		QuaternionSlerpX4 ( q1 + i, q2 + i, s, q1 + i );
370+ 
352371	for ( i = 0 ; i < m_pStudioHeader->numbones ; i++ )
353372	{
354- 		QuaternionSlerp ( q1[i], q2[i], s, q3 );
355- 		q1[i][0 ] = q3[0 ];
356- 		q1[i][1 ] = q3[1 ];
357- 		q1[i][2 ] = q3[2 ];
358- 		q1[i][3 ] = q3[3 ];
359373		pos1[i][0 ] = pos1[i][0 ] * s1 + pos2[i][0 ] * s;
360374		pos1[i][1 ] = pos1[i][1 ] * s1 + pos2[i][1 ] * s;
361375		pos1[i][2 ] = pos1[i][2 ] * s1 + pos2[i][2 ] * s;
0 commit comments