§
    fâÉjˆ>  ã                   ó˜   — d Z ddlZddlZddlZddlZddlZddlZdd„Zdd„Z	 G d„ d	¦  «        Z
 G d
„ d¦  «        Z G d„ d¦  «        ZdS )a  
Historical 2D Studio - Seven Nguyen Animated Tactical Actor (2026 Engine)
Lead Motion & Pipeline Automation Engineer: Elena Rostova
Head of Audio & Multilingual Localization: Arthur Pendelton

Features:
- Full Autonomic Animation System:
  + Natural Idle Breathing: sinusoidal displacement and subtle chest volume scaling
  + Natural Blinking Controller: 3-phase realistic eye lid closure every 3.5 - 4.5 seconds
  + Phonetic Lip-Sync: Viseme switching (ah, oh, closed, smile) via audio RMS or procedural cadence
  + Micro Head Nodding: Tone-aligned emphasis gestures (0 - 2px)
  + Seamless Skin-Matched Lip Patches with Alpha Feathering and Poisson Blending
- Supports all 5 production poses: p1 (welcome), p2 (pointing right), p3 (pointing left), p4 (crossed arms), p6 (leaning/thinking)
é    Né   é   ç      ð?c                 ó2  — |dk    r| S |                       ¦   «         }| j        dd…         \  }	}
t          |¦  «        t          |¦  «        ft          |¦  «        t          |¦  «        ffD �]*\  }}||z
  dk     s||z   |
k    s||z
  dk     s	||z   |	k    rŒ+t          |	dz
  t	          d||z   dz   ¦  «        ¦  «        }| ||f                              t          ¦  «        }t          j        |	|
ft          j	        ¬¦  «        }t          j        |||f|t	          dt          ||z  ¦  «        ¦  «        fddddd	¦  «         |                     t          ¦  «        d
z  |z  }t          j        |dd…dd…df         dd¬¦  «        }||z  |                     t          ¦  «        d|z
  z  z                        t          j	        ¦  «        }|dk    rÊt          d|dz
  dz  ¦  «        }|dz   }t          j        ||z
  |dz
  g||dz  z
  |g||dz   g||dz  z   |g||z   |dz
  ggt          j        ¦  «                             d¦  «        }|                      ¦   «         }t          j        ||gdddt          j        ¦  «         t          j        |||d|z
  d¦  «        }�Œ,|S )u%  
    Váº½ mi máº¯t chá»›p tá»± nhiÃªn trá»±c tiáº¿p lÃªn khuÃ´n máº·t:
    - lx, ly: tÃ¢m Ä‘á»“ng tá»­ máº¯t trÃ¡i (trÃªn áº£nh)
    - rx, ry: tÃ¢m Ä‘á»“ng tá»­ máº¯t pháº£i (trÃªn áº£nh)
    - rw, rh: bÃ¡n kÃ­nh há»‘c máº¯t (width/height)
    - ratio: tá»· lá»‡ nháº¯m máº¯t (0.0 -> 1.0)
    ç{®Gáz”?Né   r   é   ©Údtypeih  éÿ   éÿÿÿÿç     ào@r   ©Úaxisr   çš™™™™™Ù?ç      à?)r   r	   r   F)é(   é    é#   )ÚcopyÚshapeÚintÚminÚmaxÚastypeÚfloatÚnpÚzerosÚuint8Úcv2ÚellipseÚrepeatÚarrayÚint32ÚreshapeÚ	polylinesÚLINE_AAÚaddWeighted)Úbase_bgrÚlxÚlyÚrxÚryÚrwÚrhÚratioÚresÚbhÚbwÚcxÚcyÚsample_yÚ
skin_colorÚmaskÚalphaÚalpha_3dÚ
alpha_lashÚarc_yÚptsÚ
lash_layers                         ú<c:\Projects\Historical 2d\src\tactical_engine\seven_actor.pyÚdraw_natural_eye_blinkr@      s¨  € ð �‚}€}Øˆà
�-Š-‰/Œ/€CØŒ^˜B˜Q˜BÔ�F€Bˆå˜‘G”G�S ™WœWÐ%­¨B©¬µ°R±´Ð'9Ð:ð Tñ T‰ˆˆBØ�‰7�QŠ;ˆ;˜"˜r™' Rš-˜-¨2°©7°Qª;¨;¸"¸r¹'ÀRº-¸-Øå�r˜A‘v�s 1 b¨2¡g°¡kÑ2Ô2Ñ3Ô3ˆØ˜h¨˜lÔ+×2Ò2µ5Ñ9Ô9ˆ
åŒx˜˜R˜­¬Ð1Ñ1Ô1ˆÝŒ�D˜2˜r˜( R­¨Qµ°B¸±J±´Ñ)@Ô)@Ð$AÀ1ÀaÈÈcÐSUÑVÔVÐVà—’�UÑ#Ô# eÑ+¨uÑ4ˆÝ”9˜U 1 1 1 a a a¨ :Ô.°¸Ð:Ñ:Ô:ˆØ˜HÑ$ s§z¢zµ%Ñ'8Ô'8¸CÀ(¹NÑ'KÑK×SÒSÕTVÔT\Ñ]Ô]ˆà�3Š;ˆ;Ý˜S 5¨3¡;°#Ñ"5Ñ6Ô6ˆJØ˜‘FˆEÝ”(Ø�b‘˜% !™)Ð$Ø�b˜A‘g‘˜uÐ%Ø�U˜Q‘Y�Ø�b˜A‘g‘˜uÐ%Ø�b‘˜% !™)Ð$ðõ Œxñô ÷ !š Ñ,Ô,ð ð Ÿš™œˆJÝŒM˜* s e¨U°LÀ!ÅSÄ[ÑQÔQÐQÝ”/ *¨j¸#¸sÀZÑ?OÐQRÑSÔSˆCùà€Jó    c                 ó  — |�|dk    r| S |dk    r‹t          dt          |j        d         |z  ¦  «        ¦  «        }t          dt          |j        d         |z  ¦  «        ¦  «        }t          j        |||f|dk     rt          j        nt          j        ¬¦  «        }|j        \  }}	}
| j        \  }}}
t          dt          |¦  «        ¦  «        t          dt          |¦  «        ¦  «        }}t          |t          ||	z   ¦  «        ¦  «        t          |t          ||z   ¦  «        ¦  «        }}||k    s||k    r| S |t          |¦  «        z
  }|t          |¦  «        z
  }|||z
  z   }|||z
  z   }|||…||…f         }|dd…dd…df                              t          j
        ¦  «        dz  |z  }t          j        |dd…dd…t          j        f         dd	¬
