o
    i                      @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ G dd de
jZG dd de
jZG d	d
 d
e
jZG dd de
jZG dd de
jZG dd de	ZdefddZdS )    N)override)ComfyExtensionio)SkipLayerGuidanceDiTc                   @   0   e Zd Zedd ZedejfddZeZdS )TripleCLIPLoaderc                 C   sX   t jdddt jjdtddt jjdtddt jjdtddgt j gd	S )
Nr   zadvanced/loadersz"[Recipes]

sd3: clip-l, clip-g, t5
clip_name1text_encoders)options
clip_name2
clip_name3)node_idcategorydescriptioninputsoutputs)r   SchemaComboInputfolder_pathsget_filename_listClipOutputcls r   4/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_sd3.pydefine_schema   s   zTripleCLIPLoader.define_schemareturnc                 C   sJ   t d|}t d|}t d|}tjj|||gt dd}t|S )Nr	   
embeddings)
ckpt_pathsembedding_directory)r   get_full_path_or_raisecomfysd	load_clipget_folder_pathsr   
NodeOutput)r   r   r   r   
clip_path1
clip_path2
clip_path3clipr   r   r   execute   s
   
zTripleCLIPLoader.executeN)	__name__
__module____qualname__classmethodr   r   r'   r,   r%   r   r   r   r   r      s    
r   c                   @   s2   e Zd Zedd ZeddejfddZeZdS )	EmptySD3LatentImagec                 C   sX   t jddt jjdddtjddt jjdddtjddt jjdd	d	d
dgt j gdS )Nr1   z
latent/sd3widthi      defaultminmaxstepheight
batch_size   i   )r5   r6   r7   )r   r   r   r   )r   r   Intr   nodesMAX_RESOLUTIONLatentr   r   r   r   r   r   (   s   z!EmptySD3LatentImage.define_schemar;   r   c                 C   s4   t j|d|d |d gtj d}t|ddS )Nr3      )device)samplesdownscale_ratio_spacial)torchzerosr#   model_managementintermediate_devicer   r'   )r   r2   r9   r:   latentr   r   r   r,   7   s   $zEmptySD3LatentImage.executeN)r;   )	r-   r.   r/   r0   r   r   r'   r,   generater   r   r   r   r1   '   s    
r1   c                   @   r   )CLIPTextEncodeSD3c                 C   sl   t jddgdt jdt jjddddt jjddddt jjd	dddt jjd
ddgddgt j gdS )NrJ   z
sd3 promptzadvanced/conditioningr+   clip_lT)	multilinedynamic_promptsclip_gt5xxlempty_paddingnoneempty_prompt)r
   advanced)r   search_aliasesr   r   r   )r   r   r   r   Stringr   Conditioningr   r   r   r   r   r   @   s   
zCLIPTextEncodeSD3.define_schemar   c           	      C   s<  |dk}| |}t|dkr|rg |d< t|dkr"|r"g |d< n	| |d |d< t|dkr8|r8g |d< n	| |d |d< t|d t|d kr| d}t|d t|d k rt|d  |d 7  < t|d t|d k s^t|d t|d kr|d  |d 7  < t|d t|d kst||S )NrQ   r   glrO    )tokenizelenr   r'   encode_from_tokens_scheduled)	r   r+   rK   rN   rO   rP   
no_paddingtokensemptyr   r   r   r,   R   s&   



zCLIPTextEncodeSD3.executeN)	r-   r.   r/   r0   r   r   r'   r,   encoder   r   r   r   rJ   ?   s    
rJ   c                   @   s:   e Zd ZedejfddZeddejfddZeZ	dS )ControlNetApplySD3r   c                 C   s   t jdddt jdt jdt jdt jdt jdt jjd	d
ddddt jjdddd
ddt jjdd
dd
ddgt jjddt jjddgddS )Nra   zApply Controlnet with VAEzconditioning/controlnetpositivenegativecontrol_netvaeimagestrength      ?              $@{Gz?r4   start_percentMbP?end_percent)display_nameT)r   ro   r   r   r   is_deprecated)	r   r   rV   r   
ControlNetVaeImageFloatr   r   r   r   r   r   o   s$   




z ControlNetApplySD3.define_schemaNc	              	   C   s   |dkr
t ||S |dd}	i }
g }||fD ]M}g }|D ]A}|d  }|dd }||
v r5|
| }n| j|	|||f|g d}|| ||
|< ||d< d|d< |d |g}|| q|| qt |d |d S )Nr   r;   control)re   extra_concatFcontrol_apply_to_uncond)r   r'   movedimcopygetset_cond_hintset_previous_controlnetappend)r   rb   rc   rd   rf   rg   rl   rn   re   control_hintcnetsoutconditioningctd	prev_cnetc_netnr   r   r   r,      s.   

zControlNetApplySD3.executeN)
r-   r.   r/   r0   r   r   r   r'   r,   apply_controlnetr   r   r   r   ra   n   s    ra   c                   @   s4   e Zd ZdZedd ZedejfddZeZ	dS )SkipLayerGuidanceSD3z
    Enhance guidance towards detailed dtructure by having another set of CFG negative with skipped layers.
    Inspired by Perturbed Attention Guidance (https://arxiv.org/abs/2403.17377)
    Experimental implementation by Dango233@StabilityAI.
    c                 C   sz   t jdddt jdt jjddddd	t jjd
dddddt jjdddddddt jjdddddddgt j gddS )Nr   zadvanced/guidancezNGeneric version of SkipLayerGuidance node that can be used on every DiT model.modellayersz7, 8, 9FT)r5   rL   rS   scaleg      @ri   rj   g?r4   rl   rk   rh   rm   )r5   r6   r7   r8   rS   rn   g333333?)r   r   r   r   r   is_experimental)r   r   Modelr   rU   rt   r   r   r   r   r   r      s   
z"SkipLayerGuidanceSD3.define_schemar   c                 C   s   t  j|||||dS )N)r   r   rl   rn   double_layers)r   r,   )r   r   r   r   rl   rn   r   r   r   r,      s   zSkipLayerGuidanceSD3.executeN)
r-   r.   r/   __doc__r0   r   r   r'   r,   skip_guidance_sd3r   r   r   r   r      s    
r   c                   @   s(   e Zd Zedeeej  fddZdS )SD3Extensionr   c                    s   t ttttgS r   )r   r1   rJ   ra   r   )selfr   r   r   get_node_list   s   zSD3Extension.get_node_listN)	r-   r.   r/   r   listtyper   	ComfyNoder   r   r   r   r   r      s    r   r   c                      s   t  S r   )r   r   r   r   r   comfy_entrypoint   s   r   )r   comfy.sdr#   comfy.model_managementr=   rD   typing_extensionsr   comfy_api.latestr   r   comfy_extras.nodes_slgr   r   r   r1   rJ   ra   r   r   r   r   r   r   r   <module>   s    /9!