§
    )MÂjüT  ã                  óL  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ ddlZddlZddlmZmZmZmZ ddlZddlmZ ddlZ ee¦  «                             ¦   «         j        j        Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         edz  dz  d	z  d
z  dz  dz  Zedz  dz  d	z  d
z  dz  dz  Z edz  dz  d	z  d
z  dz  dz  Z!d+d„Z"d,d„Z#d-d.d„Z$	 	 d/d0d"„Z%d1d%„Z& G d&„ d'¦  «        Z'd2d)„Z(e)d*k    r ej*         e(¦   «         ¦  «         dS dS )3a„  
Empirical Adversarial Stress Testing Suite:
Tangent-Space Normal Maps, Dynamic Lighting, and ASTC Mobile Containers.

Target Assets:
- client/cocos/assets/resources/vfx/savage_primal_skills_vfx_atlas_normal.png
- client/cocos/assets/resources/vfx/savage_primal_skills_vfx_atlas.astc
- client/cocos/assets/resources/shaders/sprite_pbr.effect
- client/assets/shaders/SpritePBRNormal.metal
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚTuple)ÚImageÚclientÚcocosÚassetsÚ	resourcesÚvfxz)savage_primal_skills_vfx_atlas_normal.pngz"savage_primal_skills_vfx_atlas.pngz#savage_primal_skills_vfx_atlas.astcÚreturnúATuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]c                 óp  — t           j        }  | ¦   «         }|s²t          j        dt           › �¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }t          j        t           ¦  «        5 }t          j        |                     d¦  «        ¦  «        }ddd¦  «         n# 1 swxY w Y   |dd…dd…df         }|dk    }t          j        }  | |¦  «        }|sèt          j        d	¦  «        d
z   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        | ¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx} }||         dd…dd…f                              t          j        ¦  «        }	|	dd…df         dz  dz  dz
  }
|	dd…df         dz  dz  dz
  }|	dd…df         dz  dz  dz
  }|||
||fS )z�
    Loads normal map and unpacks normal vectors [-1.0, 1.0] for non-transparent pixels.
    Returns (rgba, non_trans_mask, nx, ny, nz).
    zNormal map file not found: úC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}ÚNORMAL_MAP_PATH©Úpy0Úpy2Úpy4NÚRGBAé   r   z-No non-transparent pixels found in normal mapúG
>assert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.any
}(%(py3)s)
}ÚnpÚnon_trans_mask©r   r   Úpy3Úpy5ç     ào@ç       @ç      ð?é   é   )r   ÚexistsÚ
@pytest_arÚ_format_assertmsgÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr	   Úopenr   ÚarrayÚconvertÚanyÚastypeÚfloat64)Ú@py_assert1Ú@py_assert3Ú@py_format5ÚimgÚrgbaÚalphar   Ú@py_assert4Ú@py_format6Ú
rgb_opaqueÚnxÚnyÚnzs                ú@C:\Projects\FreeExile\tests\challenger_normal_lighting_stress.pyÚload_normal_map_datarA   &   s   € õ
 Ô!ÐTÐ!Ð!Ñ#Ô#ÐTÐ#ÐTÕTÔTÐ%TÅ?Ð%TÐ%TÑTÔTÐTÑTÐTÕTÔTÑTÔTÐTÐTÕTÔT�?ÑTÔTÐTÕTÔT�?ÑTÔTÐTÐTÕTÔTÐ!ÑTÔTÕTÔTÐ#ÑTÔTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÝ	Œ•OÑ	$Ô	$ð -¨ÝŒx˜Ÿš FÑ+Ô+Ñ,Ô,ˆð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð ����A�A�A�q�ŒM€EØ˜Q’Y€NÝŒ6ÐRˆ6ˆ6�.Ñ!Ô!ÐRÐ!ÐRÕRÔRÐ#RÑRÔRÐRÑRÐRÕRÔRÑRÔRÐRÐRÕRÔR�2ÑRÔRÐRÕRÔR�2ÑRÔRÐRÐRÕRÔRˆ6ÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔR�.ÑRÔRÐRÕRÔR�.ÑRÔRÐRÐRÕRÔRÐ!ÑRÔRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRà�nÔ% a a a¨¨!¨ eÔ,×3Ò3µB´JÑ?Ô?€Jð �Q�Q�Q˜�TÔ