¦  «        }| ||…||…f                              t          j
        ¦  «        }|dd…dd…dd…f                              t          j
        ¦  «        }||z  |d|z
  z  z   }t          j        |dd¦  «                             t          j        ¦  «        | ||…||…f<   | S )uV   ChÃ¨n sprite BGRA vÃ o frame BGR vá»›i vá»‹ trÃ­, tá»· lá»‡ vÃ  Ä‘á»™ má»� mong muá»‘nNçü©ñÒMbP?r   r	   r   ©Úinterpolationr   r   r   r   r   )r   r   r   r    ÚresizeÚ
INTER_AREAÚINTER_LINEARr   r   r   Úfloat32r"   ÚnewaxisÚclipr   )Údst_bgrÚsrc_bgraÚxÚyÚscaleÚopacityÚnew_wÚnew_hÚshÚswÚ_ÚdhÚdwÚx1Úy1Úx2Úy2Úsx1Úsy1Úsx2Úsy2Úsrc_cropr9   r:   Údst_cropÚsrc_rgbÚblendeds                              r?   Úoverlay_alpha_imagere   C   sl  € àÐ˜7 eÒ+Ð+Øˆà�‚|€|Ý�A•s˜8œ>¨!Ô,¨uÑ4Ñ5Ô5Ñ6Ô6ˆÝ�A•s˜8œ>¨!Ô,¨uÑ4Ñ5Ô5Ñ6Ô6ˆÝ”:˜h¨°¨ÐX]Ð`cÒXcÐXcÅcÄnÀnÕilÔiyÐzÑzÔzˆà”�I€BˆˆAØ”�I€BˆˆAå�•C˜‘F”F‰^Œ^�S ¥C¨¡F¤F™^œ^ˆ€BÝ�•S˜˜R™‘[”[Ñ!Ô!¥3 r­3¨q°2©v©;¬;Ñ#7Ô#7ˆ€Bà	ˆR‚x€x�2˜’8�8Øˆà
�s�1‰vŒv‰+€CØ
�s�1‰vŒv‰+€CØ
��b‘‰/€CØ
��b‘‰/€Cà˜˜C˜  S Ð(Ô)€HØ�a�a�a˜˜˜˜A�gÔ×%Ò%¥b¤jÑ1Ô1°EÑ9¸WÑD€EÝŒy˜˜q˜q˜q ! ! !¥R¤ZÐ/Ô0°!¸!Ð<Ñ<Ô<€Hà�r˜"�u˜b ˜e�|Ô$×+Ò+­B¬JÑ7Ô7€HØ�q�q�q˜!˜!˜!˜R˜a˜R�xÔ ×'Ò'­¬
Ñ3Ô3€Gà˜Ñ  8¨s°X©~Ñ#>Ñ>€GÝœG G¨Q°Ñ4Ô4×;Ò;½B¼HÑEÔE€GˆBˆrˆE�2�b�5ˆLÑØ€NrA   c                   ó    — e Zd ZdZdd„Zd„ ZdS )ÚBlinkingControlleruN   Bá»™ Ä‘iá»�u khiá»ƒn chu ká»³ chá»›p máº¯t tá»± nhiÃªn 3.5 - 4.5 giÃ¢y / láº§nçffffff@c                 ó   — || _         d S )N©Ú	cycle_sec)Úselfrk   s     r?   Ú__init__zBlinkingController.__init__h   s   € Ø"ˆŒˆˆrA   c                 ót   — || j         z  }| j         dz
  }||k    r||z
  }|dk     rdS |dk     rdS |dk     rdS dS )	NgìQ¸…ëÁ?g{®Gáz¤?gš™™™™™á?ç{®Gáz´?r   g¸…ëQ¸¾?r   ç        rj   )rl   Út_secÚt_modÚblink_startÚdts        r?   Úget_blink_ratioz"BlinkingController.get_blink_ratiok   s^   € à˜œÑ&ˆà”n tÑ+ˆØ�KÒÐØ˜Ñ$ˆBØ�DŠyˆyØ�tØ�d’�Ø�sØ�d’�Ø�tØˆsrA   N)rh   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rm   ru   © rA   r?   rg   rg   f   s=   € € € € € ØXÐXð#ð #ð #ð #ðð ð ð ð rA   rg   c                   ó.   — e Zd ZdZd
d„Zd„ Zdd„Zd„ Zd	S )ÚAudioLipSyncControlleru=   PhÃ¢n tÃ­ch sÃ³ng Ã¢m Ä‘á»ƒ láº¥y RMS vÃ  visemes chÃ­nh xÃ¡cé   ç     €f@c                 ó¨  — || _         t          ||z  ¦  «        | _        t          j        | j        t          j        ¬¦  «        | _        d| _        d| _        |rt          j
                             |¦  «        s|                      ¦   «          d S |dz   }	 t          j
                             |¦  «        r#t          j
                             |¦  «        dk     r9ddd|d	d
