1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "BsCorePrerequisites.h"
6#include "Renderer/BsRenderable.h"
7#include "Math/BsBounds.h"
8#include "Scene/BsComponent.h"
9
10namespace bs
11{
12 /** @addtogroup Components-Core
13 * @{
14 */
15
16 /**
17 * @copydoc Renderable
18 *
19 * @note Wraps a Renderable as a Component.
20 */
21 class BS_CORE_EXPORT BS_SCRIPT_EXPORT(m:Rendering,n:Renderable) CRenderable : public Component
22 {
23 public:
24 /** @copydoc Renderable::setMesh */
25 BS_SCRIPT_EXPORT(n:Mesh,pr:setter)
26 void setMesh(HMesh mesh);
27
28 /** @copydoc Renderable::getMesh */
29 BS_SCRIPT_EXPORT(n:Mesh,pr:getter)
30 HMesh getMesh() const { return mInternal->getMesh(); }
31
32 /** @copydoc Renderable::setMaterial */
33 BS_SCRIPT_EXPORT(n:SetMaterial)
34 void setMaterial(UINT32 idx, HMaterial material) { mInternal->setMaterial(idx, material); }
35
36 /** @copydoc Renderable::setMaterial */
37 BS_SCRIPT_EXPORT(n:SetMaterial)
38 void setMaterial(HMaterial material) { mInternal->setMaterial(material); }
39
40 /** @copydoc Renderable::getMaterial */
41 BS_SCRIPT_EXPORT(n:GetMaterial)
42 HMaterial getMaterial(UINT32 idx) const { return mInternal->getMaterial(idx); }
43
44 /** @copydoc Renderable::setMaterials */
45 BS_SCRIPT_EXPORT(n:Materials,pr:setter)
46 void setMaterials(const Vector<HMaterial>& materials) { mInternal->setMaterials(materials); }
47
48 /** @copydoc Renderable::getMaterials */
49 BS_SCRIPT_EXPORT(n:Materials,pr:getter)
50 const Vector<HMaterial>& getMaterials() { return mInternal->getMaterials(); }
51
52 /** @copydoc Renderable::setCullDistanceFactor */
53 BS_SCRIPT_EXPORT(n:CullDistance, pr:setter)
54 void setCullDistanceFactor(float factor) { mInternal->setCullDistanceFactor(factor); }
55
56 /** @copydoc Renderable::getCullDistanceFactor */
57 BS_SCRIPT_EXPORT(n:CullDistance, pr:getter)
58 float getCullDistanceFactor() const { return mInternal->getCullDistanceFactor(); }
59
60 /** @copydoc Renderable::setLayer */
61 BS_SCRIPT_EXPORT(n:Layers,pr:setter)
62 void setLayer(UINT64 layer) { mInternal->setLayer(layer); }
63
64 /** @copydoc Renderable::getLayer */
65 BS_SCRIPT_EXPORT(n:Layers,pr:getter)
66 UINT64 getLayer() const { return mInternal->getLayer(); }
67
68 /** Gets world bounds of the mesh rendered by this object. */
69 BS_SCRIPT_EXPORT(n:Bounds,pr:getter)
70 Bounds getBounds() const;
71
72 /** @copydoc Component::calculateBounds */
73 bool calculateBounds(Bounds& bounds) override;
74
75 /** @name Internal
76 * @{
77 */
78
79 /** Returns the internal renderable that is used for majority of operations by this component. */
80 SPtr<Renderable> _getInternal() const { return mInternal; }
81
82 /** Registers an Animation component that will be used for animating the renderable's mesh. */
83 void _registerAnimation(const HAnimation& animation);
84
85 /** Removes the Animation component, making the renderable rendered as a static object. */
86 void _unregisterAnimation();
87
88 /** @} */
89
90 private:
91 mutable SPtr<Renderable> mInternal;
92 HAnimation mAnimation;
93
94 /************************************************************************/
95 /* COMPONENT OVERRIDES */
96 /************************************************************************/
97
98 protected:
99 friend class SceneObject;
100
101 CRenderable(const HSceneObject& parent);
102
103 /** @copydoc Component::onInitialized */
104 void onInitialized() override;
105
106 /** @copydoc Component::onDestroyed */
107 void onDestroyed() override;
108
109 public:
110 /** @copydoc Component::update */
111 void update() override;
112
113 /************************************************************************/
114 /* RTTI */
115 /************************************************************************/
116 public:
117 friend class CRenderableRTTI;
118 static RTTITypeBase* getRTTIStatic();
119 RTTITypeBase* getRTTI() const override;
120
121 protected:
122 CRenderable(); // Serialization only
123 };
124
125 /** @} */
126}