˜UÑ
" cÑ	)¨CÑ	/€BØ
�Q�Q�Q˜�TÔ
˜UÑ
" cÑ	)¨CÑ	/€BØ
�Q�Q�Q˜�TÔ
˜UÑ
" cÑ	)¨CÑ	/€Bà�  R¨Ð+Ð+s   Ã((DÄD Ä#D r=   ú
np.ndarrayr>   r?   c                óH   — t          j        | | z  ||z  z   ||z  z   ¦  «        S )z9Computes Euclidean length |N| = sqrt(Nx^2 + Ny^2 + Nz^2).)r   Úsqrt)r=   r>   r?   s      r@   Úcompute_vector_lengthsrE   =   s(   € åŒ7�2˜‘7˜R "™WÑ$ r¨B¡wÑ.Ñ/Ô/Ð/ó    çoƒÀÊ¡A@Úelevation_degÚfloatúList[Tuple[str, np.ndarray]]c                óÚ  — t          j        | ¦  «        }t          j        |¦  «        }t          j        |¦  «        }g d¢}g }|D ]¥\  }}t          j        |¦  «        }t          j        |¦  «        |z  }	t          j        |¦  «        |z  }
|}t	          j        |	|
|gt          j        ¬¦  «        }|t          j                             |¦  «        z  }| 	                    ||f¦  «         Œ¦|S )zÑ
    Generates 8 dynamic directional lights spaced 45 degrees apart with an isometric elevation angle.
    Directions correspond to 8 cardinal/intercardinal compass points:
    E, NE, N, NW, W, SW, S, SE.
    ))u
   East (0Â°)ç        )u   North-East (45Â°)g     €F@)u   North (90Â°)g     €V@)u   North-West (135Â°)g     à`@)u   West (180Â°)g     €f@)u   South-West (225Â°)g      l@)u   South (270Â°)g     àp@)u   South-East (315Â°)g     °s@©Údtype)
ÚmathÚradiansÚcosÚsinr   r/   r3   ÚlinalgÚnormÚappend)rH   ÚphiÚcos_phiÚsin_phiÚ
directionsÚlightsÚlabelÚdegÚthetaÚlxÚlyÚlzÚvecs                r@   Úcompute_8_directional_lightsrb   B   sâ   € õ Œ,�}Ñ
%Ô
%€CÝŒh�s‰mŒm€GÝŒh�s‰mŒm€Gð	ð 	ð 	€Jð €FØ ð $ð $‰
ˆˆsÝ”˜SÑ!Ô!ˆÝŒX�e‰_Œ_˜wÑ&ˆÝŒX�e‰_Œ_˜wÑ&ˆØˆÝŒh˜˜B �|­2¬:Ð6Ñ6Ô6ˆØ�rŒy�~Š~˜cÑ"Ô"Ñ"ˆØ�Š�u˜c�lÑ#Ô#Ð#Ð#à€MrF   ç333333ã?Ú	light_dirÚ	roughnessÚshader_modelÚstrúDict[str, Any]c                ó   — t          j        | ||gd¬¦  «        }t           j                             |dd¬¦  «        }|t          j        |d¦  «        z  }|t           j                             |¦  «        z  }	t          j        g d¢t           j        ¬¦  «        }
|	|
z   t           j                             |	|
z   ¦  «        z  }t          j        t          j        ||	z  d¬¦  «        d¦  «        }t          j        t          j        ||z  d¬¦  «        d¦  «        }|d	k    rd
dd|z
  z  dz   z  }nd|z
  dz  dz   }||z  d|z
  z  }||t          t          j	        |¦  «        ¦  «        t          t          j
        |¦  «        ¦  «        t          t          j        |¦  «        ¦  «        t          t          j	        |¦  «        ¦  «        t          t          j
        |¦  «        ¦  «        t          t          j        |¦  «        ¦  «        t          t          j        |dk     ¦  «        ¦  «        t          t          j        |dk     ¦  «        ¦  «        t          t          j        t          j        |¦  «        ¦  «        p%t          j        t          j        |¦  «        ¦  «        ¦  «        t          t          j        t          j        |¦  «        ¦  «        p%t          j        t          j        |¦  «        ¦  «        ¦  «        dœS )z¢
    Computes Blinn-Phong diffuse and specular illumination according to:
    - Cocos Creator 3.8.x sprite_pbr.effect
    - Apple Metal SpritePBRNormal.metal
    éÿÿÿÿ)ÚaxisT)rk   Úkeepdimsgê-�™—q=)rL   rL   r"   rM   rL   Úmetalr!   g      $@r"   g      P@g       @)ÚndotlÚndothÚdiffuse_minÚdiffuse_maxÚdiffuse_meanÚspecular_minÚspecular_maxÚspecular_meanÚhas_negative_diffuseÚhas_negative_specularÚhas_nansÚhas_infs)r   ÚstackrS   rT   Úmaximumr/   r3   ÚsumrI   ÚminÚmaxÚmeanÚboolr1   ÚisnanÚisinf)r=   r>   r?   rd   re   rf   ÚnormalsÚ	norm_lensÚn_unitÚLÚVÚHrn   ro   Ú
spec_powerÚspeculars                   r@   Úevaluate_blinn_phong_lightingr‹   d   se  € õ Œh˜˜B �|¨"Ð-Ñ-Ô-€GÝ”	—’˜w¨R¸$�Ñ?Ô?€IØ•r”z )¨UÑ3Ô3Ñ3€Fà•B”I—N’N 9Ñ-Ô-Ñ-€AÝ
Œ���­¬
Ð3Ñ3Ô3€AØ	
ˆQ‰•"”)—.’.  Q¡Ñ'Ô'Ñ'€Aõ ŒJ•r”v˜f q™j¨rÐ2Ñ2Ô2°CÑ8Ô8€Eõ ŒJ•r”v˜f q™j¨rÐ2Ñ2Ô2°CÑ8Ô8€Eà�wÒÐà˜T S¨9¡_Ñ5¸Ñ;Ñ<ˆ
ˆ
ð ˜I‘o¨Ñ-°Ñ3ˆ
à˜Ñ#¨¨i©Ñ8€Hð ØÝ�RœV E™]œ]Ñ+Ô+Ý�RœV E™]œ]Ñ+Ô+Ý�bœg e™nœnÑ-Ô-Ý�bœf XÑ.Ô.Ñ/Ô/Ý�bœf XÑ.Ô.Ñ/Ô/Ý�rœw xÑ0Ô0Ñ1Ô1Ý $¥R¤V¨E°CªKÑ%8Ô%8Ñ 9Ô 9Ý!%¥b¤f¨X¸ª^Ñ&<Ô&<Ñ!=Ô!=Ý�œ¥¤¨¡¤Ñ0Ô0ÐNµB´F½2¼8ÀHÑ;MÔ;MÑ4NÔ4NÑOÔOÝ�œ¥¤¨¡¤Ñ0Ô0ÐNµB´F½2¼8ÀHÑ;MÔ;MÑ4NÔ4NÑOÔOðð ð rF   Ú	astc_pathr   c                óH
  — | j         } |¦   «         }|s£t          j        d| › �¦  «        dz   dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}|  	                    ¦   «         }t          |¦  «        }|dd…         }t          |¦  «        }d}||k    }	|	�st          j        d|	fd||f¦  «        d	t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }
t          j        dt          |¦  «        › d�¦  «        dz   d|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}|dd…         }|t          g d¢¦  «        k    }|d         }|d         }|d         }t                               |dd…         d¬¦  «        }t                               |dd…         d¬¦  «        }t                               |dd…         d¬¦  «        }||z   dz
  |z  }||z   dz
  |z  }||z  |pdz  }|dz  }d|z   }|dd…         }t          |¦  «        }||k    }	|	�sEt          j        d|	fd||f¦  «        d	t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        dt          |¦  «        › d|› �¦  «        d z   d!|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}	d"}d"}d"}t          |¦  «        D ]‰}||dz  |dz   dz  …         } t                               | dd#…         d¬¦  «        }!|!d$z  d%k    }"|"r|dz  }|!d&z	  dz  dk    }#|#r|dz  }t!          j        d'| d#d…         ¦  «        \  }$}%}&}'|'d"k    r|dz  }ŒŠ|||                     ¦   «         ||||f|||f|||r||z  nd(||d)œS )*zU
    Parses canonical 16-byte header and all 16-byte blocks of an ASTC 4x4 file.
    zASTC file not found: r   rŒ   r   Né   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚheader©r   Úpy1r   Úpy6zASTC header too short: ú bytesú
>assert %(py8)sÚpy8é   )é   é«   é¡   é\   é   é   é   é
   Úlittle)Ú	byteorderé   r#   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sÚpayloadÚexpected_payload)r   r•   r   r   zPayload size mismatch: z vs z
>assert %(py7)sÚpy7r   é   iÿ  iü  é	   z<HHHHrL   )Ú	file_sizeÚexpected_total_sizeÚ	magic_hexÚmagic_validÚ
block_dimsÚtex_dimsÚtotal_blocksÚvoid_extent_countÚvoid_extent_ratioÚhdr_mode_countÚnon_zero_alpha_blocks)r%   r&   r'   r(   r)   r*   r+   r,   r-   Ú
read_bytesr’   Ú_call_reprcompareÚbytesÚintÚ
from_bytesÚrangeÚstructÚunpackÚhex)(rŒ   r4   r5   r6   Úraw_datar«   r“   Ú@py_assert2Ú@py_assert5r:   Ú@py_format7Ú@py_format9Úmagicr®   Úblock_xÚblock_yÚblock_zÚwidthÚheightÚdepthÚblocks_xÚblocks_yr±   r§   r¬   r¦   r;   Ú@py_format8r²   rµ   r´   ÚiÚblockÚlower64Úis_void_extentÚis_hdrÚr16Úg16Úb16Úa16s(                                           r@   Úparse_and_validate_astc_filer×   ˜   sÈ  € ð ÔÐBÐÐÑÔÐBÐÐBÕBÔBÐB°yÐBÐBÑBÔBÐBÑBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆ9ÑBÔBÐBÕBÔBˆ9ÑBÔBÐBÐBÕBÔBÐÑBÔBÕBÔBÐÑBÔBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBØ×#Ò#Ñ%Ô%€HÝ�H‘”€Ià�c�r�cŒ]€FÝˆv‰;Œ;ÐK˜"ÐKˆ;˜"ÒÐKÐKÑKÕKÔKÐKÐKÐKÐKˆ;˜"ÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK�3ÑKÔKÐKÕKÔK�3ÑKÔKÐKÐKÐKÕKÔKÑKÔKÐKÐKÕKÔKˆvÑKÔKÐKÕKÔKˆvÑKÔKÐKÐKÕKÔKˆ;ÑKÔKÕKÔK˜"ÑKÔKÐKÐKÑKÐKÕKÔKÐK½¸F¹¼ÐKÐKÐKÑKÔKÐKÑKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKà�2�A�2ŒJ€EØ�EÐ":Ð":Ð":Ñ;Ô;Ò;€Kà�QŒi€GØ�QŒi€GØ�QŒi€Gå�NŠN˜6 ! B $œ<°8ˆNÑ<Ô<€EÝ�^Š^˜F 2 b 5œM°Xˆ^Ñ>Ô>€FÝ�NŠN˜6 " R %œ=°HˆNÑ=Ô=€Eà˜‘ !Ñ#¨Ñ/€HØ˜Ñ  1Ñ$¨Ñ0€HØ˜hÑ&¨%¨*°1Ñ5€LØ# bÑ(ÐØÐ/Ñ/Ðð �r�s�sŒm€GÝˆw‰<Œ<Ðkˆ<Ð+Ò+ÐkÐkÑkÕkÔkÐkÐkÐkÐkˆ<Ð+ÐkÑkÔkÐkÕkÔkÑkÔkÐkÐkÕkÔk�3ÑkÔkÐkÕkÔk�3ÑkÔkÐkÐkÐkÕkÔkÑkÔkÐkÐkÕkÔkˆwÑkÔkÐkÕkÔkˆwÑkÔkÐkÐkÕkÔkˆ<ÑkÔkÐkÕkÔkÑkÔkÐkÐkÕkÔkÐ+ÑkÔkÐkÕkÔkÐ+ÑkÔkÐkÐkÐkÐkÑkÐkÕkÔkÐ-kÅsÈ7Á|Ä|Ð-kÐ-kÐYiÐ-kÐ-kÑkÔkÐkÑkÐkÐkÐkÑkÐkÕkÕkÔkÐkÑkÔkÑkÔkÐkÐkÐkÐkÐkàÐØÐØ€Nå�<Ñ Ô ð 'ð 'ˆØ˜˜B™ ! a¡%¨2¡Ð-Ô.ˆÝ—.’.  r¨ r¤°h�.Ñ?Ô?ˆà" U™?¨uÒ4ˆØð 	$Ø Ñ"ÐØ !‘| qÑ(¨QÒ.ˆFØð $Ø !Ñ#�å#œ]¨7°E¸!¸B¸$´KÑ@Ô@ÑˆˆS�#�sØ�Š7ˆ7Ø! QÑ&Ð!øð Ø2Ø—Y’Y‘[”[Ø"Ø ¨Ð1Ø˜F EÐ*Ø$Ø.ØAMÐVÐ.°Ñ=Ð=ÐSVØ(Ø!6ðð ð rF   c                  óB   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd	„Z	d
S )Ú"TestChallengerNormalLightingStresszM
    Adversarial Stress Test Suite executing verification code directly.
    r   ÚNonec           
     ó>  — t          ¦   «         \  }}}}}t          |¦  «        }d}||k    }|s¬t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d¦  «        dz   d|iz  }	t          t          j
        |	¦  «        ¦  «        ‚d	x}}t          j        } ||¦  «        }
|
j        } |¦   «         }| }|�st          j        d
¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}
x}x}}t          j        } ||¦  «        }
|
j        } |¦   «         }| }|�st          j        d¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}
x}x}}t          j        } ||¦  «        }
|
j        } |¦   «         }| }|�st          j        d¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}
x}x}}t          j        } ||¦  «        }
|
j        } |¦   «         }| }|�st          j        d¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}
x}x}}t          j        } ||¦  «        }
|
j        } |¦   «         }| }|�st          j        d¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}
x}x}}t          j        } ||¦  «        }
|
j        } |¦   «         }| }|�st          j        d¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}
x}x}}t          |||¦  «        }t!          t          j        |¦  «        ¦  «        }t!          t          j        |¦  «        ¦  «        }t!          t          j        |¦  «        ¦  «        }t!          t          j        |¦  «        ¦  «        }t          j        |dk     |dk    z  ¦  «        }d}||k    }|sºt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        |› d|d›d|d›d|d›�¦  «        dz   d|iz  }	t          t          j
        |	¦  «        ¦  «        ‚d	x}}d}||k    }d}||k    }|r|sÆt          j        d ||fd!|||f¦  «        t          j        |¦  «        d"t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"t          j        |¦  «        d#œz  }t          j        d$|d›d%�¦  «        d&z   d'|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}x}}t!          t          j        |¦  «        ¦  «        }t!          t          j        |¦  «        ¦  «        }t!          t          j        |¦  «        ¦  «        }t          j        |d(k    ¦  «        }d}||k    }|s´t          j        d|fd||f¦  «        d)t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd)t          j        |¦  «        dœz  }t          j        d*|› d+|d›d,�¦  «        dz   d|iz  }	t          t          j
        |	¦  «        ¦  «        ‚d	x}}d	S )-z¿
        Evaluates normal vectors across all non-transparent pixels:
        - Unit length |N| within 1.0 +/- 0.08
        - No NaNs, no Infs
        - No inverted normals (Nz > 0.0)
        r   ©ú>)z%(py0)s > %(py3)sÚpixel_count©r   r   zNo non-transparent pixels foundú
>assert %(py5)sr   NzNaN found in Nxz}
>assert not %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.isnan
}(%(py3)s)
}.any
}()
}r   r=   )r   r   r   r   r¨   Úpy9zNaN found in Nyr>   zNaN found in Nzr?   zInfinity found in Nxz}
>assert not %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.isinf
}(%(py3)s)
}.any
}()
}zInfinity found in NyzInfinity found in Nzçq=
×£pí?çHáz®Gñ?r�   )z%(py0)s == %(py3)sÚout_of_tol_countz: normal vectors have length outside [0.92, 1.08]. Range: [z.4fú, z	], Mean: ©ú<=rç   ©z%(py1)s <= %(py4)sz%(py4)s <= %(py6)sÚmean_len©r•   r   r–   zMean vector length z is outside [0.92, 1.08]r˜   r™   rL   Úinverted_countzFound z* inverted normals with Nz <= 0.0. Min Nz: z-. Tangent normals must face outward (Nz > 0).)rA   r’   r&   r·   r(   r)   r*   r+   r'   r,   r-   r   r�   r1   r‚   rE   rI   r}   r~   r   Ústdr|   )ÚselfÚ_r=   r>   r?   rÞ   rÀ   r4   Ú@py_format4r;   r:   Ú@py_assert6Ú@py_assert8Ú@py_assert10Ú@py_format11ÚlengthsÚmin_lenÚmax_lenré   Ústd_lenrä   Ú@py_assert0rÁ   r5   rÂ   rÃ   Úmin_nzÚmax_nzÚmean_nzrë   s                                 r@   Ú)test_normal_vector_metrics_and_invariantszLTestChallengerNormalLightingStress.test_normal_vector_metrics_and_invariantsã   s—  € õ 0Ñ1Ô1Ñˆˆ1ˆb�"�bÝ˜"‘g”gˆàÐAˆ{˜QŠÐAÐAÐAÕAÔAÐAÐAÐAÐAˆ{˜QÐAÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔAˆ{ÑAÔAÐAÕAÔAˆ{ÑAÔAÐAÐAÕAÔA˜QÑAÔAÐAÐAÑAÐAÕAÔAÐ AÑAÔAÐAÑAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAõ ”8Ð8�8�8˜B‘<”<Ð8�<Ô#Ð8Ð#Ð#Ñ%Ô%Ð8Ð%Ð%Ð8Ð%Ñ8Õ8Ô8Ð'8Ñ8Ô8Ð8Ñ8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8•2Ñ8Ô8Ð8Õ8Ô8•2Ñ8Ô8Ð8Ð8Õ8Ô8�8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8˜BÑ8Ô8Ð8Õ8Ô8˜BÑ8Ô8Ð8Ð8Õ8Ô8�<Ñ8Ô8Õ8Ô8Ð#Ñ8Ô8Õ8Ô8Ð%Ñ8Ô8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ý”8Ð8�8�8˜B‘<”<Ð8�<Ô#Ð8Ð#Ð#Ñ%Ô%Ð8Ð%Ð%Ð8Ð%Ñ8Õ8Ô8Ð'8Ñ8Ô8Ð8Ñ8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8•2Ñ8Ô8Ð8Õ8Ô8•2Ñ8Ô8Ð8Ð8Õ8Ô8�8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8˜BÑ8Ô8Ð8Õ8Ô8˜BÑ8Ô8Ð8Ð8Õ8Ô8�<Ñ8Ô8Õ8Ô8Ð#Ñ8Ô8Õ8Ô8Ð%Ñ8Ô8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ý”8Ð8�8�8˜B‘<”<Ð8�<Ô#Ð8Ð#Ð#Ñ%Ô%Ð8Ð%Ð%Ð8Ð%Ñ8Õ8Ô8Ð'8Ñ8Ô8Ð8Ñ8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8•2Ñ8Ô8Ð8Õ8Ô8•2Ñ8Ô8Ð8Ð8Õ8Ô8�8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8˜BÑ8Ô8Ð8Õ8Ô8˜BÑ8Ô8Ð8Ð8Õ8Ô8�<Ñ8Ô8Õ8Ô8Ð#Ñ8Ô8Õ8Ô8Ð%Ñ8Ô8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ý”8Ð=�8�8˜B‘<”<Ð=�<Ô#Ð=Ð#Ð#Ñ%Ô%Ð=Ð%Ð%Ð=Ð%Ñ=Õ=Ô=Ð'=Ñ=Ô=Ð=Ñ=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=•2Ñ=Ô=Ð=Õ=Ô=•2Ñ=Ô=Ð=Ð=Õ=Ô=�8Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=˜BÑ=Ô=Ð=Õ=Ô=˜BÑ=Ô=Ð=Ð=Õ=Ô=�<Ñ=Ô=Õ=Ô=Ð#Ñ=Ô=Õ=Ô=Ð%Ñ=Ô=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ý”8Ð=�8�8˜B‘<”<Ð=�<Ô#Ð=Ð#Ð#Ñ%Ô%Ð=Ð%Ð%Ð=Ð%Ñ=Õ=Ô=Ð'=Ñ=Ô=Ð=Ñ=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=•2Ñ=Ô=Ð=Õ=Ô=•2Ñ=Ô=Ð=Ð=Õ=Ô=�8Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=˜BÑ=Ô=Ð=Õ=Ô=˜BÑ=Ô=Ð=Ð=Õ=Ô=�<Ñ=Ô=Õ=Ô=Ð#Ñ=Ô=Õ=Ô=Ð%Ñ=Ô=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ý”8Ð=�8�8˜B‘<”<Ð=�<Ô#Ð=Ð#Ð#Ñ%Ô%Ð=Ð%Ð%Ð=Ð%Ñ=Õ=Ô=Ð'=Ñ=Ô=Ð=Ñ=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=•2Ñ=Ô=Ð=Õ=Ô=•2Ñ=Ô=Ð=Ð=Õ=Ô=�8Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=˜BÑ=Ô=Ð=Õ=Ô=˜BÑ=Ô=Ð=Ð=Õ=Ô=�<Ñ=Ô=Õ=Ô=Ð#Ñ=Ô=Õ=Ô=Ð%Ñ=Ô=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=õ )¨¨R°Ñ4Ô4ˆÝ�œ˜w™œÑ(Ô(ˆÝ�œ˜w™œÑ(Ô(ˆÝ�œ Ñ)Ô)Ñ*Ô*ˆÝ�œ˜w™œÑ(Ô(ˆõ œ6 7¨T¢>°gÀ²nÑ"EÑFÔFÐØ#$ð 	
Ð 1Ò$ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð 1ð 	
ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð  ñ 	
ô 	
ð 	
õ 	
ô 
ð  ñ 	
ô 	
ð 	
ð 	
õ 	
ô 
ð $%ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð  ð Kð KØÐJðKð KØ&-ÐJðKð KØ<DÐJðKð Kñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð Ðeˆt�xÒ'Ðe 4Ðe�x 4Ò'ÐeÐeÐeÐeÐeÕeÔeÐeÐeÐeÐeÐeˆt�x 4ÐeÑeÔeÕeÔeˆtÑeÔeÐeÕeÔeÑeÔeÐeÐeÕeÔe�xÑeÔeÐeÕeÔe�xÑeÔeÐeÐeÕeÔe 4ÑeÔeÐeÐeÑeÐeÕeÔeÐ)e¸xÐ)eÐ)eÐ)eÐ)eÑeÔeÐeÑeÐeÐeÐeÑeÐeÕeÕeÔeÐeÑeÔeÑeÔeÐeÐeÐeÐeÐeÐeÐeÐeÐeõ •r”v˜b‘z”zÑ"Ô"ˆÝ•r”v˜b‘z”zÑ"Ô"ˆÝ�œ ™œÑ$Ô$ˆÝœ  c¢	Ñ*Ô*ˆØ!"ð 	
ˆ~ Ò"ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆ~ ð 	
ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ô 
ð ñ 	
ô 	
ð 	
ð 	
õ 	
ô 
ð "#ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìðQ�^ð Qð QØÐPðQð Qð Qñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
rF   c           	     óÆ	  — t          ¦   «         \  }}}}}t          d¬¦  «        }t          |¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	t          j	        d	t          |¦  «        › �¦  «        d
z   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|D �]�\  }}t          ||||dd¬¦  «        }|d         }| }|sRt          j	        d|› �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }| }|sRt          j	        d|› �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }| }|sRt          j	        d|› �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }| }|sRt          j	        d|› �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }d}||k    }|s„t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j	        d|› �¦  «        d z   d!|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}t          ||||dd"¬¦  «        }|d         }| }|sRt          j	        d#|› �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }| }|sRt          j	        d$|› �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }| }|sRt          j	        d%|› �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}�ŒƒdS )&aC  
        Computes Blinn-Phong specular and diffuse illumination across 8 dynamic light directions.
        Verifies:
        - Diffuse illumination >= 0.0 (no negative light artifacts)
        - Specular illumination >= 0.0
        - No NaNs or Infs
        - Active illumination on illuminated front-facing facets
        rG   ©rH   r©   r�   r‘   r’   rZ   r”   z!Expected 8 light directions, got r˜   r™   Nrc   r   ©re   rf   rv   zNegative diffuse lighting in ú
>assert not %(py1)sr•   rw   zNegative specular lighting in rx   z*NaNs detected in lighting calculation for ry   z*Infs detected in lighting calculation for rq   rL   rÜ   ©z%(py1)s > %(py4)s©r•   r   z$No diffuse light reached surface in ú
>assert %(py6)sr–   rm   z%Negative diffuse lighting (Metal) in z&Negative specular lighting (Metal) in z'NaNs detected in Metal calculation for )rA   rb   r’   r&   r·   r(   r)   r*   r+   r'   r,   r-   r‹   )rí   rî   r=   r>   r?   rZ   rÀ   rÁ   r:   rÂ   rÃ   r[   Úl_vecÚ	res_cocosrø   Ú@py_format3r5   r6   Ú	res_metals                      r@   Ú)test_dynamic_lighting_across_8_directionszLTestChallengerNormalLightingStress.test_dynamic_lighting_across_8_directions  sß  € õ 0Ñ1Ô1Ñˆˆ1ˆb�"�bÝ-¸FÐCÑCÔCˆå�6‰{Œ{ÐR˜aÐRˆ{˜aÒÐRÐRÑRÕRÔRÐRÐRÐRÐRˆ{˜aÐRÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔR�sÑRÔRÐRÕRÔR�sÑRÔRÐRÐRÐRÕRÔRÑRÔRÐRÐRÕRÔR�6ÑRÔRÐRÕRÔR�6ÑRÔRÐRÐRÕRÔRˆ{ÑRÔRÕRÔR˜aÑRÔRÐRÐRÑRÐRÕRÔRÐ!RÅSÈÁ[Ä[Ð!RÐ!RÑRÔRÐRÑRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRÐRÐRà"ð 	`ñ 	`‰LˆE�5Ý5°b¸"¸bÀ%ÐSVÐelÐmÑmÔmˆIØ Ð!7Ô8ÐaÐ8Ð8ÐaÐ8ÐaÕaÔaÐ:aÐZ_Ð:aÐ:aÑaÔaÐaÑaÐaÕaÔaÐ8ÑaÔaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaØ Ð!8Ô9ÐcÐ9Ð9ÐcÐ9ÐcÕcÔcÐ;cÐ\aÐ;cÐ;cÑcÔcÐcÑcÐcÕcÔcÐ9ÑcÔcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcØ  Ô,ÐbÐ,Ð,ÐbÐ,ÐbÕbÔbÐ.bÐ[`Ð.bÐ.bÑbÔbÐbÑbÐbÕbÔbÐ,ÑbÔbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbØ  Ô,ÐbÐ,Ð,ÐbÐ,ÐbÕbÔbÐ.bÐ[`Ð.bÐ.bÑbÔbÐbÑbÐbÕbÔbÐ,ÑbÔbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbØ˜]Ô+Ða¨cÐaÐ+¨cÒ1ÐaÐaÐaÕaÔaÐaÐaÐaÐaÐ+¨cÐaÑaÔaÕaÔaÐ+ÑaÔaÕaÔa¨cÑaÔaÐaÐaÑaÐaÕaÔaÐ3aÐZ_Ð3aÐ3aÑaÔaÐaÑaÐaÐaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaÐaÐaå5°b¸"¸bÀ%ÐSVÐelÐmÑmÔmˆIØ Ð!7Ô8ÐiÐ8Ð8ÐiÐ8ÐiÕiÔiÐ:iÐbgÐ:iÐ:iÑiÔiÐiÑiÐiÕiÔiÐ8ÑiÔiÐiÑiÐiÕiÕiÔiÐiÑiÔiÑiÔiÐiÐiÐiÐiÐiØ Ð!8Ô9ÐkÐ9Ð9ÐkÐ9ÐkÕkÔkÐ;kÐdiÐ;kÐ;kÑkÔkÐkÑkÐkÕkÔkÐ9ÑkÔkÐkÑkÐkÕkÕkÔkÐkÑkÔkÑkÔkÐkÐkÐkÐkÐkØ  Ô,Ð_Ð,Ð,Ð_Ð,Ð_Õ_Ô_Ð._ÐX]Ð._Ð._Ñ_Ô_Ð_Ñ_Ð_Õ_Ô_Ð,Ñ_Ô_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ñ_ð	`ð 	`rF   c                óÈ	  — t          t          ¦  «        }|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚d}|d         }d}||k    }|sŠt          j        d	|fd
||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|d         › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|sŠt          j        d	|fd
||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|d         › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|s‹t          j        d	|fd
||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|d         › d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|s‹t          j        d	|fd
||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|d         › d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|s‹t          j        d	|fd
||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|d         › d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|s�t          j        d	|fd
||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d }||k    }|s‹t          j        d!|fd"||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d#|d         › d$�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )%a&  
        Evaluates the binary file savage_primal_skills_vfx_atlas.astc:
        - 16-byte header parsing
        - Block dimension 4x4x1
        - Dimensions 2048x2048x1
        - Exact byte length equals 16 + 512*512*16 = 4,194,320 bytes
        - Void-extent block patterns validated
        r®   zInvalid ASTC magic: r­   z
>assert %(py1)sr•   Nr¯   ©rš   rš   r#   r�   ©z%(py1)s == %(py4)sr  zInvalid block dims: r  r–   r°   ©é   r  r#   zInvalid texture dims: r«   é @ z
File size z != expected 4,194,320 bytesr±   é   zTotal blocks z != 262,144r²   zVoid-extent blocks r´   r   z.HDR mode unexpectedly enabled in LDR containerrµ   iˆ  rÜ   r  zToo few active content blocks (ú))r×   ÚASTC_CONTAINER_PATHr&   r'   r+   r,   r-   r·   )rí   Úastc_metricsrø   Ú@py_format2r5   rÀ   r6   rÂ   s           r@   Ú1test_astc_container_binary_format_and_void_extentzTTestChallengerNormalLightingStress.test_astc_container_binary_format_and_void_extent+  s9  € õ 4Õ4GÑHÔHˆà˜MÔ*Ð^Ð*Ð^Õ^Ô^Ð,^À<ÐP[ÔC\Ð,^Ð,^Ñ^Ô^Ð^Ñ^Ð^Õ^Ô^Ð*Ñ^Ô^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ø˜LÔ)Ðk¨YÐkÐ)¨YÒ6ÐkÐkÐkÕkÔkÐkÐkÐkÐkÐ)¨YÐkÑkÔkÕkÔkÐ)ÑkÔkÕkÔk¨YÑkÔkÐkÐkÑkÐkÕkÔkÐ8kÈ|Ð\hÔOiÐ8kÐ8kÑkÔkÐkÑkÐkÐkÐkÑkÐkÕkÕkÔkÐkÑkÔkÑkÔkÐkÐkÐkÐkÐkÐkÐkØ˜JÔ'Ðo¨?ÐoÐ'¨?Ò:ÐoÐoÐoÕoÔoÐoÐoÐoÐoÐ'¨?ÐoÑoÔoÕoÔoÐ'ÑoÔoÕoÔo¨?ÑoÔoÐoÐoÑoÐoÕoÔoÐ<oÐUaÐblÔUmÐ<oÐ<oÑoÔoÐoÑoÐoÐoÐoÑoÐoÕoÕoÔoÐoÑoÔoÑoÔoÐoÐoÐoÐoÐoÐoÐoØ˜KÔ(ð 	
¨Gð 	
Ð(¨GÒ3ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð(¨Gð 	
ñ 	
ô 	
õ 	
ä 	ð )ñ 	
ô 	
õ 	
ä 	ð -4ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð Q˜ kÔ2ÐPÐPÐPñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ˜NÔ+Ðp¨vÐpÐ+¨vÒ5ÐpÐpÐpÕpÔpÐpÐpÐpÐpÐ+¨vÐpÑpÔpÕpÔpÐ+ÑpÔpÕpÔp¨vÑpÔpÐpÐpÑpÐpÕpÔpÐ7pÀ|ÐTbÔGcÐ7pÐ7pÐ7pÑpÔpÐpÑpÐpÐpÐpÑpÐpÕpÕpÔpÐpÑpÔpÑpÔpÐpÐpÐpÐpÐpÐpÐpØÐ/Ô0ð 	
°Fð 	
Ð0°FÒ:ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð0°Fð 	
ñ 	
ô 	
õ 	
ä 	ð 1ñ 	
ô 	
õ 	
ä 	ð 5;ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð Q ,Ð/BÔ"CÐPÐPÐPñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð Ð,Ô-Ðd°ÐdÐ-°Ò2ÐdÐdÐdÕdÔdÐdÐdÐdÐdÐ-°ÐdÑdÔdÕdÔdÐ-ÑdÔdÕdÔd°ÑdÔdÐdÐdÑdÐdÕdÔdÐ4dÑdÔdÐdÑdÐdÐdÐdÑdÐdÕdÕdÔdÐdÑdÔdÑdÔdÐdÐdÐdÐdÐdÐdÐdØÐ3Ô4ð 	
°tð 	
Ð4°tÒ;ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð4°tð 	
ñ 	
ô 	
õ 	
ä 	ð 5ñ 	
ô 	
õ 	
ä 	ð 8<ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð W¨lÐ;RÔ.SÐVÐVÐVñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
rF   c           
     ó@	  — t          ¦   «         \  }}}}}t          j        g d¢t          j        ¬¦  «        }t          j        ddd¦  «        D �]O}t          ||||t          |¦  «        d¬¦  «        }t          ||||t          |¦  «        d¬¦  «        }|d	         }	|	 }
|
sRt          j        d
|› �¦  «        dz   dt          j	        |	¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}
|d	         }	|	 }
|
sRt          j        d|› �¦  «        dz   dt          j	        |	¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}
g }|d         }
|
 }|}	|r|d         }| }|}	|	s¶ddt          j	        |
¦  «        iz  }|                     |¦  «         |r.ddt          j	        |¦  «        iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j        d|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}
x}x}}g }|d         }
|
 }|}	|r|d         }| }|}	|	s¶ddt          j	        |
¦  «        iz  }|                     |¦  «         |r.ddt          j	        |¦  «        iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j        d|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}
x}x}}d}	|d         }|	|k    }
d}||k    }|
r|s™t          j        d|
|fd|	||f¦  «        t          j	        |	¦  «        t          j	        |¦  «        t          j	        |¦  «        dœz  }t          j        d|› �¦  «        dz   d |iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}
x}x}}d}	|d         }|	|k    }
d}||k    }|
r|s™t          j        d|
|fd|	||f¦  «        t          j	        |	¦  «        t          j	        |¦  «        t          j	        |¦  «        dœz  }t          j        d!|› �¦  «        dz   d |iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}
x}x}}�ŒQdS )"zß
        Adversarial Stress Check: Roughness parameter sweep [0.0, 1.0].
        Verifies Blinn-Phong specular behavior across 11 roughness steps
        comparing Cocos Creator and Apple Metal shader formulations.
        )çX9´Èvâ?r  r  rM   rL   r"   é   r   rÿ   rm   rw   z(Negative specular in Cocos at roughness r   r•   Nz(Negative specular in Metal at roughness rx   ry   znot %(py3)sr   znot %(py7)sr¨   r   zNaN/Inf in Cocos at roughness z
>assert %(py11)sÚpy11zNaN/Inf in Metal at roughness rt   ræ   )z%(py1)s <= %(py5)sz%(py5)s <= %(py7)s)r•   r   r¨   z-Specular out of bounds in Cocos at roughness z
>assert %(py9)srá   z-Specular out of bounds in Metal at roughness )rA   r   r/   r3   Úlinspacer‹   rI   r&   r'   r+   r,   r-   rU   Ú_format_boolopr·   )rí   rî   r=   r>   r?   Ú	key_lightÚrr  r  rø   rÀ   r  r4   r:   rð   rñ   r6   rÃ   Ú@py_format10Ú@py_format12r5   rÍ   s                         r@   Ú,test_roughness_sweep_and_shader_model_parityzOTestChallengerNormalLightingStress.test_roughness_sweep_and_shader_model_parityE  s  € õ 0Ñ1Ô1Ñˆˆ1ˆb�"�bÝ”HÐ2Ð2Ð2½"¼*ÐEÑEÔEˆ	å”˜S # rÑ*Ô*ð 		pñ 		pˆAÝ5°b¸"¸bÀ)ÕW\Ð]^ÑW_ÔW_ÐnuÐvÑvÔvˆIÝ5°b¸"¸bÀ)ÕW\Ð]^ÑW_ÔW_ÐnuÐvÑvÔvˆIà Ð!8Ô9ÐiÐ9Ð9ÐiÐ9ÐiÕiÔiÐ;iÐfgÐ;iÐ;iÑiÔiÐiÑiÐiÕiÔiÐ9ÑiÔiÐiÑiÐiÕiÕiÔiÐiÑiÔiÑiÔiÐiÐiÐiÐiÐiØ Ð!8Ô9ÐiÐ9Ð9ÐiÐ9ÐiÕiÔiÐ;iÐfgÐ;iÐ;iÑiÔiÐiÑiÐiÕiÔiÐ9ÑiÔiÐiÑiÐiÕiÕiÔiÐiÑiÔiÑiÔiÐiÐiÐiÐiÐiØpÐp�y Ô,ÐpÐ,Ð,ÐpÐ,ÐpÐ,Ðp°Y¸zÔ5JÐpÐ5JÐ1JÐpÐ1JÐpÐpÐpÐpÐpÕpÔpÐ,ÑpÔpÐpÑpÐpÐp×pÒpÐpÑpÔpÐpÐ,ÐpÐpÐpÕpÔpÐ5JÑpÔpÐpÑpÐpÐp×pÒpÐpÑpÔpÐpÕpÔpÐpÐpÑpÔpÐpÑpÐpÕpÔpÐLpÐmnÐLpÐLpÑpÔpÐpÑpÐpÐpÐpÑpÐpÕpÕpÔpÐpÑpÔpÑpÔpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpØpÐp�y Ô,ÐpÐ,Ð,ÐpÐ,ÐpÐ,Ðp°Y¸zÔ5JÐpÐ5JÐ1JÐpÐ1JÐpÐpÐpÐpÐpÕpÔpÐ,ÑpÔpÐpÑpÐpÐp×pÒpÐpÑpÔpÐpÐ,ÐpÐpÐpÕpÔpÐ5JÑpÔpÐpÑpÐpÐp×pÒpÐpÑpÔpÐpÕpÔpÐpÐpÑpÔpÐpÑpÐpÕpÔpÐLpÐmnÐLpÐLpÑpÔpÐpÑpÐpÐpÐpÑpÐpÕpÕpÔpÐpÑpÔpÑpÔpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpÐpØÐo˜) NÔ3Ðo�3Ð3Ò:Ðo°sÐoÐ3°sÒ:ÐoÐoÐoÐoÐoÕoÔoÐoÐoÐoÐoÐo�3Ð3°sÐoÑoÔoÕoÔo�3ÑoÔoÕoÔoÐ3ÑoÔoÕoÔo°sÑoÔoÐoÐoÑoÐoÕoÔoÐ<oÐlmÐ<oÐ<oÑoÔoÐoÑoÐoÐoÐoÑoÐoÕoÕoÔoÐoÑoÔoÑoÔoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoØÐo˜) NÔ3Ðo�3Ð3Ò:Ðo°sÐoÐ3°sÒ:ÐoÐoÐoÐoÐoÕoÔoÐoÐoÐoÐoÐo�3Ð3°sÐoÑoÔoÕoÔo�3ÑoÔoÕoÔoÐ3ÑoÔoÕoÔo°sÑoÔoÐoÐoÑoÐoÕoÔoÐ<oÐlmÐ<oÐ<oÑoÔoÐoÑoÐoÐoÐoÑoÐoÕoÕoÔoÐoÑoÔoÑoÔoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÑoð		pð 		prF   c                ó®  — t          ¦   «         \  }}}}}t          j        d¦  «        }t          j        t          j        |¦  «        dt          j        |¦  «        gt          j        ¬¦  «        }t          ||||dd¬¦  «        }|d         }| }	|	sOt          j
        d¦  «        d	z   d
t          j        |¦  «        iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}	|d         }| }	|	sOt          j
        d¦  «        d	z   d
t          j        |¦  «        iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}	t          j        g d¢t          j        ¬¦  «        }t          ||||dd¬¦  «        }|d         }| }	|	sOt          j
        d¦  «        d	z   d
t          j        |¦  «        iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}	|d         }| }	|	sOt          j
        d¦  «        d	z   d
t          j        |¦  «        iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}	|d         }d}||k    }	|	s�t          j        d|	fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j
        d¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}dS )zª
        Adversarial Stress Check: Extreme incident light angles.
        - Grazing angle: elevation 1.0 degree
        - Backlight: Lz < 0 (light behind sprite)
        r"   rL   rM   rc   r   rÿ   rv   z!Negative diffuse in grazing lightr   r•   Nrx   zNaNs in grazing light)ç      à?r!  g9´Èv¾Ÿæ¿zNegative diffuse in backlightzNaNs in backlightrp   r�   r  r  z)Backlight diffuse min should clamp to 0.0r  r–   )rA   rO   rP   r   r/   rQ   rR   r3   r‹   r&   r'   r+   r,   r-   r·   )rí   rî   r=   r>   r?   Úphi_grazingÚ	grazing_LÚres_grø   rÀ   r  Úback_LÚres_br5   r6   rÂ   s                   r@   Ú/test_extreme_light_angles_grazing_and_backlightzRTestChallengerNormalLightingStress.test_extreme_light_angles_grazing_and_backlightY  s:  € õ 0Ñ1Ô1Ñˆˆ1ˆb�"�bõ ”l 3Ñ'Ô'ˆÝ”H�dœh {Ñ3Ô3°S½$¼(À;Ñ:OÔ:OÐPÕXZÔXbÐcÑcÔcˆ	Ý-¨b°"°b¸)ÈsÐahÐiÑiÔiˆØÐ/Ô0ÐUÐ0Ð0ÐUÐ0ÐUÕUÔUÐ2UÑUÔUÐUÑUÐUÕUÔUÐ0ÑUÔUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUØ˜Ô$Ð=Ð$Ð$Ð=Ð$Ð=Õ=Ô=Ð&=Ñ=Ô=Ð=Ñ=Ð=Õ=Ô=Ð$Ñ=Ô=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=õ ”Ð,Ð,Ð,µB´JÐ?Ñ?Ô?ˆÝ-¨b°"°b¸&ÈCÐ^eÐfÑfÔfˆØÐ/Ô0ÐQÐ0Ð0ÐQÐ0ÐQÕQÔQÐ2QÑQÔQÐQÑQÐQÕQÔQÐ0ÑQÔQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQØ˜Ô$Ð9Ð$Ð$Ð9Ð$Ð9Õ9Ô9Ð&9Ñ9Ô9Ð9Ñ9Ð9Õ9Ô9Ð$Ñ9Ô9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ø�]Ô#ÐW sÐWÐ# sÒ*ÐWÐWÐWÕWÔWÐWÐWÐWÐWÐ# sÐWÑWÔWÕWÔWÐ#ÑWÔWÕWÔW sÑWÔWÐWÐWÑWÐWÕWÔWÐ,WÑWÔWÐWÑWÐWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWÐWÐWÐWÐWrF   c                ó&  — t          ¦   «         \  }}}}}| }t          j        } ||¦  «        }|sèt          j        d¦  «        dz   dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚dx}}||         dd…dd…f                              t          j        ¦  «        }|dd…df         d	z  d
z  dz
  }	|dd…df         d	z  d
z  dz
  }
|dd…df         d	z  d
z  dz
  }t          j        |	dz  |
dz  z   |dz  z   ¦  «        }t          t          j        |¦  «        ¦  «        }t          t          j        |¦  «        ¦  «        }d}||k    }d}||k    }|r|sÅt          j        d||fd|||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d|› d�¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}}d}||k    }|s°t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d|› d�¦  «        dz   d |iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}dS )!a	  
        Adversarial Stress Check: Transparent texel default normals.
        Ensures that transparent pixels (alpha == 0) carry flat normals [128, 128, 255] in RGB,
        guaranteeing unit length |N| = 1.0 and preventing texture filtering singularities.
        zAtlas has no transparent texelsr   r   Útransparent_maskr   Nr   r   r    r!   r"   r#   r$   g\�Âõ(\ï?gR¸…ëQð?ræ   rè   ré   rê   zTransparent normal mean length z is not ~1.0r˜   r™   gffffffî?)ú>=)z%(py0)s >= %(py3)srù   rß   zTransparent normal Nz z is not pointing outward ~1.0rà   r   )rA   r   r1   r&   r'   r(   r)   r*   r+   r,   r-   r2   r3   rD   rI   r   r}   r·   )rí   r8   Úmaskrî   r)  r4   r:   r;   Ú	trans_rgbÚnx_transÚny_transÚnz_transÚlengths_transré   rù   rø   rÀ   rÁ   r5   rÂ   rÃ   rï   s                         r@   Ú9test_background_transparent_texels_flat_normal_invariantsz\TestChallengerNormalLightingStress.test_background_transparent_texels_flat_normal_invariantso  sñ  € õ 3Ñ4Ô4Ñˆˆd�A�q˜!Ø ˜5ÐÝŒvÐJˆvˆvÐ&Ñ'Ô'ÐJÐ'ÐJÕJÔJÐ)JÑJÔJÐJÑJÐJÕJÔJÑJÔJÐJÐJÕJÔJ�rÑJÔJÐJÕJÔJ�rÑJÔJÐJÐJÕJÔJˆvÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJÐ&ÑJÔJÐJÕJÔJÐ&ÑJÔJÐJÐJÕJÔJÐ'ÑJÔJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJàÐ)Ô*¨1¨1¨1¨b¨q¨b¨5Ô1×8Ò8½¼ÑDÔDˆ	Ø˜a˜a˜a ˜d”O eÑ+¨sÑ2°SÑ8ˆØ˜a˜a˜a ˜d”O eÑ+¨sÑ2°SÑ8ˆØ˜a˜a˜a ˜d”O eÑ+¨sÑ2°SÑ8ˆåœ ¨A¡°¸A±Ñ =ÀÈAÁÑ MÑNÔNˆÝ�œ Ñ/Ô/Ñ0Ô0ˆÝ•r”v˜hÑ'Ô'Ñ(Ô(ˆàÐaˆt�xÒ'Ða 4Ða�x 4Ò'ÐaÐaÐaÐaÐaÕaÔaÐaÐaÐaÐaÐaˆt�x 4ÐaÑaÔaÕaÔaˆtÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔa�xÑaÔaÐaÕaÔa�xÑaÔaÐaÐaÕaÔa 4ÑaÔaÐaÐaÑaÐaÕaÔaÐ)aÈ8Ð)aÐ)aÐ)aÑaÔaÐaÑaÐaÐaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaÐaÐaÐaÐaØÐ]ˆv˜Š~Ð]Ð]Ð]Õ]Ô]Ð]Ð]Ð]Ð]ˆv˜Ð]Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆvÑ]Ô]Ð]Õ]Ô]ˆvÑ]Ô]Ð]Ð]Õ]Ô]˜Ñ]Ô]Ð]Ð]Ñ]Ð]Õ]Ô]Ð]¸Ð]Ð]Ð]Ñ]Ô]Ð]Ñ]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]rF   N)r   rÚ   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__rü   r  r  r  r'  r1  © rF   r@   rÙ   rÙ   Þ   s©   € € € € € ðð ð+
ð +
ð +
ð +
ðZ`ð `ð `ð `ð6
ð 
ð 
ð 
ð4pð pð pð pð(Xð Xð Xð Xð,^ð ^ð ^ð ^ð ^ð ^rF   rÙ   r¹   c                 óf  — t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          dt          › �¦  «         t          ¦   «         \  } }}}}| j        d         | j        d         z  }t	          |¦  «        }t          |||¦  «        }t          t          j        |¦  «        ¦  «        }t          t          j	        |¦  «        ¦  «        }	t          t          j
        |¦  «        ¦  «        }
t          t          j        |¦  «        ¦  «        }t          t          j        |dk     |dk    z  ¦  «        ¦  «        }t          t          j        |¦  «        ¦  «        }t          t          j	        |¦  «        ¦  «        }t          t          j
        |¦  «        ¦  «        }t          t          j        |d	k    ¦  «        ¦  «        }t          t          j        |¦  «                             ¦   «         pKt          j        |¦  «                             ¦   «         p%t          j        |¦  «                             ¦   «         ¦  «        }t          t          j        |¦  «                             ¦   «         pKt          j        |¦  «                             ¦   «         p%t          j        |¦  «                             ¦   «         ¦  «        }t          d
|d›d�¦  «         t          d|d›d||z  dz  d›d�¦  «         t          d|d›�¦  «         t          d|	d›�¦  «         t          d|
d›�¦  «         t          d|d›�¦  «         t          d|› d�¦  «         t          d|› d�¦  «         t          d|› d�¦  «         t          d|d›d|d›d|d›d�¦  «         t          d|› d�¦  «         |dk    o| o| o|dk    }t          d |rd!nd"› d#�¦  «         t          d$¦  «         t%          d%¬&¦  «        }d'}t          d(d)d*›d+d,d-›d+d.d-›d+d/d0›d+d1d-›d+d2d3›�¦  «         t          d4¦  «         |D ]y\  }}t'          ||||d5d6¬7¦  «        }|d8         p|d9         p|d:         }|rd;}t          d(|d*›d+|d<         d=›d+|d>         d=›d+|d?         d@›d+|dA         d=›d+|rd"ndBd3›�¦  «         Œz|D ]4\  }}t'          ||||d5dC¬7¦  «        }|d8         s|d9         s|d:         rd;}Œ5t          d |rd!nd"› d#�¦  «         t          dD¦  «         t          dt(          › �¦  «         t+          t(          ¦  «        }t          dE|dF         d›dG�¦  «         t          dH|dI         d›dG�¦  «         t          dJ|dK                              ¦   «         › dL|dM         › d�¦  «         t          dN|dO         d         › dP|dO         d         › dP|dO         dQ         › �¦  «         t          dR|dS         d         › dT|dS         d         › dT|dS         dQ         › �¦  «         t          dU|dV         d›�¦  «         t          dW|dX         d›d|dY         dz  dZ›d�¦  «         t          d[|d\         d›�¦  «         t          d]|d^         › �¦  «         |dM         o;|dF         d_k    o/|dO         d`k    o#|dS         dak    o|dX         dbk    o|d^         dk    }t          d |rd!nd"› d#�¦  «         t          dc¦  «         |r|r|rddnde}t          df|› �¦  «         t          d¦  «         |ddk    rdndS )gNzP================================================================================zAFREEEXILE EMPIRICAL CHALLENGER AUDIT: NORMAL MAPS, LIGHTING, ASTCz3
[PHASE 1] TANGENT-SPACE NORMAL MAP EMPIRICAL AUDITzTarget: r   r#   râ   rã   rL   z   Total Texels in Atlas:        ú,z (2048 x 2048)z   Non-Transparent Texels:       z (éd   z.2fz%)z   Vector Length Min:            z.6fz   Vector Length Max:            z   Vector Length Mean:           z   Vector Length Std Dev:        z   Lengths Outside [0.92, 1.08]: z (0.00%)z+  NaN Count:                    0 (has_nan=r  z+  Inf Count:                    0 (has_inf=z!  Nz Range:                     [rå   z	] (Mean: z   Inverted Normals (Nz <= 0):   z  Status: [ÚPASSÚFAILú]z?
[PHASE 2] BLINN-PHONG 8-DIRECTION DYNAMIC LIGHTING STRESS TESTrG   rþ   Tz  Ú	Directionz<22z | zDiff Minz<8zDiff Maxz	Diff Meanz<9zSpec MaxzNeg/NaNz<7zL  --------------------------------------------------------------------------rc   r   rÿ   rv   rw   rx   Frp   z<8.4frq   rr   z<9.4frt   ÚCLEANrm   z1
[PHASE 3] ASTC 4x4 MOBILE CONTAINER BINARY AUDITz   File Size:                    r«   r—   z#  Expected Size (16 + 512*512*16): r¬   z"  Magic Bytes Hex:              0xr­   z	 (Valid: r®   z   Block Footprint:              r¯   Úxr$   z   Texture Dimensions:           r°   z x z   Total Compressed Blocks:      r±   z   Void-Extent Blocks:           r²   r³   z.1fz   Non-Zero Alpha Blocks:        rµ   z   HDR Blocks (should be 0):     r´   r  r
  r  r  zQ
================================================================================ÚAPPROVEÚREQUEST_CHANGESzFINAL CHALLENGER VERDICT: )Úprintr   rA   Úshaper’   rE   rI   r   r}   r~   r   rì   r¹   r|   r€   r�   r1   r‚   rb   r‹   r  r×   Úupper)r8   r+  r=   r>   r?   Útotal_pixelsÚopaque_countrô   rõ   rö   ré   r÷   Ú
out_of_tolrù   rú   rû   Úinverted_normalsÚhas_nanÚhas_infÚphase1_passrZ   Úphase2_passr[   r  ÚresÚ
neg_or_nanÚres_mÚastcÚphase3_passÚverdicts                                 r@   Úrun_empirical_stress_auditrS  ‹  s¿  € Ý	ˆ(�O„O€OÝ	Ð
MÑNÔNÐNÝ	ˆ(�O„O€Oõ 
Ð
@ÑAÔAÐAÝ	Ð
&•_Ð
&Ð
&Ñ'Ô'Ð'Ý1Ñ3Ô3Ñ€Dˆ$��B˜Ø”:˜a”= 4¤:¨a¤=Ñ0€LÝ�r‘7”7€Lå$ R¨¨RÑ0Ô0€GÝ•B”F˜7‘O”OÑ$Ô$€GÝ•B”F˜7‘O”OÑ$Ô$€GÝ•R”W˜WÑ%Ô%Ñ&Ô&€HÝ•B”F˜7‘O”OÑ$Ô$€GÝ•R”V˜W tš^°¸$²Ñ?Ñ@Ô@ÑAÔA€Jå•2”6˜"‘:”:ÑÔ€FÝ•2”6˜"‘:”:ÑÔ€FÝ•B”G˜B‘K”KÑ Ô €GÝ�2œ6 "¨¢)Ñ,Ô,Ñ-Ô-Ðå•2”8˜B‘<”<×#Ò#Ñ%Ô%ÐQ­¬°"©¬×)9Ò)9Ñ);Ô);ÐQ½r¼xÈ¹|¼|×?OÒ?OÑ?QÔ?QÑRÔR€GÝ•2”8˜B‘<”<×#Ò#Ñ%Ô%ÐQ­¬°"©¬×)9Ò)9Ñ);Ô);ÐQ½r¼xÈ¹|¼|×?OÒ?OÑ?QÔ?QÑRÔR€Gå	Ð
K¨\Ð
KÐ
KÐ
KÐ
KÑLÔLÐLÝ	Ð
d¨\Ð
dÐ
dÐ
d¸|ÈLÑ?XÐY\Ñ?\Ð
dÐ
dÐ
dÐ
dÑeÔeÐeÝ	Ð
:¨WÐ
:Ð
:Ð
:Ñ;Ô;Ð;Ý	Ð
:¨WÐ
:Ð
:Ð
:Ñ;Ô;Ð;Ý	Ð
;¨XÐ
;Ð
;Ð
;Ñ<Ô<Ð<Ý	Ð
:¨WÐ
:Ð
:Ð
:Ñ;Ô;Ð;Ý	Ð
A¨ZÐ
AÐ
AÐ
AÑBÔBÐBÝ	Ð
B¸Ð
BÐ
BÐ
BÑCÔCÐCÝ	Ð
B¸Ð
BÐ
BÐ
BÑCÔCÐCÝ	Ð
_¨fÐ
_Ð
_Ð
_¸FÐ
_Ð
_Ð
_ÐQXÐ
_Ð
_Ð
_Ð
_Ñ`Ô`Ð`Ý	Ð
GÐ-=Ð
GÐ
GÐ
GÑHÔHÐHà ’?Ðc¨W¨Ðc¸w¸;ÐcÐM]ÐabÒMb€KÝ	Ð
< +Ð9˜˜°6Ð
<Ð
<Ð
<Ñ=Ô=Ð=õ 
Ð
LÑMÔMÐMÝ)¸Ð?Ñ?Ô?€FØ€Kå	Ð
zˆ{Ð
zÐ
zÐ
z :Ð
zÐ
zÐ
z°ZÐ
zÐ
zÐ
zÀ{Ð
zÐ
zÐ
zÐZdÐ
zÐ
zÐ
zÐluÐ
zÐ
zÐ
zÑ{Ô{Ð{Ý	ˆ/ÑÔÐØð ð ‰ˆˆuÝ+¨B°°B¸ÈÐ[bÐcÑcÔcˆØÐ/Ô0Ðc°CÐ8OÔ4PÐcÐTWÐXbÔTcˆ
Øð 	 ØˆKÝð  ~�5ð  ~ð  ~ð  ~  ]Ô!3ð  ~ð  ~ð  ~¸cÀ-Ô>Pð  ~ð  ~ð  ~Ð[^Ð_mÔ[nð  ~ð  ~ð  ~Ðy|ð  ~Lô  zMð  ~ð  ~ð  ~ð  blð  Xyð  X^ð  X^ð  ryð  ~ð  ~ð  ~ñ  	ô  	ð  	ð  	ð ð  ð  ‰ˆˆuÝ-¨b°"°b¸%È3Ð]dÐeÑeÔeˆØÐ'Ô(ð 	 ¨EÐ2IÔ,Jð 	 ÈeÐT^ÔN_ð 	 ØˆKøå	Ð
< +Ð9˜˜°6Ð
<Ð
<Ð
<Ñ=Ô=Ð=õ 
Ð
>Ñ?Ô?Ð?Ý	Ð
*Õ(Ð
*Ð
*Ñ+Ô+Ð+Ý'Õ(;Ñ<Ô<€Då	Ð
H¨T°+Ô->Ð
HÐ
HÐ
HÐ
HÑIÔIÐIÝ	Ð
U°Ð5JÔ0KÐ
UÐ
UÐ
UÐ
UÑVÔVÐVÝ	Ð
i¨t°KÔ/@×/FÒ/FÑ/HÔ/HÐ
iÐ
iÐSWÐXeÔSfÐ
iÐ
iÐ
iÑjÔjÐjÝ	Ð
t¨T°,Ô-?ÀÔ-BÐ
tÐ
tÀTÈ,ÔEWÐXYÔEZÐ
tÐ
tÐ]aÐbnÔ]oÐpqÔ]rÐ
tÐ
tÑuÔuÐuÝ	Ð
r¨T°*Ô-=¸aÔ-@Ð
rÐ
rÀTÈ*ÔEUÐVWÔEXÐ
rÐ
rÐ]aÐblÔ]mÐnoÔ]pÐ
rÐ
rÑsÔsÐsÝ	Ð
E¨T°.Ô-AÐ
EÐ
EÐ
EÑFÔFÐFÝ	Ð
q¨TÐ2EÔ-FÐ
qÐ
qÐ
qÈDÐQdÔLeÐfiÑLiÐ
qÐ
qÐ
qÐ
qÑrÔrÐrÝ	Ð
N¨TÐ2IÔ-JÐ
NÐ
NÐ
NÑOÔOÐOÝ	Ð
E¨TÐ2BÔ-CÐ
EÐ
EÑFÔFÐFð 	ˆ]Ôð 	(Ø�Ô Ò(ð	(à�Ô )Ò+ð	(ð �Ô Ò/ð	(ð Ð$Ô%¨Ò/ð		(ð
 Ð!Ô" aÒ'ð õ 
Ð
< +Ð9˜˜°6Ð
<Ð
<Ð
<Ñ=Ô=Ð=å	ˆ/ÑÔÐØ'Ð_¨KÐ_¸KÐ_ˆiˆiÐN_€GÝ	Ð
0 wÐ
0Ð
0Ñ1Ô1Ð1Ý	ˆ(�O„O€Oà˜9Ò$Ð$ˆ1ˆ1¨!Ð+rF   Ú__main__)r   r   )r=   rB   r>   rB   r?   rB   r   rB   )rG   )rH   rI   r   rJ   )rc   r   )r=   rB   r>   rB   r?   rB   rd   rB   re   rI   rf   rg   r   rh   )rŒ   r   r   rh   )r   r¹   )+r5  Ú
__future__r   Úbuiltinsr(   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter&   rO   Úpathlibr   r¼   ÚsysÚtypingr   r   r   r   Únumpyr   ÚPILr	   ÚpytestÚ__file__ÚresolveÚparentÚ	REPO_ROOTrg   ÚpathÚinsertr   ÚALBEDO_MAP_PATHr  rA   rE   rb   r‹   r×   rÙ   rS  r2  Úexitr6  rF   r@   ú<module>rh     sw  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø Ð Ð Ð Ð Ð Ø €€€Ø 
€
€
€
Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€àˆD�‰NŒN×"Ò"Ñ$Ô$Ô+Ô2€	Ø€3€y�>„>˜œÐ!Ð!Ø„H‡O‚O�A�s�s˜9‘~”~Ñ&Ô&Ð&à˜hÑ&¨Ñ0°8Ñ;¸kÑIÈEÑQÐTÑ€Ø˜hÑ&¨Ñ0°8Ñ;¸kÑIÈEÑQÐTxÑx€Ø (Ñ*¨WÑ4°xÑ?À+ÑMÐPUÑUÐX}Ñ}Ð ð,ð ,ð ,ð ,ð.0ð 0ð 0ð 0ð
ð ð ð ð ðN Øð1ð 1ð 1ð 1ð 1ðh?ð ?ð ?ð ?ðLe^ð e^ð e^ð e^ð e^ñ e^ô e^ð e^ðZ^,ð ^,ð ^,ð ^,ðB ˆzÒÐØ€C„HÐ'Ð'Ñ)Ô)Ñ*Ô*Ð*Ð*Ð*ð ÐrF   