§
    ŽÛ¾jT  ã                   óž   — d Z ddlZddlmZmZmZmZmZmZm	Z	  G d„ d¦  «        Z
 G d„ d¦  «        Z G d„ d	¦  «        Z G d
„ d¦  «        ZdS )zŒ
Unit test suite for Viewport Frustum Culling Utilities.
Verifies AABB-Frustum intersection math, isometric projection, and entity culling.
é    N)ÚAABBÚEntityBoundsÚ	Frustum2DÚbenchmark_cullingÚcull_entitiesÚ
intersectsÚproject_isoc                   ó.   — e Zd Zdd„Zdd„Zdd„Zdd„ZdS )ÚTestAABBOperationsÚreturnNc                 ó`   — t          dddd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚d S )Nç      $@ç      4@ç      I@ç      T@©Úmin_xÚmin_yÚmax_xÚmax_yç      D@ç      N@)r   ÚwidthÚheight©ÚselfÚboxs     ú9C:\Projects\FreeExile\tests\unit\test_viewport_culling.pyÚtest_aabb_propertiesz'TestAABBOperations.test_aabb_properties   sD   € Ý˜ T°¸TÐBÑBÔBˆØŒy˜DÒ Ð Ð Ð ØŒz˜TÒ!Ð!Ð!Ð!Ð!Ð!ó    c                 ó0  — t          dddd¬¦  «        }|                     dd¦  «        du sJ ‚|                     dd¦  «        du sJ ‚|                     dd¦  «        du sJ ‚|                     dd¦  «        du sJ ‚|                     dd¦  «        du sJ ‚d S )	Nç        ç      Y@r   r   Tç      ð¿Fç     @Y@)r   Úcontains_pointr   s     r   Útest_aabb_contains_pointz+TestAABBOperations.test_aabb_contains_point   sÃ   € Ý˜ C¨u¸EÐBÑBÔBˆØ×!Ò! $¨Ñ-Ô-°Ð5Ð5Ð5Ð5Ø×!Ò! # sÑ+Ô+¨tÐ3Ð3Ð3Ð3Ø×!Ò! %¨Ñ/Ô/°4Ð7Ð7Ð7Ð7Ø×!Ò! $¨Ñ-Ô-°Ð6Ð6Ð6Ð6Ø×!Ò! $¨Ñ.Ô.°%Ð7Ð7Ð7Ð7Ð7Ð7r    c                 ó@  — t          dddd¬¦  «        }t          dddd¬¦  «        }t          dddd¬¦  «        }|                     |¦  «        du sJ ‚|                     |¦  «        du sJ ‚|                     |¦  «        d	u sJ ‚|                     |¦  «        d	u sJ ‚d S )
Nr"   r   r   ç      9@g     ÀR@r   r#   TF)r   r   )r   Úb1Úb2Úb3s       r   Útest_aabb_intersectsz'TestAABBOperations.test_aabb_intersects!   s¾   € Ý˜ 3¨d¸$Ð?Ñ?Ô?ˆÝ˜ D°¸DÐAÑAÔAˆÝ˜ D°¸UÐCÑCÔCˆà�}Š}˜RÑ Ô  DÐ(Ð(Ð(Ð(Ø�}Š}˜RÑ Ô  DÐ(Ð(Ð(Ð(Ø�}Š}˜RÑ Ô  EÐ)Ð)Ð)Ð)Ø�}Š}˜RÑ Ô  EÐ)Ð)Ð)Ð)Ð)Ð)r    c                 ó¾   — t          dddd¬¦  «        }|                     d¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚d S )Nr   r   r   ç      @r)   )r   Úexpandr   r   r   r   )r   r   Úpaddeds      r   Útest_aabb_expandz#TestAABBOperations.test_aabb_expand+   sy   € Ý˜ T°¸TÐBÑBÔBˆØ—’˜C‘”ˆØŒ|˜sÒ"Ð"Ð"Ð"ØŒ|˜sÒ"Ð"Ð"Ð"ØŒ|˜tÒ#Ð#Ð#Ð#ØŒ|˜tÒ#Ð#Ð#Ð#Ð#Ð#r    ©r   N)Ú__name__Ú
__module__Ú__qualname__r   r'   r-   r2   © r    r   r   r      sd   € € € € € ð"ð "ð "ð "ð
8ð 8ð 8ð 8ð*ð *ð *ð *ð$ð $ð $ð $ð $ð $r    r   c                   ó&   — e Zd Zdd„Zdd„Zdd„ZdS )ÚTestFrustumIntersectionr   Nc                 ó¾   — t          ddddd¬¦  «        }|                     ¦   «         }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚d S )Nr"   r#   r   ©r   r   r   r   Úpaddingg      $Àg     €[@)r   Úto_aabbr   r   r   r   )r   Úfrustumr   s      r   Útest_frustum_to_aabbz,TestFrustumIntersection.test_frustum_to_aabb5   s|   € Ý #¨S¸ÀUÐTXÐYÑYÔYˆØ�oŠoÑÔˆØŒy˜EÒ!Ð!Ð!Ð!ØŒy˜EÒ!Ð!Ð!Ð!ØŒy˜EÒ!Ð!Ð!Ð!ØŒy˜EÒ!Ð!Ð!Ð!Ð!Ð!r    c           	      óN  — t          ddddd¬¦  «        }t          |t          dddd¦  «        ¦  «        du sJ ‚t          |t          dddd¦  «        ¦  «        du sJ ‚t          |t          d	d
dd¦  «        ¦  «        du sJ ‚t          |t          d
d	dd¦  «        ¦  «        du sJ ‚d S )Nr"   r#   r;   r   r   Tg     €V@g      ^@r%   r   g     Àb@r   F)r   r   r   )r   r>   s     r   Útest_frustum_intersects_boxz3TestFrustumIntersection.test_frustum_intersects_box=   sÅ   € Ý #¨S¸ÀUÐTWÐXÑXÔXˆå˜'¥4¨¨d°D¸$Ñ#?Ô#?Ñ@Ô@ÀDÐHÐHÐHÐHå˜'¥4¨¨d°E¸5Ñ#AÔ#AÑBÔBÀdÐJÐJÐJÐJå˜'¥4¨¨t°U¸DÑ#AÔ#AÑBÔBÀeÐKÐKÐKÐKå˜'¥4¨¨e°T¸5Ñ#AÔ#AÑBÔBÀeÐKÐKÐKÐKÐKÐKr    c                 óÊ   — t          ddddd¬¦  «        }t          ddddd¬¦  «        }t          dddd¦  «        }t          ||¦  «        d	u sJ ‚t          ||¦  «        d
u sJ ‚d S )Nr"   r#   )r<   r   g     @Z@r   g     À\@g     €Q@FT)r   r   r   )r   Úfrustum_no_padÚfrustum_paddedr   s       r   Útest_frustum_padding_inclusionz6TestFrustumIntersection.test_frustum_padding_inclusionH   s�   € å" 3¨¨U°EÀ3ÐGÑGÔGˆÝ" 3¨¨U°EÀ4ÐHÑHÔHˆÝ�5˜$  tÑ,Ô,ˆå˜.¨#Ñ.Ô.°%Ð7Ð7Ð7Ð7Ý˜.¨#Ñ.Ô.°$Ð6Ð6Ð6Ð6Ð6Ð6r    r3   )r4   r5   r6   r?   rA   rE   r7   r    r   r9   r9   4   sT   € € € € € ð"ð "ð "ð "ð	Lð 	Lð 	Lð 	Lð7ð 7ð 7ð 7ð 7ð 7r    r9   c                   ó   — e Zd Zdd„Zdd„ZdS )ÚTestIsometricProjectionr   Nc                 óN   — t          ddd¦  «        \  }}|dk    sJ ‚|dk    sJ ‚d S )Nr"   ©r	   )r   Úiso_xÚiso_ys      r   Útest_project_iso_originz/TestIsometricProjection.test_project_iso_originS   s5   € Ý" 3¨¨SÑ1Ô1‰ˆˆuØ˜Š|ˆ|ˆ|ˆ|Ø˜Š|ˆ|ˆ|ˆ|ˆ|ˆ|r    c                 ót   — t          dddd¬¦  «        \  }}t          dddd¬¦  «        \  }}||dz
  k    sJ ‚d S )Nr/   r"   g      8@)Úz_scaleç       @g      H@rI   )r   Ú_Úy_groundÚ
y_elevateds       r   Ú!test_project_iso_elevation_offsetz9TestIsometricProjection.test_project_iso_elevation_offsetX   sQ   € Ý! # s¨C¸Ð>Ñ>Ô>‰ˆˆ8Ý# C¨¨c¸4Ð@Ñ@Ô@‰ˆˆ:à˜X¨™_Ò,Ð,Ð,Ð,Ð,Ð,r    r3   )r4   r5   r6   rL   rS   r7   r    r   rG   rG   R   s<   € € € € € ðð ð ð ð
-ð -ð -ð -ð -ð -r    rG   c                   ó&   — e Zd Zdd„Zdd„Zdd„ZdS )ÚTestCullEntitiesr   Nc                 ó   — t          ddd¬¦  «        t          ddd¬¦  «        t          ddd¬¦  «        t          d	d
d
¬¦  «        g}t          dd|d¬¦  «        }d„ |D ¦   «         }d|v sJ ‚d|v sJ ‚d|vsJ ‚d	|vsJ ‚d S )NÚ
center_mobr"   )Úworld_xÚworld_yÚ
nearby_mobrO   r$   Úfar_mob_culledr   Únegative_far_culledg      IÀ©r"   r"   ©g      ‰@g     À‚@g      @@)Ú
camera_posÚviewport_sizeÚentitiesr<   c                 ó   — h | ]	}|j         ’Œ
S r7   )Ú	entity_id)Ú.0Úes     r   ú	<setcomp>z=TestCullEntities.test_cull_entities_filter.<locals>.<setcomp>o   s   € Ð0Ð0Ð0 1�1”;Ð0Ð0Ð0r    )r   r   )r   ra   ÚvisibleÚvis_idss       r   Útest_cull_entities_filterz*TestCullEntities.test_cull_entities_filter`   sÔ   € å˜¨s¸CÐ@Ñ@Ô@Ý˜¨s¸DÐAÑAÔAÝÐ)°4ÀÐFÑFÔFÝÐ.¸ÀuÐMÑMÔMð	
ˆõ  Ø!Ø(ØØð	
ñ 
ô 
ˆð 1Ð0¨Ð0Ñ0Ô0ˆØ˜wÐ&Ð&Ð&Ð&Ø˜wÐ&Ð&Ð&Ð&Ø wÐ.Ð.Ð.Ð.Ø$¨GÐ3Ð3Ð3Ð3Ð3Ð3r    c                 ó8   — t          ddg ¦  «        }|g k    sJ ‚d S )Nr]   r^   )r   )r   rg   s     r   Útest_cull_entities_empty_listz.TestCullEntities.test_cull_entities_empty_listu   s$   € Ý 
¨N¸BÑ?Ô?ˆØ˜"Š}ˆ}ˆ}ˆ}ˆ}ˆ}r    c                 ó˜   — t          dd¬¦  «        }|d         dk    sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚|d         d	k     sJ ‚d S )
NéÈ   )g      ”@g     €†@)Únum_entitiesr`   Útotal_entitiesÚvisible_entitiesr   Úculled_entitiesÚ
elapsed_msr   )r   )r   Úress     r   Ú test_benchmark_culling_syntheticz1TestCullEntities.test_benchmark_culling_syntheticy   su   € Ý¨SÀÐPÑPÔPˆØÐ#Ô$¨Ò+Ð+Ð+Ð+ØÐ%Ô&¨Ò*Ð*Ð*Ð*ØÐ$Ô%¨Ò)Ð)Ð)Ð)Ø�<Ô  4Ò'Ð'Ð'Ð'Ð'Ð'r    r3   )r4   r5   r6   ri   rk   rt   r7   r    r   rU   rU   _   sP   € € € € € ð4ð 4ð 4ð 4ð*ð ð ð ð(ð (ð (ð (ð (ð (r    rU   )Ú__doc__ÚpytestÚ+tools.asset_pipeline.viewport_culling_utilsr   r   r   r   r   r   r	   r   r9   rG   rU   r7   r    r   ú<module>rx      s  ððð ð
 €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð$ð $ð $ð $ð $ñ $ô $ð $ðB7ð 7ð 7ð 7ð 7ñ 7ô 7ð 7ð<
-ð 
-ð 
-ð 
-ð 
-ñ 
-ô 
-ð 
-ð(ð (ð (ð (ð (ñ (ô (ð (ð (ð (r    