
    +hN                     \    S SK Jr  S SKJr  S SKrS SKr\ " S S5      5       rS\S\4S jr	g)	    )	dataclass)TupleNc                   ^   \ rS rSr% Sr\R                  \S'   \R                  \S'   \R                  \S'   \R                  \S'   \\S'   \\S'   \	\S	'   \	\S
'   \
\   \S'   S rS rS rS\R                  4S jr\S 5       rS\R                  S\R                  4S jrS\S\SS 4S jrSrg)DifferentiableProjectiveCamera   z=
Implements a batch, differentiable, standard pinhole camera
originxyzwidthheightx_fovy_fovshapec                    U R                   R                  S   U R                  R                  S   s=:X  a<  U R                  R                  S   s=:X  a  U R                  R                  S   :X  d   e   eU R                   R                  S   U R                  R                  S   s=:X  aC  U R                  R                  S   s=:X  a%  U R                  R                  S   s=:X  a  S:X  d   e   e[        U R                   R                  5      [        U R                  R                  5      s=:X  aO  [        U R                  R                  5      s=:X  a+  [        U R                  R                  5      s=:X  a  S:X  d   e   eg )Nr            )r	   r   r
   r   r   lenselfs    [/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/pipelines/shap_e/camera.py__post_init__,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                     [         R                  " [        R                  " U R                  U R
                  /[        R                  S95      $ N)dtype)torch
from_numpynparrayr   r   float32r   s    r   
resolution)DifferentiableProjectiveCamera.resolution+   s/    $**dkk)B"** UVVr   c                     [         R                  " [        R                  " U R                  U R
                  /[        R                  S95      $ r   )r   r    r!   r"   r   r   r#   r   s    r   fov"DifferentiableProjectiveCamera.fov.   s/    $**djj)A TUUr   returnc           	          [         R                  " U R                  U R                  -  5      n[         R                  " XR                  -  [         R
                  " XR                  SS9/SS9nU$ )z.
:return: coords of shape (width * height, 2)
trunc)rounding_moder   axis)r   aranger   r   stackdiv)r   pixel_indicescoordss      r   get_image_coords/DifferentiableProjectiveCamera.get_image_coords1   sZ     T[[4::%=>

*		-7K 
 r   c                 d   U R                   tp[        [        R                  " U5      5      nU R	                  5       n[
        R                  " UR                  S5      X-  /UR                   Q5      nU R                  U5      nUR                  XU R                  -  U R                  -  SS5      nU$ )Nr   r   r   )r   intr!   prodr4   r   broadcast_to	unsqueezeget_camera_raysviewr   r   )r   
batch_sizeinner_shapeinner_batch_sizer3   rayss         r   camera_rays*DifferentiableProjectiveCamera.camera_rays?   s    #':: 
rww{34&&(##F$4$4Q$7*:W9gZ`ZfZf9gh##F+yy%Cdjj%PRSUVWr   r3   c           	      T   UR                   Gtp#nUS:X  d   eX R                  R                   S   :X  d   eUR                  USS5      nU R                  5       nU R	                  5       nUR                  5       US-
  -  S-  S-
  nU[        R                  " US-  5      -  nUR                  USS5      nU R                  R                  USS5      U R                  R                  USS5      US S 2S S 2S S24   -  -   U R                  R                  USS5      US S 2S S 2SS 24   -  -   n	XR                  SSS9-  n	[        R                  " [        R                  " U R                  R                  USS5      X)R                   S   S/5      U	/SS9n
U
R                  " U/UQSPSP76 $ )	Nr   r   r   r   T)dimkeepdim)rE   )r   r   r<   r$   r'   floatr   tanr   r	   r
   normr0   r9   )r   r3   r=   r   n_coordsflatresr'   fracs
directionsr@   s              r   r;   .DifferentiableProjectiveCamera.get_camera_raysL   s   '-||$
H1}}[[..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
TdTdefTgijGkl 
 yy2e2Q222r   c                     XR                   -  X R                  -  :X  d   S5       e[        U R                  U R                  U R
                  U R                  UUU R                  U R                  S9$ )zV
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_image+DifferentiableProjectiveCamera.resize_imagei   sc     {{"fzz&99`;``9-;;ffffff****	
 		
r    N)__name__
__module____qualname____firstlineno____doc__r   Tensor__annotations__r7   rG   r   r   r$   r'   r4   propertyrA   r;   rQ   __static_attributes__rS   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                 x   / n/ n/ n/ n[         R                  " SS[         R                  -  SS9 GH  n[         R                  " [         R                  " U5      [         R
                  " U5      S/5      nU[         R                  " [         R                  " US-  5      5      -  nU* S-  n[         R                  " [         R
                  " U5      [         R                  " U5      * S/5      n[         R                  " Xh5      n	UR                  U5        UR                  U5        UR                  U	5        UR                  U5        GM     [        [        R                  " [         R                  " USS95      R                  5       [        R                  " [         R                  " USS95      R                  5       [        R                  " [         R                  " USS95      R                  5       [        R                  " [         R                  " USS95      R                  5       U U S	S	S
[        U5      4S9	$ )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    r0   rG   r   )
r]   originsxsyszsthetar   r   r	   r
   s
             r   create_pan_camerasro   z   s   G	B	B	BQBEE	r2HHbffUmRVVE]D9:	RWWRVVAqD\""aHHbffUmbffUm^S9:HHQNv
		!
		!
		! 3 *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   r7   ro   rS   r   r   <module>rs      sD    "    `
 `
 `
FS %C r   