
    +ju                       S SK r S SKrS SKrS SKrS SKJr  S SKrS SKrS SK	J
r
  S SKJrJrJr  S SKJr  S SKJr  S SKrS SKrS SKJrJrJr  S SKJr  S S	KJr  S
r S r!S r"S\RF                  S\$S\$4S jr%S\&S\'\(\(\(4   4S jr)S r*S\+4S jr,Sr-Sr.Sr/Sr0S\+4S jr1Sr2Sr3Sr4\ S-  r5S\+4S jr60 SS _S!S"_S#S$_S%S&_S'S(_S)S*_S+S,_S-S._S/S _S0S"_S1S$_S2S&_S3S(_S4S*_S5S,_S6S._r7S7S8S9S:.r8S S;S<S=S>.r9S? r:S@ r;SA\+4SB jr<SA\+4SC jr=SA\+4SD jr>SA\+4SE jr?\<\=\>\?SF.r@SA\+S\&4SG jrAS\RF                  S\$4SH jrBSI rCSJ rDSK rESL rF " SM SN\R                  5      rH " SO SP\R                  5      rISQ rJSR rKSS rLSwSU jrMSxSV jrNSW rOSX rPSY rQ SySZ jrR " S[ S\\R                  5      rS " S] S^\R                  5      rT " S_ S`\R                  5      rU " Sa Sb\R                  5      rVSc rWSd\XS\RF                  4Se jrY " Sf Sg\R                  5      rZSh r[STSS\R                  4Si jr]Sj r^Sk r_SzSl jr`Sm raS{Sn jrbS|So jrcSp rdSzS\RF                  4Sq jjre " Sr Ss\R                  5      rf " St Su\5      rgS\g4Sv jrhg)}    N)BytesIO)override)map_coordinatesminimummaximum)
coo_matrix)connected_components)ComfyExtensionIOTypes)pack_variable_mesh_batch)PromptServergmBP?c                 n    [         R                  " U S:*  U S-  U R                  S5      S-   S-  S-  5      $ )N?ܵ?ףp=
)@r   )\(?zG?333333@torchwhere	clamp_mincs    A/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_gaussian_splat.py_srgb_to_linearr      s5    ;;qG|QY!++a.52HE1QVY0YZZ    c                 n    [         R                  " U S:*  U S-  SU R                  S5      S-  -  S-
  5      $ )Ngsåi?r   r   r   g?r   r   r   s    r   _linear_to_srgbr      s5    ;;qI~q5y%!++a.W:U2UX]2]^^r   gireturnc                     U R                   b&  [        U R                   U   R                  5       5      $ U R                  R                  S   $ )N   )countsintitem	positionsshape)r    r!   s     r   	_real_lenr*   !   s<    &'hh&:3qxx{!"T@Q@QRS@TTr   hc                 p   ^  T R                  S5      m [        T 5      S:w  a  g[        U 4S jS 5       5      $ )N#   )        r/   r/   c              3   L   >#    U  H  n[        TXS -    S5      S-  v   M     g7f)           o@N)r&   ).0r!   r+   s     r   	<genexpr>_hex_to_rgb.<locals>.<genexpr>+   s%     @iQqQZ$u,is   !$)r   r1      )lstriplentuple)r+   s   `r   _hex_to_rgbr;   &   s/    	A
