o
    piN                     @   sP   d dl mZ 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 )
    )	dataclass)TupleNc                   @   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   _/home/ubuntu/SoloSpeech/.venv/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_coords1   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)r9   )r   r   r2   r   r!   floatr   tanr   r   r   normr(   r/   )r   r+   r3   r   n_coordsflatresr!   fracs
directionsr6   r   r   r   r1   L   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_imagei   s   z+DifferentiableProjectiveCamera.resize_imageN)__name__
__module____qualname____doc__r   Tensor__annotations__r-   r;   r   r   r   r!   r,   propertyr7   r1   rC   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_camerasz   s2   




r\   )
dataclassesr   typingr   numpyr   r   r   r-   r\   r   r   r   r   <module>   s   c