
    +ju                    ~   d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlZd dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZ d dlZd dlZd dlmZmZmZ d dlmZ d d	lmZ d
Z d Z!d Z"dej#        de$de$fdZ%de&de'e(e(e(f         fdZ)d Z*de+fdZ,dZ-dZ.dZ/dZ0de+fdZ1dZ2dZ3dZ4e dz  Z5de+fdZ6i dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d d0d"d1d$d2d&d3d(d4d*d5d,d6d.Z7d7d8d9d:Z8d d;d<d=d>Z9d? Z:d@ Z;dAe+fdBZ<dAe+fdCZ=dAe+fdDZ>dAe+fdEZ?e<e=e>e?dFZ@dAe+de&fdGZAdej#        de$fdHZBdI ZCdJ ZDdK ZEdL ZF G dM dNejG                  ZH G dO dPejG                  ZIdQ ZJdR ZKdS ZLd}dWZMd~dXZNdY ZOdZ ZPd[ ZQ	 dd]ZR G d^ d_ejG                  ZS G d` daejG                  ZT G db dcejG                  ZU G dd deejG                  ZVdf ZWdgeXdej#        fdhZY G di djejG                  ZZdk Z[dTddej\        fdlZ]dm Z^dn Z_ddoZ`dp ZaddrZbdduZcdv Zdddej#        fdwZe G dx dyejG                  Zf G dz d{e          Zgdegfd|ZhdS )    N)BytesIO)override)map_coordinatesminimummaximum)
coo_matrix)connected_components)ComfyExtensionIOTypes)pack_variable_mesh_batch)PromptServergmBP?c                 t    t          j        | dk    | dz  |                     d          dz   dz  dz            S )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      s8    ;qG|QY!++a..52HE1QVY0YZZZ    c                 t    t          j        | dk    | dz  d|                     d          dz  z  dz
            S )Ngsåi?r   r   r   g?r   r   r   s    r   _linear_to_srgbr      s8    ;qI~q5y%!++a..W:U2UX]2]^^^r   gireturnc                     | j         ,t          | j         |                                                   n| j        j        d         S )N   )countsintitem	positionsshape)r    r!   s     r   	_real_lenr*   !   s9    &'h&:3qx{!!"""@QRS@TTr   hc                                            d           t                     dk    rdS t           fddD                       S )N#   )        r/   r/   c              3   T   K   | ]"}t          ||d z            d          dz  V  #dS )           o@N)r&   ).0r!   r+   s     r   	<genexpr>z_hex_to_rgb.<locals>.<genexpr>+   s>      @@QqQwZ$$u,@@@@@@r   )r   r1      )lstriplentuple)r+   s   `r   _hex_to_rgbr:   &   sI    	A
1vv{{@@@@i@@@@@@r   c                     d}|                                  |k    r#| d d |                                  |z  dz            } t          j        | |          S )N   r$   )numelr   quantile)xqlims      r   	_quantilerB   .   sO    
Cwwyy3%%c!A%%&>!Qr   c                    |                                                                                      t          j                  }|j        d         }|dk    rt          d          t          j        |          }|                                                                                     t          j                  }|dddddf         }	|ddddddf                             ddd          	                    |d          }
|                                                                                     t          j                  	                    |d          
                    dd          }t          j        |d	|z
  z            }t          j        |                                                                                     t          j                  
                    d
                    }|                                                                                     t          j                  }g dd t          d          D             z   d t          |
j        d                   D             z   dgz   d t          d          D             z   d t          d          D             z   }t          j        |d |D                       }t          t          t           t          j        |||	|
|||gd                              |dd<   dd| dz   }|d                    d |D                       dz   z  }|                    d          |                                z   S )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nzc                     g | ]}d | S )f_dc_ r4   r!   s     r   
<listcomp>z'_gaussian_ply_bytes.<locals>.<listcomp>K   s    ......r      c                     g | ]}d | S )f_rest_rR   rS   s     r   rT   z'_gaussian_ply_bytes.<locals>.<listcomp>L   s    >>>!!>>>r   opacityc                     g | ]}d | S )scale_rR   rS   s     r   rT   z'_gaussian_ply_bytes.<locals>.<listcomp>M   s    ===qlqll===r   c                     g | ]}d | S )rot_rR   rS   s     r   rT   z'_gaussian_ply_bytes.<locals>.<listcomp>M   s    @^@^@^PQ@^@^@^r   r6   c                     g | ]}|d fS )f4rR   r4   as     r   rT   z'_gaussian_ply_bytes.<locals>.<listcomp>N   s    !;!;!;1d)!;!;!;r   dtypeaxisz$ply
format binary_little_endian 1.0
zelement vertex 
 c              3   "   K   | ]
}d | dV  dS )zproperty float re   NrR   r_   s     r   r5   z&_gaussian_ply_bytes.<locals>.<genexpr>R   s.      ==!----======r   zend_header
ascii)cpunumpyastypenpfloat32r)   
ValueError
zeros_like	transposereshapecliplograngeemptylistmapr9   concatenatejoinencodetobytes)r(   scales	rotations	opacitiesshxyznnormalsff_dcf_restopscalerotattrselementsheaders                    r   _gaussian_ply_bytesr   6   s	    --//


!
!
(
(
4
4C	!AAvv;<<<mC  G

++AQQQ111W:Dqqq!""aaax[""1a++33Ar::F				 	 	'	'
	3	3	;	;Aq	A	A	F	FtX	V	VB	cBh	 	 BF6::<<%%''..rz::??D?IIJJE
--//


!
!
(
(
4
4C.....U1XX.../>>uV\!_'='=>>>? { >=E!HH===> A_@^UZ[\U]U]@^@^@^_E x!;!;U!;!;!;<<<Hs5".#wfbRWY\1]de"f"f"fgghhHQQQK58O!8O8O8OOF
bgg==u=====NNF==!!H$4$4$6$666r         ,   )r   r$   c                    |                                                                                      t          j                  }|j        d         }|dk    rt          d          |                                                                                     t          j                  }|                                                                                     t          j                  }|t          j                            |dd          	                    d          z  }t          j	        |dddddf                                                                                              t          j                  t          z  dz   dd          }	|                                                                                     t          j                                      |d          	                    dd          }
t          j        t          j        |	|
gd	          d
z                                t          j                  }t          j        |||gd	                              d          }t          j        |ddg          }||d<   ||d<   |                                }t#          t$                    }t&          d         |d<   t&          d         |d<   t)          j        d|dd           t)          j        d|dd           t)          j        d|d|           t)          j        d|d|           t)          j        d|dd           t)          j        d|dddd           t)          j        d|ddd           t#          t,                    }t)          j        d|d|           t)          j        d|d|           t)          j        d|d|t.          z             t)          j        d|dd           t)          j        d|dd           t)          j        d|dd           t1          |          t1          |          z   |z   S ) 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   rD   r$   Trd   keepdims-q=N      ?rc   r3   <f4)r   r   
   )r   u1r6   ra   r   r   <Ir6         r2   <H   z<fff   r/   z<ff$          (   )ri   rj   rk   rl   rm   r)   rn   linalgnormrr   _C0rq   roundrx   uint8ru   r{   	bytearray_KSPLAT_HEADER_BYTES_KSPLAT_VERSIONstruct	pack_into_KSPLAT_SECTION_HEADER_BYTES_KSPLAT_BYTES_PER_SPLATbytes)r(   r|   r}   r~   r   r   r   r   r   rgbr   rgbafloatsrec
splat_datar   sections                    r   _gaussian_ksplat_bytesr   ^   s   
 --//


!
!
(
(
4
4C	!AAvv;<<<JJLL  ''
33E
--//


!
!
(
(
4
4C
	sT::??FF
FC
'"QQQ111W+//##))++222:>>DsJAq
Q
QC				 	 	'	'
	3	3	;	;Aq	A	A	F	Fq!	L	LB8BNC91555=>>EEbhOOD ^S%-A666==eDDF
(1-~>
?
?
?CCHCHJ+,,F"F1I"F1I
T61a(((
T61a(((
T62q)))
T62q)))
T62q)))
VVRc3777
UFBS111455G
T7Aq)))
T7Aq)))
T7B,C(CDDD
T7B***
T7B***
T7B***==5>>)J66r   iNGSPr1   r   g333333?c                 N
   |                                                                                      t          j                  }|j        d         }|dk    rt          d          dt          z  }t          j        t          j	        ||z            dd                              t          j
                  }|dz                      t          j                  }	t          j        |	dz  |	dz	  dz  |	d	z	  dz  gd
                              |d                              t          j                  }
t          j	        |                                                                                     t          j                                      |          dz                                dd                              t          j                  }|dddddf                                                                                              t          j                  t          z  dz   }t          j	        |dz
  t           z  dz   dz                                dd                              t          j                  }t          j        |                                                                                     t          j                                      d                    }t          j	        |dz   dz                                dd                              t          j                  }|                                                                                     t          j                  }|t          j                            |dd                              d          z  }||dddf         dk     xx         dz  cc<   t          j	        |ddddf         dz   dz                                dd                              t          j                  }t)          d	          }t+          j        d|dt.                     t+          j        d|dt0                     t+          j        d|d|           d|d<   t          |d<   d|d<   d|d<   t3          |          |
                                z   |                                z   |                                z   |                                z   |                                z   }t7          j        |          S ) 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   rD   r$   i  i i    r   r2   rE   rc   	   r3   Nr   g&.>rI         $@      0@Tr   r         r6   rG        _@r   r            )ri   rj   rk   rl   rm   r)   rn   _SPZ_FRACTIONAL_BITSrr   r   int32uint32stackrq   r   r   _SPZ_COLOR_SCALErs   r   r   r   r   r   
_SPZ_MAGIC_SPZ_VERSIONr   r{   gzipcompress)r(   r|   r}   r~   r   r   r   fixedqiquposalphar   colslnscbr   rotbr   raws                       r   _gaussian_spz_bytesr      s   
 --//


!
!
(
(
4
4C	!AAvv;<<< %%E	#+&&
M	B	B	I	I"(	S	SB
x-				*	*B
(BIa4/"(d1BC"
M
M
M
U
UVWYZ
[
[
b
bceck
l
lCHY]]__**,,33BJ??GGJJURSSXXYZ\_``gghjhpqqE
QQQ111W+//


!
!
#
#
*
*2:
6
6
<s
BC
(S3Y"22S8EA
B
B
G
G3
O
O
V
VWYW_
`
`C
&##%%,,RZ88==$=GG
H
HC
(C$J$&
'
'
,
,Q
4
4
;
;BH
E
EC
--//


!
!
(
(
4
4C
	sT::??FF
FCAAAqD	A$8SAaC[3&%/0055a==DDRXNNDr]]F
T61j111
T61l333
T61a(((F2J%F2JF2JF2J==3;;==(5==??:[[]] [[]]+-1\\^^<C=r   chari1ucharr   shorti2ushortu2r&   i4uintu4floatr^   doublef8int8r   int16uint16r   r   rm   float64)r   r   r2   r6   r6   r$   )r.   r.   r   r6   r1     )r.   r.   r   r6   r$   r   )r   r$   r1   r   r   -   )r   r$   r1   rU   c                 p    t          j        | t           j                  dz
  t          z  d d d d d f         S )Nr   )rl   asarrayrm   r   )r   s    r   _rgb_to_sh_dcr      s3    ZRZ((3.#5qqq$zBBr   c                 r    | t           j                            | dd                              d          z  S )Nr$   Tr   r   )rl   r   r   rr   )r@   s    r   
_norm_quatr      s/    ry~~aa$~77<<UCCCCr   datac           
         |                      d          }|dk     rt          d          | d |                             dd          }|t          d          z   }|| ||dz            dk    rdndz  }dg d	}}}|                                D ]}|                                }|s|d         d
k    r%|d         dk    rt          d|d          d          |d         dk    r$|d         dk    }|rt          |d                   }z|d         dk    rN|rL|d         dk    rt          d          |                    |d         dt          |d                  z   f           t          j
        | t          j        |          ||          j        j        }	fd|}
t          j         d           d           d          gd          }d|	v rFt          j        t          j         d           d           d          gd                    }n"t          j        |
dfdt          j                  }d|	v rKt#          t          j         d           d           d            d!          gd                    }n6t          j        t          j        g d"t          j                  |
df          }d#|	v r$d$d$t          j         d#                     z   z  nt          j        |
t          j                  }d%|	v rt          j         d%           d&           d'          gd          }t+          d( |	D             d) *          }|rt          j        fd+|D             d          }|j        d         dz  dz   }|                    |
d|dz
                                ddd          }t          j        |d d d d d f         |gd          }nz|d d d d d f         }njd,|	v rDt5          t          j         d,           d-           d.          gd          d/z            }n"t          j        |
