SkelAnim.cpp 1.9 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. }