§
    ]å®jÒ4  ã                  óp   — d Z ddlmZ ddl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 G d„ d¦  «        ZdS )ut  AutoPOE2 - Direct Memory NavMesh Bitset Fusion (Doc 69 Â§3.4 / SSoT 2026).
=============================================================================
Module bÃ³c tÃ¡ch vÃ  há»£p nháº¥t Bitset Ä‘á»‹a hÃ¬nh trá»±c tiáº¿p tá»« RAM game POE2 vá»›i Minimap Fog:
- Direct Memory NavMesh (TerrainGrid): LÆ°u trá»¯ báº£n Ä‘á»“ Ã´ Ä‘i Ä‘Æ°á»£c (walkable) dÆ°á»›i dáº¡ng
  máº£ng bitset 64-bit uint64 (1 bit = 1 cell), náº¡p trá»±c tiáº¿p tá»« con trá»� TerrainData trong RAM.
- Bitwise Fusion: PhÃ©p giao thoa logic O(1) theo tá»«ng khá»‘i 64 Ã´ giá»¯a Ä‘á»‹a hÃ¬nh gá»‘c vÃ 
  vÃ¹ng sÆ°Æ¡ng mÃ¹ Minimap (Fog of War) Ä‘Ã£ Ä‘Æ°á»£c khÃ¡m phÃ¡.
- A* Bitset Routing: Thuáº­t toÃ¡n tÃ¬m Ä‘Æ°á»�ng toÃ n báº£n Ä‘á»“ hoÃ n táº¥t trong < 1.0ms, thay tháº¿
  hoÃ n toÃ n viá»‡c Ä‘á»�c OCR cháº­m cháº¡p tá»«ng waypoint quang há»�c (tÄƒng tá»‘c quÃ©t sáº¡ch map gáº¥p 3 láº§n).

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Dual-Track Operational Doctrine, Python 3.11 Tier 2 Cold Path.
- Rule 4: Module hÃ³a Ä‘á»™c láº­p, tráº§n file < 500 dÃ²ng.
- Rule 5: 100% test case kiá»ƒm thá»­ thá»±c nghiá»‡m.
- Báº¥t biáº¿n: INV-TERRAIN-ORIGIN, INV-WASD-NO-BLIND-LMB.
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚSetÚTuplec                  ó¢   — e Zd ZdZ	 	 	 	 	 d:d;d„Zd<d„Zd=d„Zd>d?d„Zd@dAd„ZdBd „Z	dBd!„Z
d@dCd#„ZdDdEd&„ZdFdGd*„ZdHd.„ZdId/„ZdJd0„ZdKdLd3„ZdMd8„Zd9S )NÚDirectNavMeshBitsetFusionuA   Quáº£n trá»‹ NavMesh Bitset káº¿t há»£p RAM game vÃ  Minimap Fog.é€   ç     À%@ç        ÚcolsÚintÚrowsÚgrid_to_world_scaleÚfloatÚworld_origin_xÚworld_origin_yÚreturnÚNonec                ó4  — || _         || _        || _        || _        || _        |dz   dz  | _        | j        | j        z  }t          j        |t          j        ¬¦  «        | _	        t          j        |t          j        ¬¦  «        | _
        d| _        d| _        dS )u¬  Khá»Ÿi táº¡o lÆ°á»›i bitset há»£p nháº¥t Ä‘á»‹a hÃ¬nh.

        Args:
            cols: Sá»‘ cá»™t cá»§a lÆ°á»›i Ä‘á»‹a hÃ¬nh.
            rows: Sá»‘ hÃ ng cá»§a lÆ°á»›i Ä‘á»‹a hÃ¬nh.
            grid_to_world_scale: Tá»· lá»‡ quy Ä‘á»•i tá»« Ã´ lÆ°á»›i sang Ä‘Æ¡n vá»‹ tháº¿ giá»›i PoE (units).
            world_origin_x: Tá»�a Ä‘á»™ X gá»‘c tháº¿ giá»›i.
            world_origin_y: Tá»�a Ä‘á»™ Y gá»‘c tháº¿ giá»›i.
        é?   é@   )Údtyper   N)r   r   Ú
