§
    ÝLÂj«F  ã                  ó2  — d Z ddl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                 ó\  — t                                ¦   «         sJ dt           › �¦   «         ‚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
J d¦   «         ‚||         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: ÚRGBANé   r   z-No non-transparent pixels found in normal mapg     ào@ç       @ç      ð?é   é   )
ÚNORMAL_MAP_PATHÚexistsr	   ÚopenÚnpÚarrayÚconvertÚanyÚastypeÚfloat64)ÚimgÚrgbaÚalphaÚnon_trans_maskÚ
rgb_opaqueÚnxÚnyÚnzs           ú@C:\Projects\FreeExile\tests\challenger_normal_lighting_stress.pyÚload_normal_map_datar*   &   sŒ  € õ
 ×!Ò!Ñ#Ô#ÐTÐTÐ%TÅ?Ð%TÐ%TÑTÔTÐ#Ý	Œ•OÑ	$Ô	$ð -¨ÝŒx˜Ÿš FÑ+Ô+Ñ,Ô,ˆð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð ����A�A�A�q�ŒM€EØ˜Q’Y€NÝŒ6�.Ñ!Ô!Ð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   Á(A9Á9A=Â A=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_lengthsr.   =   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   r    ÚlinalgÚnormÚappend)r1   ÚphiÚcos_phiÚsin_phiÚ
directionsÚlightsÚlabelÚdegÚthetaÚlxÚlyÚlzÚvecs                r)   Úcompute_8_directional_lightsrK   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Ñ#Ô#Ð#Ð#à€Mr/   ç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)rT   Úkeepdimsgê-�™—q=)r5   r5   r   r6   r5   Ú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   Ústackr<   r=   Úmaximumr   r    Úsumr2   ÚminÚmaxÚmeanÚboolr   ÚisnanÚisinf)r&   r'   r(   rM   rN   rO   ÚnormalsÚ	norm_lensÚn_unitÚLÚVÚHrW   rX   Ú
spec_powerÚspeculars                   r)   Úevaluate_blinn_phong_lightingrt   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ðð ð r/   Ú	astc_pathr   c                ó   — |                       ¦   «         sJ d| › �¦   «         ‚|                      ¦   «         }t          |¦  «        }|dd…         }t          |¦  «        dk    sJ dt          |¦  «        › d�¦   «         ‚|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    sJ dt          |¦  «        › d|› �¦   «         ‚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: Né   zASTC header too short: ú bytesé   )é   é«   é¡   é\   é   é   é   é
   Úlittle)Ú	byteorderé   r   zPayload size mismatch: z vs r   é   iÿ  iü  é	   z<HHHHr5   )Ú	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   Ú
read_bytesÚlenÚbytesÚintÚ
from_bytesÚrangeÚstructÚunpackÚhex)ru   Úraw_datar‡   ÚheaderÚmagicrŠ   Úblock_xÚblock_yÚblock_zÚwidthÚheightÚdepthÚblocks_xÚblocks_yr�   Úexpected_payloadrˆ   ÚpayloadrŽ   r‘   r�   ÚiÚblockÚlower64Úis_void_extentÚis_hdrÚr16Úg16Úb16Úa16s                                 r)   Úparse_and_validate_astc_filer±   ˜   sí  € ð ×ÒÑÔÐBÐBÐB°yÐBÐBÑBÔBÐØ×#Ò#Ñ%Ô%€HÝ�H‘”€Ià�c�r�cŒ]€FÝˆv‰;Œ;˜"ÒÐÐÐK½¸F¹¼Ð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ÅsÈ7Á|Ä|Ð-kÐ-kÐYiÐ-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ðð ð r/   c                  ó*   — e Zd Z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
J d¦   «         ‚t          j        |¦  «                             ¦   «         r
J d¦   «         ‚t          j        |¦  «                             ¦   «         r
J d¦   «         ‚t          j        |¦  «                             ¦   «         r
J d¦   «         ‚t          j        |¦  «                             ¦   «         r
J d¦   «         ‚t          j        |¦  «                             ¦   «         r
J d¦   «         ‚t          j        |¦  «                             ¦   «         r
J d¦   «         ‚t          |||¦  «        }t          t          j        |¦  «        ¦  «        }t          t          j	        |¦  «        ¦  «        }t          t          j
        |¦  «        ¦  «        }	t          t          j        |¦  «        ¦  «        }
t          j        |d	k     |d
k    z  ¦  «        }|dk    sJ |› d|d›d|d›d|	d›�¦   «         ‚d	|	cxk    rd
k    sn J d|	d›d�¦   «         ‚t          t          j        |¦  «        ¦  «        }t          t          j	        |¦  «        ¦  «        }t          t          j
        |¦  «        ¦  «        }t          j        |dk    ¦  «        }|dk    sJ d|› d|d›d�¦   «         ‚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No non-transparent pixels foundzNaN found in NxzNaN found in NyzNaN found in NzzInfinity found in NxzInfinity found in NyzInfinity found in Nzçq=
