@@ -1736,87 +1736,62 @@ void Tool::soupToLevelSet()
17361736
17371737 auto myOffset = [&](float dx)->GridT ::Ptr{
17381738 timer.start ();
1739- // if (mParser.verbose) mTimer.restart("offset("+std::to_string(dx)+")");
17401739 auto xform = math::Transform::createLinearTransform (dx);
17411740 auto udf = tools::meshToUnsignedDistanceField<GridT>(*xform, mesh.vtx (), mesh.tri (), mesh.quad (), width);// mesh -> UDF
17421741 auto tmp = tools::levelSetRebuild (*udf, /* iso-value=*/ dx, width);// UDF -> mesh -> SDF
17431742 t_offset += timer.milliseconds ();
17441743 return tmp;
17451744 };// muOffset
17461745
1747- /*
1748- auto myErode = [&](GridT &grid)->void{
1749- const float dx = grid.voxelSize()[0];
1750- //if (mParser.verbose) mTimer.restart("erode("+std::to_string(dx)+")");
1751- const int space = 1, time = 1;
1752- auto filter = this->createFilter(grid, space, time);
1753- if (isSDF == false) {
1754- filter->normalize();
1755- isSDF = true;
1756- }
1757- filter->offset(dx);// erode by dx
1758- };// myErode
1759-
1760- auto myUnion = [&](GridT &gridA, GridT &gridB){
1761- //if (mParser.verbose) mTimer.restart("union("+std::to_string(gridA.voxelSize()[0])+")");
1762- //tools::csgUnion(gridA, gridB, true);// overwrites A and cannibalizes B, and prune
1763- //return tools::sdfToSdf(gridA);// re-normalize using fast sweeping
1764- //return tools::levelSetRebuild(gridA, 0.0f, width);// SDF -> mesh -> SDF
1765- //const int space = 1, time = 1;
1766- //auto filter = this->createFilter(gridA, space, time);
1767- //filter->normalize();// fast
1768- isSDF = false;
1769- return tools::csgUnionCopy(gridA, gridB);
1770- };// myUnion
1771- */
1772-
17731746 auto myLevelSetDeform = [&](GridT &grid, const GridT &gridB)->GridT ::Ptr{
17741747 timer.start ();
17751748 const float dx = grid.voxelSize ()[0 ];
1776- // if (mParser.verbose) mTimer.restart("erode("+std::to_string(dx)+")");
17771749 const int space = 1 , time = 1 ;
17781750 auto filter = this ->createFilter (grid, space, time);
1751+ #if 1
17791752 if (isSDF == false ) {
17801753 filter->normalize ();
17811754 isSDF = true ;
17821755 }
17831756 filter->offset (dx);// erode by dx
1784- isSDF = false ;// the next CSG operation will mess up the SDF
17851757 auto tmp = tools::csgUnionCopy (grid, gridB);
1758+ isSDF = false ;// the CSG operation messed up the SDF
1759+ #else
1760+ filter->offset(dx);// erode by dx
1761+ auto tmp = tools::csgUnionCopy(grid, gridB);
1762+ filter = this->createFilter(*tmp, space, time);
1763+ filter->normalize();
1764+ #endif
17861765 t_deform += timer.milliseconds ();
17871766 return tmp;
17881767 };// myLevelSetDeform
17891768
1790- if (mParser .verbose ) mTimer .start (" Soup -> SDF" );
1769+ // if (mParser.verbose) mTimer.start("Soup -> SDF");
17911770
17921771 // Main algorithm
17931772 float dx = voxel * pow (2 , nLOD);
17941773 auto grid = myOffset (dx);
1795- // grid->setName("soup2ls_"+std::to_string(dx));
1796- // mGrid.push_back(grid);
17971774 while (dx > voxel) {
17981775 dx *= 0 .5f ;// refinement
17991776 grid = myUpsample (*grid);
18001777 auto base = myOffset (dx);
18011778 for (int j = 0 ; j<nErode; ++j) grid = myLevelSetDeform (*grid, *base);
1802- // grid->setName("soup2ls_"+std::to_string(dx));
1803- // mGrid.push_back(grid);
18041779 }
18051780 // grid = tools::levelSetRebuild(*grid, /*iso-value=*/0.0f, width);// SDF -> mesh -> SDF
18061781 if (dx!=voxel) std::cerr << " dx = " << dx << " , expected dx = " << voxel << std::endl;
18071782 t_offset /= 1000.0 ;
18081783 t_deform /= 1000.0 ;
18091784 t_upscale /= 1000.0 ;
1810- std::cerr << " \n upsample = " << t_upscale
1811- << " s, offset = " << t_offset
1812- << " s, deform = " << t_deform
1813- << " s, total = " << (t_offset + t_deform + t_upscale) << " s\n " ;
1785+ std::cerr << " upscale: \t " << t_upscale
1786+ << " s\n offset: \t " << t_offset
1787+ << " s\n deform: \t " << t_deform
1788+ << " s\n total: \t " << (t_offset + t_deform + t_upscale) << " s\n " ;
18141789
18151790 if (grid_name.empty ()) grid_name = " soup2ls_" + mesh.getName ();
18161791 grid->setName (grid_name);
18171792 mGrid .push_back (grid);
18181793 if (!keep) mGeom .erase (std::next (it).base ());
1819- if (mParser .verbose ) mTimer .stop ();
1794+ // if (mParser.verbose) mTimer.stop();
18201795 } catch (const std::exception& e) {
18211796 throw std::invalid_argument (name+" : " +e.what ());
18221797 }
0 commit comments