o
    i_                     @   s  d dl Z d dlZd dlZd dlm  m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 d dlmZmZ dZdd ed	ejfd
ejdededejdejdejfddZ		d;dejdejdee dedededefddZ 	d<dejdejd e!dejfd!d"Z"d<d#d$Z#d%d& Z$d=d+d,Z%G d-d. d.ej&Z'G d/d0 d0ej&Z(G d1d2 d2ej&Z)G d3d4 d4ej&Z*G d5d6 d6ej&Z+G d7d8 d8eZ,de,fd9d:Z-dS )>    N)override)ComfyExtensionio)parse_json_tracks)Image	ImageDrawFc                 C   s$   t dt dt | t j|S )Ni'     )torchpowmuldivtofloat32)id r   8/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_wanmove.py<lambda>      $ r   cpupos_kpos_emb_dim
theta_funcdevicedtypereturnc                 C   s   |d dks
J d|  ||} tr| d } | d}tjd|d ||d}|dd|d}|||}| dd |}	tt|	|}
t	t|	|}tj
|
|gdd}|S )Nr   r   z2The dimension of position embeddings must be even.   r   r   dim)r   	SKIP_ZEROsizer	   arangeviewexpandsinr   coscat)r   r   r   r   r   
batch_sizedenominatordenominator_expandedthetaspos_k_expanded
sin_thetas
cos_thetaspos_embr   r   r   get_pos_emb   s   

r1   r   samplepred_trackspred_visibilitydownsample_ratiosheightwidth	track_numt_down_strategyc                 C   s  |dv sJ d| j \}}}	|\}
}}tj||d |
 d dtjd }|dkr*|}t|d | }| d d |f }|d d |f }td||
D ]~}|dksS|dkr\|| }|| }n||||
  jdd	}tj||||
  dd	}t|D ]M}|| r|| d dk s|| d dk s|| d |ks|| d |krqy|| \}}t|| t|| }}||||||
 df< ||||
 df< qyqI|S )
N)r2   averagez1Invalid strategy for downsampling time dimension.r   r   )r   r   r   r2   r   )	shaper	   oneslongrandpermrangemeananyint)r3   r4   r5   r6   r7   r8   r9   tn_t_downh_downw_down	track_pos
tracks_idxtracks
visibilityt_idx
cur_trackscur_visibilityr   xyr   r   r   create_pos_embeddings/   s.   	
"
H(rR         ?vae_featurerI   strengthc                 C   s  | j \}}}}}||j d ksJ d|j d }|d d t|d d d d f }|d d d d dd d d f }	|	d dk|	d dk@ }
|
jdd}|j d }|dkrV| S |d d df }|d d df }|d d df }|d }|	|||df  }|	|||df  }|||ddf  }|||ddf  }| |d d d||f }| |d d |||f }||| |  | |d d |||f< | S )	Nr   zBatch size mismatch.r   ).r   ).r   F)as_tupler   )r;   r	   r>   nonzeror=   )rT   rI   rU   brE   rC   hwrD   current_posmaskvalid_indices	num_valid	batch_idx	track_idxt_relt_targeth_targetw_targeth_sourcew_sourcesrc_featuresdst_featuresr   r   r   replace_featureV   s,   
" 
"ri   c                 C   s  t | d}|d d d }d}g }tt|d D ]1}||d  d || d  }	||d  d || d  }
|	|	 |
|
  d }|| ||7 }q|dkrQd S d}tt|d d |dd  D ]x\}\}}|| }tt|d}t|D ]^}||| |  }|| }tdd|  | }g ||R }t|d |d |d  | |  }t|d |d |d  | |  }tt|d|  d}|j	||f|d |fg||d qw||7 }qbd S )NRGBAr   r   r         ?   )fillr7   )
r   Drawr?   lenappend	enumeratezipmaxrB   line)overlay
line_widthpointsstart_coloropacitydrawtotal_lengthsegment_lengthsr   dxdylengthaccumulated_lengthidxstart_point	end_pointsegment_lengthstepscurrent_lengthratioalphacolorrP   rQ   dynamic_line_widthr   r   r   "_draw_gradient_polyline_on_overlay   s6   

*$$"
r   c                 C   s~   t | } t |}|d d d d df d }t j|gd dd}|d d d d d df | | d|   }t|t jS )N        o@r   )axisr   )nparraystackr   	fromarrayastypeuint8)rgbtrackr   	blend_imgr   r   r   add_weighted   s   

*r         rk      c                 C   sj  g d}|     } |d     }|d ur&|d    }| jd d \}}	}
|jd }td| }g }t|D ]}| | t	j
}td|
|	fd}t|}g }t|D ]Y}|d urn|||f dkrnq_|||f }||t|  }||f }|j|d | |d | |d | |d | f|d |t|| d|d |f }t|dkr|||f q_t	|}|d d d d dd	f d
 }|d d d d d df | |d|   }|r&td|