dddd|g}t          j        |t          j        t          j        d¬¦  «         t#          j        |d¦  «        }|                     ¦   «         }|                     ¦   «         }|                     |¦  «        }	|                     ¦   «          t          j        |	t          j        ¬¦  «                             t          j        ¦  «        dz  }
|t5          |¦  «        z  }t7          | j        ¦  «        D ]§}t          ||z  ¦  «        }t          |dz   |z  ¦  «        }|t9          |
¦  «        k     rk|
|t;          |t9          |
¦  «        ¦  «        …         }t9          |¦  «        dk    r)t          j        t          j        |dz  ¦  «        ¦  «        nd| j        |<   Œ¨tA          dt5          | j                              ¦   «         ¦  «        ¦  «        | _        tA          dt5          | j                             ¦   «         ¦  «        dz  ¦  «        | _        t          j
                             |¦  «        rt          j!        |¦  «         d S d S # tD          $ r |                      ¦   «          Y d S w xY w)Nr
   r   g      Ð?z.temp_rms.waviè  Úffmpegz-yz-iz-fÚwavz-arÚ44100z-acÚ1T)ÚstdoutÚstderrÚcheckÚrbg      à@r	   r   r   rp   gš™™™™™¹?g¸…ëQ¸Ž?gffffffÖ?)#Úfpsr   Útotal_framesr   r   rI   Ú	frame_rmsÚspeech_threshÚmax_rmsÚosÚpathÚexistsÚ_setup_proceduralÚgetsizeÚ
