o
    im                     @   s  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	 d dl
mZmZ d dlmZ d dlmZ ded	ee fd
dZ			d&dededededededededee fddZdd Z							d'dededejdeded ed!ee d"ee d#ee dee fd$d%ZdS )(    )Path)OptionalN)	rearrangerepeat)PlyData
PlyElement)Tensor)	Gaussiansnum_restreturnc                 C   s   g d}t dD ]
}|d|  qt | D ]
}|d|  q|d t dD ]
}|d|  q+t dD ]
}|d|  q:|S )	N)xyznxnynz   Zf_dc_Zf_rest_opacityZscale_   Zrot_)rangeappend)r
   
attributesi r   B/data/cameron/da3_repo/src/depth_anything_3/utils/gsply_helpers.pyconstruct_list_of_attributes   s   
r   FTmeansscales	rotations	harmonics	opacitiespathshift_and_scalesave_sh_dc_onlymatch_3dgs_mcmc_devc	                 C   s  |r| | j ddj } |  jddd }	| |	 } ||	 }|   }|d }
|ddd f jdd}|red}d|d d	  d }t	t
|dd df d
|d djdd}dd t|dD }ndd t|rmdn|jd D }tj| jd |d}|    t
|    |
    |    |d    |    |g}|r|d n|r|d tj|dd}ttt||d d < |jjddd tt|dg| d S )Nr   )dimgffffff?.r   .   )	start_dimr      z... i -> ... (n i))nc                 S   s   g | ]
}|d vr|dfqS ))r   r   r   f4r   .0	attributer   r   r   
<listcomp>H   s
    zexport_ply.<locals>.<listcomp>)r
   c                 S   s   g | ]}|d fqS )r+   r   r,   r   r   r   r/   N   s    dtype).N)axisT)exist_okparentsvertex)medianvaluesabsquantilemaxdetachcpunumpyflattenr   torch
zeros_liker   shapenpempty
contiguouslogpopconcatenatelistmaptupleparentmkdirr   r   describewrite)r   r   r   r   r    r!   r"   r#   r$   scale_factorZf_dcZf_rest	sh_degreeZn_restZ
dtype_fullelementsr   r   r   r   
export_ply'   sR   	
rR   c                 C   s   t | d|   S )Nr'   )r?   rE   )r   r   r   r   inverse_sigmoidi   s   rS   r'         ?	gaussians	save_path	ctx_depthgs_views_intervalinv_opacityprune_by_depth_percentprune_border_gsc
                    sb  | j jd }
|
dksJ d|j\}| j }| j}| j}| j}|r(t| jn| j}|rTtj|tj	dt
d }t
d }dd d || || d d f< ntj|tj	d|d ur|dk r|}tj||jd d|ddddd}|d |kd}|@ d fd	d
}t||||||||||t||||	d	 d S )Nr   r'   z1must set batch_size=1 when exporting 3D gaussiansr0   g      ?)qr%   r&   c                    s6   t | d dd}|d d   d d    }|S )Nr   z(v h w) ... -> v h w ...)vhw)r   )elementZselected_elementrX   maskout_hout_wZsrc_vr   r   trim_select_reshape   s
   z.save_gaussian_ply.<locals>.trim_select_reshape)	r   r   r   r   r    r!   r"   r#   r$   )r   rA   r   r   r   rS   r    r?   r@   boolint	ones_liker9   view	unsqueezesqueezerR   r   )rU   rV   rW   r"   r#   rX   rY   rZ   r[   r$   b_Zworld_meansZ	world_shsZworld_rotationsZ	gs_scalesZgs_opacitiesZgstrim_hZgstrim_wZ	in_depthsZd_percentileZd_maskrf   r   rb   r   save_gaussian_plym   sH   &


ro   )FTF)FTr'   TrT   TF)pathlibr   typingr   r=   rB   r?   einopsr   r   Zplyfiler   r   r   depth_anything_3.specsr	   rh   rH   strr   rg   rR   rS   floatro   r   r   r   r   <module>   sx   	
B	
