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 "Reflection/BsIReflectable.h"
7
8namespace bs
9{
10 /** @addtogroup Scene-Internal
11 * @{
12 */
13
14 /** Flags used for notifying child scene object and components when a transform has been changed. */
15 enum TransformChangedFlags
16 {
17 TCF_None = 0x00, /**< Component will not be notified about any events relating to the transform. */
18 TCF_Transform = 0x01, /**< Component will be notified when the its position, rotation or scale has changed. */
19 TCF_Parent = 0x02, /**< Component will be notified when its parent changes. */
20 TCF_Mobility = 0x04 /**< Component will be notified when mobility state changes. */
21 };
22
23 /** @} */
24 /** @addtogroup Scene
25 * @{
26 */
27
28 /**
29 * Type of object that can be referenced by a GameObject handle. Each object has an unique ID and is registered with
30 * the GameObjectManager.
31 */
32 class BS_CORE_EXPORT GameObject : public IReflectable
33 {
34 public:
35 GameObject() = default;
36 virtual ~GameObject() = default;
37
38 /** Returns the unique instance ID of the GameObject. */
39 UINT64 getInstanceId() const { return mInstanceData->mInstanceId; }
40
41 /**
42 * Returns an ID that identifies a link between this object and its equivalent in the linked prefab. This will be
43 * -1 if the object has no prefab link, or if the object is specific to the instance and has no prefab equivalent.
44 */
45 UINT32 getLinkId() const { return mLinkId; }
46
47 /** Globally unique identifier of the game object that persists scene save/load. */
48 const UUID& getUUID() const { return mUUID; }
49
50 /** Gets the name of the object. */
51 const String& getName() const { return mName; }
52
53 /** Sets the name of the object. */
54 void setName(const String& name) { mName = name; }
55
56 public: // ***** INTERNAL ******
57 /** @name Internal
58 * @{
59 */
60
61 /**
62 * Marks the object as destroyed. Generally this means the object has been queued for destruction but it hasn't
63 * occurred yet.
64 */
65 void _setIsDestroyed() { mIsDestroyed = true; }
66
67 /** Checks if the object has been destroyed. */
68 bool _getIsDestroyed() const { return mIsDestroyed; }
69
70 /** Changes the prefab link ID for this object. See getLinkId(). */
71 void _setLinkId(UINT32 id) { mLinkId = id; }
72
73 /** @copydoc getUUID */
74 void _setUUID(const UUID& uuid) { mUUID = uuid; }
75
76 /**
77 * Replaces the instance data with another objects instance data. This object will basically become the original
78 * owner of the provided instance data as far as all game object handles referencing it are concerned.
79 *
80 * @note
81 * No alive objects should ever be sharing the same instance data. This can be used for restoring dead handles.
82 */
83 virtual void _setInstanceData(GameObjectInstanceDataPtr& other);
84
85 /** Returns instance data that identifies this GameObject and is used for referencing by game object handles. */
86 virtual GameObjectInstanceDataPtr _getInstanceData() const { return mInstanceData; }
87
88 /** @} */
89
90 protected:
91 friend class GameObjectHandleBase;
92 friend class GameObjectManager;
93 friend class PrefabDiff;
94 friend class PrefabUtility;
95
96 /** Initializes the GameObject after construction. */
97 void initialize(const SPtr<GameObject>& object, UINT64 instanceId);
98
99 /**
100 * Destroys this object.
101 *
102 * @param[in] handle Game object handle to this object.
103 * @param[in] immediate If true, the object will be deallocated and become unusable right away. Otherwise the
104 * deallocation will be delayed to the end of frame (preferred method).
105 */
106 virtual void destroyInternal(GameObjectHandleBase& handle, bool immediate = false) = 0;
107
108 protected:
109 String mName;
110 UUID mUUID;
111 UINT32 mLinkId = (UINT32)-1;
112
113 Any mRTTIData; // RTTI only
114 private:
115 friend class Prefab;
116 GameObjectInstanceDataPtr mInstanceData;
117 bool mIsDestroyed = false;
118
119 /************************************************************************/
120 /* RTTI */
121 /************************************************************************/
122 friend class ComponentRTTI;
123 friend class SceneObjectRTTI;
124
125 public:
126 friend class GameObjectRTTI;
127 static RTTITypeBase* getRTTIStatic();
128 RTTITypeBase* getRTTI() const override;
129 };
130
131 /** @} */
132}