@@ -2137,7 +2137,10 @@ class VoxelizePolygons
2137
2137
ijk = Coord::floor (prim.a );
2138
2138
coordList.push_back (ijk);
2139
2139
2140
- computeDistance (ijk, prim, data);
2140
+ // The first point may not be quite in bounds, and rely
2141
+ // on one of the neighbours to have the first valid seed,
2142
+ // so we cannot early-exit here.
2143
+ updateDistance (ijk, prim, data);
2141
2144
2142
2145
unsigned char primId = data.getNewPrimId ();
2143
2146
data.primIdAcc .setValueOnly (ijk, primId);
@@ -2150,13 +2153,13 @@ class VoxelizePolygons
2150
2153
nijk = ijk + util::COORD_OFFSETS[i];
2151
2154
if (primId != data.primIdAcc .getValue (nijk)) {
2152
2155
data.primIdAcc .setValueOnly (nijk, primId);
2153
- if (computeDistance (nijk, prim, data)) coordList.push_back (nijk);
2156
+ if (updateDistance (nijk, prim, data)) coordList.push_back (nijk);
2154
2157
}
2155
2158
}
2156
2159
}
2157
2160
}
2158
2161
2159
- static bool computeDistance (const Coord& ijk, const Triangle& prim, VoxelizationDataType& data)
2162
+ static bool updateDistance (const Coord& ijk, const Triangle& prim, VoxelizationDataType& data)
2160
2163
{
2161
2164
Vec3d uvw, voxelCenter (ijk[0 ], ijk[1 ], ijk[2 ]);
2162
2165
@@ -2165,6 +2168,11 @@ class VoxelizePolygons
2165
2168
const ValueType dist = ValueType ((voxelCenter -
2166
2169
closestPointOnTriangleToPoint (prim.a , prim.c , prim.b , voxelCenter, uvw)).lengthSqr ());
2167
2170
2171
+ // Either the points may be NAN, or they could be far enough from
2172
+ // the origin that computing distance fails.
2173
+ if (std::isnan (dist))
2174
+ return false ;
2175
+
2168
2176
const ValueType oldDist = data.distAcc .getValue (ijk);
2169
2177
2170
2178
if (dist < oldDist) {
0 commit comments