
    +j0&                     x   d dl Z d dlZd dlZd dlmZ d dlmZ d dlZ	d dl
mZmZ dej        dz  g dg ddg dg d	dg dg d
dg dg ddg dg ddg dg ddg dg ddg dg ddg dg dddZd#dZ G d de          Zd Zd$dZ G d dej                  Z G d d e          Zd!efd"ZdS )%    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)         cpuc                 T   d }	 d | D             } z  }||z  }||k    r|z  }	| D ]}
|	|
j         z  z  |
_         n|z  }| D ]}
||
j        z  z  |
_        t          j        fd| D             t          j                  }t          j        |          d          } ||           }t          j        |          d          }t          |||          d                             dddd	          	                                }|d          }t          |d
          d         }|S )Nc                    d | D             }d | D             }d}t          j        g dddd| gg dg dg          }||d         z  |gfd|dd	         D             z   }t          j        |t           j        
          }|S )zQCopied from https://github.com/hehao13/CameraCtrl/blob/main/inference.py
        c                     g | ]	}|j         
S  )w2c_mat.0	cam_params     D/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_camera_trajectory.py
<listcomp>zBprocess_pose_params.<locals>.get_relative_pose.<locals>.<listcomp>       BBB)I%BBB    c                     g | ]	}|j         
S r    )c2w_matr"   s     r%   r&   zBprocess_pose_params.<locals>.get_relative_pose.<locals>.<listcomp>    r'   r(   r   )   r   r   r   r+   )r   r   r+   r   r   r   r   r+   c                     g | ]}|z  S r    r    )r#   abs_c2wabs2rels     r%   r&   zBprocess_pose_params.<locals>.get_relative_pose.<locals>.<listcomp>)   s    )X)X)X'G*;)X)X)Xr(   Ndtype)nparrayfloat32)
cam_paramsabs_w2csabs_c2wscam_to_origintarget_cam_c2w	ret_posesr/   s         @r%   get_relative_posez.process_pose_params.<locals>.get_relative_pose   s     CBzBBBBBzBBBLL1}n%LLLL	#
   !8A;.#&)X)X)X)X8TUTVTV<)X)X)XX	HYbj999	r(   c                 ,    g | ]}t          |          S r    )Camerar"   s     r%   r&   z'process_pose_params.<locals>.<listcomp>/   s     @@@	&##@@@r(   c                 \    g | ](}|j         z  |j        z  |j        z  |j        z  g)S r    )fxfycxcy)r#   r$   heightwidths     r%   r&   z'process_pose_params.<locals>.<listcomp>=   sU     9 9 9 !*	 '\E1%L61%L50%L613 9 9 9r(   r0   devicer   r   r+      zb f c h w -> b f h w c)r?   r@   r2   asarrayr4   torch	as_tensorray_conditionpermute
contiguousr   )r5   rD   rC   original_pose_widthoriginal_pose_heightrF   r;   sample_wh_ratiopose_wh_ratioresized_ori_wr$   resized_ori_h	intrinsicKc2wsplucker_embeddings    ``             r%   process_pose_paramsrX      s     "@@Z@@@JfnO'*>>M&&.# 	@ 	@I(9<7%?ILL	@ -# 	A 	AI(9<7&@ILL
 9 9 9 9 9 .8	9 9 9 AC
	L L LI 		""4(AZ((D?4  &D%avuVLLLQOWWXY[\^_abccnnpp)$/!"35MNNqQr(   c                       e Zd ZdZd ZdS )r=   MCopied from https://github.com/hehao13/CameraCtrl/blob/main/inference.py
    c                    |dd         \  }}}}|| _         || _        || _        || _        t	          j        |dd                                        dd          }|| _        t          j        	                    |          | _
        d S )Nr+            )r?   r@   rA   rB   r2   r3   reshaper*   linalginvr!   )selfentryr?   r@   rA   rB   r*   s          r%   __init__zCamera.__init__N   sz    qsBB(59%%--a33y}}W--r(   N)__name__
