
    j	9                         d dl ZddlmZ ddlmZ ddlmZmZm	Z	 ddl
mZmZ 	 d dlmZmZ 	 	 	 	 	 dd	e	e   d
e	e   de	d   de	d   de	e   defdZy# e$ rZ ee      Z ee      ZY dZ[@dZ[ww xY w)    N   )log)ExceptionWrapper)	ArrayLikeNumberOptional   )linear_to_srgbsrgb_to_linear)Image	fromarrayspecularFactorglossinessFactorspecularGlossinessTexturer   diffuseTexturediffuseFactorreturnc           
      \	   t        t        t              r5t        j                  d       i }t        t
              r|d<   |||d<   |S t        j                  g dt        j                        dfd}d	 }d(d
}	d }
fd}fd}t        fdt        d      D              }j                  d   |d   k7  sj                  d   |d   k7  rj                  |      j                  d   |d   k7  sj                  d   |d   k7  rj                  |      d d } ||      } || |      \  }}} | ||       ||      |      }t        |t        j                        s%t        j                  |t        j                        }|dddf   }||dd   z
  z  t        j                  d|z
  d      z  z  }|d|z
  z  z
  dt        j                  |d      z  z  }||z  }||z  d|z
  |z  z   }t        j                  |dd      }	 |j                  dk(  r|d   }|j                  dk(  rt        j                   ||      }nt#        |j                        dk(  r|j                  }t        j$                  |t        j&                  t        j(                  |dd       |      j+                  |d   |d   df      f      }n3|j                  d   dk(  r!|d   }t        j,                  ||d   gd      }i }t#        |j                        dkD  r( |	 ||      |j                  d   dk(  rd"nd#$      |d<   n|j3                         |d<   t#        |j                        dkD  st#        |j                        dkD  rt#        |j                        dk(  r3t        j4                  ||j                  d   |j                  d   df      }t#        |j                        dk(  r3t        j4                  ||j                  d   |j                  d   df      } |	t        j,                  t        j6                  |      d|z
  |gd      d"$      |d%<   d|d&<   d|d'<   |S  |
|      |d&<    |
d|z
        |d'<   |S # t.        $ r t        j0                  dd !       Y w xY w))a7  
    Convert the KHR_materials_pbrSpecularGlossiness to a
    metallicRoughness visual.

    Parameters
    -----------
    specularFactor : list[float]
        Specular color values. Ignored if specularGlossinessTexture
        is present and defaults to [1.0, 1.0, 1.0].
    glossinessFactor : float
        glossiness factor in range [0, 1], scaled
        specularGlossinessTexture if present.
        Defaults to 1.0.
    specularGlossinessTexture : PIL.Image
        Texture with 4 color channels. With [0,1,2] representing
        specular RGB and 3 glossiness.
    diffuseTexture : PIL.Image
        Texture with 4 color channels. With [0,1,2] representing diffuse
        RGB and 3 opacity.
    diffuseFactor: float
        Diffuse RGBA color. scales diffuseTexture if present.
        Defaults to [1.0, 1.0, 1.0, 1.0].

    Returns
    ----------
    kwargs : dict
      Constructor args for a PBRMaterial object.
      Containing:
        - either baseColorTexture or baseColorFactor
        - either metallicRoughnessTexture or metallicFactor and roughnessFactor
    z:unable to convert specular-glossy material without pillow!baseColorTextureNbaseColorFactor){Gz?r   r   dtypegư>c                    t        |t              r	|d   k  ryt        | j                        dk(  r| d   } t        |j                        dk(  r|d   }d   }| |z  dd   z
  z  |z   dd   z  z
  }d   |z
  }||z  d|z  |z  z
  }t	        j
                  |	d       }t	        j
                  | t	        j                  |      z   d|z  z  dd      }t        |t        j                        rd||d   k  <   |S )Nr           r   .N      ?g       @g      @)