×£pí?çHáz®Gñ?z: normal vectors have length outside [0.92, 1.08]. Range: [z.4fú, z	], Mean: zMean vector length z is outside [0.92, 1.08]r5   zFound z* inverted normals with Nz <= 0.0. Min Nz: z-. Tangent normals must face outward (Nz > 0).N)r*   r“   r   rj   r   rk   r.   r2   rf   rg   rh   Ústdre   )ÚselfÚ_r&   r'   r(   Úpixel_countÚlengthsÚmin_lenÚmax_lenÚmean_lenÚstd_lenÚout_of_tol_countÚmin_nzÚmax_nzÚmean_nzÚinverted_counts                   r)   Ú)test_normal_vector_metrics_and_invariantszLTestChallengerNormalLightingStress.test_normal_vector_metrics_and_invariantsã   sô  € õ 0Ñ1Ô1Ñˆˆ1ˆb�"�bÝ˜"‘g”gˆà˜QŠˆˆÐ A‰Œˆõ ”8˜B‘<”<×#Ò#Ñ%Ô%Ð8Ð8Ð'8Ñ8Ô8Ð%Ý”8˜B‘<”<×#Ò#Ñ%Ô%Ð8Ð8Ð'8Ñ8Ô8Ð%Ý”8˜B‘<”<×#Ò#Ñ%Ô%Ð8Ð8Ð'8Ñ8Ô8Ð%Ý”8˜B‘<”<×#Ò#Ñ%Ô%Ð=Ð=Ð'=Ñ=Ô=Ð%Ý”8˜B‘<”<×#Ò#Ñ%Ô%Ð=Ð=Ð'=Ñ=Ô=Ð%Ý”8˜B‘<”<×#Ò#Ñ%Ô%Ð=Ð=Ð'=Ñ=Ô=Ð%õ )¨¨R°Ñ4Ô4ˆÝ�œ˜w™œÑ(Ô(ˆÝ�œ˜w™œÑ(Ô(ˆÝ�œ Ñ)Ô)Ñ*Ô*ˆÝ�œ˜w™œÑ(Ô(ˆõ œ6 7¨T¢>°gÀ²nÑ"EÑFÔFÐØ 1Ò$Ð$Ð$Øð Kð KØÐJðKð KØ&-ÐJðKð KØ<DÐJðKð Kñ %Ô$Ð$ð �xÐ'Ð'Ò'Ð' 4Ò'Ð'Ð'Ð'Ð'Ð)e¸xÐ)eÐ)eÐ)eÐ)eÑ'Ô'Ð'õ •r”v˜b‘z”zÑ"Ô"ˆÝ•r”v˜b‘z”zÑ"Ô"ˆÝ�œ ™œÑ$Ô$ˆÝœ  c¢	Ñ*Ô*ˆØ Ò"Ð"Ð"ðQ�^ð Qð QØÐPðQð Qð Qñ #Ô"Ð"Ð"Ð"r/   c           	     ód  — t          ¦   «         \  }}}}}t          d¬¦  «        }t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚|D ]Û\  }}t          ||||dd¬¦  «        }|d         rJ d	|› �¦   «         ‚|d
         rJ d|› �¦   «         ‚|d         rJ d|› �¦   «         ‚|d         rJ d|› �¦   «         ‚|d         dk    sJ d|› �¦   «         ‚t          ||||dd¬¦  «        }	|	d         rJ d|› �¦   «         ‚|	d
         rJ d|› �¦   «         ‚|	d         rJ d|› �¦   «         ‚ŒÜ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
        r0   ©r1   r…   z!Expected 8 light directions, got rL   r   ©rN   rO   r_   zNegative diffuse lighting in r`   zNegative specular lighting in ra   z*NaNs detected in lighting calculation for rb   z*Infs detected in lighting calculation for rZ   r5   z$No diffuse light reached surface in rV   z%Negative diffuse lighting (Metal) in z&Negative specular lighting (Metal) in z'NaNs detected in Metal calculation for N)r*   rK   r“   rt   )
rº   r»   r&   r'   r(   rC   rD   Úl_vecÚ	res_cocosÚ	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‰{Œ{˜aÒÐÐÐ!RÅSÈÁ[Ä[Ð!RÐ!RÑÔÐà"ð 	`ð 	`‰LˆE�5Ý5°b¸"¸bÀ%ÐSVÐelÐmÑmÔmˆIØ Ð!7Ô8ÐaÐaÐ:aÐZ_Ð:aÐ:aÑaÔaÐ8Ø Ð!8Ô9ÐcÐcÐ;cÐ\aÐ;cÐ;cÑcÔcÐ9Ø  Ô,ÐbÐbÐ.bÐ[`Ð.bÐ.bÑbÔbÐ,Ø  Ô,ÐbÐbÐ.bÐ[`Ð.bÐ.bÑbÔbÐ,Ø˜]Ô+¨cÒ1Ð1Ð1Ð3aÐZ_Ð3aÐ3aÑ1Ô1Ð1å5°b¸"¸bÀ%ÐSVÐelÐmÑmÔmˆIØ Ð!7Ô8ÐiÐiÐ:iÐbgÐ:iÐ:iÑiÔiÐ8Ø Ð!8Ô9ÐkÐkÐ;kÐdiÐ;kÐ;kÑkÔkÐ9Ø  Ô,Ð_Ð_Ð._ÐX]Ð._Ð._Ñ_Ô_Ð,Ð_ð	`ð 	`r/   c                ó  — t          t          ¦  «        }|d         sJ d|d         › �¦   «         ‚|d         dk    sJ d|d         › �¦   «         ‚|d         dk    sJ d	|d         › �¦   «         ‚|d
         dk    sJ d|d
         › d�¦   «         ‚|d         dk    sJ d|d         › d�¦   «         ‚|d         dk    sJ d|d         › d�¦   «         ‚|d         dk    s
J d¦   «         ‚|d         dk    sJ d|d         › d�¦   «         ‚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‰   r‹   ©ry   ry   r   zInvalid block dims: 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ˆ  zToo few active content blocks (ú)N)r±   ÚASTC_CONTAINER_PATH)rº   Úastc_metricss     r)   Ú1test_astc_container_binary_format_and_void_extentzTTestChallengerNormalLightingStress.test_astc_container_binary_format_and_void_extent+  s†  € õ 4Õ4GÑHÔHˆà˜MÔ*Ð^Ð^Ð,^À<ÐP[ÔC\Ð,^Ð,^Ñ^Ô^Ð*Ø˜LÔ)¨YÒ6Ð6Ð6Ð8kÈ|Ð\hÔOiÐ8kÐ8kÑ6Ô6Ð6Ø˜JÔ'¨?Ò:Ð:Ð:Ð<oÐUaÐblÔUmÐ<oÐ<oÑ:Ô:Ð:Ø˜KÔ(¨GÒ3Ð3Ð3ØP˜ kÔ2ÐPÐPÐPñ 4Ô3Ð3ð ˜NÔ+¨vÒ5Ð5Ð5Ð7pÀ|ÐTbÔGcÐ7pÐ7pÐ7pÑ5Ô5Ð5ØÐ/Ô0°FÒ:Ð:Ð:ØP ,Ð/BÔ"CÐPÐPÐPñ ;Ô:Ð:ð Ð,Ô-°Ò2Ð2Ð2Ð4dÑ2Ô2Ð2ØÐ3Ô4°tÒ;Ð;Ð;ØV¨lÐ;RÔ.SÐVÐVÐVñ <Ô;Ð;Ð;Ð;r/   N)r   r´   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rÇ   rÎ   rØ   © r/   r)   r³   r³   Þ   s_   € € € € € ðð ð+
ð +
ð +
ð +
ðZ`ð `ð `ð `ð6
ð 
ð 
ð 
ð 
ð 
r/   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·   r5   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 TESTr0   rÉ   Tz  Ú	Directionz<22z | zDiff Minz<8zDiff Maxz	Diff Meanz<9zSpec MaxzNeg/NaNz<7zL  --------------------------------------------------------------------------rL   r   rÊ   r_   r`   ra   FrY   z<8.4frZ   r[   z<9.4fr]   ÚCLEANrV   z1
[PHASE 3] ASTC 4x4 MOBILE CONTAINER BINARY AUDITz   File Size:                    r‡   rx   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   r*   Úshaper“   r.   r2   r   rf   rg   rh   r¹   r•   re   ri   rj   r   rk   rK   rt   rÖ   r±   Úupper)r"   Úmaskr&   r'   r(   Útotal_pixelsÚopaque_countr½   r¾   r¿   rÀ   rÁ   Ú
out_of_tolrÃ   rÄ   rÅ   Úinverted_normalsÚhas_nanÚhas_infÚphase1_passrC   Úphase2_passrD   rË   ÚresÚ
neg_or_nanÚres_mÚastcÚphase3_passÚverdicts                                 r)   Úrun_empirical_stress_auditrû   J  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¨!Ð+r/   Ú__main__)r   r   )r&   r+   r'   r+   r(   r+   r   r+   )r0   )r1   r2   r   r3   )rL   r   )r&   r+   r'   r+   r(   r+   rM   r+   rN   r2   rO   rP   r   rQ   )ru   r   r   rQ   )r   r•   )%rÜ   Ú
__future__r   r8   Úpathlibr   r˜   ÚsysÚtypingr   r   r   r   Únumpyr   ÚPILr	   ÚpytestÚ__file__ÚresolveÚparentÚ	REPO_ROOTrP   ÚpathÚinsertr   ÚALBEDO_MAP_PATHrÖ   r*   r.   rK   rt   r±   r³   rû   rÙ   ÚexitrÝ   r/   r)   ú<module>r     sU  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø 
€
€
€
Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€àˆ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
ðX^,ð ^,ð ^,ð ^,ðB ˆzÒÐØ€C„HÐ'Ð'Ñ)Ô)Ñ*Ô*Ð*Ð*Ð*ð Ðr/   