ddft          j                  }|||||fS )0Ns
   end_headerr   z-File3DToSplat: not a PLY (missing end_header)rh   replacer1   s   
r$   Fformatbinary_little_endianz'File3DToSplat: unsupported PLY format 'z' (need binary_little_endian)elementvertexpropertyrv   z;File3DToSplat: PLY vertex has list properties (unsupported)<countoffsetc                 N    |                               t          j                  S N)rk   rl   rm   )karrs    r   <lambda>z%_parse_ply_gaussian.<locals>.<lambda>   s    #a&--
++ r   r?   rK   rL   scale_0scale_1scale_2rU   {Gz?rot_0rot_1rot_2rot_3)r$   r   r   r   rX   rG   f_dc_0f_dc_1f_dc_2c              3   D   K   | ]}|                     d           |V  dS )rW   N)
startswith)r4   r   s     r   r5   z&_parse_ply_gaussian.<locals>.<genexpr>   s3      CCQ1<<	+B+BCqCCCCCCr   c                 R    t          |                     d          d                   S )N_rE   )r&   split)ss    r   r   z%_parse_ply_gaussian.<locals>.<lambda>   s%    SVWXW^W^_bWcWcdfWgShSh r   )keyc                 &    g | ]} |          S rR   rR   )r4   r   r   s     r   rT   z'_parse_ply_gaussian.<locals>.<listcomp>   s!    ---1!!A$$---r   redgreenbluer3   )findrn   decoder8   
splitlinesr  r&   append_PLY_DTYPESrl   
frombufferrb   namesr   expfullrm   r   tilearrayonessortedr)   rq   rp   rx   r   zeros)r   endr   bodyr   props	in_vertexlinepr  r   r   r   r   rX   dcrestrkkr   r   r   s                       @@r   _parse_ply_gaussianr+     s   
))M
"
"C
QwwHIII$3$Zw	22F]###Dd4!8m$//AAQ6DU)5E!!## : :JJLL 	Q48!(> > >jqtjjjkkkQ49!(I "AaD		qTZItv~~ !^___LL!A$k!A$&7 78999
-bhuooU4
H
H
HCIOE++++AA
(AAcFFAAcFFAAcFF+Q
/
/CErx9qq||QQy\\ JANNOOAbj11%11W::qqzz11W::qqzz"RTUVVWWgbh|||RZ881a&AA5>%5G5GcS2611Y<<-00011RWUVXZXbMcMcG5Xqq{{AAhKK8=qAACC%CCCIhIhiii 	 -------q11Aq1$B		!QQ''11!Q::AAAAtQQQJ 3Q77BBAAAtQQQJBB	%28QQuXXqqzz11V99$EqIIEQRRXq!Qi,,sGR''r   c           
      b   t          |           dz  dk    rt          d          t          j        | t          j        g d                    }|d                             t          j                  dz  }t          |d                             t          j                  dz
  dz            }|d	                             t          j                  |d
                             t          j                  ||d d df                                         t          |d d d df                   fS )Nr   r   z8File3DToSplat: .splat size is not a multiple of 32 bytes))r   r   rU   )r   r   rU   )r   r   r6   )quatr   r6   r   r3   r-  g      `@r   r   rU   )
r8   rn   rl   r  rb   rk   rm   r   copyr   )r   r   r   r   s       r   _parse_splat_gaussianr/  
  s   
4yy2~STTT
-bh (N (N (N O O P PCv;bj))E1D
c&k((44u<E
F
FCJbj))3w<+>+>rz+J+JCAJOO}T!!!RaR%[99; ;r   c                 	  ' | d         dk    r!t          d| d          d| d                    t          j        d| d          d         }t          j        d| d          d         }|t          vrt          d	|           t          |         \  }}}}}}g 'd
|dz  z   }	t	          |          D ]}
d
|
dz  z   }t          j        d| |dz             d         }t          j        d| |dz             d         }t          j        d| |dz             d         }t          j        d| |dz             d         }t          j        d| |dz             d         }t          j        d| |dz             d         }t          j        d| |dz             d         p|}t          j        d| |dz             d         }t          j        d| |dz             d         }t
                              t          j        d| |dz             d         d          }||z   |z   |z   ||z  z   }|dz  }||z  |z   }|	|z   }|dk    r|dk    rdnd\  }}d|dfd|dfd|dfdg}|r(|                    d|dk    rdn	|dk    rdnd|f           t          j	        | t          j
        |          ||          }|d                              t          j                  d!z  }t          |d                             t          j                            }|d                             t          j                  } |dk    r'|d                             t          j                  }!nt          j	        | d|dz  |	|z                                 d"d          }"t          j        |t          j                  }#||z  }$t#          |$|          }%t          j        |%          |z  |#d |%<   ||$k    rRt          j	        | d#||	          }&t          j        |t          j        |          z   |&          d ||$z
           |#|$d <   |d                             t          j                  |z
  |d$z  |z  z  |"|#         z   }!'                    |!| ||d d df                                         t+          |d d d df                   f           |	||z  |z   z  }	'st          d%          t-          'fd&t	          d'          D                       S )(Nr   z+File3DToSplat: unsupported .ksplat version .r$   r   r6   r   r   z1File3DToSplat: invalid .ksplat compression level r   r   r   r   z<fr2   r   r   r   r   )r   r   )z<u2<f2centerrU   r   r   )colorr   r6   r   r2  r   r   r   r4  r3   rE   z<u4       @z$File3DToSplat: .ksplat has no splatsc              3   Z   K   | ]$t          j        fd D                       V  %dS )c                      g | ]
}|         S rR   rR   )r4   r&  r!   s     r   rT   z4_parse_ksplat_gaussian.<locals>.<genexpr>.<listcomp>N  s     5 5 5!1 5 5 5r   N)rl   rx   )r4   r!   partss    @r   r5   z)_parse_ksplat_gaussian.<locals>.<genexpr>N  sC      II1 5 5 5 5u 5 5 566IIIIIIr      )rn   r   unpack_from_KSPLAT_COMPRESSIONrt   _KSPLAT_SH_COMPONENTSgetr  rl   r  rb   rk   rm   r   rq   ru   int64rJ   arangerepeatr.  r   r9   )(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   r   bucketsidxfull_splatsnflengthsr8  s(                                          @r   _parse_ksplat_gaussianrb    s7    Aw!||ZtAwZZQUVWQXZZ[[[%dD!44Q7LtT2..q1E'''TUTTUUU,?,F)BBdME,%%D<   ': ':AH_ tR!V44Q7$T4a88;(tR!V<<Q?)$b2g>>qA'dBG<<Q?
)$b2g>>qA(tR"W==a@QM)$b2g>>qA ,T4bAA!D-11&2DT4QSVXQX2Y2YZ[2\^_``r'B,-0DD$q(
$|3j@=(	77',zz^^~FBQ''2q)9E2q>K]^F oteqjjUUQR

uuX\_lmnnn-bhv&6&6c)TTTCw<&&rz22U:DSZ..rz::;;CL''
33Ezz(m**2:66-e<!;KTX[eTefffnnoqstuuhsBH--*[8c**9R==K7CRC$$ mD%W[\\\G(*	,?A[A[2[]d(e(efxgjmxgxfx(yC%8}++BJ77+E*WZJZ]hJhilstwlxxLL#uc41:??+<+<mDQRQRQRTVUVTVQVK>X>XYZZZ')M99 A?@@@IIIIaIIIIIIr   c           
         t          j        |           }t          j        d|d          d         t          k    rt          d          t          j        d|d          d         }t          j        d|d          d         }|d         }d}|dk    rUt          j        |d	|d
z  |                              t          j	                  
                    |d
          }||dz  z  }n|dv rt          j        |t          j        |dz  |          
                    |d
d
                              t          j                  }|d         dz  |d         dz  z  |d         z  }t          j        |dz  |dz
  |          }|d|z  z                      t          j	                  }||dz  z  }nt          d|           t          j        |t          j        ||                              t          j	                  dz  }	||z  }t          j        |t          j        |d
z  |          
                    |d
                              t          j	                  }
||d
z  z  }|
dz  dz
  t          z  dz   }t          j        |t          j        |d
z  |          
                    |d
                              t          j	                  }||d
z  z  }t          j        |dz  dz
            }|d
k    r.t          j        |t          j        |dz  |          
                    |d                              t          j                  }|d d df         |d d df         dz  z  |d d df         dz  z  |d d d
f         dz  z  }|dz	  d
z  }t          j        |dft          j	                  }|                                t          j        |t          j                  }}dD ]}||k    }|dz                      t          j                  }|dz	  dz  }t          j        ||dz	  |          }dt'          j        d          z  |dz  z  }t          j        |dk    | |          }||         |||f<   |t          j        |||z  d           z  }t          j        t          j        d|z
  dd                     |t          j        |          |f<   t/          t          j        |d d d
f         |d d df         |d d df         |d d df         gd                    }nt          j        |t          j        |d
z  |          
                    |d
                              t          j	                  }|d!z  dz
  }t          j        t          j        d|dz                      d          z
  dd                     }t/          t          j        |d d d f         |gd                    }||||	t7          |          fS )"Nr   r   z'File3DToSplat: invalid .spz (bad magic)r6   r   r   r2   r$   r2  rU   r   r.   )r1   rU   r   .r1   .r$   .r   i   r<   z(File3DToSplat: unsupported .spz version r3   r   r   r   r1   r      )rU   r1   r$   r   i  r   rG   r/   r   )r   
decompressr   r:  r   rn   rl   r  rk   rm   rq   r   r>  r   r   r  r   r.  r   mathsqrtrr   r?  r   r   sumrx   r   )r   r   versionr   	frac_bitsoffr   bvr   cbr   sbr   qbcombinedlargestr@   	remainingsumsqcompactivevaluesignvalr   xqws                               r   _parse_spz_gaussianr  Q  s   
/$

C$Q''*j88BCCC sA..q1G4a((+ABI
C!||mCa!eC@@@GG
SS[[\]_`aaq1u	F		M#rxq1uSAAAII!QPQRRYYZ\ZbccvY"_6a01V9<HQ\1y=!44AN#++BJ77q1uMGMMNNNM#rxq===DDRZPPSXXE1HC	sBHAE#	>	>	>	F	Fq!	L	L	S	STVT^	_	_B1q5LC:/
/#
5C	sBHAE#	>	>	>	F	Fq!	L	L	S	STVT^	_	_B1q5LCF29t#$$E!||]3AcBBBJJ1aPPWWXZX`aaaaad8r!!!Q$x1}-AAAqDR@Bqqq!tHPRNSr>Q&HaVRZ((#==??BHQ
,C,C5	  	6 	6DW_F&..rz::ENa'Db)DDI1%%%-8C(419sdC00C!&kAfdlORXfcCi555EE#%7273;4+H+H#I#I")A,,
 1QQQT7AaaadGQqqq!tWa1g"FJJKK]3AcBBBJJ1aPPWWXZXbcc%Z#GBGC27--"2"22At<<==111d7R(8!<<==sE=#5#555r   )plysplatksplatspzc                     | d d         dk    rdS | d d         dk    rdS t          |           dk    r| d         dk    r| d         dk    rd	S t          |           d
z  dk    rdS t          d          )NrU   s   plyr  r1   s   r  r   r$   r  r   r  z=File3DToSplat: could not determine splat format from contents)r8   rn   )r   s    r   _detect_splat_formatr    s    BQBx6uBQBx;u
4yyA~~$q'Q,,47a<<x
4yy2~w
T
U
UUr   c                    t          | |          }fd} || j        |d |f                   } || j        |d |dd d f                   t          z  dz                       dd          } || j        |d |f                                       d          } || j        |d |f                   } || j        |d |f                   }	|||||	fS )Nc                 F    |                      t          j                  S )Ndevicerb   )tor   rm   )r`   r  s    r   r   z _gaussian_item.<locals>.<lambda>  s    144vU]4;; r   r   r   r$   rE   )	r*   r(   r   r   clampr~   rq   r|   r}   )
r    r!   r  r!  r  r   r   rX   r   r   s
     `       r   _gaussian_itemr    s    
