
    +j]                     |   d dl Z d dlZd dlZd dlmc 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  ej        d          ej        fd	ej        d
ededej        dej        dej        fdZ	 	 d3dej        dej        dee         dedededefdZ 	 d4dej        dej        de!dej        fdZ"d4dZ#d  Z$d5d%Z% G d& d'ej&                  Z' G d( d)ej&                  Z( G d* d+ej&                  Z) G d, d-ej&                  Z* G d. d/ej&                  Z+ G d0 d1e          Z,de,fd2Z-dS )6    N)override)ComfyExtensionio)parse_json_tracks)Image	ImageDrawFc                     t          j        dt          j        dt          j        |                     t           j                  |                              S )Ni'     )torchpowmuldivtofloat32)ids     :/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_wanmove.py<lambda>r      s>    	%1eiPQPTPTUZUbPcPcefFgFg9h9h(i(i     cpupos_kpos_emb_dim
theta_funcdevicedtypereturnc                 Z   |dz  dk    s
J d            |                      ||          } t          r| dz   } |                     d          }t          j        d|dz  ||          }|                    dd                              |d          } |||          }|                     dd                               |          }	t          j        t          j        |	|                    }
t          j	        t          j        |	|                    }t          j
        |
|g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_embs                r   get_pos_embr3      s#    ?a!UHHVU##E 	AJ,q+"26OOOK&++Ar2299*bIIZ,k::F ZZA&&))%00N59^V<<==J59^V<<==J iZ0b999GNr   r    samplepred_trackspred_visibilitydownsample_ratiosheightwidth	track_numt_down_strategyc                 P   |dv s
J d            | j         \  }}}	|\  }
}}t          j        ||dz
  |
z  dz   dt          j                   }|dk    r|}t          j        |          d |         }| d d |f         }|d d |f         }t          d||
          D ]}|dk    s|dk    r||         }||         }nB||||
z                                d	          }t          j        ||||
z            d	          }t          |          D ]}||         rH||         d         dk     s6||         d         dk     s$||         d         |k    s||         d         |k    rS||         \  }}t          ||z            t          ||z            }}||c||||
z  df<   ||||
z  df<   |S )
N)r4   averagez1Invalid strategy for downsampling time dimension.r   r
   )r   r    r   r4   r!   )	shaper   oneslongrandpermrangemeananyint)r5   r6   r7   r8   r9   r:   r;   tn_t_downh_downw_down	track_pos
tracks_idxtracks
visibilityt_idx
cur_trackscur_visibilityr   xys                          r   create_pos_embeddingsrU   /   s@    33335h333GAq!.FFF*Q1! 3QejIIIIIB	"":I:.JJ'F J/Jq!V$$ V Vh&&%1**J'.NNeFl 2388Q8??J"Yz%f2D'E1MMMNy!! 	V 	VA!!$ 
1a(81(<(<
1a@PST@T@TXbcdXefgXhlqXqXqu  AB  vC  DE  vF  JP  vP  vPa=DAqqF{##Sf%5%5qAQRTUNIa&!+,i5F?A8M.N.N	V r         ?vae_featurerL   strengthc                    | j         \  }}}}}||j         d         k    s
J d            |j         d         }|d d t          j        |          d d d d f         }|d d d d dd d d f         }	|	d         dk    |	d         dk    z  }
|
                    d          }|j         d         }|dk    r| S |d d df         }|d d df         }|d d df         }|dz   }|	|||df                                         }|	|||df                                         }|||ddf                                         }|||ddf                                         }| |d d d||f         }| |d d |||f         }|||z
  |z  z   | |d d |||f<   | S )	Nr   zBatch size mismatch.r   ).r   ).r   F)as_tupler
   )r>   r   rA   nonzeror@   )rW   rL   rX   brH   rF   hwrG   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_featuress                          r   replace_featurerm   V   s   
  %MAq!Q	""""$:"""A !!!U^A..11145I AAAqqq!""aaaK(K1$V)<)ABD LL%L00M#A&IA~~ aaad#Iaaad#I!!!Q$EqyH 9i9:??AAH9i9:??AAH Iq!3499;;HIq!3499;;H y!!!Q(BCLy!!!XxIJL>Jl]iNimuMu>uK	111h(:; r   c           	         t          j        | d          }|d d d         }d}g }t          t          |          dz
            D ]j}||dz            d         ||         d         z
  }	||dz            d         ||         d         z
  }
