PolySkeleton.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. /*
  2. * PolySkeleton.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 9/4/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolySkeleton.h"
  10. using namespace Polycode;
  11. Skeleton::Skeleton(string fileName) : SceneEntity() {
  12. loadSkeleton(fileName);
  13. currentAnimation = NULL;
  14. }
  15. Skeleton::~Skeleton() {
  16. }
  17. int Skeleton::getNumBones() {
  18. return bones.size();
  19. }
  20. Bone *Skeleton::getBoneByName(string name) {
  21. for(int i=0; i < bones.size(); i++) {
  22. if(bones[i]->getName() == name)
  23. return bones[i];
  24. }
  25. return NULL;
  26. }
  27. Bone *Skeleton::getBone(int index) {
  28. return bones[index];
  29. }
  30. void Skeleton::enableBoneLabels(Font *font, float size, float scale) {
  31. for(int i=0; i < bones.size(); i++) {
  32. bones[i]->enableBoneLabel(font, size, scale);
  33. }
  34. }
  35. void Skeleton::playAnimation(string animName) {
  36. SkeletonAnimation *anim = getAnimation(animName);
  37. if(!anim)
  38. return;
  39. if(anim == currentAnimation)
  40. return;
  41. if(currentAnimation)
  42. currentAnimation->Stop();
  43. currentAnimation = anim;
  44. anim->Play();
  45. }
  46. SkeletonAnimation *Skeleton::getAnimation(string name) {
  47. for(int i=0; i < animations.size(); i++) {
  48. if(animations[i]->getName() == name)
  49. return animations[i];
  50. }
  51. return NULL;
  52. }
  53. void Skeleton::Update() {
  54. if(currentAnimation != NULL) {
  55. currentAnimation->Update();
  56. }
  57. }
  58. void Skeleton::loadSkeleton(string fileName) {
  59. OSFILE *inFile = OSBasics::open(fileName.c_str(), "rb");
  60. if(!inFile) {
  61. return;
  62. }
  63. unsigned int numBones;
  64. float t[3],rq[4],s[3];
  65. OSBasics::read(&numBones, sizeof(unsigned int), 1, inFile);
  66. unsigned int namelen;
  67. char buffer[1024];
  68. Matrix4 mat;
  69. unsigned int hasParent, boneID;
  70. for(int i=0; i < numBones; i++) {
  71. OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile);
  72. memset(buffer, 0, 1024);
  73. OSBasics::read(buffer, 1, namelen, inFile);
  74. Bone *newBone = new Bone(string(buffer));
  75. OSBasics::read(&hasParent, sizeof(unsigned int), 1, inFile);
  76. if(hasParent == 1) {
  77. OSBasics::read(&boneID, sizeof(unsigned int), 1, inFile);
  78. newBone->parentBoneId = boneID;
  79. } else {
  80. newBone->parentBoneId = -1;
  81. }
  82. OSBasics::read(t, sizeof(float), 3, inFile);
  83. OSBasics::read(s, sizeof(float), 3, inFile);
  84. OSBasics::read(rq, sizeof(float), 4, inFile);
  85. bones.push_back(newBone);
  86. newBone->setPosition(t[0], t[1], t[2]);
  87. newBone->setRotationQuat(rq[0], rq[1], rq[2], rq[3]);
  88. newBone->setScale(s[0], s[1], s[2]);
  89. newBone->rebuildTransformMatrix();
  90. newBone->setRestMatrix(newBone->getTransformMatrix());
  91. }
  92. Bone *parentBone;
  93. // SceneEntity *bProxy;
  94. for(int i=0; i < bones.size(); i++) {
  95. if(bones[i]->parentBoneId != -1) {
  96. parentBone = bones[bones[i]->parentBoneId];
  97. parentBone->addChildBone(bones[i]);
  98. bones[i]->setParentBone(parentBone);
  99. parentBone->addEntity(bones[i]);
  100. } else {
  101. // bProxy = new SceneEntity();
  102. // addEntity(bProxy);
  103. // bProxy->addEntity(bones[i]);
  104. addEntity(bones[i]);
  105. }
  106. bones[i]->visible = false;
  107. }
  108. unsigned int numAnimations, activeBones,boneIndex,numPoints,numCurves, curveType;
  109. OSBasics::read(&numAnimations, sizeof(unsigned int), 1, inFile);
  110. //Logger::log("numAnimations: %d\n", numAnimations);
  111. for(int i=0; i < numAnimations; i++) {
  112. OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile);
  113. memset(buffer, 0, 1024);
  114. OSBasics::read(buffer, 1, namelen, inFile);
  115. SkeletonAnimation *newAnimation = new SkeletonAnimation(buffer, 3.0f);
  116. OSBasics::read(&activeBones, sizeof(unsigned int), 1, inFile);
  117. // Logger::log("activeBones: %d\n", activeBones);
  118. for(int j=0; j < activeBones; j++) {
  119. OSBasics::read(&boneIndex, sizeof(unsigned int), 1, inFile);
  120. BoneTrack *newTrack = new BoneTrack(bones[boneIndex]);
  121. BezierCurve *curve;
  122. float vec1[2],vec2[2],vec3[2];
  123. OSBasics::read(&numCurves, sizeof(unsigned int), 1, inFile);
  124. //Logger::log("numCurves: %d\n", numCurves);
  125. for(int l=0; l < numCurves; l++) {
  126. curve = new BezierCurve();
  127. OSBasics::read(&curveType, sizeof(unsigned int), 1, inFile);
  128. OSBasics::read(&numPoints, sizeof(unsigned int), 1, inFile);
  129. // Logger::log("numPoints: %d\n", numPoints);
  130. for(int k=0; k < numPoints; k++) {
  131. OSBasics::read(vec1, sizeof(float), 2, inFile);
  132. OSBasics::read(vec2, sizeof(float), 2, inFile);
  133. OSBasics::read(vec3, sizeof(float), 2, inFile);
  134. curve->addControlPoint(vec1[0], vec1[1], 0, vec2[0], vec2[1], 0, vec3[0], vec3[1], 0);
  135. }
  136. switch(curveType) {
  137. case 0:
  138. newTrack->scaleX = curve;
  139. break;
  140. case 1:
  141. newTrack->scaleY = curve;
  142. break;
  143. case 2:
  144. newTrack->scaleZ = curve;
  145. break;
  146. case 3:
  147. newTrack->QuatW = curve;
  148. break;
  149. case 4:
  150. newTrack->QuatX = curve;
  151. break;
  152. case 5:
  153. newTrack->QuatY = curve;
  154. break;
  155. case 6:
  156. newTrack->QuatZ = curve;
  157. break;
  158. case 7:
  159. newTrack->LocX = curve;
  160. break;
  161. case 8:
  162. newTrack->LocY = curve;
  163. break;
  164. case 9:
  165. newTrack->LocZ = curve;
  166. break;
  167. }
  168. }
  169. newAnimation->addBoneTrack(newTrack);
  170. }
  171. animations.push_back(newAnimation);
  172. }
  173. OSBasics::close(inFile);
  174. }
  175. void Skeleton::bonesVisible(bool val) {
  176. for(int i=0; i < bones.size(); i++) {
  177. bones[i]->visible = val;
  178. }
  179. }
  180. BoneTrack::BoneTrack(Bone *bone) {
  181. targetBone = bone;
  182. scaleX = NULL;
  183. scaleY = NULL;
  184. scaleZ = NULL;
  185. QuatW = NULL;
  186. QuatX = NULL;
  187. QuatY = NULL;
  188. QuatZ = NULL;
  189. LocX = NULL;
  190. LocY = NULL;
  191. LocZ = NULL;
  192. initialized = false;
  193. }
  194. BoneTrack::~BoneTrack() {
  195. }
  196. void BoneTrack::Stop() {
  197. if(initialized) {
  198. for(int i=0; i < pathTweens.size(); i++) {
  199. pathTweens[i]->Pause(true);
  200. }
  201. quatTween->Pause(true);
  202. }
  203. }
  204. void BoneTrack::Play() {
  205. if(!initialized ) {
  206. // TODO: change it so that you can set the tweens to not manually restart so you can calculate the
  207. // time per tween
  208. float durTime = (LocX->getControlPoint(LocX->getNumControlPoints()-1)->p2.x)/25.0f;
  209. BezierPathTween *testTween = new BezierPathTween(&LocXVec, LocX, Tween::EASE_NONE, durTime, true);
  210. pathTweens.push_back(testTween);
  211. testTween = new BezierPathTween(&LocYVec, LocY, Tween::EASE_NONE, durTime, true);
  212. pathTweens.push_back(testTween);
  213. testTween = new BezierPathTween(&LocZVec, LocZ, Tween::EASE_NONE, durTime, true);
  214. pathTweens.push_back(testTween);
  215. if(QuatW)
  216. quatTween = new QuaternionTween(&boneQuat, QuatW, QuatX, QuatY, QuatZ, Tween::EASE_NONE, durTime, true);
  217. initialized = true;
  218. } else {
  219. for(int i=0; i < pathTweens.size(); i++) {
  220. pathTweens[i]->Pause(false);
  221. }
  222. quatTween->Pause(false);
  223. }
  224. /*
  225. if(QuatW) {
  226. testTween = new BezierPathTween(&QuatWVec, QuatW, Tween::EASE_NONE, durTime, true);
  227. pathTweens.push_back(testTween);
  228. }
  229. if(QuatX) {
  230. testTween = new BezierPathTween(&QuatXVec, QuatX, Tween::EASE_NONE, durTime, true);
  231. pathTweens.push_back(testTween);
  232. }
  233. if(QuatY) {
  234. testTween = new BezierPathTween(&QuatYVec, QuatY, Tween::EASE_NONE, durTime, true);
  235. pathTweens.push_back(testTween);
  236. }
  237. if(QuatZ) {
  238. testTween = new BezierPathTween(&QuatZVec, QuatZ, Tween::EASE_NONE, durTime, true);
  239. pathTweens.push_back(testTween);
  240. }
  241. */
  242. }
  243. void BoneTrack::Update() {
  244. //TODO: IMPLEMENT setTransform
  245. //newMatrix.setTransform(Vector3(LocXVec.y, LocYVec.y, LocZVec.y), Vector3(1.0f, 1.0f, 1.0f), Quaternion (QuatWVec.y, QuatXVec.y, QuatYVec.y, QuatZVec.y));
  246. // Quaternion quat(QuatWVec.y, QuatXVec.y, QuatYVec.y, QuatZVec.y);
  247. // Quaternion quat; quat.createFromAxisAngle(1,0,0,30);
  248. Matrix4 newMatrix;
  249. newMatrix = boneQuat.createMatrix();
  250. Matrix4 scaleMatrix;
  251. scaleMatrix.m[0][0] *= 1;
  252. scaleMatrix.m[1][1] *= 1;
  253. scaleMatrix.m[2][2] *= 1;
  254. Matrix4 posMatrix;
  255. posMatrix.m[3][0] = LocXVec.y;
  256. posMatrix.m[3][1] = LocYVec.y;
  257. posMatrix.m[3][2] = LocZVec.y;
  258. newMatrix = scaleMatrix*newMatrix*posMatrix;
  259. targetBone->setBoneMatrix(newMatrix);
  260. targetBone->setMatrix(newMatrix * targetBone->getRestMatrix());
  261. }
  262. void BoneTrack::setSpeed(float speed) {
  263. for(int i=0; i < pathTweens.size(); i++) {
  264. pathTweens[i]->setSpeed(speed);
  265. }
  266. quatTween->setSpeed(speed);
  267. }
  268. SkeletonAnimation::SkeletonAnimation(string name, float duration) {
  269. this->name = name;
  270. this->duration = duration;
  271. }
  272. void SkeletonAnimation::setSpeed(float speed) {
  273. for(int i=0; i < boneTracks.size(); i++) {
  274. boneTracks[i]->setSpeed(speed);
  275. }
  276. }
  277. void SkeletonAnimation::Update() {
  278. for(int i=0; i < boneTracks.size(); i++) {
  279. boneTracks[i]->Update();
  280. }
  281. }
  282. void SkeletonAnimation::Stop() {
  283. for(int i=0; i < boneTracks.size(); i++) {
  284. boneTracks[i]->Stop();
  285. }
  286. }
  287. void SkeletonAnimation::Play() {
  288. for(int i=0; i < boneTracks.size(); i++) {
  289. boneTracks[i]->Play();
  290. }
  291. }
  292. SkeletonAnimation::~SkeletonAnimation() {
  293. }
  294. string SkeletonAnimation::getName() {
  295. return name;
  296. }
  297. void SkeletonAnimation::addBoneTrack(BoneTrack *boneTrack) {
  298. boneTracks.push_back(boneTrack);
  299. }