subprocessÚrunÚDEVNULLÚwaveÚopenÚgetframerateÚ
getnframesÚ
readframesÚcloseÚ
frombufferÚint16r   r   ÚrangeÚlenr   ÚsqrtÚmeanr   ÚremoveÚ	Exception)rl   Úaudio_file_pathrˆ   Ú	total_secÚwav_pathÚcmdÚwfÚsrÚn_framesÚaudio_bytesÚsamplesÚsamples_per_frameÚf_idxÚstart_sÚend_sÚchunks                   r?   rm   zAudioLipSyncController.__init__|   sð  € ØˆŒÝ 	¨C¡Ñ0Ô0ˆÔÝœ $Ô"3½2¼:ÐFÑFÔFˆŒØ!ˆÔØˆŒàð 	¥b¤g§n¢n°_Ñ&EÔ&Eð 	Ø×"Ò"Ñ$Ô$Ð$ØˆFà" _Ñ4ˆð	%Ý”7—>’> (Ñ+Ô+ð f­r¬w¯ª¸xÑ/HÔ/HÈ4Ò/OÐ/OØ  t¨_¸dÀEÈ5ÐRYÐ[`ÐbeÐgoÐp�Ý”˜s­:Ô+=ÅjÔFXÐ`dÐeÑeÔeÐeå”˜8 TÑ*Ô*ˆBØ—’Ñ"Ô"ˆBØ—}’}‘”ˆHØŸ-š-¨Ñ1Ô1ˆKØ�HŠH‰JŒJˆJÝ”m Kµr´xÐ@Ñ@Ô@×GÒGÍÌ
ÑSÔSÐV]Ñ]ˆGØ "¥U¨3¡Z¤Z¡Ðå˜tÔ0Ñ1Ô1ð bð b�Ý˜eÐ&7Ñ7Ñ8Ô8�Ý˜U Q™YÐ*;Ñ;Ñ<Ô<�Ø�S ™\œ\Ò)Ð)Ø# G­C°µs¸7±|´|Ñ,DÔ,DÐ$DÔE�EÝJMÈeÉ*Ì*ÐWXÊ.È.­B¬GµB´G¸EÀ1¹HÑ4EÔ4EÑ,FÔ,FÐ,FÐ^a�D”N 5Ñ)øå˜s¥E¨$¬.×*<Ò*<Ñ*>Ô*>Ñ$?Ô$?Ñ@Ô@ˆDŒLÝ!$ U­E°$´.×2EÒ2EÑ2GÔ2GÑ,HÔ,HÈ4Ñ,OÑ!PÔ!PˆDÔÝŒw�~Š~˜hÑ'Ô'ð $Ý”	˜(Ñ#Ô#Ð#Ð#Ð#ð$ð $øåð 	%ð 	%ð 	%Ø×"Ò"Ñ$Ô$Ð$Ð$Ð$Ð$ð	%øøøs   ÂJL/ Ì/MÍMc                 ó¤   — t          j        d„ t          | j        ¦  «        D ¦   «         t           j        ¬¦  «        | _        d| _        d| _        d S )Nc                 ó@   — g | ]}|d z  dk     r|dz  dz  dk    rdnd‘ŒS )r}   é   éZ   é   r   ro   rp   rz   )Ú.0Úis     r?   ú
<listcomp>z<AudioLipSyncController._setup_procedural.<locals>.<listcomp>¥   s<   € Ð"{Ð"{Ð"{Ð]^¨A°©F°RªK¨K¸QÀ"¹WÈ¹MÈQÒ<NÐ<N 4 4ÐUXÐ"{Ð"{Ð"{rA   r
   g¸…ëQ¸ž?g333333Ã?)r   r#   r�   r‰   rI   rŠ   r‹   rŒ   )rl   s    r?   r�   z(AudioLipSyncController._setup_procedural£   s\   € åœÐ"{Ð"{ÕbgÐhlÔhyÑbzÔbzÐ"{Ñ"{Ô"{õ  DFô  DNð  Oñ  Oô  OˆŒØ!ˆÔØˆŒˆˆrA   Fc                 ó*  — |t          | j        ¦  «        k    r|rdndS | j        |         }|| j        k     r|rdndS || j        z
  t          d| j        | j        z
  ¦  «        z  }|dz  dz  }|dk    r|dv rdnd	S |d