|	|	z  |
|
z  z   dz  }|                    |           ||z  }k|dk    rd S d}t          t          |d d         |dd                              D ]\  }\  }}||         }t          t          |          d          }t          |          D ]}|||z  |z  z   }||z  }t          dd|z
  z  |z            }g ||R }t          |d         |d         |d         z
  |z  |z  z             }t          |d         |d         |d         z
  |z  |z  z             }t          t          |d|z
  z            d          }|	                    ||f|dz   |fg||           ||z  }d S )NRGBAr    r   r         ?   )fillr9   )
r   DrawrB   lenappend	enumeratezipmaxrE   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colorrS   rT   dynamic_line_widths                            r   "_draw_gradient_polyline_on_overlayr      sY   >'6**DDDbD\F LO3v;;?##  AE]1q	!,AE]1q	!,r'BG#+v&&&q *33vcrc{F122J3O3O)P)P - -%%k9(-C''++u 	R 	RA/1u92NNN"\1Eq5y)G344E)k)5))EKNil[^&Cq%H5%PPQQAKNil[^&Cq%H5%PPQQA!$Sq5y)A%B%BA!F!FII1vAqz*>PIQQQQn,#- -r   c                 F   t          j        |           } t          j        |          }|d d d d df         dz  }t          j        |gdz  d          }|d d d d d df         |z  | d|z
  z  z   }t          j        |                    t           j                            S )N        o@r    )axisr   )nparraystackr   	fromarrayastypeuint8)rgbtrackr   	blend_imgs       r   add_weightedr      s    
(3--CHUOOE!!!QQQ'NU"EHeWq[r***EaaaBQBh%'#U*;;I?9++BH55666r         rp      c           	         g d}|                                                                                                  } |d                                                                                                                                         }|>|d                                                                                                         }| j        d d         \  }}	}
|j        d         }t          d|z            }g }t          |          D ]-}| |                             t          j
                  }t          j        d|
|	fd          }t          j        |          }g }t          |          D ]}||||f         dk    r|||f         }||t          |          z           }||fz   }|                    |d         |z
  |d         |z
  |d         |z   |d         |z   f|           |t#          ||z
  d          |dz   |f         }t          |          dk    r|                    ||f           t          j        |          }|d d d d dd	f         d
z  }|d d d d d df         |z  |d|z
  z  z   }|rxt          j        d|
|	fd          }|D ]\  }}t)          |||||           t          j        |          }|d d d d dd	f         d
z  }|d d d d d df         |z  |d|z
  z  z   }|                    t          j        |                    t          j                                       /|S )N))f      rq   )r   rq   rq   )rq   rq   r   )rq   r      )r   rq   r   r   r   r   rq   ro   )r   r   r   r   )rr      r   )byter   numpyr@   detachr>   rE   rB   r   r   r   r   newr   rs   rt   ellipserx   ru   r   r   r   r   )videorN   rO   track_framecircle_sizer~   r{   	color_map
num_framesr8   r9   
num_tracksalpha_opacityoutput_framesrF   	frame_rgbrz   draw_overlaypolyline_datarG   track_coordr   circle_colortracks_coord
overlay_npr   polyline_overlaypolyline_nps                               r   draw_tracks_on_videor      s   ]]]IJJLL$$&&EAY^^$$&&**,,2244F]))++//117799
 %BQBJaJg&&MM: +J +J!HOOBJ//	 )FUFO\BB ~g.. z"" 	< 	<A%*QT*:a*?*? A,Ka#i..01E M#33L  +a.;">AQ\@\^ijk^loz^z  }H  IJ  }K  NY  }Y  "Z! !   
 "#a+oq"9"9!a%"?"BCL<  1$$$$lE%:;;; Xg&&
