@@ -687,22 +687,18 @@ void fixMeshCreases( Mesh& mesh, const FixCreasesParams& params )
687
687
FaceBitSet fixFacesBuffer ( mesh.topology .getValidFaces ().size () );
688
688
for ( auto ue : creases )
689
689
{
690
- auto creaseEdge = EdgeId ( ue );
691
- if ( mesh.topology .getOrgDegree ( creaseEdge ) < mesh.topology .getOrgDegree ( creaseEdge.sym () ) )
692
- creaseEdge = creaseEdge.sym (); // important part to triangulate worse end of the edge (mb we should change degree check to area check?)
693
-
694
- fixFacesBuffer.reset ();
695
-
696
- auto findBadFaces = [&] ( bool left )
690
+ if ( mesh.topology .isLoneEdge ( EdgeId ( ue ) ) )
691
+ continue ;
692
+ auto findBadFaces = [&] ( EdgeId ce, bool left )
697
693
{
698
- for ( auto e = creaseEdge ;; )
694
+ for ( auto e = ce ;; )
699
695
{
700
696
auto f = left ? mesh.topology .left ( e ) : mesh.topology .right ( e );
701
697
if ( !f )
702
698
return ;
703
699
fixFacesBuffer.autoResizeSet ( f ); // as far as we triangulate holes - new faces might appear, so we need to resize
704
700
e = left ? mesh.topology .next ( e ) : mesh.topology .prev ( e );
705
- if ( e == creaseEdge )
701
+ if ( e == ce )
706
702
return ; // full cycle
707
703
auto nextF = left ? mesh.topology .left ( e ) : mesh.topology .right ( e );
708
704
if ( !nextF )
@@ -716,12 +712,33 @@ void fixMeshCreases( Mesh& mesh, const FixCreasesParams& params )
716
712
return ; // stop propagation on sharp angle
717
713
}
718
714
};
719
- findBadFaces ( true );
720
- findBadFaces ( false );
715
+
716
+ int numIncidentLCreases = 0 ;
717
+ int numIncidentRCreases = 0 ;
718
+ auto creaseEdge = EdgeId ( ue );
719
+ for ( auto e : orgRing ( mesh.topology , creaseEdge ) )
720
+ {
721
+ if ( creases.test ( e.undirected () ) )
722
+ numIncidentLCreases++;
723
+ }
724
+ for ( auto e : orgRing ( mesh.topology , creaseEdge.sym () ) )
725
+ {
726
+ if ( creases.test ( e.undirected () ) )
727
+ numIncidentRCreases++;
728
+ }
729
+ if ( ( numIncidentRCreases > numIncidentLCreases )
730
+ || ( numIncidentRCreases == numIncidentLCreases &&
731
+ mesh.topology .getOrgDegree ( creaseEdge ) < mesh.topology .getOrgDegree ( creaseEdge.sym () ) ) )
732
+ {
733
+ creaseEdge = creaseEdge.sym ();// important part to triangulate worse end of the edge (mb we should change degree check to area check?)
734
+ }
735
+ fixFacesBuffer.reset ();
736
+ findBadFaces ( creaseEdge, true );
737
+ findBadFaces ( creaseEdge, false );
721
738
if ( fixFacesBuffer.none () )
722
739
continue ;
723
740
724
- auto loops = delRegionKeepBd ( mesh, fixFacesBuffer );
741
+ auto loops = delRegionKeepBd ( mesh, fixFacesBuffer, true );
725
742
for ( const auto & loop : loops )
726
743
{
727
744
int i = 0 ;
0 commit comments