U
    8j                     @  s   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 dd	d
ddddddddddddddddZddddZdd d!d"d#Zddd$d%Zddd&d'ZdS )(zBUtilities: preset loading, validation, synthetic preset bootstrap.    )annotationsN)Path)Dict   )ARKIT_52_NAMESNAME_TO_IDX)eyeLookDownLefteyeLookDownRight)eyeLookUpLefteyeLookUpRight)eyeLookInLefteyeLookInRight)eyeLookOutLefteyeLookOutRight)eyeBlinkLefteyeBlinkRight)eyeWideLefteyeWideRight)eyeSquintLefteyeSquintRight)mouthSmileLeftmouthSmileRight)mouthFrownLeftmouthFrownRight)mouthDimpleLeftmouthDimpleRight)mouthPressLeftmouthPressRight)mouthStretchLeftmouthStretchRight)mouthLowerDownLeftmouthLowerDownRight)mouthUpperUpLeftmouthUpperUpRight)browDownLeftbrowDownRight)browOuterUpLeftbrowOuterUpRight)cheekSquintLeftcheekSquintRight)noseSneerLeftnoseSneerRight)ZeyesLookDownZ
eyesLookUpZ
eyesLookInZeyesLookOutZ	eyesBlinkZeyesWideZ
eyesSquintZ
mouthSmileZ
mouthFrownZmouthDimpleZ
mouthPressZmouthStretchZmouthLowerDownZmouthUpperUpZbrowDownZbrowOuterUpZcheekSquintZ	noseSneerz
np.ndarray)returnc                 C  s@   t j| t jd} | jdkr*td| j t | 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)vad r9   Z/home/ubuntu/service/kemix-engine/package/face/animasync-face-v3/scripts/compiler/utils.pyvalidate_vad'   s    
r;   zDict[str, dict]None)presetsr,   c                 C  s   |   D ]\}}d|ks d|kr0td| dt|d }t|d }|jdkrjt| d|j |jdkrt| d|j t|d	k |d
kB rt| dqdS )z!Raise if any preset is malformed.r8   bszpreset z missing 'vad' or 'bs'r/   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)itemsr5   r1   r2   r4   any)r=   namedatar8   r>   r9   r9   r:   validate_presets/   s    

rD   c                 C  s  t | } t| jdd}|d|}t t jd }|d d d }t|jddd }i }| D ]*\}}|D ]}	|	d	 ||t	|	d
 f< qvqji }
| D ]\}}|dp|
dd }t	|dd}|||fdddg}|dp|dpi }tjdtjd}| D ]$\}}|tkrt||t| < q| D ]B\}}|tkrFt|dkrFt| D ]}t||t| < qnqFt||d|
|< qt|
 |
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encodingr=      rC   emotionemotion_vad_anchors.jsonanchorsr8   level_r   	intensityr0   g        valuesZblendshapesr?   r-   r8   r>   )r   jsonloads	read_textget__file__resolveparentsr@   intsplitr1   zerosr3   r   floatEDITOR_META_CHANNELSlistrD   )pathrawZpresets_dictproject_rootanchor_pathanchors_rawZ
vad_lookupemoentrieseoutrB   rC   rI   rN   r8   Z
values_mapr>   Zbs_namevZarkr9   r9   r:   load_presets_from_json>   s6    


rh   c                  C  s   ddl m} m} tt jd }|d d d }t|j	ddd	 }i }|
 D ]d\}}|D ]V}t|d
 }	tj|d tjd}
| |
}|||
}| d|	 }|
 |d||< q`qTt| |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_resolutionrH   rC   rI   rJ   rE   rF   rK   rL   r8   r-   Z_LrP   )
parametricri   rj   r   rU   rV   rW   rQ   rR   rS   r@   rX   r1   r2   r3   tolistrD   )ri   rj   r`   ra   rb   rf   rc   rd   re   rL   r8   r>   rB   r9   r9   r:   build_synthetic_presetsu   s    
rm   )__doc__
__future__r   rQ   pathlibr   typingr   numpyr1   	constantsr   r   r\   r;   rD   rh   rm   r9   r9   r9   r:   <module>   s:   7