o
    ig
                     @  s   d Z ddlmZ ddlmZmZ ddlZddlm	Z	 ddl
mZmZmZmZmZmZ ddlmZmZmZ dd	lmZ d!ddZeddfd"ddZd#dd ZdS )$z7Main compiler API: blend parametric + archetype layers.    )annotations)ListOptionalN   )archetype_blend)BLEND_NEUTRAL_THRESHOLDBLEND_NEUTRAL_WEIGHTBLEND_EXTREME_THRESHOLDBLEND_EXTREME_WEIGHTBLEND_DEFAULT_WEIGHT	RBF_SIGMA)parametric_layerapply_conflict_resolutionapply_channel_mask)validate_vadvad
np.ndarrayreturnfloatc                 C  s,   t tj| }|tk rtS |tkrtS tS )zLPer-query blend weight: neutral favors parametric, extreme favors archetype.)	r   nplinalgnormr   r   r	   r
   r   )r   	magnitude r   N/dataset/kemix-engine/package/face/animasync-face-v3/scripts/compiler/blend.py_dynamic_blend_weight   s   r   TemotionOptional[str]presetsdictsigmaapply_lipsync_maskbooloverride_blend_weightOptional[float]c           
      C  st   t |}t|}t||| |d}|dur|nt|}|| |d|   }	t|	|}	|r/t|	}	t|	ddtj	S )u  Compute 52 blendshape values for given (emotion, VAD).

    Args:
        emotion: emotion family name (e.g. 'joy') for archetype boosting; None → pure VAD
        vad: (3,) in [-1, 1]
        presets: dict of archetype presets
        sigma: RBF bandwidth (archetype layer)
        apply_lipsync_mask: zero out LIPSYNC_ONLY channels
        override_blend_weight: if set, use this instead of dynamic

    Returns:
        (52,) float32 in [0, 1]
    )emotion_hintr    Ng      ?g        )
r   r   r   r   r   r   r   clipastypefloat32)
r   r   r   r    r!   r#   paramarchwoutr   r   r   compile_blendshapes#   s   
r-   emotionsList[Optional[str]]vadsc                 K  st   |j d }t| |krtdt|  d| tj|dftjd}t|D ]}t| | || |fi |||< q%|S )z-Batch version. vads: (N, 3). Returns (N, 52).r   zemotions length z	 != vads 4   )dtype)shapelen
ValueErrorr   emptyr(   ranger-   )r.   r0   r   kwargsNr,   ir   r   r   compile_batchN   s   
"r;   )r   r   r   r   )r   r   r   r   r   r   r    r   r!   r"   r#   r$   r   r   )r.   r/   r0   r   r   r   r   r   )__doc__
__future__r   typingr   r   numpyr   	archetyper   	constantsr   r   r	   r
   r   r   
parametricr   r   r   utilsr   r   r-   r;   r   r   r   r   <module>   s     
+