o
    i/                     @   s  d dl Z d dl mZ d dlmZmZ d dlZd dlmZmZ d dl	m	Z	 d dl
mZ d dlmZmZmZmZmZmZ d dlmZmZmZ d d	lmZ zd d
lmZ W n ey`   ed Y nw 				d&dejdejdeeef dedeej de deded deejejf fddZ!				d'dedejdejdeeef dee d ed! d"eeeef  d#ee  deejejf fd$d%Z"dS )(    N)isqrt)LiteralOptional)	rearrangerepeat)tqdm)	Gaussians)interpolate_extrinsicsinterpolate_intrinsicsrender_dolly_zoom_pathrender_stabilization_pathrender_wander_pathrender_wobble_inter_path)affine_inverseas_homogeneousget_fov)logger)rasterizationzDependency `gsplat` is required for rendering 3DGS. Install via: pip install git+https://github.com/nerfstudio-project/gsplat.git@0b4dddf04cb687367602c01196913cde6a743d70T   RGB+D
extrinsics
intrinsicsimage_shapegaussianbackground_coloruse_shnum_view
color_mode)r   zRGB+EDreturnc           0      K   s  |j }	|j}
|j}|j}|j}| j\}}}|d u r(ttg dd|d	|}|r?|j\}}}}t
|d }t|d }n	|d  }|\}}t|jdd\}}d|  }d|  }|d	|  }|d	|  }|  }g }g }g }|| }d
d } t|D ]}!ttdd|d gdd|d gg dgd|d	|	}"||||! |"d d ddf< ||||! |"d d ddf< | |	|!}#| |
|!}$| ||!}%| ||!}&| ||!}'t|d|d|! }(t|d|d|! })t|#|%|$|&|'|(|"|)|||d|r|nd d\}*}+},|*d jdd}-t|*dd df djdd}.|,d jdd}/z|,d   W n
 ty4   Y nw ||. ||- ||/ qt|t|fS )N)        r   r   zc -> b c)br   zb g xyz n -> b g n xyzdimg      ?   c                 S   s   | | S )N )Z	full_attridxr%   r%   F/data/cameron/da3_repo/src/depth_anything_3/model/utils/gs_renderer.pyindex_i_gs_attra   s   z$render_3dgs.<locals>.index_i_gs_attrr          @)r   r   r   zi j -> v i jv(b v) ... -> b v ...F)meansZquatsscales	opacitiescolorsZviewmatsZKsZbackgroundsZrender_modewidthheightpackedZ	sh_degree).r!   .   zv h w c -> v c h wradiiZmeans2d)r-   r.   	rotationsr/   	harmonicsshaper   torchtensortor   r   
contiguoussqueezesigmoidr   unbindtanfloatrangereshaper   retain_grad	Exceptionextendstack)0r   r   r   r   r   r   r   r   kwargsZgaussian_meansZgaussian_scalesZgaussian_quatsZgaussian_opacitiesZgaussian_sh_coefficientsr    _ndegreeZshshwfov_xfov_yZ	tan_fov_xZ	tan_fov_yZfocal_length_xZfocal_length_yZview_matrixZ
all_imagesZ	all_radii
all_depthsZbatch_scener(   iKZi_meansZi_scalesZi_quatsZi_opacitiesZi_colorsZ
i_viewmatsZi_backgroundsZrender_colorsZrender_alphasinfodepthimager5   r%   r%   r'   render_3dgs,   s   








rV      smoothF	gaussians
chunk_sizetrj_mode)originalrX   interpolateinterpolate_smoothwander
dolly_zoomrF   wobble_interinput_shapeenable_tqdmc           +      K   s~  t t|}	|d ur|\}
}n|\}
}|  }|ddd d f  |  < |ddd d f  |
  < |jd dkrB|dv sBJ dd.dd}|d	krQ|	}|}n|d
kr]||	}|}n|dv rd}|	jd d | }|dkr}tdd|	jd d  }|dk rtdd|	jd d  }|dkrtjdd|tj|	j	d}t
tj|d  d d }g }g }t|	jd D ]\}g }g }t|	jd d D ]<}|t|	||f |	||d f ||dkrdndd   |t|||f |||d f ||dkrdndd   q|t| |t| qt|}t|}n|	}|}|dv r,||}|dkr|	jd dks=J d|jd d }t|d|f |d|f |
|tdtd|d dd\}}t|d|f |d|f |
|tdtd|d d\}}tj|d d d |f |d|d|d d |d f gdd}tj|d d d |f |d|d|d d |d f gdd}nj|dv r|dkrt}ddi}nt}ddd}g }g }t|	jd D ]#}||	|df ||df f|
|d |\}}|| || qt|}t|}n|d!kr t|	|d"d#d$\}}ntd%| d&|jd d \} }!t |}"|d u r<|!}t|!|}g }#g }$ttt|!| d'| d(d)D ]W}%t|%| }&t|%d | }'|"d d |&|'f jd }(td/t|"d d |&|'f d*t|d d |&|'f d*|| |(d+|\})}*|#t|)d,|(d- |$t|*d,|(d- qUtj|#dd}#tj|$dd}$|#|$fS )0N.r   r   )r_   r`   z>Please set trj_mode to 'wander' or 'dolly_zoom' when n_views=12   c              
      s^   zt j fdd| D dd}W |S  ty. } ztd| d | }W Y d }~|S d }~ww )Nc                    s   g | ]}t | qS r%   )r   ).0c2w_ik_sizer%   r'   
