diff --git a/code/IfcBoolean.cpp b/code/IfcBoolean.cpp index b52727c14..696137d9f 100644 --- a/code/IfcBoolean.cpp +++ b/code/IfcBoolean.cpp @@ -387,6 +387,9 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded bool extra_point_flag = false; IfcVector3 extra_point; + IfcVector3 enter_volume; + bool entered_volume_flag = false; + for(unsigned int i = 0; i < *iit; ++i) { // current segment: [i,i+1 mod size] or [*extra_point,i] if extra_point_flag is set const IfcVector3& e0 = extra_point_flag ? extra_point : in[vidx+i]; @@ -434,6 +437,7 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded outvert.push_back(isectpos); ++newcount; + /* // this is, however, only a line that goes to the plane, but not // necessarily to the point where the bounding volume on the // black side of the plane is hit. So basically, we need another @@ -442,8 +446,30 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded extra_point_flag = true; extra_point = isectpos; - //was_outside_boundary = true; - //continue; + was_outside_boundary = true; + continue; */ + + // [isectpos, enter_volume] potentially needs extra points. + // For this, we determine the intersection point with the + // bounding volume and project it onto the plane. + /* + const IfcVector3& enter_volume_proj = proj * enter_volume; + const IfcVector3& enter_isectpos = proj * isectpos; + + intersected_boundary_segments.clear(); + intersected_boundary_points.clear(); + + IntersectsBoundaryProfile(enter_volume_proj, enter_isectpos, profile->verts, + intersected_boundary_segments, + intersected_boundary_points); + + if(!intersected_boundary_segments.empty()) { + + vec = vec + ((p - vec) * n) * n; + } + */ + + //entered_volume_flag = true; } else { outvert.push_back(e0); @@ -459,8 +485,15 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded outvert.push_back(e0); } else { - outvert.push_back(isectpos); + if(entered_volume_flag) { + const IfcVector3& fix_point = enter_volume + ((p - enter_volume) * n) * n; + outvert.push_back(fix_point); + ++newcount; + } + + outvert.push_back(isectpos); } + entered_volume_flag = false; ++newcount; } else { // no intersection with plane or parallel; e0,e1 are on the bad side @@ -482,7 +515,7 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded // ... - IfcFloat d = 1e10; + IfcFloat d = 1e20; IfcVector3 vclosest; BOOST_FOREACH(const IfcVector3& v, intersected_boundary_points) { const IfcFloat dn = (v-e1_plane).SquareLength(); @@ -492,13 +525,24 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded } } - outvert.push_back(proj_inv * vclosest); + vclosest = proj_inv * vclosest; + if(entered_volume_flag) { + const IfcVector3& fix_point = vclosest + ((p - vclosest) * n) * n; + outvert.push_back(fix_point); + ++newcount; + + entered_volume_flag = false; + } + + outvert.push_back(vclosest); ++newcount; //outvert.push_back(e1); //++newcount; } else { + entered_volume_flag = true; + // we just entered the clipping boundary. Record the point // and the segment where we entered and also generate this point. //last_intersected_boundary_segment = intersected_boundary_segments.front(); @@ -507,7 +551,7 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded outvert.push_back(e0); ++newcount; - IfcFloat d = 1e10; + IfcFloat d = 1e20; IfcVector3 vclosest; BOOST_FOREACH(const IfcVector3& v, intersected_boundary_points) { const IfcFloat dn = (v-e0_plane).SquareLength(); @@ -517,7 +561,8 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded } } - outvert.push_back(proj_inv * vclosest); + enter_volume = proj_inv * vclosest; + outvert.push_back(enter_volume); ++newcount; } } @@ -525,6 +570,8 @@ void ProcessPolygonalBoundedBooleanHalfSpaceDifference(const IfcPolygonalBounded else if (is_outside_boundary) { outvert.push_back(e0); ++newcount; + + entered_volume_flag = false; } }