
    d~i                        d Z ddlmZ ddlZddlmZ ddlmZ ddlZ	ddl
mZmZ i 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+iZd5d.Zd6d2Zd7d3Zd7d4ZdS )8zBUtilities: 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noseSneerRightreturn
np.ndarrayc                    t          j        | t           j                  } | j        dk    rt	          d| j                   t          j        | dd                              t           j                  S )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    N/dataset/kemix-engine/package/face/animasync-face-v3/scripts/compiler/utils.pyvalidate_vadrO   '   sb    
*S

+
+
+C
yDC	CCDDD73c""))"*555    presetsDict[str, dict]Nonec                   |                                  D ]\  }}d|vsd|vrt          d| d          t          j        |d                   }t          j        |d                   }|j        dk    rt          | d|j                   |j        dk    rt          | d|j                   t          j        |d	k     |d
k    z            rt          | d          dS )z!Raise if any preset is malformed.rM   bszpreset z missing 'vad' or 'bs'rD   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)itemsrJ   rF   rG   rI   any)rQ   namedatarM   rU   s        rN   validate_presetsr[   /   s   mmoo 
; 
;
dD 0 0CtCCCDDDje%%ZT
##9OOCIOOPPP8uNNBHNNOOO62:"x-011 	;999:::	;
; 
;rP   c           	     2   t          |           } t          j        |                     d                    }|                    d|          }t          t
                                                    j        d         }|dz  dz  dz  }t          j        |                    d                    d         }i }|                                D ]*\  }}|D ]"}	|	d	         ||t          |	d
                   f<   #+i }
|                                D ]w\  }}|                    d          p|
                    d          d         }t          |                    dd                    }|                    ||fg d          }|                    d          p|                    d          pi }t          j        dt          j                  }|                                D ]+\  }}|t          v rt          |          |t          |         <   ,|                                D ]N\  }}|t           v r@t          |          dk    r-t           |         D ]}t          |          |t          |         <    Ot#          |          |d|
|<   yt%          |
           |
S )ae  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encodingrQ      rZ   emotionemotion_vad_anchors.jsonanchorsrM   level_r   	intensityrE   )        rg   rg   valuesblendshapesrV   rB   rM   rU   )r   jsonloads	read_textget__file__resolveparentsrW   intsplitrF   zerosrH   r   floatEDITOR_META_CHANNELSlistr[   )pathrawpresets_dictproject_rootanchor_pathanchors_raw
vad_lookupemoentrieseoutrY   rZ   ra   rf   rM   
values_maprU   bs_namevarks                        rN   load_presets_from_jsonr   >   s    ::D
*T^^W^55
6
6C779c**L >>))++3A6L')36PPK*[22G2DDEEiPKJ#))++ : :W 	: 	:A125JS7__-..	: C"((** 1 1
d((9%%;C);a0011	 nngy1???CC XXh''H488M+B+BHb
Xb
+++$**,, 	4 	4JGQ+%%+088;w'($**,, 	4 	4JGQ...588a<</8 4 4C+088B{3'(( IIR00D		SJrP   c                 0   ddl m} m} t          t                                                    j        d         }|dz  dz  dz  }t          j        |	                    d                    d	         }i }|
                                D ]}\  }}|D ]u}t          |d
                   }	t          j        |d         t          j                  }
 | |
          } |||
          }| d|	 }|
                                |d||<   v~t!          |           |S )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`   rZ   ra   rb   r]   r^   rc   rd   rM   rB   _Lrj   )
parametricr   r   r   ro   rp   rq   rk   rl   rm   rW   rr   rF   rG   rH   tolistr[   )r   r   r{   r|   r}   r   r   r   r   rd   rM   rU   rY   s                rN   build_synthetic_presetsr   u   s<    HGGGGGGG>>))++3A6L')36PPK*[22G2DDEEiPKC#))++ 8 8W 	8 	8A'
OOE*QuXRZ888C!!#&&B**2s33B$$U$$D #

B77CII	8 SJrP   )r?   r@   )rQ   rR   r?   rS   )r?   rR   )__doc__
__future__r   rk   pathlibr   typingr   numpyrF   	constantsr   r   rv   rO   r[   r   r    rP   rN   <module>r      s   H H " " " " " "                  2 2 2 2 2 2 2 2?= = >	
 < ; = > > ? > @ B @ <  ?!" ?#$ =%  ,6 6 6 6; ; ; ;4 4 4 4n     rP   