111aaa19%-qqq!!!RaRx(509E	3JJ	  	P$y%,OO'4 o o#e23CZQ]_dfmnnnn (#344K111ac	*U2E#AAAqqq"1"H-5	QY8OOIU_Y-=-=bh-G-GHHIIIIr   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanMoveVisualizeTracksc                    t          j        ddt           j                            d          t           j                            dd          t           j                            ddd	d
          t           j                            ddd	dd          t           j                            ddddd          t           j                            ddd	dd          gt           j                                        g          S )Nr   model/conditioning/video_modelsimagesrN   Toptionalline_resolutionr   r      defaultminrx   r   r      )r   r   rx   advancedr~   g      ?        rV   {Gz?r   r   rx   stepr{   r   node_idcategoryinputsoutputs)r   Schemar   InputTracksIntFloatOutputclss    r   define_schemaz$WanMoveVisualizeTracks.define_schema   s    y,6x((	488.tLL]BA3QUVVy$CStTT\21#PTUU !!
 
 
 	
r   Nr   c           	         |t          j        |          S |d                             d          }|d                             d          }|dz  }	|	j        d         |j        d         k    r3|j        d         |j        d         z  }
|	                    |
ddd          }	t          |	||||||          }t          j        d |D             d                              dd	          	                                }t          j        |
                    t          j                                                            S )
N
track_pathr   track_visibilityr   r   )r   r   r~   r{   c                 6    g | ]}t          j        |          S  )TF	to_tensor).0frames     r   
<listcomp>z2WanMoveVisualizeTracks.execute.<locals>.<listcomp>  s"    "P"P"P52<#6#6"P"P"Pr   r!   r    )r   
NodeOutput	unsqueezer>   repeatr   r   r   movedimfloatr   comfymodel_managementintermediate_device)r   r   r   r   r~   r{   rN   r   r   	images_inrepeat_counttrack_videos               r   executezWanMoveVisualizeTracks.execute  s@   >=(((L)33A66
!"45??BBUN	?1!1!!444%+A.&,q/AL!((q!Q??I*9jBR`o  ~I  SZ  gq  r  r  rk"P"PK"P"P"PVWXXX``abdfggmmoo}[^^E,B,V,V,X,XYYZZZr   N__name__
__module____qualname__classmethodr   r   r   r   r   r   r   r   r      se        
 
 [
" [ [`b`m [ [ [ [[ [ [r   r   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanMoveTracksFromCoordsc           
      .   t          j        ddt           j                            dddd          t           j                            dd          gt           j                                        t           j                            d	
          g          S )Nr   r   track_coordsTz[])force_inputr   r   
track_maskr   track_lengthdisplay_namer   )r   r   Stringr   Maskr   r   r   r   s    r   r   z%WanMoveTracksFromCoords.define_schema  s    y-6	D$Y]^^lT::
 	  "">::
 
 
 	
r   Nr   c                 (  
 t           j                                        }t          |          
t	          
d                   }
fdt          t	          
d                             D             }t          j        |t          j        |          }|j	        d         }|$t          j
        ||ft          j        |          }n-|dk                        d                              d          }i }	||	d<   ||	d	<   t          j        |	|          S )
Nr   c                 .    g | ]fd D             S )c                 H    g | ]}|         d          |         d         gS )rS   rT   r   )r   r   r   s     r   r   z>WanMoveTracksFromCoords.execute.<locals>.<listcomp>.<listcomp>1  s0    QQQE%,s#U5\#%67QQQr   r   )r   r   tracks_datas    @r   r   z3WanMoveTracksFromCoords.execute.<locals>.<listcomp>0  s?        RQQQ[QQQ  r   r   r   r   r
   r!   r    r   r   )r   r   r   r   rt   rB   r   tensorr   r>   r?   boolrD   r   r   r   )r   r   r   r   r   
track_listrN   r   r   out_track_infor  s             @r   r   zWanMoveTracksFromCoords.execute)  s   %99;;'55;q>**   "3{1~#6#677  
 jfMMM\"%
$z<*DEJ_efff *Q333??II"MM'-|$-=)*}^\:::r   r   r   r   r   r   r   r     s[        
 
 [
 ; ;r} ; ; ; [; ; ;r   r   c                   N    e Zd Zed             Ze	 ddej        fd            ZdS )GenerateTracksc                    t          j        dg ddt           j                            ddddd          t           j                            d	d
ddd          t           j                            dddddd          t           j                            dddddd          t           j                            dddddd          t           j                            dddddd          t           j                            dddd          t           j                            dddd          t           j                            dd ddd!d"          t           j                            d#d$d%&          t           j                            d'd(dddd)          t           j                            d*d(dddd+          t           j                            d,g d-d./          t           j                            d0d1d23          gt           j        	                                t           j        	                    d45          g6          S )7Nr  )zmotion pathszcamera movement
trajectoryr   r9   @  r      r   r8     start_xr   rV   r   z1Normalized X coordinate (0-1) for start position.r   r   rx   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_xrp   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   s    r   r   zGenerateTracks.define_schemaC  sA   y$LLL6Wcrt"MMXs2NNy#3Cd  ]P  Q  Qy#3Cd  ]P  Q  Qw#D  [L  M  Mw#D  [L  M  M\21$GG\1!EE~u#3UZ  eC  D  D
  5  CC   D  Dw#D  [m  n  nw#D  [m  n  n#XXXS   
 lTCnoo%* 	  "">::1
 
 
 	