|	fd}|D ]\}}t||||| qt	|}|d d d d dd	f d
 }|d d d d d df | |d|   }|t|t	j qA|S )N))f      rl   )r   rl   rl   )rl   rl   r   )rl   r      )r   rl   r   r   r   r   rl   rj   )r   r   r   r   )rm      r   )byter   numpyr=   detachr;   rB   r?   r   r   r   r   newr   rn   ro   ellipsers   rp   r   r   r   r   )videorK   rL   track_framecircle_sizery   rv   	color_map
num_framesr6   r7   
num_tracksalpha_opacityoutput_framesrC   	frame_rgbru   draw_overlaypolyline_datarD   track_coordr   circle_colortracks_coord
overlay_npr   polyline_overlaypolyline_npr   r   r   draw_tracks_on_video   sN   


.
*
*r   c                   @   .   e Zd Zedd ZeddejfddZdS )WanMoveVisualizeTracksc                 C   s   t jddt jdt jjdd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t jjddd	dddgt j gdS )Nr   conditioning/video_modelsimagesrK   Toptionalline_resolutionr   r      defaultminrs   r   r      )r   r   rs   advancedry   g      ?        rS   {Gz?r   r   rs   steprv   r   node_idcategoryinputsoutputs)r   Schemar   InputTracksIntFloatOutputclsr   r   r   define_schema   s   
	z$WanMoveVisualizeTracks.define_schemaNr   c              	   C   s   |d u r	t |S |d d}|d d}|d }	|	jd |jd kr7|jd |jd  }
|	|
ddd}	t|	||||||d}tjdd |D dd	dd
	 }t |
tj S )N
track_pathr   track_visibilityr   r   )r   r   ry   rv   c                 S   s   g | ]}t |qS r   )TF	to_tensor).0framer   r   r   
<listcomp>  s    z2WanMoveVisualizeTracks.execute.<locals>.<listcomp>r   r   )r   
NodeOutput	unsqueezer;   repeatr   r	   r   movedimfloatr   comfymodel_managementintermediate_device)r   r   r   r   ry   rv   rK   r   r   	images_inrepeat_counttrack_videor   r   r   execute  s   
$zWanMoveVisualizeTracks.executeN__name__
__module____qualname__classmethodr   r   r   r   r   r   r   r   r      s
    
r   c                   @   r   )WanMoveTracksFromCoordsc              	   C   sF   t jddt jjdddddt jjdddgt j t jjd	d
gdS )Nr   r   track_coordsTz[])force_inputr   r   
track_maskr   track_lengthdisplay_namer   )r   r   Stringr   Maskr   r   r   r   r   r   r   r     s   z%WanMoveTracksFromCoords.define_schemaNr   c           
         s   t j }t| t d } fddtt d D }tj|tj|d}|j	d }|d u r<tj
||ftj|d}n|dkjddd}i }	||	d	< ||	d
< t|	|S )Nr   c                    s   g | ]  fd dD qS )c                    s$   g | ]}|  d  |  d gqS )rP   rQ   r   )r   r   r   r   r   r   1  r   z>WanMoveTracksFromCoords.execute.<locals>.<listcomp>.<listcomp>r   )r   tracks_datar   r   r   0  s    z3WanMoveTracksFromCoords.execute.<locals>.<listcomp>r   r   r   r   r   r   r   r   )r   r   r   r   ro   r?   r	   tensorr   r;   r<   boolrA   r   r   r   )
r   r   r   r   r   
track_listrK   r   r   out_track_infor   r   r   r   )  s   


zWanMoveTracksFromCoords.executer   r   r   r   r   r   r     s
    
r   c                   @   s0   e Zd Zedd Ze	d	dejfddZdS )
GenerateTracksc                 C   sF  t jdg d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dt jjd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t jjdddddt jjdddddt jjdd ddd!d"dt jjd#d$d%d&t jjd'd(dddd)dt jjd*d(dddd+dt jjd,g d-d.d/t jjd0d1d2d3gt j	 t jj	d4d5gd6S )7Nr  )zmotion pathszcamera movement
trajectoryr   r7   @  r      r   r6     start_xr   rS   r   z1Normalized X coordinate (0-1) for start position.r   r   rs   r   tooltipstart_yz1Normalized Y coordinate (0-1) for start position.end_xz/Normalized X coordinate (0-1) for end position.end_yz/Normalized Y coordinate (0-1) for end position.r   Q   r   r   r   r      d   track_spreadg?gMbP?z\Normalized distance between tracks. Tracks are spread perpendicular to the motion direction.bezierFz>Enable Bezier curve path using the mid point as control point.)r   r	  mid_xrk   zPNormalized X control point for Bezier curve. Only used when 'bezier' is enabled.mid_yzPNormalized Y control point for Bezier curve. Only used when 'bezier' is enabled.interpolation)linearease_inease_outease_in_outconstantz5Controls the timing/speed of movement along the path.)optionsr	  r   Tz)Optional mask to indicate visible frames.)r   r	  r   r   )r   search_aliasesr   r   r   )
r   r   r   r   r   BooleanCombor   r   r   r   r   r   r   r   C  s6   zGenerateTracks.define_schemaFr  Nr   c           /      C   s  t j }|	}|| }|| }|| }|| }|| }|| }|||  d }tjdd|	|d}|dkr:t|}n+|dkrA|}n$|dkrJ|d }n|dkrWdd| d  }n|d	kre|| d
d|   }|r|}d| }|d | d| | |  |d |  }|d | d| | |  |d |  }d| ||  d| ||   }d| ||  d| ||   }n ||| |  }||| |  }t||| }t||| }g } t|	D ]_}!||!  }"||!  }#|"d |#d  d }$|$dkr|# |$ }%|"|$ }&nd}%d}&g }'t|
D ](}(|(|
d d  | })||!  |%|)  }*||!  |&|)  }+|'	|*|+g q| 	|' qtj
| tj|d},|d u rVtj||
ftj|d}-n|dkjddd}-i }.|,|.d< |-|.d< t|.|S )Nr   r   r   r   r  r  r  r  r  r   rk   rS   r   r   r   r   r   r   r   )r   r   r   r	   linspace
zeros_like	full_liker?   itemrp   r   r   r<   r   rA   r   r   r   )/r   r7   r6   r  r
  r  r  r  r  r   r   r  r  r  r   r   r   
