gwnavruntime/queries/blobs/diskcollisionqueryblob.h Source File

diskcollisionqueryblob.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_DiskCollisionQueryBlob_H
9 #define Navigation_DiskCollisionQueryBlob_H
10 
14 
15 namespace Kaim
16 {
17 
18 class DiskCollisionQueryOutputBlob
19 {
20  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
21 public:
22  DiskCollisionQueryOutputBlob() : m_result(0) {}
23 
24  DiskCollisionQueryResult GetResult() const { return (DiskCollisionQueryResult)m_result; }
25 public:
26  KyUInt32 m_result;
27  NavTriangleBlob m_centerTriangle;
28  BlobRef<QueryDynamicOutputBlob> m_queryDynamicOutputBlobRef;
29 };
30 inline void SwapEndianness(Endianness::Target e, DiskCollisionQueryOutputBlob& self)
31 {
32  SwapEndianness(e, self.m_result );
33  SwapEndianness(e, self.m_centerTriangle );
34  SwapEndianness(e, self.m_queryDynamicOutputBlobRef);
35 }
36 
37 
38 class DiskCollisionQueryOutputBlobBuilder : public BaseBlobBuilder<DiskCollisionQueryOutputBlob>
39 {
40 public:
41  DiskCollisionQueryOutputBlobBuilder(BaseDiskCollisionQuery* query) { m_query = query; }
42  virtual void DoBuild()
43  {
44  BLOB_SET(m_blob->m_result, (KyUInt32)m_query->GetResult());
45 
46  BLOB_BUILD(m_blob->m_centerTriangle, NavTriangleBlobBuilder(m_query->GetCenterTrianglePtr()));
47 
48  QueryDynamicOutput* queryDynamicOutput = m_query->GetQueryDynamicOutput();
49  if (queryDynamicOutput != KY_NULL && queryDynamicOutput->IsEmpty() == false)
50  {
51  BUILD_REFERENCED_BLOB(m_blob->m_queryDynamicOutputBlobRef, QueryDynamicOutputBlobBuilder(queryDynamicOutput));
52  }
53  }
54 
55 private:
56  BaseDiskCollisionQuery* m_query;
57 };
58 
59 class DiskCollisionQueryBlob
60 {
61  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
62  KY_ROOT_BLOB_CLASS(Query, DiskCollisionQueryBlob, 0)
63 public:
64  DiskCollisionQueryBlob() : m_queryInfoId(KyUInt32MAXVAL), m_databaseIdx(KyUInt32MAXVAL) {}
65 
66  DynamicOutputMode GetDynamicOutputMode() const { return (DynamicOutputMode)m_dynamicOutputMode; }
67 
68 public:
69  KyUInt32 m_queryInfoId;
70 
71  KyUInt32 m_databaseIdx;
72  Vec3f m_centerPos3f;
73  KyFloat32 m_radius;
74  PositionSpatializationRange m_positionSpatializationRange;
75  KyUInt32 m_dynamicOutputMode;
76 
77  BlobRef<DiskCollisionQueryOutputBlob> m_queryOutput;
78 };
79 inline void SwapEndianness(Endianness::Target e, DiskCollisionQueryBlob& self)
80 {
81  SwapEndianness(e, self.m_queryInfoId);
82  SwapEndianness(e, self.m_databaseIdx);
83  SwapEndianness(e, self.m_centerPos3f);
84  SwapEndianness(e, self.m_radius);
85  SwapEndianness(e, self.m_positionSpatializationRange);
86  SwapEndianness(e, self.m_dynamicOutputMode);
87 
88  SwapEndianness(e, self.m_queryOutput);
89 }
90 
91 
92 
93 class DiskCollisionQueryBlobBuilder : public BaseBlobBuilder<DiskCollisionQueryBlob>
94 {
95 public:
96  DiskCollisionQueryBlobBuilder(BaseDiskCollisionQuery* query) { m_query = query; }
97  virtual void DoBuild()
98  {
99  BLOB_SET(m_blob->m_queryInfoId, m_query->m_queryInfoId);
100 
101  if (m_query->m_database != KY_NULL)
102  {
103  BLOB_SET(m_blob->m_databaseIdx , m_query->m_database->GetDatabaseIndex());
104  BLOB_SET(m_blob->m_centerPos3f , m_query->GetCenterPos());
105  BLOB_SET(m_blob->m_radius , m_query->GetRadius());
106  BLOB_SET(m_blob->m_positionSpatializationRange, m_query->GetPositionSpatializationRange());
107  BLOB_SET(m_blob->m_dynamicOutputMode , (KyUInt32)m_query->GetDynamicOutputMode());
108 
109  switch (m_query->GetResult())
110  {
113  break;
114  default:
115  BUILD_REFERENCED_BLOB(m_blob->m_queryOutput, DiskCollisionQueryOutputBlobBuilder(m_query));
116  break;
117  }
118  }
119  }
120 
121 private:
122  BaseDiskCollisionQuery* m_query;
123 };
124 }
125 
126 #endif // Kaim_DiskCollisionQueryInputBlob_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
DiskCollisionQueryResult
Enumerates the possible results of a DiskCollisionQuery.
Definition: basediskcollisionquery.h:21
Target
Enumerates the possible endianness types relative to the current platform.
Definition: endianness.h:35
DiskCollisionQueryOutputBlob * 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
Indicates that the query has not yet been launched.
Definition: basediskcollisionquery.h:24
#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
Indicates that the query has not yet been initialized.
Definition: basediskcollisionquery.h:23