isinstancefloatlenshapenpclipsqrtndarray)
diffusespecularone_minus_specular_strengthabcDmetallicdielectric_specularepsilons
           A/DATA/.local/lib/python3.12/site-packages/trimesh/visual/gloss.pysolve_metallicz'specular_to_pbr.<locals>.solve_metallicE   s    h&86I!6L+Lw}}"i(Gx~~!#	*H"11S;Nq;Q5QR'**+ 	

  "X-EC!GaKGGAw%77QBOa8#sCh

+:=HX 3A 667    c                 l    t        j                  t        j                  | dd df   dz  g d            S )N.   r   )gA`"?gbX9?gv/?)r"   r$   dot)rgbs    r0   get_perceived_brightnessz1specular_to_pbr.<locals>.get_perceived_brightness\   s.    wwrvvc#rr'la/1FGHHr2   c                    t        | t              r| S | j                  t        j                  k(  s| j                  t        j
                  k(  r7t        j                  | dd      dz  j                  t        j                        } t        |       S )Nr   r        o@)
r   r   r   r"   float32float64r#   astypeuint8r   )imgmodes     r0   toPILzspecular_to_pbr.<locals>.toPIL_   s`    c5!J99

"cii2::&=773S)E199"((CC~r2   c                     t        | t              r| S t        | t        j                        rt	        | j
                        dk(  r| d   S | j                         S )Nr	   r   )r   r   r"   r%   r    r!   tolist)vals    r0   	get_floatz"specular_to_pbr.<locals>.get_floatf   sC    c5!Jc2::&3syy>Q+>q6Mzz|r2   c           	      (   | | ng d} t        j                  | t         j                        } ||j                  dk(  r|j	                  d      }n |j                  dk(  r|j	                  d      }t        j                  |      dz  } |      }t        |j                        dk(  r|d	   }|j                  d
   dk(  r|| z  }|S |j                  d
   dk(  rU|dddf   }|dd df   | z  }| j                  d
   dk(  rt        j                  ||gd
      }|S |dd
d fxx   |z  cc<   |S |j                  d
   | j                  d
   k(  r|| z  }|S |j                  d
   dk(  rJ| j                  d
   dk(  r8t        j                  |t        j                  |dd df         gd
      | z  }|S t        j                  d| j                   d|j                   z          |S | | ng d}t        j                  |t         j                        }|S )N)r   r   r   r   r   BGRRGBBGRARGBAr9   r   r   r	   .r4   axis   z?`diffuseFactor` and `diffuseTexture` have incompatible shapes: z and )r	   r	   r	   r	   )r"   arrayr:   r?   convertr    r!   concatenate	ones_liker   warning)r   r   r&   alphaconvert_texture_srgb2lins       r0   get_diffusez$specular_to_pbr.<locals>.get_diffusem   sA   *6M<P 	 bjjA%""e+!/!7!7!>$$.!/!7!7!?hh~.6G /w7G7==!Q&!),}}R A%!M10 / r"a'QqS)!#rr'*]: &&r*a/ nngu-=BGG$ ! CH%.%   r"m&9&9"&==!M1  r"a'M,?,?,Cq,HNNGR\\'#rr':J-K#LSUV#$   U&,,-U7==/BC  (5'@mlGhhwbjj9Gr2   c                 j   | g d} t        j                  | t         j                        } |d}t        j                  |gt         j                        }|m|j                  dk(  r|j	                  d      }n |j                  dk(  r|j	                  d      }t        j                  |      dz  }d	\  }}t        |j                        d
k(  r0|j                  |j                  d   |j                  d   d      x}}n|j                  d   dk(  r|dt         j                  f   x}}ne|j                  d   dk(  r
|dd df   }nI|j                  d   d
k(  r|dd df   }|ddd
f   }n$|j                  d   dk(  r|dd df   }|ddd f   }| |      }|| z  }n| }|||z  }n|}dt        j                  |dd      z
  }ni| | ng d}t        j                  |t         j                        }||nd}t        j                  |t         j                        }dt        |d d       z
  }|||fS )N)r   r   r   r   r   rF   rG   rH   rI   r9   )NNr   r   r	   rJ   .r4   rM   T)rL   keepdims)
