o
    ۷i5                     @   sD   d dl mZ d dlZd dlZeG dd dZdedefddZdS )	    )	dataclassNc                   @   s   e Zd ZU dZejed< ejed< ejed< ejed< eed< eed< eed< eed	< e	e ed
< dd Z
dd Zdd ZdejfddZedd ZdejdejfddZdededd fddZdS )DifferentiableProjectiveCamerazE
    Implements a batch, differentiable, standard pinhole camera
    originxyzwidthheightx_fovy_fovshapec                 C   s   | j jd | jjd   kr | jjd   kr | jjd ks#J  J | j jd | jjd   krH| jjd   krH| jjd   krHdksKJ  J t| j jt| jj  krpt| jj  krpt| jj  krpdkssJ  J d S )Nr            )r   r   r   r   r   lenself r   W/home/ubuntu/vllm_env/lib/python3.10/site-packages/diffusers/pipelines/shap_e/camera.py__post_init__%   s   FPTz,DifferentiableProjectiveCamera.__post_init__c                 C      t tj| j| jgtjdS N)dtype)torch
from_numpynparrayr   r	   float32r   r   r   r   
resolution*      z)DifferentiableProjectiveCamera.resolutionc                 C   r   r   )r   r   r   r   r
   r   r   r   r   r   r   fov-   r   z"DifferentiableProjectiveCamera.fovreturnc                 C   s<   t | j| j }t j|| j t j|| jddgdd}|S )z>
        :return: coords of shape (width * height, 2)
        trunc)rounding_moder   axis)r   aranger	   r   stackdiv)r   pixel_indicescoordsr   r   r   get_image_coords0   s   z/DifferentiableProjectiveCamera.get_image_coordsc                 C   sh   | j ^}}tt|}|  }t|d|| g|j }| |}|	||| j
 | j dd}|S )Nr   r   r   )r   intr   prodr+   r   broadcast_to	unsqueezeget_camera_raysviewr	   r   )r   
batch_sizeinner_shapeinner_batch_sizer*   raysr   r   r   camera_rays>   s   

z*DifferentiableProjectiveCamera.camera_raysr*   c                 C   sF  |j ^}}}|dksJ || jj d ksJ ||dd}|  }|  }| |d  d d }|t|d  }||dd}| j|dd| j	|dd|d d d d d df   | j
|dd|d d d d dd f   }	|	|	jddd }	tjt| j|dd||	j d dg|	gdd}
|
j|g|ddR  S )	Nr   r   r   r   T)dimkeepdim)r8   )r   r   r1   r   r    floatr   tanr   r   r   normr'   r.   )r   r*   r2   r   n_coordsflatresr    fracs
directionsr5   r   r   r   r0   K   s.   (("z.DifferentiableProjectiveCamera.get_camera_raysc              
   C   s@   || j  || j ksJ dt| j| j| j| j||| j| jdS )zf
        Creates a new camera for the resized view assuming the aspect ratio does not change.
        z#The aspect ratio should not change.)r   r   r   r   r   r	   r
   r   )	r	   r   r   r   r   r   r   r
   r   )r   r   r	   r   r   r   resize_imageh   s   z+DifferentiableProjectiveCamera.resize_imageN)__name__
__module____qualname____doc__r   Tensor__annotations__r,   r:   tupler   r   r    r+   propertyr6   r0   rB   r   r   r   r   r      s&   
 




r   sizer!   c           
      C   s.  g }g }g }g }t jddt j ddD ]J}t t |t |dg}|t t |d  }| d }t t |t | dg}t ||}	|	| |	| |	|	 |	| qt
tt j|dd tt j|dd tt j|dd tt j|dd | | d	d	d
t|fd	S )Nr   r      )numg         g        r$   gffffff?r   )	r   r   r   r   r   r	   r
   r   r   )r   linspacepir   sincossqrtsumcrossappendr   r   r   r'   r:   r   )
rK   originsxsyszsthetar   r   r   r   r   r   r   create_pan_camerasy   s2   




r\   )dataclassesr   numpyr   r   r   r,   r\   r   r   r   r   <module>   s   c