PolySkeleton.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  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. currentAnimation = NULL;
  17. }
  18. Skeleton::~Skeleton() {
  19. }
  20. int Skeleton::getNumBones() {
  21. return bones.size();
  22. }
  23. Bone *Skeleton::getBoneByName(String name) {
  24. for(int i=0; i < bones.size(); i++) {
  25. if(bones[i]->getName() == name)
  26. return bones[i];
  27. }
  28. return NULL;
  29. }
  30. Bone *Skeleton::getBone(int index) {
  31. return bones[index];
  32. }
  33. void Skeleton::enableBoneLabels(String labelFont, Number size, Number scale, Color labelColor) {
  34. for(int i=0; i < bones.size(); i++) {
  35. bones[i]->enableBoneLabel(labelFont, size, scale,labelColor);
  36. }
  37. SceneLabel *label = new SceneLabel(labelFont, "Skeleton", size, scale, Label::ANTIALIAS_FULL);
  38. label->setColor(labelColor);
  39. label->billboardMode = true;
  40. label->setDepthWrite(false);
  41. addEntity(label);
  42. }
  43. void Skeleton::playAnimationByIndex(int index) {
  44. if(index > animations.size()-1)
  45. return;
  46. SkeletonAnimation *anim = animations[index];
  47. if(!anim)
  48. return;
  49. if(anim == currentAnimation)
  50. return;
  51. if(currentAnimation)
  52. currentAnimation->Stop();
  53. currentAnimation = anim;
  54. anim->Play();
  55. }
  56. void Skeleton::playAnimation(String animName) {
  57. SkeletonAnimation *anim = getAnimation(animName);
  58. if(!anim)
  59. return;
  60. if(anim == currentAnimation)
  61. return;
  62. if(currentAnimation)
  63. currentAnimation->Stop();
  64. currentAnimation = anim;
  65. anim->Play();
  66. }
  67. SkeletonAnimation *Skeleton::getAnimation(String name) {
  68. for(int i=0; i < animations.size(); i++) {
  69. if(animations[i]->getName() == name)
  70. return animations[i];
  71. }
  72. return NULL;
  73. }
  74. void Skeleton::Update() {
  75. if(currentAnimation != NULL) {
  76. currentAnimation->Update();
  77. }
  78. }
  79. void Skeleton::loadSkeleton(String fileName) {
  80. OSFILE *inFile = OSBasics::open(fileName.c_str(), "rb");
  81. if(!inFile) {
  82. return;
  83. }
  84. bonesEntity = new SceneEntity();
  85. bonesEntity->visible = false;
  86. addChild(bonesEntity);
  87. unsigned int numBones;
  88. float t[3],rq[4],s[3];
  89. OSBasics::read(&numBones, sizeof(unsigned int), 1, inFile);
  90. unsigned int namelen;
  91. char buffer[1024];
  92. Matrix4 mat;
  93. unsigned int hasParent, boneID;
  94. for(int i=0; i < numBones; i++) {
  95. OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile);
  96. memset(buffer, 0, 1024);
  97. OSBasics::read(buffer, 1, namelen, inFile);
  98. Bone *newBone = new Bone(string(buffer));
  99. OSBasics::read(&hasParent, sizeof(unsigned int), 1, inFile);
  100. if(hasParent == 1) {
  101. OSBasics::read(&boneID, sizeof(unsigned int), 1, inFile);
  102. newBone->parentBoneId = boneID;
  103. } else {
  104. newBone->parentBoneId = -1;
  105. }
  106. OSBasics::read(t, sizeof(float), 3, inFile);
  107. OSBasics::read(s, sizeof(float), 3, inFile);
  108. OSBasics::read(rq, sizeof(float), 4, inFile);
  109. bones.push_back(newBone);
  110. newBone->setPosition(t[0], t[1], t[2]);
  111. newBone->setRotationQuat(rq[0], rq[1], rq[2], rq[3]);
  112. newBone->setScale(s[0], s[1], s[2]);
  113. newBone->rebuildTransformMatrix();
  114. newBone->setBaseMatrix(newBone->getTransformMatrix());
  115. newBone->setBoneMatrix(newBone->getTransformMatrix());
  116. OSBasics::read(t, sizeof(float), 3, inFile);
  117. OSBasics::read(s, sizeof(float), 3, inFile);
  118. OSBasics::read(rq, sizeof(float), 4, inFile);
  119. Quaternion q;
  120. q.set(rq[0], rq[1], rq[2], rq[3]);
  121. Matrix4 m = q.createMatrix();
  122. m.setPosition(t[0], t[1], t[2]);
  123. newBone->setRestMatrix(m);
  124. }
  125. Bone *parentBone;
  126. // SceneEntity *bProxy;
  127. for(int i=0; i < bones.size(); i++) {
  128. if(bones[i]->parentBoneId != -1) {
  129. parentBone = bones[bones[i]->parentBoneId];
  130. parentBone->addChildBone(bones[i]);
  131. bones[i]->setParentBone(parentBone);
  132. parentBone->addEntity(bones[i]);
  133. // addEntity(bones[i]);
  134. SceneLine *connector = new SceneLine(bones[i], parentBone);
  135. connector->depthTest = false;
  136. bonesEntity->addEntity(connector);
  137. connector->setColor(((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),1.0f);
  138. } else {
  139. // bProxy = new SceneEntity();
  140. // addEntity(bProxy);
  141. // bProxy->addEntity(bones[i]);
  142. bonesEntity->addChild(bones[i]);
  143. }
  144. // bones[i]->visible = false;
  145. }
  146. /*
  147. unsigned int numAnimations, activeBones,boneIndex,numPoints,numCurves, curveType;
  148. OSBasics::read(&numAnimations, sizeof(unsigned int), 1, inFile);
  149. //Logger::log("numAnimations: %d\n", numAnimations);
  150. for(int i=0; i < numAnimations; i++) {
  151. OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile);
  152. memset(buffer, 0, 1024);
  153. OSBasics::read(buffer, 1, namelen, inFile);
  154. float length;
  155. OSBasics::read(&length, 1, sizeof(float), inFile);
  156. SkeletonAnimation *newAnimation = new SkeletonAnimation(buffer, length);
  157. OSBasics::read(&activeBones, sizeof(unsigned int), 1, inFile);
  158. // Logger::log("activeBones: %d\n", activeBones);
  159. for(int j=0; j < activeBones; j++) {
  160. OSBasics::read(&boneIndex, sizeof(unsigned int), 1, inFile);
  161. BoneTrack *newTrack = new BoneTrack(bones[boneIndex], length);
  162. BezierCurve *curve;
  163. float vec1[2]; //,vec2[2],vec3[2];
  164. OSBasics::read(&numCurves, sizeof(unsigned int), 1, inFile);
  165. // Logger::log("numCurves: %d\n", numCurves);
  166. for(int l=0; l < numCurves; l++) {
  167. curve = new BezierCurve();
  168. OSBasics::read(&curveType, sizeof(unsigned int), 1, inFile);
  169. OSBasics::read(&numPoints, sizeof(unsigned int), 1, inFile);
  170. for(int k=0; k < numPoints; k++) {
  171. OSBasics::read(vec1, sizeof(float), 2, inFile);
  172. curve->addControlPoint2d(vec1[1], vec1[0]);
  173. // curve->addControlPoint(vec1[1]-10, vec1[0], 0, vec1[1], vec1[0], 0, vec1[1]+10, vec1[0], 0);
  174. }
  175. switch(curveType) {
  176. case 0:
  177. newTrack->scaleX = curve;
  178. break;
  179. case 1:
  180. newTrack->scaleY = curve;
  181. break;
  182. case 2:
  183. newTrack->scaleZ = curve;
  184. break;
  185. case 3:
  186. newTrack->QuatW = curve;
  187. break;
  188. case 4:
  189. newTrack->QuatX = curve;
  190. break;
  191. case 5:
  192. newTrack->QuatY = curve;
  193. break;
  194. case 6:
  195. newTrack->QuatZ = curve;
  196. break;
  197. case 7:;
  198. newTrack->LocX = curve;
  199. break;
  200. case 8:
  201. newTrack->LocY = curve;
  202. break;
  203. case 9:
  204. newTrack->LocZ = curve;
  205. break;
  206. }
  207. }
  208. newAnimation->addBoneTrack(newTrack);
  209. }
  210. animations.push_back(newAnimation);
  211. }
  212. */
  213. OSBasics::close(inFile);
  214. }
  215. void Skeleton::addAnimation(String name, String fileName) {
  216. OSFILE *inFile = OSBasics::open(fileName.c_str(), "rb");
  217. if(!inFile) {
  218. return;
  219. }
  220. unsigned int activeBones,boneIndex,numPoints,numCurves, curveType;
  221. float length;
  222. OSBasics::read(&length, 1, sizeof(float), inFile);
  223. SkeletonAnimation *newAnimation = new SkeletonAnimation(name, length);
  224. OSBasics::read(&activeBones, sizeof(unsigned int), 1, inFile);
  225. // Logger::log("activeBones: %d\n", activeBones);
  226. for(int j=0; j < activeBones; j++) {
  227. OSBasics::read(&boneIndex, sizeof(unsigned int), 1, inFile);
  228. BoneTrack *newTrack = new BoneTrack(bones[boneIndex], length);
  229. BezierCurve *curve;
  230. float vec1[2]; //,vec2[2],vec3[2];
  231. OSBasics::read(&numCurves, sizeof(unsigned int), 1, inFile);
  232. // Logger::log("numCurves: %d\n", numCurves);
  233. for(int l=0; l < numCurves; l++) {
  234. curve = new BezierCurve();
  235. OSBasics::read(&curveType, sizeof(unsigned int), 1, inFile);
  236. OSBasics::read(&numPoints, sizeof(unsigned int), 1, inFile);
  237. for(int k=0; k < numPoints; k++) {
  238. OSBasics::read(vec1, sizeof(float), 2, inFile);
  239. curve->addControlPoint2d(vec1[1], vec1[0]);
  240. // curve->addControlPoint(vec1[1]-10, vec1[0], 0, vec1[1], vec1[0], 0, vec1[1]+10, vec1[0], 0);
  241. }
  242. switch(curveType) {
  243. case 0:
  244. newTrack->scaleX = curve;
  245. break;
  246. case 1:
  247. newTrack->scaleY = curve;
  248. break;
  249. case 2:
  250. newTrack->scaleZ = curve;
  251. break;
  252. case 3:
  253. newTrack->QuatW = curve;
  254. break;
  255. case 4:
  256. newTrack->QuatX = curve;
  257. break;
  258. case 5:
  259. newTrack->QuatY = curve;
  260. break;
  261. case 6:
  262. newTrack->QuatZ = curve;
  263. break;
  264. case 7:;
  265. newTrack->LocX = curve;
  266. break;
  267. case 8:
  268. newTrack->LocY = curve;
  269. break;
  270. case 9:
  271. newTrack->LocZ = curve;
  272. break;
  273. }
  274. }
  275. newAnimation->addBoneTrack(newTrack);
  276. }
  277. animations.push_back(newAnimation);
  278. OSBasics::close(inFile);
  279. }
  280. void Skeleton::bonesVisible(bool val) {
  281. bonesEntity->visible = val;
  282. }
  283. BoneTrack::BoneTrack(Bone *bone, Number length) {
  284. this->length = length;
  285. targetBone = bone;
  286. scaleX = NULL;
  287. scaleY = NULL;
  288. scaleZ = NULL;
  289. QuatW = NULL;
  290. QuatX = NULL;
  291. QuatY = NULL;
  292. QuatZ = NULL;
  293. LocX = NULL;
  294. LocY = NULL;
  295. LocZ = NULL;
  296. initialized = false;
  297. }
  298. BoneTrack::~BoneTrack() {
  299. }
  300. void BoneTrack::Stop() {
  301. if(initialized) {
  302. for(int i=0; i < pathTweens.size(); i++) {
  303. pathTweens[i]->Pause(true);
  304. }
  305. quatTween->Pause(true);
  306. }
  307. }
  308. void BoneTrack::Play() {
  309. if(!initialized ) {
  310. // TODO: change it so that you can set the tweens to not manually restart so you can calculate the
  311. // time per tween
  312. Number durTime = length; //(LocX->getControlPoint(LocX->getNumControlPoints()-1)->p2.x);//25.0f;
  313. BezierPathTween *testTween;
  314. if(LocX) {
  315. testTween = new BezierPathTween(&LocXVec, LocX, Tween::EASE_NONE, durTime, true);
  316. pathTweens.push_back(testTween);
  317. }
  318. if(LocY) {
  319. testTween = new BezierPathTween(&LocYVec, LocY, Tween::EASE_NONE, durTime, true);
  320. pathTweens.push_back(testTween);
  321. }
  322. if(LocZ) {
  323. testTween = new BezierPathTween(&LocZVec, LocZ, Tween::EASE_NONE, durTime, true);
  324. pathTweens.push_back(testTween);
  325. }
  326. testTween = new BezierPathTween(&ScaleXVec, scaleX, Tween::EASE_NONE, durTime, true);
  327. pathTweens.push_back(testTween);
  328. testTween = new BezierPathTween(&ScaleYVec, scaleY, Tween::EASE_NONE, durTime, true);
  329. pathTweens.push_back(testTween);
  330. testTween = new BezierPathTween(&ScaleZVec, scaleZ, Tween::EASE_NONE, durTime, true);
  331. pathTweens.push_back(testTween);
  332. if(QuatW)
  333. quatTween = new QuaternionTween(&boneQuat, QuatW, QuatX, QuatY, QuatZ, Tween::EASE_NONE, durTime, true);
  334. initialized = true;
  335. } else {
  336. for(int i=0; i < pathTweens.size(); i++) {
  337. pathTweens[i]->Pause(false);
  338. }
  339. quatTween->Pause(false);
  340. }
  341. /*
  342. if(QuatW) {
  343. testTween = new BezierPathTween(&QuatWVec, QuatW, Tween::EASE_NONE, durTime, true);
  344. pathTweens.push_back(testTween);
  345. }
  346. if(QuatX) {
  347. testTween = new BezierPathTween(&QuatXVec, QuatX, Tween::EASE_NONE, durTime, true);
  348. pathTweens.push_back(testTween);
  349. }
  350. if(QuatY) {
  351. testTween = new BezierPathTween(&QuatYVec, QuatY, Tween::EASE_NONE, durTime, true);
  352. pathTweens.push_back(testTween);
  353. }
  354. if(QuatZ) {
  355. testTween = new BezierPathTween(&QuatZVec, QuatZ, Tween::EASE_NONE, durTime, true);
  356. pathTweens.push_back(testTween);
  357. }
  358. */
  359. }
  360. void BoneTrack::Update() {
  361. Matrix4 newMatrix;
  362. newMatrix = boneQuat.createMatrix();
  363. Matrix4 scaleMatrix;
  364. scaleMatrix.m[0][0] *= 1; //ScaleXVec.y;
  365. scaleMatrix.m[1][1] *= 1; //ScaleYVec.y;
  366. scaleMatrix.m[2][2] *= 1; //ScaleZVec.y;
  367. Matrix4 posMatrix;
  368. if(LocX)
  369. posMatrix.m[3][0] = LocXVec.y;
  370. else
  371. posMatrix.m[3][0] = targetBone->getBaseMatrix()[3][0];
  372. if(LocY)
  373. posMatrix.m[3][1] = LocYVec.y;
  374. else
  375. posMatrix.m[3][1] = targetBone->getBaseMatrix()[3][1];
  376. if(LocZ)
  377. posMatrix.m[3][2] = LocZVec.y;
  378. else
  379. posMatrix.m[3][2] = targetBone->getBaseMatrix()[3][2];
  380. newMatrix = scaleMatrix*newMatrix*posMatrix;
  381. targetBone->setBoneMatrix(newMatrix);
  382. targetBone->setTransformByMatrixPure(newMatrix);
  383. }
  384. void BoneTrack::setSpeed(Number speed) {
  385. for(int i=0; i < pathTweens.size(); i++) {
  386. pathTweens[i]->setSpeed(speed);
  387. }
  388. quatTween->setSpeed(speed);
  389. }
  390. SkeletonAnimation::SkeletonAnimation(String name, Number duration) {
  391. this->name = name;
  392. this->duration = duration;
  393. }
  394. void SkeletonAnimation::setSpeed(Number speed) {
  395. for(int i=0; i < boneTracks.size(); i++) {
  396. boneTracks[i]->setSpeed(speed);
  397. }
  398. }
  399. void SkeletonAnimation::Update() {
  400. for(int i=0; i < boneTracks.size(); i++) {
  401. boneTracks[i]->Update();
  402. }
  403. }
  404. void SkeletonAnimation::Stop() {
  405. for(int i=0; i < boneTracks.size(); i++) {
  406. boneTracks[i]->Stop();
  407. }
  408. }
  409. void SkeletonAnimation::Play() {
  410. for(int i=0; i < boneTracks.size(); i++) {
  411. boneTracks[i]->Play();
  412. }
  413. }
  414. SkeletonAnimation::~SkeletonAnimation() {
  415. }
  416. String SkeletonAnimation::getName() {
  417. return name;
  418. }
  419. void SkeletonAnimation::addBoneTrack(BoneTrack *boneTrack) {
  420. boneTracks.push_back(boneTrack);
  421. }