gwnavruntime/queries/blobs/diskexpansionqueryblob.h Source File

diskexpansionqueryblob.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_DiskExpansionQueryBlob_H
9 #define Navigation_DiskExpansionQueryBlob_H
10 
15 
16 namespace Kaim
17 {
18 
19 class DiskExpansionQueryOutputBlob
20 {
21  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
22 public:
23  DiskExpansionQueryOutputBlob() : m_result(0) {}
24 
25  DiskExpansionQueryResult GetResult() const { return (DiskExpansionQueryResult)m_result; }
26 public:
27  KyUInt32 m_result;
28  NavTriangleBlob m_centerTriangle;
29  KyFloat32 m_resultRadius;
30  Vec3f m_collisionPos3f;
31  NavHalfEdgeBlob m_collisionHalfEdge;
32  BlobRef<QueryDynamicOutputBlob> m_queryDynamicOutputBlobRef;
33 };
34 inline void SwapEndianness(Endianness::Target e, DiskExpansionQueryOutputBlob& self)
35 {
36  SwapEndianness(e, self.m_result );
37  SwapEndianness(e, self.m_centerTriangle );
38  SwapEndianness(e, self.m_resultRadius );
39  SwapEndianness(e, self.m_collisionPos3f );
40  SwapEndianness(e, self.m_collisionHalfEdge );
41  SwapEndianness(e, self.m_queryDynamicOutputBlobRef);
42 }
43 
44 
45 class DiskExpansionQueryOutputBlobBuilder : public BaseBlobBuilder<DiskExpansionQueryOutputBlob>
46 {
47  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
48 public:
49  DiskExpansionQueryOutputBlobBuilder(BaseDiskExpansionQuery* 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_centerTriangle , NavTriangleBlobBuilder(m_query->GetCenterTrianglePtr()));
55  BLOB_SET(m_blob->m_resultRadius , m_query->GetResultRadius());
56  BLOB_SET(m_blob->m_collisionPos3f , m_query->GetCollisionPos());
57  BLOB_BUILD(m_blob->m_collisionHalfEdge, NavHalfEdgeBlobBuilder(m_query->GetCollisionNavHalfEdgePtr()));
58 
59  QueryDynamicOutput* queryDynamicOutput = m_query->GetQueryDynamicOutput();
60  if (queryDynamicOutput != KY_NULL && queryDynamicOutput->IsEmpty() == false)
61  {
62  BUILD_REFERENCED_BLOB(m_blob->m_queryDynamicOutputBlobRef, QueryDynamicOutputBlobBuilder(queryDynamicOutput));
63  }
64  }
65 
66 private:
67  BaseDiskExpansionQuery* m_query;
68 };
69 
70 class DiskExpansionQueryBlob
71 {
72  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
73  KY_ROOT_BLOB_CLASS(Query, DiskExpansionQueryBlob, 0)
74 public:
75  DiskExpansionQueryBlob() : m_queryInfoId(KyUInt32MAXVAL), m_databaseIdx(KyUInt32MAXVAL) {}
76 
77  DynamicOutputMode GetDynamicOutputMode() const { return (DynamicOutputMode)m_dynamicOutputMode; }
78 
79 public:
80  KyUInt32 m_queryInfoId;
81 
82  KyUInt32 m_databaseIdx;
83  Vec3f m_centerPos3f;
84  KyFloat32 m_radiusMax;
85  KyFloat32 m_safetyDist;
86  PositionSpatializationRange m_positionSpatializationRange;
87  KyUInt32 m_dynamicOutputMode;
88 
89  BlobRef<DiskExpansionQueryOutputBlob> m_queryOutput;
90 };
91 inline void SwapEndianness(Endianness::Target e, DiskExpansionQueryBlob& self)
92 {
93  SwapEndianness(e, self.m_queryInfoId);
94  SwapEndianness(e, self.m_databaseIdx);
95  SwapEndianness(e, self.m_centerPos3f);
96  SwapEndianness(e, self.m_radiusMax);
97  SwapEndianness(e, self.m_safetyDist);
98  SwapEndianness(e, self.m_positionSpatializationRange);
99  SwapEndianness(e, self.m_dynamicOutputMode);
100 
101  SwapEndianness(e, self.m_queryOutput);
102 }
103 
104 
105 
106 class DiskExpansionQueryBlobBuilder : public BaseBlobBuilder<DiskExpansionQueryBlob>
107 {
108  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
109 public:
110  DiskExpansionQueryBlobBuilder(BaseDiskExpansionQuery* query) { m_query = query; }
111  virtual void DoBuild()
112  {
113  BLOB_SET(m_blob->m_queryInfoId, m_query->m_queryInfoId);
114 
115  if (m_query->m_database != KY_NULL)
116  {
117  BLOB_SET(m_blob->m_databaseIdx , m_query->m_database->GetDatabaseIndex());
118  BLOB_SET(m_blob->m_centerPos3f , m_query->GetCenterPos());
119  BLOB_SET(m_blob->m_radiusMax , m_query->GetRadiusMax());
120  BLOB_SET(m_blob->m_safetyDist , m_query->GetSafetyDist());
121  BLOB_SET(m_blob->m_positionSpatializationRange, m_query->GetPositionSpatializationRange());
122  BLOB_SET(m_blob->m_dynamicOutputMode , (KyUInt32)m_query->GetDynamicOutputMode());
123 
124  switch (m_query->GetResult())
125  {
128  break;
129  default:
130  BUILD_REFERENCED_BLOB(m_blob->m_queryOutput, DiskExpansionQueryOutputBlobBuilder(m_query));
131  break;
132  }
133  }
134  }
135 
136 private:
137  BaseDiskExpansionQuery* m_query;
138 };
139 }
140 
141 #endif // Kaim_DiskExpansionQueryInputBlob_H
Indicates the query has not yet been initialized.
Definition: basediskexpansionquery.h:24
#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
DiskExpansionQueryResult
Enumerates the possible results of a DiskExpansionQuery.
Definition: basediskexpansionquery.h:22
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
Indicates the query has not yet been launched.
Definition: basediskexpansionquery.h:25
DiskExpansionQueryOutputBlob * 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
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36
#define KyUInt32MAXVAL
The maximum value that can be stored in the KyUInt32 variable type.
Definition: types.h:226
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