gwnavruntime/queries/utils/highercostlimitlogic.h Source File

highercostlimitlogic.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 #pragma once
8 
10 
11 namespace Kaim
12 {
13 
14 class UserDataForHigherCostLimitLogic
15 {
16  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
17 public:
18  UserDataForHigherCostLimitLogic(KyFloat32 costLimit, void* traverseLogicUserData) :
19  m_costLimit(costLimit), m_traverseLogicUserData(traverseLogicUserData) {}
20 public:
21  KyFloat32 m_costLimit;
22  void* m_traverseLogicUserData;
23 };
24 
25 template <class UserTraverseLogic>
26 class HigherCostLimitLogic
27 {
28  KY_TRAVERSE_LOGIC(HigherCostLimitLogic, typename UserTraverseLogic::CostMultiplierUsage, typename UserTraverseLogic::CanEnterNavTagMode)
29 public:
30  static KyFloat32 GetHeuristicFromDistanceToDest(void* traverseLogicUserData, KyFloat32 distance3DToDestination);
31  static bool CanEnterNavTag(void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos);
32  static bool CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag);
33  static bool CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
34  static bool CanTraverseNavTriangle(void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
35  static bool CanTraverseNavGraphEdge(void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier);
36 
37 private:
38  static bool CanEnterNavTag(const LogicDoUseCanEnterNavTag&, void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos);
39 
40  static bool CanTraverseNavTag(const LogicWithNoCustomCost&, void* traverseLogicUserData, const NavTag& navTag);
41 
42  static bool CanTraverseNavTag(const LogicWithCostPerNavTag&, void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
43 
44  static bool CanTraverseNavTriangle(const LogicWithCostPerTriangle&, void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
45  static bool CanTraverseNavGraphEdge(const LogicWithCostPerTriangle&, void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier);
46 private:
47  // these functions do not need implementation, there are declared only in order to enable compilation whatever the Logic.
48  static bool CanEnterNavTag(const LogicDoNotUseCanEnterNavTag&, void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos);
49  static bool CanTraverseNavTag(const LogicWithCostPerNavTag&, void* traverseLogicUserData, const NavTag& navTag);
50  static bool CanTraverseNavTag(const LogicWithCostPerTriangle&, void* traverseLogicUserData, const NavTag& navTag);
51  static bool CanTraverseNavTag(const LogicWithNoCustomCost&, void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
52  static bool CanTraverseNavTag(const LogicWithCostPerTriangle&, void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
53  static bool CanTraverseNavTriangle(const LogicWithNoCustomCost&, void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
54  static bool CanTraverseNavTriangle(const LogicWithCostPerNavTag&, void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
55  static bool CanTraverseNavGraphEdge(const LogicWithNoCustomCost&, void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier);
56  static bool CanTraverseNavGraphEdge(const LogicWithCostPerNavTag&, void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier);
57 };
58 
59 template <class UserTraverseLogic>
60 KY_INLINE KyFloat32 HigherCostLimitLogic<UserTraverseLogic>::GetHeuristicFromDistanceToDest(void* traverseLogicUserData, KyFloat32 distance3DToDestination)
61 {
62  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
63  return UserTraverseLogic::GetHeuristicFromDistanceToDest(userDataForHigherCostLimitLogic->m_traverseLogicUserData, distance3DToDestination);
64 }
65 
66 template <class UserTraverseLogic>
67 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanEnterNavTag(void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos)
68 {
69  return CanEnterNavTag(CanEnterNavTagMode(), traverseLogicUserData, exitNavTag, enterNavTag, pos);
70 }
71 template <class UserTraverseLogic>
72 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag)
73 {
74  return CanTraverseNavTag(CostMultiplierUsage(), traverseLogicUserData, navTag);
75 }
76 template <class UserTraverseLogic>
77 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier)
78 {
79  return CanTraverseNavTag(CostMultiplierUsage(), traverseLogicUserData, navTag, costMultiplier);
80 }
81 template <class UserTraverseLogic>
82 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTriangle(void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier)
83 {
84  return CanTraverseNavTriangle(CostMultiplierUsage(), traverseLogicUserData, triangle, costmultiplier);
85 }
86 template <class UserTraverseLogic>
87 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavGraphEdge(void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier)
88 {
89  return CanTraverseNavGraphEdge(CostMultiplierUsage(), traverseLogicUserData, graphEdge, costMultiplier);
90 }
91 
92 template <class UserTraverseLogic>
93 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanEnterNavTag(const LogicDoUseCanEnterNavTag&, void* traverseLogicUserData, const NavTag& exitNavTag, const NavTag& enterNavTag, const Vec3f& pos)
94 {
95  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
96  return UserTraverseLogic::CanEnterNavTag(userDataForHigherCostLimitLogic->m_traverseLogicUserData, exitNavTag, enterNavTag, pos);
97 }
98 
99 template <class UserTraverseLogic>
100 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavGraphEdge(const LogicWithCostPerTriangle&, void* traverseLogicUserData, const NavGraphEdgeRawPtr& graphEdge, KyFloat32* costMultiplier)
101 {
102  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
103  return UserTraverseLogic::CanTraverseNavGraphEdge(userDataForHigherCostLimitLogic->m_traverseLogicUserData, graphEdge, costMultiplier);
104 }
105 
106 template <class UserTraverseLogic>
107 KY_INLINE bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTag(const LogicWithNoCustomCost&, void* traverseLogicUserData, const NavTag& navTag)
108 {
109  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
110  return UserTraverseLogic::CanTraverseNavTag(userDataForHigherCostLimitLogic->m_traverseLogicUserData, navTag);
111 }
112 template <class UserTraverseLogic>
113 inline bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTag(const LogicWithCostPerNavTag&, void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier)
114 {
115  KyFloat32 localCostMultiplier = 1.f;
116  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
117 
118  bool canTraverse = UserTraverseLogic::CanTraverseNavTag(userDataForHigherCostLimitLogic->m_traverseLogicUserData, navTag, &localCostMultiplier);
119 
120  if (costMultiplier != nullptr)
121  *costMultiplier = localCostMultiplier;
122 
123  if (canTraverse == false)
124  return false;
125 
126  return localCostMultiplier <= userDataForHigherCostLimitLogic->m_costLimit;
127 }
128 
129 template <class UserTraverseLogic>
130 inline bool HigherCostLimitLogic<UserTraverseLogic>::CanTraverseNavTriangle(const LogicWithCostPerTriangle&, void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costMultiplier)
131 {
132  KyFloat32 localCostMultiplier = 1.f;
133  UserDataForHigherCostLimitLogic* userDataForHigherCostLimitLogic = (UserDataForHigherCostLimitLogic*) traverseLogicUserData;
134  bool canTraverse = UserTraverseLogic::CanTraverseNavTriangle(userDataForHigherCostLimitLogic->m_traverseLogicUserData, triangle, &localCostMultiplier);
135 
136  if (costMultiplier != nullptr)
137  *costMultiplier = localCostMultiplier;
138 
139  if (canTraverse == false)
140  return false;
141 
142  return localCostMultiplier <= userDataForHigherCostLimitLogic->m_costLimit;
143 }
144 
145 
146 }
147 
148 
149 
#define KY_TRAVERSE_LOGIC(className_, costMode_, canEnterMode_)
A TraverseLogic is a full static class that implements some functions and typedef used to customize t...
Definition: traverselogic.h:34
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
float KyFloat32
float
Definition: types.h:32