k    rdS |dk    rdS |dk    rd	S dS )NÚsmileÚclosedrC   r   rµ   gÍÌÌÌÌÌÜ?)r   r   ÚahÚohr   r	   r   )rž   rŠ   r‹   r   rŒ   )rl   Ú	frame_idxÚ	scene_endÚrmsÚenergy_ratioÚsteps         r?   Ú
get_visemez!AudioLipSyncController.get_viseme©   sÏ   € Ø�˜DœNÑ+Ô+Ò+Ð+Ø'Ð5�7�7¨XÐ5àŒn˜YÔ'ˆØ�Ô#Ò#Ð#Ø'Ð5�7�7¨XÐ5à˜dÔ0Ñ0µC¸ÀÄÈtÔOaÑ@aÑ4cÔ4cÑcˆØ˜Q‘ !Ñ#ˆØ˜$ÒÐØ 6˜>˜>�4�4¨tÐ3à�qŠyˆyØ�tØ˜’�Ø�xØ˜’�Ø�tà�trA   c           	      ó  — |t          | j        ¦  «        k    rdS | j        |         }|| j        k    rU|| j        z
  t          d| j        | j        z
  ¦  «        z  }t          t          dt          d|¦  «        z  ¦  «        ¦  «        S dS )Nr   rC   gÍÌÌÌÌÌü?r   )rž   rŠ   r‹   r   rŒ   r   Úroundr   )rl   r¾   rÀ   r0   s       r?   Úget_head_nod_offsetz*AudioLipSyncController.get_head_nod_offset¿   s„   € Ø�˜DœNÑ+Ô+Ò+Ð+Ø�1ØŒn˜YÔ'ˆØ�Ô#Ò#Ð#Ø˜4Ô-Ñ-µ°U¸T¼\ÈDÔL^Ñ=^Ñ1`Ô1`Ñ`ˆEÝ•u˜S¥3 s¨E¡?¤?Ñ2Ñ3Ô3Ñ4Ô4Ð4ØˆqrA   N)r}   r~   ©F)rv   rw   rx   ry   rm   r�   rÃ   rÆ   rz   rA   r?   r|   r|   z   sa   € € € € € ØGÐGð%%ð %%ð %%ð %%ðNð ð ðð ð ð ð,ð ð ð ð rA   r|   c                   ó@   — e Zd ZdZd„ Zdd„Zdd„Zdd
„Zdd„Zdd„Z	dS )ÚSevenNguyenActoru­   
    Lá»›p quáº£n lÃ½ diá»…n xuáº¥t hoáº¡t hÃ¬nh toÃ n diá»‡n cá»§a Host Seven Nguyen:
    Bao gá»“m load sprite, chá»›p máº¯t, kháº©u hÃ¬nh, nhá»‹p thá»Ÿ, gáº­t Ä‘áº§u
    c                 ó  — || _         t          j                             |d¦  «        }t          j                             |dd¦  «        }i | _        dD ]w}t          j                             |d|› d�¦  «        }t          j                             |¦  «        r(t          j        |t          j        ¦  «        | j        |<   Œmd | j        |<   Œxt          j                             |d¦  «        }t          j                             |¦  «        rt          j        |¦  «        | _	        nd | _	        i | _
        | j	        �l|                      dd	d
dd¬¦  «        |                      ddddd¬¦  «        |                      ddd
dd¬¦  «        |                      ddddd¬¦  «        dœ| _
        t          d¬¦  «        | _        ddddœddddddd œd!œd"d#d$dœd%d&d'd&ddd œd!œd(d#d$dœd)d&d*d&ddd œd!œd+d,d-dœd.d/d0d/d1dd œd!œd2d3d$dœd4d5d6d5ddd œd!œdœ| _        d S )7NÚoutputÚassetszSeven Nguyen)Úp1Úp2Úp3Úp4Úp6Úfinal_sprite_z.pngz-seven_nguyen_animation_facial_expressions.jpgé¹   éÙ   é   é   rµ   )r,   r-   Úfeatheri  é×   é   iS  é   é   )r»   rº   r¼   r½   rh   rj   é´   éH   gR¸…ëQØ?)r4   r5   rP   é¨   é0   éÀ   é   r   )r*   r+   r,   r-   r.   r/   )ÚmouthÚeyesé–   éX   r   éˆ   é:   é¢   éì   éà   éú   é_   éS   gáz®GáÚ?éN   é8   él   r   ér   éj   éb   éL   é~   )Ú	workspacer�   rŽ   ÚjoinÚspritesr�   r    ÚimreadÚIMREAD_UNCHANGEDÚexpressions_sheetÚmouth_patchesÚ_extract_tight_mouthrg   Ú	blink_ctlÚpose_anchors)rl   Úworkspace_rootÚ
