AnimationExtractor.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "AnimationExtractor.h"
  2. #include "common/Logger.h"
  3. #include "common/File.h"
  4. void
  5. AnimationExtractor( const Ogre::SkeletonPtr& skeleton, const ModelInfo& info, Skeleton& skeleton_data )
  6. {
  7. float fps = 1;
  8. File* file = new File( "./data/field/" + info.animation_file );
  9. for( size_t i = 0; i < info.animations.size(); ++i )
  10. {
  11. if( info.animations[ i ] == "" )
  12. {
  13. continue;
  14. }
  15. //LOGGER->Log( "AnimationExtractor: " + Ogre::StringConverter::toString( i ) + " " + info.animations[ i ] + " as animation with name " + info.animations_name[ i ] + "\n" );
  16. int number_of_frames = 2/*file->GetU16LE( 0x2 )*/;
  17. Ogre::Animation* anim = skeleton->createAnimation( info.animations[ i ], ( number_of_frames - 1 ) / fps );
  18. float time = 0;
  19. float tx, ty, tz;
  20. float rx, ry, rz;
  21. Ogre::Bone* bone1;
  22. Ogre::Bone* bone2;
  23. Ogre::NodeAnimationTrack* track1;
  24. Ogre::NodeAnimationTrack* track2;
  25. Ogre::TransformKeyFrame* frame1;
  26. Ogre::TransformKeyFrame* frame2;
  27. Ogre::Quaternion rot;
  28. Ogre::Matrix3 mat;
  29. for ( int frame = 0; frame < number_of_frames; ++frame )
  30. {
  31. // this is just to orientate model to right direction
  32. if( frame == 0 )
  33. {
  34. bone1 = skeleton->getBone( 0 );
  35. track1 = anim->createNodeTrack( 0, bone1 );
  36. track1->removeAllKeyFrames();
  37. frame1 = track1->createNodeKeyFrame( time );
  38. mat.FromEulerAnglesYXZ( Ogre::Radian( Ogre::Degree( 0 ) ), Ogre::Radian( Ogre::Degree( -90 ) ), Ogre::Radian( Ogre::Degree( 0 ) ) );
  39. rot.FromRotationMatrix( mat );
  40. frame1->setRotation( rot );
  41. bone2 = skeleton->getBone( 1 );
  42. track2 = anim->createNodeTrack( 1, bone2 );
  43. track2->removeAllKeyFrames();
  44. }
  45. else
  46. {
  47. bone1 = skeleton->getBone( 0 );
  48. track1 = anim->getNodeTrack( 0 );
  49. frame1 = track1->createNodeKeyFrame( time );
  50. mat.FromEulerAnglesYXZ( Ogre::Radian( Ogre::Degree( 0 ) ), Ogre::Radian(Ogre::Degree( -90 ) ), Ogre::Radian( Ogre::Degree( 0 ) ) );
  51. rot.FromRotationMatrix( mat );
  52. frame1->setRotation( rot );
  53. bone2 = skeleton->getBone( 1 );
  54. track2 = anim->getNodeTrack( 1 );
  55. }
  56. frame2 = track2->createNodeKeyFrame( time );
  57. u32 start;
  58. u32 first = file->GetU32LE( 0x04 );
  59. u32 second = first + file->GetU32LE( first + 0x04 );
  60. if( frame == 0 )
  61. {
  62. start = second + file->GetU32LE( second + 0x04 + 0 * 0x4 );
  63. }
  64. else
  65. {
  66. start = second + file->GetU32LE( second + 0x04 + i * 0x4 );
  67. }
  68. u16 max_rot_num = file->GetU16LE( start + 0xc );
  69. u16 max_trans_num = file->GetU16LE( start + 0xe );
  70. u16 rot_flag = file->GetU16LE( start + 0x4 ) & 1;
  71. u16 trans_flag = file->GetU16LE( start + 0x4 ) & 2;
  72. if( file->GetU16LE( start + 0x6 ) == 0 )
  73. {
  74. start = start + ( max_rot_num + 1 ) * 6;
  75. }
  76. start += 0x18;
  77. u16 rot_num = 0;
  78. u16 trans_num = 0;
  79. for( size_t bone = 0; bone < skeleton_data.size(); ++bone )
  80. {
  81. tx = 0; ty = 0; tz = 0;
  82. rx = 0; ry = 0; rz = 0;
  83. bool bone_rotated = true;
  84. bool bone_translated = true;
  85. if( ( rot_flag == 0 ) && ( rot_num < max_rot_num ) )
  86. {
  87. rx = ( s16 )file->GetU16LE( start + 0x00 );
  88. ry = ( s16 )file->GetU16LE( start + 0x02 );
  89. rz = ( s16 )file->GetU16LE( start + 0x04 );
  90. rx = ( rx / 4096.0f ) * 360.0f;
  91. ry = ( ry / 4096.0f ) * 360.0f;
  92. rz = ( rz / 4096.0f ) * 360.0f;
  93. //LOGGER->Log( "Rotation: frame = " + Ogre::StringConverter::toString( frame ) + ", bone = " + Ogre::StringConverter::toString( bone ) + ", rx = " + ToHexString( file->GetU16LE( start + 0x00 ), 4, '0' ) + ", ry = " + ToHexString( file->GetU16LE( start + 0x02 ), 4, '0' ) + ", rz = " + ToHexString( file->GetU16LE( start + 0x04 ), 4, '0' ) + ".\n" );
  94. //LOGGER->Log( "Rotation: frame = " + Ogre::StringConverter::toString( frame ) + ", bone = " + Ogre::StringConverter::toString( bone ) + ", rx = " + Ogre::StringConverter::toString( rx ) + ", ry = " + Ogre::StringConverter::toString( ry ) + ", rz = " + Ogre::StringConverter::toString( rz ) + ".\n" );
  95. start += 0x6;
  96. rot_num += 1;
  97. }
  98. else
  99. {
  100. bone_rotated = false;
  101. }
  102. if( ( trans_flag == 0 ) && ( trans_num < max_trans_num ) )
  103. {
  104. tx = ( s16 )file->GetU16LE( start + 0x00 );
  105. ty = ( s16 )file->GetU16LE( start + 0x02 );
  106. tz = ( s16 )file->GetU16LE( start + 0x04 );
  107. start += 0x6;
  108. trans_num += 1;
  109. }
  110. else
  111. {
  112. bone_translated = false;
  113. }
  114. // assign data to bone
  115. bone1 = skeleton->getBone( bone * 2 + 2 );
  116. bone2 = skeleton->getBone( bone * 2 + 3 );
  117. if( frame == 0 )
  118. {
  119. track1 = anim->createNodeTrack( bone * 2 + 2, bone1 );
  120. track1->removeAllKeyFrames();
  121. track2 = anim->createNodeTrack( bone * 2 + 3, bone2 );
  122. track2->removeAllKeyFrames();
  123. }
  124. else
  125. {
  126. track1 = anim->getNodeTrack( bone * 2 + 2 );
  127. track2 = anim->getNodeTrack( bone * 2 + 3 );
  128. }
  129. frame1 = track1->createNodeKeyFrame( time );
  130. frame2 = track2->createNodeKeyFrame( time );
  131. Ogre::Vector3 translate = Ogre::Vector3( tx, ty, tz ) / 512.0f;
  132. //LOGGER->Log( "AnimationExtractor: frame = " + Ogre::StringConverter::toString( frame ) + ", bone = " + Ogre::StringConverter::toString( bone ) + ", bone_translated = \"" + Ogre::StringConverter::toString( bone_translated ) + "\", translation = " + Ogre::StringConverter::toString( ( bone_translated == true ) ? translate : track1->getNodeKeyFrame( frame - 1 )->getTranslate() ) + ".\n" );
  133. frame1->setTranslate( ( bone_translated == true || frame == 0 ) ? translate : track1->getNodeKeyFrame( frame - 1 )->getTranslate() );
  134. mat.FromEulerAnglesXYZ( Ogre::Radian( Ogre::Degree( rx ) ), Ogre::Radian( Ogre::Degree( ry ) ), Ogre::Radian( Ogre::Degree( rz ) ) );
  135. //mat.FromEulerAnglesXZY( Ogre::Radian( Ogre::Degree( rx ) ), Ogre::Radian( Ogre::Degree( rz ) ), Ogre::Radian( Ogre::Degree( ry ) ) );
  136. //mat.FromEulerAnglesYXZ( Ogre::Radian( Ogre::Degree( ry ) ), Ogre::Radian( Ogre::Degree( rx ) ), Ogre::Radian( Ogre::Degree( rz ) ) );
  137. ////mat.FromEulerAnglesYZX( Ogre::Radian( Ogre::Degree( ry ) ), Ogre::Radian( Ogre::Degree( rz ) ), Ogre::Radian( Ogre::Degree( rx ) ) );
  138. ////mat.FromEulerAnglesZYX( Ogre::Radian( Ogre::Degree( rz ) ), Ogre::Radian( Ogre::Degree( ry ) ), Ogre::Radian( Ogre::Degree( rx ) ) );
  139. ////mat.FromEulerAnglesZXY( Ogre::Radian( Ogre::Degree( rz ) ), Ogre::Radian( Ogre::Degree( rx ) ), Ogre::Radian( Ogre::Degree( ry ) ) );
  140. rot.FromRotationMatrix( mat );
  141. //LOGGER->Log( "AnimationExtractor: frame = " + Ogre::StringConverter::toString( frame ) + ", bone = " + Ogre::StringConverter::toString( bone ) + ", bone_rotated = \"" + Ogre::StringConverter::toString( bone_rotated ) + "\" rotation = " + Ogre::StringConverter::toString( ( bone_translated == true ) ? rot : track2->getNodeKeyFrame( frame - 1 )->getRotation() ) + ".\n" );
  142. frame2->setRotation( ( bone_rotated == true || frame == 0 ) ? rot : track2->getNodeKeyFrame( frame - 1 )->getRotation() );
  143. }
  144. time += 1.0f / fps;
  145. }
  146. }
  147. delete file;
  148. }