
    3j.&                     ~   S SK r S SKrS SKrS SKJr  S SKJr  S SKr	S SK
JrJr  S\R                  S-  / SQ/ SQS./ SQ/ S	QS./ SQ/ S
QS./ SQ/ SQS./ SQ/ SQS./ SQ/ SQS./ SQ/ SQS./ SQ/ SQS./ SQ/ SQS.S.rSS jr " S S\5      rS rSS jr " S S\R(                  5      r " S S\5      rS\4S jrg)    N)	rearrange)override)ComfyExtensioniog      ?   )        r   r   )angleT)r         r   )r         ?r   )r   r   r   )r   r   r   )r   r   g       @)r   r   g       )r   r   r   )r   r   r   )base_T_norm
base_angleStaticPan UpPan DownPan Left	Pan RightZoom InZoom OutAnti Clockwise (ACW)ClockWise (CW)c           
         S n U  Vs/ s H  n[        U5      PM     n nX-  nX4-  n	X:  a$  X)-  n
U  H  nXR                  -  U-  Ul        M     O#X-  nU  H  nXR                  -  U-  Ul        M     [        R                  " U  Vs/ s H=  nUR                  U-  UR                  U-  UR
                  U-  UR                  U-  /PM?     sn[        R                  S9n[        R                  " U5      S    nU" U 5      n[        R                  " U5      S    n[        XX!US9S   R                  SSSS5      R                  5       nUS    n[        US5      S   nU$ s  snf s  snf )	Nc                 j   U  Vs/ s H  oR                   PM     nnU  Vs/ s H  oR                  PM     nnSn[        R                  " / SQSSSU* // SQ/ SQ/5      nXRS   -  nU/USS  Vs/ s H  ovU-  PM	     sn-   n[        R                  " U[        R                  S9nU$ s  snf s  snf s  snf )zQCopied from https://github.com/hehao13/CameraCtrl/blob/main/inference.py
        r   )   r   r   r   r   )r   r   r   r   r   r   r   r   Ndtype)w2c_matc2w_matnparrayfloat32)	
cam_params	cam_paramabs_w2csabs_c2wscam_to_origintarget_cam_c2wabs2relabs_c2w	ret_posess	            D/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_camera_trajectory.pyget_relative_pose.process_pose_params.<locals>.get_relative_pose   s     8BBz)%%zB7ABz)%%zB1}n%	#
  !A;.#&8TUTV<)X<G*;<)XX	HHYbjj9	 CB *Ys   B&B+.B0r   devicer   r   r      zb f c h w -> b f h w c)Camerafxfyr    asarraycxcyr"   torch	as_tensorray_conditionpermute
contiguousr   )r#   widthheightoriginal_pose_widthoriginal_pose_heightr0   r-   r$   sample_wh_ratiopose_wh_ratioresized_ori_wresized_ori_h	intrinsicKc2wsplucker_embeddings                   r,   process_pose_paramsrI      s   "5?@Z	&#ZJ@nO'>M&.#I(<<7%?IL $ -#I(<<7&@IL $ 

 .8	9 .8		 '\\E1%LL61%LL50%LL613 .8	9 AC

	LI 		"4(AZ(D??4 &D%avVLQOWWXY[\^_abcnnp)$/!"35MNqQ5 A9s   EAE#c                       \ rS rSrSrS rSrg)r2   K   MCopied from https://github.com/hehao13/CameraCtrl/blob/main/inference.py
    c                     USS u  p#pEX l         X0l        X@l        XPl        [        R
                  " USS  5      R                  SS5      nX`l        [        R                  R                  U5      U l
        g )Nr            )r3   r4   r6   r7   r    r!   reshaper   linalginvr   )selfentryr3   r4   r6   r7   r   s          r,   __init__Camera.__init__N   s_    q((59%--a3yy}}W-    )r   r6   r7   r3   r4   r   N)__name__
