ModelNode.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. namespace anki {
  11. /// A fragment of the ModelNode
  12. class ModelPatchNode: public SceneNode, public Movable, public Renderable,
  13. public Spatial
  14. {
  15. public:
  16. /// @name Constructors/Destructor
  17. /// @{
  18. ModelPatchNode(const ModelPatch* modelPatch_,
  19. const char* name, Scene* scene, // Scene
  20. U32 movableFlags, Movable* movParent); // Movable
  21. /// @}
  22. /// @name SceneNode virtuals
  23. /// @{
  24. /// Override SceneNode::getMovable()
  25. Movable* getMovable()
  26. {
  27. return this;
  28. }
  29. /// Override SceneNode::getSpatial()
  30. Spatial* getSpatial()
  31. {
  32. return this;
  33. }
  34. /// Override SceneNode::getRenderable
  35. Renderable* getRenderable()
  36. {
  37. return this;
  38. }
  39. /// Override SceneNode::frameUpdate
  40. void frameUpdate(F32 prevUpdateTime, F32 crntTime, I frame)
  41. {
  42. SceneNode::frameUpdate(prevUpdateTime, crntTime, frame);
  43. }
  44. /// @}
  45. // @name Movable virtuals
  46. /// @{
  47. /// Overrides Movable::moveUpdate(). This does:
  48. /// - Update the collision shape
  49. void movableUpdate()
  50. {
  51. Movable::movableUpdate();
  52. obb = modelPatch->getMeshBase().getBoundingShape().getTransformed(
  53. getWorldTransform());
  54. spatialMarkUpdated();
  55. }
  56. /// @}
  57. /// @name Renderable virtuals
  58. /// @{
  59. /// Implements Renderable::getModelPatchBase
  60. const ModelPatchBase& getRenderableModelPatchBase() const
  61. {
  62. return *modelPatch;
  63. }
  64. /// Implements Renderable::getMaterial
  65. const Material& getRenderableMaterial() const
  66. {
  67. return modelPatch->getMaterial();
  68. }
  69. /// Overrides Renderable::getRenderableWorldTransforms
  70. const Transform* getRenderableWorldTransforms() const
  71. {
  72. return &getWorldTransform();
  73. }
  74. /// @}
  75. private:
  76. Obb obb; ///< In world space
  77. const ModelPatch* modelPatch; ///< The resource
  78. };
  79. /// The model scene node
  80. class ModelNode: public SceneNode, public Movable
  81. {
  82. public:
  83. typedef PtrVector<ModelPatchNode> ModelPatchNodes;
  84. /// @name Constructors/Destructor
  85. /// @{
  86. ModelNode(const char* modelFname,
  87. const char* name, Scene* scene, // SceneNode
  88. uint movableFlags, Movable* movParent); // Movable
  89. virtual ~ModelNode();
  90. /// @}
  91. /// @name Accessors
  92. /// @{
  93. const Model& getModel() const
  94. {
  95. return *model;
  96. }
  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