gwnavgeneration/raster/dynamicrastercell.h Source File

dynamicrastercell.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 
16 
17 namespace Kaim
18 {
19 
20 class GeneratorSystem;
21 class SingleStagePixel;
22 class InputCellBlob;
23 class NavTag;
24 
25 
26 class DynamicRasterCell
27 {
28  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
29  KY_CLASS_WITHOUT_COPY(DynamicRasterCell)
30 
31 public:
32  DynamicRasterCell(
33  const GeneratorParameters& config, const CellDesc& cellDesc,
34  const KyArrayPOD<const InputCellBlob*>* inputCells,
35  const KyArrayTLS_POD<const NavTag*>* navTagArray,
36  KyFloat32 modifiedRasterPrecision = 0.0f,
37  const PixelBox* modifiedPixelBox = nullptr);
38 
39  void Setup(const GeneratorParameters& config, const CellDesc& cellDesc,
40  const KyArrayPOD<const InputCellBlob*>* inputCells, KyFloat32 rasterPrecision, const PixelBox& pixelBox);
41 
42  // To be called before the fill of dynamicColumns: GetDynamicColumn().PushPixel().
43  void BeginColumns();
44 
45  // To be called between BeginColumns() and EndColumns().
46  void PushPixel(const PixelPos& pixelPos, const SingleStagePixel& pixel, KyUInt32 navTagIdx, KyUInt32 ownerIdx = KyUInt32MAXVAL);
47 
48  // To be called between BeginColumns() and EndColumns().
49  void PushPixelToLocal(const PixelPos& localPixelPos, const SingleStagePixel& pixel, KyUInt32 navTagIdx);
50 
51  // To be called between BeginColumns() and EndColumns().
52  void PushPixel(KyInt32 rowMajorIdx, const SingleStagePixel& pixel, KyUInt32 navTagIdx, KyUInt32 ownerIdx = KyUInt32MAXVAL);
53 
54  // To be called after the fill of dynamicColumns: GetDynamicColumn().PushPixel().
55  // Copy dynamicColumns to finalColumns and release dynamicColumns.
56  void EndColumns();
57 
58  // Once EndColumns() has been called, read FinalColumns.
59  const BoxOfArrays<KyFloat32>::Column& GetFinalColumnFromLocal(const PixelPos& localPixelPos) const;
60 
61  // Once EndColumns() has been called, read FinalColumns.
62  const BoxOfArrays<KyFloat32>::Column& GetFinalColumn(const PixelPos& pixelPos) const;
63 
64  // Once EndColumns() has been called, read FinalColumns.
65  const BoxOfArrays<KyUInt32>::Column& GetFinalNavTagColumnFromLocal(const PixelPos& localPixelPos) const;
66 
67  // Once EndColumns() has been called, read FinalColumns.
68  const BoxOfArrays<KyUInt32>::Column& GetFinalNavTagIndicesColumn(const PixelPos& pixelPos) const;
69 
70  // Write Raster file and Raster 3d obj file if specified in the generatorConfig, for debug purpose.
71  KyResult WriteIntermediateRasterFile(GeneratorSystem* system) const;
72 
73  bool IsEmpty() const { return m_isEmpty; }
74  bool AreAllInputCellsOverlapping() const {return m_inputCells->GetCount() == 1 || m_areAllInputCellsOverlapping; }
75  bool HasMultipleNavTags() const { return m_hasMultipleNavTags; }
76 
77  void SetHasMultipleNavTags(bool hasMultipleNavTags) { m_hasMultipleNavTags = hasMultipleNavTags; }
78 
79  const PixelBox& GetPixelBox() const { return m_pixelBox; }
80  const CellDesc& GetCellDesc() const { return m_cellDesc; }
81 
82  const BoxOfArrays<KyFloat32>& GetFinalColumns() const { return m_finalColumns; }
83  BoxOfArrays<KyFloat32>& GetFinalColumns() { return m_finalColumns; }
84 
85  const BoxOfArrays<KyUInt32>& GetFinalColorColumns() const { return m_finalNavTagIdxColumns; }
86  BoxOfArrays<KyUInt32>& GetFinalColorColumns() { return m_finalNavTagIdxColumns; }
87 
88  // Copies the final columns from another raster. Fails if celldesc is not the same.
89  KyResult Copy(const DynamicRasterCell& from);
90 
91  KyInt32 GetPixelSize() const { return IntCoordSystem::IntPixelSize(); }
92  KyFloat32 GetRasterPrecision() const { return m_rasterPrecision; }
93 
94  const KyArrayTLS_POD<const NavTag*>& GetNavTagArray() const { return *m_navTagArray; }
95 
96 private:
97  void MakeFinalColumns();
98  void ReleaseDynamicColumns();
99 
100 private:
101  KyFloat32 m_rasterPrecision;
102  GeneratorParameters m_config;
103  CellDesc m_cellDesc;
104  PixelBox m_pixelBox;
105  const KyArrayPOD<const InputCellBlob*>* m_inputCells;
106  const KyArrayTLS_POD<const NavTag*>* m_navTagArray;
107 
108  // dynamic columns
109  DynamicRasterColumnPool m_dynamicColumns;
110 
111  // final columns
112  BoxOfArrays<KyFloat32> m_finalColumns;
113 
114  // final navTag
115  BoxOfArrays<KyUInt32> m_finalNavTagIdxColumns;
116 
117  bool m_isEmpty;
118  bool m_hasMultipleNavTags; //extracted by the CellRasterizerFromPdgInput
119  bool m_areAllInputCellsOverlapping; //this flag is set and computed during MakeFinalColumns()
120 
121  friend class DynamicRasterCellBlobBuilder;
122 };
123 
124 
125 
126 // --------------------------------- inline implementation ---------------------------------
127 
128 inline void DynamicRasterCell::PushPixelToLocal(const PixelPos& localPixelPos, const SingleStagePixel& pixel, KyUInt32 navTagIdx)
129 {
130  KyInt32 idx = m_pixelBox.GetRowMajorIndexFromLocalPos(localPixelPos);
131  PushPixel(idx, pixel, navTagIdx);
132 }
133 
134 inline void DynamicRasterCell::PushPixel(const PixelPos& pixelPos, const SingleStagePixel& pixel, KyUInt32 navTagIdx, KyUInt32 ownerIdx)
135 {
136  KyInt32 idx = m_pixelBox.GetRowMajorIndex(pixelPos);
137  PushPixel(idx, pixel, navTagIdx, ownerIdx);
138 }
139 
140 inline const BoxOfArrays<KyFloat32>::Column& DynamicRasterCell::GetFinalColumnFromLocal(const PixelPos& localPixelPos) const
141 {
142  return m_finalColumns.GetColumn(localPixelPos.x, localPixelPos.y);
143 }
144 
145 inline const BoxOfArrays<KyFloat32>::Column& DynamicRasterCell::GetFinalColumn(const PixelPos& pixelPos) const
146 {
147  KyInt32 idx = m_pixelBox.GetRowMajorIndex(pixelPos);
148  return m_finalColumns.GetColumn(idx);
149 }
150 
151 inline const BoxOfArrays<KyUInt32>::Column& DynamicRasterCell::GetFinalNavTagColumnFromLocal(const PixelPos& localPixelPos) const
152 {
153  return m_finalNavTagIdxColumns.GetColumn(localPixelPos.x, localPixelPos.y);
154 }
155 
156 inline const BoxOfArrays<KyUInt32>::Column& DynamicRasterCell::GetFinalNavTagIndicesColumn(const PixelPos& pixelPos) const
157 {
158  KyInt32 idx = m_pixelBox.GetRowMajorIndex(pixelPos);
159  return m_finalNavTagIdxColumns.GetColumn(idx);
160 }
161 
162 
163 }
164 
165 
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_CLASS_WITHOUT_COPY(ClassName)
Define to forbid copy constructor and copy assignment.
Definition: types.h:196
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::int32_t KyInt32
int32_t
Definition: types.h:24
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68
float KyFloat32
float
Definition: types.h:32