grid_scaleÚorigin_xÚorigin_yÚwords_per_rowÚnpÚzerosÚuint64Úwalkable_bitsÚexplored_bitsÚtotal_walkable_cellsÚexplored_walkable_cells)Úselfr   r   r   r   r   Útotal_wordss          úRC:\Projects\AutoPOE2\src\assistant_tool\navigation\direct_navmesh_bitset_fusion.pyÚ__init__z"DirectNavMeshBitsetFusion.__init__   s‘   € ð" ˆŒ	ØˆŒ	Ø-ˆŒØ&ˆŒØ&ˆŒà" R™i¨BÑ.ˆÔØ”i $Ô"4Ñ4ˆõ  œX k½¼ÐCÑCÔCˆÔÝœX k½¼ÐCÑCÔCˆÔà)*ˆÔ!Ø,-ˆÔ$Ð$Ð$ó    ÚwxÚwyúTuple[int, int]c                óf  — t          t          j        || j        z
  | j        z  ¦  «        ¦  «        }t          t          j        || j        z
  | j        z  ¦  «        ¦  «        }t          dt          | j        dz
  |¦  «        ¦  «        }t          dt          | j	        dz
  |¦  «        ¦  «        }||fS )uN   Chuyá»ƒn Ä‘á»•i tá»�a Ä‘á»™ tháº¿ giá»›i sang tá»�a Ä‘á»™ Ã´ lÆ°á»›i (gx, gy).r   é   )
r   ÚmathÚfloorr   r   r   ÚmaxÚminr   r   )r'   r,   r-   ÚgxÚgys        r)   Úworld_to_gridz'DirectNavMeshBitsetFusion.world_to_grid@   s“   € å•”˜R $¤-Ñ/°4´?ÑBÑCÔCÑDÔDˆÝ•”˜R $¤-Ñ/°4´?ÑBÑCÔCÑDÔDˆÝ�•C˜œ	 A™ rÑ*Ô*Ñ+Ô+ˆÝ�•C˜œ	 A™ rÑ*Ô*Ñ+Ô+ˆØ�2ˆvˆr+   r5   r6   úTuple[float, float]c                ó^   — | j         |dz   | j        z  z   }| j        |dz   | j        z  z   }||fS )uO   Chuyá»ƒn Ä‘á»•i tá»�a Ä‘á»™ Ã´ lÆ°á»›i sang tá»�a Ä‘á»™ tháº¿ giá»›i (tÃ¢m Ã´).g      à?)r   r   r   )r'   r5   r6   r,   r-   s        r)   Úgrid_to_worldz'DirectNavMeshBitsetFusion.grid_to_worldH   s9   € àŒ]˜b 3™h¨$¬/Ñ9Ñ9ˆØŒ]˜b 3™h¨$¬/Ñ9Ñ9ˆØ�2ˆvˆr+   çš™™™™™É?é*   Úobstacle_ratioÚseedc                óœ  — t           j                             |¦  «        }| j        | j        z  }|                     dt          j        t           j        ¦  «        j        |t           j        ¬¦  «        }|                     |¦  «        |k    }|| 	                    t           j        ¦  «        z  | _
        |                      ¦   «         | _        dS )uf   Khá»Ÿi táº¡o dá»¯ liá»‡u Ä‘á»‹a hÃ¬nh máº«u chuáº©n thá»±c nghiá»‡m (dÃ¹ng cho Headless Test Harness).r   )Úsizer   N)r    ÚrandomÚdefault_rngr   r   ÚintegersÚiinfor"   r3   Úastyper#   Ú_count_walkable_cellsr%   )r'   r=   r>   Úrngr(   Ú	raw_wordsÚ
