
    hD                     `    S r SSKJr  SSKJr  SSKJr  SSKrSSKJr  S r	S	 r
SS
 jrSS jrg)z
Functions about lighting mesh(changing colors/texture of mesh).
1. add light to colors/texture (shade each vertex)
2. fit light according to colors/texture & image.
    )absolute_import)division)print_functionN   )mesh_core_cythonc                    XSS2S4   SS24   nXSS2S4   SS24   nXSS2S4   SS24   n[         R                  " X#-
  X$-
  5      n[         R                  " U [         R                  S9R	                  5       n[
        R                  " XeR                  [         R                  5      R	                  5       UR	                  5       UR                  S   5        [         R                  " US-  S5      nUS:H  nSXx'   [         R                  " [         R                  " U5      5      XhS4'   U[         R                  " USS2[         R                  4   5      -  nU$ )zcalculate normal direction in each vertex
Args:
    vertices: [nver, 3]
    triangles: [ntri, 3]
Returns:
    normal: [nver, 3]
Nr   r      )dtype)npcross
zeros_likefloat32copyr   get_normal_coreastypeshapesumonessqrtnewaxis)	vertices	trianglespt0pt1pt2
tri_normalnormalmagzero_inds	            b/var/www/fran/franai/venv/lib/python3.13/site-packages/insightface/thirdparty/face3d/mesh/light.py
get_normalr!      s     QT?A%
&C
QT?A%
&C
QT?A%
&C#)SY/J]]8RZZ8==?F
 $$V->->rzz-J-O-O-QS\SaSaScenetetuvewx &&A
CqHCM''266(#35FQ;BGGC"**-..FM    c                 L   U R                   S   UR                   S   :X  d   eU R                   S   n[        X5      n[        R                  " [        R                  " U5      [
        SS2S4   [
        SS2S4   [
        SS2S4   [
        SS2S4   [
        SS2S4   -  [
        SS2S4   [
        SS2S4   -  [
        SS2S4   [
        SS2S4   -  [
        SS2S4   S-  [
        SS2S4   S-  -
  S[
        SS2S4   S-  -  S-
  4	5      nUR                  U5      nX'-  nU$ )aj  
In 3d face, usually assume:
1. The surface of face is Lambertian(reflect only the low frequencies of lighting)
2. Lighting can be an arbitrary combination of point sources
--> can be expressed in terms of spherical harmonics(omit the lighting coefficients)
I = albedo * (sh(n) x sh_coeff)

albedo: n x 1
sh_coeff: 9 x 1
Y(n) = (1, n_x, n_y, n_z, n_xn_y, n_xn_z, n_yn_z, n_x^2 - n_y^2, 3n_z^2 - 1)': n x 9 
# Y(n) = (1, n_x, n_y, n_z)': n x 4

Args:
    vertices: [nver, 3]
    triangles: [ntri, 3]
    colors: [nver, 3] albedo
    sh_coeff: [9, 1] spherical harmonics coefficients

Returns:
    lit_colors: [nver, 3]
r   Nr   r	      )r   r!   r   arrayr   ndot)	r   r   colorssh_coeffnverr   shref
lit_colorss	            r    add_light_shr.   -   s[   , >>!Q///>>!D,F	2774=!AaC&!AaC&!AaC&!AaC&1Q3-1Q3PQRSTURUPVXYZ[\]Z]X^_`abcdad_eXeghijklilgmopgpstuvwxuxsy{|s|g|~  BC  DE  FG  DG  BH  JK  BK  L  OP  P  Q  
RB
&&
CJr"   c                    U R                   S   n[        X5      nU [        R                  SS2SS24   USS2[        R                  SS24   -
  n[        R                  " [        R
                  " US-  SS95      nXxSS2SS2[        R                  4   -  nU[        R                  SS2SS24   U-  n	[        R
                  " U	SS9n	U[        R                  SS2SS24   U	SS2SS2[        R                  4   -  USS2[        R                  SS24   -  n
[        R
                  " U
SS9n
U
n[        R                  " [        R                  " US5      S5      nU$ )a  Gouraud shading. add point lights.
In 3d face, usually assume:
1. The surface of face is Lambertian(reflect only the low frequencies of lighting)
2. Lighting can be an arbitrary combination of point sources
3. No specular (unless skin is oil, 23333)

Ref: https://cs184.eecs.berkeley.edu/lecture/pipeline    
Args:
    vertices: [nver, 3]
    triangles: [ntri, 3]
    light_positions: [nlight, 3] 
    light_intensities: [nlight, 3]
Returns:
    lit_colors: [nver, 3]
r   Nr	   )axisr   )r   r!   r   r   r   r   minimummaximum)r   r   r(   light_positionslight_intensitiesr*   normalsdirection_to_lightsdirection_to_lights_nnormals_dot_lightsdiffuse_outputr-   s               r    	add_lightr:   L   s/     >>!D-G #2::q!#34q"**VWGW7XXGGBFF+>+A!$LM-Aq"**DT.UU Q!123FF 21=BJJ1,-.@ArzzAQ.RRSdefhjhrhrtueuSvvNVVN15N  JBJJz15q9Jr"   c                    U R                   u  pxn	[        X5      n
UR                   S   nUS S2S S 24   n[        R                  " [        R                  " USS S 24   S5      US-
  5      USS S 24'   [        R                  " [        R                  " USS S 24   S5      US-
  5      USS S 24'   [        R
                  " U5      R                  [        R                  5      nXSS S 24   USS S 24   S S 24   nUR                  nSnU
SS S 24   nU
SS S 24   nU
SS S 24   n[        R                  " X45      n[        R                  n[        R                  " SSU-  -  5      [        R                  " U45      -  US S 2S4'   [        R                  " SSU-  -  5      U-  US S 2S4'   [        R                  " SSU-  -  5      U-  US S 2S4'   [        R                  " SSU-  -  5      U-  US S 2S4'   S[        R                  " SSU-  -  5      -  SUS-  -  US-  -
  US-  -
  -  US S 2S4'   S[        R                  " SS	U-  -  5      -  UU-  -  US S 2S4'   S[        R                  " SS	U-  -  5      -  UU-  -  US S 2S
4'   S[        R                  " SS	U-  -  5      -  UU-  -  US S 2S4'   S[        R                  " SS	U-  -  5      -  X-  UU-  -
  -  US S 2S4'    [        U5      nUU	-  n[        R                  " US45      n[        R                  " US45      n[        R                  " S5      n[        U	5       H  nUUU4   S S 2[        R                  4   UUU-  US-   U-  2S S 24'   [         UU4   S S 2[        R                  4   UUS S 24   -  UUU-  US-   U-  2S S 24'   [         UU4   S S 2[        R                  4   nUUU4   S S 2[        R                  4   nUR                  R#                  U5      UR                  R#                  U5      -  UU'   M     [        U5       GHX  nUR%                  5       n[        U	5       H"  nUUU-  US-   U-  2S S 24==   UU   -  ss'   M$     [        R"                  " UR                  U5      U[        R&                  " U5      -  -   n[        R"                  " UR                  U5      n[        R"                  " [        R(                  R+                  U5      U5      n[        U	5       Ht  nUUU-  US-   U-  2S S 24   R#                  U5      nUUU-  US-   U-  2S S 24   nUR                  R#                  U5      UR                  R#                  U5      -  UU'   Mv     GM[     [        R,                  " [         5      n [        U	5       HV  n[        R"                  " U[         US S 24   S S 2[        R                  4   -  WUU   -  5      n!U!R                  U US S 24'   MX     [        R                  " [        R                  " U S5      S5      n U $ )Nr   r	   r   	      r$   g      ?            g      ?   )r$   r   )r   r!   r   r1   r2   roundr   int32Tzerospir   r   lenranger   texturer'   r   eyelinalginvr   )"imager   r(   r   vis_indlambmax_iterhwcnormr*   pt2dimage_pixelharmonic_dimnxnynzharmonicrG   	n_vis_indr&   YAlightkAcYciequation_leftequation_rightalpha
appearancetmps"                                     r    	fit_lightrj   y   s   IQ1 h*D>>!D BQBE?D

2::d1Q3i3QU;D1I

2::d1Q3i3QU;D1I88D>  *DQqS	4!9a/0K--K L	acB	acB	acBxx,-H	BGGAqtH%(88HQqSMGGAqtH%*HQqSMGGAqtH%*HQqSMGGAqtH%*HQqSM2771ad8,,"a%"a%"a%0GHHQqSM2b5	**be4HQqSM2b5	**be4HQqSM2b5	**be4HQqSM2771be9--B?HQqSM  GI!A
!QA
!QAHHVE1X,77
,CArzzM,R!I+qsIo
%q
(),3AwJ,?2::,NQYZacdZdQe,e!I+qsIo
%q
()QZ BJJ/G$Q

]3DDHHRL24488B<0a  8_VVXqAq{AaC?*A-.58;.  qssAbff\.B)BBRryy}}]3^D qA1Y;!Y.1266u=B1Y;!Y.12Brttxx|4E!H  " w'J1XffXgadmArzzM::E%(NK%%
1Q3  BJJz15q9Jr"   )r   r   )
   r$   )__doc__
__future__r   r   r   numpyr   cythonr   r!   r.   r:   rj    r"   r    <module>rq      s1    '  %  $>>'Z[r"   