output_dirÚ
assets_dirÚkÚsp_pathÚexp_paths          r?   rm   zSevenNguyenActor.__init__Í   s˜  € Ø'ˆŒÝ”W—\’\ .°(Ñ;Ô;ˆ
Ý”W—\’\ .°(¸NÑKÔKˆ
ð ˆŒØ/ð 	'ð 	'ˆAÝ”g—l’l :Ð/F¸qÐ/FÐ/FÐ/FÑGÔGˆGÝŒw�~Š~˜gÑ&Ô&ð 'Ý"%¤*¨WµcÔ6JÑ"KÔ"K�”˜Q‘�à"&�”˜Q‘�õ ”7—<’< 
Ð,[Ñ\Ô\ˆÝŒ7�>Š>˜(Ñ#Ô#ð 	*Ý%(¤Z°Ñ%9Ô%9ˆDÔ"Ð"à%)ˆDÔ"ð  ˆÔØÔ!Ð-à×3Ò3°C¸ÀÈÐTUÐ3ÑVÔVØ×3Ò3°C¸ÀÈÐTUÐ3ÑVÔVØ×3Ò3°C¸ÀÈÐTUÐ3ÑVÔVØ×3Ò3°C¸ÀÈÐTUÐ3ÑVÔVð	"ð "ˆDÔõ ,°cÐ:Ñ:Ô:ˆŒð
 !$¨2¸Ð=Ð=Ø #¨2°SÀÈ!ÐSTÐUÐUðð ð
 !$¨2¸Ð=Ð=Ø #¨2°SÀÈ!ÐSTÐUÐUðð ð
 !$¨2¸Ð=Ð=Ø #¨2°SÀÈ!ÐSTÐUÐUðð ð
 !#¨"°tÐ<Ð<Ø "¨"°C¸rÈÐRSÐTÐTðð ð
 !$¨3¸Ð>Ð>Ø "¨"°C¸rÈÐRSÐTÐTðð ð#
ð 
ˆÔÐÐrA   rÕ   rÚ   rµ   c                 ón  — ||z
  |z
  }||z   |z   }||z
  |z
  }||z   |z   }	| j         ||	…||…f                              ¦   «         }
|
j        d d…         \  }}t          j        d |…d |…f         \  }}|||z   z
  t          |¦  «        z  }|||z   z
  t          |¦  «        z  }t          j        |dz  |dz  z   ¦  «        }d|t          t          ||¦  «        ¦  «        z  z   }t          j        ||ft          j	        ¬¦  «        }d||dk    <   |dk    ||k     z  }||         dz
  |dz
  z  }ddt          j
        t          j        |z  ¦  «        z   z  ||<   t          j        |
t          j        ¦  «        }t          j        |dz  dd¦  «                             t          j        ¦  «        |d d …d d …df<   |S )Nr   r   r
   r   r   r   r   )rû   r   r   r   Úogridr   rŸ   r   r   rI   ÚcosÚpir    ÚcvtColorÚCOLOR_BGR2BGRArK   r   r   )rl   r4   r5   r,   r-   r×   rY   r[   rZ   r\   ÚcropÚhÚwÚYÚXÚdxÚdyÚdistÚouterr9   Úfeather_maskÚtÚbgras                          r?   rý   z%SevenNguyenActor._extract_tight_mouth  sÂ  € Ø�"‰W�wÑˆØ�"‰W�wÑˆØ�"‰W�wÑˆØ�"‰W�wÑˆØÔ% b¨ e¨R°¨U lÔ3×8Ò8Ñ:Ô:ˆØŒz˜"˜1˜"Œ~‰ˆˆ1åŒx˜˜˜˜B˜Q˜B˜Ô‰ˆˆ1Ø�2˜‘<Ñ ¥E¨"¡I¤IÑ-ˆØ�2˜‘<Ñ ¥E¨"¡I¤IÑ-ˆÝŒw�r˜1‘u˜r 1™u‘}Ñ%Ô%ˆà�g¥¥c¨"¨b¡k¤kÑ 2Ô 2Ñ2Ñ2ˆÝ”˜!˜Q˜¥r¤zÐ2Ñ2Ô2ˆØ ˆˆd�cŠkÑØ˜sš
 t¨e¢|Ñ4ˆØ�,Ô #Ñ%¨%°#©+Ñ6ˆØ! S­2¬6µ"´%¸!±)Ñ+<Ô+<Ñ%<Ñ=ˆˆlÑåŒ|˜D¥#Ô"4Ñ5Ô5ˆÝœ ¨¡¨Q°Ñ4Ô4×;Ò;½B¼HÑEÔEˆˆQˆQˆQ����1ˆW‰ØˆrA   r   c           	      ól  — | j         s|S | j                              || j                              d¦  «        ¦  «        }|€|S t          dt          |j        d         |z  ¦  «        ¦  «        }t          dt          |j        d         |z  ¦  «        ¦  «        }t          j        |||ft
          j        ¬¦  «        }	|	d d …d d …d d…f         }
|	d d …d d …df         dk                         t          j
        ¦  «        dz  }t          j        d	t          j
        ¦  «        }t          j        ||d¬
