gwnavruntime/visualsystem/displaylistblob.h Source File

displaylistblob.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 #pragma once
8 
24 
25 namespace Kaim
26 {
27 
28 class Display
29 {
30 public:
31  typedef DisplayDataType DataType;
32 
33  struct SegmentVerticalQuad { Vec3f P; Vec3f Q; KyFloat32 above; KyFloat32 below; };
34  struct Donut { Vec3f P; KyFloat32 innerRadius; KyFloat32 outerRadius; };
35  struct OrientedBox3d { Transform transform; Box3f box; };
36  struct DiskSector { Vec3f P; KyFloat32 radius; Vec3f startPos; Vec3f endPos; KyUInt32 rotDir; }; // rotDir is Kaim::RotationDirection
37  // TODO struct DiskSpan { Vec3f P; KyFloat32 radius; Vec2f dir1; Vec2f dir1; KyUInt32 winding; }; // winding is Kaim::Winding - that is more generic than DiskSector
38 
39  static KyUInt32 GetFloatCount(DisplayDataType::Enum dataType)
40  {
41  switch (dataType)
42  {
43  case DataType::Point : return 3;
44  case DataType::PointRadius : return 4;
45  case DataType::PointHeight : return 4;
46  case DataType::PointHeightRadius : return 5;
47  case DataType::Segment : return 6;
48  case DataType::SegmentRadius : return 7;
49  case DataType::SegmentHeight : return 7;
50  case DataType::SegmentHeightRadius : return 8;
51  case DataType::Triangle : return sizeof(Triangle3f) / sizeof(KyFloat32);
52  case DataType::Quad : return 12;
53  case DataType::Box : return sizeof(Box3f) / sizeof(KyFloat32);
54  case DataType::Donut : return 5;
55  case DataType::SegmentVerticalQuad : return sizeof(SegmentVerticalQuad) / sizeof(KyFloat32);
56  case DataType::OrientedBox2d : return sizeof(OrientedBox2d) / sizeof(KyFloat32);
57  case DataType::OrientedBox3d : return sizeof(OrientedBox3d) / sizeof(KyFloat32);
58  case DataType::DiskSector : return sizeof(DiskSector) / sizeof(KyFloat32);
59  default: KY_ASSERT(0); return 0;
60  }
61  }
62 };
63 
64 
65 class DisplayShapeBlob;
66 
67 // TODO
68 // DisplayShape are created on the stack and pushed into DisplayList::m_displayListData->m_shapes.PushBack(shape);
69 // We should construct Shapes with the DisplayShape(DisplayListData*) -or- DisplayShape(DisplayListManager*)
70 // so that all allocations for shapes are done inside 1 big buffer (or 1 per displayList)
71 class DisplayShape
72 {
73  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_VisualSystem)
74 
75  typedef DisplayDataType DataType;
76 
77 public:
78  DisplayShape() {}
79 
80  DisplayShape(const ShapeColor& shapeColor)
81  : m_color(shapeColor)
82  {}
83 
84  DisplayShape(DisplayFlags flags, const ShapeColor& shapeColor)
85  : m_flags(flags), m_color(shapeColor)
86  {}
87 
88  void InitData(DisplayDataType::Enum dataType)
89  {
90  m_flags.Set(dataType);
91  KyUInt32 count = Display::GetFloatCount(dataType);
92  m_data.Resize(count);
93  }
94 
95  void StealFrom(DisplayShape& other)
96  {
97  m_flags = other.m_flags;
98  m_data.StealFrom(other.m_data);
99  m_color = other.m_color;
100  }
101 
102  void SetShapeColor(const ShapeColor& shapeColor) { m_color = shapeColor; }
103 
104  void SetFloat(KyUInt32 idx, KyFloat32 value) { m_data[idx] = value; }
105  void SetVec3(KyUInt32 idx, const Vec3f& vec3) { *(Vec3f*)(&m_data[idx]) = vec3; }
106 
107  template<typename T>
108  void Set(const T& object) { *(T*)m_data.GetDataPtr() = object; }
109 
110  void P (const Vec3f& P) { InitData(DataType::Point); SetVec3(0, P); }
111  void PR (const Vec3f& P, KyFloat32 R) { InitData(DataType::PointRadius); SetVec3(0, P); SetFloat(3, R); }
112  void PH (const Vec3f& P, KyFloat32 H) { InitData(DataType::PointHeight); SetVec3(0, P); SetFloat(3, H); }
113  void PHR(const Vec3f& P, KyFloat32 H, KyFloat32 R) { InitData(DataType::PointHeightRadius); SetVec3(0, P); SetFloat(3, H); SetFloat(4, R); }
114 
115 
116  void PQ( const Vec3f& P, const Vec3f& Q) { InitData(DataType::Segment); SetVec3(0, P); SetVec3(3, Q); }
117  void PQR( const Vec3f& P, const Vec3f& Q, KyFloat32 R) { InitData(DataType::SegmentRadius); SetVec3(0, P); SetVec3(3, Q); SetFloat(6, R); }
118  void PQH( const Vec3f& P, const Vec3f& Q, KyFloat32 H) { InitData(DataType::SegmentHeight); SetVec3(0, P); SetVec3(3, Q); SetFloat(6, H); }
119  void PQHR(const Vec3f& P, const Vec3f& Q, KyFloat32 H, KyFloat32 R) { InitData(DisplayDataType::SegmentHeightRadius); SetVec3(0, P); SetVec3(3, Q); SetFloat(6, H); SetFloat(7, R); }
120 
121  void Triangle(const Vec3f& A, const Vec3f& B, const Vec3f& C) { InitData(DataType::Triangle); SetVec3(0, A); SetVec3(3, B); SetVec3(6, C); }
122  void Quad(const Vec3f& A, const Vec3f& B, const Vec3f& C, const Vec3f& D) { InitData(DataType::Quad); SetVec3(0, A); SetVec3(3, B); SetVec3(6, C); SetVec3(9, D); }
123  void Box(const Box3f& x) { InitData(DataType::Box); Set(x); }
124  void Donut(const Vec3f& P, KyFloat32 R1, KyFloat32 R2) { InitData(DataType::Donut); SetVec3(0, P); SetFloat(3, R1); SetFloat(4, R2); }
125  void SegmentVerticalQuad(const Display::SegmentVerticalQuad& x) { InitData(DataType::SegmentVerticalQuad); Set(x); }
126  void OrientedBox2D(const OrientedBox2d& x) { InitData(DataType::OrientedBox2d); Set(x); }
127  void OrientedBox3D(const Display::OrientedBox3d& x) { InitData(DataType::OrientedBox3d); Set(x); }
128  void DiskSector(const Display::DiskSector& x) { InitData(DataType::DiskSector); Set(x); }
129 
130 public: // internal
131  DisplayFlags m_flags;
132  KyArrayPOD<KyFloat32, MemStat_VisualSystem> m_data;
133  ShapeColor m_color;
134 };
135 
136 class DisplayShapeBlob
137 {
138  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_VisualSystem)
139 
140 public:
141  ShapeColor GetShapeColor() const { return ShapeColor(m_fillColor, m_lineColor); }
142  Color GetLineColor() const { return m_lineColor; }
143  Color GetFillColor() const { return m_fillColor; }
144  KyFloat32 GetPrecision() const { return m_flags.GetPrecision(); }
145 
146  KyFloat32 GetFloat(KyUInt32 idx) const { return *(KyFloat32*)(&m_data.GetValues()[idx]); }
147  const Vec3f& GetVec3(KyUInt32 idx) const { return *(Vec3f*) (&m_data.GetValues()[idx]); }
148  const Box3f& GetBox3(KyUInt32 idx) const { return *(Box3f*) (&m_data.GetValues()[idx]); }
149  const Transform& GetTransform(KyUInt32 idx) const { return *(Transform*)(&m_data.GetValues()[idx]); }
150 
151  Vec3f GetP() const { return GetVec3(0); }
152 
153  Vec3f GetQ(KyFloat32 defaultOffsetZ) const
154  {
155  switch (m_flags.GetDataType())
156  {
157  case DisplayDataType::Segment :
158  case DisplayDataType::SegmentRadius :
159  case DisplayDataType::SegmentHeight :
160  case DisplayDataType::SegmentHeightRadius:
161  case DisplayDataType::SegmentVerticalQuad:
162  return GetVec3(3);
163  default: return GetVec3(0).OffsetZ(defaultOffsetZ);
164  }
165  }
166 
167  KyFloat32 GetRadius(KyFloat32 defaultRadius) const
168  {
169  switch (m_flags.GetDataType())
170  {
171  case DisplayDataType::PointRadius : return GetFloat(3);
172  case DisplayDataType::PointHeightRadius : return GetFloat(4);
173  case DisplayDataType::Donut : return GetFloat(3);
174  case DisplayDataType::SegmentRadius : return GetFloat(6);
175  case DisplayDataType::SegmentHeightRadius: return GetFloat(7);
176  default: return defaultRadius;
177  }
178  }
179 
180  KyFloat32 GetHeight(KyFloat32 defaultHeight) const
181  {
182  switch (m_flags.GetDataType())
183  {
184  case DisplayDataType::PointHeight : return GetFloat(3);
185  case DisplayDataType::PointHeightRadius : return GetFloat(3);
186  case DisplayDataType::SegmentHeight : return GetFloat(6);
187  case DisplayDataType::SegmentHeightRadius: return GetFloat(6);
188  case DisplayDataType::SegmentVerticalQuad: return GetFloat(6);
189  default: return defaultHeight;
190  }
191  }
192 
193  template<typename T>
194  const T& GetAs() const { return *(T*)m_data.GetValues(); }
195 
196 public:
197  DisplayFlags m_flags; // see Display::DataType::Enum | Display::Style::Enum | ...
198  BlobArray<KyFloat32> m_data;
199  Color m_fillColor;
200  Color m_lineColor;
201 };
202 
203 inline void SwapEndianness(Kaim::Endianness::Target e, DisplayShapeBlob& self)
204 {
205  SwapEndianness(e, self.m_flags);
206  SwapEndianness(e, self.m_data);
207  SwapEndianness(e, self.m_fillColor);
208  SwapEndianness(e, self.m_lineColor);
209 }
210 
211 class DisplayText
212 {
213  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_VisualSystem)
214 
215 public:
216  enum { TextBufferSize = 128 };
217  DisplayText() { m_text[0] = '\0'; }
218  Vec3f m_position;
219  Color m_color;
220  char m_text[TextBufferSize];
221 };
222 
223 class DisplayTextBlob
224 {
225  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_VisualSystem)
226 
227 public:
228  Vec3f m_position;
229  BlobArray<char> m_text;
230  Color m_color;
231 };
232 
233 inline void SwapEndianness(Kaim::Endianness::Target e, DisplayTextBlob& self)
234 {
235  SwapEndianness(e, self.m_position);
236  SwapEndianness(e, self.m_text);
237  SwapEndianness(e, self.m_color);
238 }
239 
242 {
243  DisplayListLifeSpan_SingleFrame,
245 };
246 
247 // TODO
248 //
249 // Major: KyUInt32 m_flags that embed the info : {m_showInLabWhenNotSelected, m_showInLabWhenSelected, DisplayListLifeSpan}
250 // DisplayListBlob:: GetLifespan() GetShowInLabWhenNotSelected GetShowInLabWhenSelected()
251 // m_lifespanId : RemovalBlob with this one will remove all displayList reltive to this one. One per query instance will simplify things a LOT.
252 // Minor: aggregate m_groupName m_listName in the same BlobArray<char>
253 class DisplayListBlob
254 {
255  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_VisualSystem)
256  KY_ROOT_BLOB_CLASS(VisualDebug, DisplayListBlob, 1)
257 
258 public:
259  static KyUInt32 LegacyDisplayListIdForMultiFrame() { return KyUInt32MAXVAL - 1; }
260 
261 public:
262  BlobArray<char> m_listName;
263  BlobArray<char> m_groupName;
264  BlobArray<DisplayTextBlob> m_textBlobs;
265  BlobArray<DisplayShapeBlob> m_shapeBlobs;
266  KyUInt32 m_showInLabWhenNotSelected;
267  KyUInt32 m_showInLabWhenSelected;
268  KyUInt32 m_worldElementId;
269  KyUInt32 m_displayListId;
270 };
271 
272 inline void SwapEndianness(Kaim::Endianness::Target e, DisplayListBlob& self)
273 {
274  SwapEndianness(e, self.m_listName);
275  SwapEndianness(e, self.m_groupName);
276  SwapEndianness(e, self.m_textBlobs);
277  SwapEndianness(e, self.m_shapeBlobs);
278  SwapEndianness(e, self.m_showInLabWhenNotSelected);
279  SwapEndianness(e, self.m_showInLabWhenSelected);
280  SwapEndianness(e, self.m_worldElementId);
281  SwapEndianness(e, self.m_displayListId);
282 }
283 
284 }
285 
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#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
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
displayed one frame
Definition: displaylistblob.h:244
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68
float KyFloat32
float
Definition: types.h:32
DisplayListLifeSpan
Indicates if the displayList will be only visible when received, or will be remanent until replaced o...
Definition: displaylistblob.h:241