
    3j]                        S SK r S SKrS SKrS SKJs  Jr  S SKrS SK	rS SK
rS SKJr  S SKJrJr  S SKJr  S SKJrJr  SrS \R.                  " S5      \R0                  4S	\R2                  S
\S\S\R.                  S\R8                  S\R2                  4S jjr  S,S\R2                  S\R2                  S\\   S\S\S\S\4S jjr  S-S\R2                  S\R2                  S\!S\R2                  4S jjr"S-S jr#S r$S.S jr% " S S \RL                  5      r' " S! S"\RL                  5      r( " S# S$\RL                  5      r) " S% S&\RL                  5      r* " S' S(\RL                  5      r+ " S) S*\5      r,S\,4S+ jr-g)/    N)override)ComfyExtensionio)parse_json_tracks)Image	ImageDrawFc                     [         R                  " S[         R                  " S[         R                  " U R	                  [         R
                  5      U5      5      5      $ )Ni'     )torchpowmuldivtofloat32)ids     :/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_wanmove.py<lambda>r      s9    		%1eiiPQPTPTUZUbUbPcefFg9h(i    cpupos_kpos_emb_dim
theta_funcdevicedtypereturnc                 &   US-  S:X  d   S5       eU R                  X45      n [        (       a  U S-   n U R                  S5      n[        R                  " SUS-  X4S9nUR                  SS5      R                  US5      nU" Xq5      nU R                  SS5      R                  U5      n	[        R                  " [        R                  " X5      5      n
[        R                  " [        R                  " X5      5      n[        R                  " X/SS9nU$ )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!UUHHV#Ey	AJ,,q+"26OK&++Ar299*bI,:F ZZA&))%0N599^<=J599^<=J ii0b9GNr   pred_trackspred_visibilitydownsample_ratiosheightwidth	track_numt_down_strategyc                    US;   d   S5       eU R                   u  pxn	Uu  pn[        R                  " XS-
  U
-  S-   S[        R                  S9* nUS:X  a  Un[        R                  " U5      S U nU S S 2U4   nUS S 2U4   n[        SXz5       H  nUS:X  d  US:X  a  UU   nUU   nO0UUUU
-    R                  SS	9n[        R                  " UUUU
-    SS	9n[        U5       Hz  nUU   (       a0  UU   S   S:  d$  UU   S   S:  d  UU   S   U:  d  UU   S   U:  a  M?  UU   u  nn[        UU-  5      [        UU-  5      nnUUsUUUU
-  S4'   UUUU
-  S4'   M|     M     U$ )
N)sampleaveragez1Invalid strategy for downsampling time dimension.r   r
   )r   r    r   r<   r!   )	shaper   oneslongrandpermrangemeananyint)r4   r5   r6   r7   r8   r9   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h5hh3GA!.FF**Q1! 3QejjIIIB	":I.JJ'F J/Jq!$h&%1*J'.NeFl388Q8?J"YYz%f'E1MNy!A!!$
1a(81(<
1a@PST@TXbcdXefgXhlqXqu  AB  vC  DE  vF  JP  vPa=DAqqF{#Sf%5qAQRTUNIa&!+,i5F?A8M.N " % r   vae_featurerL   strengthc                    U R                   u  p4pVnX1R                   S   :X  d   S5       eUR                   S   nUS S 2[        R                  " U5      S S 2S S 24   nUS S 2S S 2SS 2S S 24   n	U	S   S:  U	S   S:  -  n
U
R                  SS9nUR                   S   nUS:X  a  U $ US S 2S4   nUS S 2S4   nUS S 2S4   nUS-   nXXS4   R	                  5       nXXS4   R	                  5       nXUSS4   R	                  5       nXUSS4   R	                  5       nXS S 2SUU4   nXS S 2UUU4   nUUU-
  U-  -   XS S 2UUU4'   U $ )	Nr   zBatch size mismatch.r   ).r   ).r   F)as_tupler
   )r>   r   rA   nonzeror@   )rV   rL   rW   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_featurerl   V   s   
  %%MA!"":$::"A !U^^A.145I Aq!"aK(K1$V)<)ABD LL%L0M##A&IA~ ad#Iad#I!Q$EqyH i9:??AHi9:??AH Iq!3499;HIq!3499;H !Q(BCL!XxIJL>Jl]iNimuMu>uK1h(:; r   c           	         [         R                  " U S5      nUS S S2   nSn/ n[        [        U5      S-
  5       HH  nX(S-      S   X(   S   -
  n	X(S-      S   X(   S   -
  n
X-  X-  -   S-  nUR	                  U5        Xk-  nMJ     US:X  a  g Sn[        [        US S USS  5      5       H  u  nu  pX}   n[        [        U5      S5      n[        U5       H  nXU-  U-  -   nUU-  n[        SSU-
  -  U-  5      n/ UQUP7n[        US   US   US   -
  U-  U-  -   5      n[        US   US   US   -
  U-  U-  -   5      n[        [        USU-
  -  5      S5      nUR                  UU4US-   U4/UUS9  M     UU-  nM     g )NRGBAr    r   r         ?   )fillr8   )
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      s   >>'6*DDbD\F LO3v;?#E]1	!,E]1	!,'BG#+v& $ q *33vcr{F12J3O)P%%k(-C'+uA/u92NNN"\1Eq5y)G34E)k)5)EKNil[^&Cq%H5%PPQAKNil[^&Cq%H5%PPQA!$Sq5y)A%BA!FII1vAqz*>PIQ  	n,# *Qr   c                 D   [         R                  " U 5      n [         R                  " U5      nUS S 2S S 2S4   S-  n[         R                  " U/S-  SS9nUS S 2S S 2S S24   U-  U SU-
  -  -   n[        R                  " UR                  [         R                  5      5      $ )N        o@r    )axisr   )nparraystackr   	fromarrayastypeuint8)rgbtrackr   	blend_imgs       r   add_weightedr      s    
((3-CHHUOE!Q'NU"EHHeWq[r*EaBQBh%'#U*;;I??9++BHH566r   c           	         / SQnU R                  5       R                  5       R                  5       n US   R                  5       R	                  5       R                  5       R                  5       nUb/  US   R	                  5       R                  5       R                  5       nU R
                  S S u  pn
UR
                  S   n[        SU-  5      n/ n[        U5       GH  nX   R                  [        R                  5      n[        R                  " SX4S5      n[        R                  " U5      n/ n[        U5       H  nUb  X.U4   S:X  a  M  XU4   nUU[        U5      -     nUU4-   nUR!                  US   U-
  US   U-
  US   U-   US   U-   4US9  U[#        X-
  S5      US-   2U4   n[        U5      S:  d  M  UR%                  UU45        M     [        R&                  " U5      nUS S 2S S 2SS	24   S
-  nUS S 2S S 2S S24   U-  USU-
  -  -   nU(       au  [        R                  " SX4S5      nU H  u  nn[)        UUUUU5        M     [        R&                  " U5      nUS S 2S S 2SS	24   S
-  nUS S 2S S 2S S24   U-  USU-
  -  -   nUR%                  [        R*                  " UR                  [        R,                  5      5      5        GM     U$ )N))f      rp   )r   rp   rp   )rp   rp   r   )rp   r      )r   rp   r   r   r   r   rp   rn   )r   r   r   r   )rq      r   )byter   numpyr@   detachr>   rE   rB   r   r   r   r   newr   rr   rs   ellipserw   rt   r   r   r   r   )videorN   rO   track_framecircle_sizer}   rz   	color_map
num_framesr7   r8   
num_tracksalpha_opacityoutput_framesrF   	frame_rgbry   draw_overlaypolyline_datarG   track_coordr   circle_colortracks_coord
overlay_npr   polyline_overlaypolyline_nps                               r   draw_tracks_on_videor      s   ]IJJL$$&EAY^^$$&**,224F]))+//1779
 %BQJaJg&MM:HOOBJJ/	 ))FUO\B ~~g. z"A%*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! ! 
 "#aoq"9!a%"?"BCL< 1$$$lE%:; #$ XXg&
1a19%-q!RaRx(509E	3JJ	 $yy%,O'4#e23CZQ]_dfmn (5 ((#34K1ac	*U2E#Aq"1"H-5	QY8OOIU__Y-=-=bhh-GHIW Z r   c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)WanMoveVisualizeTracks   c                    [         R                  " SS[         R                  R                  S5      [         R                  R                  SSS9[         R
                  R                  SSS	S
S9[         R
                  R                  SSS	SSS9[         R                  R                  SSSSSS9[         R
                  R                  SSS	SSS9/[         R                  R                  5       /S9$ )Nr   model/conditioning/wan/moveimagesrN   Toptionalline_resolution   r      defaultminrw   r         )r   r   rw   advancedr}   g      ?              ?{Gz?r   r   rw   steprz      node_idcategoryinputsoutputs)r   Schemar   InputTracksIntFloatOutputclss    r   define_schema$WanMoveVisualizeTracks.define_schema   s    yy,2x(		48.tL]BA3QUVy$CStT\21#PTU !
 	
r   Nr   c           
         Uc  [         R                  " U5      $ US   R                  S5      nUS   R                  S5      nUS-  n	U	R                  S   UR                  S   :w  a3  UR                  S   UR                  S   -  n
U	R	                  U
SSS5      n	[        XXX4US9n[        R                  " U Vs/ s H  n[        R                  " U5      PM     snSS9R                  SS5      R                  5       n[         R                  " UR                  [        R                  R                  5       5      5      $ s  snf )	N
track_pathr   track_visibilityr   r   )r   r   r}   rz   r!   r    )r   
NodeOutput	unsqueezer>   repeatr   r   r   TF	to_tensormovedimfloatr   comfymodel_managementintermediate_device)r   r   r   r   r}   rz   rN   r   r   	images_inrepeat_counttrack_videoframes                r   executeWanMoveVisualizeTracks.execute  s&   >==((L)33A6
!"45??BUN	??1!1!1!!44%++A.&,,q/AL!((q!Q?I*9BR  ~I  gq  rkkK"PK52<<#6K"PVWX``abdfgmmo}}[^^E,B,B,V,V,XYZZ #Qs   : D? N
__name__
__module____qualname____firstlineno__classmethodr   r   r   r   __static_attributes__r   r   r   r   r      s9    
 
" [`b`m`m [ [r   r   c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)WanMoveTracksFromCoordsi  c                    [         R                  " SS[         R                  R                  SSSSS9[         R                  R                  SSS9/[         R
                  R                  5       [         R                  R                  S	S
9/S9$ )Nr   r   track_coordsTz[])force_inputr   r   
track_maskr   track_lengthdisplay_namer   )r   r   Stringr   Maskr   r   r   r   s    r   r   %WanMoveTracksFromCoords.define_schema  st    yy-2		D$Y]^lT:
 		  ">:
 	
r   Nr   c           
      L   [         R                  R                  5       n[        U5      n[	        US   5      n[        [	        US   5      5       VVs/ s H"  nU Vs/ s H  owU   S   Xv   S   /PM     snPM$     nnn[        R                  " U[        R                  US9n	U	R                  S   n
Uc&  [        R                  " XZ4[        R                  US9nO!US:  R                  SS9R                  S5      n0 nXS	'   XS
'   [        R                  " X5      $ s  snf s  snnf )Nr   rS   rT   r   r   r   r
   r!   r    r   r   )r   r   r   r   rs   rB   r   tensorr   r>   r?   boolrD   r   r   r   )r   r   r  r   tracks_datar  r   r   
track_listrN   r   r   out_track_infos                r   r   WanMoveTracksFromCoords.execute)  s   %%99;'5;q>* #3{1~#677E FQQ[E,s#U\#%67[Q7 	  jfM\\"%
$zz<*DEJJ_ef *Q333?II"M'-|$-=)*}}^:: Rs   
D D4D D r   r   r   r   r   r   r   r     s3    
 
 ;r}} ; ;r   r   c                   V    \ rS rSr\S 5       r\ SS\R                  4S jj5       rSr	g)GenerateTracksiB  c                 ,   [         R                  " S/ SQSS[         R                  R                  SSSSSS	9[         R                  R                  S
SSSSS	9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSS9[         R                  R                  SSSSS9[         R                  R                  S S!SSS"S#S9[         R
                  R                  S$S%S&S'9[         R                  R                  S(S)SSSS*S9[         R                  R                  S+S)SSSS,S9[         R                  R                  S-/ S.QS/S09[         R                  R                  S1S2S3S49/[         R                  R                  5       [         R                  R                  S5S69/S79$ )8Nr  )zmotion pathszcamera movement
trajectoryzGenerate Video Tracksr   r8   @  r      r   r7     start_xr   r   r   z1Normalized X coordinate (0-1) for start position.r   r   rw   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_xro   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   r   BooleanCombor  r   r   r   s    r   r   GenerateTracks.define_schemaC  s   yy$L02Wcrt"MXs2Ny#3Cd  ]P  Qy#3Cd  ]P  Qw#D  [L  Mw#D  [L  M\21$G\1!E~u#3UZ  eC  D

  5  CC   Dw#D  [m  nw#D  [m  n#XS  
 lTCno%* 		  ">:3
 	
r   Nr   c                    [         R                  R                  5       nU	nX1-  nXB-  nXQ-  nXb-  nXq-  nX-  nXU-   -  S-  n[        R                  " SSXS9nUS:X  a  [        R
                  " U5      nO;US:X  a  UnO2US:X  a  US-  nO&US:X  a  SSU-
  S-  -
  nOUS	:X  a  UU-  S
SU-  -
  -  nU(       ap  WnSU-
  nUS-  U-  SU-  U-  U-  -   US-  U-  -   nUS-  U-  SU-  U-  U-  -   US-  U-  -   nSU-  UU-
  -  SU-  UU-
  -  -   nSU-  UU-
  -  SU-  UU-
  -  -   nOJUUU-
  W-  -   nUUU-
  U-  -   n[        R                  " UUU-
  5      n[        R                  " UUU-
  5      n/ n [        U	5       H  n!UU!   R                  5       n"UU!   R                  5       n#U"S-  U#S-  -   S-  n$U$S:  a  U#* U$-  n%U"U$-  n&OSn%Sn&/ n'[        U
5       HV  n(U(U
S-
  S-  -
  U-  n)UU!   R                  5       U%U)-  -   n*UU!   R                  5       U&U)-  -   n+U'R                  U*U+/5        MX     U R                  U'5        M     [        R                  " U [        R                  US9n,Uc'  [        R                  " UU
4[        R                  US9n-O!US:  R                  SS9R                  S5      n-0 n.U,U.S'   U-U.S'   [         R"                  " U.U5      $ )Nr
   r   r   r   r+  r'  r(  r)  r*  r   ro   r   r   r	  r  r!   r    r   r   )r   r   r   r   linspace
zeros_like	full_likerB   itemrt   r  r   r?   r  rD   r   r   r   )/r   r8   r7   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_tracksrc   offsettrack_xtrack_yrN   r   r  s/                                                  r   r   GenerateTracks.executed  s~    '';;=! _
%
=>=>&&.9A=NN1a;J&!,,Q/Mh&Mi'FMj(Q1,Mm+EQQY/M$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hI$:(='NNK$:(='NNK8j+@AI8j+@AI
z*I9%**,B9%**,BAga'C/FzvfL":.	#zA~&::oM%i0557&6/I%i0557&6/I##Wg$67	 /
 l+' +* jfM$zz<*DEJJ_ef *Q333?II"M'-|$-=)*}}^\::r   r   )Fr'  Nr   r   r   r   r  r  B  s=    
 
@ OSI;XZXeXeI; I;r   r  c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)WanMoveConcatTracki  c           
          [         R                  " SS[         R                  R                  S5      [         R                  R                  SSS9/[         R                  R	                  5       /S9$ )NrP  r   tracks_1tracks_2Tr   r   )r   r   r   r   r   r   s    r   r    WanMoveConcatTrack.define_schema  sY    yy(2		
+		
T:
 		  "

 
	
r   Nr   c                     Uc  [         R                  " U5      $ [        R                  " US   US   /SS9n[        R                  " US   US   /SS9n0 nX5S'   XES'   [         R                  " U5      $ )Nr   r   r!   r   r    )r   r   r   r*   )r   rR  rS  
tracks_outmask_outr  s         r   r   WanMoveConcatTrack.execute  s~    ==**YY 68NOUVW
99h'9:HEW<XY_ab'1|$-5)*}}^,,r   r   )NNr   r   r   r   rP  rP    s3    
 
 
-bmm 
- 
-r   rP  c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)WanMoveTrackToVideoi  c                    [         R                  " SS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  S5      [         R
                  R                  SSS9[         R                  R                  S	S
SSSSS9[         R                  R                  SSS[        R                  SS9[         R                  R                  SSS[        R                  SS9[         R                  R                  SSS[        R                  SS9[         R                  R                  SSSSS9[         R                  R                  S5      [         R                  R                  SSS9/[         R                  R                  SS9[         R                  R                  SS9[         R                  R                  S S9/S!9$ )"NrZ  r   positivenegativevaerN   Tr   rW   r   r   g      Y@r   z#Strength of the track conditioning.r  r8   r  r   r   r7   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   !WanMoveTrackToVideo.define_schema  sv   yy)2%%j1%%j1U#		48z3CUQU  `E  FWcru?S?SZ\]Xs@T@T[]^Xrqe>R>RYZ[\1!F}-##))*>)N &&J&?&&J&?		  h 7!
 	
r   Nr   c           	      D   [         R                  R                  5       n[        R                  " USUS-
  S-  S-   US-  US-  /US9nU
Gb  [         R
                  R                  U
S U R                  SS5      XESS5      R                  SS5      n
[        R                  " XeXJR                  S   4U
R                  U
R                  S	9S
-  nXS U
R                  S   & UR                  US S 2S S 2S S 2S S24   5      n[        R                  " SSUR                  S   UR                  S   UR                  S   4U
R                  U
R                  S	9nSUS S 2S S 2S U
R                  S   S-
  S-  S-   24'   U	b  US:  a  U	S   S U nUR                  S   nU	R                  S[        R                  " UU4[        R                  US95      n[        UU/ SQXTUS9n[         R
                  R!                  UR#                  S5      U5      n[%        UUU5      nOUn[&        R(                  " UUUS.5      n[&        R(                  " X/US.5      nUb2  [&        R(                  " USU05      n[&        R(                  " USU05      n0 nUUS'   [*        R,                  " XU5      $ )Nr   r   r      r2  r    bilinearcenterr   ro   r   r   r
   r
  r   r   r   r	  )r   rj  rj  )r9   )concat_latent_imageconcat_maskr`  samples)r   r   r   r   zerosutilscommon_upscaler   r?   r>   r   r   encodegetr  rU   resize_to_batch_sizer   rl   node_helpersconditioning_set_valuesr   r   )r   r\  r]  r^  r8   r7   r   r+   rW   rN   r_  r`  r   ra  imagerm  r_   tracks_pathr   r   rL   concat_latent_image_pos
out_latents                          r   r   WanMoveTrackToVideo.execute  s   %%99;j"
q/@A.EvQR{TY]^T^_hno"++44[&5I5Q5QRTVW5XZ_isu}~  G  G  HI  KM  NKJJ7H7H7LMVaVhVhp{  qB  qB  C  FI  IE+6';$$Q'("%**U1aBQB;-?"@::q!V\\!_6I6O6OPR6SUhUnUnoqUrs  }H  }O  }O  Wb  Wh  Wh  iDADDA=+++A.2q8A===>!hn$\27F;(..r2
#)::.@%**fV`Mainisis  }C  CD  $E 1+?OQZ\bu  A	!KK<<Y=P=PQR=SU_`	*9:MyZb*c'*='#;;H^u  GK  GL  MH#;;H  CG  GH  IH)#;;HG[]oFpqH#;;HG[]oFpqH
 &
9}}X<<r   r   )NNNr   r   r   r   rZ  rZ    sB    
 
0 !=  WY  Wd  Wd != !=r   rZ  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)WanMoveExtensioni  r   c                 @   #    [         [        [        [        [        /$ 7fr   )rZ  r   rP  r   r  )selfs    r   get_node_listWanMoveExtension.get_node_list  s        #"
 	
s   r   N)r   r   r   r   r   listtyper   	ComfyNoder  r   r   r   r   r~  r~    s)    
T$r||*<%= 
 
r   r~  c                     #    [        5       $ 7fr   )r~  r   r   r   comfy_entrypointr    s     s   )r    r<   )r   )Nr   r   ro   r   ).rd  rv  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   r  strrU   r   rl   r   r   r   r  r   r   r  rP  rZ  r~  r  r   r   r   <module>r     s      . .    & / 4 !	
 j <<.<<  LL	
 ;; \\H #%%\\% Cy% 	%
 % % %T ,,||, , \\	,`%-P7:z![R\\ ![H&;bll &;Rl;R\\ l;^- -:<=",, <=~	
~ 	
 0 r   