o
    ߥil=                     @   s`   d dl Z d dlmZ d dlm  mZ ddlmZmZm	Z	 ddl
mZmZ G dd dejZdS )    N   )RenderingNetwork
SDFNetworkSingleVarianceNetwork)extract_geometry
sample_pdfc                       sn   e Zd Z fddZ		dddZ	ddd	Zd
d ZdddZ					dddZ				dddZ	  Z
S )SurfaceRendererc                    s   t    || _|| _tdi | jd | j| _tdi | jd | j| _t	di | jd | j| _
t	di | jd | j| _| jd d | _| jd d | _| jd d | _| jd d	 | _| jd d
 | _d S )Nsdf_networkvariance_networkrendering_networklight_networkneus_renderer	n_samplesn_importance	n_outsideup_sample_stepsperturb )super__init__confdevicer   tor	   r   r
   r   color_networkr   r   r   r   r   r   )selfr   r   	__class__r   f/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/surface_recon_common/renderer.pyr      s0   
zSurfaceRenderer.__init__        cudac                    s   t |||| fdd|dS )Nc                    s    j |  S N)r	   sdf)ptsr   r   r   <lambda>.   s    z2SurfaceRenderer.extract_geometry.<locals>.<lambda>)
resolution	threshold
query_funcr   )r   )r   	bound_min	bound_maxr%   r&   r   r   r#   r   r   #   s   
z SurfaceRenderer.extract_geometryNc              	   C   s  |j \}}|ddd f |dd df  }	t|	t|g|	dd df j gd}	||	d  }
|d d d d d f |d d d d d f |
dd d d f   }tjj|dddddd	}tj|| d| gdd
}|d d d d d f ||d}|ddt	| j
dk }|dd}|||\}}dtt||| |	  }|||}|ttt|dgd| d gddd d d df  }|||d}|d d d d d f | jdd
}|d ur||d|jddd   }||||dS )N.r         ?   Torddimkeepdim      ?g    _Br/      r   Hz>r/   r0   )colorsampled_coloralphaweights)shapetorchcatTensorexpandlinalgnormclipreshapeintr   expFsoftpluscumprodonessum)r   rays_orays_dz_valssample_distnerfbackground_rgb
batch_sizer   dists
mid_z_valsr"   dis_to_centerdirsdensityr7   r8   r9   r6   r   r   r   render_core_outside1   sZ   
 *  "z#SurfaceRenderer.render_core_outsidec              	   C   s0  |j \}}|d d d d d f |d d d d d f |dd d d f   }	tjj|	dddd}
|
d d d df dk |
d d dd f dk B }|||}|d d d df |d d dd f }}|d d d df |d d dd f }}|| d }|| || d	  }tjt|dg| j|d d d df gdd
}tj	||gdd
}tj
|ddd\}}|dd| }|| }||| d  }||| d  }t|| }t|| }|| d	 |d	  }|ttt|dg| jd| d gddd d d df  }t|||d| jd }|S )N.r,   r*   Fr-   r1   r   r+   h㈵>r2   r5   g     @r   r4   T)detr   )r:   r;   r?   r@   rB   r<   zerosr   r   stackminrA   sigmoidrG   rH   r   detach)r   rJ   rK   rL   r!   r   inv_srP   r   r"   radiusinside_sphereprev_sdfnext_sdfprev_z_valsnext_z_valsmid_sdfcos_valprev_cos_val_distprev_esti_sdfnext_esti_sdfprev_cdfnext_cdfr8   r9   	z_samplesr   r   r   	up_samplea   sN   
>0**(zSurfaceRenderer.up_sampleFc                 C   s   |j \}}|j \}	}
|d d d d d f |d d d d d f |dd d d f   }tj||gdd}tj|dd\}}|sy| j|dd||
}tj||gdd}t|d d d f |||
 d}|d}|||f |||
 }||fS )N.r*   r2   r3   )	r:   r;   r<   sortr	   r!   rB   aranger>   )r   rJ   rK   rL   
new_z_valsr!   lastrP   r   rh   r   r"   indexnew_sdfxxr   r   r   
cat_z_vals   s0   

&
zSurfaceRenderer.cat_z_valsc           5      C   s  |j \}}|ddd f |dd df  }t|t|g|dd df j | jgd}||d  }|d d d d d f |d d d d d f |dd d d f   }|d d d d d f |j }|dd}|dd}||}|d d d df }|d d dd f }||	 }|||||||d}|||||||d}|| }|t
ddgd d d df dd}||| d}|| jddd	}t| d d d
|  }|t| |   }|||dd d  }|||dd d  } t| | }!t|| }"|!|" }#|!}$|#d |$d  ||dd
}%tjj|dddd||}&|&d
k   }'|&dk   }(|
d ur|%|' |
d d d |f d
|'   }%tj|%|
d d |d f gdd}%||'d d d d d f  })|d d d |f d
|' d d d d d f  }*|)|* }tj||d d |d f gdd}ttj|dg|%jdd
|% d gd}+|%t|+dd d d df  },|,jddd}-||,d d d d d f  jdd}.|d ur|.|d
|-   }.||,d d d d d f  jdd}/||, jdd}0|	d ur=|d d d d d f |d d d d d f |	dd d d f   }1|1dd}1||1d d d df }2nd }2tjj|||dddd}3|3d
 d }4|(|4  }4|4|( d  }4|.|/|0||2||||dd
| ||,|$|||4|'dS )N.r   r*   r+   r3   gư>g    .AT)r0   r1   rW   r   r,   r-   g333333?r2   )r   r4   r5   )r.   r/   )r6   albedodepthr!   	sdf_depthrQ   	gradientss_valrR   r9   cdfgradient_errorr`   )r:   r;   r<   r=   r>   r   r   rB   gradientsqueezerY   rA   rI   rE   relur\   r?   r@   floatr]   rH   rG   )5r   rJ   rK   rL   rM   r	   deviation_networkr   r   depth_zbackground_alphabg_sampled_colorrO   cos_anneal_ratiorP   r   rQ   rR   r"   rT   sdf_nn_outputr!   feature_vectorr{   sampled_albedosampled_lightr7   r^   true_cositer_cos_p1iter_cosestimated_next_sdfestimated_prev_sdfrl   rm   pcr8   pts_normr`   relax_inside_sphereforeground_colorbackground_colorbetar9   weights_sumr6   rx   ry   	pts_depthrz   gradients_normr~   r   r   r   render_core   s   
  &*
