gwnavruntime/channel/gatedefinitioncomputer.h Source File

gatedefinitioncomputer.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_GateDefinitionComputer_H
8 #define Navigation_GateDefinitionComputer_H
9 
10 
14 
15 
16 namespace Kaim
17 {
18 
19 class Database;
20 class WorkingMemory;
21 class Bubble;
22 class StringPulledEdge;
23 class StringPulledBubbleList;
24 class GateDefinitionArray;
25 
26 
27 class GateDefinitionComputerConfig
28 {
29 public:
30  GateDefinitionComputerConfig() { SetDefaults(); }
31 
32  void SetDefaults();
33 
34  KyFloat32 m_turnSamplingAngleDeg;
35 };
36 
37 enum GateDefinitionComputerResult
38 {
39  GateDefinitionComputer_NotProcessed,
40 
41  GateDefinitionComputer_ComputingStartGateDefinition,
42  GateDefinitionComputer_ComputingTurnGateDefinition,
43  GateDefinitionComputer_ComputingEndGateDefinition,
44 
45  GateDefinitionComputer_Success,
46 
47  GateDefinitionComputer_Error_NoMargin,
48  GateDefinitionComputer_Error_Clamping
49 };
50 
51 class GateDefinitionComputer
52 {
53 public:
54  GateDefinitionComputer()
55  : m_traverseLogicUserData(KY_NULL)
56  , m_database(KY_NULL)
57  , m_stringPulledBubbleList(KY_NULL)
58  , m_result(GateDefinitionComputer_NotProcessed)
59  , m_channelMargin(0.0f)
60  , m_turnSamplingAngleRad(0.0f)
61  , m_internalBubbleCount(0)
62  , m_bubbleIdx(0)
63  {
64  m_turnSamplingAngleRad = m_channelMargin * m_bubbleIdx;
65  }
66 
67  void Initialize(Database* database, const StringPulledBubbleList& stringPulledBubbleList, GateDefinitionArray* gateDefinitionArray);
68  bool IsFinished() const;
69  GateDefinitionComputerResult GetResult() const;
70 
71  void* GetTraverseLogicUserData() const;
72  void SetTraverseLogicUserData(void* traverseLogicUserData);
73 
74  template<class TraverseLogic>
75  GateDefinitionComputerResult Advance(WorkingMemory* workingMemory);
76 
77 private:
78  void InitializeProcessing();
79 
80  template<class TraverseLogic>
81  void ProcessStartGateDefinition(WorkingMemory* workingMemory);
82 
83  template<class TraverseLogic>
84  void ProcessTurnGateDefinition(WorkingMemory* workingMemory);
85 
86  template<class TraverseLogic>
87  void ProcessEndGateDefinition(WorkingMemory* workingMemory);
88 
89  template<class TraverseLogic>
90  GateDefinitionComputerResult ComputeTurnGateDefinitions(const Bubble& bubble, const StringPulledEdge& prevEdge, const StringPulledEdge& nextEdge, WorkingMemory* workingMemory);
91 
92  template<class TraverseLogic>
93  KyResult ClampPosition(Vec3f& pos, WorkingMemory* workingMemory);
94 
95 private:
96  void* m_traverseLogicUserData;
97 
98  Database* m_database;
99  const StringPulledBubbleList* m_stringPulledBubbleList;
100  Ptr<GateDefinitionArray> m_gateDefinitionArray;
101 
102  GateDefinitionComputerResult m_result;
103 
104  // Internal values from parameters
105  KyFloat32 m_channelMargin;
106  KyFloat32 m_turnSamplingAngleRad;
107 
108  // Time-slicing
109  KyUInt32 m_internalBubbleCount;
110  KyUInt32 m_bubbleIdx;
111 
112  // Clamping
113  Vec3f m_lastClampedPosition;
114  NavTrianglePtr m_lastClampedPositionTriangle;
115 
116 
117 public:
118  GateDefinitionComputerConfig m_computerConfig;
119 };
120 
121 KY_INLINE bool GateDefinitionComputer::IsFinished() const
122 {
123  return (
124  (m_result == GateDefinitionComputer_Success) ||
125  (m_result == GateDefinitionComputer_Error_NoMargin) ||
126  (m_result == GateDefinitionComputer_Error_Clamping)
127  );
128 }
129 
130 KY_INLINE GateDefinitionComputerResult GateDefinitionComputer::GetResult() const { return m_result; }
131 KY_INLINE void GateDefinitionComputer::SetTraverseLogicUserData(void* traverseLogicUserData) { m_traverseLogicUserData = traverseLogicUserData; }
132 KY_INLINE void* GateDefinitionComputer::GetTraverseLogicUserData() const { return m_traverseLogicUserData; }
133 
134 } // namespace Kaim
135 
136 
144 
146 
147 
148 #endif // Navigation_GateDefinitionComputer_H
KyInt32 KyResult
Defines a type that can be returned by methods or functions in the Gameware Navigation SDK to indicat...
Definition: types.h:254
#define KY_NULL
Null value.
Definition: types.h:247
Definition: gamekitcrowddispersion.h:20
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43