¦  «        }|j        d d…         \  }}t          ||dz  z
  dz
  t          |dz  dz   t          |¦  «        ¦  «        ¦  «        }t          ||dz  z
  dz
  t          |dz  dz   t          |¦  «        ¦  «        ¦  «        }	 t          j        |
|d d …d d …d d…f         |||ft
          j        ¦  «        }|j        d         dk    r#t          j        ||d d …d d …df         g¦  «        S |S # t"          $ r |cY S w xY w)Nr»   rµ   r	   r   rD   r   éP   r   )r   r   )Ú
iterationsr   )rü   Úgetr   r   r   r    rF   rG   r   r   r   ÚonesÚeroder   ÚseamlessCloneÚNORMAL_CLONEÚdstackr¢   )rl   Ú
sprite_bgrÚ
viseme_keyr4   r5   rP   ÚpatchÚpwÚphÚp_scÚ	patch_bgrr8   Úkernelr2   r3   Úcx_safeÚcy_safeÚcloneds                     r?   Ú_apply_mouth_patchz#SevenNguyenActor._apply_mouth_patch  s>  € ØÔ!ð 	ØÐØÔ"×&Ò& z°4Ô3E×3IÒ3IÈ(Ñ3SÔ3SÑTÔTˆØˆ=ØÐå�•C˜œ Aœ¨Ñ.Ñ/Ô/Ñ0Ô0ˆÝ�•C˜œ Aœ¨Ñ.Ñ/Ô/Ñ0Ô0ˆÝŒz˜% " b ½¼ÐHÑHÔHˆà˜˜˜˜A˜A˜A˜r ˜r˜”Nˆ	Ø�Q�Q�Q˜˜˜˜1�W” Ò"×*Ò*­2¬8Ñ4Ô4°sÑ:ˆÝ”˜¥¤Ñ*Ô*ˆÝŒy˜˜v°!Ð4Ñ4Ô4ˆàÔ! " 1 "Ô%‰ˆˆBÝ�b˜2 ™7‘l QÑ&­¨B°!©G°a©K½¸R¹¼Ñ(AÔ(AÑBÔBˆÝ�b˜2 ™7‘l QÑ&­¨B°!©G°a©K½¸R¹¼Ñ(AÔ(AÑBÔBˆð	ÝÔ& y°*¸Q¸Q¸QÀÀÀÀ2ÀAÀ2¸XÔ2FÈÈwÐX_ÐN`ÕbeÔbrÑsÔsˆFØÔ Ô" aÒ'Ð'Ý”y &¨*°Q°Q°Q¸¸¸¸1°WÔ*=Ð!>Ñ?Ô?Ð?ØˆMøÝð 	ð 	ð 	ØÐÐÐð	øøøs   Æ;A&H$ È"H$ È$H3È2H3Fc                 ó‚   — |rdS |dz  }|dk    rdS t          |dz  ¦  «        dz  }|dk    rdS |d	k    rdS |d
k    rdS dS )uI   Kháº©u hÃ¬nh sinh tá»± nhiÃªn khi khÃ´ng cÃ³ file audio RMS trá»±c tiáº¿prº   g333333@g      @r»   g      "@rµ   r   r¼   r	   r   r½   )r   )rl   rq   Ú
is_closingÚt_cyclerÂ   s        r?   Úget_procedural_visemez&SevenNguyenActor.get_procedural_viseme:  sk   € àð 	Ø�7à˜#‘+ˆØ�SŠ=ˆ=Ø�8Ý�5˜3‘;ÑÔ !Ñ#ˆØ�1Š9ˆ9Ø�4Ø�QŠYˆYØ�8Ø�QŠYˆYØ�4à�4rA   rp   r   Nc                 óv  — | j                              |¦  «        }|€| j                              d¦  «        }|€dS |                     ¦   «         }| j                             || j        d         ¦  «        }|�-|                     ||¬¦  «        }	|                     |¦  «        }
n^|                      ||¬¦  «        }	|	dv rAt          t          dt          t          j        |dz  ¦  «        ¦  «        z  ¦  «        ¦  «        nd}
| j                             |¦  «        }|d	         }|                      ||	|d
         |d         |
z   |d         ¬¦  «        }|d         }t          |dd…dd…dd…f         |d         |d         |
z   |d         |d         |
z   |d         |d         |¬¦  «        }||dd…dd…dd…f<   |S )u—   
        Táº¡o sprite cÃ³ Ä‘áº§y Ä‘á»§:
        - Kháº©u hÃ¬nh lipsync
        - Chá»›p máº¯t tá»± nhiÃªn
        - Gáº­t Ä‘áº§u micro-nodding
        NrÍ   )r¿   )r.  )r¼   r½   g      ø?g      @r   râ   r4   r5   rP   )rP   rã   r   r*   r+   r,   r-   r.   r/   )r.   r/   r0   )rø   r  r   rÿ   rÃ   rÆ   r0  r   rÅ   ÚabsÚmathÚsinrþ   ru   r,  r@   )rl   Úpose_keyrq   r¾   Ú	audio_ctlr.  Ú