mask_wordss          r)   Úinitialize_synthetic_gridz3DirectNavMeshBitsetFusion.initialize_synthetic_gridN   s£   € åŒi×#Ò# DÑ)Ô)ˆØ”i $Ô"4Ñ4ˆØ—L’L ¥B¤H­R¬YÑ$7Ô$7Ô$;À+ÕUWÔU^�LÑ_Ô_ˆ	ð —Z’Z Ñ,Ô,¨~Ò=ˆ
Ø&¨×):Ò):½2¼9Ñ)EÔ)EÑEˆÔð %)×$>Ò$>Ñ$@Ô$@ˆÔ!Ð!Ð!r+   TÚwalkableÚboolc                ó¦  — d|cxk    r| j         k     r¸n dS d|cxk    r| j        k     r¤n dS || j        z  |dz  z   }t          j        d|dz  z  ¦  «        }t          | j        |         |z  ¦  «        }|r)|s'| j        |xx         |z  cc<   | xj        dz  c_        dS |s.|r.| j        |xx         | z  cc<   | xj        dz  c_        dS dS dS dS dS )u7   Ä�áº·t tráº¡ng thÃ¡i Ä‘i Ä‘Æ°á»£c cho má»™t Ã´ lÆ°á»›i.r   r   r0   N)r   r   r   r    r"   rL   r#   r%   )r'   r5   r6   rK   Úword_idxÚbit_maskÚwas_walkables          r)   Úset_cell_walkablez+DirectNavMeshBitsetFusion.set_cell_walkable[   sJ  € à�ÐÐÒÐ�T”YÒÐÐÐÐÐ 1¨Ð#6Ð#6Ò#6Ð#6¨T¬YÒ#6Ð#6Ð#6Ð#6Ð#6Ð#6Ø˜DÔ.Ñ.°"¸±(Ñ;ˆHÝ”y  r¨B¡w¡Ñ0Ô0ˆHÝ Ô 2°8Ô <¸xÑ GÑHÔHˆLàð / ð /ØÔ" 8Ð,Ð,Ô,°Ñ8Ð,Ð,Ñ,ØÐ)Ô)¨QÑ.Ð)Ô)Ð)Ð)Øð / ,ð /ØÔ" 8Ð,Ð,Ô,°°	Ñ9Ð,Ð,Ñ,ØÐ)Ô)¨QÑ.Ð)Ô)Ð)Ð)ð ÐÐ#6Ð#6ð/ð /ð /ð /r+   c                óä   — d|cxk    r| j         k     r]n nZd|cxk    r| j        k     rHn nE|| j        z  |dz  z   }t          | j        |         t          j        d|dz  z  ¦  «        z  ¦  «        S dS )u8   Kiá»ƒm tra má»™t Ã´ lÆ°á»›i cÃ³ Ä‘i Ä‘Æ°á»£c hay khÃ´ng.r   r   r0   F)r   r   r   rL   r#   r    r"   ©r'   r5   r6   rN   s       r)   Úis_walkablez%DirectNavMeshBitsetFusion.is_walkablei   ó‘   € à�ÐÐÒÐ�T”YÒÐÐÐÐ 1¨Ð#6Ð#6Ò#6Ð#6¨T¬YÒ#6Ð#6Ð#6Ð#6Ð#6Ø˜DÔ.Ñ.°"¸±(Ñ;ˆHÝ˜Ô*¨8Ô4µr´yÀÀrÈBÁwÁÑ7PÔ7PÑPÑQÔQÐQØˆur+   c                óä   — d|cxk    r| j         k     r]n nZd|cxk    r| j        k     rHn nE|| j        z  |dz  z   }t          | j        |         t          j        d|dz  z  ¦  «        z  ¦  «        S dS )uE   Kiá»ƒm tra má»™t Ã´ lÆ°á»›i Ä‘Ã£ Ä‘Æ°á»£c má»Ÿ sÆ°Æ¡ng mÃ¹ hay chÆ°a.r   r   r0   F)r   r   r   rL   r$   r    r"   rS   s       r)   Úis_exploredz%DirectNavMeshBitsetFusion.is_exploredp   rU   r+   Úexploredc                ó  — d|cxk    r| j         k     ræn dS d|cxk    r| j        k     rÒn dS || j        z  |dz  z   }t          j        d|dz  z  ¦  «        }t          | j        |         |z  ¦  «        }|rA|s?| j        |xx         |z  cc<   |                      ||¦  «        r| xj        dz  c_        dS dS |sD|rD| j        |xx         | z  cc<   |                      ||¦  «        r| xj        dz  c_        dS dS dS dS dS dS )u=   Ä�Ã¡nh dáº¥u má»™t Ã´ lÆ°á»›i Ä‘Ã£ Ä‘Æ°á»£c má»Ÿ sÆ°Æ¡ng mÃ¹.r   r   r0   N)	r   r   r   r    r"   rL   r$   rT   r&   )r'   r5   r6   rX   rN   rO   Úwas_exploreds          r)   Úset_exploredz&DirectNavMeshBitsetFusion.set_exploredw   sŽ  € à�ÐÐÒÐ�T”YÒÐÐÐÐÐ 1¨Ð#6Ð#6Ò#6Ð#6¨T¬YÒ#6Ð#6Ð#6Ð#6Ð#6Ð#6Ø˜DÔ.Ñ.°"¸±(Ñ;ˆHÝ”y  r¨B¡w¡Ñ0Ô0ˆHÝ Ô 2°8Ô <¸xÑ GÑHÔHˆLàð 6 ð 6ØÔ" 8Ð,Ð,Ô,°Ñ8Ð,Ð,Ñ,Ø×#Ò# B¨Ñ+Ô+ð 6ØÐ0Ô0°AÑ5Ð0Ô0Ð0Ð0ð6ð 6àð 6 ,ð 6ØÔ" 8Ð,Ð,Ô,°°	Ñ9Ð,Ð,Ñ,Ø×#Ò# B¨Ñ+Ô+ð 6ØÐ0Ô0°AÑ5Ð0Ô0Ð0Ð0ð ÐÐ#6Ð#6ð6ð 6ð 6ð 6ð6ð 6r+   ç     ÀR@Úradiusc                ó”  — |                       ||¦  «        \  }}t          t          j        || j        z  ¦  «        ¦  «        }t          | |dz   ¦  «        D ]p}||z   }|dk     s|| j        k    rŒt          | |dz   ¦  «        D ]B}	||	z   }
|
dk     s|
| j        k    rŒ|	|	z  ||z  z   ||z  k    r|                      |
|d¦  «         ŒCŒqdS )uU   Xáº£ sÆ°Æ¡ng mÃ¹ quanh vá»‹ trÃ­ tháº¿ giá»›i cá»§a nhÃ¢n váº­t trong bÃ¡n kÃ­nh FoV.r0   r   TN)	r7   r   r1   Úceilr   Úranger   r   r[   )r'   r,   r-   r]   r5   r6   Úcell_radiusÚdyÚnyÚdxÚnxs              r)   Úreveal_fog_around_world_posz5DirectNavMeshBitsetFusion.reveal_fog_around_world_pos‡   sú   € à×#Ò# B¨Ñ+Ô+‰ˆˆBÝ�$œ) F¨T¬_Ñ$<Ñ=Ô=Ñ>Ô>ˆå˜˜ k°A¡oÑ6Ô6ð 		4ð 		4ˆBØ�b‘ˆBØ�AŠvˆv˜˜tœyš˜ØÝ˜[˜L¨+¸©/Ñ:Ô:ð 4ð 4�Ø˜"‘W�Ø˜’6�6˜R 4¤9š_˜_ØØ˜‘7˜R "™WÑ$¨°kÑ(AÒAÐAØ×%Ò% b¨"¨dÑ3Ô3Ð3øð4ð			4ð 		4r+   é   Úmax_frontiersúList[Tuple[int, int]]c                óÔ  — g }t          d| j        dz
  ¦  «        D �]K}t          d| j        dz
  ¦  «        D �].}|                      ||¦  «        �r|                      ||¦  «        rþ|                      |dz   |¦  «        r|                      |dz   |¦  «         p˜|                      |dz
  |¦  «        o|                      |dz
  |¦  «         pe|                      ||dz   ¦  «        o|                      ||dz   ¦  «         p2|                      ||dz
  ¦  «        o|                      ||dz
  ¦  «         }|r0|                     ||f¦  «         t          |¦  «        |k    r|c c S �Œ0�ŒM|S )uÀ   TrÃ­ch xuáº¥t cÃ¡c Ã´ biÃªn Frontier (Ã´ Ä‘Ã£ má»Ÿ sÆ°Æ¡ng ká»� sÃ¡t Ã´ sÆ°Æ¡ng mÃ¹ chÆ°a má»Ÿ).

        Sá»­ dá»¥ng phÃ©p so sÃ¡nh máº£ng tá»‘i Æ°u Ä‘á»ƒ Ä‘áº¡t tá»‘c Ä‘á»™ < 0.2ms.
        r0   )r`   r   r   rT   rW   ÚappendÚlen)r'   rh   Ú	frontiersr6   r5   Úhas_unexploreds         r)   Úextract_frontier_cellsz0DirectNavMeshBitsetFusion.extract_frontier_cells—   s¾  € ð
 ,.ˆ	Ý˜˜4œ9 q™=Ñ)Ô)ð 	-ñ 	-ˆBÝ˜A˜tœy¨1™}Ñ-Ô-ð -ñ -�Ø×#Ò# B¨Ñ+Ô+ñ -°×0@Ò0@ÀÀRÑ0HÔ0Hð -ð ×)Ò)¨"¨q©&°"Ñ5Ô5ÐZ¸d×>NÒ>NÈrÐTUÉvÐWYÑ>ZÔ>ZÐ:Zð _Ø ×,Ò,¨R°!©V°RÑ8Ô8Ð]À×AQÒAQÐRTÐWXÑRXÐZ\ÑA]ÔA]Ð=]ð_à ×,Ò,¨R°°a±Ñ8Ô8Ð]À×AQÒAQÐRTÐVXÐ[\ÑV\ÑA]ÔA]Ð=]ð_ð !×,Ò,¨R°°a±Ñ8Ô8Ð]À×AQÒAQÐRTÐVXÐ[\ÑV\ÑA]ÔA]Ð=]ð	 #ð &ð -Ø!×(Ò(¨"¨b¨Ñ2Ô2Ð2Ý˜y™>œ>¨]Ò:Ð:Ø#,Ð,Ð,Ð,Ð,Ð,ùñ-ð Ðr+   Ústart_worldÚ
goal_worldú'Tuple[List[Tuple[float, float]], float]c                ó‚  ‡‡— t          j        ¦   «         }|                      |d         |d         ¦  «        \  }}|                      |d         |d         ¦  «        \  ŠŠ|                      ||¦  «        s|                      ||¦  «        \  }}|                      ‰‰¦  «        s|                      ‰‰¦  «        \  ŠŠ|‰k    r$|‰k    rt          j        ¦   «         |z
  dz  }|g|fS g }||f}‰‰f}	t          j        ‰|z
  ‰|z
  ¦  «        }
t          j        ||
|
|f¦  «         i }|di}g d¢}d}d}|�r1||k     �r*|dz  }t          j	        |¦  «        \  }}}||	k    r3|  
                    ||¦  «        }t          j        ¦   «         |z
  dz  }||fS |                     |t          d¦  «        ¦  «        }|D ]¥\  }}}|d         |z   |d         |z   }}|                      ||¦  «        sŒ3||z   }||f}||                     |t          d¦  «        ¦  «        k     rB|||<   |||<   t          j        ‰|z
  ‰|z
  ¦  «        }||z   }t          j        ||||f¦  «         Œ¦|r||k     �°*t          |                     ¦   «         ˆˆfd„¬	¦  «        }|  
                    ||¦  «        }t          j        ¦   «         |z
  dz  }||fS )
uÊ  TÃ¬m Ä‘Æ°á»�ng Ä‘i tá»‘i Æ°u toÃ n báº£n Ä‘á»“ tá»« Start tá»›i Goal báº±ng A* trÃªn Bitset.

        Ä�á»™ trá»… tÃ­nh toÃ¡n báº¯t buá»™c < 1.0 ms.

        Args:
            start_world: Tá»�a Ä‘á»™ (X, Y) tháº¿ giá»›i cá»§a Ä‘iá»ƒm xuáº¥t phÃ¡t.
            goal_world: Tá»�a Ä‘á»™ (X, Y) tháº¿ giá»›i cá»§a Ä‘iá»ƒm Ä‘Ã­ch.

        Returns:
            Tuple[List[Tuple[float, float]], float]: (Danh sÃ¡ch waypoint tháº¿ giá»›i, thá»�i gian ms).
        r   r0   g     @�@r   ))r0   r   ç      ð?)éÿÿÿÿr   rt   )r   r0   rt   )r   ru   rt   )r0   r0   ç9´Èv¾Ÿö?)ru   r0   rv   )r0   ru   rv   )ru   ru   rv   iÄ	  Úinfc                óR   •— t          j        ‰| d         z
  ‰| d         z
  ¦  «        S )Nr   r0   )r1   Úhypot)ÚnÚgoal_gxÚgoal_gys    €€r)   ú<lambda>z<DirectNavMeshBitsetFusion.find_global_path.<locals>.<lambda>ÿ   s(   ø€ µd´jÀÈ1ÈQÌ4ÁÐQXÐ[\Ð]^Ô[_ÑQ_Ñ6`Ô6`€ r+   )Úkey)ÚtimeÚperf_counterr7   rT   Ú_find_nearest_walkabler1   ry   ÚheapqÚheappushÚheappopÚ_reconstruct_pathÚgetr   r4   Úkeys) r'   rp   rq   Út0Ústart_gxÚstart_gyÚt_msÚopen_setÚ
start_nodeÚ	goal_nodeÚh_startÚ	came_fromÚg_scoreÚneighbors_deltaÚmax_iterationsÚ
iterationsÚ_ÚcurrentÚpathÚcur_grd   rb   Úcostre   rc   Útentative_gÚneighborÚhÚfÚ	best_noder{   r|   s                                  @@r)   Úfind_global_pathz*DirectNavMeshBitsetFusion.find_global_path­   sB  øø€ õ  ÔÑ Ô ˆà!×/Ò/°¸A´ÀÈAÄÑOÔOÑˆ�(Ø×-Ò-¨j¸¬m¸ZÈ¼]ÑKÔKÑˆ�ð ×Ò ¨(Ñ3Ô3ð 	QØ!%×!<Ò!<¸XÀxÑ!PÔ!PÑˆH�hØ×Ò ¨Ñ1Ô1ð 	MØ#×:Ò:¸7ÀGÑLÔLÑˆG�Wà�wÒÐ 8¨wÒ#6Ð#6ÝÔ%Ñ'Ô'¨"Ñ,°Ñ6ˆDØ�< Ð%Ð%ð @BˆØ Ð)ˆ
Ø˜gÐ&ˆ	å”*˜W xÑ/°¸8Ñ1CÑDÔDˆÝŒ�x '¨7°JÐ!?Ñ@Ô@Ð@à<>ˆ	Ø1;¸SÐ0Aˆð
ð 
ð 
ˆð
 ˆØˆ
àñ 	?˜:¨Ò6Ñ6Ø˜!‰OˆJÝ!œM¨(Ñ3Ô3‰MˆAˆq�'à˜)Ò#Ð#à×-Ò-¨i¸ÑAÔA�ÝÔ)Ñ+Ô+¨bÑ0°FÑ:�Ø˜T�zÐ!à—K’K ­¨u©¬Ñ6Ô6ˆEà /ð ?ð ?‘��B˜Ø  œ b™¨'°!¬*°r©/�B�ð ×'Ò'¨¨BÑ/Ô/ð Øà# d™l�Ø ˜8�à §¢¨Xµu¸U±|´|Ñ!DÔ!DÒDÐDØ*1�I˜hÑ'Ø(3�G˜HÑ%Ýœ
 7¨R¡<°¸2±Ñ>Ô>�AØ# a™�AÝ”N 8¨a°°HÐ-=Ñ>Ô>Ð>øð7 ð 	?˜:¨Ò6Ñ6õ< ˜Ÿš™œÐ,`Ð,`Ð,`Ð,`Ð,`ÐaÑaÔaˆ	Ø×%Ò% i°Ñ;Ô;ˆÝÔ!Ñ#Ô# bÑ(¨FÑ2ˆØ�TˆzÐr+   c                óŠ   — | j         dk    rdS t          dt          | j        ¦  «        t          | j         ¦  «        z  ¦  «        S )uM   TÃ­nh toÃ¡n tá»· lá»‡ hoÃ n thÃ nh má»Ÿ sÆ°Æ¡ng mÃ¹ báº£n Ä‘á»“ (0.0 .. 1.0).r   rt   )r%   r4   r   r&   )r'   s    r)   Úexploration_progressz.DirectNavMeshBitsetFusion.exploration_progress  s@   € àÔ$¨Ò)Ð)Ø�3Ý�3�˜dÔ:Ñ;Ô;½eÀDÔD]Ñ>^Ô>^Ñ^Ñ_Ô_Ð_r+   c                ó°   — | j                              t          j        ¦  «        }t	          t          j        |¦  «                             ¦   «         ¦  «        S )u-   Ä�áº¿m sá»‘ bit 1 trong máº£ng walkable_bits.)r#   Úviewr    Úuint8r   Ú