r   Fr%  Nr   c                    t           j                                        }|	}||z  }||z  }||z  }||z  }||z  }||z  }|||z   z  dz  }t          j        dd|	|          }|dk    rt          j        |          }n;|dk    r|}n2|dk    r|dz  }n&|dk    rdd|z
  dz  z
  }n|d	k    r||z  d
d|z  z
  z  }|rp|}d|z
  }|dz  |z  d|z  |z  |z  z   |dz  |z  z   }|dz  |z  d|z  |z  |z  z   |dz  |z  z   }d|z  ||z
  z  d|z  ||z
  z  z   }d|z  ||z
  z  d|z  ||z
  z  z   }nF|||z
  |z  z   }|||z
  |z  z   }t          j        |||z
            }t          j        |||z
            }g } t          |	          D ]}!||!                                         }"||!                                         }#|"dz  |#dz  z   dz  }$|$dk    r|# |$z  }%|"|$z  }&nd}%d}&g }'t          |
          D ]g}(|(|
dz
  dz  z
  |z  })||!                                         |%|)z  z   }*||!                                         |&|)z  z   }+|'	                    |*|+g           h| 	                    |'           t          j
        | t          j        |          },|$t          j        ||
ft          j        |          }-n-|dk                        d                              d          }-i }.|,|.d<   |-|.d<   t!          j        |.|          S )Nr
   r   r   r   r)  r%  r&  r'  r(  r   rp   rV   r   r	  r  r!   r    r   r   )r   r   r   r   linspace
zeros_like	full_likerB   itemru   r  r   r?   r  rD   r   r   r   )/r   r9   r8   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_pxrF   interp_valuest_interpone_minus_tx_positionsy_positions	tangent_x	tangent_yr  	frame_idxtxtyr   perp_xperp_yframe_tracksrd   offsettrack_xtrack_yrN   r   r  s/                                                  r   r   zGenerateTracks.executec  s    ';;==! u_
v%
5=6>5=6>&%&.9A=N1aF;;;J&&!,Q//MMh&&MMi''FMMj((Q1,MMm++EQQY/M 	B$Hh,K%*Z7!k/H:TW_:__bjnoborzbzzK%*Z7!k/H:TW_:__bjnoborzbzzKK8j+@AALT\_gTgDhhIK8j+@AALT\_gTgDhhII$:(='NNK$:(='NNK8j+@AAI8j+@AAI
z** 	, 	,I9%**,,B9%**,,BAga'C/FzzvfL":.. 8 8	#zA~&::oM%i05577&6/I%i05577&6/I##Wg$67777l++++jfMMM$z<*DEJ_efff *Q333??II"MM'-|$-=)*}^\:::r   )Fr%  Nr   r   r   r   r  r  B  sh        
 
 [
> OSI; I;XZXeI; I; I; [I; I; I;r   r  c                   L    e Zd Zed             Zeddej        fd            ZdS )WanMoveConcatTrackc           	          t          j        ddt           j                            d          t           j                            dd          gt           j                                        g          S )NrL  r   tracks_1tracks_2Tr   r   )r   r   r   r   r   r   s    r   r   z WanMoveConcatTrack.define_schema  sd    y(6	
++	
T::
 	  ""

 

 

 
	
r   Nr   c                     |t          j        |          S t          j        |d         |d         gd          }t          j        |d         |d         gd          }i }||d<   ||d<   t          j        |          S )Nr   r   r!   r   r    )r   r   r   r*   )r   rN  rO  
tracks_outmask_outr  s         r   r   zWanMoveConcatTrack.execute  s    =***Y 68NOUVWWW
9h'9:HEW<XY_abbb'1|$-5)*}^,,,r   )NNr   r   r   r   rL  rL    s[        
 
 [
 
- 
-bm 
- 
- 
- [
- 
- 
-r   rL  c                   L    e Zd Zed             Zeddej        fd            ZdS )WanMoveTrackToVideoc                    t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dd          t           j                            d	d
dddd          t           j                            dddt          j	        d          t           j                            dddt          j	        d          t           j                            dddt          j	        d          t           j                            dddd          t           j
                            d          t           j                            dd          gt           j                            d          t           j                            d          t           j                            d           g!          S )"NrT  r   positivenegativevaerN   Tr   rX   rV   r   g      Y@r   z#Strength of the track conditioning.r  r9   r  r   r   r8   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   s    r   r   z!WanMoveTrackToVideo.define_schema  s   y)6%%j11%%j11U##	488z3CUQU  `E  F  FWcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF}--#))*>)NN &&J&??&&J&??	  h 77!
 
 
 	
r   Nr   c                 V   t           j                                        }t          j        |d|dz
  dz  dz   |dz  |dz  g|          }|