r"   rN   r:   r?   rO   r    r!   reshapenewaxismax)	r   r   r   specularTextureglossinessTexturer'   
glossinessr(   rT   s	           r0   get_specular_glossinessz0specular_to_pbr.<locals>.get_specular_glossiness   st    !,N.

C#"88%5$6bjjI %0(--6,E,M,Me,T)*//69,E,M,Mf,U)(*1J(Ke(S%1;.O.,223q86O6W6W-33A6-33A67 "3
 +00496OO7 "3 +0049";C!G"D*0049";C!G"D$=c1Q3h$G!*0049";C!G"D$=c12g$F!*":?"K*^;) ,.1AA
-
*-xbSW0X*X')7)C~Hxx

;H-=-I)sJ*BJJ?J*-HRaL0A*A'%@@@r2   c              3   j   K   | ]*  }t        j                  |   j                  |          , y wN)rZ   size).0ir   r   s     r0   	<genexpr>z"specular_to_pbr.<locals>.<genexpr>   s7      
 ##A&(A(F(Fq(IJs   03r   r   r	   c                     | j                         }|j                  d   }|dk(  s|dk(  r|dz  }t        |dd|f         |dd|f<   |S )z
        Wrapper for srgb2lin that converts color values from sRGB to linear.
        If texture has 2 or 4 channels, the last channel (alpha) is left unchanged.
        rJ   rM   r   r	   .N)copyr!   r   textureresultcolor_channelss      r0   rT   z1specular_to_pbr.<locals>.convert_texture_srgb2lin   sa    
 b)Q.A"5aN'5fS/>/=Q6R'SsO^O#$r2   c                     | j                         }|j                  d   }|dk(  s|dk(  r|dz  }t        |dd|f         |dd|f<   |S )z
        Wrapper for lin2srgb that converts color values from linear to sRGB.
        If texture has 2 or 4 channels, the last channel (alpha) is left unchanged.
        rJ   rM   r   r	   .N)rf   r!   r
   rg   s      r0   convert_texture_lin2srgbz1specular_to_pbr.<locals>.convert_texture_lin2srgb  sa     b)Q.A"5aN'5fS/>/=Q6R'SsO^O#$r2   .r4   r   r   )rM   rJ   )r4   rM   ).rJ   r   rK   zunable to get opacityT)exc_inforG   rI   )r?   metallicRoughnessTexturemetallicFactorroughnessFactorr`   )r   r   r   r   debugdictr"   rN   r:   tuplerangera   resizer%   r#   r!   appendr    dstackfullprodrX   rP   BaseExceptionerrorrB   tile
zeros_like)r   r   r   r   r   kwargsri   r1   r7   r@   rD   rU   r^   	max_shaperl   r&   r'   r]   r(   r-   diffuse_rgbbase_color_from_diffusebase_color_from_specularmm
base_coloropacitydimrT   r.   r/   s     ``                       @@@r0   specular_to_pbrr      s   T %)*		NOnd+)7F%&$(5F$%((#5RZZHG.I-^EAN !&?&K 
1X
 
	
 "il2""1%15+229=N%**1-1=(--a0IaL@(A(H(H(S% -8G8O(*C95Hj5  ) *#H
 h

+88HBJJ7#rr'"K)#$Q''	)
''3>GT
2	3
 !)+>#.+Q Qbggh..  
H	B..#(>U1UUJS#.J:==D bkG4'  YYz7;
Z%%&!+ &&YY"BQ 0':BBCFCPQFTUCVW
 ]]2!#g&GWY5G(HrRJ F
:q %*$Z0%++B/14%&&
!"
 %/$5$5$7 !
8>>Q#j&6&6"7!";z A%hnnQ.?PQARTU-VWJx~~!#wwx**:*:1*=z?O?OPQ?RTU)VWH .3NNx(#
*:HEB 	.
)* $' $' !
 M $-X#6 $-cJ.>$? !MA  :		)D99:s   C+R  R+*R+)NNNNN)numpyr"   	constantsr   
exceptionsr   typedr   r   r   colorr
   r   	PIL.Imager   r   rz   Err   r    r2   r0   <module>r      s      ) / / 1$* +/)-37(,)-PY'Pv&P  (0P W%	P
 I&P 
P  $QE #I$s   A A1A,,A1