gwnavruntime/queries/querydynamicoutput.h Source File

querydynamicoutput.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 
16 
17 namespace Kaim
18 {
19 
22 {
24  QUERY_SAVE_FLOORS = 1 << 1,
32 };
33 
34 class WorkingMemory;
35 
36 template <class T>
37 class QueryOutputBuffer_Impl
38 {
39 public:
40  QueryOutputBuffer_Impl() : m_buffer(nullptr), m_count(0) {}
41 
42  void ClearBuffer();
43  void InitBuffer(KyUInt32 count, char*& memory);
44 
45  KyUInt32 GetCount() const { return m_count; }
46 
47  const T& Get(KyUInt32 index) const { KY_ASSERT(index < m_count); return m_buffer[index]; }
48  T& Get(KyUInt32 index) { KY_ASSERT(index < m_count); return m_buffer[index]; }
49 
50  void Set(KyUInt32 index, const T& object) { KY_ASSERT(index < m_count); m_buffer[index] = object; }
51 
52  T* m_buffer;
53  KyUInt32 m_count;
54 };
55 
58 {
59  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_QueryOutput)
60 public:
61  class Config
62  {
63  public:
64  Config();
65  bool IsZero() const;
66  public:
67  KyUInt32 m_floorCount;
68  KyUInt32 m_triangleCount;
69  KyUInt32 m_navTagSubSegmentCount;
70  KyUInt32 m_costMultiplierSubSegmentCount;
71  KyUInt32 m_halfEdgeIntersectionCount;
72  KyUInt32 m_spatializedPointCount;
73  KyUInt32 m_tagVolumeCount;
74  };
75 
76  QueryDynamicOutput() : m_byteSize(0), RefCount(1) {}
77 
78  // ------------------------------ Getters -----------------------------
79 
80  KyUInt32 GetNavFloorPtrCount() const { return m_navFloorPtrs.GetCount(); }
81  KyUInt32 GetNavTrianglePtrCount() const { return m_navTrianglePtrs.GetCount(); }
82  KyUInt32 GetNavTagSubSegmentCount() const { return m_navTagSubSegments.GetCount(); }
83  KyUInt32 GetCostMultiplierSubSegmentCount() const { return m_costMultSubSegments.GetCount(); }
84  KyUInt32 GetHalfEdgeIntersectionCount() const { return m_halfEgdeIntersections.GetCount(); }
85  KyUInt32 GetSpatializedPointCount() const { return m_spatializedPoints.GetCount(); }
86  KyUInt32 GetTagVolumeCount() const { return m_tagVolumes.GetCount(); }
87 
88  const NavFloorPtr& GetNavFloorPtr(KyUInt32 idx) const { return m_navFloorPtrs.Get(idx); }
89  NavFloorPtr& GetNavFloorPtr(KyUInt32 idx) { return m_navFloorPtrs.Get(idx); }
90 
91  const NavTrianglePtr& GetNavTrianglePtr(KyUInt32 idx) const { return m_navTrianglePtrs.Get(idx); }
92  NavTrianglePtr& GetNavTrianglePtr(KyUInt32 idx) { return m_navTrianglePtrs.Get(idx); }
93 
94  const NavTagSubSegment& GetNavTagSubSegment(KyUInt32 idx) const { return m_navTagSubSegments.Get(idx); }
95  NavTagSubSegment& GetNavTagSubSegment(KyUInt32 idx) { return m_navTagSubSegments.Get(idx); }
96 
97  const CostMultiplierSubSegment& GetCostMultiplierSubSegment(KyUInt32 idx) const { return m_costMultSubSegments.Get(idx); }
98  CostMultiplierSubSegment& GetCostMultiplierSubSegment(KyUInt32 idx) { return m_costMultSubSegments.Get(idx); }
99 
100  const HalfEdgeIntersection& GetHalfEdgeIntersection(KyUInt32 idx) const { return m_halfEgdeIntersections.Get(idx); }
101  HalfEdgeIntersection& GetHalfEdgeIntersection(KyUInt32 idx) { return m_halfEgdeIntersections.Get(idx); }
102 
103  const Ptr<SpatializedPoint>& GetSpatializedPoint(KyUInt32 idx) const { return m_spatializedPoints.Get(idx); }
104  Ptr<SpatializedPoint>& GetSpatializedPoint(KyUInt32 idx) { return m_spatializedPoints.Get(idx); }
105 
106  const Ptr<TagVolume>& GetTagVolume(KyUInt32 idx) const { return m_tagVolumes.Get(idx); }
107  Ptr<TagVolume>& GetTagVolume(KyUInt32 idx) { return m_tagVolumes.Get(idx); }
108 
109 public: // internal
110  void SetNavFloorPtr(KyUInt32 idx, const NavFloorPtr& navFloorPtr) { m_navFloorPtrs.Set(idx, navFloorPtr); }
111  void SetNavTrianglePtr(KyUInt32 idx, const NavTrianglePtr& navTrianglePtr) { m_navTrianglePtrs.Set(idx, navTrianglePtr); }
112  void SetNavTagSubSegment(KyUInt32 idx, const NavTagSubSegment& navTagSubSegment) { m_navTagSubSegments.Set(idx, navTagSubSegment); }
113  void SetCostMultiplierSubSegment(KyUInt32 idx, const CostMultiplierSubSegment& costMultSubSegment) { m_costMultSubSegments.Set(idx, costMultSubSegment); }
114  void SetHalfEdgeIntersection(KyUInt32 idx, const HalfEdgeIntersection& halfEdgeIntersection) { m_halfEgdeIntersections.Set(idx, halfEdgeIntersection); }
115  void SetSpatializedPoint(KyUInt32 idx, const Ptr<SpatializedPoint>& spatializedPoint) { m_spatializedPoints.Set(idx, spatializedPoint); }
116  void SetTagVolume(KyUInt32 idx, const Ptr<TagVolume>& tagVolume) { m_tagVolumes.Set(idx, tagVolume); }
117 
118  static KyUInt32 ComputeByteSize(const Config& config);
119  static Ptr<QueryDynamicOutput> Create(const Config& config);
120 
121  void ClearBuffers();
122  bool IsEnoughMemoryForStoringDynamicOutput(const Config& config) { return ComputeByteSize(config) <= m_byteSize; }
123  void InitBuffers( const Config& config);
124 
125  bool IsEmpty() const;
126 
127 private:
128  QueryOutputBuffer_Impl<NavFloorPtr > m_navFloorPtrs;
129  QueryOutputBuffer_Impl<NavTrianglePtr > m_navTrianglePtrs;
130  QueryOutputBuffer_Impl<NavTagSubSegment > m_navTagSubSegments;
131  QueryOutputBuffer_Impl<HalfEdgeIntersection > m_halfEgdeIntersections;
132  QueryOutputBuffer_Impl<CostMultiplierSubSegment> m_costMultSubSegments;
133  QueryOutputBuffer_Impl<Ptr<SpatializedPoint> > m_spatializedPoints;
134  QueryOutputBuffer_Impl<Ptr<TagVolume> > m_tagVolumes;
135 
136  KyUInt32 m_byteSize;
137  KyUInt32 RefCount; // consider thread-safetyness here with mutable std::atomic<int> RefCount;
138 
139 public: // internal
140  // Lifetime - separate implementation due to Create function
141  KY_INLINE void AddRef() { RefCount ++; }
142 
143  KY_INLINE void Release()
144  {
145  if (RefCount-- == 1)
146  {
147  ClearBuffers();
148  KY_FREE(this);
149  }
150  }
151 
152  // Debug method only.
153  int GetRefCount() const { return RefCount; }
154 };
155 
156 class ScopedDynamicOutput
157 {
158 public:
159  ScopedDynamicOutput(Ptr<QueryDynamicOutput>& dynamicOutput) : m_queryDynamicOutput(&dynamicOutput) {}
160 
161  ~ScopedDynamicOutput() { CopyCrossedDataIntoDynamicOutput(); }
162 
163  KyResult Init(WorkingMemory* workingMemory, DynamicOutputMode outputMode);
164 
165 private:
166  void CopyCrossedDataIntoDynamicOutput();
167  Ptr<QueryDynamicOutput>* m_queryDynamicOutput;
168 
169 public: // internal
170  WorkingMemArray<NavFloorRawPtr> m_navFloorRawPtrs;
171  WorkingMemArray<NavTriangleRawPtr> m_navTriangleRawPtrs;
172  WorkingMemArray<RawNavTagSubSegment> m_rawNavTagSubSegments;
173  WorkingMemArray<CostMultiplierSubSegment> m_costMultiplierSubSegments;
174  WorkingMemArray<RawHalfEdgeIntersection> m_rawHalfEdgeIntersections;
175  WorkingMemArray<SpatializedPoint*> m_spatializedPoints;
176  WorkingMemArray<TagVolume*> m_tagVolumes;
177 };
178 
179 } // namespace Kaim
180 
181 
183 
184 
This class gather the data encountered along some query process.
Definition: querydynamicoutput.h:57
Each instance of this class uniquely identifies a single NavFloor.
Definition: navfloorptr.h:16
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
This class represents a NavTag sub-segment of a ray (within a RayCastQuery or a RayCanGoQuery, carried out against the NavMesh).
Definition: navtagsubsegment.h:39
DynamicOutputMode
Enumerates possible ways of storing collected data by a query in a QueryDynamicOutput object...
Definition: querydynamicoutput.h:21
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
store NavFloorTrianglePtr and NavTagSubSegment arrays
Definition: querydynamicoutput.h:31
store SpatializedPoint array
Definition: querydynamicoutput.h:29
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
do not store anything
Definition: querydynamicoutput.h:23
This class represents a CostMultiplier sub-segment of a ray (within a RayCastQuery or a RayCanGoQuery...
Definition: costmultipliersubsegment.h:21
store triangle edges intersections as Vec3f array
Definition: querydynamicoutput.h:27
store NavFloorTrianglePtr array
Definition: querydynamicoutput.h:25
Each instance of this class uniquely identifies a single NavTriangle in a NavFloor.
Definition: navtriangleptr.h:17
store NavTagSubSegment array
Definition: querydynamicoutput.h:26
store TagVolume array
Definition: querydynamicoutput.h:30
store CostMultiplierSubSegment array
Definition: querydynamicoutput.h:28
This class represents an intersection between an NavHalfEdge and a ray (within a RayCastQuery or a Ra...
Definition: halfedgeintersection.h:38
store NavFloorPtr array
Definition: querydynamicoutput.h:24