§
    6¬jü)  ã                  ó   — d Z ddlmZ ddlmZmZ ddlZddlZddlm	Z	m
Z
mZmZmZmZ ddlZ	 ddlmZ n# e$ r dZY nw xY wddlmZmZmZmZmZmZ  ed¬	¦  «         G d
„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )u  AutoPOE2 - Auto-Camera & Dynamic Minimap Calibrator (Doc 69 Â§3.4 / Stage 5).
=============================================================================
Module tá»± Ä‘á»™ng hiá»‡u chuáº©n gÃ³c xoay camera vÃ  tá»· lá»‡ phÃ³ng to thu nhá»� cá»§a Minimap:
- Nháº­n diá»‡n má»©c Ä‘á»™ zoom (Minimap / Camera Zoom Level: 0.5x .. 8.0x) tá»« OCR banner
  hoáº·c phÃ¢n tÃ­ch Ä‘áº·c trÆ°ng thá»‹ giÃ¡c cá»§a áº£nh client.
- Tá»± Ä‘á»™ng phÃ¡t hiá»‡n gÃ³c xoay báº£n Ä‘á»“ (Map Orientation / Camera Yaw) thÃ´ng qua
  phá»• gradient cáº¡nh Sobel hoáº·c metadata camera.
- TÃ­nh toÃ¡n ma tráº­n biáº¿n Ä‘á»•i Affine (Rotation & Scale Matrix) 2D Ä‘á»ƒ bÃ¹ trá»« chÃ­nh xÃ¡c
  hÆ°á»›ng di chuyá»ƒn cho MinimapNavigationAdapter trÃªn má»�i gÃ³c Ä‘á»™ camera vÃ  Ä‘á»™ zoom.
- Tá»± Ä‘á»™ng Ä‘iá»�u chá»‰nh thá»�i gian giá»¯ phÃ­m (Dwell time) theo Ä‘á»™ zoom Ä‘á»ƒ triá»‡t tiÃªu
  hiá»‡n tÆ°á»£ng overshoot hoáº·c undershoot khi di chuyá»ƒn.
- TÆ°Æ¡ng thÃ­ch 100% vá»›i Dynamic Resolution Scaler (Windowed 1189x891 PID 22632, 1440p, 1080p, 720p).

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Python 3.11 Cold Path Tier 2.
- Rule 4: Module hÃ³a Ä‘á»™c láº­p tráº§n file < 500 dÃ²ng.
- Rule 16: Google Docstrings chuáº©n má»±c.
- Báº¥t biáº¿n: INV-WASD-MIN-DWELL, INV-NAV-FRONTIER-MOMENTUM, INV-SCALE-IDEMPOTENT-1PX.
é    )Úannotations)Ú	dataclassÚfieldN)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)ÚImage)ÚCoordinateScalerÚ
ResolutionÚ	RES_1080PÚ	RES_1440PÚRES_WINDOWED_DEFAULTÚresolve_resolutionT)Úfrozenc                  óZ   — e Zd ZU dZdZded<   dZded<   dZded<   dZded<   d	Z	d
ed<   dS )ÚCameraMinimapProfileuX   Ä�áº·c táº£ thÃ´ng sá»‘ hÃ¬nh há»�c cá»§a Camera vÃ  Minimap táº¡i má»™t thá»�i Ä‘iá»ƒm.ç      ð?ÚfloatÚ
zoom_levelç        Úorientation_degÚscale_factor_xÚscale_factor_yTÚboolÚis_isometric_modeN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r   r   © ó    úOC:\Projects\AutoPOE2\src\assistant_tool\navigation\minimap_camera_calibrator.pyr   r   -   sn   € € € € € € àbÐbØ€JÐÐÐÑØ €OÐ Ð Ð Ñ Ø€NÐÐÐÑØ€NÐÐÐÑØ"ÐÐ"Ð"Ð"Ñ"Ð"Ð"r%   r   c                  óÜ   — e Zd ZdZ ej        dej        ¦  «        Z ej        dej        ¦  «        Zdde	dfd3d„Z
d4d„Z	 	 d5d6d„Zd7d„Zd8d„Z	 d9d:d „Z	 d;d<d%„Z	 d=d>d*„Z	 	 d?d@d0„ZdAd2„ZdS )BÚMinimapCameraCalibratoruN   Bá»™ hiá»‡u chuáº©n camera vÃ  ma tráº­n xoay/co dÃ£n báº£n Ä‘á»“ con Ä‘á»™ng.z Zoom\s+([0-9]+(?:\.[0-9]+)?)[xX]z2Minimap\s+Zoom\s+(?:In|Out|x([0-9]+(?:\.[0-9]+)?))r   r   TÚ	base_zoomr   Úbase_orientation_degÚtarget_resolutionú"Union[Resolution, Tuple[int, int]]r   r   ÚreturnÚNonec                ó  — t          dt          |¦  «        ¦  «        | _        t          |¦  «        dz  | _        || _        t          |¦  «        | _        t          t          | j        ¬¦  «        | _	        |  
                    ¦   «          dS )u�  Khá»Ÿi táº¡o MinimapCameraCalibrator.

        Args:
            base_zoom: Má»©c zoom ban Ä‘áº§u (máº·c Ä‘á»‹nh 1.0x).
            base_orientation_deg: GÃ³c xoay ban Ä‘áº§u tÃ­nh báº±ng Ä‘á»™ (máº·c Ä‘á»‹nh 0.0 Ä‘á»™).
            target_resolution: Ä�á»™ phÃ¢n giáº£i mÃ n hÃ¬nh client.
            is_isometric_mode: True náº¿u Ã¡p dá»¥ng gÃ³c nghiÃªng Isometric 45 Ä‘á»™.
        çš™™™™™É?ç     €v@)Ú
