
    k}j                        d Z ddlmZ ddlZddlZddlZddlmZ ddlZ	ddl
Zddddd	d
dddd	ddddd	dZddZddZddZ	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZedk(  r e        yy) ad  Non-shrinking curvature fairing outside the protected front ornament.

This is a complementary candidate to guided normal filtering.  It uses
Taubin-style positive/negative Laplacian passes, projected predominantly onto
the original normals, with hard boundary/feature/ornament locks and a global
displacement trust region.  Connectivity is never changed.
    )annotationsN)Path   gq=
ףp?g\(\߿g~jtX?)pairslammumax_pct   gQ?gRQg~jth?4         ?g(\g{Gzt?)zfair-gentlezfair-balancedzfair-strongc                     t        j                         } | j                  dd       | j                  dd       | j                  ddt        t              t        t                     | j                         S )Nz--inputT)requiredz--outdirz
--variants+)nargsdefaultchoices)argparseArgumentParseradd_argumentlistVARIANTS
parse_args)parsers    1.runtime/model-denoise-research/curvature_fair.pyr   r      sg    $$&F
	D1

T2
ChQUV^Q_`    c                $   | d d df   }t        |j                               |z
  t        t        |j                         |j                         z
        d      z  }dt        j                  dd|      z  j                  t        j                        S )N   g-q=g?gQ?gQ?)floatmaxmindm
smoothstepastypenpfloat32)verticesy	frontnesss      r   ornament_protectionr)   %   sl    AAquuw!#s515571B+CU'KKI2==tY77??

KKr   c                N   t         j                  j                  | |d d df      | |d d df      z
  d      }t        t        j                  |            }|t        j
                  ||dz        z  }t        j                  |dd      j                  t         j                        S )Nr   r   axisg
ףp=
?g?g      @)	r$   linalgnormr   medianmaximumclipr#   r%   )r&   edgeslengthsr/   weightss        r   neighbor_weightsr5   +   s    iinnXeAqDk2XeAqDk5JJQRnSG299W%&Frzz'6D=99G777D#&--bjj99r   c                   |d d df   |d d df   }}t        j                  | t         j                        }||f||ffD ]j  \  }}t        d      D ]W  }	|d d |	fxx   t        j                  ||| ||	f   z  t        |             j                  t         j                        z  cc<   Y l |t        j                  |d d d f   t        j                        z  | z
  S )Nr   r   dtype   r4   	minlength)
r$   
zeros_liker%   rangebincountlenr#   r0   r!   EPS)
r&   r2   r4   
weight_sumleftrightaccumulateddestinationsourcer,   s
             r   weighted_laplacianrG   2   s     1+uQT{%D--

;K!%ut}= !V!H 	!D4 BKK(64<"88h-% fRZZ 	! 	!! Jq$w$7@@8KKr   c                   | j                         }t        | |      }|d d df   |d d df   }	}t        j                  ||t	        |             j                  t        j                        }
|
t        j                  |	|t	        |             j                  t        j                        z  }
t        j                  |t        |d         z        }d|z
  j                  t        j                        }t        t        |d               D ]  }t        |d         t        |d         fD ],  }t        ||||
      }t        j                  d	||      }||d d d f   z  }||z
  }|t        j                  d
      |z  z   }|t        j                  |      |d d d f   z  |z  z  }|| z
  }t        j                  d	||      }||d d d f   z  }||z
  }|t        j                  d      |z  z   }t        j                  j                  |d      }|t        j                  d|t        j                  |t         j"                        z        d d d f   z  }| |z   }/ |dz   dz  dk(  s|dz   t        |d         k(  sqt        j                  j                  || z
  d      }t%        d|dz   dd|d    dt        j&                  |d      dd|j)                         d        |j                  t        j                        S )Nr   r   r:   r	         ?r   r   r   zij,ij->igQ?gQ?r+   
   z  pair 02d/z: p95=gffffff?z.7fz, max=)copyr5   r$   r>   r?   r#   r%   r   r=   intrG   einsumr-   r.   minimumr0   r!   r@   printquantiler   )originalr2   original_normals
protectionconfigdiagonalr&   r4   rB   rC   rA   trustmovablepaircoefficient	laplaciannormal_amountnormal_parttangent_partupdatedisplacementamountnormal_displacementtangent_displacementlengths                            r   fairrf   D   s    }}Hx/G1+uQT{%DT7c(mLSSTVT^T^_J"++eWHNUUVXV`V`aaJJJx%y(9"::;EZ''

3Gc&/*+ !&-0%t2EF 	/K*8UGZPIIIj)=MNM*]1d7-CCK${2L 2::e#4|#CCF

;/'!T'2BBVKKH#h.LYYz<9IJF"2VAtG_"D#/2E#E .D1ADX1XXLYY^^Lq^9FBJJsEBJJvrvv4N,NOPQSWPWXXL,.H!	/" 1H?a4!8s6'?/C#C99>>(X*=A>FL$(3q(9 :{{<6s;6,BRBRBTUXAY[)0 ??2::&&r   c                 ,   t               } t        | j                        j                         }t        | j                        j                         }|j                  dd       t        j                  |      }t        j                  |d   t        j                        }t        j                  |d   t        j                        }t        t        j                  j                  |j                  d      |j                  d      z
              }t!        j"                  |t%        |            }|d   }|d	   }	|d
   }
|d   }t!        j&                  ||      \  }}}t!        j(                  ||||      }t!        j*                  |||	ddd      }t!        j,                  ||	|
|t%        |            \  }}t        j.                  |t1        |            }d||<   |dk  }t!        j2                  ||      }t        |j5                  t        j6                              }t9        t!        j:                  ||            }t!        j<                  |||||	|||||
      }t?        |      t%        |      t%        |      |d   |t        t        j@                  |dkD              i d}tC        jD                         }| jF                  D ]  }tH        |   }tK        d| d       tM        ||||||      }t!        jN                  ||||      \  }}|| dz  }t        jP                  |||       t!        j<                  |||||	|||||
      } t        dd| d   |d   z  z
  z        | d<   t        dd| d   |d   z  z
  z        | d<   |t?        |      | |d|d   |<   tK        d| d | d   d!d"| d#   d$d%| d&            tC        jD                         |z
  |d'<   |d(z  jS                  tU        jV                  |d)*      d+,       tK        d-|d'   d.d/       y )0NT)parentsexist_okr&   r7   facesr   r+   unique_edgesadjacent_facesadjacent_edgesboundary_vertices   g(\?g=
ףp=?)blendrI   g)\(?statsr   )inputr&   	trianglestopologybaseline$protected_vertex_fraction_over_50pctvariants[z
] startingz.npz)r&   rj   g      Y@smooth_region_normal_tv_rmsnormal_tv_improvement_pctreflection_field_rmsreflection_improvement_pct)rV   outputmetrics!reverted_vertices_for_flip_safetyrw   z] reflection=z.2fz	% volume=volume_change_pctz.4fz% flips=flipped_faceselapsed_secondszfairing-metrics.json   )indentzutf-8)encodingzDone in z.1fs),r   r   rr   resolveoutdirmkdirr$   loadasarrayr%   int32r   r-   r.   r   r    r!   build_topologyr?   face_geometryvertex_normalsdiffuse_normalsfeature_protectionr0   r)   mean_edge_lengthsumfloat64abssigned_volumegeometry_metricsstrmeantimeperf_counterrw   r   rQ   rf   revert_unsafe_facessavez
write_textjsondumps)!argsrF   r   datarS   rj   rW   rt   r2   rl   rm   rn   original_face_normals
face_areas_original_vertex_normalsguidancefeatureguide_distancerU   smooth_mask	mean_edgeoriginal_areaoriginal_volumeru   reportstartednamerV   	candidaterevertedr}   r~   s!                                    r   mainr   o   s9   <D$**%%'F$++&&(F
LLL-776?Dzz$z*"**=HJJtG}BHH5ERYY^^HLLaL$88<<Q<;O$OPQH  H6H^$E./N./N !45+-+;+;He+L(:q //%Mbc!!z>2t4H !33..2CS]G^ G%8%BCJ$'J ! 4'K##He4I*..rzz.:;M"**8U;<O""H VMZW%05bggj3>N6O0P!F !G &
$$z"#e4j&(
	 !44i(=
	8 TF$-'
)59%%!
 05S7#@AHMjDkkkl0
+, 16S7#9:XF\=]]]^1
,- &k19	$
z4  	v]7+G#H"M N1237x@X?Y[	
G&
N !% 1 1 3g =F$$00F11MX_0`	HV-.s31
56r   __main__)returnzargparse.Namespace)r&   
np.ndarrayr   r   )r&   r   r2   r   r   r   )
r&   r   r2   r   r4   r   rA   r   r   r   )rS   r   r2   r   rT   r   rU   r   rV   zdict[str, float | int]rW   r   r   r   )r   None)__doc__
__future__r   r   r   r   pathlibr   numpyr$   denoise_meshr!   r   r   r)   r5   rG   rf   r   __name__ r   r   <module>r      s    #        EfM!$eOEfML:LLL L 	L
 L$('('(' !(' 	('
 #(' (' ('V[7| zF r   