27 auto &domain = levelSet->getDomain();
28 auto &grid = levelSet->getGrid();
31 Vec3D<T> minDefinedPoint;
32 Vec3D<T> maxDefinedPoint;
34 for (
int i = 0; i <
D; ++i) {
35 minDefinedPoint[i] = std::numeric_limits<T>::max();
36 maxDefinedPoint[i] = std::numeric_limits<T>::lowest();
39 for (viennahrle::SparseIterator<hrleDomainType> it(domain);
40 !it.isFinished(); it.next()) {
45 auto point = it.getStartIndices();
46 for (
int i = 0; i <
D; ++i) {
49 minDefinedPoint[i] = std::min(minDefinedPoint[i], coord);
50 maxDefinedPoint[i] = std::max(maxDefinedPoint[i], coord);
56 auto dir = Normalize(Inv(direction)) *
57 static_cast<T>(domain.getGrid().getGridDelta());
59 auto numDefinedPoints = domain.getNumberOfPoints();
60 std::vector<T> visibilities(numDefinedPoints);
62#pragma omp parallel num_threads(levelSet->getNumberOfSegments())
66 p = omp_get_thread_num();
69 const viennahrle::Index<D> startVector =
70 (p == 0) ? grid.getMinGridPoint() : domain.getSegmentation()[p - 1];
72 const viennahrle::Index<D> endVector =
73 (p !=
static_cast<int>(domain.getNumberOfSegments() - 1))
74 ? domain.getSegmentation()[p]
75 : grid.incrementIndices(grid.getMaxGridPoint());
78 viennahrle::SizeType
id = 0;
79 for (
int i = 0; i < p; ++i) {
80 id += domain.getDomainSegment(i).getNumberOfPoints();
83 for (viennahrle::SparseIterator<hrleDomainType> it(domain, startVector);
84 it.getStartIndices() < endVector; ++it) {
91 for (
int i = 0; i <
D; ++i) {
92 currentPos[i] = it.getStartIndices(i);
96 T minLevelSetValue = it.getValue();
97 Vec3D<T> rayPos = currentPos;
98 bool visibility =
true;
102 for (
int i = 0; i <
D; ++i) {
107 viennahrle::Index<D> nearestCell;
108 for (
int i = 0; i <
D; ++i) {
109 nearestCell[i] =
static_cast<viennahrle::IndexType
>(rayPos[i]);
120 bool outOfBounds =
false;
121 for (
int i = 0; i <
D; ++i) {
122 if (nearestCell[i] < minDefinedPoint[i] ||
123 nearestCell[i] > maxDefinedPoint[i]) {
135 viennahrle::SparseIterator<hrleDomainType>(domain, nearestCell)
139 if (value < minLevelSetValue) {
146 visibilities[
id++] = visibility ? 1.0 : 0.0;
150 auto &pointData = levelSet->getPointData();
152 if (
int i = pointData.getScalarDataIndex(visibilitiesLabel); i != -1) {
153 pointData.eraseScalarData(i);
155 pointData.insertNextScalarData(visibilities, visibilitiesLabel);