source_resÚ
target_resN)Úmaxr   r   r   r   r   Ú
resolutionr   r   ÚscalerÚ_update_transform_matrices)Úselfr)   r*   r+   r   s        r&   Ú__init__z MinimapCameraCalibrator.__init__>   sy   € õ "% S­%°	Ñ*:Ô*:Ñ!;Ô!;ˆŒÝ&+Ð,@Ñ&AÔ&AÀEÑ&IˆÔØ'8ˆÔÝ&8Ð9JÑ&KÔ&KˆŒÝ&µ)ÈÌÐXÑXÔXˆŒà×'Ò'Ñ)Ô)Ð)Ð)Ð)r%   c                ó8  — t          j        | j        ¦  «        }t          j        |¦  «        }t          j        |¦  «        }t          j        || g||ggt
          j        ¬¦  «        | _        t          j        ||g| |ggt
          j        ¬¦  «        | _	        dS )u-   Cáº­p nháº­t ma tráº­n xoay vÃ  tá»· lá»‡ 2D.©ÚdtypeN)
ÚmathÚradiansr   ÚcosÚsinÚnpÚarrayÚfloat64Ú_rot_matrixÚ_inv_rot_matrix)r8   ÚradÚ	cos_thetaÚ	sin_thetas       r&   r7   z2MinimapCameraCalibrator._update_transform_matricesU   s¦   € åŒl˜4Ô/Ñ0Ô0ˆÝ”H˜S‘M”Mˆ	Ý”H˜S‘M”Mˆ	õ
 œ8Ø˜˜
