SkelAnim.cpp 1.7 KB

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