gwnavruntime/queries/blobs/diskcollisionqueryblob.h Source File

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