Aq//C	;	;	;	;B
"Q[DSD!
"
"C2ad1dsdAqqq=!""S(3.
5
5a
;
;CbQW%&&..r22GBqx4C4 !!E
"Q[DSD!
"
"CWeS((r   c                    | |                      dd                              d          z  } |                     d          \  }}}}t          j        dd||z  ||z  z   z  z
  d||z  ||z  z
  z  d||z  ||z  z   z  d||z  ||z  z   z  dd||z  ||z  z   z  z
  d||z  ||z  z
  z  d||z  ||z  z
  z  d||z  ||z  z   z  dd||z  ||z  z   z  z
  g	d                              ddd          S )	NrE   Tdimkeepdimr   r$   r1   r  rU   )r   r   unbindr   r   rq   )r@   r~  r?   rK   rL   s        r   _quat_to_matr    s4   	AFFr4F((225999A"JAq!Q;	AQQa!ea!em!4a1q51q5=6I	QUQU]Qa!ea!em!44a1q51q5=6I	QUQU]Q!a%!a%-0!a1q51q5=6I2I 	   wr1a  	!r   c                 F   |                      d          \  }}}}|                     d          \  }}}}	t          j        ||z  ||z  z
  ||z  z
  ||	z  z
  ||z  ||z  z   ||	z  z   ||z  z
  ||z  ||	z  z
  ||z  z   ||z  z   ||	z  ||z  z   ||z  z
  ||z  z   gd          S )NrE   r  )r  r   r   )
r`   ro  awaxayazbwbxbybzs
             r   	_quat_mulr    s    XXb\\NBBXXb\\NBB;
R"r'BG#b2g-
R"r'BG#b2g-
R"r'BG#b2g-
R"r'BG#b2g-	
    r   c                    t          j        t          j        | ||g          dz            t          j        t          j        | ||g          dz            }}t	          j        |d         |d         ddgt          j                  }t	          j        |d         d|d         dgt          j                  }t	          j        |d         dd|d         gt          j                  }t          t          ||          |          S )Nr5  r   r/   ra   r$   r1   )rl   cosradianssinr   tensorrm   r  )rxryrzr   r  qxqyqzs           r   _euler_to_quatr    s    6"*b"b\**S01126"*b"b\:R:RUX:X3Y3YqA	qtQqT3,EM	B	B	BB	qtS!A$,EM	B	B	BB	qtS#qt,EM	B	B	BBYr2&&+++r   c                 v   | d         | d         | d         }}}| d         | d         }}| d         | d         }}| d         | d	         }	}t          j        d
|z   |z   |z   d
|z   |z
  |z
  d
|z
  |z   |z
  d
|z
  |z
  |z   gd          }
t          j        t          j        |
d         ||z
  ||z
  ||	z
  gd          t          j        ||z
  |
d         ||	z   ||z   gd          t          j        ||z
  ||	z   |
d         ||z   gd          t          j        ||	z
  ||z   ||z   |
d         gd          gd          }|
                    d          }t          j        |d|d                             |j        dz                       ddd d f         }||                    dd                              d          z  S )N).r   r   ).r$   r$   ).r1   r1   ).r1   r$   ).r$   r1   ).r   r1   ).r1   r   ).r$   r   ).r   r$   r$   rE   rf  re  rd  ).rU   .NN)r$   r6   .r   Tr  r   )r   r   argmaxgatherexpandr)   r   r   )mm00m11m22m21m12m02m20m10m01q2candselr@   s                 r   _mat_to_quatr    s    iL!I,)cC|Qy\C|Qy\C|Qy\C	a#gmc)1s7S=3+>#gmc)1s7S=3+>@AC
E 
EB;RZsC#IsSyA2FFS3Y6
C#IsSyA2FFS3Yc	2f:sSyA2FFS3Yc	39bjA2FF	
 
 D ))B--CT2s?3::39v;MNNOOPSUVXYXYXYPYZAqvv"dv++55e<<<<r   c                   L    e Zd Zed             Zeddej        fd            ZdS )SplatToFile3Dc                     t          j        ddg dddt           j                            d          t           j                            dg dd	
          gt           j                            d          g          S )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_schemazSplatToFile3D.define_schema  s    y#6RRR< w''x1I1I1I(g  ) ) &--:-FFG
 
 
 	
r   r  r"   c           
         |j         j        d         dk    r%t          j        d|j         j        d                    t	          |d          }t
          t          d                    |t                    } ||j         dd |f         |j	        dd |f         |j
        dd |f         |j        dd |f         |j        dd |f                   }t          j        t          j        t#          |          |                    S )Nr   r$   zDSplatToFile3D supports one item per batch only. Got %d; using first.)r  r  )file_format)r(   r)   loggingwarningr*   r   r   r=  r   r|   r}   r~   r   r   
NodeOutputr   File3Dr   )r  r  r   r!  writerr   s         r   executezSplatToFile3D.execute  s    ? #a''Obdidsdyz{d|}}}q!!2;NOOSSTZ\oppveoa#g.QW0Eoa#g.4C40H%(STVZWZVZSZJ[] ]}U\'$--VLLLMMMr   N)r  __name__
__module____qualname__classmethodr  r   r  r  rR   r   r   r  r    sc        
 
 [
& N NR] N N N [N N Nr   r  c                   X    e Zd Zed             Zedej        dej        fd            Z	dS )File3DToSplatc                 d   t          j        ddg dddt           j                            t           j                            d          t           j        t           j        t           j        t           j        t           j	        gd          gt           j
                            d	
          g          S )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  zFile3DToSplat.define_schema  s    y#$ZZZq ""L&&z22,blBNBO]_]ij6 #   X__'_::;
 
 
 	
r   r  r"   c           
         |                                 }|j        pd                                }t                              |          pt          t          |                   } ||          \  }}}}}	d }
t          j         |
|          d           |
|          d           |
|          d           |
|                              ddd           |
|	          d                    }t          j
        |          S )Nrf   c                 r    t          j        t          j        |                                                     S r   )r   
from_numpyrl   ascontiguousarrayr   )r`   s    r   r   z'File3DToSplat.execute.<locals>.<lambda>  s(    e&r';A'>'>??EEGG r   r$   rE   )	get_bytesr   lower_GAUSSIAN_PARSERSr=  r  r   SPLATrq   r   r  )r  r  r   fmtparserr   r   r   rX   r   tr  s               r   r  zFile3DToSplat.execute  s    !!##$"++--"&&s++\/@AUVZA[A[/\'-vd||$UC"GGAcFF4LAeHHTNAcFF4LAgJJq"a((AbEE$K
 
 }U###r   N)
r  r  r  r  r  r   r  r   r  r  rR   r   r   r  r    s_        
 
 [
& $u| $ $ $ $ [$ $ $r   r  c                    t          j        |           t          j        |          }}t          j        |          t          j        |          t          j        |          t          j        |          f\  }}}}t	          j        |d|gg d| d|gg|          }	t	          j        g dd|| gd||gg|          }
|
|	z  S )Nr   r   r$   r   r  r$   r   r   )ri  r  r  r  r   r  )yaw_deg	pitch_degr  rK   r&  cysycpspRyRxs              r   _view_matrix_tr     s    <  $,y"9"9qAXa[[$(1++tx{{DHQKKGNBB	Ar{IIIQ|<V	L	L	LB	yyy1b2#,B<V	L	L	LB7Nr   c                    |                      di           |                      di           }}fd} ||           ||          }}d }d }|                      d          }	|	rt          j        t          |	                     dd                    t          |	                     d	d
                    t          |	                     dd
                    t          |	                     dd
                    g          }
t	          |
d                    d         } | ||d d df                             } | ||d d df                              } | ||d d df                              }|||||fS  |||z
            }t          j        t          j        t          |d                    t          |d                                       }t          j        t          j        t          dt          dt          |d                                                           }t          ||          }|||d         |d         |d         fS )Npositiontargetc           
          t          j        t          |                     dd                    t          |                     dd                     t          |                     dd                     g          S Nr?   r/   rK   rL   r  r   r  r   r=  ddevs    r   r   z_camera_basis.<locals>.<lambda>.  sh    %,aeeCoo 6 6quuS#9O9O8ORWXYX]X]^acfXgXgRhRhQhiruvvv r   c                 X    t          j        | d         | d          | d          g          S Nr   r$   r1   r   r   rp  s    r   r   z_camera_basis.<locals>.<lambda>0  s'    5;!qteadU344 r   c                 V    | |                                                      d          z  S )NrH   )r   r   r  s    r   r   z_camera_basis.<locals>.<lambda>1  s!    !affhh((... r   