Ð#Ø˜	Ð"ð%
õ ”ðñ ô ˆÔõ  "œxØ˜	Ð"ØˆZ˜Ð#ð)
õ ”ð ñ  ô  ˆÔÐÐr%   Nr   úOptional[float]r   c                ó¨   — |�"t          dt          |¦  «        ¦  «        | _        |�t          |¦  «        dz  | _        |                      ¦   «          dS )uD   Cáº­p nháº­t thÃ´ng sá»‘ zoom vÃ  gÃ³c xoay báº£n Ä‘á»“ thá»§ cÃ´ng.Nr0   r1   )r4   r   r   r   r7   )r8   r   r   s      r&   Úset_calibrationz'MinimapCameraCalibrator.set_calibrationi   sV   € ð Ð!Ý! #¥u¨ZÑ'8Ô'8Ñ9Ô9ˆDŒOØÐ&Ý#(¨Ñ#9Ô#9¸EÑ#AˆDÔ à×'Ò'Ñ)Ô)Ð)Ð)Ð)r%   r   c                óp   — t          | j        | j        | j        j        | j        j        | j        ¬¦  «        S )u<   Láº¥y snapshot thÃ´ng sá»‘ cáº¥u hÃ¬nh camera hiá»‡n thá»�i.)r   r   r   r   r   )r   r   r   r6   Úscale_xÚscale_yr   )r8   s    r&   Úget_profilez#MinimapCameraCalibrator.get_profilev   s:   € å#Ø”Ø Ô0Øœ;Ô.Øœ;Ô.Ø"Ô4ð
ñ 
ô 
ð 	
r%   Útext_contentÚstrc                óÀ  — |sdS | j                              |¦  «        }|rF	 t          |                     d¦  «        ¦  «        }d|cxk    rdk    rn n|S n# t          $ r Y nw xY w| j                             |¦  «        }|r[|                     d¦  «        rF	 t          |                     d¦  «        ¦  «        }d|cxk    rdk    rn n|S n# t          $ r Y nw xY wdS )uM   TrÃ­ch xuáº¥t má»©c zoom tá»« chuá»—i vÄƒn báº£n OCR trÃªn banner HUD client.Né   r0   g      @@)ÚREGEX_ZOOM_BANNERÚsearchr   ÚgroupÚ
ValueErrorÚREGEX_MINIMAP_ZOOM)r8   rP   ÚmatchÚvalÚmatch_mms        r&   Údetect_zoom_from_banner_textz4MinimapCameraCalibrator.detect_zoom_from_banner_text€   s3  € àð 	Ø�4ð Ô&×-Ò-¨lÑ;Ô;ˆØð 	ðÝ˜EŸKšK¨™NœNÑ+Ô+�Ø˜#Ð%Ð%Ò%Ð% Ò%Ð%Ð%Ð%Ð%Ø�JøøÝð ð ð Ø�ðøøøð Ô*×1Ò1°,Ñ?Ô?ˆØð 	˜Ÿš qÑ)Ô)ð 	ðÝ˜HŸNšN¨1Ñ-Ô-Ñ.Ô.�Ø˜#Ð%Ð%Ò%Ð% Ò%Ð%Ð%Ð%Ð%Ø�JøøÝð ð ð Ø�ðøøøð ˆts#   ¢3A Á
A$Á#A$Â3C Ã
CÃCç      >@Úminimap_grayú
np.ndarrayÚmin_gradient_magc                ó²  — |j         dk    r| j        S t          j        |                     t          j        ¦  «        d¬¦  «        }t          j        |                     t          j        ¦  «        d¬¦  «        }t          j        ||¦  «        }||k    }t          j        |¦  «        dk     r| j        S t          j        t          j	        ||         ||         ¦  «        ¦  «        dz  }t          j
        |dd¬	¦  «        \  }}	t          t          j        |¦  «        ¦  «        }
|	|
         |	|