__module____qualname____doc__rd   r    r(   r%   r=   r=   K   s-         . . . . .r(   r=   c           
         | j         d         }t          j        t          j        d|dz
  |||j                  t          j        d|dz
  |||j                  d          \  }}|                    dd||z  g                              |d||z  g          dz   }|                    dd||z  g                              |d||z  g          dz   }|                     dd	          \  }}	}
}t          j        |          }||
z
  |z  |z  }||z
  |	z  |z  }|	                    |          }t          j
        |||fd	          }||                    dd
          z  }||dddddf                             dd          z  }|ddddf         }|dddddf         	                    |          }t          j        ||          }t          j        ||gd	          }|                    ||j         d         ||d          }|S )rZ   r   r+   )rF   r1   ij)indexing      ?r^   dimT)ro   keepdim.Nr      )shaperI   meshgridlinspacer1   r_   expandchunk	ones_like	expand_asstacknorm	transposecrosscat)rU   c2wHWrF   Bjir?   r@   rA   rB   zsxsys
directionsrays_drays_orays_dxopluckers                       r%   rK   rK   X   s#    	

A>q!a%6CCCq!a%6CCC  DAq
 	
		1aQ-  ''Aq1u66<A			1aQ-  ''Aq1u66<AWWQBW''NBB			B
b&B	B
b&B	B	b		Bb"b\r222Jjoo"doCCCJ#c2A2rrk*44R<<<Fbqb!_FAAAqqq$J))&11F{66**Hi6*333Gooa1q!Q77GNr(   Q   c                 X   d }g }t          |          D ]}||z  |z  t          d         z  | z  } ||          }||z  |z  t          d         z  |                    dd          z  }	t          j        ||	gd          }
|                    |
           t          j        |          }|S )Nc           	         | \  }}}t          j        g ddt          j        |          t          j        |           gdt          j        |          t          j        |          gg          }t          j        t          j        |          dt          j        |          gg dt          j        |           dt          j        |          gg          }t          j        t          j        |          t          j        |           dgt          j        |          t          j        |          dgg dg          }t          j        |t          j        ||                    }|S )N)r+   r   r   r   )r   r+   r   )r   r   r+   )r2   r3   cossindot)anglestheta_xtheta_ytheta_zRxRyRzRs           r%   compute_R_form_rad_anglez3get_camera_motion.<locals>.compute_R_form_rad_angle}   s-   $*!'Xyyyw"&//)9:w9; < < XwBF7OO<IIfWoo%q"&//:< = = Xw"&//)91=VG__bfWooq9II     F2rvb"~~&&r(   r   r   r   r+   )axis)rangeCAMERA_DICTr_   r2   concatenateappendrz   )r	   r
   speednr   RTr   _angler   _T_RTs              r%   get_camera_motionr   |   s        
B1XX  A#uk,78>$$V,,aC;M23QYYq^^DnaV!,,,
		#	"BIr(   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanCameraEmbeddingc                    t          j        ddt           j                            dg 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dd          t           j                            ddddddd          t           j                            ddddddd          t           j                            ddddddd          t           j                            ddddddd          g	t           j        	                    d !          t           j        	                    d!          t           j        	                    d!          t           j        	                    d!          g"          S )#Nr   zmodel/conditioning/video_modelscamera_pose)	r   r   r   r   r   r   r   r   r   r   )optionsdefaultrD   i@     )r   minmaxsteprC   i  lengthr   r+   r^   r   r   r   g      $@g?T)r   r   r   r   optionalr?   rl   g&.>)r   r   r   r   r   advancedr@   rA   g{Gz?rB   camera_embedding)display_name)node_idcategoryinputsoutputs)
