Fixed bug in IFC where SweptDiskSolid tessellation would fail for polylines with only 2 points.

Indeed, the EstimateSampleCount is not always accurate in this case, as the number of generated curvature pointer is greater by one. Moreover, it is redundant to call EstimateSampleCount, as the SampleDiscrete method will provide the (correct) number of points anyway. This commit fix the described bug, but also increase the efficiency of the ProcessSweptDiskSolid method, as EstimateSampleCount is only called once now, instead of two times.
pull/1676/head
Leo Terziman 2018-01-03 16:14:20 +01:00
parent 32dfd423db
commit 712a7ee779
1 changed files with 5 additions and 5 deletions

View File

@ -330,7 +330,11 @@ void ProcessSweptDiskSolid(const IfcSweptDiskSolid solid, TempMesh& result, Conv
const unsigned int cnt_segments = conv.settings.cylindricalTessellation; const unsigned int cnt_segments = conv.settings.cylindricalTessellation;
const IfcFloat deltaAngle = AI_MATH_TWO_PI/cnt_segments; const IfcFloat deltaAngle = AI_MATH_TWO_PI/cnt_segments;
const size_t samples = curve->EstimateSampleCount(solid.StartParam,solid.EndParam); TempMesh temp;
curve->SampleDiscrete(temp, solid.StartParam, solid.EndParam);
const std::vector<IfcVector3>& curve_points = temp.verts;
const size_t samples = curve_points.size();
result.verts.reserve(cnt_segments * samples * 4); result.verts.reserve(cnt_segments * samples * 4);
result.vertcnt.reserve((cnt_segments - 1) * samples); result.vertcnt.reserve((cnt_segments - 1) * samples);
@ -338,10 +342,6 @@ void ProcessSweptDiskSolid(const IfcSweptDiskSolid solid, TempMesh& result, Conv
std::vector<IfcVector3> points; std::vector<IfcVector3> points;
points.reserve(cnt_segments * samples); points.reserve(cnt_segments * samples);
TempMesh temp;
curve->SampleDiscrete(temp,solid.StartParam,solid.EndParam);
const std::vector<IfcVector3>& curve_points = temp.verts;
if(curve_points.empty()) { if(curve_points.empty()) {
IFCImporter::LogWarn("curve evaluation yielded no points (IfcSweptDiskSolid)"); IFCImporter::LogWarn("curve evaluation yielded no points (IfcSweptDiskSolid)");
return; return;