gwnavgamekit/gamekitnavtag.h Source File

gamekitnavtag.h
Go to the documentation of this file.
1 /*
2 * Copyright 2016 Autodesk, Inc. All rights reserved.
3 * Use of this software is subject to the terms of the Autodesk license agreement and any attachments or Appendices thereto provided at the time of installation or download,
4 * or which otherwise accompanies this software in either electronic or hard copy form, or which is signed by you and accepted by Autodesk.
5 */
6 
7 
8 
9 #pragma once
10 
14 
15 namespace Kaim
16 {
17 
18 
22 {
23 public:
25  {
26  m_layerID = KyUInt32MAXVAL;
27  m_smartObjectID = KyUInt32MAXVAL;
28  m_gameObjectUniqueID = KyUInt32MAXVAL;
29  m_userDataID = KyUInt32MAXVAL;
30  m_isExclusive = false;
31  m_color = GetDefaultColor();
32  }
33 
34  static KY_INLINE Color GetDefaultColor() { return Color(0, 0, 139); }
35  static KY_INLINE Color GetExclusiveColor() { return Kaim::NavTag::GetExclusiveColor(); }
36 
37  KY_INLINE bool IsExclusive() const { return m_isExclusive; }
38  KY_INLINE bool HasSmartObject() const { return GetSmartObjectID() != KyUInt32MAXVAL; }
39  KY_INLINE bool HasLayer() const { return GetLayerID() != KyUInt32MAXVAL; }
40 
41  KY_INLINE KyUInt32 GetLayerID() const { return m_layerID; }
42  KY_INLINE KyUInt32 GetSmartObjectID() const { return m_smartObjectID; }
43  KY_INLINE KyUInt32 GetGameObjectUniqueID() const { return m_gameObjectUniqueID; }
44  KY_INLINE KyUInt32 GetUserDataID() const { return m_userDataID; }
45  KY_INLINE Kaim::Color GetColor() const { return m_color; }
46 
47  KY_INLINE void SetAsExclusive();
48  KY_INLINE void SetAsWalkable();
49  KY_INLINE void SetLayerID(KyUInt32 layerID) { m_layerID = layerID; }
50  KY_INLINE void SetSmartObjectID(KyUInt32 smartObjectID) { m_smartObjectID = smartObjectID; }
51  KY_INLINE void SetGameObjectUniqueID(KyUInt32 gameObjectUniqueID) { m_gameObjectUniqueID = gameObjectUniqueID; }
52  KY_INLINE void SetUserDataID(KyUInt32 userDataID) { m_userDataID = userDataID; }
53  KY_INLINE void SetColor(const Kaim::Color& color) { m_color = color; }
54  KY_INLINE void SetColor(KyUInt8 r, KyUInt8 g, KyUInt8 b) { m_color.Set(r,g,b); }
55 
56 
57  // ------ Interpret a NavTag as a GameKitNavTag -----
58  static KY_INLINE bool IsExclusive(const Kaim::NavTag& navTag) { return navTag.IsExclusive(); }
59  static KY_INLINE bool HasSmartObject(const Kaim::NavTag& navTag) { return GetSmartObjectID(navTag) != KyUInt32MAXVAL; }
60  static KY_INLINE bool HasLayer(const Kaim::NavTag& navTag) { return GetLayerID(navTag) != KyUInt32MAXVAL; }
61  static KY_INLINE KyUInt32 GetLayerID(const Kaim::NavTag& navTag) { return navTag.m_blindData.GetCount() >= 1 ? navTag.m_blindData.GetValues()[0] : KyUInt32MAXVAL; }
62  static KY_INLINE KyUInt32 GetSmartObjectID(const Kaim::NavTag& navTag) { return navTag.m_blindData.GetCount() >= 2 ? navTag.m_blindData.GetValues()[1] : KyUInt32MAXVAL; }
63  static KY_INLINE KyUInt32 GetGameObjectUniqueID(const Kaim::NavTag& navTag) { return navTag.m_blindData.GetCount() >= 3 ? navTag.m_blindData.GetValues()[2] : KyUInt32MAXVAL; }
64  static KY_INLINE KyUInt32 GetUserDataID(const Kaim::NavTag& navTag) { return navTag.m_blindData.GetCount() >= 4 ? navTag.m_blindData.GetValues()[3] : KyUInt32MAXVAL; }
65  static KY_INLINE Kaim::Color GetColor(const Kaim::NavTag& navTag) { return navTag.GetColor(); }
66  KY_INLINE bool CompareAsGameKitNavTag(const Kaim::NavTag& navTag) const
67  {
68  return IsExclusive() == IsExclusive(navTag) &&
69  GetLayerID() == GetLayerID(navTag) &&
70  GetSmartObjectID() == GetSmartObjectID(navTag) &&
71  GetGameObjectUniqueID() == GetGameObjectUniqueID(navTag) &&
72  GetUserDataID() == GetUserDataID(navTag);
73  }
74 
75  // ------ Interpret a DynamicNavTag as a GameKitNavTag -----
76  static KY_INLINE bool IsExclusive(const Kaim::DynamicNavTag& navTag) { return navTag.IsExclusive(); }
77  static KY_INLINE bool HasSmartObject(const Kaim::DynamicNavTag& navTag) { return GetSmartObjectID(navTag) != KyUInt32MAXVAL; }
78  static KY_INLINE bool HasLayer(const Kaim::DynamicNavTag& navTag) { return GetLayerID(navTag) != KyUInt32MAXVAL; }
79  static KY_INLINE KyUInt32 GetLayerID(const Kaim::DynamicNavTag& navTag) { return navTag.m_blindDataArray.GetCount() >= 1 ? navTag.m_blindDataArray[0] : KyUInt32MAXVAL; }
80  static KY_INLINE KyUInt32 GetSmartObjectID(const Kaim::DynamicNavTag& navTag) { return navTag.m_blindDataArray.GetCount() >= 2 ? navTag.m_blindDataArray[1] : KyUInt32MAXVAL; }
81  static KY_INLINE KyUInt32 GetGameObjectUniqueID(const Kaim::DynamicNavTag& navTag) { return navTag.m_blindDataArray.GetCount() >= 3 ? navTag.m_blindDataArray[2] : KyUInt32MAXVAL; }
82  static KY_INLINE KyUInt32 GetUserDataID(const Kaim::DynamicNavTag& navTag) { return navTag.m_blindDataArray.GetCount() >= 4 ? navTag.m_blindDataArray[3] : KyUInt32MAXVAL; }
83  static KY_INLINE Kaim::Color GetColor(const Kaim::DynamicNavTag& navTag) { return navTag.GetColor(); }
84  KY_INLINE bool CompareAsGameKitNavTag(const Kaim::DynamicNavTag& navTag) const
85  {
86  return IsExclusive() == IsExclusive(navTag) &&
87  GetLayerID() == GetLayerID(navTag) &&
88  GetSmartObjectID() == GetSmartObjectID(navTag) &&
89  GetGameObjectUniqueID() == GetGameObjectUniqueID(navTag) &&
90  GetUserDataID() == GetUserDataID(navTag);
91  }
92 
93  // ------ Directly write a DynamicNavTag as a GameKitNavTag -----
94  static KY_INLINE void SetLayerID(Kaim::DynamicNavTag& navTag, KyUInt32 layerID) { InitAsGameKitNavTag(navTag); navTag.m_blindDataArray[0] = layerID; }
95  static KY_INLINE void SetSmartObjectID(Kaim::DynamicNavTag& navTag, KyUInt32 smartObjectID) { InitAsGameKitNavTag(navTag); navTag.m_blindDataArray[1] = smartObjectID; }
96  static KY_INLINE void SetGameObjectUniqueID(Kaim::DynamicNavTag& navTag, KyUInt32 gameObjectUniqueID) { InitAsGameKitNavTag(navTag); navTag.m_blindDataArray[2] = gameObjectUniqueID; }
97  static KY_INLINE void SetUserDataID(Kaim::DynamicNavTag& navTag, KyUInt32 userDataID) { InitAsGameKitNavTag(navTag); navTag.m_blindDataArray[3] = userDataID; }
98 
99 private:
100  static KY_INLINE void InitAsGameKitNavTag(Kaim::DynamicNavTag& navTag)
101  {
102  const KyUInt32 oldCount = navTag.m_blindDataArray.GetCount();
103  if (oldCount < 4)
104  {
105  navTag.m_blindDataArray.Resize(4);
106  for (KyUInt32 i = oldCount; i < 4; ++i)
107  navTag.m_blindDataArray[i] = KyUInt32MAXVAL;
108  }
109  }
110 
111 public: // internal
112  // ----- Conversion functions -----
114 
115  void InitFrom(const NavTag& navTag);
116  void GetAsDynamicNavTag(DynamicNavTag& navTag) const;
117 
118 private:
119  KyUInt32 m_layerID;
120  KyUInt32 m_smartObjectID;
121  KyUInt32 m_gameObjectUniqueID;
122  KyUInt32 m_userDataID;
123  Color m_color;
124  bool m_isExclusive;
125 };
126 
127 KY_INLINE void GameKitNavTag::SetAsExclusive()
128 {
129  m_isExclusive = true;
130  m_color = GetExclusiveColor();
131 }
132 
133 KY_INLINE void GameKitNavTag::SetAsWalkable()
134 {
135  m_isExclusive = false;
136  if (GetColor() == GetExclusiveColor())
137  m_color = GetDefaultColor();
138 }
139 
140 
141 }
142 
void InitFrom(const NavTag &navTag)
Always prefer static functions to interpret NavTag or DynamicNavTag as GameKitNavTag instead of conve...
Definition: gamekitnavtag.cpp:18
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
Define an interpretation of NavTag specific to GameKit.
Definition: gamekitnavtag.h:21
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
RGBA color.
Definition: color.h:16
std::uint8_t KyUInt8
uint8_t
Definition: types.h:27
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68