
    biN                     Z    d dl mZ d dlmZ d dlZd dlZe G d d             ZdedefdZ	y)	    )	dataclass)TupleNc                   P   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 Z
d Zd Zdej
                  fdZed        Zdej
                  dej
                  fdZdededd fdZy)DifferentiableProjectiveCamerazE
    Implements a batch, differentiable, standard pinhole camera
    originxyzwidthheightx_fovy_fovshapec                    | j                   j                  d   | j                  j                  d   cxk(  r:| j                  j                  d   cxk(  r| j                  j                  d   k(  sJ  J | j                   j                  d   | j                  j                  d   cxk(  r@| j                  j                  d   cxk(  r#| j                  j                  d   cxk(  rdk(  sJ  J t        | j                   j                        t        | j                  j                        cxk(  rLt        | j                  j                        cxk(  r)t        | j                  j                        cxk(  rdk(  sJ  J y )Nr            )r   r   r	   r
   r   lenselfs    \/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/diffusers/pipelines/shap_e/camera.py__post_init__z,DifferentiableProjectiveCamera.__post_init__&   s	   vv||A$&&,,q/\TVV\\!_\HYHYZ[H\\\\\\vv||A$&&,,q/aTVV\\!_aHYHYZ[H\a`aaaaaa466<< C$5iTVV\\9JicRVR]R]RcRcNdihiiiiii    c                     t        j                  t        j                  | j                  | j
                  gt        j                              S N)dtype)torch
from_numpynparrayr   r   float32r   s    r   
resolutionz)DifferentiableProjectiveCamera.resolution+   s/    $**dkk)B"** UVVr   c                     t        j                  t        j                  | j                  | j
                  gt        j                              S r   )r   r   r   r    r   r   r!   r   s    r   fovz"DifferentiableProjectiveCamera.fov.   s/    $**djj)A TUUr   returnc                     t        j                  | j                  | j                  z        }t        j                  || j                  z  t        j
                  || j                  d      gd      }|S )z>
        :return: coords of shape (width * height, 2)
        trunc)rounding_moder   axis)r   aranger   r   stackdiv)r   pixel_indicescoordss      r   get_image_coordsz/DifferentiableProjectiveCamera.get_image_coords1   s^     T[[4::%=>

*		-7K 
 r   c                 f   | j                   ^}}t        t        j                  |            }| j	                         }t        j                  |j                  d      ||z  g|j                         }| j                  |      }|j                  ||| j                  z  | j                  z  dd      }|S )Nr   r   r   )r   intr   prodr0   r   broadcast_to	unsqueezeget_camera_raysviewr   r   )r   
batch_sizeinner_shapeinner_batch_sizer/   rayss         r   camera_raysz*DifferentiableProjectiveCamera.camera_rays?   s    #':: 
[rww{34&&(##F$4$4Q$7*GW:W9gZ`ZfZf9gh##F+yy%5%Cdjj%PRSUVWr   r/   c           	      ^   |j                   ^}}}|dk(  sJ || j                  j                   d   k(  sJ |j                  |dd      }| j                         }| j	                         }|j                         |dz
  z  dz  dz
  }|t        j                  |dz        z  }|j                  |dd      }| j                  j                  |dd      | j                  j                  |dd      |d d d d d df   z  z   | j                  j                  |dd      |d d d d dd f   z  z   }	|	|	j                  dd      z  }	t        j                  t        j                  | j                  j                  |dd      ||	j                   d   dg      |	gd      }
 |
j                  |g|dd S )	Nr   r   r   r   T)dimkeepdim)r?   )r   r   r7   r"   r$   floatr   tanr
   r   r	   normr,   r4   )r   r/   r8   r   n_coordsflatresr$   fracs
directionsr;   s              r   r6   z.DifferentiableProjectiveCamera.get_camera_raysL   s   '-||$
UH1}}T[[..q1111{{:r1-oohhjq)Q.2		#'**

:r1-FFKK
Aq)ffkk*a+eAq"1"Ho=>ffkk*a+eAq!"Ho=> 	
  *//b$/"GG
{{""4;;#3#3J1#E
T^TdTdefTgijGkl 
 tyy2e2Q222r   c           
          || j                   z  || j                  z  k(  sJ d       t        | j                  | j                  | j
                  | j                  ||| j                  | j                        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   s      r   resize_imagez+DifferentiableProjectiveCamera.resize_imagei   sg     t{{"ftzz&99`;``9-;;ffffff****	
 		
r   N)__name__
__module____qualname____doc__r   Tensor__annotations__r2   rA   r   r   r"   r$   r0   propertyr<   r6   rJ    r   r   r   r      s     LL||O||O||OJKLL:j
WV%,,  
 
3ell 3u|| 3:
# 
s 
7W 
r   r   sizer%   c                 v   g }g }g }g }t        j                  ddt         j                  z  d      D ]  }t        j                  t        j                  |      t        j
                  |      dg      }|t        j                  t        j                  |dz              z  }| dz  }t        j                  t        j
                  |      t        j                  |       dg      }t        j                  ||      }	|j                  |       |j                  |       |j                  |	       |j                  |        t        t        j                  t        j                  |d            j                         t        j                  t        j                  |d            j                         t        j                  t        j                  |d            j                         t        j                  t        j                  |d            j                         | | d	d	d
t        |      f	      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,   rA   r   )
rS   originsxsyszsthetar
   r   r   r	   s
             r   create_pan_camerasre   z   s   G	B	B	BQBEE	r2 	HHbffUmRVVE]D9:	RWWRVVAqD\""aHHbffUmbffUm^S9:HHQNv
		!
		!
		!	 *q 9:@@B


288BQ/
0
6
6
8


288BQ/
0
6
6
8


288BQ/
0
6
6
8#b'l
 
r   )
dataclassesr   typingr   numpyr   r   r   r2   re   rR   r   r   <module>ri      sD    "    `
 `
 `
FS %C r   