1v{@i@@@r   c                     SnU R                  5       U:  a  U S S U R                  5       U-  S-   2   n [        R                  " X5      $ )N   r$   )numelr   quantile)xqlims      r   	_quantilerC   .   sC    
Cwwy3%c!A%%&>>!r   c                    U R                  5       R                  5       R                  [        R                  5      nUR
                  S   nUS:X  a  [        S5      e[        R                  " U5      nUR                  5       R                  5       R                  [        R                  5      nUSS2SSS24   n	USS2SS2SS24   R                  SSS5      R                  US5      n
UR                  5       R                  5       R                  [        R                  5      R                  US5      R                  SS5      n[        R                  " US	U-
  -  5      n[        R                  " UR                  5       R                  5       R                  [        R                  5      R                  S
S95      nUR                  5       R                  5       R                  [        R                  5      n/ SQ[        S5       Vs/ s H  nSU 3PM
     sn-   [        U
R
                  S   5       Vs/ s H  nSU 3PM
     sn-   S/-   [        S5       Vs/ s H  nSU 3PM
     sn-   [        S5       Vs/ s H  nSU 3PM
     sn-   n[        R                  " Xo Vs/ s H  nUS4PM	     snS9n[        [        [         [        R"                  " XWXXU/SS95      5      USS& SSU S3-   nUSR%                  S U 5       5      S-   -  nUR'                  S5      UR)                  5       -   $ s  snf s  snf s  snf s  snf s  snf )a,  Serialize render-ready gaussian tensors as a binary 3DGS .ply.

positions (N,3) world; scales (N,3) linear; rotations (N,4) quat wxyz; opacities (N,1) in [0,1];
sh (N,K,3) SH coefficients. Activated values are inverted to the standard 3D gaussian splat storage convention
(log scale, logit opacity).
r    SplatToFile3D: gaussian is emptyNr$   r1   ư>g!?      ?:0yE>min)r@   yznxnynz   f_dc_f_rest_opacityscale_r7   rot_f4dtypeaxisz$ply
format binary_little_endian 1.0
zelement vertex 
 c              3   .   #    U  H  nS U S3v   M     g7f)zproperty float r\   N )r4   as     r   r5   &_gaussian_ply_bytes.<locals>.<genexpr>R   s     =u!s"-us   zend_header
ascii)cpunumpyastypenpfloat32r)   
ValueError
zeros_like	transposereshapecliplograngeemptylistmapr:   concatenatejoinencodetobytes)r(   scales	rotations	opacitiesshxyznnormalsff_dcf_restopscalerotr!   attrsr`   elementsheaders                      r   _gaussian_ply_bytesr   6   s    --/


!
(
(
4C		!AAv;<<mmC G


+AQ1W:Dq!"ax[""1a+33Ar:F				 	'	'

	3	;	;Aq	A	F	FtX	VB	cBh	 BFF6::<%%'..rzz:??D?IJE
--/


!
(
(
4C.%*1X.X%sX./',V\\!_'=>'=!'!'=>? { 5:!H=HqqclH=> V[[\U]@^U]PQ4sU]@^_E xxU!;U1d)U!;<Hs5"..#bY\1]de"fghHQK5/!B8OOF
bgg=u==NNF==!H$4$4$666 />=@^!;s   L.3L3L87L=M
      ,   )r   r$   c                    U R                  5       R                  5       R                  [        R                  5      nUR
                  S   nUS:X  a  [        S5      eUR                  5       R                  5       R                  [        R                  5      nUR                  5       R                  5       R                  [        R                  5      nU[        R                  R                  USSS9R                  S5      -  n[        R                  " USS2SSS24   R                  5       R                  5       R                  [        R                  5      [        -  S-   SS5      n	UR                  5       R                  5       R                  [        R                  5      R                  US5      R                  SS5      n
[        R                  " [        R                  " X/SS	9S
-  5      R                  [        R                  5      n[        R                  " XWU/SS	9R                  S5      n[        R                  " USS/S9nXS'   XS'   UR!                  5       n[#        [$        5      n[&        S   US'   [&        S   US'   [(        R*                  " SUSS5        [(        R*                  " SUSS5        [(        R*                  " SUSU5        [(        R*                  " SUSU5        [(        R*                  " SUSS5        [(        R*                  " SUSSSS5        [(        R*                  " SUSSS5        [#        [,        5      n[(        R*                  " SUSU5        [(        R*                  " SUSU5        [(        R*                  " SUSU[.        -  5        [(        R*                  " SUSS5        [(        R*                  " SUSS5        [(        R*                  " SUSS5        [1        U5      [1        U5      -   U-   $ ) zSerialize gaussian tensors as a level-0, SH degree-0 .ksplat (linear scale, opacity in color alpha).

positions (N,3) world; scales (N,3) linear; rotations (N,4) wxyz; opacities (N,1) in [0,1]; sh (N,K,3).
r   rE   r$   Tr[   keepdims-q=N      ?rZ   r3   <f4)r}   r   
   )r   u1r7   rX   r}   r   <Ir7         r2   <H   z<fff   r/   z<ff$          (   )rc   rd   re   rf   rg   r)   rh   linalgnormrl   _C0rk   roundrr   uint8ro   ru   	bytearray_KSPLAT_HEADER_BYTES_KSPLAT_VERSIONstruct	pack_into_KSPLAT_SECTION_HEADER_BYTES_KSPLAT_BYTES_PER_SPLATbytes)r(   rv   rw   rx   ry   rz   r{   r   r   rgbr   rgbafloatsrec
splat_datar   sections                    r   _gaussian_ksplat_bytesr   ^   s   
 --/


!
(
(
4C		!AAv;<<JJL ''

3E
--/


!
(
(
4C
		sT:??F
FC
''"Q1W+//#))+222::>DsJAq
QC				 	'	'

	3	;	;Aq	A	F	Fq!	LB88BNNC915=>EEbhhOD ^^S-A6==eDF
((1-~>
?CHHJ+,F"F1I"F1I
T61a(
T61a(
T62q)
T62q)
T62q)
VVRc37
UFBS145G
T7Aq)
T7Aq)
T7B,C(CD
T7B*
T7B*
T7B*=5>)J66r   iNGSPr1   r   g333333?c                 x	   U R                  5       R                  5       R                  [        R                  5      nUR
                  S   nUS:X  a  [        S5      eS[        -  n[        R                  " [        R                  " XW-  5      SS5      R                  [        R                  5      nUS-  R                  [        R                  5      n	[        R                  " U	S-  U	S-	  S-  U	S	-	  S-  /S
S9R                  US5      R                  [        R                  5      n
[        R                  " UR                  5       R                  5       R                  [        R                  5      R                  U5      S-  5      R                  SS5      R                  [        R                  5      nUSS2SSS24   R                  5       R                  5       R                  [        R                  5      [        -  S-   n[        R                  " US-
  [         -  S-   S-  5      R                  SS5      R                  [        R                  5      n[        R"                  " UR                  5       R                  5       R                  [        R                  5      R                  SS95      n[        R                  " US-   S-  5      R                  SS5      R                  [        R                  5      nUR                  5       R                  5       R                  [        R                  5      nU[        R$                  R'                  USSS9R                  S5      -  nUUSS2S4   S:  ==   S-  ss'   [        R                  " USS2SS24   S-   S-  5      R                  SS5      R                  [        R                  5      n[)        S	5      n[*        R,                  " SUS[.        5        [*        R,                  " SUS[0        5        [*        R,                  " SUSU5        SUS'   [        US'   SUS'   SUS'   [3        U5      U
R5                  5       -   UR5                  5       -   UR5                  5       -   UR5                  5       -   UR5                  5       -   n[6        R8                  " U5      $ ) zSerialize gaussian tensors as a gzip-compressed .spz (Niantic v2, SH degree 0, base color only).

positions (N,3) world; scales (N,3) linear; rotations (N,4) wxyz; opacities (N,1) in [0,1]; sh (N,K,3).
r   rE   r$   i  i i    r   r2   rF   rZ   	   r3   Nr   g&.>rJ         $@      0@Tr   r         r7   rH        _@r   r            )rc   rd   re   rf   rg   r)   rh   _SPZ_FRACTIONAL_BITSrl   r   int32uint32stackrk   r   r   _SPZ_COLOR_SCALErm   r   r   r   r   r   
_SPZ_MAGIC_SPZ_VERSIONr   ru   gzipcompress)r(   rv   rw   rx   ry   rz   r{   fixedqiquposalphar   colslnscbr   rotbr   raws                       r   _gaussian_spz_bytesr      s   
 --/


!
(
(
4C		!AAv;<< %%E	#+&
M	B	I	I"((	SB
x-					*B
((BIa4/"(d1BC"
M
U
UVWYZ
[
b
bceckck
lCHHY]]_**,33BJJ?GGJURSXXYZ\_`gghjhphpqE
Q1W+//

!
!
#
*
*2::
6
<s
BC
((S3Y"22S8EA
B
G
G3
O
V
VWYW_W_
`C
&&##%,,RZZ8==$=G
HC
((C$J$&
'
,
,Q
4
;
;BHH
EC
--/


!
(
(
4C
		sT:??F
FCAqD	A$88SAaC[3&%/055a=DDRXXNDr]F
T61j1
T61l3
T61a(F2J%F2JF2JF2J=3;;=(5==?:[[] [[]+-1\\^<C==r   chari1ucharr   shorti2ushortu2r&   i4uintu4floatrW   doublef8int8r   int16uint16r   r   rg   float64)r   r   r2   r7   r7   r$   )r.   r.   r   r7   r1     )r.   r.   r   r7   r$   r   )r   r$   r1   r   r   -   )r   r$   r1   rQ   c                 t    [         R                  " U [         R                  5      S-
  [        -  S S 2S S S 24   $ )Nr   )rf   asarrayrg   r   )r   s    r   _rgb_to_sh_dcr      s,    ZZRZZ(3.#5q$zBBr   c                 d    U [         R                  R                  U SSS9R                  S5      -  $ )Nr$   Tr   r   )rf   r   r   rl   )rA   s    r   
_norm_quatr      s+    ryy~~aa$~7<<UCCCr   datac           
      ^  ^ U R                  S5      nUS:  a  [        S5      eU S U R                  SS5      nU[        S5      -   nX0X3S-    S:X  a  SOS-  nS/ S	penUR	                  5        H  nUR                  5       nU(       d  M  US   S
:X  a  US   S:w  a  [        SUS    S35      eUS   S:X  a!  US   S:H  nU(       a  [        US   5      nMh  Mj  US   S:X  d  Mu  U(       d  M~  US   S:X  a  [        S5      eUR                  US   S[        US      -   45        M     [        R                  " U [        R                  " U5      XCS9mTR                  R                  n	U4S jn
Un[        R                  " U
" S5      U
" S5      U
" S5      /S5      nSU	;   aA  [        R                  " [        R                  " U
" S5      U
" S5      U
" S5      /S5      5      nO([        R                  " US4S[        R                   5      nSU	;   a=  [#        [        R                  " U
" S5      U
" S5      U
" S 5      U
" S!5      /S5      5      nO>[        R$                  " [        R&                  " / S"Q[        R                   5      US45      nS#U	;   a#  S$S$[        R                  " U
" S#5      * 5      -   -  O$[        R(                  " U[        R                   5      nS%U	;   a  [        R                  " U
" S%5      U
" S&5      U
" S'5      /S5      n[+        S( U	 5       S) S*9nU(       a  [        R                  " U Vs/ s H  nU
" U5      PM     snS5      nUR,                  S   S-  S-   nUR/                  USUS-
  5      R1                  SSS5      n[        R2                  " US S 2S S S 24   U/S5      nOtUS S 2S S S 24   nOgS+U	;   a9  [5        [        R                  " U
" S+5      U
" S,5      U
" S-5      /S5      S.-  5      nO([        R6                  " USS4[        R                   5      nXXU4$ s  snf )/Ns
   end_headerr   z-File3DToSplat: not a PLY (missing end_header)rb   replacer1   s   
r$   Fformatbinary_little_endianz'File3DToSplat: unsupported PLY format 'z' (need binary_little_endian)elementvertexpropertyrp   z;File3DToSplat: PLY vertex has list properties (unsupported)<countoffsetc                 H   > TU    R                  [        R                  5      $ N)re   rf   rg   )karrs    r   <lambda>%_parse_ply_gaussian.<locals>.<lambda>   s    #a&--

+r   r@   rL   rM   scale_0scale_1scale_2rQ   {Gz?rot_0rot_1rot_2rot_3)r$   r   r   r   rT   rH   f_dc_0f_dc_1f_dc_2c              3   T   #    U  H  oR                  S 5      (       d  M  Uv   M      g7f)rS   N)
startswith)r4   r   s     r   r5   &_parse_ply_gaussian.<locals>.<genexpr>   s     C%Q<<	+Bqq%s   (	(c                 <    [        U R                  S5      S   5      $ )N_rF   )r&   split)ss    r   r   r      s    SVWXW^W^_bWcdfWgShr   )keyredgreenbluer3   )findrh   decoder9   
splitlinesr  r&   append_PLY_DTYPESrf   
frombufferrY   namesr   expfullrg   r   tilearrayonessortedr)   rk   rj   rr   r   zeros)r   endr   bodyr   props	in_vertexlinepr  r   r{   rz   r   r   rT   dcrestr   rkkry   r   s                         @r   _parse_ply_gaussianr&     s   
))M
"C
QwHII$3Zw	2F]##Dd!8$/AQ6DU)E!!#JJLQ48!(> >FqtfLijkkQ49!(IAaD	 qTZIItv~ !^__LL!A$k!A$&7 789 $ --bhhuoU
HCIIOOE+AA
((AcFAcFAcF+Q
/CErxx9q|Qy\ JANOAbjj1%1W:qz1W:qz"RTUVWggbhh|RZZ81a&A5>%5GcS2661Y<-001RWWUVXZXbXbMcG5XXq{AhK8=qAC%CIhi-1!A$-q1Aq1$B		!QQ'11!Q:AAtQJ 3Q7BAtQJB	%288QuXqz1V9$EqIEQRXXq!Qi,sR'' .s   7P*c           
         [        U 5      S-  S:w  a  [        S5      e[        R                  " U [        R                  " / SQ5      5      nUS   R                  [        R                  5      S-  n[        US   R                  [        R                  5      S-
  S-  5      nUS	   R                  [        R                  5      US
   R                  [        R                  5      UUS S 2S4   R                  5       [        US S 2S S24   5      4$ )Nr   r   z8File3DToSplat: .splat size is not a multiple of 32 bytes))rz   r   rQ   )r   r   rQ   )r   r   r7   )quatr   r7   r   r3   r(  g      `@rz   r   rQ   )
r9   rh   rf   r  rY   re   rg   r   copyr   )r   r   r   r   s       r   _parse_splat_gaussianr*  
  s    
4y2~STT
--bhh (N O PCv;bjj)E1D
c&k((4u<E
FCJbjj)3w<+>+>rzz+JCAJOO}T!RaR%[9; ;r   c                 0	  ^' U S   S:w  a  [        SU S    SU S    35      e[        R                  " SU S5      S   n[        R                  " SU S5      S   nU[        ;  a  [        S	U 35      e[        U   u  p4pVpx/ m'S
US-  -   n	[	        U5       GH  n
S
U
S-  -   n[        R                  " SXS-   5      S   n[        R                  " SXS-   5      S   n[        R                  " SXS-   5      S   n[        R                  " SXS-   5      S   n[        R                  " SXS-   5      S   n[        R                  " SXS-   5      S   n[        R                  " SXS-   5      S   =(       d    Un[        R                  " SXS-   5      S   n[        R                  " SXS-   5      S   n[
        R                  [        R                  " SXS-   5      S   S5      nX4-   U-   U-   UU-  -   nUS-  nUU-  U-   nU	U-   nUS:  GaR  US:X  a  SOSu  nnSUS4SUS4SUS4S/nU(       a$  UR                  SUS:X  a  SO	US:X  a  SOSU45        [        R                  " U [        R                  " U5      UUS9nUS    R                  [        R                  5      S!-  n[        US   R                  [        R                  5      5      nUS   R                  [        R                  5      n US:X  a$  US   R                  [        R                  5      n!GO[        R                  " U SUS-  U	U-   S9R                  S"S5      n"[        R                  " U[        R                   5      n#UU-  n$[#        U$U5      n%[        R$                  " U%5      U-  U#S U%& UU$:  aN  [        R                  " U S#UU	S9n&[        R&                  " U[        R$                  " U5      -   U&5      S UU$-
   U#U$S & US   R                  [        R                  5      U-
  US$-  U-  -  U"U#   -   n!T'R                  U!U UUS S 2S4   R)                  5       [+        US S 2S S24   5      45        U	UU-  U-   -  n	GM     T'(       d  [        S%5      e[-        U'4S& j[	        S'5       5       5      $ )(Nr   z+File3DToSplat: unsupported .ksplat version .r$   r   r7   r   r   z1File3DToSplat: invalid .ksplat compression level r   r   r   r   z<fr2   r   r   r   r   )r   r   )z<u2<f2centerrQ   r   r   )colorr   r7   ry   r-  r   r   r   r/  r3   rF   z<u4       @z$File3DToSplat: .ksplat has no splatsc              3      >#    U  H.  n[         R                  " T Vs/ s H  o"U   PM	     sn5      v   M0     g s  snf 7fr   )rf   rr   )r4   r!   r!  partss      r   r5   )_parse_ksplat_gaussian.<locals>.<genexpr>N  s1     I1u 5u!1u 566 5s   >9
>   )rh   r   unpack_from_KSPLAT_COMPRESSIONrn   _KSPLAT_SH_COMPONENTSgetr  rf   r  rY   re   rg   r   rk   ro   int64rK   arangerepeatr)  r   r:   )(r   max_sectionslevelbcbsbrbcolbshcdefault_rangebaser	  socntsec_maxbucket_sizebucket_count
block_sizebucket_storescale_rangefull_bucketspartial_bucketssh_componentsbytes_per_splat
meta_bytesbuckets_store	data_basectftfieldsr   colfr   r   rz   bucketsidxfull_splatsnflengthsr2  s(                                          @r   _parse_ksplat_gaussianr]    s    Aw!|FtAwiqQUVWQXPYZ[[%%dD!4Q7LtT2.q1E''LUGTUU,?,F)BBdE,%%D< AH_  t!V4Q7$$T4a8;((t!V<Q?))$2g>qA''dG<Q?
))$2g>qA((t"W=a@QM))$2g>qA ,,T4bA!D-11&2D2DT4VXQX2YZ[2\^_`'B,-0DD$q(
$|3j@=(	7',z^~FBQ''2q)9E2q>K]^FteqjUQR
uX\_lmn--bhhv&6c)TCw<&&rzz2U:DSZ..rzz:;CL''

3Ez(m**2::6--e<!;KTX[eTefnnoqstuhhsBHH-*[8c*99R=K7CR$ mmD%W[\G(*		,?A[2[]d(efxgjmxgx(yC%8}++BJJ7+E*WZJZ]hJhilstwlxxLL#uc41:??+<mDQRTVUVTVQVK>XYZ')M99O !R ?@@IaIIIr   c           
         [         R                  " U 5      n[        R                  " SUS5      S   [        :w  a  [        S5      e[        R                  " SUS5      S   n[        R                  " SUS5      S   nUS   nSnUS:X  aO  [        R                  " US	US
-  US9R                  [        R                  5      R                  US
5      nXSS-  -  nOUS;   a  [        R                  " U[        R                  US-  US9R                  US
S
5      R                  [        R                  5      nUS   S-  US   S-  -  US   -  n[        R                  " US-  US-
  U5      nUSU-  -  R                  [        R                  5      nXSS-  -  nO[        SU 35      e[        R                  " U[        R                  X5S9R                  [        R                  5      S-  n	XS-  n[        R                  " U[        R                  US
-  US9R                  US
5      R                  [        R                  5      n
XSS
-  -  nU
S-  S-
  [        -  S-   n[        R                  " U[        R                  US
-  US9R                  US
5      R                  [        R                  5      nXSS
-  -  n[        R                  " US-  S-
  5      nUS
:X  Ga(  [        R                  " U[        R                  US-  US9R                  US5      R                  [        R                  5      nUS S 2S4   US S 2S4   S-  -  US S 2S4   S-  -  US S 2S
4   S-  -  nUS-	  S
-  n[        R                   " US4[        R                  5      nUR#                  5       [        R                   " U[        R$                  5      nnS H  nUU:g  nUS-  R                  [        R$                  5      nUS-	  S-  n[        R                  " UUS-	  U5      nS[&        R(                  " S5      -  US-  -  n[        R                  " US:H  U* U5      nUU   UUU4'   U[        R                  " UUU-  S 5      -  nM     [        R(                  " [        R*                  " SU-
  SS 5      5      U[        R,                  " U5      U4'   [/        [        R0                  " US S 2S
4   US S 2S4   US S 2S4   US S 2S4   /S5      5      nO[        R                  " U[        R                  US
-  US9R                  US
5      R                  [        R                  5      nUS!-  S-
  n[        R(                  " [        R*                  " SUS-  R3                  S5      -
  SS 5      5      n[/        [        R4                  " US S 2S 4   U/S5      5      nXmUU	[7        U5      4$ )"Nr   r   z'File3DToSplat: invalid .spz (bad magic)r7   r   r   r2   r$   r-  rQ   r   r.   )r1   rQ   r   .r1   .r$   .r   i   r=   z(File3DToSplat: unsupported .spz version r3   r   r   r   r1   r      )rQ   r1   r$   r   i  r   rH   r/   r   )r   
decompressr   r5  r   rh   rf   r  re   rg   rk   r   r9  r   r   r  r  r)  r   mathsqrtrl   r:  r   r   sumrr   r   )r   r   versionr{   	frac_bitsoffrz   bvr   cbr   sbr   qbcombinedlargestrA   	remainingsumsqcompactivevaluesignvalr   xqws                               r   _parse_spz_gaussianrz  Q  s   
//$
C$Q'*j8BCC  sA.q1G4a(+ABI
C!|mmCa!eC@GG

S[[\]_`a1u	F	MM#rxxq1uSAII!QPQRYYZ\ZbZbcvY"_6a01V9<HHQ\1y=!4AN#++BJJ71uCG9MNNMM#rxxq=DDRZZPSXXEHC	sBHHAE#	>	F	Fq!	L	S	STVT^T^	_Bq5LC:/
/#
5C	sBHHAE#	>	F	Fq!	L	S	STVT^T^	_Bq5LCFF29t#$E!|]]3AcBJJ1aPWWXZX`X`aad8r!Q$x1}-AqDR@Bq!tHPRNSr>Q&HHaVRZZ(#==?BHHQ

,C5	 DW_F&..rzz:ENa'Db)DI1%%%-8C((419sdC0C!&kAfdlORXXfcCi55E ! $&772773;4+H#I"))A,
 1QT7AadGQq!tWa1g"FJK]]3AcBJJ1aPWWXZXbXbc%Z#GGBGGC27--"22At<=1d7R(8!<=sE=#555r   )plysplatksplatspzc                     U S S S:X  a  gU S S S:X  a  g[        U 5      S:  a  U S   S:X  a
  U S   S:  a  g	[        U 5      S
-  S:X  a  g[        S5      e)NrQ   s   plyr{  r1   s   r~  r   r$   r}  r   r|  z=File3DToSplat: could not determine splat format from contents)r9   rh   )r   s    r   _detect_splat_formatr    se    BQx6BQx;
4yA~$q'Q,47a<
4y2~
T
UUr   c                   ^ [        X5      nU4S jnU" U R                  US U24   5      nU" U R                  US U2SS S 24   5      [        -  S-   R	                  SS5      nU" U R
                  US U24   5      R                  S5      nU" U R                  US U24   5      nU" U R                  US U24   5      n	XVXxU	4$ )Nc                 @   > U R                  T[        R                  S9$ )NdevicerY   )tor   rg   )r`   r  s    r   r    _gaussian_item.<locals>.<lambda>  s    144vU]]4;r   r   r   r$   rF   )	r*   r(   ry   r   clamprx   rk   rv   rw   )
r    r!   r  r  r  rz   r   rT   r   r   s
     `       r   _gaussian_itemr    s    
A/C	;B
Q[[DSD!
"Cadd1dsdAq=!"S(3.
5
5a
;CQW%&..r2Gqxx4C4 !E
Q[[DSD!
"CWS((r   c                    X R                  SSS9R                  S5      -  n U R                  S5      u  pp4[        R                  " SSX3-  XD-  -   -  -
  SX#-  X-  -
  -  SX$-  X-  -   -  SX#-  X-  -   -  SSX"-  XD-  -   -  -
  SX4-  X-  -
  -  SX$-  X-  -
  -  SX4-  X-  -   -  SSX"-  X3-  -   -  -
  /	SS9R                  SSS5      $ )	NrF   Tdimkeepdimr   r$   r1   r  rQ   )r   r   unbindr   r   rk   )rA   ry  r@   rL   rM   s        r   _quat_to_matr    s    	FFr4F(22599A"JA!;;	Aaeaem!4a1515=6I	QUQU]Qaeaem!44a1515=6I	QUQU]Q!%!%-0!a1515=6I2I 	 wr1a 	!r   c                    U R                  S5      u  p#pEUR                  S5      u  pgp[        R                  " X&-  X7-  -
  XH-  -
  XY-  -
  X'-  X6-  -   XI-  -   XX-  -
  X(-  X9-  -
  XF-  -   XW-  -   X)-  X8-  -   XG-  -
  XV-  -   /SS9$ )NrF   r  )r  r   r   )
r`   rj  awaxayazbwbxbybzs
             r   	_quat_mulr    s    XXb\NBBXXb\NBB;;
"'BG#bg-
"'BG#bg-
"'BG#bg-
"'BG#bg-	
  r   c                    [         R                  " [         R                  " XU/5      S-  5      [         R                  " [         R                  " XU/5      S-  5      pC[        R
                  " US   US   SS/[        R                  S9n[        R
                  " US   SUS   S/[        R                  S9n[        R
                  " US   SSUS   /[        R                  S9n[        [        Xv5      U5      $ )Nr0  r   r/   rX   r$   r1   )rf   cosradianssinr   tensorrg   r  )rxryrzr   r	  qxqyqzs           r   _euler_to_quatr    s    66"**bb\*S01266"**bb\:RUX:X3Yq	qtQqT3,EMM	BB	qtS!A$,EMM	BB	qtS#qt,EMM	BBYr&++r   c                    U S   U S   U S   p2nU S   U S   pTU S   U S   pvU S   U S	   p[         R                  " S
U-   U-   U-   S
U-   U-
  U-
  S
U-
  U-   U-
  S
U-
  U-
  U-   /S5      n
[         R                  " [         R                  " U
S   XE-
  Xg-
  X-
  /S5      [         R                  " XE-
  U
S   X-   Xg-   /S5      [         R                  " Xg-
  X-   U
S   XT-   /S5      [         R                  " X-
  Xg-   XT-   U
S   /S5      /S5      nU
R                  S5      n[         R                  " USUS   R	                  UR
                  S-   5      5      SSS S 24   nXR                  SSS9R                  S5      -  $ )N).r   r   ).r$   r$   ).r1   r1   ).r1   r$   ).r$   r1   ).r   r1   ).r1   r   ).r$   r   ).r   r$   r$   rF   ra  r`  r_  ).rQ   .NN)r$   r7   .r   Tr  r   )r   r   argmaxgatherexpandr)   r   r   )mm00m11m22m21m12m02m20m10m01q2candselrA   s                 r   _mat_to_quatr    s    iL!I,)cC|Qy\|Qy\|Qy\	a#gmc)1s7S=3+>#gmc)1s7S=3+>@AC
EB;;RZCIsyA2FSY6
CIsyA2FSY	2f:syA2FSY	39bjA2F	
 
D ))B-CT2s?3::399v;MNOPSUVXYPYZAvv"dv+55e<<<r   c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)SplatToFile3Di  c                     [         R                  " SS/ SQSS[         R                  R                  S5      [         R                  R                  S/ SQS	S
9/[         R
                  R                  SS9/S9$ )Nr  zCreate 3D File (from Splat))zgaussian to plyzsplat to filezexport gaussian3d/splatzlSerialize a gaussian splat to a File3D object for Save / Preview 3D nodes. Supports one item per batch only.r|  r   )r{  r}  r~  zply: standard 3D Gaussian Splat with full spherical harmonics. ksplat: mkkellogg SplatBuffer (level 0, uncompressed), base color only spz: Niantic gzip-compressed (~10x smaller), base color only optionstooltipmodel_3ddisplay_namenode_idr  search_aliasescategorydescriptioninputsoutputs)r   SchemaSplatInputComboFile3DSplatAnyOutputclss    r   define_schemaSplatToFile3D.define_schema  sw    yy#6R< w'x1I(g  ) &&--:-FG
 	
r   r"   c           
         UR                   R                  S   S:  a.  [        R                  " SUR                   R                  S   5        [	        US5      n[
        [        S.R                  U[        5      nU" UR                   SS U24   UR                  SS U24   UR                  SS U24   UR                  SS U24   UR                  SS U24   5      n[        R                  " [        R                   " [#        U5      US95      $ )Nr   r$   zDSplatToFile3D supports one item per batch only. Got %d; using first.)r}  r~  )file_format)r(   r)   loggingwarningr*   r   r   r8  r   rv   rw   rx   ry   r   
NodeOutputr   File3Dr   )r  r|  r   r  writerr   s         r   executeSplatToFile3D.execute  s    ??  #a'OObdidsdsdydyz{d|}q!2;NOSSTZ\opeooa#g.QW0Eooa#g.4C40H%((STVZWZVZSZJ[]}}U\\'$-VLMMr   r_   N)r{  
__name__
__module____qualname____firstlineno__classmethodr  r   r  r  __static_attributes__r_   r   r   r  r    s6    
 
& NR]] N Nr   r  c                   h    \ rS rSr\S 5       r\S\R                  S\R                  4S j5       r
Srg)File3DToSplati  c                 ~   [         R                  " SS/ SQSS[         R                  R                  [         R                  R                  S5      [         R
                  [         R                  [         R                  [         R                  [         R                  /SS9/[         R                  R                  S	S
9/S9$ )Nr  z	Get Splat)z
load splatzply to splatzimport splatzfile to splatr  zParse a splat File3D into a gaussian splat. Inverse of Create 3D File (from Splat). Supported format:  PLY, SPLAT, KSPLAT, SPZ. PLY carries full spherical harmonics, the other formats are base color only. Format is auto-detected from the file contents.r  zA gaussian splat 3D file)typesr  r|  r  r  )r   r  	MultiTyper  	File3DAnyr  	File3DPLYFile3DSPLATFile3DKSPLAT	File3DSPZr  r  r  s    r   r  File3DToSplat.define_schema  s    yy#$Zq ""LL&&z2,,bllBNNBOO]_]i]ij6 #  XX__'_:;
 	
r   r  r"   c           
         UR                  5       nUR                  =(       d    SR                  5       n[        R	                  U5      =(       d    [        [        U5         nU" U5      u  pVpxn	S n
[        R                  " U
" U5      S    U
" U5      S    U
" U5      S    U
" U5      R                  SSS5      U
" U	5      S    5      n[        R                  " U5      $ )Nr]   c                 r    [         R                  " [        R                  " U 5      5      R	                  5       $ r   )r   
from_numpyrf   ascontiguousarrayr   )r`   s    r   r   'File3DToSplat.execute.<locals>.<lambda>  s#    e&&r';';A'>?EEGr   r$   rF   )	get_bytesr   lower_GAUSSIAN_PARSERSr8  r  r   SPLATrk   r   r  )r  r  r   fmtparserrz   r   r   rT   ry   tr|  s               r   r  File3DToSplat.execute  s    !!#$"++-"&&s+\/@AUVZA[/\'-d|$C"GcF4LeHTNcF4LgJq"a(bE$K
 }}U##r   r_   N)r  r  r  r  r  r  r   r  r   r  r  r  r_   r   r   r  r    s>    
 
& $u|| $ $ $r   r  c                    [         R                  " U 5      [         R                  " U5      pC[         R                  " U5      [         R                  " U5      [         R                  " U5      [         R                  " U5      4u  pVpx[        R
                  " USU// SQU* SU//US9n	[        R
                  " / SQSXx* /SX//US9n
X-  $ )Nr   r   r$   r   r  r$   r   r   )rd  r  r  r  r   r  )yaw_deg	pitch_degr  rL   r!  cysycpspRyRxs              r   _view_matrix_tr	     s    << $,,y"9qXXa[$((1+txx{DHHQKGNBB	Ar{IQ|<V	LB	y1b#,B<V	LB7Nr   c                   ^ U R                  S0 5      U R                  S0 5      p2U4S jnU" U5      U" U5      peS nS nU R                  S5      n	U	(       a  [        R                  " [        U	R                  SS5      5      [        U	R                  S	S
5      5      [        U	R                  SS
5      5      [        U	R                  SS
5      5      /TS9n
[	        U
S    5      S   nU" U" US S 2S4   5      5      nU" U" US S 2S4   * 5      5      nU" U" US S 2S4   * 5      5      nXVXU4$ U" Xe-
  5      n[
        R                  " [
        R                  " [        US   5      * [        US   5      5      5      n[
        R                  " [
        R                  " [        S[        S[        US   5      5      5      5      5      n[        UUT5      nXVUS   US   US   4$ )Npositiontargetc           
         > [         R                  " [        U R                  SS5      5      [        U R                  SS5      5      * [        U R                  SS5      5      * /TS9$ Nr@   r/   rL   rM   r  r   r  r   r8  ddevs    r   r   _camera_basis.<locals>.<lambda>.  sR    %,,aeeCo 6quuS#9O8ORWXYX]X]^acfXgRhQhiruvr   c                 J    [         R                  " U S   U S   * U S   * /5      $ Nr   r$   r1   r   r   rk  s    r   r   r  0  s$    5;;!qteadU34r   c                 D    X R                  5       R                  S5      -  $ )NrI   )r   r   r  s    r   r   r  1  s    !ffh((..r   
quaternionry  rH   r@   r/   rL   rM   r  r   r$   r1   r   )r8  r   r  r   r  rd  degreesatan2asinmaxrK   r	  )camera_infor  r   tgtr  eyer  mvr{   rA   qwxyzRrightupfwdyawpitchWs    `                r   _camera_basisr*  (  s   
 z2."0MvAC&!C&	4B.A%AeAEE#sO4eAEE#sO6L#AEE#sO4eAEE#sO6LNVY[t%a("Qq!tW+r1QT7(|_AadG8oEs**
FL/C
,,tzz5Q=.%A-@
ACLL3tSeCFm-D#EFGEsE3'A!adAaD((r   c                    X-
  nX3R                  5       R                  S5      -  n[        R                  " / SQUS9nUR	                  U5      R                  5       S:  a  [        R                  " / SQUS9n[        R                  R                  XC5      nXUR                  5       R                  S5      -  n[        R                  R                  X55      n[        R                  " XVU/SS9n[        US    5      S   $ )	NrI   r/   rH   r/   r  +?)r/   r/   rH   r$   r  r   )
r   r   r   r  dotabsr   crossr   r  )r  r  r  rM   up0r@   rL   r#  s           r   _lookat_quat_wxyzr2  B  s    A	FFHt$$A
,,s
3CuuSz~~%ll?373"A	FFHt$$A1 AQ1I1%A$ ##r   rH   c           	      l   [         R                  " U [         R                  US9n[         R                  " U[         R                  US9n[        XxU5      n	U(       ar  [        R
                  " U5      n
[         R                  " [        R                  " U
S-  5      SS[        R                  " U
S-  5      /US9n[        U	S    US    5      S   n	S nU" U5      U" U5      [        U	S   5      [        U	S   5      [        U	S   5      [        U	S   5      S	.[        U5      [        U5      [        U5      S
.$ )NrY   r  r1   r/   r  r   c                 V    [        U S   5      [        U S   5      [        U S   5      S.$ Nr   r$   r1   )r@   rL   rM   r   r  s    r   r   %_lookat_camera_info.<locals>.<lambda>Y  #    %!+E!A$KeAaDkJr   r$   rQ   r@   rL   rM   ry  r  r  r  fov
cameraTypezoom)r   	as_tensorrg   r2  rd  r  r  r  r  r  r   str)r  r  r<  r  r>  camera_typerollr   r  rA   r`   r  rz   s                r   _lookat_camera_inforC  P  s    
//(%--
DC
//&c
BC#C(ALL\\488AE?Cdhhq1uoFsSagr$x(+
JCCCH %ad%!+E!A$KV[\]^_\`Vab:S-=uT{T Tr   c           	         [         R                  " U [         R                  US9nS U 5       u  pxp[         R                  " XX/[         R                  US9nXR	                  5       R                  S5      -  n[        US    5      S   nXlS S 2S4   -
  nS nU" U5      U" U5      [        US   5      [        US   5      [        US   5      [        US   5      S	.[        U5      [        U5      [        U5      S
.$ )Nr4  c              3   8   #    U  H  n[        U5      v   M     g 7fr   r7  )r4   r   s     r   r5   $_quat_camera_info.<locals>.<genexpr>b  s     2	1eAhh	s   rI   r   r1   c                 V    [        U S   5      [        U S   5      [        U S   5      S.$ r6  r7  r  s    r   r   #_quat_camera_info.<locals>.<lambda>g  r9  r   r$   rQ   r:  r;  )	r   r?  rg   r  r   r   r  r   r@  )r  	quat_xyzwr<  r  r>  rA  r   r  r  r  qwr"  r#  r  rz   s                  r   _quat_camera_inforK  _  s    
//(%--
DC2	2NBBLL"")sKEJJL**400EU4[!!$A
!Q$-C
JCCCH %eAheE!HoERWXYRZObghmnohpbqr:S-=uT{T Tr   c                    [         R                  " U 5      [         R                  " U5      pv[         R                  " U5      [         R                  " U5      [         R                  " U5      [         R                  " U5      4u  pp[        R
                  " U
* U	-  XU-  /US9nS n[        U" XBU-  -
  5      U" U5      X55      $ )Nr  c                 J    [         R                  " U S   U S   * U S   * /5      $ r  r  r  s    r   r   $_orbit_camera_info.<locals>.<lambda>s  s$    %++qtadUQqTE23r   )rd  r  r  r  r   r  rC  )r'  r(  distancer<  pivot_splatr  rL   r!  r  r  r  r  	fwd_splatr  s                 r   _orbit_camera_inforR  m  s     <<dll51qXXa[$((1+txx{DHHQKGNBBrcBhG4SAI3Aq)/C!CDanVY__r   c                   ^ [         R                  " U5      n[         R                  " U5      [         R                  " U5      pTU4S jnU" U R	                  S0 5      5      U" U R	                  S0 5      5      p[
        R                  " USU// SQU* SU//TS9n	XXx-
  -  -   n
U R	                  S5      =(       d    0 n[
        R                  " [        UR	                  SS	5      5      [        UR	                  S
S5      5      [        UR	                  SS5      5      [        UR	                  SS5      5      /TS9n[
        R                  " [         R                  " US-  5      S[         R                  " US-  5      S/TS9n[        US    US    5      S   nS n0 U EU" U
5      [        US   5      [        US   5      [        US   5      [        US   5      S.S.E$ )Nc           
         > [         R                  " [        U R                  SS5      5      [        U R                  SS5      5      [        U R                  SS5      5      /TS9$ r  r  r  s    r   r   (_orbit_camera_info_yaw.<locals>.<lambda>{  sL    %,,aeeCo 6aeeCo8NPUVWV[V[\_adVePfgpstr   r  r  r/   r,  r  r  ry  rH   r@   rL   rM   r1   r   c                 V    [        U S   5      [        U S   5      [        U S   5      S.$ r6  r7  )r  s    r   r   rU    r9  r   r$   rQ   r:  )r  r  )	rd  r  r  r  r8  r   r  r   r  )r  	angle_degr  r`   casark  r   r  r  new_posrA   qcurr  qnrz   s     `             r   _orbit_camera_info_yawr]  w  s   YAXXa[$((1+tAR011[__Xr5R3S	C}oS"~Fs	SB#)$$G%+A<<quuS#/quuS#1GquuS#/quuS#1GIQTVD	txxATXXa!e_cB3	OB	2d8T$Z	(	+B
JChk hs7| %be5A<eBqElY^_abc_dYefh hr   c           
      R   [        S[        [        SU-  5      5      5      n[        R                  " S[        R
                  " U* US-   U[        R                  S9U-  S-  -  5      nXDR                  5       -  nU R                  S   n[        R                  R                  R                  XR                  SSSS5      R                  USSS5      SU4US9n [        R                  R                  R                  XR                  SSSS5      R                  USSS5      US4US9n U $ )	Nr$   rQ         r  r1   rF   r   )paddinggroups)r  r&   r   r   r  r:  rg   rf  r)   nn
functionalconv2dviewr  )r@   sigmar  r$  r   r   s         r   _gauss_blurrg    s   As5U#$%A		$%,,r1q5EMMRUZZ_```aA	EEGA	
A""1ffQ1b&9&@&@Aq"&MXY[\W]fg"hA""1ffQ2q&9&@&@Ar1&MXY[\W]fg"hAHr   c                 #  ^^^^^^^^^^^^^^ [         R                  R                  5       mU4S jn[         R                  R                  5       [         R                  R	                  5       smmU" U 5      U" U5      R                  SS5      U" U5      R                  S5      p!n U" U5      [        U5      -  U" U5      pCTS:H  nU(       a  [        U5      nTT-  nU" U5      mU(       a  [        T5      OTnTS:H  nTS;   =(       d    US:  nUUUUUUU4S jnU R                  S   S:X  a  U" 5       $ [        U	T5      u  nnnnn[        R                  " UUU/S5      nU U-
  UR                  -  n[        U	R                  S	S5      =(       d    S5      =(       d    S
n[        U	R                  SS5      =(       d    S5      n[        U	R                  SS5      5      R!                  5       R#                  S5      mUR%                  S5      u  nnnUS:  mU4S jUUUXX44 5       u  nnnpp4UR                  S   S:X  a  U" 5       $ TS:X  a  [        R&                  " US5      n[)        TT5      S-  [*        R,                  " [*        R.                  " U5      S-  5      -  U-  mTS-  TS-  smmUS    [1        U5      -  n U UR3                  5       S S 2S S S 24   -  U R5                  SS5      -  n!U!U!R7                  SSS9R9                  S5      S-  S S 2S S 4   [        R:                  " STS9-  -   n![        R                  " UUU/S5      n"[        R<                  R?                  U!5      n#U#U"S S 2S S 2S 4   -  S S 2S S 2S4   n$U"U$-  RA                  S5      n%U#S S 2SS4   U#S S 2SS4   U#S S 2SS4   n(n'n&U#S S 2SS4   U#S S 2SS4   U#S S 2SS4   n+n*n)U$R%                  S5      u  n,n-n.U(       a`  U [        RB                  " U R                  S   TS9S S 2URE                  S5      4   n/U/[        RF                  " U/S S 2SS24   S:  SS5      -  n/[        RH                  " UR                  S   SSTS9n0T(       aS  T[        UU-
  RK                  5       RM                  S5      5      -  mTTU-  -   TTU-  -   n2n1TU0S S 2SS4'   TU0S S 2SS4'   OuSU-  n3TTU-  U3-  -   TTU-  U3-  -   n2n1TU3-  T* U-  U3R3                  5       -  sU0S S 2SS4'   U0S S 2SS4'   TU3-  T* U-  U3R3                  5       -  sU0S S 2SS4'   U0S S 2SS4'   U0U!-  U0R5                  SS5      -  n4U4S S 2SS4   U4S S 2SS4   U4S S 2SS4   n7n6n5U5U7-   S-  U5U7-
  S-  R3                  5       U6U6-  -   RM                  S5      RO                  5       -   n8SU8RM                  S5      RO                  5       -  n9[Q        [)        [S        S[)        TT5      S -  5      [S        S[*        RT                  " [W        U9S!5      RY                  5       5      5      5      5      n:S" V;s/ s H  n;U;U::  d  M  U;PM     sn;U:/-   n<[        RZ                  " U<T[        R\                  S#9n=/ n>U< Hv  n;[        RB                  " U;* U;S-   T[        R\                  S#9n?[        R^                  " U?U?S$S%9u  n@nAU>Ra                  UAR                  S5      U@R                  S5      45        Mx     [        Rb                  " U9S&-  U=5      Re                  [g        U<5      S-
  S'9nBUR                  S   nC[Q        [)        S([S        SUCS)-  5      5      5      nD[g        U<5      nE[        Rh                  " U5      nF[        Rj                  " SUCUDS-   TS9Rm                  5       Ro                  5       nG[        Rp                  " UC[        Rn                  TS*9nH[        RB                  " UCTS9UHUF'   [        Rr                  " UGUHS+S,9S-
  Re                  SUDS-
  5      nIUIUE-  UB-   nJ[        Rh                  " UJ5      nFUJUF   nJU1UF   Rm                  5       U2UF   Rm                  5       nLnKU&UF   U'UF   U(UF   n(n'n&U)UF   U*UF   U+UF   n+n*n)U'S-  U(S-  U*S-  nOnNnMU,UF   U-UF   U.UF   U%UF   4u  n,n-n.n%UUF   UUF   pU(       a  UWF   OS nPU(       a  W/WF   OS nQT(       a  UWF   UUF   UUF   4OS-u  nRnSnTWKWLU&U)U+WMWNWOU/	nU[        R                  " UUT(       a  U(U*WRWSWT/OU,U-U.U%/-   5      m[        Rt                  " [        RH                  " S[        Rn                  TS*9WJSS  UJS S :g  Rw                  5       Ry                  5       S-   /5      nVUJUV   nWUVR{                  5       WC/-   nXUWWE-  R{                  5       nY[        R|                  " UWUES.S/9R{                  5       nZ[        WD5       V[s/ s H  n[/ PM     n\n[[        [g        WY5      5       H)  n]W\WZU]      Ra                  WXU]   UXU]S-      WYU]   45        M+     UUUUUUUU4S0 jn^U
S:g  n_[        RH                  " US4TS9n`[        R                  " U4TS9na[        RH                  " U4TS9nb[        RH                  " U4TS9nc[        RH                  " US4TS9ndU_(       a  [        RH                  " U4TS9OS neU(       a  [        RH                  " U4TS9OS nfU(       a  [        RH                  " US4TS9OS ngU(       a  [        RH                  " U4TS9OS nhU(       a  [        RH                  " US4TS9OS niSnj[        WD5       GH^  n#W\U#   nkUk(       d  M  WbR                  5         WcR                  5         WdR                  5         W_(       a  WeR                  5         U(       a  WhR                  5         U(       a  WiR                  5         Wk GH  u  nlnmnnU>Un   u  nonp[S        S1S2UoR                  S   -  5      nq[        UlUmUq5       GH  nr[)        UrWq-   Wm5      nsW^" UrUsWoWp5      u  ntnuUtR                  S5      UuR                  S5      nvntWbR                  SUtUv5        WcR                  SUt[        R                  " Uu* 5      * R                  S5      5        W_(       a  WuR                  U
5      OWunwWdR                  SWtUwS S 2S S 2S 4   UWrWs2S S S 24   -  R                  SS5      5        W_(       a"  WeR                  SWtWwR                  S5      5        U(       a,  WhR                  SWtWuWPWrWs2S 4   -  R                  S5      5        U(       d  GMH  WiR                  SWtWuS S 2S S 2S 4   WQWrWs2S S S 24   -  R                  SS5      5        GM     GM     S[        R                  " Wc* 5      -
  nxWaUx-  nyW_(       a  WeOWbnzW`R                  WyS S 2S 4   WdUzRM                  S5      S S 2S 4   -  5        U(       d  U(       aW  WbRM                  S5      n{U(       a  WfR                  WyWhW{-  5        U(       a#  WgR                  WyS S 2S 4   WiW{S S 2S 4   -  5        WaR                  SWx-
  5        U#S3-  S4:X  d  GM/  [        WyRS                  5       5      S:  a  WjS-  njUjS:  a    O
GM\  SnjGMa     SWa-
  n|U|R                  TT5      n}TS5;   a  W}S:  OS n~U(       a$  WfW|RM                  S5      -  R                  TT5      OS nS nU(       a  WgR                  TTS5      R                  SSS5      S    nW|R                  SSTT5      n[        US6T5      [        US6T5      nnUURM                  S5      -  S   R                  SSS5      nUURK                  SS+S79RM                  S5      -  nTS:X  a  [        RH                  " TTTS9n[        W~R                  5       5      (       af  WW~   R)                  5       UU~   RS                  5       nsnr[        RF                  " U~UsU-
  UsUr-
  RM                  S5      -  R                  SS5      W5      nWS S 2S S 2S 4   R                  TTS5      nGO3TS8:X  a3  WU" / S9Q5      -  S-  S-   R                  SS5      nUW~S S 2S S 2S 4   -  nOW`R                  TTS5      nTS:X  a`  U" / S:Q5      nUURK                  5       -  nSWU-  RA                  S5      -  S-   R                  SS5      nWS;S<U-  U-  -   S S 2S S 2S 4   -  nOLUS:  aF  [        U5      nWS S 2S S 2S4   * R                  SS5      nWSS=U-  -
  S=U-  U-  -   S S 2S S 2S 4   -  nWR                  WaR                  TTS5      U5      nU(       a  [        W5      nWR                  SS5      R                  TT5      W}R                  SS5      R                  TT5      4$ s  sn;f s  sn[f )>Nc                 L   > [         R                  " U [         R                  TS9$ )Nr4  )r   r?  rg   )r`   r  s    r   r   "_render_gaussian.<locals>.<lambda>  s    %//!5==Er   r   r$   rF   r/  depth)normalclayc                     > TS:X  a  TR                  TTS5      O[        R                  " TTSTS9n U R                  TT5      [        R                  " TTTTS94$ )Nr/  rQ   r  r  )r  r   r  r  )imgbg_tr  heightidevidtyperender_stylewidths    r   background_only)_render_gaussian.<locals>.background_only  sW    /;w/Fdkk&%+EKKX^`eghqtLuvvdF#U[[tSY%ZZZr   r<       A@r>  rH   r=  r]   orthor   c              3   ,   >#    U  H	  oT   v   M     g 7fr   r_   )r4   r`   keeps     r   r5   #_render_gaussian.<locals>.<genexpr>  s     +d=cdG=cs   rm  g      ?r1   r  )dim1dim2MbP?rQ   r  r   rG   r         @rI   r   r2   gףp=
?)r2   @      r  ijindexinggUUUUUU?)r  r    r4  T)r$  NNNfloor)rounding_modec           	      h  > T-S S 2X2S 4   R                  S5      nUS S u	  pVpxppnXRS S S 24   -   nXcS S S 24   -   nUS:  UT/:  -  US:  -  UT+:  -  nT,(       a  USS  u  nnnnnUT(-
  T.-  U-
  nUT)-
  T.-  U-
  nU* nU	U-  n[        R                  " UU-  UU5      R                  U
U5      n[        R                  " UU-  UU5      R                  U[        R                  " UU-  UU5      5      n[        R                  " UUU5      R                  UU5      n[        R                  " UUU-  U	R                  S5      SS9R                  S5      nOUSS  u  nnn n!UT(-
  T*-  UT)-
  T*-  n#n"[        R                  " U	U"[        R                  " XU"5      5      n$U$R                  U#[        R                  " XU#5      5      n$U$R                  U
U"-  U#5      n$[        R                  " U U"U5      R                  U#U5      n%[        R                  " U!U%U%-  U$R                  S5      SS9R                  S5      nU[        R                  " SU-  5      -  U-  R                  SS5      n&UR                  5       R                  ST+S-
  5      T/-  UR                  5       R                  ST/S-
  5      -   n'U'U&4$ )	Nr   r   r   rF   )ru  r_  r-  r$   )r  r   addcmuladdcmul_addcdivr   
clamp_min_r  clamp_longr  )0lohioxoycolscxr_cyr_a00a11a22b01b02b12opapxpyvalidc02c12mxmymzr  r  r  a22rzinxrSrdsrrA   su0su1su2musdxdydsiddsimur   rY  cx0cy0r}   rq  is_orthopstackr	  ru  s0                                           r   r|  _render_gaussian.<locals>.splat  s   an%,,Q/8<Ra5Cc#tQwKtQwKqR%Z(B!G4VD#'8 Cb"bs(a"$Bs(a"$BB"HE--b#r2;;CDC--
B4==b%--PSVXPXZ]_aBbcC--sB/88bACc39cmmE.B"MXXYZ[A!%abCc33h!^b3h!^B==b%--"*EFD==U]]3R%@AD==r2.DMM#r3/88SAEc55=$..2GrR]]^_`Auyy**U2::1eDggiooa!,u4rwwyq%RS)7TTEzr      i r      )rk  rl  g333333?r  rl  rH   r   r   )gٿgffffffg333333gffffff?g?g333333?)Ocomfymodel_managementget_torch_deviceintermediate_deviceintermediate_dtyper  rk   r   r   r)   r*  r   r   Tr8  r@  r  r  r  	full_likerK   rd  tanr  r  squarerj   diagonalmeanr   r   invrf  r:  argminr   r  r   r   re  r&   r  ceilrC   r'   r  rg   meshgridr  	bucketizer  r9   argsortlinspacer   r  ro   searchsortedcatnonzeroflattentolistdivrn   r  zero_
index_add_log1ppowr  r  mul_permuterg  boolanyr  r   r  )rz   r   rT   r   r   ru  rq  splat_scalebgr  sharpenheadlight_shadingrt  r  	do_linearflatbg_comp
need_depthneed_normalrv  r   r  r$  r%  r&  r)  camr<  r>  xcyczcMwcam_covmusisimumusimus00s01s02s11s12s22simu0simu1simu2nrmjmcxr  invzcov2r`   rj  r   max_eigradiusKLlevelslevels_tgridsrnggygxblevelr{   nsnlorderboundsrankslab_idr
  cxrcyrs01bs02bs12bzc_onrm_omux_omuy_omuz_ocommonstartsksrun_lorun_levrun_slabr  	slab_runsr$  r|  sharpcacctransa_buftau_bufcrgbwbufdaccnacczslabnslabstalerunsr_lor_hilir  r  chr  r  rY  r   afapwslab_afrontdenomainvcovcovgcovm	depth_mapnrm_mapnbrl  rl  r  ro  encklhlr   ndotlrp  r  r  r  r}   rr  rs  r  r{  r  r	  s        ``     `                                                                                                                              @@@@@@@@@@@r   _render_gaussianr?    s   
 
 
 
1
1
3CEA))==?AWAWAjAjAlLD&##Q 2AgJ4F4Fr4JgC5E+..#3'Ic"6>DR5D'0od#dG(J"44M8IA8MK[ [ yy|q  "/S"ACCUB$a(A9
C
q).Q
/
74C-45D;??<45;;=HHQHBJBB9D+db"b#X]=c+d(BBe	xx{a  vooc4(	UF	a	488DLL,=,A#BBTIAqy&1*HC 
4<$	$BELLN1dA:..",,q!2DDG))r);@@DtKQPTVZ][^c^g^ghiru^vvvG 
b"b\2	&B			'	"BAq$JAq)D4i__R Fq!QwKAq!GbAqkcCq!QwKAq!GbAqkcC++b/E5%bhhqk#65<<;KKLEKKAqsFas;; 
RXXa[!Qs	3Bv|))+55d;<<q2vsQV|B1a71a7Rxq2v}$cAFTM&9B#$t8aR"Wt{{}-D 1a7R1a[#$t8aR"Wt{{}-D 1a7R1a[<",,q!,,D1a7mT!Q']DAqM!qA1umQ#557!a%?JJ1MRRTTG7$$T*//11FCBE6*b013q$))IfV[D\DaDaDc:d3efgA '0A!a%a0A36F||F3emmDHEllA2q1uSFS48Bbjjnbjjn56  __Vy18<CCFVWCXF
A	Sc!Q$Y'(	)B	VBMM"E^^Aq"q&5;;=BBDF;;q

37D,,q-DK!!&$d;a?GG2PQ6RG
B,
CMM#E
e*C%y "U)//"3CJE
CJcCJE
CJcCQwaq$D"',eeElFSXM"YE5%5>3u:S"2e9D%CJ4E?G2e9biE;M_E5% 3S#tT4AF[[hCeUE#BUZ\achjpTqrsF YYAUZZDs12wRUVYWYRZGZFcFcFeFmFmForsFstuF	VB]]_s"FBw GyyRw7>>@H"2Y'YYI'3w< (1+%%vay&Q-&LM ! < sNE;;ay-DJJws+EKK,Ekk4'#.G;;ay-D/45;;ws+$D/95;;ws+tD1<5;;ay-$D0:EKK,E2=EKKq	#.4EEBi}

JJLKKMKKM"ND$2YFBT:!45BD$+b$'"2r2r2
U++b/5==+<R  C,""1cU[[%-@,@+I+I"+MN,1eii(u3Q4Z3r"udA~;N)N(W(WXZ\](^_OOAsCKKO<$$Qed2b5$;6G.G-P-PQS-TU;$$QeAq$J.?%2tUVBW.W-`-`acef-gh , #" UYYx((5eAtGndU__T-B1d7-K&KL??4(DeUT\2eAtGned1d7m.CD

1v:6Q;UYY[!D(
A:  _ b e)C;;vu%D%)<<4#:$DGQd++44VUCW[IG\\&%+33Aq!<TB[[Avu-Rc*KC,EBr||D))1-55aA>6;;2t;<FFtLLwKKc2
t_((*IdO,?,?,ABDBNrBw6I6I$6O#O"V"VWXZ["\^_`A1d
m""65!4		!,--3c9@@AFDAt$$ll65!,6!%&BbggiB2**2..4;;AqABr	B.1d
;;C"'(AaAg&&--a3ES1WsQw61d
CCCll5==:GD!#&C99Q?dF+TZZ1-=-@-@v-NNNY 1R (s   
AG3AG3&AG8c                   V    \ rS rSr\S 5       r\ SS\R                  4S jj5       rSr	g)RenderSplati  c                    [         R                  " SS/ SQSS[         R                  R                  S5      [         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                  S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*QS+S,9[         R                  R                  S-S.S/9[         R                  R                  S0SS1S29[         R                  R                  S3SS4S29/[         R                  R                  S5S69[         R                  R                  S7S69/S89$ )9NrA  zRender Splat)zsplat to imagezrender splatzgaussian turntabler  ab  Render a gaussian splat as an image with an anisotropic EWA rasterizer (oriented elliptical splats, antialiased, depth-sorted front-to-back). The camera comes from a camera_info input (Load / Preview 3D, or a Create Camera Info node); leave it empty to auto-frame the splat. Set frames greater than 1 for a turntable batch of images to feed a Video node.r|  ru  r   r  r  r   defaultrK   r  steprq  framesr$   i   z-1, 0, 1 = single still image; >1 = turntable, the camera orbits over a full 360 turn (works with any camera_info). Negative value orbits the other way.rD  rK   r  r  r  rH   g?g      @g?TzhMultiplier on each splat's projected footprint (lower = crisper points, higher = softer/fuller surface).rD  rK   r  rE  advancedr  r  r0         @r   zSharpen overlapping splats: 1.0 = physically-correct blend; higher biases each pixel toward its dominant (nearest) splat for crisper texture, without shrinking splats or opening gaps. Non-physical above 1.rD  rK   r  rE  r  r  r/   r  zDiffuse shading from a light at the camera (headlight), using the splat surfel normals: darkens surfaces that turn away from view to reveal form/curvature. 0 = flat albedo, 1 = strongest shading.opacity_thresholdr   z@Cull gaussians with opacity below this (removes faint floaters).rt  )r/  rm  rk  rl  zrWhat the image output shows: color, clay (neutral-albedo shaded), depth (near=bright), normal (OpenGL normal map).r  
backgroundz#000000)rD  bg_imagezOptional background plate composited behind the splat (overrides the solid background colour). Resized to the render size; a batch is used per frame, a single image for all. color/clay only.)optionalr  r  zCamera to render from - a Load3D / Preview3D camera or a Create Camera Info node. If empty, the splat is auto-framed from a default 3/4 view.imager  maskr  )r   r  r  r  IntFloatr  ColorImageLoad3DCamerar  Maskr  s    r   r  RenderSplat.define_schema  s   yy!'S@
 w'Wd1MXtANXqd&s  t }csRVae(J  K y#3Cc(a  b 2CScX\gk(Q  R 2CScX\gk'i  k~7[(Z  [ |Y?zD(R  S %%md/w & x9@ XX__'_:BGGNNX^N<_`S*
 *	
r   Nr"   c                 8   [        U	5      nS nUb]  USS S24   R                  SS5      n[        R                  R	                  XUSS5      nUR                  SS5      R                  SS5      n[        [        U5      5      =(       d    SnUS:  a  SOS	n/ / nn[        R                  R                  5       nUR                  R                  S   U-  nUS:  a  [        R                  R                  U5      OS nSn[        UR                  R                  S   5       GH  n[        UUU5      u  nnnnnUS:  a!  UU:  nUU   UU   UU   UU   UU   4u  nnnnnUnUc  UR                  S   (       a  UR                  S5      O[         R"                  " SUS
9n UR                  S   (       a+  [%        UU -
  R'                  SS9S5      R)                  S5      O[         R*                  " S	US
9n![-        U![.        R0                  " [.        R2                  " S5      S-  5      S-  -  5      n"[5        SSU"SU U5      n[        U5       H  n#US:X  a  UO[7        UUS-  U#-  U-  U5      n$Ub  UUUR                  S   -     OUn%[9        UUUUUX#UU%U$XgU
S9u  n&n'UR;                  U&5        UR;                  U'5        US-  nUc  M}  UR=                  S5        M     GM     [>        R@                  " [         RB                  " U5      [         RB                  " U5      5      $ )N.rQ   rF   r$   bicubicdisabledr   r   rH   r  r  gGz?-C6?rx  r1   g?      >@     v@)r  r  rt  )"r;   movedimr  utilscommon_upscaler  r/  r&   r  r  r(   r)   ProgressBarrn   r  r  r   r  rC   r   r   r  r   rd  r  r  rR  r]  r?  r  updater   r  r   )(r  r|  ru  rq  rF  r  r  r  rM  rN  rt  r  rO  r  bg_imgsbin_frames	orbit_dirimgsmasksr  totalpbarr   r!   rz   r   rT   r   r   r{  base_camr.  extentdistfrcam_frbg_kro  rR  s(                                           r   r  RenderSplat.execute  s    $#(#++B2B++Bvy*UBjjB'--a3Gs6{#(q"QJDC	"e''88:%%a(8316u{{&&u-u,,Q/0A,:5!V,L)Cguc 1$"3303D	3t9gdmUZ[_U`befjbk0k-S'5#"H(+		!!%++aPV:WZ]ZcZcdeZf)S6\$7$7B$7$?FPPQUV$||C? VtxxT0BQ0F'G#'MNO-dD$ffUHo&.!m(5h	E@QTV@VYa@acij 8?8Kwq7==#334QS,S#wsE[fhlnt5<:FH	T C T"Q#KKN & 10 }}U[[.E0BCCr   r_   )NNr  r_   r   r   rA  rA    s=    +
 +
Z X\'Dacanan'D 'Dr   rA  c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)CreateCameraInfoi  c                 ~   [         R                  " SS/ SQSS[         R                  R                  S[         R                  R	                  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/5      [         R                  R	                  S[         R
                  R                  S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/5      [         R                  R	                  S[         R
                  R                  S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                  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                  S%SS!SS"S&S9/5      /S'S(9[         R
                  R                  S)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                  S0S S1S2SS3S9[         R
                  R                  S4S	SS5SS6S9[         R
                  R                  S7SSS8SS9S9[         R                  R                  S:S;S</S=S(9/[         R                  R                  S>S?9/S@9$ )ANru  zCreate Camera Info)zcamera positionzmake camera infozorbit camerazlook at camera3dzBuild a camera_infoMode 'orbit' aims with yaw/pitch/distance around the target; 'look_at' places the camera at world position. Coordinates are the viewer's world space (right-handed,Y-up).modeorbitr'  rx       vr_  rH   rC  r(  r^  g     @Vg     @V@rO        @r   g     @@z Camera distance from the target.rL  look_at
position_xg     @z4Camera position in world space (right-handed, Y-up).
position_y
position_zr  quat_xr/   r   r  quat_yquat_zquat_wzUCamera world-rotation quaternion (three.js: looks down local -Z). Normalized for you.zYHow to define the camera: orbit angles, an explicit position, or a position + quaternion.r  target_xTzLook-at point (orbit pivot / aim). In orbit mode, move it to pan/translate the whole camera. Ignored in quaternion mode. Defaults to the origin.rI  target_y)rD  rK   r  rE  rJ  target_zrB  g     fg     f@z)Camera roll about the view axis, degrees.r<  g      ^@z"Vertical field of view in degrees.r>        Y@zNDigital zoom (focal-length multiplier). >1 zooms in without moving the camera.rA  perspectiveorthographiczYProjection used by Render Splat: perspective (foreshortening) or orthographic (parallel).r  r  r  )	r   r  DynamicCombor  OptionrT  r  rW  r  r  s    r   r  CreateCameraInfo.define_schema  sB   yy&-dG %%fOO**7udEX[\w%TX[\z3Df[_/Q ' S5  OO**9|SgSY`d/e ' g|SgSY`de|SgSY`de	7  OO**<|SgSY`d/e ' g|SgSY`de|SgSY`dex$CV[\x$CV[\x$CV[\x$CV[ 0G ' H
: 
70 w1 & x2 z3GVZei(k  l z3GVZeijz3GVZeijvsEPS'R  TudS'K  Mvs%d'w  y}}n6U (C  DK'P __+++GHa1
 1	
r   r"   c	                    [         R                  R                  5       n	US   n
U
S:X  a?  US   US   US   /nUS   US   US   US	   /n[        R                  " [        XXiXxS
95      $ X#U/nU
S:X  a  [        R                  " US   5      [        R                  " US   5      p[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      4u  nnnnUS   nUUU-  U-  -   UUU-  -   UUU-  U-  -   /nOUS   US   US   /n[        R                  " [        XXiXxUS95      $ )Nrx  r  r}  r~  r  r  r  r  r  )r>  rA  ry  r'  r(  rO  )r>  rA  rB  )r  r  r  r   r  rK  rd  r  r  r  rC  )r  rx  r  r  r  rB  r<  r>  rA  r  kindr  r(  r  rL   r!  r  r  r  r  r  s                        r   r  CreateCameraInfo.execute&  sU   $$557F|<\*D,>\@RSHNDNDNDNSD==!283RV!pqqh/7?<<U,dll4=.Iq!XXa[$((1+txx{DHHQKONBBZ A 1r6B;.1r60A8aRTfWYkCYZH\*D,>\@RSH}}03RVvz{||r   r_   NrH   r  r  r_   r   r   ru  ru    s:    2
 2
h }lnlyly } }r   ru  c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)TransformSplati9  c                    [         R                  " SS/ SQSS[         R                  R                  S5      [         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                  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                  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                  SS9/S9$ )Nr  zTransform Splat)z
move splatzrotate splatzscale splatzgaussian transformr  zvTranslate, rotate, and scale a gaussian splat. Non-uniform scale also reshapes every individual splat, slower process.r|  translate_xr/   g      Yr  r   rC  translate_ytranslate_zrotate_xrz  r_  rH   rotate_yrotate_zscale_xscale_yscale_zr  r  )r   r  r  r  rT  r  r  s    r   r  TransformSplat.define_schema:  sF   yy$*^b w'}cv5W[\}cv5W[\}cv5W[\z3FTWXz3FTWXz3FTWXy#4UQUVy#4UQUVy#4UQUV XX__'_:;'
 	
r   r"   c                 X   UR                   nUR                  UR                  p[        XVU5      R	                  XS9n[        US    5      S   n[        R                  " XU
/XS9nUS S 2S 4   U-  n[        R                  " X#U/XS9nUUR                  -  U-   nXs=:X  a  U
:X  ae  O  ObUR                  U-  n[        UR                  UR                  5      UR                  5      nUUR                  SSS9R                  S5      -  nGOS[        UR                  R                  SS5      5      nUR                  R                  SS	5      R!                  5       nUUS S 2S S S 24   -  UR#                  SS
5      -  nUU-  UR                  -  n[        R$                  R'                  U5      u  nnU[        R(                  " [        R$                  R+                  U5      S:  SS5      S   -  nUR                  S5      R-                  5       R                  UR                  R.                  5      n[1        U5      R                  UR                  R.                  5      n[2        R4                  " UUUUR6                  UR8                  [;        USS 5      S9n[<        R>                  " U5      $ )Nr  r   r4  rF   Tr  r   r7   rQ   r  r   rH   r  r%   r%   ) r(   r  rY   r  r  r  r   r  r  rv   r  	expand_asrw   r   r   rk   r  rj   r   eighr   detre  r)   r  r   r  rx   ry   getattrr   r  )r  r|  r  r  r  r  r  r  r  r  r  r   r  dtq_rotr#  DAr  r(   rv   rw   rgs2r5  lamVouts                               r   r  TransformSplat.executeR  s+    oo**ciiRx8<??s?Ut%a(LL'G4BKagJNLL+K@W!##IM	((\\G+F!%//%//"BEOOTI!INNr4N$H$R$RSX$YYIeoo55b!<=B%%b!,335B1dA:&",,r2*>>Cc'ACC-C\\&&s+FCEKK 0 0 3a 7sCOTTA]]1%**,44U\\5G5GHF$Q//0E0EFIkk)VY$+E8T$BD}}S!!r   r_   Nr  r_   r   r   r  r  9  s4    
 
. "LNMM" "r   r  c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)GetSplatCountip  c                    [         R                  " SS/ SQSS[         R                  R                  S5      /[         R                  R	                  SS9[         R
                  R	                  SS9/[         R                  R                  /S	9$ )
Nr  zGet Splat Count)zsplat countzgaussian countznumber of splatsz
splat infor  z5Returns the number of splats summed across the batch.r|  r  r   )r  r  r  r  r  r  r  hidden)r   r  r  r  r  rS  Hidden	unique_idr  s    r   r  GetSplatCount.define_schemaq  sp    yy#*^OHHNN7+,XX__'_:VV]]]8 II''(
 	
r   r"   c                 B  ^ [        U4S j[        TR                  R                  S   5       5       5      nU R                  R
                  (       a8  [        R                  R                  US S3U R                  R
                  5        [        R                  " TU5      $ )Nc              3   <   >#    U  H  n[        TU5      v   M     g 7fr   )r*   )r4   r!   r|  s     r   r5   (GetSplatCount.execute.<locals>.<genexpr>  s     Q1PAIeQ''1Ps   r   ,z splats)rf  rn   r(   r)   r  r  r   instancesend_progress_textr   r  )r  r|  r   s    ` r   r  GetSplatCount.execute  sn    Qu7L7LQ7O1PQQ::!!44ay5H#**J^J^_}}UE**r   r_   Nr  r_   r   r   r  r  p  s3    
 
 +r}} + +r   r  c                     U S   R                   SS  nU S   R                  [        U 5      U/UQ75      n[        U 5       H  u  pEXSUS UR                   S   24'   M     U$ Nr   r$   )r)   	new_zerosr9   	enumerate)itemsr{   tailr  r!   r  s         r   
_pad_stackr    sf    8>>!"D
(

c%j!3d3
4C% A{
{N !Jr   	gaussiansc                    U  Vs/ s H	  oc  M  UPM     nnU(       d  [        S5      eUS   R                  R                  S   nU HI  nUR                  R                  S   U:w  d  M"  [        SU SUR                  R                  S    S35      e   [        S U 5       5      n/ / / / / / 4u  pVpxp[	        U5       GH  n/ / / / / 4u  ppnU GH   n[        X5      nUR                  UR                  US U24   5        UR                  UR                  US U24   5        UR                  UR                  US U24   5        UR                  UR                  US U24   5        UR                  US U24   nUR                  S   U:  aR  [        R                  " UUR                  UR                  S   UUR                  S   -
  UR                  S   5      /SS	9nUR                  U5        GM#     UR                  [        R                  " U5      5        UR                  [        R                  " U5      5        UR                  [        R                  " U5      5        UR                  [        R                  " U5      5        U	R                  [        R                  " U5      5        U
R                  US
   R                  S   5        GM     [        U
5      nS n[        [        U
5      5      S:  a:  [        R                   " XS   R                  R"                  [        R$                  S9n[&        R(                  " [+        UU5      [+        UU5      [+        UU5      [+        UU5      [+        U	U5      US9$ s  snf )Nz!MergeSplat: no gaussians to merger   z!MergeSplat: batch size mismatch (z vs z).c              3   R   #    U  H  oR                   R                  S    v   M     g7f)r1   N)ry   r)   )r4   r    s     r   r5   #_merge_gaussians.<locals>.<genexpr>  s     *r!

1rs   %'r$   r1   r  rF   r  r  )rh   r(   r)   r  rn   r*   r  rv   rw   rx   ry   r   r  r  r9   setr  r  r9  r   r  r  )r  r    gsrj  max_kpos_bscl_brot_bop_bsh_br\  r!   pos_iscl_irot_iop_ish_ir  ry   r{   r%   s                        r   _merge_gaussiansr    s   	0Y!YB	0<==
1a A;;Q1$@4HYHYZ[H\G]]_`aa  *r**E/12r2r2/E,E%t1X*,b"b"*<'e4AA/CLLQW-.LL!TcT'*+LLQW-.KKAttG,-a#gBxx{U"YYBLL!ebhhqk>QSUS[S[\]S^$_`fghKKO  	UYYu%&UYYu%&UYYu%&EIIdO$EIIdO$uRyq)*# & 	GAF
3w<1geoo.D.DEKKX;;z%+Zq-A:eUVCW$T1-z$/B6S SC 
1s
   M<M<c                   |    \ rS rSr\S 5       r\S\R                  R                  S\R                  4S j5       r
Srg)
MergeSplati  c                 &   [         R                  R                  [         R                  R	                  S5      SSSS9n[         R
                  " SS/ SQSS	[         R                  R	                  S
US9/[         R                  R                  SS9/S9$ )Nr|  r1   r   )prefixrK   r  r  zMerge Splats)zunion splatzdensify gaussianzcombine splatzmerge gaussianr  zConcatenate any number of gaussian splats into one. Unioning several decodes of the same latent at different seeds densifies the surface, this can improve surface quality when meshing.splats)templater  r  )r   AutogrowTemplatePrefixr  r  r  r  )r  r  s     r   r  MergeSplat.define_schema  s     ++BHHNN7,CGYZ`b+cyy 'azKK%%h%@AXX__'_:;	
 		
r   r  r"   c                     UR                  5        Vs/ s H	  o"c  M  UPM     nnU(       d  [        S5      e[        R                  " [	        U5      5      $ s  snf )Nz'MergeSplat: connect at least one splat.)valuesrh   r   r  r  )r  r  rk  r  s       r   r  MergeSplat.execute  sE    :Aa:FGG}}-b122 ;s
   AAr_   N)r  r  r  r  r  r  r   r  Typer  r  r  r_   r   r   r  r    sD    
 
 3R[[-- 3"-- 3 3r   r  c                    XR                  SSS9R                  S5      -  nUR                  S5      u  p4pV[        R                  " SSXU-  Xf-  -   -  -
  SXE-  X6-  -
  -  SXF-  X5-  -   -  SXE-  X6-  -   -  SSXD-  Xf-  -   -  -
  SXV-  X4-  -
  -  SXF-  X5-  -
  -  SXV-  X4-  -   -  SSXD-  XU-  -   -  -
  /	SS9R                  SSS5      nS	U R                  S
5      S-  -  n[        R                  " SXxU5      $ )Nr$   Tr  r   rF   r1   r  rQ   rH   rI   znij,nj,nkj->nik)r   r   r  r   r   rk   einsum)	r   r(  rA   ry  r@   rL   rM   r#  inv_s2s	            r   _inverse_covariancer    s%   yyQy-77>>A"JA!	Aaeaem!4a1515=6I	QUQU]Qaeaem!44a1515=6I	QUQU]Q!%!%-0!a1515=6I2I 		 gb!Q	 
 5??4(A--F<<)1a88r   c                 	   SUR                  5       -  nU R                  S5      U-
  nU R                  S5      U-   nX-
  R                  5       U-  R	                  S5      n[
        R                  " X-
  U-  5      R                  5       S-   R                  5       u  nnn[        X#5      n[
        R                  " SUR                  S5      -  U-  5      R                  5       R                  S[        U5      5      nUS:g  n[
        R                  " UU-  U-  US9n[
        R                  " UU-  U-  S	X{S
9nU(       a  [
        R                  " UU-  U-  X{S
9OS nU R                  S   Snn[        S[        U5      S-   5       GH  nUU:H  R                  SS9S   nUR!                  5       S:X  a  M/  [
        R"                  " U* US-   U[
        R$                  S
9n[
        R&                  " [
        R(                  " UUUSS9S5      R+                  SS	5      n[        SUR!                  5       U	5       GH  nUUUU	-    n U U    n!U!U-
  U-  R-                  5       S S 2S S S 24   US    -   n"UU"U-  -   U!S S 2S S S 24   -
  n#[
        R.                  " SU#UU    U#5      n$UU S 4   [
        R0                  " SU$-  5      -  n%[
        R2                  " U$S:  U%[
        R4                  " U%5      5      n%U"R                  5       n&U&S   R                  SUS-
  5      n'U&S   R                  SUS-
  5      n(U&S   R                  SUS-
  5      n)U'UU-  -  U(U-  -   U)-   R+                  S5      n*UR7                  SU*U%R+                  S5      5        U(       a  U%R9                  U5      OU%n+UR7                  SU*U+S   UU S S S 24   -  R+                  SS	5      R;                  U5      5        U(       a1  UR7                  SU*U+R+                  S5      R;                  U5      5        UU R!                  5       -  nU
c  GM  U
" [=        SU[        SU5      -  5      5        GM     GM     U(       a  UOUR+                  UUU5      n,UR+                  UUU5      UR+                  UUUS	5      U,UR?                  5       RA                  5       [C        U5      4$ )Nr{  r   rI   r$   r  rF   rH   r  rQ   r  Tas_tupler  r  zbmi,bij,bmj->bmr_  g      "@ra  r`  r_  .N)"medianaminamaxr  r   r   r  r  r  r  r  r&   r  r)   rn   r  r>   r:  rg   r   r  rk   r   r  r  r   ri   r  r  r  rK   rc   rd   r   )-rz   rT   r   r(  r   reskernelr  color_sharpenchunkprogress	col_dtypepadr  r  voxelr  r  dzsinvkreqr  volcolvolwcolr{   doner   r  r  ri  stgiccrY  r  quadwgtiiixiyizr  wpcolnorms-                                                r   _splat_densityr    s6    
C	!s	B	!s	Bg]]_s"--d3E**bg./446:BBDJBBu+D::cEJJrN*U2388:@@CKPDS E
++b2gl6
2C[[b2qIFHM5;;rBw|FDSWDiilAtA1c&kAo&qy!!4!0399;!llA2q1uV5==Ikk%..c3FKSSTVXYZ399;.BRU
#BRBGu$++-aqj9CIECcEk!R4
^3A<< 11d2hBD"d(#eiit&<<C++dSj#u/?/?/DECBF!!!R!V,BF!!!R!V,BF!!!R!V,B"r'NR"W,r1::2>DNN1dCKKO4+0'cBa9BaK8H(H'Q'QRTVW'X'['[\e'fg4B):):9)EFBHHJD#S$Q"234) / '6 t#..r2r:G;;r2r"FNN2r2q$A7BFFHNNL\^cdi^jjjr   c                    [         R                  " U S S 2S4   U S S 2S4   /5      n[         R                  " U S S 2S4   U S S 2S4   /5      n[         R                  " XR                  S9n XD   nXR   XS   pvUR	                  5       nUR                  SXB   USSS9  UR                  SXC   USSS9  UR                  SX'SSS9  UR                  SX6SSS9  X   n[         R                  " X5      (       a  U$ UnM  )Nr   r$   r1   r  Tr  include_self)r   r  r:  r  clonescatter_reduce_equal)	facesnvr`   rj  r}   gpgagbnews	            r   _connected_components_gpur    s    			5A;ad,-A		5A;ad,-AR-A
TBggiAqtRdCAqtRdCAqf4@Aqf4@h;;sH r   c           	         [         R                  " XS9n[         R                  " XS9nUR                  S   n[         R                  " [	        XV5      SS9u  px[        UR                  5       5      S-   n	XS S 2S4      n
[         R                  " XS9U:  n[        UR                  5       5      S:  Ga  [         R                  " XS9n[        [         R                  " XUR                  S5      5      R                  5       5      nXES S 2S4      XES S 2S4      XES S 2S4      np[         R                  " XS9R                  SX[         R                  R                  UU5      -  R                  S5      5      nUS S 2S 4   R!                  SS	5      n[         R"                  " U	S	4[%        S
5      US9R'                  SUUSSS9n[         R"                  " U	S	4[%        S5      US9R'                  SUUSSS9nSUU   UU   -
  R                  5       -  nUUU   U-
  :  R)                  S5      UUU   U-   :*  R)                  S5      -  nU[         R*                  " U5      [         R*                  " UU   5      :g  -  [         R,                  " XS9U:g  -  nUU) -  nX[U
      nUR                  S   S:X  a
  U S S US S 4$ [         R                  " U5      n[         R"                  " U4S[         R.                  US9n[         R,                  " UR                  S   US9UU'   UU   R1                  5       R3                  5       UU   R1                  5       R3                  5       4$ )Nr  r   T)return_inverser$   	minlengthrF   r1   rQ   infr  r	  z-infr  r]  r4  )r   r?  r)   uniquer  r&   r  bincountrf  r   
new_tensorr  r  scatter_add_r   r0  r  r  r   r  allrv  r:  r9  rc   rd   )vertsr  	min_vertsr  vtrU  r  r  labelncompflabelr{  fcountrp  v0v1v2cvolidx3cmincmaxtolenclosedinnerfaces_kusedremaps                              r   _clean_components_gpur3  #  s   		.B		.B	!B||5b=dSHA		q Ead8_F>>%1Y>D
488:8ekk$0A0A"0EFMMOP1a4\2Ah<q!tHB{{50==au||OaOabdfhOiJiInInoqIrsQW~$$R+zz5!*eEl6BRRSTVZ\^`fuyRzzz5!*eFmFCSSTUW[]_agvzS{d7md7m388::DMC//44Q744=SVCV;V:[:[\]:^^EJJt,

4=0IIJell[`Npt{N{|fG}}Q1Ray%)##<< DJJubFCE,,tzz!}V<E$Kd8<<>!5>#5#5#7#=#=#???r   c                    Ubc  [         R                  R                  U5      (       d?  [         R                  R                  U5      SUR                  -  S-  :  a  [        XX#5      $ [        U 5      n[        R                  " US S 2SS/4   US S 2SS/4   US S 2SS/4   /S5      n[        [        [        R                  " [        U5      5      US S 2S4   US S 2S4   44XD4S9SS9u  pgXqS S 2S4      n[        R                  " XvS	9U:  n	U	R                  5       S:  Ga  [        R                  " XS	9n
[        R                  " XS
5      R                  5       nXS S 2S4      XS S 2S4      XS S 2S4      pn[        R                  " U[        R                   " SU[        R"                  " X5      5      US9n[        R$                  " U5      n[        R&                  " [)        S5       Vs/ s H  n[+        U S S 2U4   UU5      PM     snS5      n[        R&                  " [)        S5       Vs/ s H  n[-        U S S 2U4   UU5      PM     snS5      nSUU   UU   -
  R/                  5       -  nUUU   U-
  :  R1                  S5      UUU   U-   :*  R1                  S5      -  nU[        R2                  " U5      [        R2                  " X   5      :g  -  [        R$                  " U5      U:g  -  nU	U) -  n	XU      n[        U5      S:X  a  U S S U4$ [        R4                  " U5      n[        R6                  " US
[        R8                  5      n[        R$                  " [        U5      5      UU'   U U   UU   4$ s  snf s  snf )Nr   r   r   r$   r1   r)   F)directedr  rF   zij,ij->i)weightsr  rQ   r]  )r  r  is_device_cpuget_free_memorysizer3  r9   rf   rr   r	   r   r  r  rf  r   r  r  r0  r:  r   rn   _ndi_minimum_ndi_maximumr  r  rv  r  r  r9  )r  r  r   r  r  er#  r"  r$  r{  r%  rp  r&  r'  r(  r)  cidxr`   r+  r,  r-  r.  r/  r1  r2  s                            r   _clean_componentsr?  A  s    %"8"8"F"Fv"N"N""226:R%**_q=PP$U9EE	UB
a!Qi(%Aq6	*:E!aV)<LMqQA'
BGGCFOa1gqQRTUQUwEW3Xac`h(ityzLEA;F;;u.);DxxzA~V5((4,335A;'QT{);UA;=O{{6299ZRXXbEU+VbghyyxxqRAeAqDk5$?RTUVxxqRAeAqDk5$?RTUVd7md7m388::DMC//44Q744=SVCV;V:[:[\]:^^BGGDMRWWT]-CCD		RWHX\cHcdv,E
5zQRay%99UDGGBBHH%E))CI&E$K;e$$ SRs   .M?1Nc                 l  ^, U R                  U[        R                  S9n U R                  u  pVn[        R                  " X4[        R                  S9n[
        R                  " S[
        R                  5      [
        R                  " S[
        R                  5      4n	US:  d  US:  d  US:  a  U	$ X:  n
S VVVs/ s H"  u  pnXX-   S-
  2XU-   S-
  2XU-   S-
  24   PM$     nnnnUS   US   -  US   -  US   -  US   -  US	   -  US
   -  US   -  nUS   US   -  US   -  US   -  US   -  US	   -  US
   -  US   -  nUU) -  n[        UR                  5       5      nUS:X  a  U	$ AAAUR                  SS9n[        R                  " / SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/US9nUR                  [        R                  5      n[        R                  " SS/SS/SS/SS/SS	/SS/SS
/SS/SS	/SS
/S	S/S
S//US9nUS S 2S4   US S 2S4   nnUU   UU   nnSn/ n[        SUU5       GH,  nUUUU-   2S S S 24   US    -   nU US   US   US   4   nUU:  n US S 2U4   US S 2U4   n"n!U S S 2U4   U S S 2U4   :g  S   R                  [        R                  5      n#U"U!-
  n$[        R                  " U$R                  5       S:  UU!-
  U$-  [        R                  " U$S5      5      R!                  SS5      n%[        R"                  " UUU%S   5      n&UR%                  U&U#-  R                  S5      U#R                  S5      R'                  S5      -  5        GM/     [)        U5      S:  a  [        R*                  " US5      OUS   n'UUR                  [        R                  5      U'-   U-  -   n(AA'A[        R,                  " US-
  US-
  US-
  4S[        R.                  US 9n)[        R0                  " U[        R.                  US 9U)U'   A/ m,U,4S! jn*U
SUS-
  2SUS-
  2SUS-
  24   n+U*" U+U
SU2SUS-
  2SUS-
  24   :g  U+U)S S 2SUS-
  2SUS-
  24   U)S S 2SUS-
  2SUS-
  24   U)S S 2SUS-
  2SUS-
  24   U)S S 2SUS-
  2SUS-
  24   5        U
SUS-
  2SUS-
  2SUS-
  24   n+U*" U+U
SUS-
  2SU2SUS-
  24   :g  U+U)SUS-
  2S S 2SUS-
  24   U)SUS-
  2S S 2SUS-
  24   U)SUS-
  2S S 2SUS-
  24   U)SUS-
  2S S 2SUS-
  24   5        U
SUS-
  2SUS-
  2SUS-
  24   n+U*" U+U
SUS-
  2SUS-
  2SU24   :g  U+U)SUS-
  2SUS-
  2S S 24   U)SUS-
  2SUS-
  2S S 24   U)SUS-
  2SUS-
  2S S 24   U)SUS-
  2SUS-
  2S S 24   5        T,(       d  U	$ U(R3                  5       R5                  5       R7                  [
        R                  5      [        R*                  " T,S5      R3                  5       R5                  5       R7                  [
        R                  5      4$ s  snnnf )"Nr  r   rQ   r1   )r   r   r   r   r  r$   r$   r   r   r   r$   r$   r   r$   r   r$   r$   r$   r$   r$   r$   r   rQ   r7   r4  r.   r  Fr  rB  r   r  rC  rD  rE  rF  rG  r  i   ra  r`  r_  r  r   r   rH   rF   r4  c                   > XS:  -  US:  -  US:  -  US:  -  n[        UR                  5       5      (       d  g X&   X6   XV   XF   X   4u  p#pTn[        R                  " XU5      [        R                  " XU5      pT	R	                  [        R
                  " X'U/S5      5        T	R	                  [        R
                  " X$U/S5      5        g r  )r  r  r   r   r  r   )
crsolr`   rj  r  r   r  p2p4r  s
            r   emit_surface_nets.<locals>.emit  s    1fa(AF3qAv>EIIK  (AHah#*LaCSQ'SQ)?BU[[!Q/0U[[!Q/0r   )r  r   rg   r)   r?  rf   r  r9  r&   rf  r  r  rn   r   r/  r  r  lerpr  r   r9   r  r  r   r:  rc   rd   re   )-r  r=  r  originr  r  r  r  origin_tro   insider  r  ozcs8any_inall_inrt  r  acoffsofffedgese0e1oe0oe1csteplocr  cicvalcslr&  r'  r0  r3  r  ptslocalr  vidrM  r`   r  s-                                               @r   _surface_netsrg  b  sA    &&emm&
4CJBBvEMMJHXXfbjj)288FBHH+EFE	Ava26 \FJKJzrr RWq[.""Wq[.""Wq[.@AJ  K Vc!f_s1v%A.Q7#a&@3q6ICPQFRFVc!f_s1v%A.Q7#a&@3q6ICPQFRFvgF	VZZ\	B	Qw 			'B<<Iy)"Iy)EMSUD775==!DLL1a&1a&1a&1a&1a&1a&a&1a&1a&1a&1a&1a&JRXZE1a4[%1+BBxbCE
CAr5!2:tQ&'$t*42f:r&z2f:56emaed1b5kBQUs1b5z)9588GRKK		e+ebjE-A5??SXZ]C^_eefgijkjjc1Y<0

C%K$$Q'%))A,*@*@*EEF " "%SAEIIc13q6Eemm,u4==EUB
**b1fb1fb1f-rV
TC,,rVDCK E1 	qax261R!V8+,AfQrT1R!V8QrAvX-.	.	Q"q&!BF("	#SAb1fHaQh)>%?	Q"q&!BF("	#SAb1fHaQh)>%?A 	qax261R!V8+,AfQrAvXqtQrAvX-.	.	QrAvXq!BF("	#S261aQh)>%?	QrAvXq!BF("	#S261aQh)>%?A 	qax261R!V8+,AfQrAvXqax2-.	.	QrAvXqax"	#S261R!V8Q)>%?	QrAvXqax"	#S261R!V8Q)>%?A 99;%%bjj1599UA3F3J3J3L3R3R3T3[3[\^\d\d3eeeIKs   :)X/c                     [         R                  " XS9u  p#UR                  [         R                  5      nUS S USS  -   S-  n[         R                  " U5      n[         R                  " X$-  5      nUS   U-
  nU[         R
                  " US:  US5      -  nUS   U-
  [         R
                  " US:  US5      -  n	XW-  X-
  S-  -  n
SXS:*  US:*  -  '   [        U[        [         R                  " U
5      5         5      $ )	N)binsrF   r$   r   r   rH   r1   r   )	rf   	histogramre   r   cumsumr   r   r&   r  )r  ri  histrZ  centersry  r  wfmbmfvar_bs              r   _otsu_levelrr    s    ,,v1KD;;rzz"DSbzE!"I%,G
		$A	4>	"B	
2B	bhhq1ua%	%B
R&2+"q&"c2	2BFbg!^#E"&E6bAg
RYYu-./00r   c                    US::  d  [        U 5      S:X  d  [        U5      S:X  a  U $ [        U 5      n[        R                  " US S 2SS/4   US S 2SS/4   US S 2SS/4   /S5      n[        R                  " XfS S 2S S S24   /S5      n[        [        R                  " [        U5      [        R
                  5      US S 2S4   US S 2S4   44XU4S9R                  5       nSUR                  S S & [        R                  " [        R                  " UR                  S5      5      R                  5       SS 5      R                  [        R
                  5      S S 2S 4   nU R                  [        R
                  5      n	[        [        U5      5       H1  n
X44 H'  nU	[        R
                  " U5      Xy-  U-  U	-
  -  -   n	M)     M3     [        R                  " U	5      $ )Nr   r$   r1   rF   r5  rH   )r9   rf   rr   r   r  rg   tocsrr   rl   r   rf  ravelre   rn   r&   r  )r  r  itersr  r  r  r=  adjdegrk  r  facs               r   _taubin_smoothrz    s    zSZ1_E
a	UB
a!Qi(%Aq6	*:E!aV)<LMqQA
Q"W:*A
bggc!fbjj1AadGQq!tW3EFrh
W
]
]
_CCHHQK
''"**SWWQZ(..0#t
<
C
CBJJ
OPQSWPW
XCRZZ A3u:9CBJJsO3':;;A   ""r   c                 T  ^^ UR                   u  pgn[        R                  " UT[        R                  S9n	[        R                  " UT[        R                  S9n
X-
  U-  n[        R                  " XgU/T[        R                  S9nSU-  US-
  R                  S5      -  S-
  n[        R                  " US S 2S4   US S 2S4   US S 2S4   /S5      S   mUU4S	 jnU" U 5      nU" US
   5      nUUR                  S5      -  R                  R                  5       R                  5       $ )Nr  r0  r$   rH   r1   r   rF   r  c                    > U R                  T5      R                  SSSS5      S    R                  5       n[        R                  R
                  R                  UTSSSS9nUSS S 2SSS S 24   $ )	NrQ   r   r$   r1   bilinearborderT)rx  padding_modealign_corners)r  r  r   r   rb  rc  grid_sample)rk  inpor  grids      r   samp(_sample_vertex_colours_gpu.<locals>.samp  sk    dd6l""1aA.t4::<HH++CJU]mq+rAq!Qr   r  rI   )
r)   r   r?  rg   r  r   r   r  rc   rd   )r  r  r  rP  r  r  r  r  r  r!  orgr  r:  r    r  numdenr  s        `           @r   _sample_vertex_colours_gpur    s    JBB	vU]]	CB
//&u}}
EC
(e	B<<V5==IDbD1H'',,s2A;;!Q$1a4!AqD'2B78HID  v,C
wy!
"C#--%%((,,.4466r   c                 T  ^( U
b  U
OS m([        X5      nU R                  US U24   R                  U	[        R                  S9nU R
                  US U24   R                  U	[        R                  S9nU R                  US U24   R                  U	[        R                  S9nU R                  US U24   R                  S5      R                  U	[        R                  S9nU R                  US U2SS S 24   R                  U	[        R                  S9[        -  S-   R                  SS5      nX:  nUU   UU   UU   UU   UU   4u  ppnUR                  S   S:X  a  g [        XXUX#U	UU(4S jS9
u  nnnnn[        R                  R!                  U	5      (       + =(       a6    [        R                  R#                  U	5      S	UR%                  5       -  S
-  :  nU(       a3  UR'                  5       UR)                  5       R'                  5       nnS =nnOvUR'                  5       R+                  5       R-                  [.        R                  5      nUR'                  5       R+                  5       R-                  [.        R                  5      nAAT(" S5        [1        UR3                  5       5      [1        UR5                  5       5      nnUUUS-  :     nUR%                  5       S:X  a  g [3        [5        [7        UR'                  5       R+                  5       5      U-  USUU-
  -  -   5      USUU-
  -  -
  5      nU	n [        R                  R!                  U	5      (       d]  [        R                  R#                  U	5      S	UR%                  5       -  S
-  :  a&  [        R8                  " S5      n UR'                  5       n[;        UUUUU 5      u  n!n"AT(" S5        US:  a  [=        U"5      S:  a  [?        U!U"Xi5      u  n!n"[=        U!5      S:X  d  [=        U"5      S:X  a  g [A        U!U"U5      n!T(" S5        U(       a  [C        WWU!UUU	5      n#OU!U-
  U-  RD                  n$[.        RF                  " [I        S5       V%s/ s H  n%[K        USU%4   U$SSS9PM     sn%S5      n&[K        UU$SSS9n'U&[.        RL                  " U'SS 5      S S 2S 4   -  n#T(" S5        [.        RL                  " U#SS5      n#[.        RN                  " U#S:*  U#S-  U#S-   S-  S-  5      R-                  [.        R                  5      n#[.        RP                  " U![.        RR                  " / SQ[.        R                  S9-  5      n![        RT                  " U!5      [        RT                  " U"5      [        RT                  " U#5      4$ s  sn%f )Nc                      g r   r_   )r  s    r   r   #_gaussian_to_mesh.<locals>.<lambda>  s    Dr   r  rF   r   r   r$   c                    > T" SU -  5      $ )Ng      ?r_   )r}   reps    r   r   r    s    CPTWXPXMr   )r  r  r.   r7   皙?r  rG   rc   g?gffffff?rQ   .nearest)r	  rx  rI   rH   r   r   r   r   r   r  rX   )+r*   r(   r  r   rg   rv   rw   rx   rk   ry   r   r  r)   r  r  r  r8  r9  r>   rc   halfrd   re   rf   r   rK   r  rr  r  rg  r9   r?  rz  r  r  r   rn   r   rl   r   r  r  r  ))r    r!   r  r  taubin
level_biasmin_componentmin_opacityr  r  r  r  rz   r   r(  rT   r   r{  r  r  r  rP  r  
colour_gpu
colvol_cpucolnorm_cpu	colvol_np
colnorm_npvminvmaxoccr=  sn_devr  r  r   coordsr   r  r  r  s)                                           @r   _gaussian_to_meshr    s3    *(C
A/C
++a#g

!
!u}}
!
ECHHQW  emm DE;;q$3$w""&"FDkk!TcT'"**2.11u}}1UG444C4A!!u}}!EKcQ
X
XYZ\]
^C!D%(YdT$ZQUX[\`Xa%a"Cs
yy|q*8uTWY\flGTBY+['C&% ++99&AA  KeF\F\FlFlmsFtwx{~  |E  |E  |G  xG  JK  xK  GKJ"(**,0B0B0DK
!%%	JJJL&&(//

;	[[]((*11"**=
Iswwy!5#3$D
cD4K
 C
yy{a K	 12Z?PTW[P[H\A\]ttd{++-E
 F!!//77E<R<R<b<bci<jmnqtqzqzq|m|  @A  nA  =Ae$ggi eUFFCLE5IqSZ!^(}Mu
5zQ#e*/ 5%0EH
 ([%QVX^_6>U*--hhejklemnem`a	#q&(96QZ[emnprsj&	JBGGCt,QW55H ''#q!
C
((3'>3;#+1F30N
O
V
VWYWaWa
bC   2C2::)V!VWEU#U%5%5e%<e>N>Ns>STT os   3V%c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)SplatToMeshi;  c                 ~   [         R                  " SS/ SQSS[         R                  R                  S5      [         R                  R                  S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$S%9[         R
                  R                  S&S'SS(SSS)S%9[         R
                  R                  S*SS(S+S,S-S9/[         R                  R                  S.S/9/S09$ )1Nr  zExtract Mesh from Splat)zsplat to meshzgaussian surface netszsplat surfacez
mesh splatr  z.Extract a coloured mesh from a gaussian splat.r|  
resolutioni  r  i   r2   zqDensity-grid resolution along the longest axis. Higher = finer surface, more VRAM/time (grows with resolution^3).rL  r  r4  r$   r   zMax splat half-width in voxels. Each gaussian is rasterized over a window sized to its own 3-sigma, capped here - small surfels stay cheap, large ones aren't truncated. Raise if sparse splats leave gaps.rH  smoothr   <   TzTaubin mesh-smoothing iterations. Smooths the surface without shrinking it (volume-preserving), unlike blurring the density. 0 = raw surface.)rD  rK   r  rJ  r  r=  r  r/   r0  r   zIso-surface level. Auto-picked by Otsu; this biases it (1.0 = auto, lower = fatter/more-connected surface, higher = thinner/tighter).r  i  i 2   zDrop connected components smaller than this many vertices (0 = keep all). Removes detached floater blobs and the inner shell of the double wall.rI  r  g{Gz?rH   z2Ignore gaussians fainter than this before meshing.r  rK  r   zCrisp up the vertex texture: 1.0 = physically-correct blend; higher biases each voxel's colour toward its dominant gaussian instead of averaging neighbours (de-smears the texture). Colour only - geometry is unchanged.meshr  r  )r   r  r  r  rS  rT  Meshr  r  s    r   r  SplatToMesh.define_schema<  sf   yy!2dHw'\3BCb&Q  R XqaQ&\  ] XqaRD&j  k w#D(c  d _cqfSU`d&n  o }dSWbf'[  ]#TW(r  s)2 WW^^^89? 
  	
r   r"   c	                   ^^ [         R                  R                  5       n	UR                  R                  S   n
Sm[         R
                  R                  U
T-  5      m/ / / pn[        U
5       H  nUT-  4UU4S jjn[        XX#XEXgXU5      nUcg  [        R                  " SU5        [        R                  " S5      [        R                  " S[        R                  S9[        R                  " S5      nnnOUu  nnnUR                  U5        UR                  U5        UR                  U5        TR                  US-   T-  5        M     [         R"                  " [%        XUSS	95      $ )
Nr   r  c                 l   > TR                  U[        [        [        U S5      S5      T-  5      -   5      $ )Nr/   rH   )update_absoluter&   rK   r  )r}   rD  rl  precs     r   r   %SplatToMesh.execute.<locals>.<lambda>i  s0    $*>*>tc#cRSUXk[^J_bfJfFg?g*hr   zBSplatToMesh: splat %d produced no surface; emitting an empty mesh.rA  rX   r$   T)colorsunlit)r  r  r  r(   r)   ra  rc  rn   r  r  r  r   r  r9  r  r  r   r  r   )r  r|  r  r  r  r=  r  r  r  r  rj  verts_lfaces_lcolors_lr!   rl  r  rk  r}   r   rl  r  s                       @@r   r  SplatToMesh.execute`  s5   ''88:OO!!!${{&&q4x0%'R(qA !DhB#Ej&Q^mz  EG  HC{ dfgh++f-u{{6/UW\WbWbciWja1a1aNN1NN1OOA  !a%40  }}5gx_cdeer   r_   Nr  r_   r   r   r  r  ;  s:    !
 !
F fmomzmz f fr   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)GaussianExtensionix  r"   c                 ^   #    [         [        [        [        [        [
        [        [        /$ 7fr   )r  r  rA  ru  r  r  r  r  )selfs    r   get_node_listGaussianExtension.get_node_listy  s"     }k;K^z;8 	8s   +-r_   N)r  r  r  r  r   rp   typer   	ComfyNoder  r  r_   r   r   r  r  x  s)    8T$r||*<%= 8 8r   r  c                     #    [        5       $ 7fr   )r  r_   r   r   comfy_entrypointr    s     s   )rH   r  r/   r  )rH   r/   r/  r   )r  )r   g(\)ir   r  rd  r   ior   rd   rf   r   typing_extensionsr   scipy.ndimager   r   r;  r   r<  scipy.sparser   scipy.sparse.csgraphr	   comfy.model_managementr  comfy.utilscomfy_api.latestr
   r   r   comfy_extras.nodes_save_3dr   serverr   r   r   r   r  r&   r*   r@  r:   r   r;   rC   r   r   r   r   r   r   r   r   r   r   r   r   r  r6  r7  r   r   r&  r*  r]  rz  r  r  r  r  r  r  r  r  r  r  r	  r*  r2  rC  rK  rR  r]  rg  r?  rA  ru  r  r  r  rp   r  r  r  float16r  r  r3  r?  rg  rr  rz  r  r  r  r  r  r_   r   r   <module>r     s          & [ [ # 5   6 6 ? [_U U U U
A3 A5u!45 A 7 7D  #  +75 +7b 
 : ( (\Pvt PWd PGT P8T P5RV PX^`d PP&P.4dP<CTPKRTXPZbdhPP&P.7P?H$P !7<RT !r2 CD4(e 4(n	; 	;8J 8Jv56e 56p 0:O5>QS 	Vu 	V 	V	)ekk 	)c 	)!	,=(NBLL N@$$BLL $$N)4$TT`h$ GNODWD",, WDtF}r|| F}R4"R\\ 4"n+BLL +0$S $S $SN3 30
9 WZaept"]]/kd(@<%BPff1#$7(NU NUb:f",, :fz8 8 1 r   