§
    £Û¾j6  ã                  óš   — d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
 	 ddd„Z	 	 ddd„Z	 	 ddd„Zdd„Zedk    r e¦   «          dS dS ) zý
FreeExile Sprite & Texture Mipmap Chain Generator.
Computes full power-of-two downsampled mipmap chains (down to 1x1) for high-performance GPU sampling.
Prevents texture shimmering/aliasing and reduces memory cache misses during isometric camera zoom.
é    )ÚannotationsN)ÚPath)ÚListÚOptional)ÚImageé   ÚimageúImage.ImageÚmin_dimensionÚintÚreturnúList[Image.Image]c                ó’  — |                       ¦   «         g}| }|j        |k    s|j        |k    r™t          ||j        dz  ¦  «        }t          ||j        dz  ¦  «        }||j        k    r||j        k    rnR|                     ||ft
          j        j        ¦  «        }|                     |¦  «         |j        |k    °Ž|j        |k    °™|S )zJGenerates downsampled mipmap levels down to min_dimension x min_dimension.é   )	ÚcopyÚwidthÚheightÚmaxÚresizer   Ú
ResamplingÚLANCZOSÚappend)r	   r   ÚchainÚcurrÚnext_wÚnext_hs         ú:C:\Projects\FreeExile\tools\asset_pipeline\mipmap_utils.pyÚgenerate_mipmap_chainr      sÊ   € ð
 !&§
¢
¡¤˜~€EØ€Dà
Œ*�}Ò
$Ð
$¨¬°mÒ(CÐ(CÝ�] D¤J°!¡OÑ4Ô4ˆÝ�] D¤K°1Ñ$4Ñ5Ô5ˆØ�T”ZÒÐ F¨d¬kÒ$9Ð$9ØØ�{Š{˜F FÐ+­UÔ-=Ô-EÑFÔFˆØ�Š�TÑÔÐð Œ*�}Ò
$Ð
$¨¬°mÒ(CÐ(Cð €Ló    Ú
image_pathú
Path | strÚ
output_dirúOptional[Path | str]ú
List[Path]c                óÂ  — t          | ¦  «                             ¦   «         }|                     ¦   «         r|                     ¦   «         st	          d|› �¦  «        ‚|r!t          |¦  «                             ¦   «         n|j        }|                     dd¬¦  «         t          j        |¦  «        5 }|j	        dv s	d|j
        v rdnd}|                     |¦  «        }t          ||¬¦  «        }d	d	d	¦  «         n# 1 swxY w Y   g }	t          |¦  «        D ]H\  }
}||j        › d
|
› |j        › �z  }|                     |dd¬¦  «         |	                     |¦  «         ŒI|	S )z@Bakes and saves all mipmap levels to disk for the given texture.zSource texture not found: T)ÚparentsÚexist_ok)ÚRGBAÚLAÚtransparencyr(   ÚRGB©r   NÚ_mipÚPNG)ÚformatÚoptimize)r   ÚresolveÚexistsÚis_fileÚFileNotFoundErrorÚparentÚmkdirr   ÚopenÚmodeÚinfoÚconvertr   Ú	enumerateÚstemÚsuffixÚsaver   )r    r"   r   ÚsrcÚ
target_dirÚbase_imgr8   ÚimgÚlevelsÚsaved_pathsÚidxÚmip_imgÚmip_paths                r   Úsave_mipmap_chainrH   $   sÂ  € õ ˆzÑ
Ô
×
"Ò
"Ñ
$Ô
$€CØ�:Š:‰<Œ<ð D˜sŸ{š{™}œ}ð DÝÐ B¸SÐ BÐ BÑCÔCÐCà/9ÐI•�jÑ!Ô!×)Ò)Ñ+Ô+Ð+¸s¼z€JØ×Ò˜T¨DÐÑ1Ô1Ð1å	Œ�C‰Œð I˜HØ!œ¨.Ð8Ð8¸^ÈxÌ}Ð=\Ð=\ˆvˆvÐchˆØ×Ò˜tÑ$Ô$ˆÝ& s¸-ÐHÑHÔHˆðIð Ið Iñ Iô Ið Ið Ið Ið Ið Ið Iøøøð Ið Ið Ið Ið
 !€KÝ! &Ñ)Ô)ð %ð %‰ˆˆWØ 3¤8Ð BÐ B°Ð B°c´jÐ BÐ BÑBˆØ�Š�X e°dˆÑ;Ô;Ð;Ø×Ò˜8Ñ$Ô$Ð$Ð$àÐs   Â1=C:Ã:C>ÄC>Ú
atlas_pathc                ó&   — t          | ||¬¦  «        S )zHHook invoked by animation_pipeline.py to create mipmaps alongside atlas.r,   )rH   )rI   r"   r   s      r   Úgenerate_and_save_mipmapsrK   ?   s   € õ ˜Z¨À=ÐQÑQÔQÐQr   ÚNonec                 ó  — t          j        d¬¦  «        } |                      ddt          dd¬¦  «         |                      dd	t          d
d¬¦  «         |                      dt          dd¬¦  «         |                      ¦   «         }t          |j        |j        |j	        ¬¦  «        }t          dt          |¦  «        › d|j        j        › d�¦  «         |D ]4}t          d|j        › d|                     ¦   «         j        › d�¦  «         Œ5d
S )z&CLI entry point for mipmap generation.z"FreeExile Texture Mipmap Generator)Údescriptionz--inputz-iTzInput texture file)ÚtypeÚrequiredÚhelpz--output-dirz-oNzOutput directory)rO   ÚdefaultrQ   z	--min-dimr   zMinimum dimension (default: 1)r,   z
Generated z mipmap levels for ú:z  - z (z bytes))ÚargparseÚArgumentParserÚadd_argumentr   r   Ú
parse_argsrH   Úinputr"   Úmin_dimÚprintÚlenÚnameÚstatÚst_size)ÚparserÚargsÚpathsÚps       r   Úmainrc   H   s  € åÔ$Ð1UÐVÑVÔV€FØ
×Ò˜	 4­d¸TÐH\ÐÑ]Ô]Ð]Ø
×Ò˜¨µ4ÀÐL^ÐÑ_Ô_Ð_Ø
×Ò˜­#°qÐ?_ÐÑ`Ô`Ð`Ø×ÒÑÔ€Då˜dœj¨$¬/ÈÌÐVÑVÔV€EÝ	Ð
H•s˜5‘z”zÐ
HÐ
H°d´j´oÐ
HÐ
HÐ
HÑIÔIÐIØð :ð :ˆÝÐ8�Q”VÐ8Ð8˜qŸvšv™xœxÔ/Ð8Ð8Ð8Ñ9Ô9Ð9Ð9ð:ð :r   Ú__main__)r   )r	   r
   r   r   r   r   )Nr   )r    r!   r"   r#   r   r   r   r$   )rI   r!   r"   r#   r   r   r   r$   )r   rL   )Ú__doc__Ú
__future__r   rT   Úpathlibr   Útypingr   r   ÚPILr   r   rH   rK   rc   Ú__name__© r   r   ú<module>rl      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à Ð Ð Ð Ð Ð ð
 ðð ð ð ð ð* (,Øðð ð ð ð ð: (,ØðRð Rð Rð Rð Rð:ð :ð :ð :ð ˆzÒÐØ€D�F„F€F€F€Fð Ðr   