o
    d~i                     @  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 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d9d.d/Zd:d3d4Zd;d5d6Zd;d7d8ZdS )<zBUtilities: 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                 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 rL   N/dataset/kemix-engine/package/face/animasync-face-v3/scripts/compiler/utils.pyvalidate_vad'   s   
rN   presetsDict[str, dict]Nonec                 C  s   |   D ]R\}}d|vsd|vrtd| dt|d }t|d }|jdkr5t| d|j |jdkrDt| d|j t|d	k |d
kB rVt| dqdS )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)rO   namedatarK   rR   rL   rL   rM   validate_presets/   s   

rX   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< q;q5i }
| D ]v\}}|dp`|
dd }t	|dd}|||fg d}|dp~|dp~i }tjdtjd}| D ]\}}|tv rt||t| < q| D ]\}}|tv rt|dkrt| D ]
}t||t| < qqt||d|
|< qQt|
 |
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encodingrO      rW   emotionemotion_vad_anchors.jsonanchorsrK   level_r   	intensityrC   )        rc   rc   valuesblendshapesrS   r@   rK   rR   )r   jsonloads	read_textget__file__resolveparentsrT   intsplitrD   zerosrF   r   floatEDITOR_META_CHANNELSlistrX   )pathrawpresets_dictproject_rootanchor_pathanchors_raw
vad_lookupemoentrieseoutrV   rW   r]   rb   rK   
values_maprR   bs_namevarkrL   rL   rM   load_presets_from_json>   s<   

r   c                  C  s   ddl m} m} tt jd }|d d d }t|j	ddd	 }i }|
 D ]2\}}|D ]+}t|d
 }	tj|d tjd}
| |
}|||
}| d|	 }|
 |d||< q0q*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\   rW   r]   r^   rY   rZ   r_   r`   rK   r@   _Lrf   )
parametricr   r   r   rk   rl   rm   rg   rh   ri   rT   rn   rD   rE   rF   tolistrX   )r   r   rw   rx   ry   r~   r{   r|   r}   r`   rK   rR   rV   rL   rL   rM   build_synthetic_presetsu   s    
r   )r>   r?   )rO   rP   r>   rQ   )r>   rP   )__doc__
__future__r   rg   pathlibr   typingr   numpyrD   	constantsr   r   rr   rN   rX   r   r   rL   rL   rL   rM   <module>   s`    	



7