gwnavruntime/pathfollower/localcostawaretraverselogic.h Source File

localcostawaretraverselogic.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 #ifndef Navigation_LocalCostAwareTraverseLogic_H
8 #define Navigation_LocalCostAwareTraverseLogic_H
9 
10 
14 
15 
16 namespace Kaim
17 {
18 
19 
20 class LocalCostAwareTraverseLogicData
21 {
22 public:
23  LocalCostAwareTraverseLogicData() { Clear(); }
24  void Clear() { m_userTraverseLogicData = KY_NULL; m_localMaxCostMultiplierOnPath = 1.0f; }
25 public:
26  void* m_userTraverseLogicData;
27  KyFloat32 m_localMaxCostMultiplierOnPath; // Cost of most expensive NavTag on path around a given PositionOnPath.
28 };
29 
30 
34 template <class UserTraverseLogic>
35 class LocalCostAwareTraverseLogic
36 {
37  KY_TRAVERSE_LOGIC(LocalCostAwareTraverseLogic, typename UserTraverseLogic::CostMultiplierUsage, typename UserTraverseLogic::CanEnterNavTagMode)
38 public:
39  //--------------------- Wrapping functions ---------------------
41 
43  static bool CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag);
44 
46  static bool CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
47 
49  static bool CanTraverseNavTriangle(void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
50 };
51 
52 
53 template <class UserTraverseLogic>
54 KY_INLINE bool LocalCostAwareTraverseLogic<UserTraverseLogic>::CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag)
55 {
56  // Call directly the "original" UserTraverseLogic::CanTraverseNavTag
57  // because UserTraverseLogic::CostMultiplierUsage is LogicWithoutCostMultipler, so there is no cost per NavTag
58  void* userTraverseLogicData = ((LocalCostAwareTraverseLogicData*)traverseLogicUserData)->m_userTraverseLogicData;
59  return UserTraverseLogic::CanTraverseNavTag(userTraverseLogicData, navTag);
60 }
61 
62 template <class UserTraverseLogic>
63 KY_INLINE bool LocalCostAwareTraverseLogic<UserTraverseLogic>::CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag, KyFloat32* output_costMultiplier)
64 {
65  LocalCostAwareTraverseLogicData* localCostAwareTraverseLogicData = (LocalCostAwareTraverseLogicData*)traverseLogicUserData;
66  KyFloat32 localCostOnPath = localCostAwareTraverseLogicData->m_localMaxCostMultiplierOnPath;
67  void* userTraverseLogicData = localCostAwareTraverseLogicData->m_userTraverseLogicData;
68 
69  // Call the "original" UserTraverseLogic::CanTraverseNavTag
70  KyFloat32 costMultiplier = 1.0f;
71  bool canTraverse = UserTraverseLogic::CanTraverseNavTag(userTraverseLogicData, navTag, &costMultiplier);
72  if (output_costMultiplier)
73  *output_costMultiplier = costMultiplier;
74 
75  if (canTraverse == false)
76  return false; // if the user original CanTraverse returns false then cannot traverse
77 
78  if (costMultiplier > localCostOnPath)
79  return false; // if the traversed cost is higher than the localCostOnPath then cannot traverse
80 
81  return true;
82 }
83 
84 template <class UserTraverseLogic>
85 KY_INLINE bool LocalCostAwareTraverseLogic<UserTraverseLogic>::CanTraverseNavTriangle(void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier)
86 {
87  LocalCostAwareTraverseLogicData* customTraverseLogicData = (LocalCostAwareTraverseLogicData*)traverseLogicUserData;
88  return UserTraverseLogic::CanTraverseNavTriangle(customTraverseLogicData->m_userTraverseLogicData, triangle, costmultiplier);
89 }
90 
91 }
92 
93 #endif
#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
static bool CanTraverseNavTag(void *traverseLogicUserData, const NavTag &navTag)
Only one of this function is going to be called and exist depending on UserTraverseLogic::CostMultipl...
Definition: localcostawaretraverselogic.h:57
Definition: gamekitcrowddispersion.h:20
static bool CanTraverseNavTriangle(void *traverseLogicUserData, const NavTriangleRawPtr &triangle, KyFloat32 *costmultiplier)
Function called when UserTraverseLogic::CostMultiplierUsage is LogicWithCostMultiplerPerTriangle.
Definition: localcostawaretraverselogic.h:88
Each instance of this class uniquely identifies a single NavTriangle in a NavFloor.
Definition: navtrianglerawptr.h:30
LocalCostAwareTraverseLogic is a wrapper around the traverse logic set by the user.
Definition: localcostawaretraverselogic.h:37
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43