<listcomp>   s    zRrun_renderer_in_chunk_w_trj_mode.<locals>._smooth_trj_fn_batch.<locals>.<listcomp>r   r"   z*[DEBUG] Path smoothing failed with error: .)r9   rG   rE   print)Zraw_c2wsrh   Zsmooth_c2wser%   rg   r'   _smooth_trj_fn_batch   s   z>run_renderer_in_chunk_w_trj_mode.<locals>._smooth_trj_fn_batchr\   rX   )r]   r^   rF   rW   i     0   r$   )dtypedevice)r^   rF   rF   z0extend only supports for batch_size=1 currently.$   <   g      8@)rL   rM   
num_framesmax_disp)rL   rM   rt   r"   r_   ru   g      >@r)   )ZD_focusru   )rL   rM   ra   
   r4   )	cam2worldintr_normed	inter_lenZn_skipz
trj mode [z] is not implemented.zRendering novel viewsF)descdisableleavezb v ... -> (b v) ...)r   r   r   r   r   r,   r*   )rd   r%   )r   r   clonedetachr8   maxr9   linspacefloat32rq   cospirB   appendr	   r
   catrG   r   minr   	unsqueezer   rE   r   mathceilintrV   r   )+rY   r   r   r   rZ   r[   rb   rc   rH   rw   in_hin_wrx   rm   Ztgt_c2wZtgt_intrry   	total_lentZ	tgt_c2w_bZ
tgt_intr_bb_idxcur_idxZmid_idxZc2w_wdZintr_wdZc2w_dzZintr_dzZ	render_fnextra_kwargsrf   Zintr_irI   r+   Ztgt_extrZ
all_colorsrP   	chunk_idxsrl   Z
cur_n_viewcolorrT   r%   r%   r'    run_renderer_in_chunk_w_trj_mode   s*  













	
	










r   )NTr   r   )rW   rX   NF)#r   r   typingr   r   r9   einopsr   r   r   depth_anything_3.specsr   Z)depth_anything_3.utils.camera_trj_helpersr	   r
   r   r   r   r   depth_anything_3.utils.geometryr   r   r   depth_anything_3.utils.loggerr   Zgsplatr   ImportErrorwarnTensortupler   boolrV   r   r%   r%   r%   r'   <module>   s    


u

