ModelNode.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #ifndef ANKI_SCENE_MODEL_NODE_H
  2. #define ANKI_SCENE_MODEL_NODE_H
  3. #include "anki/scene/SceneNode.h"
  4. #include "anki/scene/Renderable.h"
  5. #include "anki/scene/Movable.h"
  6. #include "anki/scene/Spatial.h"
  7. #include "anki/resource/Resource.h"
  8. #include "anki/resource/Model.h"
  9. #include "anki/collision/Obb.h"
  10. #include <boost/ptr_container/ptr_vector.hpp>
  11. #include <boost/range/iterator_range.hpp>
  12. #include <boost/scoped_ptr.hpp>
  13. namespace anki {
  14. /// A fragment of the ModelNode
  15. class ModelPatchNode: public SceneNode, public Movable, public Renderable,
  16. public Spatial
  17. {
  18. public:
  19. /// @name Constructors/Destructor
  20. /// @{
  21. ModelPatchNode(const ModelPatch* modelPatch_,
  22. const char* name, Scene* scene, // Scene
  23. uint movableFlags, Movable* movParent); // Movable
  24. /// @}
  25. /// @name SceneNode virtuals
  26. /// @{
  27. /// Override SceneNode::getMovable()
  28. Movable* getMovable()
  29. {
  30. return this;
  31. }
  32. /// Override SceneNode::getSpatial()
  33. Spatial* getSpatial()
  34. {
  35. return this;
  36. }
  37. /// Override SceneNode::getRenderable
  38. Renderable* getRenderable()
  39. {
  40. return this;
  41. }
  42. /// Override SceneNode::frameUpdate
  43. void frameUpdate(float prevUpdateTime, float crntTime, int frame)
  44. {
  45. SceneNode::frameUpdate(prevUpdateTime, crntTime, frame);
  46. }
  47. /// @}
  48. // @name Movable virtuals
  49. /// @{
  50. /// Overrides Movable::moveUpdate(). This does:
  51. /// - Update the collision shape
  52. void movableUpdate()
  53. {
  54. Movable::movableUpdate();
  55. obb = modelPatch->getMeshBase().getBoundingShape().getTransformed(
  56. getWorldTransform());
  57. spatialMarkUpdated();
  58. }
  59. /// @}
  60. /// @name Renderable virtuals
  61. /// @{
  62. /// Implements Renderable::getModelPatchBase
  63. const ModelPatchBase& getModelPatchBase() const
  64. {
  65. return *modelPatch;
  66. }
  67. /// Implements Renderable::getMaterial
  68. const Material& getMaterial() const
  69. {
  70. return modelPatch->getMaterial();
  71. }
  72. /// Overrides Renderable::getRenderableWorldTransform
  73. const Transform* getRenderableWorldTransform() const
  74. {
  75. return &getWorldTransform();
  76. }
  77. /// @}
  78. private:
  79. Obb obb; ///< In world space
  80. const ModelPatch* modelPatch; ///< The resource
  81. };
  82. /// The model scene node
  83. class ModelNode: public SceneNode, public Movable
  84. {
  85. public:
  86. typedef boost::ptr_vector<ModelPatchNode> ModelPatchNodes;
  87. typedef boost::iterator_range<ModelPatchNodes::const_iterator>
  88. ConstRangeModelPatchNodes;
  89. typedef boost::iterator_range<ModelPatchNodes::iterator>
  90. MutableRangeModelPatchNodes;
  91. /// @name Constructors/Destructor
  92. /// @{
  93. ModelNode(const char* modelFname,
  94. const char* name, Scene* scene, // SceneNode
  95. uint movableFlags, Movable* movParent); // Movable
  96. virtual ~ModelNode();
  97. /// @}
  98. /// @name SceneNode virtuals
  99. /// @{
  100. /// Override SceneNode::getMovable()
  101. Movable* getMovable()
  102. {
  103. return this;
  104. }
  105. /// Override SceneNode::frameUpdate
  106. void frameUpdate(float prevUpdateTime, float crntTime, int frame)
  107. {
  108. SceneNode::frameUpdate(prevUpdateTime, crntTime, frame);
  109. }
  110. /// @}
  111. /// @name Movable virtuals
  112. /// @{
  113. /// Overrides Movable::moveUpdate(). This does:
  114. /// - Update collision shape
  115. void movableUpdate()
  116. {
  117. Movable::movableUpdate();
  118. }
  119. /// @}
  120. private:
  121. ModelResourcePointer model; ///< The resource
  122. ModelPatchNodes patches;
  123. };
  124. } // end namespace
  125. #endif