dz            z   d
z  }|dk     rdnd}||z
  }t          |¦  «        S )u4  Æ¯á»›c lÆ°á»£ng gÃ³c xoay báº£n Ä‘á»“ (Orientation) tá»« phá»• hÆ°á»›ng gradient cá»§a cÃ¡c cáº¡nh Ä‘á»‹a hÃ¬nh.

        Trong báº£n Ä‘á»“ Isometric cá»§a POE2, cÃ¡c cáº¡nh tÆ°á»�ng vÃ  hÃ nh lang cÃ³ xu hÆ°á»›ng
        cháº¡y theo cÃ¡c gÃ³c chá»§ Ä‘áº¡o 45 Ä‘á»™, 135 Ä‘á»™, 225 Ä‘á»™, 315 Ä‘á»™.
        é   rS   )Úaxisr   é   ç     €f@é$   )r   re   )ÚbinsÚrangeç      à?g     €V@g     €F@g     à`@)Úndimr   rA   ÚgradientÚastyperC   ÚhypotÚsumÚdegreesÚarctan2Ú	histogramÚintÚargmaxr   )r8   r^   r`   ÚgxÚgyÚmagÚmaskÚanglesÚhistÚ	bin_edgesÚdominant_binÚdominant_angleÚ	ref_angleÚdelta_angles                 r&   Ú'estimate_orientation_from_minimap_edgesz?MinimapCameraCalibrator.estimate_orientation_from_minimap_edges›   sB  € ð Ô Ò!Ð!ØÔ'Ð'õ Œ[˜×,Ò,­R¬ZÑ8Ô8¸qÐAÑAÔAˆÝŒ[˜×,Ò,­R¬ZÑ8Ô8¸qÐAÑAÔAˆåŒh�r˜2ÑÔˆØÐ%Ò%ˆÝŒ6�$‰<Œ<˜"ÒÐØÔ'Ð'å”�BœJ r¨$¤x°°D´Ñ:Ô:Ñ;Ô;¸eÑCˆõ œ, v°B¸lÐKÑKÔK‰ˆˆiÝ�2œ9 T™?œ?Ñ+Ô+ˆØ# LÔ1°I¸lÈQÑ>NÔ4OÑOÐSVÑVˆð +¨TÒ1Ð1�D�D°uˆ	Ø$ yÑ0ˆå�[Ñ!Ô!Ð!r%   Ú	frame_imgúUnion[np.ndarray, Image.Image]Úocr_textúOptional[str]c                ó’   — |r|                       |¦  «        }|�|| _        |                      ¦   «          |                      ¦   «         S )uQ   Tá»± Ä‘á»™ng phÃ¢n tÃ­ch frame áº£nh vÃ  cáº­p nháº­t cáº¥u hÃ¬nh hiá»‡u chuáº©n.)r\   r   r7   rO   )r8   r€   r‚   Údetected_zooms       r&   Úcalibrate_from_framez,MinimapCameraCalibrator.calibrate_from_frame¿   sR   € ð ð 	0Ø ×=Ò=¸hÑGÔGˆMØÐ(Ø"/�”ð 	×'Ò'Ñ)Ô)Ð)Ø×ÒÑ!Ô!Ð!r%   ÚdxÚdyÚcompensate_orientationúTuple[float, float]c                óv  — t          j        ||gt           j        ¬¦  «        }|r2t          | j        ¦  «        dk    r| j                             |¦  «        }t          t           j         	                    |¦  «        ¦  «        }|dk    r0t          |d         |z  ¦  «        t          |d         |z  ¦  «        fS dS )u®  Chuyá»ƒn Ä‘á»•i vector hÆ°á»›ng di chuyá»ƒn tá»« tá»�a Ä‘á»™ Minimap sang há»‡ Ä‘iá»�u khiá»ƒn thá»±c táº¿.

        Args:
            dx: ThÃ nh pháº§n X cá»§a vector trÃªn Minimap.
            dy: ThÃ nh pháº§n Y cá»§a vector trÃªn Minimap.
            compensate_orientation: True náº¿u Ã¡p dá»¥ng ma tráº­n bÃ¹ trá»« gÃ³c xoay.

        Returns:
            Tuple[float, float]: Vector (dx_calibrated, dy_calibrated).
        r;   g{®Gáz„?gñhãˆµøä>r   rS   )r   r   )
