MCPcopy Create free account
hub / github.com/MeshInspector/MeshLib / run

Method run

source/MRMesh/MRMeshDecimate.cpp:849–991  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

847}
848
849DecimateResult MeshDecimator::run()
850{
851 MR_TIMER;
852
853 if ( settings_.bdVerts )
854 pBdVerts_ = settings_.bdVerts;
855 else
856 {
857 pBdVerts_ = &myBdVerts_;
858 if ( !settings_.touchNearBdEdges )
859 myBdVerts_ = getBoundaryVerts( mesh_.topology, settings_.region );
860 }
861
862 if ( !initialize_() )
863 return res_;
864
865 res_.errorIntroduced = settings_.maxError;
866 int lastProgressFacesDeleted = 0;
867 const int maxFacesDeleted = std::min(
868 settings_.region ? (int)settings_.region->count() : mesh_.topology.numValidFaces(), settings_.maxDeletedFaces );
869 while ( !queue_.empty() )
870 {
871 // update queue elements if there is significant portion of outdated edges there
872 if ( queue_.size() >= 1024 && queue_.size() < 5 * numOutdated_ )
873 {
874 updateQueue_();
875 if ( queue_.empty() )
876 break; // if old queue was filled only with invalid elements
877 }
878 const auto topQE = queue_.top();
879 auto ue = topQE.uedgeId();
880 queue_.pop();
881 if ( res_.facesDeleted >= settings_.maxDeletedFaces || res_.vertsDeleted >= settings_.maxDeletedVertices )
882 {
883 res_.errorIntroduced = std::sqrt( topQE.c );
884 break;
885 }
886
887 if ( settings_.progressCallback && res_.facesDeleted >= 1000 + lastProgressFacesDeleted )
888 {
889 if ( !settings_.progressCallback( 0.25f + 0.75f * res_.facesDeleted / maxFacesDeleted ) )
890 return res_;
891 lastProgressFacesDeleted = res_.facesDeleted;
892 }
893
894 if ( !validInQueue_.test( ue ) )
895 {
896 // edge has been deleted by this moment
897 assert( mesh_.topology.isLoneEdge( ue ) );
898 continue;
899 }
900 assert( !mesh_.topology.isLoneEdge( ue ) );
901
902 QuadraticForm3f collapseForm;
903 Vector3f collapsePos;
904 auto qe = computeQueueElement_( ue, topQE.x.edgeOp == EdgeOp::CollapseOptPos, &collapseForm, &collapsePos );
905 if ( !qe )
906 {

Callers 1

decimateMeshSerialFunction · 0.45

Calls 15

getBoundaryVertsFunction · 0.85
minFunction · 0.85
packMeshFunction · 0.85
countMethod · 0.80
numValidFacesMethod · 0.80
uedgeIdMethod · 0.80
getAtFunction · 0.70
sqrFunction · 0.70
emptyMethod · 0.45
sizeMethod · 0.45
popMethod · 0.45

Tested by

no test coverage detected