r   SchemaComboInputIntnodesMAX_RESOLUTIONFloatr   Output)clss    r%   define_schemaz WanCameraEmbedding.define_schema   s   y(6!
 
 
 %    Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[w3Y]^^tSaQ[[_jnootSaQ[[_jnootSaQTTXcghhtSaQTTXcghh/4 %,,:L,MM733844844	9"
 "
 "
 "	
r(   r   rl   returnc
           	         |g}
|}t          j        t          |
d                  d                   }t          j        t          |
d                  d                   }t          ||||          }g }|                                D ]}||||	ddg}|                    |d                    |                    |d                    |                    |d                    |                    g d           |                    |           t          j        d |D                       }t          j        t          j        |ddddf                   |gd          }t          |||	          }|
                    g d
                              d                              t          j                                                  }t!          j        t!          j        |ddddddf         dd          |ddddddf         gd                              dd          }|j        \  }}}}}|                                                    ||dz  d|||                              dd          }|                                                    ||dz  |dz  ||                              dd          }t/          j        ||||          S )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+   rG   r,   c                 &    g | ]}d  |D             S )c                 ,    g | ]}t          |          S r    )float)r#   xs     r%   r&   z9WanCameraEmbedding.execute.<locals>.<listcomp>.<listcomp>   s    777Qa777r(   r    )r#   poses     r%   r&   z.WanCameraEmbedding.execute.<locals>.<listcomp>   s'    JJJD77$777JJJr(   N)rD   rC   )r   r   r+   rG   rE   r^   )repeatsro   rn   r   )r2   r3   r   r   tolistextendr   r   
zeros_likerX   rL   	unsqueezetocomfymodel_managementintermediate_devicerI   concatrepeat_interleaver|   rs   rM   viewr   
NodeOutput)r   r   rD   rC   r   r   r?   r@   rA   rB   motion_listr	   r
   r   trajscptrajr5   control_camera_videobfchws                           r%   executezWanCameraEmbedding.execute   s    #m[^4W=>>H[Q0566ua77))++ 	 	BR2a"DKK1KK1KK1KK			"""LLXJJEJJJKK
^R]:aaa!e3D%E%Ez$RTUVV
2:USYZZZ3;;LLLIISSTUVVYYafaw  bL  bL  bN  bNY   O   O$|'(<QQQ1Q3Y(GQRXYZZZ$QQQ122X. 	 
  
  

 )Aq// 	 -21aA3>>@@EEaaQRTUWXZ[\\ffghjkll3>>@@EEaaQRUVQVXY[\]]gghiklmm}15&&IIIr(   N)r   rl   rl   rl   rl   )re   rf   rg   classmethodr   r   r   r   r    r(   r%   r   r      sf        #
 #
 [#
J %J %Jgigt %J %J %J [%J %J %Jr(   r   c                   L    e Zd Zedeeej                          fd            ZdS )CameraTrajectoryExtensionr   c                    K   t           gS N)r   )rb   s    r%   get_node_listz'CameraTrajectoryExtension.get_node_list   s       
 	
r(   N)	re   rf   rg   r   listtyper   	ComfyNoder   r    r(   r%   r   r      sE        
T$r|*<%= 
 
 
 X
 
 
r(   r   r   c                  "   K   t                      S r   )r   r    r(   r%   comfy_entrypointr      s      $&&&r(   )r   r   r   r   r   )r   )r   rI   numpyr2   einopsr   typing_extensionsr   comfy.model_managementr   comfy_api.latestr   r   pir   rX   objectr=   rK   r   r   r   r   r   r    r(   r%   <module>r      s                & & & & & &     / / / / / / / / %'(LL==(LL>>(LL


;;(LL<<(LL<<(LL<<(LL==.;mm,,,OO)5<<<HH / / / /b. . . . .V . . ." " "H   6MJ MJ MJ MJ MJ MJ MJ MJ`
 
 
 
 
 
 
 
' 9 ' ' ' ' ' 'r(   