t           j                            |
d |                             dd          ||dd                              dd          }
t          j        ||||
j	        d         f|
j
        |
j        	          d
z  }|
|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 |
j	        d         dz
  dz  dz   f<   |	|dk    r|	d         d |         }|j	        d         }|	                    dt          j        ||ft          j        |                    }t          ||g d|||          }t           j                            |                    d          |          }t%          |||          }n|}t'          j        |||d          }t'          j        |||d          }|.t'          j        |d|i          }t'          j        |d|i          }i }||d<   t+          j        |||          S )Nr   r   r      r/  r    bilinearcenterr   rp   r   r   r
   r
  r   r   r   r	  )r   rc  rc  )r:   )concat_latent_imageconcat_maskrZ  samples)r   r   r   r   zerosutilscommon_upscaler   r?   r>   r   r   encodegetr  rU   resize_to_batch_sizer   rm   node_helpersconditioning_set_valuesr   r   )r   rV  rW  rX  r9   r8   r   r+   rX   rN   rY  rZ  r   r[  imagerf  r`   tracks_pathr   r   rL   concat_latent_image_pos
out_latents                          r   r   zWanMoveTrackToVideo.execute  sx   %99;;j"
q/@A.EvQR{TY]^T^_hnooo"+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NKJ{7H7LMVaVhp{  qB  C  C  C  FI  IE+6E';$Q''("%**U111aaaBQB;-?"@"@:q!V\!_6I6OPR6SUhUnoqUrs  }H  }O  Wb  Wh  i  i  iDADDAAA=++A.2q8A===>!hnn$\27F7;(.r2
#)::.@%*fV`Mainis  }C  CD  CD  CD  $E  $E 1+?OQZQZQZ\bdiu  A  A  A	!K<<Y=P=PQR=S=SU_``	*9:MyZb*c*c''*='#;H^u  GK  GL  GL  M  MH#;H^q  CG  GH  GH  I  IH)#;HG[]oFpqqH#;HG[]oFpqqH
 &
9}Xx<<<r   )NNNr   r   r   r   rT  rT    se        
 
 [
0 != !=  WY  Wd != != != [!= != !=r   rT  c                   L    e Zd Zedeeej                          fd            ZdS )WanMoveExtensionr   c                 F   K   t           t          t          t          t          gS r   )rT  r   rL  r   r  )selfs    r   get_node_listzWanMoveExtension.get_node_list  s!        #"
 	
r   N)	r   r   r   r   listtyper   	ComfyNodery  r   r   r   rv  rv    sE        
T$r|*<%= 
 
 
 X
 
 
r   rv  c                  "   K   t                      S r   )rv  r   r   r   comfy_entrypointr~    s      r   )r    r4   )rV   )Nr   r   rp   r   ).r^  ro  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   TensorrE   callabler   r3   rz  strrU   r   rm   r   r   r   r|  r   r   r  rL  rT  rv  r~  r   r   r   <module>r     sb         . . . . . . . . .             & & & & & & / / / / / / / / 4 4 4 4 4 4 !              	
 ji'5<.. <  L	
 ; \   H #% %%\% Cy% 	%
 % % % % % %T , ,,|, , \	, , , ,`%- %- %- %-P7 7 7: : : :z![ ![ ![ ![ ![R\ ![ ![ ![H&; &; &; &; &;bl &; &; &;Rk; k; k; k; k;R\ k; k; k;\- - - - - - - -:<= <= <= <= <=", <= <= <=~	
 	
 	
 	
 	
~ 	
 	
 	
 0      r   