quaternionr~  rG   r?   r/   rK   rL   r  r   r$   r1   r   )r=  r   r  r   r  ri  degreesatan2asinmaxrJ   r  )camera_infor  r   tgtr  eyer	  mvr   r@   qwxyzRrightupfwdyawpitchWs    `                r   _camera_basisr&  (  s*   
 z2.."0M0MCvvvvA!C&&!!C&&C	4	4B..A%%A +eAEE#sOO44eAEE#sOO6L6L#AEE#sOO44eAEE#sOO6L6LNVY[ [ [t%%a(""Qqqq!tW++Qrr1QQQT7(||__aAaaadG8ooFE2s**
!FSL//C
,tz5Q==.%A--@@
A
ACL3tSeCFmm-D-D#E#EFFGGEsE3''A!adAaD((r   c                 R   | |z
  }||                                                     d          z  }t          j        g d|          }|                    |                                          dk    rt          j        g d|          }t          j                            ||          }||                                                     d          z  }t          j                            ||          }t          j        |||gd          }t          |d                    d         S )	NrH   r/   rG   r/   r  +?)r/   r/   rG   r$   r  r   )
r   r   r   r  dotabsr   crossr   r  )r  r	  r  rL   up0r?   rK   r  s           r   _lookat_quat_wxyzr.  B  s    6A	AFFHHt$$$A
,s
3
3
3CuuSzz~~%l???37773""A	AFFHHt$$$A1a  AQ1I1%%%A$  ##r   rG   perspectiver/   c           	         t          j        | t           j        |          }t          j        |t           j        |          }t          |||          }	|rzt	          j        |          }
t          j        t	          j        |
dz            ddt	          j        |
dz            g|          }t          |	d          |d                    d         }	d } ||           ||          t          |	d                   t          |	d                   t          |	d                   t          |	d                   d	t          |          t          |          t          |          d
S )Nrb   r  r1   r/   r  r   c                     t          | d                   t          | d                   t          | d                   dS Nr   r$   r1   )r?   rK   rL   r   r  s    r   r   z%_lookat_camera_info.<locals>.<lambda>Y  .    %!++E!A$KKeAaDkkJJ r   r$   rU   r?   rK   rL   r~  r  r	  r  fov
cameraTypezoom)r   	as_tensorrm   r.  ri  r  r  r  r  r  r   str)r  r	  r8  r  r:  camera_typerollr   r  r@   r`   r  r   s                r   _lookat_camera_infor?  P  s2   
/(%-
D
D
DC
/&c
B
B
BC#sC((A ,L\48AE??Cdhq1uooFsSSSagr$x((+
J
JCCCCHH %ad%!++E!A$KKV[\]^_\`VaVabb::S-=-=uT{{T T Tr   c           	         t          j        | t           j        |          }d |D             \  }}}	}
t          j        |
|||	gt           j        |          }||                                                    d          z  }t          |d                    d         }||d d df         z
  }d } ||           ||          t          |d                   t          |d                   t          |d                   t          |d                   d	t          |          t          |          t          |          d
S )Nr1  c              3   4   K   | ]}t          |          V  d S r   r4  )r4   r   s     r   r5   z$_quat_camera_info.<locals>.<genexpr>b  s(      221eAhh222222r   rH   r   r1   c                     t          | d                   t          | d                   t          | d                   dS r3  r4  r  s    r   r   z#_quat_camera_info.<locals>.<lambda>g  r5  r   r$   rU   r6  r7  )	r   r;  rm   r  r   r   r  r   r<  )r  	quat_xyzwr8  r  r:  r=  r   r  r  r  qwr  r  r  r   s                  r   _quat_camera_inforE  _  s+   
/(%-
D
D
DC22	222NBBL"b"b)sKKKEEJJLL**4000EU4[!!!$A
!!!Q$-C
J
JCCCCHH %eAheE!HooERWXYRZOObghmnohpbqbqrr::S-=-=uT{{T T Tr   c                    t          j        |           t          j        |          }}t          j        |          t          j        |          t          j        |          t          j        |          f\  }}	}
}t	          j        |
 |	z  ||
|z  g|          }d }t           ||||z  z
             ||          ||          S )Nr  c                 X    t          j        | d         | d          | d          g          S r  r  r  s    r   r   z$_orbit_camera_info.<locals>.<lambda>s  s'    %+qtadUQqTE233 r   )ri  r  r  r  r   r  r?  )r#  r$  distancer8  pivot_splatr  rK   r&  r   r  r  r  	fwd_splatr  s                 r   _orbit_camera_inforK  m  s     <dl511qAXa[[$(1++tx{{DHQKKGNBBrcBhBG4SAAAI33Aqqx)/C!CDDaannVY[^___r   c                 ^   t          j        |          }t          j        |          t          j        |          }}fd} ||                     di                      ||                     di                     }}t          j        |d|gg d| d|gg          }	||	||z
  z  z   }
|                     d          pi }t          j        t          |                    dd	                    t          |                    d
d                    t          |                    dd                    t          |                    dd                    g          }t          j        t          j        |dz            dt          j        |dz            dg          }t          |d          |d                    d         }d }i |  ||
          t          |d                   t          |d                   t          |d                   t          |d                   ddS )Nc           
          t          j        t          |                     dd                    t          |                     dd                    t          |                     dd                    g          S r  r  r  s    r   r   z(_orbit_camera_info_yaw.<locals>.<lambda>{  sb    %,aeeCoo 6 6aeeCoo8N8NPUVWV[V[\_adVeVePfPfgpsttt r   r  r	  r/   r(  r  r  r~  rG   r?   rK   rL   r1   r   c                     t          | d                   t          | d                   t          | d                   dS r3  r4  )r  s    r   r   z(_orbit_camera_info_yaw.<locals>.<lambda>  r5  r   r$   rU   r6  )r  r  )	ri  r  r  r  r=  r   r  r   r  )r  	angle_degr  r`   casarp  r   r  r  new_posr@   qcurr  qnr   s     `             r   _orbit_camera_info_yawrU  w  s	   YAXa[[$(1++BttttAqR001111[__Xr5R5R3S3SC	C}oooS"~Fs	S	S	SBB#)$$G%%+A<quuS#//quuS#1G1GquuS#//quuS#1G1GIQTV V VD	txATXa!e__cB3	O	O	OB	2d8T$Z	(	(	+B
J
JChk hss7|| %be5A<<eBqEllY^_abc_dYeYeffh h h hr   c           	         t          dt          t          d|z                                }t          j        dt          j        | |dz   |t          j                  |z  dz  z            }||                                z  }| j        d         }t          j	        j
                            | |                    dddd                              |ddd          d|f|          } t          j	        j
                            | |                    dddd                              |ddd          |df|          } | S )	Nr$   rU         r  r1   rE   r   )paddinggroups)r  r&   r   r   r  r?  rm   rk  r)   nn
functionalconv2dviewr  )r?   sigmar  r)  r   r   s         r   _gauss_blurr_    s   As5U##$$%%A	$%,r1q5EMRRRUZZ_```aaA	AEEGGA	
A""1affQ1b&9&9&@&@Aq"&M&MXY[\W]fg"hhA""1affQ2q&9&9&@&@Ar1&M&MXY[\W]fg"hhAHr   r4  c                 '   t           j                                        fd}t           j                                        t           j                                        c ||            ||                              dd           ||                              d          }}}  ||          t          |          z   ||          }}dk    }|rt          |          }z  } ||          |rt                    n}dk    }dv p|dk    }fd}| j	        d         dk    r
 |            S t          |	          \  }}}}}t          j        |||gd          }| |z
  |j        z  }t          |	                    d	d          pd          pd
}t          |	                    dd          pd          }t          |	                    dd                                                                        d          |                    d          \  }}}|dk    fd|||||||fD             \  }}}}}}}|j	        d         dk    r
 |            S dk    rt          j        |d          }t)                    dz  t+          j        t+          j        |          dz            z  |z  dz  dz  c|d          t1          |          z  } | |                                d d d d d f         z  |                     dd          z  }!|!|!                    dd                              d          dz  d d d d f         t          j        d          z  z   }!t          j        |||gd          }"t          j                            |!          }#|#|"d d d d d f         z  d d d d df         }$|"|$z                       d          }%|#d d ddf         |#d d ddf         |#d d ddf         }(}'}&|#d d ddf         |#d d ddf         |#d d ddf         }+}*})|$                    d          \  },}-}.|rh| t          j!        | j	        d                   d d |"                    d          f         }/|/t          j#        |/d d ddf         dk    dd          z  }/t          j$        |j	        d         dd          }0r_t          ||z
  %                                &                    d                    z  |z  z   |z  z   }2}1|0d d ddf<   |0d d ddf<   n}d|z  }3|z  |3z  z   |z  |3z  z   }2}1|3z   |z  |3                                z  c|0d d ddf<   |0d d ddf<   |3z   |z  |3                                z  c|0d d ddf<   |0d d ddf<   |0|!z  |0                    dd          z  }4|4d d ddf         |4d d ddf         |4d d ddf         }7}6}5|5|7z   dz  |5|7z
  dz                                  |6|6z  z   &                    d          '                                z   }8d|8&                    d          '                                z  }9tQ          t)          tS          dt)                    d z            tS          dt+          j*        tW          |9d!          ,                                                                        fd"d#D             gz   }:t          j-        |:t          j.        $          };g }<|:D ]}=t          j!        |= |=dz   t          j.        $          }>t          j/        |>|>d%&          \  }?}@|<0                    |@                    d          |?                    d          f           t          j1        |9d'z  |;          2                    tg          |:          dz
  (          }A|j	        d         }BtQ          t)          d)tS          d|Bd*z                                }Ctg          |:          }Dt          j4        |          }Et          j5        d|B|Cdz             6                                7                                }Ft          j8        |Bt          j7        +          }Gt          j!        |B          |G|E<   t          j9        |F|Gd,-          dz
  2                    d|Cdz
            }H|H|Dz  |Az   }It          j4        |I          }E|I|E         }I|1|E         6                                |2|E         6                                }K}J|&|E         |'|E         |(|E         }(}'}&|)|E         |*|E         |+|E         }+}*})|'dz  |(dz  |*dz  }N}M}L|,|E         |-|E         |.|E         |%|E         f\  },}-}.}%||E         ||E         }}|r||E         nd }O|r|/|E         nd }Pr||E         ||E         ||E         fnd.\  }Q}R}S|J|K|&|)|+|L|M|N|g	}Tt          j        |Tr|(|*|Q|R|Sgn|,|-|.|%gz             t          j:        t          j$        dt          j7        +          |Idd          |Id d         k    ;                                <                                dz   g          }U|I|U         }V|U=                                |Bgz   }W|V|Dz  =                                }Xt          j>        |V|Dd/0          =                                }Yd1 t          |C          D             }Zt          tg          |X                    D ];}[|Z|Y|[                  0                    |W|[         |W|[dz            |X|[         f           <fd2}\|
dk    }]t          j$        |df          }^t          j@        |f          }_t          j$        |f          }`t          j$        |f          }at          j$        |df          }b|]rt          j$        |f          nd }c|rt          j$        |f          nd }d|rt          j$        |df          nd }e|rt          j$        |f          nd }f|rt          j$        |df          nd }gd}ht          |C          D ]}#|Z|#         }i|is|`A                                 |aA                                 |bA                                 |]r|cA                                 |r|fA                                 |r|gA                                 |iD ]\  }j}k}l|<|l         \  }m}ntS          d3d4|mj	        d         z            }ot          |j|k|o          D ]}pt)          |p|oz   |k          }q |\|p|q|m|n          \  }r}s|r                    d          |s                    d          }t}r|`B                    d|r|t           |aB                    d|rt          jC        |s                                d                     |]r|sD                    |
          n|s}u|bB                    d|r|ud d d d d f         ||p|qd d d f         z                      dd                     |]r*|cB                    d|r|u                    d                     |r7|fB                    d|r|s|O|p|qd f         z                      d                     |rH|gB                    d|r|sd d d d d f         |P|p|qd d d f         z                      dd                     dt          jE        |a           z
  }v|_|vz  }w|]r|cn|`}x|^F                    |wd d d f         |b|x&                    d          d d d f         z             |s|r_|`&                    d          }y|r|dF                    |w|f|yz             |r-|eF                    |wd d d f         |g|yd d d f         z             |_G                    d|vz
             |#d5z  d6k    r6t          |w)                                          dk     r|hdz  }h|hdk    r nd}hd|_z
  }z|z                              }{d7v r|{dk    nd }||r,|d|z&                    d          z                                nd }}d }~|r|e                    d          H                    ddd          d          }|z                    dd          }t          |d8          t          |d8          }}||&                    d          z  d         H                    ddd          }||%                    dd,9          &                    d          z  }~dk    rt          j$                  }t          ||K                                          rz|}||                                         |}||         )                                }q}pt          j#        |||q|}z
  |q|pz
  &                    d          z                      dd          |          }|d d d d d f         L                    d          }nid:k    r>|~ |g d;          z  dz  dz                       dd          }|||d d d d d f         z  }n%|^                    d          }dk    rr |g d<          }||%                                z  }d|~|z                       d          z  dz                       dd          }|d=d>|z  |z  z   d d d d d f         z  }nZ|dk    rTt          |          }|~d d d d df                              dd          }|dd?|z  z
  d?|z  |z  z   d d d d d f         z  }|F                    |_                    d          |          }|rt          |          }|                    dd          N                              |{                    dd          N                              fS )@Nc                 F    t          j        | t           j                  S )Nr1  )r   r;  rm   )r`   r  s    r   r   z"_render_gaussian.<locals>.<lambda>  s    %/!5=EEE r   r   r$   rE   r4  depth)normalclayc                      dk    r                     d          nt          j        d          } |                               t          j                  fS )Nr4  rU   r  r  )r  r   r   r  )imgbg_tr  heightidevidtyperender_stylewidths    r   background_onlyz)_render_gaussian.<locals>.background_only  sk    /;w/F/Fdkk&%+++EKX^`eghqtLuLuLuvvdF##U[tSY%Z%Z%ZZZr   r8       A@r:  rG   r9  rf   orthor   c              3   (   K   | ]}|         V  d S r   rR   )r4   r`   keeps     r   r5   z#_render_gaussian.<locals>.<genexpr>  s'      +d+dAdG+d+d+d+d+d+dr   rd  g      ?r1   r  )dim1dim2MbP?rU   r  r   rF   r         @rH   r   r2   gףp=
?c                      g | ]
}|k     |S rR   rR   )r4   LKs     r   rT   z$_render_gaussian.<locals>.<listcomp>  s    000A!a%%a%%%r   )r2   @      r  ijindexinggUUUUUU?)r  rz    r1  T)r   NNNfloor)rounding_modec                     g | ]}g S rR   rR   )r4   r  s     r   rT   z$_render_gaussian.<locals>.<listcomp>  s    ''''''r   c           	      
   -d d | |d f                              d          }|d d         \	  }}}}}	}
}}}||d d d f         z   }||d d d f         z   }|dk    |/k     z  |dk    z  |+k     z  },r|dd          \  }}}}}|(z
  .z  |z
  }|)z
  .z  |z
  }| }|	|z  }t          j        ||z  ||                              |
|          }t          j        ||z  ||                              |t          j        ||z  ||                    }t          j        |||                              ||          }t          j        |||z  |	                    d          d                              d          }n|dd          \  }}} }!|(z
  *z  |)z
  *z  }#}"t          j        |	|"t          j        |||"                    }$|$                    |#t          j        |||#                    }$|$                    |
|"z  |#          }$t          j        | |"|                              |#|          }%t          j        |!|%|%z  |$                    d          d                              d          }|t          j        d|z            z  |z                      dd          }&|	                                
                    d+dz
            /z  |	                                
                    d/dz
            z   }'|'|&fS )	Nr   r   r   rE   )rz  rW  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dsrr@   su0su1su2musdxdydsiddsimur   r^  cx0cy0r   rh  is_orthopstackr  rl  s0                                           r   r  z_render_gaussian.<locals>.splat  s   aaaBn%,,Q//8<RaR5dCc3S#BtQQQwKBtQQQwKqR%Z(B!G4VD 	a#'8 Cb"bs(a"$Bs(a"$BB"HE-b#r22;;CDDC-
