
    8j                        S r SSKJr  SSKrSSKJr  SSKJr  SSKr	SSK
JrJr  0 SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_S$S%_S&S'_S(S)_S*S+0ErS0S, jrS1S- jrS2S. jrS2S/ jrg)3zBUtilities: preset loading, validation, synthetic preset bootstrap.    )annotationsN)Path)Dict   )ARKIT_52_NAMESNAME_TO_IDXeyesLookDown)eyeLookDownLefteyeLookDownRight
eyesLookUp)eyeLookUpLefteyeLookUpRight
eyesLookIn)eyeLookInLefteyeLookInRighteyesLookOut)eyeLookOutLefteyeLookOutRight	eyesBlink)eyeBlinkLefteyeBlinkRighteyesWide)eyeWideLefteyeWideRight
eyesSquint)eyeSquintLefteyeSquintRight
mouthSmile)mouthSmileLeftmouthSmileRight
mouthFrown)mouthFrownLeftmouthFrownRightmouthDimple)mouthDimpleLeftmouthDimpleRight
mouthPress)mouthPressLeftmouthPressRightmouthStretch)mouthStretchLeftmouthStretchRightmouthLowerDown)mouthLowerDownLeftmouthLowerDownRightmouthUpperUp)mouthUpperUpLeftmouthUpperUpRightbrowDown)browDownLeftbrowDownRightbrowOuterUp)browOuterUpLeftbrowOuterUpRightcheekSquint)cheekSquintLeftcheekSquintRight	noseSneer)noseSneerLeftnoseSneerRightc                   [         R                  " U [         R                  S9n U R                  S:w  a  [	        SU R                   35      e[         R
                  " U SS5      R                  [         R                  5      $ )z.Ensure VAD is shape (3,), float32, in [-1, 1].dtype   zVAD shape must be (3,), got g      g      ?)npasarrayfloat32shape
ValueErrorclipastype)vads    Z/home/ubuntu/service/kemix-engine/package/face/animasync-face-v3/scripts/compiler/utils.pyvalidate_vadrM   '   s[    
**S


+C
yyD7		{CDD773c"))"**55    c                   U R                  5        H  u  pSU;  d  SU;  a  [        SU S35      e[        R                  " US   5      n[        R                  " US   5      nUR                  S:w  a  [        U SUR                   35      eUR                  S:w  a  [        U SUR                   35      e[        R
                  " US	:  US
:  -  5      (       d  M  [        U S35      e   g)z!Raise if any preset is malformed.rK   bszpreset z missing 'vad' or 'bs'rB   z: vad shape must be (3,), got )4   z: bs shape must be (52,), got g-C6gqh ?z: bs outside [0, 1]N)itemsrH   rD   rE   rG   any)presetsnamedatarK   rP   s        rL   validate_presetsrW   /   s    mmo
D 0wtf,BCDDjje%ZZT
#99v%CCII;OPP88uv%CBHH:NOO662:"x-011v%89:: &rN   c           	        [        U 5      n [        R                  " U R                  SS95      nUR	                  SU5      n[        [
        5      R                  5       R                  S   nUS-  S-  S-  n[        R                  " UR                  SS95      S   n0 nUR                  5        H#  u  pxU H  n	U	S	   Xg[        U	S
   5      4'   M     M%     0 n
UR                  5        GH^  u  pUR	                  S5      =(       d    UR                  S5      S   n[        UR	                  SS5      5      nUR	                  X4/ SQ5      nUR	                  S5      =(       d    UR	                  S5      =(       d    0 n[        R                  " S[        R                  S9nUR                  5        H'  u  nnU[        ;   d  M  [        U5      U[        U   '   M)     UR                  5        HH  u  nnU[         ;   d  M  [        U5      S:  d  M#  [         U    H  n[        U5      U[        U   '   M     MJ     [#        U5      US.X'   GMa     [%        U
5        U
$ )aM  Load presets from the JSON format exported by tools/blendshape-editor.html.

Expected schema:
    {"presets": {"joy_L3": {"emotion": "joy", "intensity": 3,
                             "values": {"mouthSmileLeft": 0.7, ...}}, ...}}
or flat dict at top level.

VAD is read from emotion_vad_anchors.json based on (emotion, intensity).
utf-8encodingrT      rV   emotionemotion_vad_anchors.jsonanchorsrK   level_r   	intensityrC   )        rc   rc   valuesblendshapesrQ   r@   rK   rP   )r   jsonloads	read_textget__file__resolveparentsrR   intsplitrD   zerosrF   r   floatEDITOR_META_CHANNELSlistrW   )pathrawpresets_dictproject_rootanchor_pathanchors_raw
vad_lookupemoentrieseoutrU   rV   r]   rb   rK   
values_maprP   bs_namevarks                        rL   load_presets_from_jsonr   >   s    :D
**T^^W^5
6C779c*L >))+33A6L')36PPK**[22G2DEiPKJ#))+A125JS7_-.  , C"((*
((9%;C);a01	 nng1?C XXh'H488M+BHb
XXb

+$**,JGQ+%+08;w'( - %**,JGQ..58a</8C+08B{3'( 9 -
 !IR0	3 +6 SJrN   c                    SSK Jn Jn  [        [        5      R                  5       R                  S   nUS-  S-  S-  n[        R                  " UR                  SS95      S	   n0 nUR                  5        Hn  u  pgU Hc  n[        US
   5      n	[        R                  " US   [        R                  S9n
U " U
5      nU" X5      nU SU	 3nU
R                  5       US.X\'   Me     Mp     [!        U5        U$ )a  Bootstrap presets using the parametric layer on each anchor VAD.

Use this when no user-authored preset JSON is available. Each preset's
blendshape vector is computed by running the parametric layer on the
anchor's VAD coordinate. This ensures anchor-reproducibility trivially.
r   )parametric_layerapply_conflict_resolutionr\   rV   r]   r^   rY   rZ   r_   r`   rK   r@   _Lrf   )
parametricr   r   r   rk   rl   rm   rg   rh   ri   rR   rn   rD   rE   rF   tolistrW   )r   r   rw   rx   ry   r~   r{   r|   r}   r`   rK   rP   rU   s                rL   build_synthetic_presetsr   u   s     H>))+33A6L')36PPK**[22G2DEiPKC#))+A'
OE**QuXRZZ8C!#&B*23BU"UG$D #

B7CI  , SJrN   )returnz
np.ndarray)rT   Dict[str, dict]r   None)r   r   )__doc__
__future__r   rg   pathlibr   typingr   numpyrD   	constantsr   r   rr   rM   rW   r   r    rN   rL   <module>r      s   H "     2?= = >	
 < ; = > > ? > @ B @ <  ?!" ?#$ =% ,6;4nrN   