Open Source Tomb Raider Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SkeletalModel.cpp 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*!
  2. * \file src/SkeletalModel.cpp
  3. * \brief This is the factored out skeletal model class
  4. *
  5. * \author Mongoose
  6. * \author xythobuz
  7. */
  8. #include "global.h"
  9. #include "Log.h"
  10. #include "SkeletalModel.h"
  11. #include "World.h"
  12. BoneTag::BoneTag(int m, float o[3], float r[3], char f) {
  13. mesh = m;
  14. flag = f;
  15. for (int i = 0; i < 3; i++) {
  16. off[i] = o[i];
  17. rot[i] = r[i];
  18. }
  19. }
  20. void BoneTag::display() {
  21. /*
  22. if (getWorld().sizeMesh() > 0)
  23. getWorld().getMesh(mesh).drawSolid(); // TODO ?
  24. else
  25. getWorld().getStaticMesh(mesh).display();
  26. */
  27. }
  28. void BoneTag::getOffset(float o[3]) {
  29. o[0] = off[0];
  30. o[1] = off[1];
  31. o[2] = off[2];
  32. }
  33. void BoneTag::getRotation(float r[3]) {
  34. r[0] = rot[0];
  35. r[1] = rot[1];
  36. r[2] = rot[2];
  37. }
  38. char BoneTag::getFlag() {
  39. return flag;
  40. }
  41. // ----------------------------------------------------------------------------
  42. BoneFrame::BoneFrame(float p[3]) {
  43. for (int i = 0; i < 3; i++)
  44. pos[i] = p[i];
  45. }
  46. BoneFrame::~BoneFrame() {
  47. for (unsigned long i = 0; i < tag.size(); i++)
  48. delete tag[i];
  49. }
  50. unsigned long BoneFrame::size() {
  51. return tag.size();
  52. }
  53. BoneTag& BoneFrame::get(unsigned long i) {
  54. assert(i < tag.size());
  55. return *tag.at(i);
  56. }
  57. void BoneFrame::add(BoneTag* t) {
  58. tag.push_back(t);
  59. }
  60. void BoneFrame::getPosition(float p[3]) {
  61. p[0] = pos[0];
  62. p[1] = pos[1];
  63. p[2] = pos[2];
  64. }
  65. // ----------------------------------------------------------------------------
  66. AnimationFrame::AnimationFrame(char r) {
  67. rate = r;
  68. }
  69. AnimationFrame::~AnimationFrame() {
  70. for (unsigned long i = 0; i < frame.size(); i++)
  71. delete frame[i];
  72. }
  73. unsigned long AnimationFrame::size() {
  74. return frame.size();
  75. }
  76. BoneFrame& AnimationFrame::get(unsigned long i) {
  77. assert(i < frame.size());
  78. return *frame.at(i);
  79. }
  80. void AnimationFrame::add(BoneFrame* f) {
  81. frame.push_back(f);
  82. }
  83. // ----------------------------------------------------------------------------
  84. SkeletalModel::SkeletalModel(int i) {
  85. id = i;
  86. }
  87. SkeletalModel::~SkeletalModel() {
  88. for (unsigned long i = 0; i < animation.size(); i++)
  89. delete animation[i];
  90. }
  91. void SkeletalModel::display(unsigned long aframe, unsigned long bframe) {
  92. /*
  93. assert(aframe < size());
  94. assert(bframe < get(aframe).size());
  95. AnimationFrame& anim = get(aframe);
  96. BoneFrame& boneframe = anim.get(bframe);
  97. float pos[3];
  98. boneframe.getPosition(pos);
  99. glTranslatef(pos[0], pos[1], pos[2]);
  100. for (unsigned int a = 0; a < boneframe.size(); a++) {
  101. BoneTag& tag = boneframe.get(a);
  102. float rot[3], off[3];
  103. tag.getRotation(rot);
  104. tag.getOffset(off);
  105. if (a == 0) {
  106. glRotatef(rot[1], 0, 1, 0);
  107. glRotatef(rot[0], 1, 0, 0);
  108. glRotatef(rot[2], 0, 0, 1);
  109. } else {
  110. if (tag.getFlag() & 0x01)
  111. glPopMatrix();
  112. if (tag.getFlag() & 0x02)
  113. glPushMatrix();
  114. glTranslatef(off[0], off[1], off[2]);
  115. glRotatef(rot[1], 0, 1, 0);
  116. glRotatef(rot[0], 1, 0, 0);
  117. glRotatef(rot[2], 0, 0, 1);
  118. }
  119. tag.display();
  120. }
  121. */
  122. }
  123. int SkeletalModel::getId() {
  124. return id;
  125. }
  126. void SkeletalModel::setPigTail(bool b) {
  127. pigtails = b;
  128. if (b) {
  129. ponyOff -= 20;
  130. ponytail[1] -= 32;
  131. } else {
  132. ponyOff += 20;
  133. ponytail[1] += 32;
  134. }
  135. }
  136. void SkeletalModel::setPonyPos(float x, float y, float z, float angle) {
  137. ponytail[0] = x;
  138. ponytail[1] = y;
  139. ponytail[2] = z;
  140. ponytailAngle = angle;
  141. }
  142. unsigned long SkeletalModel::size() {
  143. return animation.size();
  144. }
  145. AnimationFrame& SkeletalModel::get(unsigned long i) {
  146. assert(i < animation.size());
  147. return *animation.at(i);
  148. }
  149. void SkeletalModel::add(AnimationFrame* f) {
  150. animation.push_back(f);
  151. }