
    hN                     T    S r SSKJr  SSKJr  SSKJr  SSKrS rS rS
S jr	SS	 jr
g)am  
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.

Preparation knowledge:
lighting: https://cs184.eecs.berkeley.edu/lecture/pipeline
spherical harmonics in human face: '3D Face Reconstruction from a Single Image Using a Single Reference Face Shape'
    )absolute_import)division)print_functionNc                    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 5      n[        UR                  S   5       Hf  nXaUS4   SS24   XWSS24   -   XaUS4   SS24'   XaUS4   SS24   XWSS24   -   XaUS4   SS24'   XaUS4   SS24   XWSS24   -   XaUS4   SS24'   Mh     [         R
                  " US-  S5      nUS:H  n	SX'   [         R                  " [         R
                  " U	5      5      XiS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         )	npcross
zeros_likerangeshapesumonessqrtnewaxis)
vertices	trianglespt0pt1pt2
tri_normalnormalimagzero_inds
             h/var/www/fran/franai/venv/lib/python3.13/site-packages/insightface/thirdparty/face3d/mesh_numpy/light.py
get_normalr      s|    QT?A%
&C
QT?A%
&C
QT?A%
&C#)SY/J]]8$F9??1%&%+adOQ,>%?*PQTBR%RA!"%+adOQ,>%?*PQTBR%RA!"%+adOQ,>%?*PQTBR%RA!" ' &&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_lightr6   N   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	   r-   r.   roundastypeint32Tzerospir   r   lenr   r   texturer#   copyeyelinalginvr   )"imager   r$   r   vis_indlambmax_iterhwcnormr&   pt2dimage_pixelharmonic_dimnxnynzharmonicrD   	n_vis_indr"   YAlightkAcYcr   equation_leftequation_rightalpha
appearancetmps"                                     r   	fit_lightrf   {   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	   r   r*   r6   rf    r   r   <module>rl      s.    '  % <>'Z[r   