DecalNode.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. {
  11. /// Decal feedback component.
  12. class DecalNode::MoveFeedbackComponent : public SceneComponent
  13. {
  14. ANKI_SCENE_COMPONENT(DecalNode::MoveFeedbackComponent)
  15. public:
  16. MoveFeedbackComponent(SceneNode* node)
  17. : SceneComponent(node, getStaticClassId(), true)
  18. {
  19. }
  20. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  21. {
  22. updated = false;
  23. MoveComponent& movec = node.getFirstComponentOfType<MoveComponent>();
  24. if(movec.getTimestamp() == node.getGlobalTimestamp())
  25. {
  26. static_cast<DecalNode&>(node).onMove(movec);
  27. }
  28. return Error::NONE;
  29. }
  30. };
  31. ANKI_SCENE_COMPONENT_STATICS(DecalNode::MoveFeedbackComponent)
  32. /// Decal feedback component.
  33. class DecalNode::ShapeFeedbackComponent : public SceneComponent
  34. {
  35. ANKI_SCENE_COMPONENT(DecalNode::ShapeFeedbackComponent)
  36. public:
  37. ShapeFeedbackComponent(SceneNode* node)
  38. : SceneComponent(node, getStaticClassId(), true)
  39. {
  40. }
  41. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  42. {
  43. updated = false;
  44. DecalComponent& decalc = node.getFirstComponentOfType<DecalComponent>();
  45. if(decalc.getTimestamp() == node.getGlobalTimestamp())
  46. {
  47. static_cast<DecalNode&>(node).onDecalUpdated(decalc);
  48. }
  49. return Error::NONE;
  50. }
  51. };
  52. ANKI_SCENE_COMPONENT_STATICS(DecalNode::ShapeFeedbackComponent)
  53. DecalNode::DecalNode(SceneGraph* scene, CString name)
  54. : SceneNode(scene, name)
  55. {
  56. newComponent<MoveComponent>();
  57. newComponent<MoveFeedbackComponent>();
  58. newComponent<DecalComponent>();
  59. newComponent<ShapeFeedbackComponent>();
  60. newComponent<SpatialComponent>();
  61. }
  62. DecalNode::~DecalNode()
  63. {
  64. }
  65. void DecalNode::onMove(MoveComponent& movec)
  66. {
  67. getFirstComponentOfType<SpatialComponent>().setSpatialOrigin(movec.getWorldTransform().getOrigin().xyz());
  68. getFirstComponentOfType<DecalComponent>().setWorldTransform(movec.getWorldTransform());
  69. }
  70. void DecalNode::onDecalUpdated(DecalComponent& decalc)
  71. {
  72. getFirstComponentOfType<SpatialComponent>().setObbWorldSpace(decalc.getBoundingVolumeWorldSpace());
  73. }
  74. } // end namespace anki