B44==b%-PSVXPXZ]_aBbBbccC-sB//88bAACc39cmmE.B.B"MMMXXYZ[[AA!%abbCc33h!^b3h!^B=b%-S"*E*EFFD==U]3R%@%@AAD==r2..DM#r3//88SAAEc55=$..2G2GrRRR]]^_``Auy***U2::1eDDggiiooa!,,u4rwwyyq%RS)7T7TTEzr      i r      )rb  rc  g333333?r  rc  rG   r   r   )gٿgffffffg333333gffffff?g?g333333?)Ocomfymodel_managementget_torch_deviceintermediate_deviceintermediate_dtyper  rq   r   r   r)   r&  r   r   Tr=  r<  r  r	  r  	full_likerJ   ri  tanr  r  squarerp   diagonalmeanr  r   invrk  r?  argminr   r   r   r   rj  r&   r  ceilrB   r'   r  rm   meshgridr  	bucketizer  r8   argsortlinspacer   r  ru   searchsortedcatnonzeroflattentolistdivrt   r  zero_
index_add_log1ppowr  r  mul_permuter_  boolanyr  r   r  )r   r   rX   r   r   rl  rh  splat_scalebgr  sharpenheadlight_shadingrk  r  	do_linearflatbg_comp
need_depthneed_normalrm  r  r	  r   r!  r"  r%  camr8  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`   ro  r   max_eigradiuslevelslevels_tgridsrw  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_slab	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  r^  r   afapwslab_afrontdenomainvcovcovgcovm	depth_mapnrm_mapnbrq  rc  r  rf  encklhlr   ndotlrx  rg  r  r  r  r   ri  rj  r  rq  r  r  s        ``     `                                                                                                                            @@@@@@@@@@@@r   _render_gaussianr5    sK   
 
 
1
1
3
3CEEEEA)==??AWAjAjAlAlLD&##Q 2 2AAgJJ4F4Fr4J4JgC5E+...#3E'I #c""6>D1R55D'0:od###dG(J"44M8IA8MK[ [ [ [ [ [ [ [ [ [ [ y|q   "/S"A"ACCUB$a((A9
C
q)).Q
/
/
74C--455D;??<4455;;==HHQQHBJBB9D+d+d+d+db"b#wX]_b=c+d+d+d(BBWeS	x{a   voc4((	UF		a	48DL,=,=,A#B#BBTIAqy&1*HC 
4<$$	$BELLNN111dAAA:..",,q!2D2DDG))r);;@@DDtKQQQPTVZ][^c^ghiru^v^v^vvvG 
b"b\2	&	&B			'	"	"BAAAqqq$JAAAq)D4i__R  Fqqq!QwKAAAq!GbAqkcCqqq!QwKAAAq!GbAqkcC++b//E5% <bhqk#6665<<;K;KKLEKAAAqsFas;;; 
RXa[!Qs	3	3	3B 	Ev|))++55d;;<<<q2vsQV|B111a7111a7Rxq2v}$cAFTM&9B#$t8aR"Wt{{}}-D 111a7R1a[#$t8aR"Wt{{}}-D 111a7R1a[<",,q!,,,D111a7mT!!!Q']DAqM!qA1umQ#5577!a%?JJ1MMRRTTTG7$$T**//111FCBE6**b0113q$)IfV[D\D\DaDaDcDc:d:d3e3effggA 1000000A36F|F3emDDDHE 7 7lA2q1uSFFFS4888Bbjjnnbjjnn56666_Vy18<<CCFVWCXXF
A	Sc!Q$Y''((	)	)B	VBM"E^Aq"q&555;;==BBDDF;q
3777D,q---DK!&$d;;;a?GG2PQ6RRG
B,
CM#E
e*C%y  "U)//"3"3CJE
CJcCJE
CJcCQwaq$D"',eeElFSXM"YE5%5>3u:SG",2e99D%/CJJ4E?G_2e9biE;;M_E5% 3S#tT4AF[h#qCeUE#B#BUZ\achjpTqrssF YAUZDDDs122wRUVYWYVYRZGZFcFcFeFeFmFmFoForsFstuuF	VB]]__s"FBw  GyRw777>>@@H''U2YY'''I3w<<   N N(1+%%vay&Q-&LMMMM           < sNE;ay---DJws+++EK,,,Ek4'#...G;ay---D/4>5;ws++++$D/9C5;ws++++tD1<F5;ay----$D0:DEK,,,,E2=GEKq	#....4EEBii / /} 	

 	JJLLL 	KKMMM 	KKMMM" 	i 	iND$2YFBT:!455BD$++ i ib$''"U2r2r22
U++b//5==+<+<R  C,,,""1cU[%-@-@,@+I+I"+M+MNNN,1<eii(((u3QQQ4Z3r"udAAA~;N)N(W(WXZ\](^(^___ =OOAsCKKOO<<< V$$Qed2b5$;6G.G-P-PQS-T-TUUU i$$QeAAAqqq$J.?%2tUVUVUVBW.W-`-`acef-g-ghhhi UYx((((5eAAAtGndU__T-B-B111d7-K&KLLL 	E 	E??4((D 3eUT\222 EeAAAtGned111d7m.CDDD

1v:6Q;;UYY[[!!D((
A::E  
e)C;;vu%%D%)<<<4#::$DGQ[d+++44VUCCCW[IG M\\&%++33Aq!<<TB[[Avu--Rc**KC,E,EBr||D)))1-55aA>>6;;2t;<<FFtLLLwKc222

 	at_((**IdO,?,?,A,ABDBNrBw6I6I$6O6O#O"V"VWXZ["\"\^_``A111d
m""65!44		!	!,,,---3c9@@AFFDAAAt$$ll65!,,6!!%%%&&BbggiiB2**2...4;;AqAABr	B.111d
;;CC""'((AaaaAg&&--a33ES1WsQw6111d
CCCll5==::GDD 	'!#&&C99Q??dF++TZZ1-=-=-@-@v-N-NNNr   c                   N    e Zd Zed             Ze	 ddej        fd            ZdS )RenderSplatc                    t          j        ddg dddt           j                            d          t           j                            ddd	d
d          t           j                            ddd	d
d          t           j                            ddddd          t           j                            ddddddd          t           j                            dddddd !          t           j                            d"d#d#d$ddd%          t           j                            d&d#d#dd'dd(          t           j                            d)g d*d+,          t           j                            d-d./          t           j                            d0dd12          t           j	                            d3dd42          gt           j        
                    d56          t           j        
                    d76          g8          S )9Nr7  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  rl  r   ry  r  r   defaultrJ   r  steprh  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.r:  rJ   r  r  r  rG   g?g      @g?TzhMultiplier on each splat's projected footprint (lower = crisper points, higher = softer/fuller surface).r:  rJ   r  r;  advancedr  r  r5         @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.r:  rJ   r  r;  r  r  r/   ru  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).rk  )r4  rd  rb  rc  zrWhat the image output shows: color, clay (neutral-albedo shaded), depth (near=bright), normal (OpenGL normal map).r  
backgroundz#000000)r:  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  zRenderSplat.define_schema  s   y!'SSS@
 w''Wd1MMXtANNXqd&s  t t }csRVae(J  K K y#3Cc(a  b b 2CScX\gk(Q  R R 2CScX\gk'i  k k~7[7[7[(Z  [ [ |Y??zD(R  S S %%md/w & x x9@ X__'_::BGNNX^N<_<_`S*
 *
 *
 *	
r   Nr"   c                    t          |	          }d }|m|dd df                             dd          }t          j                            |||dd          }|                    dd                              dd          }t          t          |                    pd}|dk     rdnd	}g g }}t          j        	                                }|j
        j        d         |z  }|dk    rt          j                            |          nd }d}t          |j
        j        d                   D ]}t          |||          \  }}}}}|dk    r1||k    }||         ||         ||         ||         ||         f\  }}}}}|}||j        d         r|                    d          nt!          j        d|
          } |j        d         r:t%          || z
                      d          d                              d          nt!          j        d	|
          }!t-          |!t/          j        t/          j        d          dz            dz  z            }"t5          dd|"d| |          }t          |          D ]}#|dk    r|nt7          ||dz  |#z  |z  |          }$||||j        d         z           n|}%t9          |||||||||%|$|||
          \  }&}'|                    |&           |                    |'           |dz  }||                    d           t?          j         t!          j!        |          t!          j!        |                    S )N.rU   rE   r$   bicubicdisabledr   r   rG   r  r  gGz?-C6?rn  r1   g?      >@     v@)r  r  rk  )"r:   movedimr  utilscommon_upscaler  r+  r&   r  r  r(   r)   ProgressBarrt   r  r  r   r   rB   r   r   r  r   ri  r  r  rK  rU  r5  r  updater   r  r   )(r  r  rl  rh  r<  r  r  r  rC  rD  rk  r  rE  r  bg_imgsbin_frames	orbit_dirimgsmasksr  totalpbarr   r!   r   r   rX   r   r   rq  base_camr3  extentdistfrcam_frbg_krf  rH  s(                                           r   r  zRenderSplat.execute  sz    $$#(#++B22B++Bvy*UUBjjB''--a33Gs6{{##(q"QJJDDC	"e'88::%a(8316u{&&u---u,Q/00 	# 	#A,:5!V,L,L)Cguc 1$$"3303D	3t9gdmUZ[_U`befjbk0k-S'5#"H(+	!W!%+aPV:W:W:WZ]ZcdeZf @)S6\$7$7B$7$?$?FFPPQUVVV$|C??? VtxT0B0BQ0F'G'G#'MNOO-dD$ffUUHoo # #&.!mm((5h	E@QTV@VYa@acijj 8?8Kwq7=#3344QS,S#wsESY[fhlnt5<Pa:FH H H	T C   T"""Q#KKNNN# }U[..E0B0BCCCr   )NNr  rR   r   r   r7  r7    si        +
 +
 [+
Z X\'D 'Dacan'D 'D 'D ['D 'D 'Dr   r7  c                   L    e Zd Zed             Zeddej        fd            ZdS )CreateCameraInfoc                    t          j        ddg dddt           j                            dt           j                            dt           j                            dd	d
dd          t           j                            ddddd          t           j                            dddddd          g          t           j                            dt           j                            dddddd          t           j                            ddddd          t           j                            ddddd          g          t           j                            dt           j                            dddddd          t           j                            ddddd          t           j                            ddddd          t           j                            dd d!dd"          t           j                            d#d d!dd"          t           j                            d$d d!dd"          t           j                            d%dd!dd"d&          g          gd'(          t           j                            d)d dddd*d+,          t           j                            d-d dddd*.          t           j                            d/d dddd*.          t           j                            d0d d1d2dd3          t           j                            d4d	dd5dd6          t           j                            d7ddd8dd9          t           j                            d:d;d<gd=(          gt           j                            d>?          g@          S )ANri  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#  rn       vrT  rG   r9  r$  rS  g     @Vg     @V@rH        @r   g     @@z Camera distance from the target.rB  look_at
position_xg     @z4Camera position in world space (right-handed, Y-up).
position_y
position_zr  quat_xr/   r   rt  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.r?  target_y)r:  rJ   r  r;  r@  target_zr>  g     fg     f@z)Camera roll about the view axis, degrees.r8  g      ^@z"Vertical field of view in degrees.r:        Y@zNDigital zoom (focal-length multiplier). >1 zooms in without moving the camera.r=  r/  orthographiczYProjection used by Render Splat: perspective (foreshortening) or orthographic (parallel).r  r  r  )	r   r  DynamicCombor  OptionrJ  r  rM  r  r  s    r   r  zCreateCameraInfo.define_schema  s   y&-dddG %%fO**7udEX[\\w%TX[\\z3Df[_/Q ' S S5   O**9|SgSY`d/e ' g g|SgSY`dee|SgSY`dee	7   O**<|SgSY`d/e ' g g|SgSY`dee|SgSY`deex$CV[\\x$CV[\\x$CV[\\x$CV[ 0G ' H H
: 
 
70 w1 & x x2 z3GVZei(k  l l z3GVZeijjz3GVZeijjvsEPS'R  T TudS'K  M Mvs%d'w  y y}}n6U (C  D DK'P _+++GGHa1
 1
 1
 1	
r   rG   r/  r"   c	                     t           j                                        }	|d         }
|
dk    r\|d         |d         |d         g}|d         |d         |d         |d	         g}t          j        t          ||||	||
                    S |||g}|
dk    rt          j        |d                   t          j        |d                   }}t          j        |          t          j	        |          t          j        |          t          j	        |          f\  }}}}|d         }|||z  |z  z   |||z  z   |||z  |z  z   g}n|d         |d         |d         g}t          j        t          ||||	|||                    S )Nrl  r  rq  rr  rs  rt  ru  rv  rw  )r:  r=  rm  r#  r$  rH  )r:  r=  r>  )r  r  r  r   r  rE  ri  r  r  r  r?  )r  rl  rx  ry  rz  r>  r8  r:  r=  r  kindr  r-  r	  rK   r&  r   r  r  r  r  s                        r   r  zCreateCameraInfo.execute&  s~   $5577F|<\*D,>\@RSHNDNDNDNSD=!28T3RVdo!p!p!pqqqHh/7??<U,,dl4=.I.IqA!Xa[[$(1++tx{{DHQKKONBBZ A 1r6B;.1r60A8aRTfWYkCYZHH\*D,>\@RSH}063RVdovz{{{|||r   NrG   r/  r  rR   r   r   ri  ri    sf        2
 2
 [2
h } }lnly } } } [} } }r   ri  c                   J    e Zd Zed             Zedej        fd            ZdS )TransformSplatc                 ,   t          j        ddg dddt           j                            d          t           j                            ddd	d
d          t           j                            ddd	d
d          t           j                            ddd	d
d          t           j                            ddddd          t           j                            ddddd          t           j                            ddddd          t           j                            dddd
d          t           j                            dddd
d          t           j                            dddd
d          g
t           j                            d          g          S )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   r9  translate_ytranslate_zrotate_xrn  rT  rG   rotate_yrotate_zscale_xscale_yscale_zr  r  )r   r  r  r  rJ  r  r  s    r   r  zTransformSplat.define_schema:  s_   y$*^^^b w''}cv5W[\\}cv5W[\\}cv5W[\\z3FTWXXz3FTWXXz3FTWXXy#4UQUVVy#4UQUVVy#4UQUVV X__'_::;'
 
 
 	
r   r"   c                    |j         }|j        |j        }}t          |||                              ||          }t          |d                    d         }t          j        ||	|
g||          }|d d d f         |z  }t          j        |||g||          }||j        z  |z   }||	cxk    r|
k    rin nf|j	        |z  }t          |                    |j                  |j                  }||                    dd                              d          z  }n]t          |j                            dd                    }|j	                            dd	                                          }||d d d d d f         z  |                    dd
          z  }||z  |j        z  }t          j                            |          \  }}|t          j        t          j                            |          dk     dd          d         z  }|                    d                                                              |j	        j                  }t1          |                              |j        j                  }t3          j        ||||j        |j        t;          |dd                     }t=          j        |          S )Nr  r   r1  rE   Tr  r   r6   rU   r  r   rG   r  r%   r%   ) r(   r  rb   r  r  r  r   r  r  r|   r  	expand_asr}   r   r   rq   r  rp   r   eighr   detrj  r)   r  r   r  r~   r   getattrr   r  )r  r  r  r  r  r  r  r  r  r  r  r   r  dtq_rotr  DAr  r(   r|   r}   rgs2r+  lamVouts                               r   r  zTransformSplat.executeR  s    o*ciRx8<<??sRT?UUt%%a(L'7G4BsKKKaaagJNL+{K@SVWWW!#IM	g(((((((((\G+F!%//%/"B"BEOTTI!INNr4N$H$H$R$RSX$Y$YYIIeo55b!<<==B%%b!,,3355B111dAAA:&",,r2*>*>>Cc'AC-C\&&s++FCEK 0 0 3 3a 7sCCOTTA]]1%%**,,44U\5GHHF$Q//0EFFIk)VY$+E8T$B$BD D D}S!!!r   Nr  rR   r   r   r  r  9  sW        
 
 [
. "LNM" " " [" " "r   r  c                   J    e Zd Zed             Zedej        fd            ZdS )GetSplatCountc                    t          j        ddg dddt           j                            d          gt           j                            d          t           j                            d          gt           j        j        g	          S )
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  rI  Hidden	unique_idr  s    r   r  zGetSplatCount.define_schemaq  s|    y#*^^^OHNN7++,X__'_::V]]]88 I'(
 
 
 	
r   r"   c                    t          fdt          j        j        d                   D                       }| j        j        r.t          j                            |dd| j        j                   t          j
        |          S )Nc              3   8   K   | ]}t          |          V  d S r   )r*   )r4   r!   r  s     r   r5   z(GetSplatCount.execute.<locals>.<genexpr>  s-      QQAIeQ''QQQQQQr   r   ,z splats)rk  rt   r(   r)   r  r  r   instancesend_progress_textr   r  )r  r  r   s    ` r   r  zGetSplatCount.execute  s    QQQQu7LQ7O1P1PQQQQQ: 	`!445H5H5H5H#*J^___}UE***r   Nr  rR   r   r   r  r  p  sV        
 
 [
 +r} + + + [+ + +r   r  c                     | d         j         dd          }| d                             t          |           |g|R           }t          |           D ]\  }}|||d |j         d         f<   |S Nr   r$   )r)   	new_zerosr8   	enumerate)itemsr   tailr  r!   r  s         r   
_pad_stackr    s{    8>!""D
(

c%jj!3d33
4
4C%      1A{
{NJr   	gaussiansc                 4   d | D             }|st          d          |d         j        j        d         }|D ]>}|j        j        d         |k    r&t          d| d|j        j        d          d          ?t          d |D                       }g g g g g g f\  }}}}}	}
t	          |          D ](}g g g g g f\  }}}}}|D ]+}t          ||          }|                    |j        |d |f                    |                    |j        |d |f                    |                    |j        |d |f                    |                    |j	        |d |f                    |j
        |d |f         }|j        d         |k     rQt          j        ||                    |j        d         ||j        d         z
  |j        d	                   gd
          }|                    |           -|                    t          j        |                     |                    t          j        |                     |                    t          j        |                     |                    t          j        |                     |	                    t          j        |                     |
                    |d         j        d                    *t          |
          }d }t          t          |
                    dk    r1t          j        |
|d         j        j        t          j                  }t'          j        t+          ||          t+          ||          t+          ||          t+          ||          t+          |	|          |          S )Nc                     g | ]}||S r   rR   r4   r    s     r   rT   z$_merge_gaussians.<locals>.<listcomp>  s    	0	0	0!-!---r   z!MergeSplat: no gaussians to merger   z!MergeSplat: batch size mismatch (z vs z).c              3   :   K   | ]}|j         j        d          V  dS )r1   N)r   r)   r  s     r   r5   z#_merge_gaussians.<locals>.<genexpr>  s*      **!
1******r   r$   r1   r  rE   r  r  )rn   r(   r)   r  rt   r*   r  r|   r}   r~   r   r   r  r  r8   setr  r  r>  r   r  r  )r  gsro  r    max_kpos_bscl_brot_bop_bsh_bra  r!   pos_iscl_irot_iop_ish_ir!  r   r   r%   s                        r   _merge_gaussiansr    sk   	0	0Y	0	0	0B ><===
1a A b b;Q1$$```HYZ[H\```aaa %**r*****E/12r2r2/E,E5%tW1XX + +*,b"b"*<'ueT4 		 		AAq//CLLQW-...LL!TcT'*+++LLQW-...KKAttG,---a#gBx{U""YBLL!ebhqk>QSUS[\]S^$_$_`fghhhKKOOOOUYu%%&&&UYu%%&&&UYu%%&&&EIdOO$$$EIdOO$$$uRyq)****GAF
3w<<1gbeo.DEKXXX;z%++Zq-A-A:eUVCWCW$T1--z$/B/B6S S S Sr   c                   b    e Zd Zed             Zedej        j        dej        fd            Z	dS )
MergeSplatc                 :   t           j                            t           j                            d          ddd          }t          j        ddg ddd	t           j                            d
|          gt           j                            d          g          S )Nr  r1   r   )prefixrJ   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  zMergeSplat.define_schema  s     ++BHNN7,C,CGYZ`b+ccy 'aaazK%%h%@@AX__'_::;	
 	
 	
 		
r   r  r"   c                     d |                                 D             }|st          d          t          j        t	          |                    S )Nc                     g | ]}||S r   rR   )r4   rp  s     r   rT   z&MergeSplat.execute.<locals>.<listcomp>  s    :::AAMaMMMr   z'MergeSplat: connect at least one splat.)valuesrn   r   r  r  )r  r  r  s      r   r  zMergeSplat.execute  sN    ::::: 	HFGGG}-b11222r   N)
r  r  r  r  r  r   r  Typer  r  rR   r   r   r  r    sb        
 
 [
 3R[- 3"- 3 3 3 [3 3 3r   r  c                 F   ||                     dd                              d          z  }|                    d          \  }}}}t          j        dd||z  ||z  z   z  z
  d||z  ||z  z
  z  d||z  ||z  z   z  d||z  ||z  z   z  dd||z  ||z  z   z  z
  d||z  ||z  z
  z  d||z  ||z  z
  z  d||z  ||z  z   z  dd||z  ||z  z   z  z
  g	d                              ddd          }d	|                     d
          dz  z  }t          j        d|||          S )Nr$   Tr  r   rE   r1   r  rU   rG   rH   znij,nj,nkj->nik)r   r   r  r   r   rq   einsum)	r   r-  r@   r~  r?   rK   rL   r  inv_s2s	            r   _inverse_covariancer    sh   tyyQy--77>>>A"JAq!Q	AQQa!ea!em!4a1q51q5=6I	QUQU]Qa!ea!em!44a1q51q5=6I	QUQU]Q!a%!a%-0!a1q51q5=6I2I 		 	 	 gb!Q	 
 5??4((A--F<)1fa888r   c                 
   d|                                 z  }|                     d          |z
  }|                     d          |z   }||z
                                  |z                      d          }t          j        ||z
  |z                                            dz                                   \  }}}t          ||          }t          j        d|                    d          z  |z                                            
                    dt          |                    }|dk    }t          j        ||z  |z  |          }t          j        ||z  |z  d	||
          }|rt          j        ||z  |z  ||
          nd }| j        d         d}}t          dt          |          dz             D ]=}||k                        d          d         }|                                dk    r<t          j        | |dz   |t
          j        
          }t          j        t          j        |||d          d                              dd	          }t          d|                                |	          D ]w}||||	z            } | |          }!|!|z
  |z                                  d d d d d f         |d          z   }"||"|z  z   |!d d d d d f         z
  }#t          j        d|#||          |#          }$|| d f         t          j        d|$z            z  }%t          j        |$dk     |%t          j        |%                    }%|"                                }&|&d         
                    d|dz
            }'|&d         
                    d|dz
            }(|&d         
                    d|dz
            })|'||z  z  |(|z  z   |)z                       d          }*|                    d|*|%                    d                     |r|%                    |          n|%}+|                    d|*|+d         || d d d f         z                      dd	                              |                     |r=|                    d|*|+                    d                              |                     ||                                 z  }|
* |
t=          d|t          d|          z                       y?|r|n|                    |||          },|                    |||          |                    |||d	          |,|                                                                 tC          |          fS )Nro  r   rH   r$   ru  rE   rG   r  rU   r  Tas_tupler{  r|  zbmi,bij,bmj->bmrW  g      "@rf  re  rd  .N)"medianaminamaxr  r   r   r  r  r  r  r  r&   r   r)   rt   r  r=   r?  rm   r   r  rq   r   r  r  r   ro   r  r  r  rJ   ri   rj   r   )-r   rX   r   r-  r   reskernelr  color_sharpenchunkprogress	col_dtypepadr  r  voxelr  r  dzsinvkreqr  volcolvolwcolr   doner   r  r  rn  stgiccr^  r  quadwgtiiixiyizr  wpcolnorms-                                                r   _splat_densityr    s    
C	!s	B	!s	B2g]]__s"--d33E*b2g.//4466:BBDDJBBud++D:cEJJrNN*U23388::@@CKKPPDS E
+b2gl6
2
2
2C[b2qyIIIFHMW5;rBw|F)DDDDSWDilAtA1c&kkAo&& 5 5qy!!4!00399;;!lA2q1uV5=IIIk%.c3FFFKKSSTVXYZZ399;;.. 	5 	5BRU
]#BRBGu$++--aaaqqqj9CIECcEk!R4
^3A< 11d2hBBD"d(#eit&<&<<C+dSj#u/?/D/DEECBF!!!R!V,,BF!!!R!V,,BF!!!R!V,,B"r'NR"W,r1::2>>DNN1dCKKOO444+09'''cBa9BaaaK8H(H'Q'QRTVW'X'X'['[\e'f'fggg G4B):):9)E)EFFFBHHJJD#S$Q"233444)	5* %tt#..r2r::G;;r2r""FNN2r2q$A$A7BFFHHNNL\L\^cdi^j^jjjr   c                 f   t          j        | d d df         | d d df         g          }t          j        | d d df         | d d df         g          }t          j        || j                  }	 ||         }||         ||         }}|                                }|                    d||         |dd           |                    d||         |dd           |                    d||dd           |                    d||dd           ||         }t          j        ||          r|S |})Nr   r$   r1   r  Tr  include_self)r   r  r?  r  clonescatter_reduce_equal)	facesnvr`   ro  r   gpgagbnews	            r   _connected_components_gpur     sN    		5A;aaad,--A	5A;aaad,--AR---AqTA1BggiiAqtRdCCCAqtRdCCCAq"f4@@@Aq"f4@@@#h;sA 	Hr   c           	         t          j        | |          }t          j        ||          }|j        d         }t          j        t	          ||          d          \  }}t          |                                          dz   }	||d d df                  }
t          j        ||	          |k    }t          |                                          dk    rNt          j        |
|	          }t          t          j	        |||
                    d                                                              }||d d df                  ||d d df                  ||d d df                  }}}t          j        |	|                              d|
