FogDensityNode.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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/FogDensityNode.h>
  6. #include <AnKi/Scene/Components/MoveComponent.h>
  7. #include <AnKi/Scene/Components/FogDensityComponent.h>
  8. #include <AnKi/Scene/Components/SpatialComponent.h>
  9. namespace anki
  10. {
  11. class FogDensityNode::MoveFeedbackComponent : public SceneComponent
  12. {
  13. ANKI_SCENE_COMPONENT(FogDensityNode::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. const MoveComponent& movec = node.getFirstComponentOfType<MoveComponent>();
  23. if(movec.getTimestamp() == node.getGlobalTimestamp())
  24. {
  25. static_cast<FogDensityNode&>(node).onMoveUpdated(movec);
  26. }
  27. return Error::NONE;
  28. }
  29. };
  30. ANKI_SCENE_COMPONENT_STATICS(FogDensityNode::MoveFeedbackComponent)
  31. class FogDensityNode::DensityShapeFeedbackComponent : public SceneComponent
  32. {
  33. ANKI_SCENE_COMPONENT(FogDensityNode::DensityShapeFeedbackComponent)
  34. public:
  35. DensityShapeFeedbackComponent(SceneNode* node)
  36. : SceneComponent(node, getStaticClassId(), true)
  37. {
  38. }
  39. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  40. {
  41. updated = false;
  42. const FogDensityComponent& fogc = node.getFirstComponentOfType<FogDensityComponent>();
  43. if(fogc.getTimestamp() == node.getGlobalTimestamp())
  44. {
  45. static_cast<FogDensityNode&>(node).onDensityShapeUpdated(fogc);
  46. }
  47. return Error::NONE;
  48. }
  49. };
  50. ANKI_SCENE_COMPONENT_STATICS(FogDensityNode::DensityShapeFeedbackComponent)
  51. FogDensityNode::FogDensityNode(SceneGraph* scene, CString name)
  52. : SceneNode(scene, name)
  53. {
  54. newComponent<MoveComponent>();
  55. newComponent<MoveFeedbackComponent>();
  56. newComponent<FogDensityComponent>();
  57. newComponent<DensityShapeFeedbackComponent>();
  58. newComponent<SpatialComponent>();
  59. }
  60. FogDensityNode::~FogDensityNode()
  61. {
  62. }
  63. void FogDensityNode::onMoveUpdated(const MoveComponent& movec)
  64. {
  65. getFirstComponentOfType<FogDensityComponent>().setWorldPosition(movec.getWorldTransform().getOrigin().xyz());
  66. getFirstComponentOfType<SpatialComponent>().setSpatialOrigin(movec.getWorldTransform().getOrigin().xyz());
  67. }
  68. void FogDensityNode::onDensityShapeUpdated(const FogDensityComponent& fogc)
  69. {
  70. SpatialComponent& spatialc = getFirstComponentOfType<SpatialComponent>();
  71. if(fogc.isAabb())
  72. {
  73. spatialc.setAabbWorldSpace(fogc.getAabbWorldSpace());
  74. }
  75. else
  76. {
  77. ANKI_ASSERT(fogc.isSphere());
  78. spatialc.setSphereWorldSpace(fogc.getSphereWorldSpace());
  79. }
  80. }
  81. } // end namespace anki