" "
"
*
zSurfaceRenderer.render_corer*   c	           &      C   s  t |}	d| j }
tdd| j| j}||| |d d d f   }d }| jdkr;dd| jd   }td|| j}| j}| j}|dkrG|}|dkrt|	dg| jd }||d | j  }| jdkrd|ddd f |dd d	f   }t	||dd	d f gd	}t	|dd df |gd	}t|	|j
d	 g}|d d d f || d d d f |  }| jdkr|tj|d	gd
 d| j  }d }d }| jdkrFt c |d d d d d f |d d d d d f |dd d d f   }| j|d	d|	| j}t| jD ]'}| ||||| j| j dd|  }| j||||||d | jkd\}}qW d    n	1 s;w   Y  | j| j }| jdkrptj	||gd	d}tj|d	d\}}| ||||
| j}|d }|d }| j||||
| j| j| j| j|||||d}|d }|d }|d } |d }!|d }"|"jd	dd}#|d }$|d |	|jd	dd}%||| |!|%|d |#tj|"d	ddd |$|"|d |d |d d S )!Ng       @r   r1   r   gMbP?r   r+   .r*   )dimsr3   @   r,   )rs   r2   r7   r8   )r   rO   r   background_sampled_colorr   r6   rx   ry   rz   r9   Tr5   r{   r|   r}   rR   r~   r`   )
color_finealbedo_fine
depth_finerz   r|   cdf_fine
weight_sum
weight_maxr{   r9   rR   r~   r`   )lenr   r;   linspacer   r   r   r   randr<   r:   flipr   no_gradr	   r!   rB   ranger   ro   rw   rp   rV   rN   r   r
   r   r   rI   meanmax)&r   rJ   rK   nearfarr   perturb_overwriterO   r   rP   rM   rL   z_vals_outside
z_vals_endr   r   t_randmidsupperlowerr   r   r"   r!   irr   z_vals_feedrh   ret_outsideret_finer   r   r   rz   r9   r   r{   r|   r   r   r   render  s   	





2

zSurfaceRenderer.render)r   r   r    )F)NNNNr   )Nr*   Nr   )__name__
__module____qualname__r   r   rV   ro   rw   r   r   __classcell__r   r   r   r   r      s*    

0
"
 r   )r;   torch.nnnntorch.nn.functional
functionalrE   fieldsr   r   r   utilsr   r   Moduler   r   r   r   r   <module>   s   