|t           j                            ||          z                      d                    }|d d d f                             dd	          }t          j        |	d	ft%          d
          |                              d||dd          }t          j        |	d	ft%          d          |                              d||dd          }d||         ||         z
                                  z  }|||         |z
  k                        d          |||         |z   k                        d          z  }|t          j        |          t          j        ||                   k    z  t          j        |	|          |k    z  }|| z  }|||
                  }|j        d         dk    r| d d         |d d         fS t          j        |          }t          j        |fdt           j        |          }t          j        |j        d         |          ||<   ||                                                                         ||                                                                         fS )Nr  r   T)return_inverser$   	minlengthrE   r1   rU   infr  r  z-infr  rR  r1  )r   r;  r)   uniquer   r&   r  bincountrk  r   
new_tensorr  r   scatter_add_r   r,  r  r  r   r  allr{  r?  r>  ri   rj   )vertsr  	min_vertsr  vtrZ  r  r  labelncompflabelrq  fcountru  v0v1v2cvolidx3cmincmaxtolenclosedinnerfaces_kusedremaps                              r   _clean_components_gpur  #  s   	v	.	.	.B	v	.	.	.B	!B|5b"==dSSSHAu		q E2aaad8_F>%5111Y>D
488::%888ek$0A0A"0E0EFFMMOOPP111a4\2bAh<Bqqq!tHB{5000==a"u|OaOabdfhOiOiJiInInoqIrIrssQQQW~$$R++z5!*eEll6BBBRRSTVZ\^`fuyRzzz5!*eFmmFCCCSSTUW[]_agvzS{{d7md7m388:::DMC//44Q7744=SVCV;V:[:[\]:^:^^EJt,,
4=0I0IIJel[`ioNpNpNpt{N{|fG}Q1RaRy%)##<  DJubFCCCE,tz!}V<<<E$Kd8<<>>!!5>#5#5#7#7#=#=#?#???r   c                     |_t           j                            |          s@t           j                            |          d|j        z  dz  k    rt           |||          S t                     }t          j        |d d ddgf         |d d ddgf         |d d ddgf         gd          }t          t          t          j        t          |                    |d d df         |d d df         ff||f          d          \  }|d d df                  }t          j        |	          |k    }|                                dk    rt          j        ||	          }	t          j        ||	d
                                          }
 |d d df                   |d d df                   |d d df                  }}}t          j        |t          j        d|t          j        ||                    |          }t          j        |          t          j         fdt)          d          D             d          }t          j         fdt)          d          D             d          }d||
         ||
         z
                                  z  }|||
         |z
  k                        d          |||
         |z   k                        d          z  }|t          j        |          t          j        ||
                   k    z  t          j        |          |