rA   rB   rC   Úabsr   rE   Údotr   ÚlinalgÚnorm)r8   r‡   rˆ   r‰   Úvecr�   s         r&   Útransform_vectorz(MinimapCameraCalibrator.transform_vectorÏ   s§   € õ  Œh˜˜B�x¥r¤zÐ2Ñ2Ô2ˆà!ð 	0¥c¨$Ô*>Ñ&?Ô&?À$Ò&FÐ&FàÔ&×*Ò*¨3Ñ/Ô/ˆCõ •R”Y—^’^ CÑ(Ô(Ñ)Ô)ˆØ�$Š;ˆ;Ý˜˜Qœ $™Ñ'Ô'­¨s°1¬v¸©}Ñ)=Ô)=Ð=Ð=àˆxr%   ç333333Ó?ç      ø?Úraw_dwell_secÚ	min_dwellÚ	max_dwellc                ó–   — t          dt          j        | j        ¦  «        ¦  «        }||z  }t          |t	          ||¦  «        ¦  «        S )u“  Ä�iá»�u chá»‰nh thá»�i gian giá»¯ phÃ­m (Dwell time) theo tá»· lá»‡ zoom cá»§a Minimap.

        Khi Minimap bá»‹ phÃ³ng to (zoom_level > 1.0), khoáº£ng cÃ¡ch pixel trÃªn minimap
        lá»›n hÆ¡n khoáº£ng cÃ¡ch thá»±c táº¿, nÃªn cáº§n co ngáº¯n dwell time Ä‘á»ƒ trÃ¡nh overshoot.
        NgÆ°á»£c láº¡i khi zoom_level < 1.0 (thu nhá»�), cáº§n bÃ¹ trá»« nháº¹ Ä‘á»ƒ Ä‘i Ä‘á»§ quÃ£ng Ä‘Æ°á»�ng.
        ri   )r4   r=   Úsqrtr   Úmin)r8   r”   r•   r–   Ú
zoom_scaleÚadjusteds         r&   Úadjust_dwell_timez)MinimapCameraCalibrator.adjust_dwell_timeì   sE   € õ ˜�dœi¨¬Ñ8Ô8Ñ9Ô9ˆ
Ø  :Ñ-ˆõ �9�c )¨XÑ6Ô6Ñ7Ô7Ð7r%   Úminimap_pixel_distc                ó0   — | j         dk    r|S || j         z  S )uf   Quy Ä‘á»•i khoáº£ng cÃ¡ch pixel trÃªn Minimap thÃ nh khoáº£ng cÃ¡ch tÆ°Æ¡ng Ä‘á»‘i trong tháº¿ giá»›i.r   )r   )r8   r�   s     r&   Úscale_minimap_distance_to_worldz7MinimapCameraCalibrator.scale_minimap_distance_to_worldÿ   s"   € àŒ?˜aÒÐØ%Ð%Ø! D¤OÑ3Ð3r%   )
r)   r   r*   r   r+   r,   r   r   r-   r.   )r-   r.   )NN)r   rI   r   rI   r-   r.   )r-   r   )rP   rQ   r-   rI   )r]   )r^   r_   r`   r   r-   r   )N)r€   r�   r‚   rƒ   r-   r   )T)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"   ÚreÚcompileÚ
IGNORECASErT   rX   r   r9   r7   rK   rO   r\   r   r†   r‘   rœ   rŸ   r$   r%   r&   r(   r(   7   sa  € € € € € ØXÐXð #˜œ
Ð#FÈÌÑVÔVÐØ#˜œÐ$YÐ[]Ô[hÑiÔiÐð Ø&)Ø@IØ"&ð*ð *ð *ð *ð *ð.ð ð ð ð, '+Ø+/ð*ð *ð *ð *ð *ð
ð 
ð 
ð 
ðð ð ð ð< #'ð""ð ""ð ""ð ""ð ""ðN #'ð"ð "ð "ð "ð "ð( (,ð	ð ð ð ð ð@  Øð	8ð 8ð 8ð 8ð 8ð&4ð 4ð 4ð 4ð 4ð 4r%   r(   )r"   Ú
__future__r   Údataclassesr   r   r=   r    Útypingr   r   r   r	   r
   r   ÚnumpyrA   ÚPILr   ÚImportErrorÚsrc.common.coordinate_transformr   r   r   r   r   r   r   r(   r$   r%   r&   ú<module>rª      s•  ððð ð( #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø €€€Ø 	€	€	€	Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :à Ð Ð Ð ðØÐÐÐÐÐÐøØð ð ð Ø€E€E€Eðøøøðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð €�$ÐÑÔð#ð #ð #ð #ð #ñ #ô #ñ Ôð#ðL4ð L4ð L4ð L4ð L4ñ L4ô L4ð L4ð L4ð L4s   ®5 µ?¾?