gwnavruntime/queries/blobs/raycangoqueryblob.h Source File

raycangoqueryblob.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_RayCanGoQueryBlob_H
9 #define Navigation_RayCanGoQueryBlob_H
10 
15 
16 namespace Kaim
17 {
18 
19 class RayCanGoQueryOutputBlob
20 {
21  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
22 public:
23  RayCanGoQueryOutputBlob() : m_result(0), m_cost(KyFloat32MAXVAL) {}
24 
25  RayCanGoQueryResult GetResult() const { return (RayCanGoQueryResult)m_result; }
26 public:
27  KyUInt32 m_result;
28  KyFloat32 m_cost;
29  NavTriangleBlob m_startTriangle;
30  NavTriangleBlob m_destTriangle;
31  BlobRef<QueryDynamicOutputBlob> m_queryDynamicOutputBlobRef;
32 };
33 inline void SwapEndianness(Endianness::Target e, RayCanGoQueryOutputBlob& self)
34 {
35  SwapEndianness(e, self.m_result);
36  SwapEndianness(e, self.m_cost);
37  SwapEndianness(e, self.m_startTriangle);
38  SwapEndianness(e, self.m_destTriangle);
39  SwapEndianness(e, self.m_queryDynamicOutputBlobRef);
40 }
41 
42 
43 class RayCanGoQueryOutputBlobBuilder : public BaseBlobBuilder<RayCanGoQueryOutputBlob>
44 {
45 public:
46  RayCanGoQueryOutputBlobBuilder(BaseRayCanGoQuery* query) { m_query = query; }
47  virtual void DoBuild()
48  {
49  BLOB_SET(m_blob->m_result, (KyUInt32)m_query->GetResult());
50  BLOB_SET(m_blob->m_cost, m_query->GetComputedCost());
51  BLOB_BUILD(m_blob->m_startTriangle, NavTriangleBlobBuilder(m_query->GetStartTrianglePtr()));
52  BLOB_BUILD(m_blob->m_destTriangle, NavTriangleBlobBuilder(m_query->GetDestTrianglePtr()));
53  QueryDynamicOutput* queryDynamicOutput = m_query->GetQueryDynamicOutput();
54  if (queryDynamicOutput != KY_NULL && queryDynamicOutput->IsEmpty() == false)
55  {
56  BUILD_REFERENCED_BLOB(m_blob->m_queryDynamicOutputBlobRef, QueryDynamicOutputBlobBuilder(queryDynamicOutput));
57  }
58  }
59 
60 private:
61  BaseRayCanGoQuery* m_query;
62 };
63 
64 
65 class RayCanGoQueryBlob
66 {
67  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
68  KY_ROOT_BLOB_CLASS(Query, RayCanGoQueryBlob, 1)
69 public:
70  RayCanGoQueryBlob() : m_queryInfoId(KyUInt32MAXVAL), m_databaseIdx(KyUInt32MAXVAL) {}
71 
72  DynamicOutputMode GetDynamicOutputMode() const { return (DynamicOutputMode)m_dynamicOutputMode; }
73  ComputeCostMode GetComputeCostMode() const { return (ComputeCostMode)m_computeCostMode; }
74 
75 public:
76  KyUInt32 m_queryInfoId;
77 
78  KyUInt32 m_databaseIdx;
79  Vec3f m_startPos3f;
80  Vec3f m_destPos3f;
81  PositionSpatializationRange m_positionSpatializationRange;
82  KyUInt32 m_marginMode;
83  KyUInt32 m_dynamicOutputMode;
84  KyUInt32 m_computeCostMode;
85 
86  KyFloat32 m_margin; // The float value corresponding to m_marginMode.
87  BlobRef<RayCanGoQueryOutputBlob> m_queryOutput;
88 };
89 inline void SwapEndianness(Endianness::Target e, RayCanGoQueryBlob& self)
90 {
91  SwapEndianness(e, self.m_queryInfoId);
92  SwapEndianness(e, self.m_databaseIdx);
93  SwapEndianness(e, self.m_startPos3f);
94  SwapEndianness(e, self.m_destPos3f);
95  SwapEndianness(e, self.m_positionSpatializationRange);
96  SwapEndianness(e, self.m_marginMode);
97  SwapEndianness(e, self.m_dynamicOutputMode);
98  SwapEndianness(e, self.m_computeCostMode);
99 
100  SwapEndianness(e, self.m_margin);
101  SwapEndianness(e, self.m_queryOutput);
102 }
103 
104 class RayCanGoQueryBlobBuilder : public BaseBlobBuilder<RayCanGoQueryBlob>
105 {
106 public:
107  RayCanGoQueryBlobBuilder(BaseRayCanGoQuery* query) { m_query = query; }
108  virtual void DoBuild()
109  {
110  BLOB_SET(m_blob->m_queryInfoId, m_query->m_queryInfoId);
111 
112  if (m_query->m_database != KY_NULL)
113  {
114  BLOB_SET(m_blob->m_databaseIdx , m_query->m_database->GetDatabaseIndex());
115  BLOB_SET(m_blob->m_startPos3f , m_query->GetStartPos());
116  BLOB_SET(m_blob->m_destPos3f , m_query->GetDestPos());
117  BLOB_SET(m_blob->m_positionSpatializationRange, m_query->GetPositionSpatializationRange());
118  BLOB_SET(m_blob->m_marginMode , (KyUInt32)m_query->GetMarginMode());
119  BLOB_SET(m_blob->m_dynamicOutputMode , (KyUInt32)m_query->GetDynamicOutputMode());
120  BLOB_SET(m_blob->m_computeCostMode , (KyUInt32)m_query->GetComputeCostMode());
121 
122  BLOB_SET(m_blob->m_margin, m_query->m_database->GetRayCanGoMarginFloat(m_query->GetMarginMode()));
123 
124  switch (m_query->GetResult())
125  {
128  break;
129  default:
130  BUILD_REFERENCED_BLOB(m_blob->m_queryOutput, RayCanGoQueryOutputBlobBuilder(m_query));
131  break;
132  }
133  }
134  }
135 
136 private:
137  BaseRayCanGoQuery* m_query;
138 };
139 }
140 
141 #endif // Kaim_RayCanGoQueryInputBlob_H
#define BLOB_SET(blob, value)
Use this macro only in implementations of BaseBlobBuilder::DoBuild().
Definition: baseblobbuilder.h:136
#define KyFloat32MAXVAL
The maximum value that can be stored in the KyFloat32 variable type.
Definition: types.h:227
Indicates that the query has not yet been launched.
Definition: baseraycangoquery.h:30
#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
ComputeCostMode
Enumerates the possible ways a RayCanGoQuery can compute the cost of following the ray...
Definition: rayqueryutils.h:35
RayCanGoQueryOutputBlob * 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 initialized.
Definition: baseraycangoquery.h:29
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36
RayCanGoQueryResult
Enumerates the possible results of a RayCanGoQuery.
Definition: baseraycangoquery.h:27
#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