gwnavruntime/pathfollower/localcostawaretraverselogic.h Source File

localcostawaretraverselogic.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 
9 
13 
14 
15 namespace Kaim
16 {
17 
18 
19 class LocalCostAwareTraverseLogicData
20 {
21 public:
22  LocalCostAwareTraverseLogicData() { Clear(); }
23  void Clear() { m_userTraverseLogicData = nullptr; m_localMaxCostMultiplierOnPath = 1.0f; }
24 public:
25  void* m_userTraverseLogicData;
26  KyFloat32 m_localMaxCostMultiplierOnPath; // Cost of most expensive NavTag on path around a given PositionOnPath.
27 };
28 
29 
33 template <class UserTraverseLogic>
35 {
36  KY_TRAVERSE_LOGIC(LocalCostAwareTraverseLogic, typename UserTraverseLogic::CostMultiplierUsage, typename UserTraverseLogic::CanEnterNavTagMode)
37 public:
38  //--------------------- Wrapping functions ---------------------
40 
42  static bool CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag);
43 
45  static bool CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag, KyFloat32* costMultiplier);
46 
48  static bool CanTraverseNavTriangle(void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier);
49 };
50 
51 
52 template <class UserTraverseLogic>
53 KY_INLINE bool LocalCostAwareTraverseLogic<UserTraverseLogic>::CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag)
54 {
55  // Call directly the "original" UserTraverseLogic::CanTraverseNavTag
56  // because UserTraverseLogic::CostMultiplierUsage is LogicWithNoCustomCost, so there is no cost per NavTag
57  void* userTraverseLogicData = ((LocalCostAwareTraverseLogicData*)traverseLogicUserData)->m_userTraverseLogicData;
58  return UserTraverseLogic::CanTraverseNavTag(userTraverseLogicData, navTag);
59 }
60 
61 template <class UserTraverseLogic>
62 KY_INLINE bool LocalCostAwareTraverseLogic<UserTraverseLogic>::CanTraverseNavTag(void* traverseLogicUserData, const NavTag& navTag, KyFloat32* output_costMultiplier)
63 {
64  LocalCostAwareTraverseLogicData* localCostAwareTraverseLogicData = (LocalCostAwareTraverseLogicData*)traverseLogicUserData;
65  KyFloat32 localCostOnPath = localCostAwareTraverseLogicData->m_localMaxCostMultiplierOnPath;
66  void* userTraverseLogicData = localCostAwareTraverseLogicData->m_userTraverseLogicData;
67 
68  // Call the "original" UserTraverseLogic::CanTraverseNavTag
69  KyFloat32 costMultiplier = 1.0f;
70  bool canTraverse = UserTraverseLogic::CanTraverseNavTag(userTraverseLogicData, navTag, &costMultiplier);
71  if (output_costMultiplier)
72  *output_costMultiplier = costMultiplier;
73 
74  if (canTraverse == false)
75  return false; // if the user original CanTraverse returns false then cannot traverse
76 
77  if (costMultiplier > localCostOnPath)
78  return false; // if the traversed cost is higher than the localCostOnPath then cannot traverse
79 
80  return true;
81 }
82 
83 template <class UserTraverseLogic>
84 KY_INLINE bool LocalCostAwareTraverseLogic<UserTraverseLogic>::CanTraverseNavTriangle(void* traverseLogicUserData, const NavTriangleRawPtr& triangle, KyFloat32* costmultiplier)
85 {
86  LocalCostAwareTraverseLogicData* customTraverseLogicData = (LocalCostAwareTraverseLogicData*)traverseLogicUserData;
87  return UserTraverseLogic::CanTraverseNavTriangle(customTraverseLogicData->m_userTraverseLogicData, triangle, costmultiplier);
88 }
89 
90 }
91 
#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
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:53
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
static bool CanTraverseNavTriangle(void *traverseLogicUserData, const NavTriangleRawPtr &triangle, KyFloat32 *costmultiplier)
Function called when UserTraverseLogic::CostMultiplierUsage is LogicWithCostPerTriangle.
Definition: localcostawaretraverselogic.h:84
Identifies a single NavTriangle in a NavFloor.
Definition: navtrianglerawptr.h:21
LocalCostAwareTraverseLogic is a wrapper around the traverse logic set by the user.
Definition: localcostawaretraverselogic.h:34
float KyFloat32
float
Definition: types.h:32