k    z  }|| z  }|||                  }t          |          dk    r d d         |fS t          j        |          }t          j        |d
t          j                  }t          j        t          |                    ||<    |         ||         fS )Nr   r   r   r$   r1   r)   F)directedr  rE   zij,ij->i)weightsr  c                 F    g | ]}t          d d |f                   S r   )_ndi_minimumr4   r`   cidxr  r  s     r   rT   z%_clean_components.<locals>.<listcomp>S  1    RRRAeAAAqDk5$??RRRr   rU   c                 F    g | ]}t          d d |f                   S r   )_ndi_maximumr&  s     r   rT   z%_clean_components.<locals>.<listcomp>T  r(  r   rR  )r  r  is_device_cpuget_free_memorysizer  r8   rl   rx   r	   r   r  r  rk  r   r  r  r,  r?  r   rt   r  r
  r{  r  r  r>  )r  r  r  r  r  er  r  rq  r  ru  r  r  r  r  r  r  r  r  r  r  r  r'  r  s   `                     @@r   _clean_componentsr/  A  s    %"8"F"Fv"N"N"226::R%*_q=PPP$UE9fEEE	UB
aaa!Qi(%Aq6	*:E!!!aV)<LMqQQA'
BGCFFOOa1gqQRQRQRTUQUwEW3Xaceg`h(i(i(ityzzzLE55A;F;u...);DxxzzA~~Vu555(4,,33555A;'uQQQT{);U5A;=OB{629ZRXbRTEUEU+V+VbghhhyxRRRRRRqRRRTUVVxRRRRRRqRRRTUVVd7md7m388:::DMC//44Q7744=SVCV;V:[:[\]:^:^^BGDMMRWT']-C-CCD	RWHXHX\cHcd$v,E
5zzQRaRy%9UDGBBH%%E)CII&&E$K;e$$r   c                   %&'() |                      |t          j                  } | j        \  %&'t          j        ||t          j                  }t          j        dt
          j                  t          j        dt
          j                  f}%dk     s&dk     s'dk     r|S | |k    )%&')fddD             }|d         |d         z  |d         z  |d         z  |d	         z  |d
         z  |d         z  |d         z  }|d         |d         z  |d         z  |d         z  |d	         z  |d
         z  |d         z  |d         z  }	||	 z  }
t          |
	                                          }|dk    r|S ~~	~|

                    d          }t          j        g dg dg dg dg dg dg dg dg|          }|                     t          j                  }t          j        ddgddgdd	gddgdd
gddgddgddgd	d
gd	dgd
dgddgg|          }|d d df         |d d df         }}||         ||         }}d}g }t          d||          D ]d}||||z   d d d f         |d          z   }| |d         |d         |d         f         }||k    }|d d |f         |d d |f         }}|d d |f         |d d |f         k    d                              t          j                  }||z
  }t          j        |                                dk    ||z
  |z  t          j        |d                                        dd          }t          j        |||d                   }|                    ||z  	                    d          |	                    d                              d          z             ft)          |          dk    rt          j        |d          n|d         } ||                     t          j                  | z   |z  z   }!~~ ~t          j        %dz
  &dz
  'dz
  fd t          j        |!          }"t          j        |t          j        |!          |"|
<   ~
g ((fd"}#)d%dz
  d&dz
  d'dz
  f         }$ |#|$)d%d&dz
  d'dz
  f         k    |$|"d d d&dz
  d'dz
  f         |"d d d&dz
  d'dz
  f         |"d d d&dz
  d'dz
  f         |"d d d&dz
  d'dz
  f                    )d%dz
  d&dz
  d'dz
  f         }$ |#|$)d%dz
  d&d'dz
  f         k    |$|"d%dz
  d d d'dz
  f         |"d%dz
  d d d'dz
  f         |"d%dz
  d d d'dz
  f         |"d%dz
  d d d'dz
  f                    )d%dz
  d&dz
  d'dz
  f         }$ |#|$)d%dz
  d&dz
  d'f         k    |$|"d%dz
  d&dz
  d d f         |"d%dz
  d&dz
  d d f         |"d%dz
  d&dz
  d d f         |"d%dz
  d&dz
  d d f                    (s|S |!                                                                                    t
          j                  t          j        (d                                                                                              t
          j                  fS )#Nr  r   rU   r1   c                 ^    g | ])\  }}}||z   d z
  ||z   d z
  ||z   d z
  f         *S )r$   rR   )r4   r  r  ozr  r  r  insides       r   rT   z!_surface_nets.<locals>.<listcomp>n  se     K K Kr2r "R"Wq[."R"Wq[."R"Wq[.@A K K Kr   )r   r   r   r  r  r$   r$   r   r   r   r$   r$   r   r$   r   r$   r$   r$   r$   r$   r   r$   rU   r6   r9  r.   r  Fr  r5  r  r  r6  r7  r8  r9  r:  r  i   rf  re  rd  r  r   r   rG   rE   r1  c                    | |dk    z  |dk    z  |dk    z  |dk    z  }t          |                                          sd S ||         ||         ||         ||         ||         f\  }}}}}t          j        |||          t          j        |||          }}	                    t          j        |||gd                     	                    t          j        |||gd                     d S r  )r  r  r   r   r  r   )
crsolr`   ro  r  r   r  p2p4r  s
            r   emitz_surface_nets.<locals>.emit  s    a1fa(AF3qAv>EIIKK   	FE(AeHah%#e*L1aCS!Q''S!Q)?)?BU[!RQ//000U[!QQ//00000r   )r  r   rm   r)   r;  rl   r   r>  r&   rk  r  r  rt   r   r+  r  r  lerpr  r   r8   r  r  r   r?  ri   rj   rk   )*r  rB  r  originr  origin_tru   cs8any_inall_inry  r  acoffsofffedgese0e1oe0oe1csteplocr  cicvalcslr  r  r,  r)  r  ptslocalr  vidr@  r`   r  r  r  r  r4  s*                                        @@@@@r   _surface_netsrW  b  s@    &&em&
4
4CJBBvfEMJJJHXfbj))28FBH+E+EFE	Avva266 E\FK K K K K K KJK K KC Vc!f_s1v%A.Q7#a&@3q6ICPQFRFVc!f_s1v%A.Q7#a&@3q6ICPQFRFvgF	VZZ\\		B	Qww 			'	'B<IIIyyy)))"IIIyyy)))EMSU U UD775=!!DL1a&1a&1a&1a&1a&1a&a&1a&1a&1a&1a&1a&JRXZ Z ZE111a4[%1+BBxbCE
CAr5!! 	G 	G2:tQQQ&'$t*42f:r&z2f:56emaaaed111b5kBQQQUs111b5z)9588GGRK		e+ebjE-A5?SXZ]C^C^__eefgijkkjc1Y<00

C%K$$Q''%))A,,*@*@*E*EEFFFF!$SAEIc13q6Eem,,u4==EUB
*b1fb1fb1f-rV
T
T
TC,rVDDDCK E1 1 1 1 1 	qax261R!V8+,ADfQrT1R!V8QrAvX-.	.	QQQ"q&!BF("	#SAb1fHaQh)>%?	QQQ"q&!BF("	#SAb1fHaQh)>%?A A A 	qax261R!V8+,ADfQrAvXqtQrAvX-.	.	QrAvXqqq!BF("	#S26111aQh)>%?	QrAvXqqq!BF("	#S26111aQh)>%?A A A 	qax261R!V8+,ADfQrAvXqax2-.	.	QrAvXqax"	#S261R!V8QQQ)>%?	QrAvXqax"	#S261R!V8QQQ)>%?A A A  99;;%%bj1159UA3F3F3J3J3L3L3R3R3T3T3[3[\^\d3e3eeer   rz  c                 8   t          j        | |          \  }}|                    t           j                  }|d d         |dd          z   dz  }t          j        |          }t          j        ||z            }|d         |z
  }|t          j        |dk    |d          z  }|d         |z
  t          j        |dk    |d          z  }	||z  ||	z
  dz  z  }
d|
|dk    |dk    z  <   t          |t          t          j        |
                                       S )	N)binsrE   r$   r   r   rG   r1   r   )	rl   	histogramrk   r   cumsumr   r   r&   r  )r  rY  histrJ  centersr~  r  wfmbmfvar_bs              r   _otsu_levelrb    s   ,vD111KD%;;rz""DSbSzE!""I%,G
	$A	4'>	"	"B	
