SkelAnim.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "SkelAnim.h"
  2. #include "Scanner.h"
  3. #include "Parser.h"
  4. //======================================================================================================================
  5. // load =
  6. //======================================================================================================================
  7. bool SkelAnim::load( const char* filename )
  8. {
  9. Scanner scanner;
  10. if( !scanner.loadFile( filename ) ) return false;
  11. const Scanner::Token* token;
  12. // keyframes
  13. token = &scanner.getNextToken();
  14. if( token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT )
  15. {
  16. PARSE_ERR_EXPECTED( "integer" );
  17. return false;
  18. }
  19. keyframes.resize( token->getValue().getInt() );
  20. if( !Parser::parseArrOfNumbers( scanner, false, false, keyframes.size(), &keyframes[0] ) ) return false;
  21. // bones num
  22. token = &scanner.getNextToken();
  23. if( token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT )
  24. {
  25. PARSE_ERR_EXPECTED( "integer" );
  26. return false;
  27. }
  28. bones.resize( token->getValue().getInt() );
  29. // poses
  30. for( uint i=0; i<bones.size(); i++ )
  31. {
  32. // has anim?
  33. token = &scanner.getNextToken();
  34. if( token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT )
  35. {
  36. PARSE_ERR_EXPECTED( "integer" );
  37. return false;
  38. }
  39. // it has
  40. if( token->getValue().getInt() == 1 )
  41. {
  42. bones[i].keyframes.resize( keyframes.size() );
  43. for( uint j=0; j<keyframes.size(); ++j )
  44. {
  45. // parse the quat
  46. float tmp[4];
  47. if( !Parser::parseArrOfNumbers( scanner, false, true, 4, &tmp[0] ) ) return false;
  48. bones[i].keyframes[j].rotation = Quat( tmp[1], tmp[2], tmp[3], tmp[0] );
  49. // parse the vec3
  50. if( !Parser::parseArrOfNumbers( scanner, false, true, 3, &bones[i].keyframes[j].translation[0] ) ) return false;
  51. }
  52. }
  53. } // end for all bones
  54. framesNum = keyframes[ keyframes.size()-1 ] + 1;
  55. return true;
  56. }