gwnavruntime/queries/utils/highercostlimitlogic.h Source File

highercostlimitlogic.h
Go to the documentation of this file.
1 /*
2 * Copyright 2015 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 // Primary contact: JUBA - secondary contact: NOBODY
9 #ifndef Navigation_HigherCostLimitLogic_H
10 #define Navigation_HigherCostLimitLogic_H
11 
13 
14 namespace Kaim
15 {
16 
17 class UserDataForHigherCostLimitLogic
18 {
19  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
20 public:
21  UserDataForHigherCostLimitLogic(KyFloat32 costLimit, void* traverseLogicUserData) :
22  m_costLimit(costLimit), m_traverseLogicUserData(traverseLogicUserData) {}
23 public:
24  KyFloat32 m_costLimit;
25  void* m_traverseLogicUserData;
26 };
27 
28 template <class UserTraverseLogic>
29 class HigherCostLimitLogic
30 {
31  KY_TRAVERSE_LOGIC(HigherCostLimitLogic, typename UserTraverseLogic::CostMultiplierUsage, typename UserTraverseLogic::CanEnterNavTagMode)
32 public:
33  static KyFloat32 GetHeuristicFromDistanceToDest(void* traverseLogicUserData, KyFloat32 distance3DToDestination);
34  static bool CanEnterNavTag(void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos);
35  static bool CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag);
36  static bool CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
37  static bool CanTraverseNavTriangle(void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
38  static bool CanTraverseNavGraphEdge(void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier);
39 
40 private :
41  static bool CanEnterNavTag(const LogicDoUseCanEnterNavTag&, void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos);
42 
43  static bool CanTraverseNavTag(const LogicWithoutCostMultipler&, void* traverseLogicUserData, const NavTag& navTag);
44 
45  static bool CanTraverseNavTag(const LogicWithCostMultiplerPerNavTag&, void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
46 
47  static bool CanTraverseNavTriangle(const LogicWithCostMultiplerPerTriangle&, void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
48  static bool CanTraverseNavGraphEdge(const LogicWithCostMultiplerPerTriangle&, void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier);
49 private:
50  // these functions do not need implementation, there are declared only in order to enable compilation whatever the Logic.
51  static bool CanEnterNavTag(const LogicDoNotUseCanEnterNavTag&, void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos);
52  static bool CanTraverseNavTag(const LogicWithCostMultiplerPerNavTag&, void* traverseLogicUserData, const NavTag& navTag);
53  static bool CanTraverseNavTag(const LogicWithCostMultiplerPerTriangle&, void* traverseLogicUserData, const NavTag& navTag);
54  static bool CanTraverseNavTag(const LogicWithoutCostMultipler&, void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
55  static bool CanTraverseNavTag(const LogicWithCostMultiplerPerTriangle&, void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
56  static bool CanTraverseNavTriangle(const LogicWithoutCostMultipler&, void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
57  static bool CanTraverseNavTriangle(const LogicWithCostMultiplerPerNavTag&, void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
58  static bool CanTraverseNavGraphEdge(const LogicWithoutCostMultipler&, void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier);
59  static bool CanTraverseNavGraphEdge(const LogicWithCostMultiplerPerNavTag&, void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier);
60 };
61 
62 template <class UserTraverseLogic>
63 KY_INLINE KyFloat32 HigherCostLimitLogic<UserTraverseLogic>::GetHeuristicFromDistanceToDest(void* traverseLogicUserData, KyFloat32 distance3DToDestination)
64 {
65  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
66  return UserTraverseLogic::GetHeuristicFromDistanceToDest(userDataForHigherCostLimitLogic->m_traverseLogicUserData, distance3DToDestination);
67 }
68 
69 template <class UserTraverseLogic>
70 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanEnterNavTag(void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos)
71 {
72  return CanEnterNavTag(CanEnterNavTagMode(), traverseLogicUserData, exitNavTag, enterNavTag, pos);
73 }
74 template <class UserTraverseLogic>
75 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag)
76 {
77  return CanTraverseNavTag(CostMultiplierUsage(), traverseLogicUserData, navTag);
78 }
79 template <class UserTraverseLogic>
80 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier)
81 {
82  return CanTraverseNavTag(CostMultiplierUsage(), traverseLogicUserData, navTag, costMultiplier);
83 }
84 template <class UserTraverseLogic>
85 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTriangle(void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier)
86 {
87  return CanTraverseNavTriangle(CostMultiplierUsage(), traverseLogicUserData, triangle, costmultiplier);
88 }
89 template <class UserTraverseLogic>
90 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavGraphEdge(void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier)
91 {
92  return CanTraverseNavGraphEdge(CostMultiplierUsage(), traverseLogicUserData, graphEdge, costMultiplier);
93 }
94 
95 template <class UserTraverseLogic>
96 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanEnterNavTag(const LogicDoUseCanEnterNavTag&, void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos)
97 {
98  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
99  return UserTraverseLogic::CanEnterNavTag(userDataForHigherCostLimitLogic->m_traverseLogicUserData, exitNavTag, enterNavTag, pos);
100 }
101 
102 template <class UserTraverseLogic>
103 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavGraphEdge(const LogicWithCostMultiplerPerTriangle&, void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier)
104 {
105  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
106  return UserTraverseLogic::CanTraverseNavGraphEdge(userDataForHigherCostLimitLogic->m_traverseLogicUserData, graphEdge, costMultiplier);
107 }
108 
109 template <class UserTraverseLogic>
110 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTag(const LogicWithoutCostMultipler&, void* traverseLogicUserData, const NavTag& navTag)
111 {
112  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
113  return UserTraverseLogic::CanTraverseNavTag(userDataForHigherCostLimitLogic->m_traverseLogicUserData, navTag);
114 }
115 template <class UserTraverseLogic>
116 inline bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTag(const LogicWithCostMultiplerPerNavTag&, void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier)
117 {
118  KyFloat32 localCostMultiplier = 1.f;
119  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
120 
121  bool canTraverse = UserTraverseLogic::CanTraverseNavTag(userDataForHigherCostLimitLogic->m_traverseLogicUserData, navTag, &localCostMultiplier);
122 
123  if (costMultiplier != KY_NULL)
124  *costMultiplier = localCostMultiplier;
125 
126  if (canTraverse == false)
127  return false;
128 
129  return localCostMultiplier <= userDataForHigherCostLimitLogic->m_costLimit;
130 }
131 
132 template <class UserTraverseLogic>
133 inline bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTriangle(const LogicWithCostMultiplerPerTriangle&, void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costMultiplier)
134 {
135  KyFloat32 localCostMultiplier = 1.f;
136  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
137  bool canTraverse = UserTraverseLogic::CanTraverseNavTriangle(userDataForHigherCostLimitLogic->m_traverseLogicUserData, triangle, &localCostMultiplier);
138 
139  if (costMultiplier != KY_NULL)
140  *costMultiplier = localCostMultiplier;
141 
142  if (canTraverse == false)
143  return false;
144 
145  return localCostMultiplier <= userDataForHigherCostLimitLogic->m_costLimit;
146 }
147 
148 
149 }
150 
151 
152 #endif //Navigation_HigherCostLimitLogic_H
153 
#define KY_TRAVERSE_LOGIC(ClassName, costMode, canEnterMode)
Define to forbid constructor, copy constructor and copy assignment.
Definition: types.h:489
#define KY_NULL
Null value.
Definition: types.h:247
Definition: gamekitcrowddispersion.h:20
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:137
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43