
    3j5              
          S SK r S SKrS SKJs  Jr  S SKJr  S SKr	S SK
r	S SKr	S SKr	S SKJrJrJr  SrSrSr/ SQr/ SQrS	rS
rS\R0                  S\R0                  S\S\S\R0                  4
S jr " S S\R6                  5      r " S S\R6                  5      r " S S\R6                  5      r " S S\R6                  5      r " S S\5      r S\ 4S jr!g)    N)override)ComfyExtensionIOTypesi          )g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?i   i   imagemaskerode_radiussizereturnc                 Z   U SS S24   R                  SS5      R                  SS5      nUR                  SS5      S    n[        R                  " XE/S5      S    nUR                  SS  u  pxU[        X5      -  n	[        R                  R                  U[        S[        X-  5      5      [        S[        Xy-  5      5      SS5      R                  SS5      nUS S 2SS	24   n
US:  aA  [        R                  " U
* S
U-  S-   SUS9* n
[        R                  " US S 2S S24   U
/S5      n[        R                  " U
S   S:  SS9u  pUR                  5       S:X  a  [        S5      e[!        UR                  5       5      [!        UR                  5       5      p[!        UR                  5       5      [!        UR                  5       5      nnX-   S
-  UU-   S
-  nn[        X-
  UU-
  5      S
-  S-  n[!        UU-
  5      [!        UU-
  5      [!        UU-   5      [!        UU-   5      4u  nnnnUR                  SS  u  nnUR#                  SS	UU-
  UU-
  45      n[        US5      [        US5      [        UU5      [        UU5      4u  nnnnUU:  a2  UU:  a,  US S 2S S 2UU2UU24   US S 2S S 2UU-
  UU-
  2UU-
  UU-
  24'   [        R                  R                  UX3SS5      R                  SS5      nUS S 2S S24   US S 2SS	24   -  S   R                  SS5      nUR%                  S5      $ )N.   r      lanczosdisabled      )stridepadding)r   r   T)as_tuplez@TripoSplatPreprocessImage: mask is empty (no foreground pixels).g333333?)clampmovedimtorchcatshapemincomfyutilscommon_upscalemaxroundF
max_pool2dnonzeronumel
ValueErrorint	new_zeros	unsqueeze) r	   r
   r   r   rgbalphargbahwsaysxsx0x1y0y1cxcyhalfleftupperrightlowerHWcropsx0sy0sx1sy1outs                                    =/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_triposplat.py_preprocessrJ      s    RaR.

q!
$
,
,R
3CJJq!T"E99c\1%d+D::bc?DAs1yA;;%%dC5<,@#aquBVXacmnttuvxyzDQ!VAa\\1"a,.21lSSyy$q"1"u+q)1-]]1T7Q;6FB	xxzQ[\\]CM]CMBg]R"WMBrwR 1$s*D #BIBIBIPSTVY]T]P^ ^D%::bc?DAq>>1a=>DT1s5!}c%mSPQ]RCc3
SyS3YEI!QPSTWPWY\]`Y`J`EaQ3;sU{*C$JsTz,AAB;;%%dD	:NTTUVXYZD2A2;a1f%q
)
1
1!R
8C==    c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)TripoSplatPreprocessImage>   c                 f   [         R                  " SSSS[         R                  R                  S5      [         R                  R                  S5      [         R
                  R                  SSS	S
SS9[         R
                  R                  SSSSS
SS9/[         R                  R                  SS9/S9$ )NrM   zTripoSplat Preprocess Imagemodel/conditioning/triposplatzPCrop center each image to a square canvas on a black background and add padding.r	   r
   r   r   r   r   zQErode the alpha matte by this pixel radius before cropping (avoids border bleed).defaultr   r#   tooltipr         i   zZSquare image size. The model is trained at 1024; other sizes run but are off-distribution.rR   r   r#   steprS   display_namenode_idrY   categorydescriptioninputsoutputs)r   SchemaImageInputMaskIntOutputclss    rI   define_schema'TripoSplatPreprocessImage.define_schema?   s    yy/64jw'f%^QA2%x  zVTs2 &B  C XX__'_:;
 	
rK   r   c                    [        S[        U5      S-  S-  5      nUR                  S   UR                  S   :w  a,  [        R                  R                  X!R                  S   5      n[        UR                  SS  5      [        UR                  SS 5      :w  aI  [        R                  " US S 2S 4   R                  5       [        UR                  SS 5      SSS9S S 2S4   n[        R                  " [        UR                  S   5       Vs/ s H  n[        X   X%   X45      PM     snSS9n[        R                  " U5      $ s  snf )	Nr   r   r   r   bilinearF)r   modealign_corners)dim)r#   r*   r   r    r!   repeat_to_batch_sizetupler%   interpolatefloatr   r   rangerJ   r   
NodeOutput)rg   r	   r
   r   r   iprepareds          rI   execute!TripoSplatPreprocessImage.executeQ   s   2D	R2-.::a=EKKN*;;33D++a.IDAB E%++a*:$;;==ag!4!4!6U5;;qQRCS=T[euz{|}  @A  }A  BD99Z_`e`k`klm`nZopZoUVk%(DG\PZopvwx}}X&& qs   E N
__name__
__module____qualname____firstlineno__classmethodrh   r   rt   rw   __static_attributes__ry   rK   rI   rM   rM   >   s3    
 
" ' ' 'rK   rM   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)TripoSplatConditioning\   c                    [         R                  " SSSS[         R                  R                  SSS9[         R                  R                  SS	S9[         R
                  R                  S
5      /[         R                  R                  SS9[         R                  R                  SS9[         R                  R                  SSS9/S9$ )Nr   zTripoSplat ConditioningrP   zEncode the image with DINOv3 and the Flux2 VAE into TripoSplat positive/negative conditioning, and create the fixed size noise target (latent + camera) for the KSamplerclip_visionzDINOv3 ViT-H/16+ image encoderrS   vaez	Flux2 VAEr	   positiverX   negativelatentz-The fixed size noise target (latent +camera).)rY   rS   rZ   )	r   r`   
ClipVisionrb   Vaera   Conditioningre   Latentrf   s    rI   rh   $TripoSplatConditioning.define_schema]   s    yy,24r ##M;[#\UK8w' &&J&?&&J&?		  h@o p
 	
rK   r   c                    [         R                  R                  UR                  5        UR                  nUR                  SS5      R                  U5      n[        R                  " [        US9R                  SSSS5      n[        R                  " [        US9R                  SSSS5      nXV-
  U-  nUR                  UR                  5       S9S   n[        R                  " UR                  5       UR                   SS  5      R                  [         R                  R#                  5       5      n	UR%                  U5      R                  [         R                  R#                  5       5      n
U
R                   S   nU	SU
/0//n[        R&                  " U	5      S[        R&                  " U
5      /0//n[         R                  R#                  5       n[        R(                  " U[*        [,        /US9n[        R(                  " US[.        /US9n[         R0                  R3                  UU45      n[4        R6                  " XSU05      $ )	Nr   r   devicer   )pixel_valuesr   reference_latentssamples)r    model_managementload_model_gpupatcherload_devicer   tor   tensor_DINOV3_MEANview_DINOV3_STDmodelrr   r%   
layer_normr   intermediate_deviceencode
zeros_likezeros_Q_TOKEN_LENGTH_LATENT_CHANNELS_CAM_CHANNELSnested_tensorNestedTensorr   rt   )rg   r   r   r	   r   imgmeanstdseqfeature1refbr   r   dev
latent_seqcamerar   s                     rI   rw   TripoSplatConditioning.executeq   s    	--k.A.AB((mmB"%%f-||L8==aAqIll;v6;;Aq!QGzS SYY[9!<<<		SYYrs^<??@V@V@j@j@lm jj""5#9#9#M#M#OPIIaL 3cU;<=%%h/2EHXHXY\H]G^1_`a $$88:[[!_6F!GPST
aM23?%%22J3GH}}X)W1EFFrK   ry   Nrz   ry   rK   rI   r   r   \   s6    
 
& G G GrK   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)VAEDecodeTripoSplat   c                 t   [         R                  " SS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9/S9$ )Nr   zTripoSplat Decode	3d/latentzrDecode the sampled TripoSplat latent into a 3D gaussian splat. Modify the number of gaussians to vary the density.r   r   TripoSplat VAE decoderr   num_gaussians       zNumber of gaussians to produce (rounded to a multiple of 32). 262144 matches the octree's point density; higher oversamples the same points (denser, but no new detail) and costs proportionally more VRAM/time.rV   seedr   l    zFSeeds the octree point sampler (global RNG) for deterministic decodes.rQ   splatrX   rZ   )
r   r`   r   rb   r   rd   _NUM_GAUSSIANS_MIN_NUM_GAUSSIANS_MAXSplatre   rf   s    rI   rh   !VAEDecodeTripoSplat.define_schema   s    yy), N 			*U,DE_fBTZlsu&l  m VQA;M%m  o	 XX__'_:;!
 	
rK   r   c           	         US   n[        USS5      (       a  UR                  5       S   OUnUR                  nUR                  n[	        [
        [        [        [        U5      5      5      n	X-  S:w  a  [        X-  5      U-  n	[        R                  R                  UR                  5      n
UR                  R                  nUR                   S   nUS-  X-  S-  -   U-  U
-  n[        R                  R#                  UR$                  /US9  UR'                  UR(                  UR                  S	9n[*        R,                  " S
S9R/                  U5      nUR1                  XiUS9 Vs/ s H  oR3                  5       PM     nnS [5        U6  5       u  nnnnn[6        R8                  " [:        R<                  " UUUUU5      5      $ s  snf )Nr   	is_nestedFr   r   r   
   memory_required)r   dtypecpur   )r   	generatorc              3   N   #    U  H  n[         R                  " U5      v   M     g 7fN)r   stack).0ts     rI   	<genexpr>.VAEDecodeTripoSplat.execute.<locals>.<genexpr>   s     6[{!u{{1~~{s   #%)getattrunbindfirst_stage_modelgaussians_per_pointr#   r   r   r   r*   r$   r    r   
dtype_size	vae_dtypegsmodel_channelsr   load_models_gpur   r   r   r   	Generatormanual_seeddecoderender_tensorszipr   rt   r   SPLAT)rg   r   r   r   r   r2   r   decodergppnr   hiddencond_tokensr   r   gparts	positionsscales	rotations	opacitiesshs                         rI   rw   VAEDecodeTripoSplat.execute   s   I")![%"@"@Aa''))"C(:C<N$OP7a<ag$A++66s}}E
**ll1o&?ah"_<FS..}o.^#**CMMBOO51==dC	-4^^F_h^-ij-i!!#-ij6[sTY{6[3	69i}}U[[FIyRTUVV ks   'Gry   Nrz   ry   rK   rI   r   r      s6    
 
( W2== W WrK   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)TripoSplatSamplingPreview   c                 0   [         R                  " SSSS[         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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(9/[         R                  R                  5       /S)9$ )*Nr   zTripoSplat Sampling Previewr   zuPatch the TripoSplat model for the standard Ksampler node to show a live decoded gaussian splat preview at each step.r   r   r   r   octree_levelr   r      Tz>Octree depth for the preview decode (lower = cheaper/coarser).)rR   r   r#   advancedrS   r   i @  rT   r   r   zMNumber of gaussians to produce for the preview (rounded to a multiple of 32).rV   yawg     V@g     vg     v@g      ?zPreview camera yaw in degrees.)rR   r   r#   rW   rS   r   pitchg      .@g     @Vg     @V@z Preview camera pitch in degrees.
point_sizer   r   r   zMaximum splat radius in pixels. Each gaussian is sized from its scale and capped here; lower = finer/pointier, higher = chunkier.rQ   rZ   )r   r`   Modelrb   r   rd   Floatre   rf   s    rI   rh   'TripoSplatSamplingPreview.define_schema   s   yy/6 ? w'U,DE^QA1t%e  g_e6XZ%t  vudEPS]}  IM  Ow%TPS]  KO  Q\1!&R  S XX__&''
 	
rK   r   c                   ^^^^ SSK Jm  XCXVUS.mTR                  nUR                  R                  R
                  n	U	S-  XHR                  -  S-  -   UR                  R                  -  [        R                  R                  TR                  5      -  mUUUU4S jn
UR                  5       nUR                  [        R                  R                   R"                  SU
5        [$        R&                  " U5      $ )Nr   )decode_x0_to_image)	gaussianslevelr   r   r   r   r   c                    >^^ [        U5      nSn[        U5      U:  a  X   OUR                  S5      mSS SS.mUUU	UUU
4S jn[        U5      U:  a  XAU'   OXBS'   U " U0 UD6$ )Nr   callbackTF)okpbarloadedc                   > T
b	  T
" XX#5        TS   (       d  g  TS   (       d[  [         R                  R                  SS9nUR                  TR                  5        [         R                  R                  UT	S9  STS'   T" TUT5      nTS   c"  [         R                  R                  U5      TS'   TS   R                  U S-   USUS	45        g ! [         a4  n[        R                  " S
R                  U5      5        STS'    S nAg S nAff = f)Nr  r  T)only_currently_usedr   r  r   JPEGi   z9TripoSplatSamplingPreview: preview failed, disabling ({})F)r    r   loaded_modelsappendr   r   r!   ProgressBarupdate_absolute	Exceptionloggingwarningformat)rW   r6   xtotal_stepsr  r   ecfgr   r   orig_cbstater   s          rI   r  QTripoSplatSamplingPreview.execute.<locals>.outer_sample_wrapper.<locals>.callback   s    &Da5T{( ?(-(>(>(L(Lae(L(f%,,S[[9..>>}^m>n*.h,S"c:CV},(-(?(?(Lf&M11$(K&RUWZI[\  (OO$_$f$fgh$ij"'E$K(s   B3C 
D*DD)listlenget)executorargskwargscb_idxr  r  r  r  r   r   r   s        @@rI   outer_sample_wrapper?TripoSplatSamplingPreview.execute.<locals>.outer_sample_wrapper   sq    :DF&)$i&&8dlfjj>TG?E( (& 4y6!'V%-z"T,V,,rK   triposplat_sampling_preview)comfy.ldm.triposplat.previewr   r   r   diffusion_modelq_token_lengthr   r   r   r    r   r   r   cloneadd_wrapper_with_keypatcher_extension
WrappersMPOUTER_SAMPLEr   rt   )rg   r   r   r   r   r   r   r   fsmr   r  mr  r   r   s     `         @@@rI   rw   !TripoSplatSamplingPreview.execute   s    C)') ##kk11@@&?m?V?V.VZ\-\\`c`f`f`u`uux}  yO  yO  yZ  yZ  [^  [h  [h  yi  i	- 	-> KKM	u66AANNPm  pD  	E}}QrK   ry   Nrz   ry   rK   rI   r   r      s6    
 
. , Y[YfYf ,  , rK   r   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)TripoSplatExtensioni  r   c                 6   #    [         [        [        [        /$ 7fr   )rM   r   r   r   )selfs    rI   get_node_list!TripoSplatExtension.get_node_list  s      &"%	
 	
s   ry   N)r{   r|   r}   r~   r   r  typer   	ComfyNoder0  r   ry   rK   rI   r-  r-    s)    
T$r||*<%= 
 
rK   r-  c                     #    [        5       $ 7fr   )r-  ry   rK   rI   comfy_entrypointr5    s       s   )"r  r   torch.nn.functionalnn
functionalr%   typing_extensionsr   comfy.model_managementr    comfy.nested_tensorcomfy.patcher_extensioncomfy.utilscomfy_api.latestr   r   r   r   r   r   r   r   r   r   Tensorr*   rJ   r3  rM   r   r   r   r-  r5  ry   rK   rI   <module>r@     s        &     6 6  $#  "u|| "5<< "s "RU "Z_ZfZf "J' '<-GR\\ -G`*W",, *WZF  F R
. 
! 3 !rK   