gwnavruntime/visualsystem/ivisualgeometrybuilder.h Source File

ivisualgeometrybuilder.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 
17 
18 namespace Kaim
19 {
20 
21 class OrientedBox2d;
22 class Box3f;
23 class Transform;
24 class IVisualGeometry;
25 class VisualBoxVertices;
26 
27 class IVisualGeometryBuilder
28 {
29  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_VisualSystem)
30 
31 public:
32  struct ArrowHeadCount { enum Enum { One = 1, Two = 2 }; };
33 
34  struct BoxSides { enum Enum {
35  LeftRight = 1, FrontBack = 2, BottomTop = 4,
36  NotLeftRight = FrontBack | BottomTop,
37  NotFrontBack = LeftRight | BottomTop,
38  NotBottomTop = LeftRight | FrontBack,
39  All = LeftRight | FrontBack | BottomTop
40  }; };
41 
42  struct SideLines { enum Enum { No = 0, Yes = 1 }; };
43 
44  KyUInt32 GetBoxTrianglesCount(BoxSides::Enum boxSides) { return ((boxSides & BoxSides::LeftRight) + ((boxSides & BoxSides::FrontBack) >> 1) + ((boxSides & BoxSides::BottomTop) >> 2)) * 4; }
45 
46  KyUInt32 GetCylinderTrianglesCount(KyUInt32 segmentCount, DisplayFaces::Enum faces) { return faces == DisplayFaces::All ? segmentCount * 4 : segmentCount * 2; }
47  KyUInt32 GetCylinderLinesCount(KyUInt32 segmentCount, SideLines::Enum faces) { return faces == SideLines::Yes ? segmentCount * 3 : segmentCount * 2; }
48 
49 public:
50  IVisualGeometryBuilder(IVisualGeometry* visualGeometry = nullptr): m_visualGeometry(visualGeometry) {}
51  virtual ~IVisualGeometryBuilder() {}
52 
53  void SetVisualGeometry(IVisualGeometry* visualGeometry) { m_visualGeometry = visualGeometry; }
54 
55  bool IsInWriteMode() const { return m_buildMode == BuildMode_Write; }
56  bool IsInCountMode() const { return m_buildMode == BuildMode_Count; }
57 
58  IVisualGeometry* GetVisualGeometry() const { return m_visualGeometry; }
59 
60  void BuildVisualGeometry();
61 
62 protected:
63  virtual void DoBuild() = 0;
64 
65  void BuildSubVisualGeometry(IVisualGeometryBuilder& subGeometryBuilder);
66 
67  //--------------- Text -------------
68 
69  void PushText(const Vec3f& pos, Color color, const char* text, KyUInt32 byteCount = 0); // "abc" byteCount = 4
70 
71  //--------------- Line -------------
72 
73  void PushLine(const Vec3f& P, const Vec3f& Q, Color color, KyFloat32 pixelWidth = 1.0f);
74  void PushVerticalLine(const Vec3f& P, KyFloat32 offset_z, Color color, KyFloat32 pixelWidth = 1.0f);
75 
76  void PushLineCross2d(const Vec3f& P, KyFloat32 radius, Color color);
77  void PushLineCross3d(const Vec3f& P, KyFloat32 radius, Color color);
78  void PushArrowCross2d(const Vec3f& P, KyFloat32 radius, Color color);
79  void PushDiagonalCross2d(const Vec3f& P, KyFloat32 radius, Color color);
80 
81  //--------------- Triangle -------------
82 
83  void PushTriangle(const Triangle3f& triangle, const ShapeColor& shapeColor);
84  void PushTriangle(const Vec3f& A, const Vec3f& B, const Vec3f& C, const ShapeColor& shapeColor);
85 
86  //--------------- Segment -------------
87 
88  void PushSegmentBox( const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor, BoxSides::Enum boxSides = BoxSides::All);
89  void PushSegmentTriangle2d5( const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor);
90  void PushSegmentQuad2d5( const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor);
91  void PushShearedBox( const Vec3f& P, const Vec3f& Q, KyFloat32 height, KyFloat32 radius, const ShapeColor& shapeColor, BoxSides::Enum boxSides = BoxSides::All);
92  void PushSegmentPyramid( const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor);
93  void PushSegmentSquareTube( const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor);
94  void PushSegmentTriangleCross(const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor);
95 
96  void PushCapsule2d5(const Vec3f& P, const Vec3f& Q, KyFloat32 radius, KyUInt32 segmentCount, const ShapeColor& shapeColor);
97  void PushCapsule2d5Precise(const Vec3f& P, const Vec3f& Q, KyFloat32 radius, KyFloat32 precision, const ShapeColor& shapeColor);
98 
99  void PushParabola(const Kaim::Vec3f& P, const Kaim::Vec3f& Q, KyFloat32 height, KyUInt32 segmentCount, Color color);
100 
101  //--------------- VerticalCylinder -------------
102 
103  void PushVerticalCylinder( const Vec3f& P, KyFloat32 height, KyFloat32 radius, KyUInt32 segmentCount, const ShapeColor& shapeColor, SideLines::Enum sideLines, DisplayFaces::Enum faces = DisplayFaces::All);
104  void PushVerticalCylinderPrecise(const Vec3f& P, KyFloat32 height, KyFloat32 radius, KyFloat32 precision , const ShapeColor& shapeColor, SideLines::Enum sideLines, DisplayFaces::Enum faces = DisplayFaces::All);
105 
106  //--------------- Quad -------------
107 
108  void PushQuad(const Vec3f& A, const Vec3f& B, const Vec3f& C, const Vec3f& D, const ShapeColor& shapeColor);
109  void PushOrientedQuad(const Vec3f& P, const Vec3f& normal, KyFloat32 radius, const ShapeColor& shapeColor);
110  void PushQuad2d(const Vec3f& P, KyFloat32 radius, const ShapeColor& shapeColor);
111 
112  void PushDiamond2d(const Vec3f& P, KyFloat32 radius, const ShapeColor& shapeColor);
113 
114  //--------------- Arrow -------------
115 
116  void PushArrow(const Vec3f& P, const Vec3f& Q, KyFloat32 bodyHalfWidth, const ShapeColor& color, KyFloat32 headWidthRatio = 3.0f, KyFloat32 headLengthRatio = 0.33f);
117 
118  void PushArrow2d5( const Vec3f& P, const Vec3f& Q , Color color , ArrowHeadCount::Enum arrowHead = ArrowHeadCount::One);
119  void PushArrowPyramid(const Vec3f& P, const Vec3f& Q , const ShapeColor& shapeColor, ArrowHeadCount::Enum arrowHead = ArrowHeadCount::One);
120  void PushArrowTube( const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor, ArrowHeadCount::Enum arrowHead = ArrowHeadCount::One);
121 
122  //--------------- Disk & DiskSector -------------
123 
124  void PushDisk(const Vec3f& P, KyFloat32 radius, KyUInt32 segmentCount, const ShapeColor& shapeColor);
125  void PushDiskPrecise(const Vec3f& P, KyFloat32 radius, KyFloat32 precision, const ShapeColor& shapeColor);
126 
127  void PushDiskSector(const Vec3f& P, KyFloat32 radius, const Vec3f& startPos, const Vec3f& endPos, const RotationDirection rotDir, KyUInt32 segmentCount, const ShapeColor& shapeColor);
128  void PushDiskSectorPrecise(const Vec3f& P, KyFloat32 radius, const Vec3f& startPos, const Vec3f& endPos, const RotationDirection rotDir, KyFloat32 precision, const ShapeColor& shapeColor);
129 
130  //--------------- Box -------------
131 
132  void PushBox(const Box3f& box, const ShapeColor& shapeColor, BoxSides::Enum boxSides = BoxSides::All);
133  void PushBox(const Vec3f& P, KyFloat32 radius, const ShapeColor& shapeColor, BoxSides::Enum boxSides = BoxSides::All);
134 
135  //--------------- Flag -------------
136 
137  void PushFlag( const Vec3f& P, KyFloat32 height, KyFloat32 radius, const ShapeColor& shapeColor);
138  void PushSeedPoint(const Vec3f& P, KyFloat32 height, KyFloat32 radius, const ShapeColor& shapeColor);
139 
140  //--------------- Other -------------
141 
142  void PushSegmentVerticalQuad(const Vec3f& P, const Vec3f& Q, KyFloat32 above, KyFloat32 below, const ShapeColor& shapeColor);
143 
144  void PushOrientedBox3d(const Transform& transform, const Box3f& extents, const ShapeColor& shapeColor);
145  void PushOrientedBox2d(const OrientedBox2d& orientedBox2d, const ShapeColor& shapeColor);
146 
147  void PushDonut(const Vec3f& P, KyFloat32 innerRadius, KyFloat32 outerRadius, KyUInt32 segmentCount, const ShapeColor& shapeColor);
148  void PushDonutPrecise(const Vec3f& P, KyFloat32 innerRadius, KyFloat32 outerRadius, KyFloat32 precision, const ShapeColor& shapeColor);
149 
150  void PushLadder(const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const Color& color);
151 
152  // ...
153 
154 private:
155  enum {
156  SegmentPyramid_LineCount = 8, SegmentPyramid_TriangleCount = 6,
157  SegmentTube_LineCount = 4, SegmentTube_TriangleCount = 8
158  };
159 
160  void IncrementTextCount( KyUInt32 increment, Color color);
161  void IncrementTriangleCount(KyUInt32 increment, Color color);
162  void IncrementLineCount( KyUInt32 increment, Color color);
163  void IncrementCountsForBox(const ShapeColor& shapeColor, BoxSides::Enum boxSides);
164  void IncrementCountsForCylinder(KyUInt32 segmentCount, const ShapeColor& shapeColor, SideLines::Enum sideLines, DisplayFaces::Enum faces);
165  void IncrementCountsForTriangle(const ShapeColor& shapeColor);
166 
167  // Precondition color.IsVisible() == true.
168  void DoWriteLine(const Vec3f& P, const Vec3f& Q, Color color);
169  void DoWriteTriangleFill(const Vec3f& A, const Vec3f& B, const Vec3f& C, Color color);
170  void DoWriteTriangleLines(const Vec3f& cA, const Vec3f& cB, const Vec3f& cC, Color color);
171  void DoWriteQuadFill(const Vec3f& cA, const Vec3f& cB, const Vec3f& cC, const Vec3f& cD, Color color);
172  void DoWriteQuadLines(const Vec3f& cA, const Vec3f& cB, const Vec3f& cC, const Vec3f& cD, Color color);
173 
174  // Text
175  void WriteText(const Vec3f& pos, Color color, const char* text, KyUInt32 byteCount);
176 
177  // Point
178  void WriteLineCross3d(const Vec3f& P, KyFloat32 radius, Color color);
179  void WriteLineCross2d(const Vec3f& P, KyFloat32 radius, Color color);
180  void WriteArrowCross2d(const Vec3f& P, KyFloat32 radius, Color color);
181  void WriteDiagonalCross2d(const Vec3f& P, KyFloat32 radius, Color color);
182 
183  void WriteDisk(const Vec3f& P, KyFloat32 radius, KyUInt32 segmentCount, const ShapeColor& shapeColor);
184 
185  // Segment
186  void WriteLine(const Vec3f& P, const Vec3f& Q, Color color);
187  void WriteSegmentPyramid(const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor);
188  void WriteSegmentSquareTube(const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor);
189  void WriteSegmentTriangleCross(const Vec3f& P, const Vec3f& Q, KyFloat32 radius, const ShapeColor& shapeColor);
190 
191  // Vertical
192  //void WriteVerticalBox(const Vec3f& P, KyFloat32 height, KyFloat32 radius, const ShapeColor& shapeColor, Faces::Enum faces);
193 
194  // Arrow
195  //void WriteArrow(const Vec3f& P, const Vec3f& Q, KyFloat32 bodyHalfWidth, const ShapeColor& shapeColor, KyFloat32 headWidthRatio, KyFloat32 headLengthRatio);
196  void WriteArrowHead2d5(const Vec3f& P, const Vec3f& Q, KyFloat32 radius, Color color);
197  void WriteArrow2d5( const Vec3f& P, const Vec3f& Q, Color color, ArrowHeadCount::Enum arrowHeadCount = ArrowHeadCount::Two);
198  void WriteArrowPyramid(const Vec3f& P, const Vec3f& Q, const ShapeColor& shapeColor, ArrowHeadCount::Enum arrowHeadCount = ArrowHeadCount::Two);
199  void WriteArrowTube( const Vec3f& P, const Vec3f& Q, KyFloat32 tubeRadius, const ShapeColor& shapeColor, ArrowHeadCount::Enum arrowHeadCount = ArrowHeadCount::Two);
200 
201  // Other
202  void WriteTriangle(const Vec3f& A, const Vec3f& B, const Vec3f& C, const ShapeColor& shapeColor);
203  void WriteQuad(const Vec3f& A, const Vec3f& B, const Vec3f& C, const Vec3f& D, const ShapeColor& shapeColor);
204  void WriteOrientedBox(const Transform& transform, const Box3f& extents, const ShapeColor& shapeColor, DisplayFaces::Enum faces);
205  void WriteOrientedBox2d(const OrientedBox2d& orientedBox2d, const ShapeColor& shapeColor);
206  void WriteDiskSector(const Vec3f& P, KyFloat32 radius, const Vec3f& startPos, const Vec3f& endPos, const RotationDirection rotDir, KyUInt32 subdivisions, const ShapeColor& shapeColor);
207  void WriteDonut(const Vec3f& P, KyFloat32 innerRadius, KyFloat32 outerRadius, KyUInt32 segmentCount, const ShapeColor& shapeColor);
208  void WriteBox(const Box3f& box, const ShapeColor& shapeColor, DisplayFaces::Enum faces);
209  void WriteLadder(const Transform& transform, const Box3f& entrances, KyFloat32 ladderWidth, KyFloat32 rungsThickness, KyFloat32 rungsGapSize, const ShapeColor& shapeColor);
210  void WriteParabola(const Kaim::Vec3f& P, const Kaim::Vec3f& Q, KyFloat32 heightBias, KyUInt32 segmentCount, Color color);
211 
212  void WriteFlagOnly(const Vec3f& P, KyFloat32 height, KyFloat32 radius, const ShapeColor& shapeColor); // 3 lines, 1 triangle
213  void WriteFlag(const Vec3f& P, KyFloat32 height, KyFloat32 radius, const ShapeColor& shapeColor); // FlagOnly + LineCross2d
214  void WriteSeedPoint(const Vec3f& P, KyFloat32 height, KyFloat32 radius, const ShapeColor& shapeColor); // FlagOnly + ArrowCross2d
215 
216  void WriteBoxFromVertices(const VisualBoxVertices& box, const ShapeColor& shapeColor, BoxSides::Enum boxSides);
217 
218  void SetCountMode();
219  void BeginWriteMode();
220  void EndWriteMode();
221 
222  void DebugIncrementTextCount(KyUInt32 increment);
223  void DebugIncrementTriangleCount(KyUInt32 increment, Color color);
224  void DebugIncrementLineCount(KyUInt32 increment, Color color);
225 
226 private:
227  void CheckWriteModeVsCountMode();
228  void WriteDiskTesselation(const Vec3f& P, KyFloat32 radius, const Vec2f& dir1, const Vec2f& dir2, Kaim::Winding::Enum winding, KyUInt32 segmentCount, const ShapeColor& shapeColor);
229 
230 private:
231  enum BuildMode { BuildMode_Count, BuildMode_Write };
232  BuildMode m_buildMode;
233 
234  VisualGeometryPrimitiveCounts m_primitiveCounts;
235  Ptr<IVisualGeometry> m_visualGeometry;
236 
237 #if defined(KY_CONFIG_DEBUG_OR_DEV)
238  // to check if primitiveCounts is the same in BuildMode_Count and BuildMode_Write phases
239  VisualGeometryPrimitiveCounts m_writtenPrimitiveCounts;
240 #endif
241 
242  friend class VisualBoxVertices;
243 };
244 
245 }
246 
248 
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
RotationDirection
Defines the 4 possible cases of possibly constrained rotation in the horizontal plane for a given ele...
Definition: rotation.h:15
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
float KyFloat32
float
Definition: types.h:32
3d vector using 32bits floating points.
Definition: vec3f.h:16