26 auto &domain = levelSet->getDomain();
27 auto &grid = levelSet->getGrid();
30 auto dir = Normalize(Inv(direction));
31 std::vector<T> visibilities(domain.getNumberOfPoints(),
static_cast<T>(-1));
36 for (
int i = 0; i <
D; ++i) {
37 dirNorm += dir[i] * dir[i];
40 if (dirNorm < epsilon) {
41 std::fill(visibilities.begin(), visibilities.end(),
static_cast<T>(1.0));
44 Vec3D<T> minDefinedPoint{};
45 Vec3D<T> maxDefinedPoint{};
47 for (
int i = 0; i <
D; ++i) {
48 minDefinedPoint[i] = std::numeric_limits<T>::max();
49 maxDefinedPoint[i] = std::numeric_limits<T>::lowest();
52 for (viennahrle::SparseIterator<hrleDomainType> it(domain);
53 !it.isFinished(); it.next()) {
58 auto point = it.getStartIndices();
59 for (
int i = 0; i <
D; ++i) {
62 minDefinedPoint[i] = std::min(minDefinedPoint[i], coord);
63 maxDefinedPoint[i] = std::max(maxDefinedPoint[i], coord);
68#pragma omp parallel num_threads(levelSet->getNumberOfSegments())
72 p = omp_get_thread_num();
75 const viennahrle::Index<D> startVector =
76 (p == 0) ? grid.getMinGridPoint() : domain.getSegmentation()[p - 1];
78 const viennahrle::Index<D> endVector =
79 (p !=
static_cast<int>(domain.getNumberOfSegments() - 1))
80 ? domain.getSegmentation()[p]
81 : grid.incrementIndices(grid.getMaxGridPoint());
83 for (viennahrle::SparseIterator<hrleDomainType> it(domain, startVector);
84 it.getStartIndices() < endVector; ++it) {
90 Vec3D<T> currentPos{};
91 for (
int i = 0; i <
D; ++i) {
92 currentPos[i] = it.getStartIndices(i);
96 T minLevelSetValue = it.getValue();
97 Vec3D<T> rayPos = currentPos;
100 for (
int i = 0; i <
D; ++i)
103 bool visibility =
true;
107 for (
int i = 0; i <
D; ++i)
111 viennahrle::Index<D> nearestCell;
112 for (
int i = 0; i <
D; ++i)
113 nearestCell[i] =
static_cast<viennahrle::IndexType
>(rayPos[i]);
116 bool outOfBounds =
false;
117 for (
int i = 0; i <
D; ++i) {
118 if (nearestCell[i] < minDefinedPoint[i] ||
119 nearestCell[i] > maxDefinedPoint[i]) {
130 viennahrle::SparseIterator<hrleDomainType>(domain, nearestCell)
134 if (value < minLevelSetValue) {
141 visibilities[it.getPointId()] = visibility ? 1.0 : 0.0;
146 int unassignedCount = 0;
147 for (
size_t i = 0; i < visibilities.size(); ++i) {
148 if (visibilities[i] < 0) {
149 std::cerr <<
"Unassigned visibility at point ID: " << i << std::endl;
153 if (unassignedCount > 0) {
154 std::cerr <<
"[Error] Total unassigned points: " << unassignedCount
158 auto &pointData = levelSet->getPointData();
160 if (
int i = pointData.getScalarDataIndex(visibilitiesLabel); i != -1) {
161 pointData.eraseScalarData(i);
163 pointData.insertNextScalarData(visibilities, visibilitiesLabel);