1 #ifndef GfxTL__CELLRANGEDATATREESTRATEGY_HEADER__
2 #define GfxTL__CELLRANGEDATATREESTRATEGY_HEADER__
7 template <
class InheritedStrategyT,
class KernelT>
12 class CellData :
public InheritedStrategyT::CellData
17 typedef std::pair<HandleType, HandleType>
CellRange;
40 template <
class BaseT>
48 typedef std::pair<HandleType, HandleType>
CellRange;
72 template <
class BaseTraversalT>
77 template <
class BaseTraversalT>
82 template <
class BaseTraversalT>
87 template <
class BuildInformationT>
91 bi->Range() =
CellRange(KernelT::BeginHandle(), KernelT::EndHandle());
94 template <
class BuildInformationT>
97 const BuildInformationT& parentInfo,
98 unsigned int childIdx,
99 BuildInformationT* bi)
const
101 bi->Range() = parent[childIdx].Range();
104 template <
class BuildInformationT>
108 cell->m_range.first = KernelT::BeginHandle();
109 cell->m_range.second = KernelT::EndHandle();
112 template <
class BuildInformationT>
115 const BuildInformationT& parentInfo,
116 unsigned int childIdx,
117 const BuildInformationT& bi,
120 cell->Range() = bi.Range();
123 template <
class TraversalInformationT>
129 template <
class TraversalInformationT>
132 const TraversalInformationT& ti,
135 *range = cell.Range();
138 template <
class TraversalInformationT>
141 const TraversalInformationT& pTi,
142 unsigned int childIdx,
143 TraversalInformationT* ti)
const
147 template <
class SplitterT,
class BuildInformationT>
151 const BuildInformationT&,
157 left->m_range.first = parent.m_range.first;
158 left->m_range.second = parent.m_range.first + sizes[0];
159 right->m_range.first = left->m_range.second;
160 right->m_range.second = right->m_range.first + sizes[1];
163 template <
class SplitterT,
class BuildInformationT>
167 const BuildInformationT&,
169 BuildInformationT* leftBi,
171 BuildInformationT* rightBi)
175 left->m_range.first = parent.m_range.first;
176 left->m_range.second = parent.m_range.first + sizes[0];
177 right->m_range.first = left->m_range.second;
178 right->m_range.second = right->m_range.first + sizes[1];
181 template <
class SplitterT,
class BuildInformationT>
184 const unsigned int numSplitters,
186 const BuildInformationT& parentInfo,
189 size_t* sizes =
new size_t[size_t(1u) << numSplitters];
190 SplitData(splitters, numSplitters, parentInfo.Range(), sizes);
191 unsigned int childCount = 0;
193 for (
unsigned int i = 0; i < (1u << numSplitters); ++i)
197 cells[i]->m_range.first = begin;
198 cells[i]->m_range.second = begin + sizes[i];
199 begin = cells[i]->m_range.second;
206 if (!cells[0] && childCount)
213 template <
class SplitterT>
216 const unsigned int numSplitters,
220 const unsigned int numChildren = 1 << numSplitters;
221 SplitData(splitters[0], range, &(sizes[0]), &(sizes[numChildren >> 1]));
222 if (numSplitters == 1)
226 CellRange leftRange(range.first, range.first + sizes[0]),
227 rightRange(leftRange.second, range.second);
228 SplitData(splitters + 1, numSplitters - 1, leftRange, sizes);
229 SplitData(splitters + 1, numSplitters - 1, rightRange, sizes + (numChildren >> 1));
232 template <
class SplitterT>
236 if (range.second - range.first == 0)
246 while (j <= k &&
split(this->at(this->Dereference(j))))
250 while (j < k && !
split(this->at(this->Dereference(k))))
256 this->SwapHandles(k, j);
265 *left = j - range.first;
266 *right = (range.second - range.first) - *left;
271 const std::vector<size_t>& clusterid,
272 const std::vector<size_t>& clusterCount,
275 std::vector<size_t> clusterPositions(clusterCount.size());
276 clusterPositions[0] = 0;
277 bis[0]->Range() =
CellRange(range.first, range.first + clusterCount[0]);
278 for (
size_t i = 1; i < clusterCount.size(); ++i)
280 clusterPositions[i] = clusterPositions[i - 1] + clusterCount[i - 1];
282 CellRange(range.first + clusterPositions[i],
283 range.first + clusterPositions[i] + clusterCount[i]);
285 std::vector<size_t> partitioning(clusterid.size());
286 for (
size_t i = 0; i < clusterid.size(); ++i)
288 partitioning[i] = clusterPositions[clusterid[i]]++;
290 for (
size_t i = 0; i < partitioning.size(); ++i)
291 while (i != partitioning[i])
293 KernelT::SwapHandles(range.first + i, range.first + partitioning[i]);
294 std::swap(partitioning[i], partitioning[partitioning[i]]);