
    Ti	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 n(# e$ r Z ee          Z ee          ZY dZ[ndZ[ww xY w	 	 	 	 	 dd	e	e         d
e	e         de	d         de	d         de	e         defdZdS )    N   )log)ExceptionWrapper)	ArrayLikeNumberOptional   )linear_to_srgbsrgb_to_linear)Image	fromarrayspecularFactorglossinessFactorspecularGlossinessTexturer   diffuseTexturediffuseFactorreturnc           
      	   t          t          t                    r9t          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         k    sj        d         |d         k    r                    |          j        d         |d         k    sj        d         |d         k    r                    |          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    rl|j        }t          j        |t          j        t          j        |dd                   |                              |d         |d         df          f          }n7|j        d         dk    r&|d         }t          j        ||d         gd          }n&# t.          $ r t          j        dd !           Y nw xY wi }t#          |j                  dk    r- |	 ||          |j        d         dk    rd"nd#$          |d<   n|                                |d<   t#          |j                  dk    st#          |j                  dk    rt#          |j                  dk    r.t          j        ||j        d         |j        d         df          }t#          |j                  dk    r.t          j        ||j        d         |j        d         df          } |	t          j        t          j        |          d|z
  |gd          d"$          |d%<   d|d&<   d|d'<   n |
|          |d&<    |
d|z
            |d'<   |S ))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                 2   t          |t                    r|d         k     rdS 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
           N/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trimesh/visual/gloss.pysolve_metallicz'specular_to_pbr.<locals>.solve_metallicE   s=   h&& 	86I!6L+L+L3w}""i(Gx~!##	*H"11S;Nq;Q5QR'**+ 	

  "X-EC!GaKGAw%%7QBOa8#sCCh
++ 	>:=HX 3A 667    c                 n    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\   s6    wrvc#rr'la/1F1F1FGGHHHr2   c                    t          | t                    r| S | j        t          j        k    s| j        t          j        k    r6t          j        | dd          dz                      t          j                  } t          |           S )Nr   r        o@)
r   r   r   r"   float32float64r#   astypeuint8r   )imgmodes     r0   toPILzspecular_to_pbr.<locals>.toPIL_   sj    c5!! 	J9
""ci2:&=&=73S))E199"(CCC~~r2   c                     t          | t                    r| S t          | t          j                  r t	          | j                  dk    r| d         S |                                 S )Nr	   r   )r   r   r"   r%   r    r!   tolist)vals    r0   	get_floatz"specular_to_pbr.<locals>.get_floatf   sV    c5!! 	Jc2:&& 	3sy>>Q+>+>q6Mzz||r2   c           	          | | ng d} t          j        | t           j                  } ||j        dk    r|                    d          }n |j        dk    r|                    d          }t          j        |          dz  } |          }t          |j                  dk    r|d	         }|j        d
         dk    r|| z  }n6|j        d
         dk    rZ|dddf         }|dd df         | z  }| j        d
         dk    rt          j        ||gd
          }n|dd
d fxx         |z  cc<   n|j        d
         | j        d
         k    r|| z  }n|j        d
         dk    rI| j        d
         dk    r8t          j        |t          j        |dd df                   gd
          | z  }nOt          j
        d| j         d|j         z              n(| | 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   *6MM<P<P<P 	 bjAAA%"e++!/!7!7!>!>$..!/!7!7!?!?h~..6G /.w77G7=!!Q&&!),}R A%%!M1r"a''QqS)!#rr'*]: &r*a// ngu-=BGGGGGCH%%%.%%%%r"m&9"&===!M1r"a''M,?,Cq,H,HNGR\'#rr':J-K-K#LSUVVV#$ 
 U&,BB7=BBC   
 (5'@mmlllGhwbj999Gr2   c                 j   | g d} t          j        | t           j                  } |d}t          j        |gt           j                  }|x|j        dk    r|                    d          }n |j        dk    r|                    d          }t          j        |          dz  }d	\  }}t          |j                  d
k    r0|                    |j        d         |j        d         d          x}}n|j        d         dk    r|dt           j        f         x}}nq|j        d         dk    r|dd df         }nS|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
  }nh| | 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   s    !,__N.
CCC#"8%5$6bjIII %0(-66,E,M,Me,T,T))*/699,E,M,Mf,U,U)(*1J(K(Ke(S%1;.O.,233q886O6W6W-3A6-3A67 7 "3"3
 +04996OO7 "3"3 +0499";C!G"D*0499";C!G"D$=c1Q3h$G!!*0499";C!G"D$=c122g$F!*":":?"K"K*^;) ,.1AA

-
*-xbSW0X0X0X*X'')7)C~~Hx
;;;H-=-I))sJ*BJ???J*-HRaRL0A0A*A'%@@@r2   c              3   d   K   | ]*}t          j        |         j        |                   V  +d S N)rZ   size).0ir   r   s     r0   	<genexpr>z"specular_to_pbr.<locals>.<genexpr>   sR       
 
 #A&(A(Fq(IJJ
 
 
 
 
 
r2   r   r   r	   c                     |                                  }|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   sj    
 b)Q.A"5"5aN'5fS/>/=Q6R'S'SsO^O#$r2   c                     |                                  }|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  sj     b)Q.A"5"5aN'5fS/>/=Q6R'S'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      sE   T %)** 	NOOOnd++ 	8)7F%&$(5F$%(#5#5#5RZHHHG     .I I I     - - - - -^EA EA EA EA EAN !&?&K 
 
 
 
 
1XX
 
 
 
 
	
 "il22"1%155+229==N%*1-1==(-a0IaL@@(A(H(H(S(S%     k-88G8O8O(*C9 95Hj5 ~  ))  **# H
 h
++ 88HBJ777#rr'"K)#$Q''	)
'3>GT
2
2	3
 !)+>#.+Q Qbgh...  
H	B..#(>U1UUJS#..J:=D  bkG4''  Yz7;;

Z%&&!++ &Y"BQB 0 0'::BBCFCPQFTUCVWW 
 ]2!##g&GWY5G(HrRRRJ : : :	)D999999: F
:q  %*U$$Z00%+B/144%%&&
 &
 &
!""
 %/$5$5$7$7 !
8>Q#j&6"7"7!";";z  A%%hnQ.?PQARTU-VWWJx~!##wx**:1*=z?OPQ?RTU)VWWH .3UNx((#
*:HEB   	.
 .
 .
)* $' $' !!#,9X#6#6 $-IcJ.>$?$? !Ms   C0L= = M M )NNNNN)numpyr"   	constantsr   
exceptionsr   typedr   r   r   colorr
   r   	PIL.Imager   r   rz   Err   r    r2   r0   <module>r      sf             ) ) ) ) ) ) / / / / / / / / / / 1 1 1 1 1 1 1 1$********* $ $ $QE  ##IIIIII$ +/)-37(,)-P PY'Pv&P  (0P W%	P
 I&P 
P P P P P Ps   - AAA