DecalNode.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Scene/DecalNode.h>
  6. #include <AnKi/Scene/Components/DecalComponent.h>
  7. #include <AnKi/Scene/Components/MoveComponent.h>
  8. #include <AnKi/Scene/Components/SpatialComponent.h>
  9. namespace anki {
  10. /// Decal feedback component.
  11. class DecalNode::MoveFeedbackComponent : public SceneComponent
  12. {
  13. ANKI_SCENE_COMPONENT(DecalNode::MoveFeedbackComponent)
  14. public:
  15. MoveFeedbackComponent(SceneNode* node)
  16. : SceneComponent(node, getStaticClassId(), true)
  17. {
  18. }
  19. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  20. {
  21. updated = false;
  22. MoveComponent& movec = node.getFirstComponentOfType<MoveComponent>();
  23. if(movec.getTimestamp() == node.getGlobalTimestamp())
  24. {
  25. static_cast<DecalNode&>(node).onMove(movec);
  26. }
  27. return Error::NONE;
  28. }
  29. };
  30. ANKI_SCENE_COMPONENT_STATICS(DecalNode::MoveFeedbackComponent)
  31. /// Decal feedback component.
  32. class DecalNode::ShapeFeedbackComponent : public SceneComponent
  33. {
  34. ANKI_SCENE_COMPONENT(DecalNode::ShapeFeedbackComponent)
  35. public:
  36. ShapeFeedbackComponent(SceneNode* node)
  37. : SceneComponent(node, getStaticClassId(), true)
  38. {
  39. }
  40. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  41. {
  42. updated = false;
  43. DecalComponent& decalc = node.getFirstComponentOfType<DecalComponent>();
  44. if(decalc.getTimestamp() == node.getGlobalTimestamp())
  45. {
  46. static_cast<DecalNode&>(node).onDecalUpdated(decalc);
  47. }
  48. return Error::NONE;
  49. }
  50. };
  51. ANKI_SCENE_COMPONENT_STATICS(DecalNode::ShapeFeedbackComponent)
  52. DecalNode::DecalNode(SceneGraph* scene, CString name)
  53. : SceneNode(scene, name)
  54. {
  55. newComponent<MoveComponent>();
  56. newComponent<MoveFeedbackComponent>();
  57. newComponent<DecalComponent>();
  58. newComponent<ShapeFeedbackComponent>();
  59. newComponent<SpatialComponent>();
  60. }
  61. DecalNode::~DecalNode()
  62. {
  63. }
  64. void DecalNode::onMove(MoveComponent& movec)
  65. {
  66. getFirstComponentOfType<SpatialComponent>().setSpatialOrigin(movec.getWorldTransform().getOrigin().xyz());
  67. getFirstComponentOfType<DecalComponent>().setWorldTransform(movec.getWorldTransform());
  68. }
  69. void DecalNode::onDecalUpdated(DecalComponent& decalc)
  70. {
  71. getFirstComponentOfType<SpatialComponent>().setObbWorldSpace(decalc.getBoundingVolumeWorldSpace());
  72. }
  73. } // end namespace anki