2B	bhq1ua%%	%B
R&2+"q&"c22	2BFb2g!^#E"&E16bAg
RYu--../000r   r   (\c                    |dk    s&t          |           dk    st          |          dk    r| S t          |           }t          j        |d d ddgf         |d d ddgf         |d d ddgf         gd          }t          j        ||d d d d df         gd          }t          t          j        t          |          t          j                  |d d df         |d d df         ff||f                                          }d|j        d d <   t          j        t          j	        |
                    d                                                    dd                               t          j                  d d d f         }|                     t          j                  }	t          t          |                    D ],}
||fD ]%}|	t          j        |          ||	z  |z  |	z
  z  z   }	&-t          j        |	          S )Nr   r$   r1   rE   r!  rG   )r8   rl   rx   r   r  rm   tocsrr   rr   r   rk  ravelrk   rt   r&   r  )r  r  itersr  r  r  r.  adjdegrp  r  facs               r   _taubin_smoothrk    s    zzSZZ1__E

a	UB
aaa!Qi(%Aq6	*:E!!!aV)<LMqQQA
1QQQ"W:**A
bgc!ffbj11AaaadGQqqq!tW3EFrSUh
W
W
W
]
]
_
_CCHQQQK
'"*SWWQZZ((..00#t
<
<
C
CBJ
O
OPQPQPQSWPW
XCRZ  A3u:: < <9 	< 	<CBJsOOa3':;;AA	<"""r   c                 x   |j         \  }}}t          j        |t          j                  }	t          j        |t          j                  }
|	|
z
  |z  }t          j        |||gt          j                  }d|z  |dz
                      d          z  dz
  }t          j        |d d df         |d d df         |d d df         gd          d         fd	} ||           } ||d
                   }||                    d          z  j                                        	                                S )Nr  r5  r$   rG   r1   r   rE   r  c                     |                                                    dddd          d                                          }t          j        j                            |ddd          }|dd d ddd d f         S )	NrU   r   r$   r1   bilinearborderT)rl  padding_modealign_corners)r  r  r   r   rZ  r[  grid_sample)rp  inpor  grids      r   sampz(_sample_vertex_colours_gpu.<locals>.samp  sy    dd6ll""1aA..t4::<<H++CJU]mq+rrAAAq!QQQr   r  rH   )
r)   r   r;  rm   r  r   r   r  ri   rj   )r  r  r  rB  r  r  r  r  r  r  orgr  r-  r    rv  numdenru  s        `           @r   _sample_vertex_colours_gpurz    sI    JBB	vU]	C	C	CB
/&u}
E
E
EC
s(e	B<RV5=IIIDbD1H'',,,s2A;!!!Q$111a4!AAAqD'2B778HID            $v,,C
$wy!
"
"C#--%%%(,,..44666r   c                 8  %&' |
|
nd 't          | |          }| j        |d |f                             |	t          j                  }| j        |d |f                             |	t          j                  }| j        |d |f                             |	t          j                  }| j        |d |f                             d                              |	t          j                  }| j	        |d |dd d f                             |	t          j                  t          z  dz                       dd          }||k    }||         ||         ||         ||         ||         f\  }}}}}|j        d         dk    rd S t          ||||||||	|'fd
  
        \  }}}}}t          j                            |	           o:t          j                            |	          d	|                                z  d
z  k    }|r?|                                |                                                                }}d x%}n|                                                                                    t.          j                  %|                                                                                    t.          j                  }~~ 'd           t1          |                                          t1          |                                          }}|||dz  k             }|                                dk    rd S t3          t5          t7          |                                                                          |z  |d||z
  z  z             |d||z
  z  z
            }|	}t          j                            |	          sct          j                            |	          d	|                                z  d
z  k     r(t          j        d          }|                                }t;          |||||          \  } }!~ 'd           |dk    r(t=          |!          dk    rt?          | |!||	          \  } }!t=          |           dk    st=          |!          dk    rd S tA          | |!|          }  'd           |rtC          ||| |||	          }"nr| |z
  |z  j"        &t/          j#        %&fdtI          d          D             d          }#tK          |&dd          }$|#t/          j&        |$dd           d d d f         z  }" 'd           t/          j&        |"dd          }"t/          j'        |"dk    |"dz  |"dz   dz  dz                                t.          j                  }"t/          j(        | t/          j)        g dt.          j                  z            } t          j*        |           t          j*        |!          t          j*        |"          fS )Nc                      d S r   rR   )r  s    r   r   z#_gaussian_to_mesh.<locals>.<lambda>  s    D r   r  rE   r   r   r$   c                       d| z            S )Ng      ?rR   )r   reps    r   r   z#_gaussian_to_mesh.<locals>.<lambda>  s    CCPTWXPXMM r   )r  r  r.   r6   皙?rt  rF   ri   g?gffffff?c                 F    g | ]}t          d |f         dd          S ).r$   nearestr  rl  )r   )r4   r   	colvol_npcoordss     r   rT   z%_gaussian_to_mesh.<locals>.<listcomp>+  s5    nnn`a	#q&(96QZ[[[nnnr   rU   r  r  rH   rG   r   r   r   r   r   r  ra   )+r*   r(   r  r   rm   r|   r}   r~   rq   r   r   r  r)   r  r  r  r+  r,  r=   ri   halfrj   rk   rl   r   rJ   r  rb  r  rW  r8   r/  rk  rz  r  r   rt   r   rr   r   r  r  r  )(r    r!   r  r  taubin
level_biasmin_componentmin_opacityr  r  r  r!  r   r   r-  rX   r   rq  r  r  r  rB  r  
colour_gpu
colvol_cpucolnorm_cpu
colnorm_npvminvmaxoccrB  sn_devr  r  r   rx  ry  r  r  r~  s(                                        @@@r   _gaussian_to_meshr    s    *((C
Aq//C
+a#g

!
!u}
!
E
ECHQW  em DDE;q$3$w""&"FFDk!TcT'"**2..11u}1UUG44C4AAA!!u}!EEKcQ
X
XYZ\]
^
^Ck!D%(YdT$ZQUX[\`Xa%a"Cgs
y|qt*8gudTWY\^dflGTBYBYBYBY+[ +[ +['C&% +99&AAA  KeF\FlFlmsFtFtwx{~  |E  |E  |G  |G  xG  JK  xK  GKJ >"(**,,0B0B0D0DK
!%%	JJJJLL&&((//
;;	[[]]((**11"*==
CIIIswwyy!!5#3#3$D
cD4K
 C
yy{{at K		 1 122Z?PTW[P[H\A\]]ttd{++- -E
 F!//77 E<R<b<bci<j<jmnqtqzqzq|q|m|  @A  nA  =A  =Ae$$ggii eUFFCCLE5CIIIqSZZ!^^(}fMMu
5zzQ#e**//t 5%00ECHHH
  6([%QVX^__6>U*-hnnnnnejklememnnnprssj&	JJJBGCt,,QQQW55CHHH '#q!

C
(3'>3;#+1F30N
O
O
V
VWYWa
b
bC  2C2C2C2:)V)V)V!VWWEU##U%5e%<%<e>Ns>S>STTr   c                   J    e Zd Zed             Zedej        fd            ZdS )SplatToMeshc                    t          j        ddg dddt           j                            d          t           j                            ddd	d
dd          t           j                            ddddd          t           j                            dddddd          t           j                            dddddd          t           j                            d d!dd"d#dd$%          t           j                            d&d'dd(ddd)%          t           j                            d*dd(d+d,d-          gt           j                            d./          g0          S )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  ry  i   r2   zqDensity-grid resolution along the longest axis. Higher = finer surface, more VRAM/time (grows with resolution^3).rB  r  r9  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.r>  smoothr   <   TzTaubin mesh-smoothing iterations. Smooths the surface without shrinking it (volume-preserving), unlike blurring the density. 0 = raw surface.)r:  rJ   r  r@  r  rB  r  r/   r5  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.r?  r  g{Gz?rG   z2Ignore gaussians fainter than this before meshing.r  rA  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  rI  rJ  Meshr  r  s    r   r  zSplatToMesh.define_schema<  s   y!2dddHw''\3BCb&Q  R R XqaQ&\  ] ] XqaRD&j  k k w#D(c  d d _cqfSU`d&n  o o }dSWbf'[  ] ]#TW(r  s s)2 W^^^889? 
  
  
  	
r   r"   c	                    t           j                                        }	|j        j        d         }
dt           j                            |
z            g g g }}}t          |
          D ]}|z  ffd	}t          ||||||||||	|          }|^t          j
        d|           t          j        d          t          j        dt          j                  t          j        d          }}}n|\  }}}|                    |           |                    |           |                    |                               |dz   z             t!          j        t%          |||d	                    S )
Nr   r~  c                                          |t          t          t          | d          d          z            z             S )Nr/   rG   )update_absoluter&   rJ   r  )r   rI  ra  precs     r   r   z%SplatToMesh.execute.<locals>.<lambda>i  s=    $*>*>tc#cRSUXkk[^J_J_bfJfFgFg?g*h*h r   zBSplatToMesh: splat %d produced no surface; emitting an empty mesh.r1  ra   r$   T)colorsunlit)r  r  r  r(   r)   rV  rX  rt   r  r  r  r   r   r>  r  r  r   r  r   )r  r  r  r  r  rB  r  r  r  r  ro  verts_lfaces_lcolors_lr!   rq  r  rp  r   r   ra  r  s                       @@r   r  zSplatToMesh.execute`  s   '88::O!!${&&q4x00%'R(q 	1 	1A !DhhhhhhB#E1j&&%Q^`kmz  }C  EG  H  HC{ dfghhh+f--u{6/U/U/UW\WbciWjWja11aNN1NN1OOA  !a%40000}5gwx_cdddeeer   Nr  rR   r   r   r  r  ;  s`        !
 !
 [!
F fmomz f f f [f f fr   r  c                   L    e Zd Zedeeej                          fd            ZdS )GaussianExtensionr"   c                 j   K   t           t          t          t          t          t
          t          t          gS r   )r  r  r7  ri  r  r  r  r  )selfs    r   get_node_listzGaussianExtension.get_node_listy  s#      }k;K^z;8 	8r   N)	r  r  r  r   rv   typer   	ComfyNoder  rR   r   r   r  r  x  sE        8T$r|*<%= 8 8 8 X8 8 8r   r  c                  "   K   t                      S r   )r  rR   r   r   comfy_entrypointr    s      r   )rG   r/  r/   r  )rG   r/   r4  r   )rz  )r   rc  )ir   r  ri  r   ior   rj   rl   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<  r9   r   r:   rB   r   r   r   r   r   r   r   r   r   r   r   r   r  r;  r<  r   r   r+  r/  rb  r  r  r  r  r  r  r  r  r  r  r  r  r&  r.  r?  rE  rK  rU  r_  r5  r7  ri  r  r  r  rv   r  r  r  float16r  r   r  r/  rW  rb  rk  rz  r  r  r  r  rR   r   r   <module>r     s                  & & & & & & [ [ [ [ [ [ [ [ [ [ # # # # # # 5 5 5 5 5 5         6 6 6 6 6 6 6 6 6 6 ? ? ? ? ? ?      [ [ [_ _ _U U U U U U U
A3 A5u!45 A A A A     7 7 7 7 7D  #  +75 +7 +7 +7 +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 T !r22 C C CD D D4(e 4( 4( 4( 4(n	; 	; 	; 	; 	;8J 8J 8J 8J 8Jv56e 56 56 56 56p 0:O5>QS S 	Vu 	V 	V 	V 	V 	V	)ek 	)c 	) 	) 	) 	)! ! !	 	 	, , ,= = =(N N N N NBL N N N@$$ $$ $$ $$ $$BL $$ $$ $$N  ) ) )4$ $ $T T T TT T T T` ` `h h h$   GNO O O ODWD WD WD WD WD", WD WD WDtF} F} F} F} F}r| F} F} F}R4" 4" 4" 4" 4"R\ 4" 4" 4"n+ + + + +BL + + +0  $S $S $S $S $S $SN3 3 3 3 3 3 3 30
9 
9 
9 WZaept"]/k /k /k /kd  (@ @ @<% % % %BPf Pf Pff1 1 1 1# # # #$7 7 7(NU NU NU NU NU NUb:f :f :f :f :f", :f :f :fz8 8 8 8 8 8 8 8 1      r   