Movable.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "anki/scene/Movable.h"
  2. #include "anki/scene/Property.h"
  3. namespace anki {
  4. //==============================================================================
  5. Movable::Movable(U32 flags_, Movable* parent, PropertyMap& pmap)
  6. : Base(this, parent), Flags(flags_)
  7. {
  8. pmap.addNewProperty(
  9. new ReadWritePointerProperty<Transform>("localTransform", &lTrf));
  10. pmap.addNewProperty(
  11. new ReadPointerProperty<Transform>("worldTransform", &wTrf));
  12. }
  13. //==============================================================================
  14. Movable::~Movable()
  15. {}
  16. //==============================================================================
  17. void Movable::update()
  18. {
  19. if(getParent() == nullptr) // If root
  20. {
  21. updateWorldTransform();
  22. }
  23. }
  24. //==============================================================================
  25. void Movable::updateWorldTransform()
  26. {
  27. prevWTrf = wTrf;
  28. Movable* parent = getParent();
  29. U32 crntTimestamp = Timestamp::getTimestamp();
  30. if(parent)
  31. {
  32. if(parent->timestamp == crntTimestamp
  33. || timestamp == crntTimestamp)
  34. {
  35. if(isFlagEnabled(MF_IGNORE_LOCAL_TRANSFORM))
  36. {
  37. wTrf = parent->getWorldTransform();
  38. }
  39. else
  40. {
  41. wTrf = Transform::combineTransformations(
  42. parent->getWorldTransform(), lTrf);
  43. }
  44. timestamp = crntTimestamp;
  45. }
  46. }
  47. else if(timestamp == crntTimestamp)
  48. {
  49. wTrf = lTrf;
  50. }
  51. if(timestamp == crntTimestamp)
  52. {
  53. movableUpdate();
  54. }
  55. Movable::Container::iterator it = getChildrenBegin();
  56. for(; it != getChildrenEnd(); it++)
  57. {
  58. (*it)->updateWorldTransform();
  59. }
  60. }
  61. } // namespace anki