unpackbitsÚsum)r'   Ú	raw_bytess     r)   rF   z/DirectNavMeshBitsetFusion._count_walkable_cells
  s@   € ð Ô&×+Ò+­B¬HÑ5Ô5ˆ	Ý•2”= Ñ+Ô+×/Ò/Ñ1Ô1Ñ2Ô2Ð2r+   é   Úsearch_radiusc                óæ   — t          d|dz   ¦  «        D ]Z}t          | |dz   ¦  «        D ]C}t          | |dz   ¦  «        D ],}||z   ||z   }}|                      ||¦  «        r
||fc c c S Œ-ŒDŒ[||fS )uU   TÃ¬m Ã´ Ä‘i Ä‘Æ°á»£c gáº§n nháº¥t náº¿u tá»�a Ä‘á»™ ban Ä‘áº§u rÆ¡i vÃ o váº­t cáº£n.r0   )r`   rT   )	r'   r5   r6   r©   Úrrb   rd   re   rc   s	            r)   r�   z0DirectNavMeshBitsetFusion._find_nearest_walkable  s¶   € å�q˜-¨!Ñ+Ñ,Ô,ð 	&ð 	&ˆAÝ˜Q˜B  A¡Ñ&Ô&ð &ð &�Ý   A¨¡EÑ*Ô*ð &ð &�BØ "™W b¨2¡g˜�BØ×'Ò'¨¨BÑ/Ô/ð &Ø! 2˜v˜˜˜˜˜˜˜ð&ð&ð&ð
 �2ˆvˆr+   r�   ú&Dict[Tuple[int, int], Tuple[int, int]]r–   úList[Tuple[float, float]]c                ó˜   ‡ — |g}||v r!||         }|                      |¦  «         ||v °!|                     ¦   «          ˆ fd„|D ¦   «         S )uL   TÃ¡i dá»±ng danh sÃ¡ch waypoint tá»�a Ä‘á»™ tháº¿ giá»›i tá»« báº£ng tra A*.c                óB   •— g | ]\  }}‰                      ||¦  «        ‘ŒS © )r:   )Ú.0r5   r6   r'   s      €r)   ú
<listcomp>z?DirectNavMeshBitsetFusion._reconstruct_path.<locals>.<listcomp>'  s-   ø€ ÐDÐDÐD©v¨r°2�×"Ò" 2 rÑ*Ô*ÐDÐDÐDr+   )rk   Úreverse)r'   r�   r–   Ú
grid_nodess   `   r)   r…   z+DirectNavMeshBitsetFusion._reconstruct_path  ss   ø€ ð �Yˆ
Ø˜Ð"Ð"Ø Ô(ˆGØ×Ò˜gÑ&Ô&Ð&ð ˜Ð"Ð"ð 	×ÒÑÔÐð EÐDÐDÐD¸ÐDÑDÔDÐDr+   N)r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )r,   r   r-   r   r   r.   )r5   r   r6   r   r   r8   )r;   r<   )r=   r   r>   r   r   r   )T)r5   r   r6   r   rK   rL   r   r   )r5   r   r6   r   r   rL   )r5   r   r6   r   rX   rL   r   r   )r\   )r,   r   r-   r   r]   r   r   r   )rg   )rh   r   r   ri   )rp   r8   rq   r8   r   rr   )r   r   )r   r   )r¨   )r5   r   r6   r   r©   r   r   r.   )r�   r¬   r–   r.   r   r­   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r7   r:   rJ   rQ   rT   rW   r[   rf   ro   rŸ   r¡   rF   r�   r…   r°   r+   r)   r   r      s�  € € € € € ØKÐKð ØØ%+Ø #Ø #ð.ð .ð .ð .ð .ðBð ð ð ðð ð ð ðAð Að Að Að Að/ð /ð /ð /ð /ðð ð ð ðð ð ð ð6ð 6ð 6ð 6ð 6ð 4ð 4ð 4ð 4ð 4ð ð ð ð ð ð,Uð Uð Uð Uðn`ð `ð `ð `ð3ð 3ð 3ð 3ðð ð ð ð ðEð Eð Eð Eð Eð Er+   r   )r¸   Ú
__future__r   r‚   r1   r   Útypingr   r   r   r   r   r	   Únumpyr    r   r°   r+   r)   ú<module>r¼      sÀ   ððð ð" #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à Ð Ð Ð ðKEð KEð KEð KEð KEñ KEô KEð KEð KEð KEr+   