ezEngine  Milestone 7
GameObject.h
1 #pragma once
2 
3 #include <Foundation/Containers/HybridArray.h>
4 #include <Foundation/Math/Quat.h>
5 #include <Foundation/Math/Transform.h>
6 #include <Foundation/Math/BoundingBoxSphere.h>
7 #include <Foundation/Time/Time.h>
8 #include <Foundation/Types/TagSet.h>
9 
10 #include <Core/World/ComponentManager.h>
11 #include <Core/World/GameObjectDesc.h>
12 #include <Core/World/Messages.h>
13 
25 
26 class EZ_CORE_DLL ezGameObject
27 {
28 private:
29  enum
30  {
31 #if EZ_ENABLED(EZ_PLATFORM_32BIT)
32  NUM_INPLACE_COMPONENTS = 12
33 #else
34  NUM_INPLACE_COMPONENTS = 6
35 #endif
36  };
37 
38  friend class ezWorld;
39  friend class ezInternal::WorldData;
40  friend class ezMemoryUtils;
41  friend class ezGameObjectDummyAllocator; // TODO: This is a temporary hack
42 
43  ezGameObject();
44  ezGameObject(const ezGameObject& other);
45  ~ezGameObject();
46 
47  void operator=(const ezGameObject& other);
48 
49 public:
51  class EZ_CORE_DLL ConstChildIterator
52  {
53  public:
54  const ezGameObject& operator*() const;
55  const ezGameObject* operator->() const;
56 
57  operator const ezGameObject*() const;
58 
60  void Next();
61 
63  bool IsValid() const;
64 
66  void operator++();
67 
68  private:
69  friend class ezGameObject;
70 
72 
73  ezGameObject* m_pObject;
74  };
75 
76  class EZ_CORE_DLL ChildIterator : public ConstChildIterator
77  {
78  public:
79  ezGameObject& operator*();
80  ezGameObject* operator->();
81 
82  operator ezGameObject*();
83 
84  private:
85  friend class ezGameObject;
86 
87  ChildIterator(ezGameObject* pObject);
88  };
89 
92 
93  //ezGameObjectHandle Clone() const;
94 
95  //void MakeDynamic();
96  //void MakeStatic();
98  bool IsDynamic() const;
99 
101  bool IsStatic() const;
102 
103 
105  void Activate();
106 
108  void Deactivate();
109 
111  bool IsActive() const;
112 
113 
114  void SetName(const char* szName);
115  const char* GetName() const;
116 
117 
119  void SetParent(const ezGameObjectHandle& parent);
120 
123 
125  const ezGameObject* GetParent() const;
126 
128  void AddChild(const ezGameObjectHandle& child);
129 
132 
134  void DetachChild(const ezGameObjectHandle& child);
135 
138 
140  ezUInt32 GetChildCount() const;
141 
144 
147 
148 
149  ezWorld* GetWorld();
150  const ezWorld* GetWorld() const;
151 
152 
153  void SetLocalPosition(const ezVec3& position);
154  const ezVec3& GetLocalPosition() const;
155 
156  void SetLocalRotation(const ezQuat& rotation);
157  const ezQuat& GetLocalRotation() const;
158 
159  void SetLocalScaling(const ezVec3& scaling);
160  const ezVec3& GetLocalScaling() const;
161 
162  void SetGlobalPosition(const ezVec3& position);
163  const ezVec3& GetGlobalPosition() const;
164 
165  void SetGlobalRotation(const ezQuat rotation);
166  const ezQuat GetGlobalRotation() const;
167 
168  void SetGlobalScaling(const ezVec3 scaling);
169  const ezVec3 GetGlobalScaling() const;
170 
171  void SetGlobalTransform(const ezTransform& transform);
172  const ezTransform& GetGlobalTransform() const;
173 
174  void SetVelocity(const ezVec3& vVelocity);
175  const ezVec3& GetVelocity() const;
176 
178  void UpdateGlobalTransform();
179 
180 
181  const ezBoundingBoxSphere& GetLocalBounds() const;
182  const ezBoundingBoxSphere& GetGlobalBounds() const;
183 
185  void UpdateLocalBounds();
186 
189 
190 
192  ezResult AddComponent(const ezComponentHandle& component);
193 
195  ezResult AddComponent(ezComponent* pComponent);
196 
198  ezResult RemoveComponent(const ezComponentHandle& component);
199 
201  ezResult RemoveComponent(ezComponent* pComponent);
202 
204  template <typename T>
205  bool TryGetComponentOfBaseType(T*& out_pComponent) const;
206 
208  template <typename T>
209  void TryGetComponentsOfBaseType(ezHybridArray<T*, 8>& out_components) const;
210 
213 
216 
217 
219  void SendMessage(ezMessage& msg, ezObjectMsgRouting::Enum routing = ezObjectMsgRouting::Default);
220 
222  void SendMessage(ezMessage& msg, ezObjectMsgRouting::Enum routing = ezObjectMsgRouting::Default) const;
223 
225  void PostMessage(ezMessage& msg, ezObjectMsgQueueType::Enum queueType,
226  ezObjectMsgRouting::Enum routing = ezObjectMsgRouting::Default);
227 
229  void PostMessage(ezMessage& msg, ezObjectMsgQueueType::Enum queueType, ezTime delay,
230  ezObjectMsgRouting::Enum routing = ezObjectMsgRouting::Default);
231 
232 
234  ezTagSet& GetTags();
235  const ezTagSet& GetTags() const;
236 
237 private:
238  friend class ezGameObjectTest;
239 
241 
242  void Reflection_AddChild(ezGameObject* pChild) { AddChild(pChild->GetHandle()); }
243  void Reflection_DetachChild(ezGameObject* pChild) { DetachChild(pChild->GetHandle()); }
244  ezHybridArray<ezGameObject*, 8> Reflection_GetChildren() const;
245  void Reflection_AddComponent(ezComponent* pComponent) { AddComponent(pComponent); }
246  void Reflection_RemoveComponent(ezComponent* pComponent) { RemoveComponent(pComponent); }
247  const ezHybridArray<ezComponent*, NUM_INPLACE_COMPONENTS>& Reflection_GetComponents() const { return m_Components; }
248 
249  void OnDeleteObject(ezDeleteObjectMessage& msg);
250 
251  void FixComponentPointer(ezComponent* pOldPtr, ezComponent* pNewPtr);
252 
253  struct EZ_ALIGN_16(TransformationData)
254  {
256 
257  ezGameObject* m_pObject;
258  TransformationData* m_pParentData;
259 
260 #if EZ_ENABLED(EZ_PLATFORM_32BIT)
261  ezUInt64 m_uiPadding;
262 #endif
263 
264  ezVec4 m_localPosition;
265  ezQuat m_localRotation;
266  ezVec4 m_localScaling;
267 
268  ezTransform m_globalTransform;
269  ezVec4 m_velocity;
270 
271  ezBoundingBoxSphere m_localBounds;
272  ezBoundingBoxSphere m_globalBounds;
273 
274  void ConditionalUpdateGlobalTransform();
275  void UpdateGlobalTransform();
276  void UpdateGlobalTransformWithParent();
277 
278  void ConditionalUpdateGlobalBounds();
279  void UpdateGlobalBounds();
280  };
281 
282  ezGameObjectId m_InternalId;
284  ezHashedString m_sName;
285 
286 #if EZ_ENABLED(EZ_PLATFORM_32BIT)
287  ezUInt32 m_uiNamePadding;
288 #endif
289 
290  struct
291  {
292  ezUInt64 m_ParentIndex : 20;
293  ezUInt64 m_FirstChildIndex : 20;
294  ezUInt64 m_LastChildIndex : 20;
295  };
296 
297  struct
298  {
299  ezUInt64 m_NextSiblingIndex : 20;
300  ezUInt64 m_PrevSiblingIndex : 20;
301  ezUInt64 m_ChildCount : 20;
302  };
303 
304  ezUInt32 m_uiReserved;
305 
306  struct
307  {
308  ezUInt32 m_uiHierarchyLevel : 12;
309  ezUInt32 m_uiTransformationDataIndex : 20;
310  };
311  TransformationData* m_pTransformationData;
312 
313  ezWorld* m_pWorld;
314 
315 #if EZ_ENABLED(EZ_PLATFORM_32BIT)
316  ezUInt64 m_uiPadding;
317 #endif
318 
321 
322 #if EZ_ENABLED(EZ_PLATFORM_32BIT)
323  ezUInt64 m_uiPadding2;
324 #endif
325 
326  ezTagSet m_Tags;
327 };
328 
330 
331 #include <Core/World/Implementation/GameObject_inl.h>
332