SceneNode.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <algorithm>
  2. #include "SceneNode.h"
  3. #include "Renderer.h"
  4. #include "Controller.h"
  5. #include "Scene.h"
  6. #include "App.h"
  7. //======================================================================================================================
  8. // commonConstructorCode =
  9. //======================================================================================================================
  10. void SceneNode::commonConstructorCode()
  11. {
  12. parent = NULL;
  13. isCompound = false;
  14. getWorldTransform().setIdentity();
  15. getLocalTransform().setIdentity();
  16. AppSingleton::getInstance().getScene().registerNode(this);
  17. }
  18. //======================================================================================================================
  19. // Destructor =
  20. //======================================================================================================================
  21. SceneNode::~SceneNode()
  22. {
  23. AppSingleton::getInstance().getScene().unregisterNode(this);
  24. }
  25. //======================================================================================================================
  26. // updateWorldTransform =
  27. //======================================================================================================================
  28. void SceneNode::updateWorldTransform()
  29. {
  30. if(parent)
  31. {
  32. worldTransform = Transform::combineTransformations(parent->getWorldTransform(), localTransform);
  33. }
  34. else // else copy
  35. {
  36. worldTransform = localTransform;
  37. }
  38. // transform the bvolume
  39. /*if(bvolumeLspace != NULL)
  40. {
  41. DEBUG_ERR(bvolumeLspace->type!=bvolume_t::BSPHERE && bvolumeLspace->type!=bvolume_t::AABB && bvolumeLspace->type!=bvolume_t::OBB);
  42. switch(bvolumeLspace->type)
  43. {
  44. case bvolume_t::BSPHERE:
  45. {
  46. bsphere_t sphere = static_cast<bsphere_t*>(bvolumeLspace)->Transformed(translationWspace, rotationWspace, scaleWspace);
  47. *static_cast<bsphere_t*>(bvolumeLspace) = sphere;
  48. break;
  49. }
  50. case bvolume_t::AABB:
  51. {
  52. aabb_t aabb = static_cast<aabb_t*>(bvolumeLspace)->Transformed(translationWspace, rotationWspace, scaleWspace);
  53. *static_cast<aabb_t*>(bvolumeLspace) = aabb;
  54. break;
  55. }
  56. case bvolume_t::OBB:
  57. {
  58. obb_t obb = static_cast<obb_t*>(bvolumeLspace)->Transformed(translationWspace, rotationWspace, scaleWspace);
  59. *static_cast<obb_t*>(bvolumeLspace) = obb;
  60. break;
  61. }
  62. default:
  63. FATAL("What the fuck");
  64. }
  65. }*/
  66. }
  67. //======================================================================================================================
  68. // Move(s) =
  69. // Move the object according to it's local axis =
  70. //======================================================================================================================
  71. void SceneNode::moveLocalX(float distance)
  72. {
  73. Vec3 x_axis = localTransform.rotation.getColumn(0);
  74. getLocalTransform().origin += x_axis * distance;
  75. }
  76. void SceneNode::moveLocalY(float distance)
  77. {
  78. Vec3 y_axis = localTransform.rotation.getColumn(1);
  79. getLocalTransform().origin += y_axis * distance;
  80. }
  81. void SceneNode::moveLocalZ(float distance)
  82. {
  83. Vec3 z_axis = localTransform.rotation.getColumn(2);
  84. getLocalTransform().origin += z_axis * distance;
  85. }
  86. //======================================================================================================================
  87. // addChild =
  88. //======================================================================================================================
  89. void SceneNode::addChild(SceneNode* node)
  90. {
  91. if(node->parent != NULL)
  92. {
  93. throw EXCEPTION("Node already has parent");
  94. }
  95. node->parent = this;
  96. childs.push_back(node);
  97. }
  98. //======================================================================================================================
  99. // removeChild =
  100. //======================================================================================================================
  101. void SceneNode::removeChild(SceneNode* child)
  102. {
  103. Vec<SceneNode*>::iterator it = std::find(childs.begin(), childs.end(), child);
  104. if(it == childs.end())
  105. {
  106. throw EXCEPTION("Child not found");
  107. }
  108. child->parent = NULL;
  109. childs.erase(it);
  110. }