@@ -193,7 +193,7 @@ namespace webifc::geometry
193193 voidGeoms.insert (voidGeoms.end (), flatVoidMesh.begin (), flatVoidMesh.end ());
194194 }
195195
196- finalGeometry = BoolSubtract (flatElementMeshes, voidGeoms);
196+ finalGeometry = BoolProcess (flatElementMeshes, voidGeoms, " DIFFERENCE " );
197197
198198 #ifdef CSG_DEBUG_OUTPUT
199199 io::DumpIfcGeometry (finalGeometry, " mesh_bool.obj" );
@@ -277,7 +277,7 @@ namespace webifc::geometry
277277 auto flatFirstMeshes = flatten (firstMesh, _expressIDToGeometry, normalizeMat);
278278 auto flatSecondMeshes = flatten (secondMesh, _expressIDToGeometry, normalizeMat);
279279
280- IfcGeometry resultMesh = BoolSubtract (flatFirstMeshes, flatSecondMeshes);
280+ IfcGeometry resultMesh = BoolProcess (flatFirstMeshes, flatSecondMeshes, " DIFFERENCE " );
281281
282282 _expressIDToGeometry[expressID] = resultMesh;
283283 mesh.hasGeometry = true ;
@@ -298,7 +298,7 @@ namespace webifc::geometry
298298 _loader.MoveToArgumentOffset (expressID, 0 );
299299 std::string_view op = _loader.GetStringArgument ();
300300
301- if (op != " DIFFERENCE" )
301+ if (op != " DIFFERENCE" && op != " UNION " )
302302 {
303303 spdlog::error (" [GetMesh()] Unsupported boolean op {}" ,std::string (op), expressID);
304304 return mesh;
@@ -323,7 +323,7 @@ namespace webifc::geometry
323323 return mesh;
324324 }
325325
326- IfcGeometry resultMesh = BoolSubtract (flatFirstMeshes, flatSecondMeshes);
326+ IfcGeometry resultMesh = BoolProcess (flatFirstMeshes, flatSecondMeshes, std::string (op) );
327327
328328 _expressIDToGeometry[expressID] = resultMesh;
329329 mesh.hasGeometry = true ;
@@ -1546,9 +1546,9 @@ namespace webifc::geometry
15461546 }
15471547 }
15481548
1549- IfcGeometry IfcGeometryProcessor::BoolSubtract (const std::vector<IfcGeometry> &firstGeoms, std::vector<IfcGeometry> &secondGeoms)
1549+ IfcGeometry IfcGeometryProcessor::BoolProcess (const std::vector<IfcGeometry> &firstGeoms, std::vector<IfcGeometry> &secondGeoms, std::string op )
15501550 {
1551- spdlog::debug (" [BoolSubtract ({})]" );
1551+ spdlog::debug (" [BoolProcess ({})]" );
15521552 IfcGeometry finalResult;
15531553
15541554 for (auto &firstGeom : firstGeoms)
@@ -1559,7 +1559,7 @@ namespace webifc::geometry
15591559 bool doit = true ;
15601560 if (secondGeom.numFaces == 0 )
15611561 {
1562- spdlog::error (" [BoolSubtract ()] bool aborted due to empty source or target" );
1562+ spdlog::error (" [BoolProcess ()] bool aborted due to empty source or target" );
15631563
15641564 // bail out because we will get strange meshes
15651565 // if this happens, probably there's an issue parsing the mesh that occurred earlier
@@ -1568,7 +1568,7 @@ namespace webifc::geometry
15681568
15691569 if (result.numFaces == 0 )
15701570 {
1571- spdlog::error (" [BoolSubtract ()] bool aborted due to empty source or target" );
1571+ spdlog::error (" [BoolProcess ()] bool aborted due to empty source or target" );
15721572
15731573 // bail out because we will get strange meshes
15741574 // if this happens, probably there's an issue parsing the mesh that occurred earlier
@@ -1577,6 +1577,8 @@ namespace webifc::geometry
15771577
15781578 if (doit)
15791579 {
1580+ IfcGeometry secondOperator;
1581+
15801582 if (secondGeom.halfSpace )
15811583 {
15821584 glm::dvec3 origin = secondGeom.halfSpaceOrigin ;
@@ -1589,7 +1591,6 @@ namespace webifc::geometry
15891591 glm::dvec4 (z, 0 ),
15901592 glm::dvec4 (0 , 0 , 0 , 1 )
15911593 );
1592- IfcGeometry newSecond;
15931594
15941595 double scaleX = 1 ;
15951596 double scaleY = 1 ;
@@ -1606,12 +1607,18 @@ namespace webifc::geometry
16061607 if (glm::abs (dy) > scaleY) {scaleY = glm::abs (dy); }
16071608 if (glm::abs (dz) > scaleZ) {scaleZ = glm::abs (dz); }
16081609 }
1609- newSecond.AddGeometry (secondGeom, trans, scaleX * 2 , scaleY * 2 , scaleZ * 2 , secondGeom.halfSpaceOrigin );
1610- result = fuzzybools::Subtract (result, newSecond);
1610+ secondOperator.AddGeometry (secondGeom, trans, scaleX * 2 , scaleY * 2 , scaleZ * 2 , secondGeom.halfSpaceOrigin );
1611+ } else {
1612+ secondOperator = secondGeom;
1613+ }
1614+
1615+ if (op == " DIFFERENCE" )
1616+ {
1617+ result = fuzzybools::Subtract (result, secondOperator);
16111618 }
1612- else
1619+ else if (op == " UNION " )
16131620 {
1614- result = fuzzybools::Subtract (result, secondGeom );
1621+ result = fuzzybools::Union (result, secondOperator );
16151622 }
16161623 }
16171624 }
0 commit comments