raw_spriteÚspriteÚanchorÚvisemeÚ
nod_offsetÚblink_ratioÚm_cfgÚe_cfgr!  s                  r?   Úget_animated_spritez$SevenNguyenActor.get_animated_spriteL  sá  € ð ”\×%Ò% hÑ/Ô/ˆ
ØÐØœ×)Ò)¨$Ñ/Ô/ˆJØÐ!Ø�tà—’Ñ"Ô"ˆØÔ"×&Ò& x°Ô1BÀ4Ô1HÑIÔIˆð Ð Ø×)Ò)¨)¸zÐ)ÑJÔJˆFØ"×6Ò6°yÑAÔAˆJˆJà×/Ò/°À*Ð/ÑMÔMˆFØIOÐS_ÐI_ÐI_��U 3­­T¬X°e¸c±kÑ-BÔ-BÑ)CÔ)CÑ#CÑDÔDÑEÔEÐEÐefˆJð ”n×4Ò4°UÑ;Ô;ˆð �w”ˆØ×(Ò(¨°¸¸t¼ÀeÈDÄkÐT^ÑF^ÐfkÐlsÔftÐ(ÑuÔuˆð �v”ˆÝ+Ø�1�1�1�a�a�a˜˜!˜�8ÔØ�$ŒK˜˜tœ zÑ1Ø�$ŒK˜˜tœ zÑ1Ø�TŒ{˜u Tœ{Øð
ñ 
ô 
ˆ
ð &ˆˆqˆqˆq�!�!�!�R�a�RˆxÑØˆrA   r   c           	      óx  — |                       ||||	|
¬¦  «        }|€|S |rt          j        |d¦  «        }t          j        |dz  t          j        z  ¦  «        dz  }|ddt          j        |dz  t          j        z  ¦  «        z  z   z  }t          ||t          |¦  «        t          ||z   ¦  «        ||¬¦  «        S )u†   
        Váº½ Seven Nguyen trá»±c tiáº¿p lÃªn frame vá»›i nhá»‹p thá»Ÿ tá»± nhiÃªn, scale pulse, vÃ  cÃ¡c diá»…n hoáº¡t máº·t
        )rq   r¾   r6  r.  Nr	   g      @r   gú~j¼t“h?)rP   rQ   )r?  r    Úflipr3  r4  r	  re   r   )rl   Úframer5  rN   rO   Ú
base_scalerQ   rq   r¾   r6  r.  Úflip_horizontalr8  Úbreath_yÚbreath_scales                  r?   Ú
draw_actorzSevenNguyenActor.draw_actorw  sÊ   € ð ×)Ò)¨(¸%È9Ð`ið  wAÐ)ñ  Bô  BˆØˆ>ØˆLàð 	)Ý”X˜f aÑ(Ô(ˆFõ ”8˜E C™K­$¬'Ñ1Ñ2Ô2°SÑ8ˆØ! S¨5µ4´8¸EÀC¹KÍ$Ì'Ñ<QÑ3RÔ3RÑ+RÑ%RÑSˆå" 5¨&µ#°a±&´&½#¸aÀ(¹lÑ:KÔ:KÐS_ÐipÐqÑqÔqÐqrA   )rÕ   rÚ   rµ   )r   rÇ   )rp   r   NF)r   r   rp   r   NFF)
rv   rw   rx   ry   rm   rý   r,  r0  r?  rG  rz   rA   r?   rÉ   rÉ   È   s™   € € € € € ðð ð7
ð 7
ð 7
ðrð ð ð ð0ð ð ð ð8ð ð ð ð$)ð )ð )ð )ðVrð rð rð rð rð rrA   rÉ   )r   r   r   )r   r   )ry   r�   r3  r’   r•   Únumpyr   r    r@   re   rg   r|   rÉ   rz   rA   r?   ú<module>rI     s  ððð ð 
€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø 
€
€
€
ð*ð *ð *ð *ðX!ð !ð !ð !ðFð ð ð ð ñ ô ð ð(Lð Lð Lð Lð Lñ Lô Lð Lð\~rð ~rð ~rð ~rð ~rñ ~rô ~rð ~rð ~rð ~rrA   