gwnavruntime/queries/blobs/diskcastqueryblob.h Source File

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