Skeleton.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "Skeleton.h"
  2. #include "Scanner.h"
  3. #include "Parser.h"
  4. //=====================================================================================================================================
  5. // load =
  6. //=====================================================================================================================================
  7. bool Skeleton::load( const char* filename )
  8. {
  9. Scanner scanner;
  10. if( !scanner.loadFile( filename ) ) return false;
  11. const Scanner::Token* token;
  12. //** BONES NUM **
  13. token = &scanner.getNextToken();
  14. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  15. {
  16. PARSE_ERR_EXPECTED( "integer" );
  17. return false;
  18. }
  19. bones.resize( token->value.int_, Bone() );
  20. for( uint i=0; i<bones.size(); i++ )
  21. {
  22. Bone& bone = bones[i];
  23. bone.id = i;
  24. // NAME
  25. token = &scanner.getNextToken();
  26. if( token->code != Scanner::TC_STRING )
  27. {
  28. PARSE_ERR_EXPECTED( "string" );
  29. return false;
  30. }
  31. bone.setName( token->value.string );
  32. // head
  33. if( !ParseArrOfNumbers<float>( scanner, false, true, 3, &bone.head[0] ) ) return false;
  34. // tail
  35. if( !ParseArrOfNumbers<float>( scanner, false, true, 3, &bone.tail[0] ) ) return false;
  36. // matrix
  37. Mat4 m4;
  38. if( !ParseArrOfNumbers<float>( scanner, false, true, 16, &m4[0] ) ) return false;
  39. // matrix for real
  40. bone.rotSkelSpace = m4.getRotationPart();
  41. bone.tslSkelSpace = m4.getTranslationPart();
  42. Mat4 MAi( m4.getInverse() );
  43. bone.rotSkelSpaceInv = MAi.getRotationPart();
  44. bone.tslSkelSpaceInv = MAi.getTranslationPart();
  45. // parent
  46. token = &scanner.getNextToken();
  47. if( (token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT) &&
  48. (token->code != Scanner::TC_IDENTIFIER || strcmp( token->value.string, "NULL" )!=0) )
  49. {
  50. PARSE_ERR_EXPECTED( "integer or NULL" );
  51. return false;
  52. }
  53. if( token->code == Scanner::TC_IDENTIFIER )
  54. bone.parent = NULL;
  55. else
  56. bone.parent = &bones[ token->value.int_ ];
  57. // childs
  58. token = &scanner.getNextToken();
  59. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  60. {
  61. PARSE_ERR_EXPECTED( "integer" );
  62. return false;
  63. }
  64. if( token->value.int_ > Bone::MAX_CHILDS_PER_BONE )
  65. {
  66. ERROR( "Childs for bone \"" << bone.getName() << "\" exceed the max" );
  67. return false;
  68. }
  69. bone.childsNum = token->value.int_;
  70. for( int j=0; j<bone.childsNum; j++ )
  71. {
  72. token = &scanner.getNextToken();
  73. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  74. {
  75. PARSE_ERR_EXPECTED( "integer" );
  76. return false;
  77. }
  78. bone.childs[j] = &bones[ token->value.int_ ];
  79. }
  80. } // for all bones
  81. return true;
  82. }