gwnavruntime/queries/blobs/diskcastqueryblob.h Source File

diskcastqueryblob.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 
8 #pragma once
9 
14 
15 namespace Kaim
16 {
17 
18 class DiskCastQueryOutputBlob
19 {
20  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
21 public:
22  DiskCastQueryOutputBlob() : m_result(0) {}
23 
24  DiskCastQueryResult GetResult() const { return (DiskCastQueryResult)m_result; }
25 public:
26  KyUInt32 m_result;
27  NavTriangleBlob m_startTriangle;
28  NavTriangleBlob m_arrivalTriangle;
29  Vec3f m_arrivalPos3f;
30  Vec3f m_collisionPos3f;
31  NavHalfEdgeBlob m_collisionHalfEdge;
32  BlobRef<QueryDynamicOutputBlob> m_queryDynamicOutputBlobRef;
33 };
34 inline void SwapEndianness(Endianness::Target e, DiskCastQueryOutputBlob& self)
35 {
36  SwapEndianness(e, self.m_result );
37  SwapEndianness(e, self.m_startTriangle );
38  SwapEndianness(e, self.m_arrivalTriangle );
39  SwapEndianness(e, self.m_arrivalPos3f );
40  SwapEndianness(e, self.m_collisionPos3f );
41  SwapEndianness(e, self.m_collisionHalfEdge );
42  SwapEndianness(e, self.m_queryDynamicOutputBlobRef);
43 }
44 
45 
46 class DiskCastQueryOutputBlobBuilder : public BaseBlobBuilder<DiskCastQueryOutputBlob>
47 {
48 public:
49  DiskCastQueryOutputBlobBuilder(BaseDiskCastQuery* query) { m_query = query; }
50  virtual void DoBuild()
51  {
52  BLOB_SET(m_blob->m_result, (KyUInt32)m_query->GetResult());
53 
54  BLOB_BUILD(m_blob->m_startTriangle , NavTriangleBlobBuilder(m_query->GetStartTrianglePtr()));
55  BLOB_BUILD(m_blob->m_arrivalTriangle , NavTriangleBlobBuilder(m_query->GetArrivalTrianglePtr()));
56  BLOB_SET(m_blob->m_arrivalPos3f , m_query->GetArrivalPos());
57  BLOB_SET(m_blob->m_collisionPos3f , m_query->GetCollisionPos());
58  BLOB_BUILD(m_blob->m_collisionHalfEdge, NavHalfEdgeBlobBuilder(m_query->GetCollisionNavHalfEdgePtr()));
59 
60  QueryDynamicOutput* queryDynamicOutput = m_query->GetQueryDynamicOutput();
61  if (queryDynamicOutput != nullptr && queryDynamicOutput->IsEmpty() == false)
62  {
63  BUILD_REFERENCED_BLOB(m_blob->m_queryDynamicOutputBlobRef, QueryDynamicOutputBlobBuilder(queryDynamicOutput));
64  }
65  }
66 
67 private:
68  BaseDiskCastQuery* m_query;
69 };
70 
71 class DiskCastQueryBlob
72 {
73  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
74  KY_ROOT_BLOB_CLASS(Query, DiskCastQueryBlob, 0)
75 public:
76  DiskCastQueryBlob() : m_queryInfoId(KyUInt32MAXVAL), m_databaseIdx(KyUInt32MAXVAL) {}
77 
78  DynamicOutputMode GetDynamicOutputMode() const { return (DynamicOutputMode)m_dynamicOutputMode; }
79 
80 public:
81  KyUInt32 m_queryInfoId;
82 
83  KyUInt32 m_databaseIdx;
84  Vec3f m_startPos3f;
85  KyFloat32 m_radius;
86  Vec2f m_normalizedDir2d;
87  KyFloat32 m_maxDist;
88  PositionSpatializationRange m_positionSpatializationRange;
89  KyFloat32 m_safetyDist;
90  KyUInt32 m_dynamicOutputMode;
91 
92  BlobRef<DiskCastQueryOutputBlob> m_queryOutput;
93 };
94 inline void SwapEndianness(Endianness::Target e, DiskCastQueryBlob& self)
95 {
96  SwapEndianness(e, self.m_queryInfoId);
97  SwapEndianness(e, self.m_databaseIdx);
98  SwapEndianness(e, self.m_startPos3f);
99  SwapEndianness(e, self.m_radius);
100  SwapEndianness(e, self.m_normalizedDir2d);
101  SwapEndianness(e, self.m_maxDist);
102  SwapEndianness(e, self.m_positionSpatializationRange);
103  SwapEndianness(e, self.m_safetyDist);
104  SwapEndianness(e, self.m_dynamicOutputMode);
105 
106  SwapEndianness(e, self.m_queryOutput);
107 }
108 
109 
110 
111 class DiskCastQueryBlobBuilder : public BaseBlobBuilder<DiskCastQueryBlob>
112 {
113 public:
114  DiskCastQueryBlobBuilder(BaseDiskCastQuery* query) { m_query = query; }
115  virtual void DoBuild()
116  {
117  BLOB_SET(m_blob->m_queryInfoId, m_query->m_queryInfoId);
118 
119  if (m_query->m_database != nullptr)
120  {
121  BLOB_SET(m_blob->m_databaseIdx , m_query->m_database->GetDatabaseIndex());
122  BLOB_SET(m_blob->m_startPos3f , m_query->GetStartPos());
123  BLOB_SET(m_blob->m_radius , m_query->GetRadius());
124  BLOB_SET(m_blob->m_normalizedDir2d , m_query->GetNormalizedDir2d());
125  BLOB_SET(m_blob->m_maxDist , m_query->GetMaxDist());
126  BLOB_SET(m_blob->m_positionSpatializationRange, m_query->GetPositionSpatializationRange());
127  BLOB_SET(m_blob->m_safetyDist , m_query->GetSafetyDist());
128  BLOB_SET(m_blob->m_dynamicOutputMode , (KyUInt32)m_query->GetDynamicOutputMode());
129 
130  switch (m_query->GetResult())
131  {
134  break;
135  default:
136  BUILD_REFERENCED_BLOB(m_blob->m_queryOutput, DiskCastQueryOutputBlobBuilder(m_query));
137  break;
138  }
139  }
140  }
141 
142 private:
143  BaseDiskCastQuery* m_query;
144 };
145 }
146 
#define BLOB_SET(blob, value)
Use this macro only in implementations of BaseBlobBuilder::DoBuild().
Definition: baseblobbuilder.h:130
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define BLOB_BUILD(blob, builder)
Use this macro only in implementations of BaseBlobBuilder::DoBuild().
Definition: baseblobbuilder.h:175
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
Target
Enumerates the possible endianness types relative to the current platform.
Definition: endianness.h:27
DiskCastQueryOutputBlob * m_blob
The blob maintained by this builder. Only modify using the macros listed under DoBuild().
Definition: baseblobbuilder.h:113
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
Indicates that the query has not yet been launched.
Definition: basediskcastquery.h:26
Indicates that the query has not yet been initialized.
Definition: basediskcastquery.h:25
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68
DiskCastQueryResult
Enumerates the possible results of a DiskCastQuery.
Definition: basediskcastquery.h:23
float KyFloat32
float
Definition: types.h:32
#define BUILD_REFERENCED_BLOB(blobRef, builder)
Use this macro only in implementations of BaseBlobBuilder::DoBuild().
Definition: baseblobbuilder.h:182