Helios++
Helios software for LiDAR simulations
FastSAHKDTreeRecountSubTask.h
1 #pragma once
2 
3 #include <SharedSubTask.h>
4 #include <SharedTaskSequencer.h>
5 
7 protected:
8  // *** ATTRIBUTES *** //
9  // ******************** //
13  int const splitAxis;
17  double const minp;
22  double const deltap;
26  vector<Primitive *>::iterator beginPrimitive;
30  vector<Primitive *>::iterator endPrimitive;
34  size_t const lossNodes;
38  size_t const lossCases;
42  vector<size_t> &cForward;
46  vector<size_t> &cBackward;
47 
48 public:
49  // *** CONSTRUCTION / DESTRUCTION *** //
50  // ************************************ //
56  std::shared_ptr<SharedTaskSequencer> ch,
57  int const splitAxis,
58  double const minp,
59  double const deltap,
60  vector<Primitive *>::iterator beginPrimitive,
61  vector<Primitive *>::iterator endPrimitive,
62  size_t const lossNodes,
63  size_t const lossCases,
64  vector<size_t> &cForward,
65  vector<size_t> &cBackward
66  ) :
69  minp(minp),
70  deltap(deltap),
77  {}
78  virtual ~FastSAHKDTreeRecountSubTask() = default;
79 
80  // *** RUNNABLE SHARED TASK *** //
81  // ****************************** //
87  void run() override{
88  // Count min and max vertices
89  vector<size_t> minCount(lossNodes, 0);
90  vector<size_t> maxCount(lossNodes, 0);
91  for(
92  vector<Primitive *>::iterator currentPrimitive = beginPrimitive;
93  currentPrimitive < endPrimitive;
94  ++currentPrimitive
95  ){
96  AABB *aabb = (*currentPrimitive)->getAABB();
97  double const minq = aabb->getMin()[splitAxis];
98  double const maxq = aabb->getMax()[splitAxis];
99  ++minCount[
100  std::min<size_t>(
101  (size_t)((minq-minp)/deltap * lossNodes),
102  lossNodes-1
103  )
104  ];
105  ++maxCount[
106  std::min<size_t>(
107  (size_t)((maxq-minp)/deltap * lossNodes),
108  lossNodes-1
109  )
110  ];
111  }
112 
113  // Accumulate counts
114  cForward.front() = 0;
115  for(size_t i = 0 ; i < lossNodes ; ++i){
116  cForward[i+1] = cForward[i] + minCount[i];
117  }
118  cBackward.back() = 0;
119  for(size_t i = lossNodes ; i > 0 ; --i){
120  cBackward[i-1] = cBackward[i] + maxCount[i-1];
121  }
122 
123  }
124 
125 };
Class representing an Axis Aligned Bounding Box (AABB)
Definition: AABB.h:10
glm::dvec3 const & getMax() const
Get the max value for each coordinate of the axis aligned bounding box.
Definition: AABB.h:109
glm::dvec3 const & getMin() const
Get the min value for each coordinate of the axis aligned bounding box.
Definition: AABB.h:103
AABB * getAABB() override
Obtain this axis aligned bounding box.
Definition: AABB.cpp:214
Definition: FastSAHKDTreeRecountSubTask.h:6
vector< Primitive * >::iterator endPrimitive
Last primitive to be considered by the recount (exclusive)
Definition: FastSAHKDTreeRecountSubTask.h:30
size_t const lossNodes
How many bins use to cound.
Definition: FastSAHKDTreeRecountSubTask.h:34
double const minp
Minimum coordinate of node boundary at corresponding split axis.
Definition: FastSAHKDTreeRecountSubTask.h:17
FastSAHKDTreeRecountSubTask(std::shared_ptr< SharedTaskSequencer > ch, int const splitAxis, double const minp, double const deltap, vector< Primitive * >::iterator beginPrimitive, vector< Primitive * >::iterator endPrimitive, size_t const lossNodes, size_t const lossCases, vector< size_t > &cForward, vector< size_t > &cBackward)
Main constructor for Fast-SAH KDTree forward and backward recounts.
Definition: FastSAHKDTreeRecountSubTask.h:55
void run() override
Implementation of the method to do forward and backward recount.
Definition: FastSAHKDTreeRecountSubTask.h:87
int const splitAxis
The node split axis.
Definition: FastSAHKDTreeRecountSubTask.h:13
vector< Primitive * >::iterator beginPrimitive
First primitive to be considered by the recount (inclusive)
Definition: FastSAHKDTreeRecountSubTask.h:26
vector< size_t > & cForward
Where forward count components must be stored.
Definition: FastSAHKDTreeRecountSubTask.h:42
double const deltap
Difference between maximum and minimum coordinates of node boundaries at corresponding split axis.
Definition: FastSAHKDTreeRecountSubTask.h:22
size_t const lossCases
How many forward and backward count cases (it is, bins + 1)
Definition: FastSAHKDTreeRecountSubTask.h:38
vector< size_t > & cBackward
Where backward count components must be stored.
Definition: FastSAHKDTreeRecountSubTask.h:46
A shared task is said to be a collection of shared sub-tasks. Each shared sub-task can be computed in...
Definition: SharedSubTask.h:16
std::shared_ptr< SharedSubTaskCompletionHandler > ch
The shared sub-task completion handler that handles what must be done after a shared sub-task executi...
Definition: SharedSubTask.h:28