start_x_px
start_y_pxmid_x_pxmid_y_pxend_x_pxend_y_pxtrack_spread_pxrC   interp_valuest_interpone_minus_tx_positionsy_positions	tangent_x	tangent_yr   	frame_idxtxtyr   perp_xperp_yframe_tracksr`   offsettrack_xtrack_yrK   r   r  r   r   r   r   c  sp   

(( "



zGenerateTracks.execute)Fr  Nr   r   r   r   r   r  B  s    
r  c                   @   r   )WanMoveConcatTrackc                 C   s2   t jddt jdt jjdddgt j gdS )Nr:  r   tracks_1tracks_2Tr   r   )r   r   r   r   r   r   r   r   r   r     s   
z WanMoveConcatTrack.define_schemaNr   c                 C   sd   |d u r	t |S tj|d |d gdd}tj|d |d gdd}i }||d< ||d< t |S )Nr   r   r   r   r   )r   r   r	   r(   )r   r;  r<  
tracks_outmask_outr  r   r   r   r     s   

zWanMoveConcatTrack.execute)NNr   r   r   r   r   r:    s
    
r:  c                   @   r   )WanMoveTrackToVideoc                 C   s   t jddt jdt jdt jdt jjdddt jjd	d
ddd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tj	ddt jjdddddt j
dt jjdddgt jjddt jjddt jjd dgd!S )"Nr?  r   positivenegativevaerK   Tr   rU   rS   r   g      Y@r   z#Strength of the track conditioning.r  r7   r  r   r   r6   r  r   r  r   r   r)   r  r   start_imageclip_vision_outputr   latentr   )r   r   Conditioningr   Vaer   r   r   nodesMAX_RESOLUTIONr   ClipVisionOutputr   Latentr   r   r   r   r     s(   



z!WanMoveTrackToVideo.define_schemaNr   c                 C   s  t j }tj|d|d d d |d |d g|d}|
d urt j|
d | dd||dddd}
tj||||
j	d f|
j
|
jd	d
 }|
|d |
j	d < ||d d d d d d d df }tjdd|j	d |j	d |j	d f|
j
|
jd	}d|d d d d d |
j	d d d d f< |	d ur|dkr|	d d | }|j	d }|	dtj||ftj|d}t||g d|||d}t j|d|}t|||}n|}t|||d}t|||d}|d urt|d|i}t|d|i}i }||d< t|||S )Nr   r   r      r  r   bilinearcenterr   rk   r   r   r   r   r   r   r   r   )r   rL  rL  )r8   )concat_latent_imageconcat_maskrD  samples)r   r   r   r	   zerosutilscommon_upscaler   r<   r;   r   r   encodegetr   rR   resize_to_batch_sizer   ri   node_helpersconditioning_set_valuesr   r   )r   r@  rA  rB  r7   r6   r   r)   rU   rK   rC  rD  r   rE  imagerO  r\   tracks_pathr   r   rI   concat_latent_image_pos
out_latentr   r   r   r     s2   
,,&&0,
zWanMoveTrackToVideo.execute)NNNr   r   r   r   r   r?    s
    
r?  c                   @   s(   e Zd Zedeeej  fddZdS )WanMoveExtensionr   c                    s   t ttttgS r   )r?  r   r:  r   r  )selfr   r   r   get_node_list  s   zWanMoveExtension.get_node_listN)	r   r   r   r   listtyper   	ComfyNoder`  r   r   r   r   r^    s    r^  c                      s   t  S r   )r^  r   r   r   r   comfy_entrypoint  s   rd  )r   r2   )rS   )Nr   r   rk   r   ).rH  rX  r	   !torchvision.transforms.functional
transforms
functionalr   comfy.model_managementr   comfy.utilsr   r   typing_extensionsr   comfy_api.latestr   r   comfy_extras.nodes_wanr   PILr   r   r!   r   r   TensorrB   callabler   r1   ra  strrR   r   ri   r   r   r   rc  r   r   r  r:  r?  r^  rd  r   r   r   r   <module>   s    
$
*

0(

=$)n?