__module____qualname____firstlineno____doc__rV   __static_attributes__ rX   r,   r2   r2   K   s    .rX   r2   c                    U R                   S   n[        R                  " [        R                  " SUS-
  X$UR                  S9[        R                  " SUS-
  X4UR                  S9SS9u  pgUR                  SSX#-  /5      R                  USX#-  /5      S-   nUR                  SSX#-  /5      R                  USX#-  /5      S-   nU R                  SSS	9u  pp[        R                  " U5      nXz-
  U-  U-  nXk-
  U	-  U-  nUR                  U5      n[        R                  " XU4SS	9nXR                  SS
S9-  nXSSS2SS24   R                  SS5      -  nUSSS2S4   nUSS2SS2S4   R                  U5      n[        R                  " UU5      n[        R                  " UU/SS	9nUR                  XQR                   S   X#S5      nU$ )rL   r   r   )r0   r   ij)indexing      ?rP   dimT)rf   keepdim.Nr      )shaper8   meshgridlinspacer   rQ   expandchunk	ones_like	expand_asstacknorm	transposecrosscat)rF   c2wHWr0   Bjir3   r4   r6   r7   zsxsys
directionsrays_drays_orays_dxopluckers                       r,   r:   r:   X   s    	

A>>q!a%Cq!a%CDA
 	
		1a- ''Aqu6<A			1a- ''Aqu6<AWWQBW'NBB		B
&B	B
&B	B	b	Bbb\r2Joo"doCCJc2A2rrk*44R<<Fbqb!_FAq$J))&1F{{66*Hii6*3Gooa1qQ7GNrX   c                 .   S n/ n[        U5       Hj  nXc-  U-  [        S   -  U -  nU" U5      nXc-  U-  [        S   -  UR                  SS5      -  n	[        R                  " X/SS9n
UR                  U
5        Ml     [        R                  " U5      nU$ )Nc           	         U u  pn[         R                  " / SQS[         R                  " U5      [         R                  " U5      * /S[         R                  " U5      [         R                  " U5      //5      n[         R                  " [         R                  " U5      S[         R                  " U5      // SQ[         R                  " U5      * S[         R                  " U5      //5      n[         R                  " [         R                  " U5      [         R                  " U5      * S/[         R                  " U5      [         R                  " U5      S// SQ/5      n[         R                  " U[         R                  " XT5      5      nU$ )N)r   r   r   r   )r   r   r   )r   r   r   )r    r!   cossindot)anglestheta_xtheta_ytheta_zRxRyRzRs           r,   compute_R_form_rad_angle3get_camera_motion.<locals>.compute_R_form_rad_angle}   s   $*!'XXyw"&&/)9:w9; < XXwBFF7O<ffWo%q"&&/:< = XXw"&&/)91=VVG_bffWoq9   FF2rvvb~&rX   r   r   r   r   )axis)rangeCAMERA_DICTrQ   r    concatenateappendrq   )r	   r
   speednr   RTr{   _angler   _T_RTs              r,   get_camera_motionr   |   s      
B1X#uk,78>$V,C;M23QYYq^DnnaV!,
		#  
"BIrX   c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)WanCameraEmbedding   c                    [         R                  " SS[         R                  R                  S/ SQ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SS9[         R                  R                  SSSSSSSS9[         R                  R                  SSSSSSSS9[         R                  R                  SSSSSSSS9[         R                  R                  SSSSSSSS9/	[         R                  R                  S S!9[         R                  R                  SS!9[         R                  R                  SS!9[         R                  R                  SS!9/S"9$ )#Nr   zmodel/conditioning/wan/cameracamera_pose)	r   r   r   r   r   r   r   r   r   r   )optionsdefaultr=   i@     )r   minmaxstepr>   i  lengthQ   r   rP   r   r   r   g      $@g?T)r   r   r   r   optionalr3   rc   g&.>)r   r   r   r   r   advancedr4   r6   g{Gz?r7   camera_embedding)display_name)node_idcategoryinputsoutputs)
r   SchemaComboInputIntnodesMAX_RESOLUTIONFloatr   Output)clss    r,   define_schema WanCameraEmbedding.define_schema   s   yy(4!
 %   Wcru?S?SZ\]Xs@T@T[]^Xrqe>R>RYZ[w3Y]^tSaQ[[_jnotSaQ[[_jnotSaQTTXcghtSaQTTXcgh/4 %%,,:L,M738484	9"
 "	
rX   returnc
                 :   U/n
Un[         R                  " [        U
S      S   5      n[         R                  " [        U
S      S   5      n[        XXT5      n/ nUR	                  5        Hi  nXgXSS/nUR                  US   5        UR                  US   5        UR                  US   5        UR                  / SQ5        UR                  U5        Mk     [         R                  " U VVs/ s H  nU Vs/ s H  n[        U5      PM     snPM!     snn5      n[         R                  " [         R                  " USS2SS24   5      U/S5      n[        UX#S9nUR                  / S	Q5      R                  S5      R                  [        R                  R!                  5       S
9n["        R$                  " ["        R&                  " USS2SS2SS24   SSS9USS2SS2SS24   /SS9R)                  SS5      nUR*                  u  nnnnnUR-                  5       R/                  UUS-  SUUU5      R)                  SS5      nUR-                  5       R/                  UUS-  US-  UU5      R)                  SS5      n[0        R2                  " UX#U5      $ s  snf s  snnf )u   
Use Camera trajectory as extrinsic parameters to calculate Plücker embeddings (Sitzmannet al., 2021)
Adapted from https://github.com/aigc-apps/VideoX-Fun/blob/main/comfyui/comfyui_nodes.py
r   r	   r
   r   r1   r   N)r=   r>   )r   r   r   r1   r/   rP   )repeatsrf   re   r   )r    r!   r   r   tolistextendr   floatr   
zeros_likerI   r;   	unsqueezetocomfymodel_managementintermediate_devicer8   concatrepeat_interleavers   rj   r<   viewr   
NodeOutput)r   r   r=   r>   r   r   r3   r4   r6   r7   motion_listr	   r
   r   trajscptrajposexr#   control_camera_videobfchws                             r,   executeWanCameraEmbedding.execute   s|    #m[^4W=>HH[Q056u7))+Ba"DKK1KK1KK1KK	"LL  XXEJED$7$Qa$7EJK
^^R]]:a!e3D%Ez$RTUV
2:UZ3;;LISSTUVYYafawaw  bL  bL  bNY   O$||''(<Q1Q3Y(GQRXYZ$Q12X. 	 

 )Aq/ 	 -221aA3>>@EEaaQRTUWXZ[\ffghjkl3>>@EEaaQRUVQVXY[\]gghiklm}}15&II#  8Js   ,
J
6JJ
J
r_   N)r   rc   rc   rc   rc   )
rY   rZ   r[   r\   classmethodr   r   r   r   r^   r_   rX   r,   r   r      s:    #
 #
J %Jgigtgt %J %JrX   r   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)CameraTrajectoryExtension   r   c                    #    [         /$ 7fN)r   )rT   s    r,   get_node_list'CameraTrajectoryExtension.get_node_list   s      
 	
s   
r_   N)rY   rZ   r[   r\   r   listtyper   	ComfyNoder   r^   r_   rX   r,   r   r      s)    
T$r||*<%= 
 
rX   r   r   c                     #    [        5       $ 7fr   )r   r_   rX   r,   comfy_entrypointr      s     $&&s   )i  i  i   i  cpu)r   )r   r8   numpyr    einopsr   typing_extensionsr   comfy.model_managementr   comfy_api.latestr   r   pir   rI   objectr2   r:   r   r   r   r   r   r_   rX   r,   <module>r      s        &  / %%'(=(>(
;(<(<(<(=.;,O)5<H/b.V ."H6MJ MJ`
 
' 9 'rX   