
    +j7              !          U d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
Z
ddlmZ ddlmZ ddlZddlmZmZmZ dd	lmZmZmZmZmZmZmZmZ dd
lmZm Z m!Z!m"Z"m#Z#m$Z$ ej%        &                    ddddej'        j(        d          ej)        &                    dddgdd          ej)        &                    dg ddd          gZ*ddddddddddd d!Z+e,e-e.e-e/f         f         e0d"<   d#e-d$e.e-e/f         fd%Z1dqd'e/fd(Z2	 	 	 	 	 	 	 drd.e3ej4                 d/e5fd0Z6d1ed$e-fd2Z7d1ed$e/dz  fd3Z8d4e-d.e3ej4                 d$efd5Z9d6e-d.e3ej4                 d$efd7Z:d8e-d$e.e-dz  ej;        dz  f         fd9Z< G d: d;ej4                  Z= G d< d=ej4                  Z> G d> d?ej4                  Z? G d@ dAej4                  Z@ G dB dCej4                  ZAdDe,e-e	f         d$e
jB        fdEZCd.e3ej4                 dFedGeDdz  d$e.e-e-f         fdHZEh dIZFdJed8e-dKe-d$ej;        dz  fdLZGd+ZHdMZIdNZJg dOZKg dPZLg dQZMg dRZNdsdTe-d$ejO        j&        fdUZPdVe5d$eDfdWZQdXZRdYe,d$e,fdZZSdd-d[dYe,d\e-dKe-d]e-d^e/d_e5d`e5dae5dbe5dce/dde/dee/dfe/dge-dz  dhe5d$ef diZT G dj dkej4                  ZU G dl dmej4                  ZV G dn doe          ZWd$eWfdpZXdS )tzU
ComfyUI X Rodin3D(Deemos) API Nodes

Rodin API docs: https://developer.hyper3d.ai/

    N)cleandoc)BytesIO)Any)Image)override)IOComfyExtensionTypes)	JobStatusRodin3DCheckStatusRequestRodin3DCheckStatusResponseRodin3DDownloadRequestRodin3DDownloadResponseRodin3DGen25RequestRodin3DGenerateRequestRodin3DGenerateResponse)ApiEndpointdownload_url_to_bytesiodownload_url_to_file_3dpoll_opsync_opvalidate_stringSeed  Tdefaultminmaxdisplay_modeoptionalMaterial_TypePBRShadedoptionsr   r    Polygon_count)4K-Quad8K-Quad18K-Quad50K-Quad200K-Triangler)   )Quadi  )r,   i@  r,   PF  )r,   iP  )r,   @ )Rawi  )r0    N  )r0   iI )r0   r/   )r0   i  )r0   @B )r'   r(   r)   r*   z	200K-Quad2K-Triangle20K-Triangle150K-Triangler+   500K-Triangle1M-Triangle_QUALITY_MESH_OPTIONS
poly_countreturnc                 8    t                               | d          S )zMap a polygon-count preset like '18K-Quad' to (mesh_mode, quality_override).

    Falls back to ('Quad', 18000) for unknown labels; legacy parity.
    r-   )r8   get)r9   s    ;/home/wildlama/comfy/ComfyUI/comfy_api_nodes/nodes_rodin.pyget_quality_moder>   J   s    
 !$$ZAAA      @ 
max_pixelsc                 0   |                                                                  }|dz                      d          }t          j        |d          }|j        \  }}||z  }||k    r<t          j        ||z            }t          ||z            }t          ||z            }	n||}	}||k    s|	|k    r'|	                    ||	ft          j
        j                  }t                      }
|                    |
d           |
                    d           |
S )a4  
    Converts a PyTorch tensor to a file-like object.

    Args:
    - tensor (torch.Tensor): A tensor representing an image of shape (H, W, C)
      where C is the number of channels (3 for RGB), H is height, and W is width.

    Returns:
    - io.BytesIO: A file-like object containing the image data.
       uint8RGBPNG)formatr   )cpunumpyastyper   	fromarraysizemathsqrtintresize
ResamplingLANCZOSr   saveseek)tensorrA   arrayimageoriginal_widthoriginal_heightoriginal_pixelsscale	new_width
new_heightimg_byte_arrs              r=   tensor_to_fileliker_   R   s    JJLL  ES[  ))EOE5))E&+j#NO$6O##	*677.//	5011

 .:	N""jO&C&Ci4e6F6NOO99L	JJ|EJ***ar?      r.   Regularr,   Fclsta_posec                   K   |t          d          t          |          dk    rt          d          t          | t          dd          t          t          ||||||          d |D             d	
           d {V }t          |d          r5d|j         d|j         }	t          j        |	           t          |	          t          j
        d           |j        j        }
|j        }t          j
        d|           ||
fS )Nz,Rodin 3D generate requires at least 1 image.   z)Rodin 3D generate requires up to 5 image./proxy/rodin/api/v2/rodinPOSTpathmethod)seedtiermaterialquality_override	mesh_modeTAPosec                 ~    g | ]:}|dt          |t                    rt          |d          nt          |          f;S Nimagesrb
isinstancestropenr_   .0rW   s     r=   
<listcomp>z(create_generate_task.<locals>.<listcomp>   sU     
 
 
  Juc,B,BatE4(((HZ[`HaHab   r?   multipart/form-data)response_modeldatafilescontent_typeerrorz1Rodin3D Create 3D generate Task Failed. Message: z	, error: z;[ Rodin3D API - Submit Jobs ] Submit Generate Task Success!z&[ Rodin3D API - Submit Jobs ] UUID: %s)	Exceptionlenr   r   r   r   hasattrmessager   logginginfojobssubscription_keyuuid)rb   rs   rk   rm   rn   rl   ro   rc   responseerror_messager   	task_uuids               r=   create_generate_taskr   s   sX      ~FGGG
6{{QCDDD4VDDD.#-
 
 

 

 
 

 +#        H( x!! 'wHL\wwgoguwwm$$$&&&LNOOO}5IL99EEE&&&r?   r   c                    t          d | j        D                       }d | j        D             }t          j        d|           t	          d | j        D                       r$t          j        d|           t          d          |rdS dS )	Nc              3   @   K   | ]}|j         t          j        k    V  d S Nstatusr   Donerz   jobs     r=   	<genexpr>z%check_rodin_status.<locals>.<genexpr>   s+      IIC3:/IIIIIIr?   c                 6    g | ]}t          |j                  S  )rw   r   r   s     r=   r{   z&check_rodin_status.<locals>.<listcomp>   s     <<<s3sz??<<<r?   z1[ Rodin3D API - CheckStatus ] Generate Status: %sc              3   @   K   | ]}|j         t          j        k    V  d S r   )r   r   Failedr   s     r=   r   z%check_rodin_status.<locals>.<genexpr>   s,      
C
Cc3:))
C
C
C
C
C
Cr?   zD[ Rodin3D API - CheckStatus ] Generate Failed: %s, Please try again.z2[ Rodin3D API ] Generate Failed, Please Try again.DONE
Generating)allr   r   r   anyr   r   )r   all_donestatus_lists      r=   check_rodin_statusr      s    II8=IIIIIH<<hm<<<KLDkRRR

C
CX]
C
C
CCC N\^ijjjLMMM v<r?   c                     | j         sd S t          d | j         D                       }t          |t          | j                   z  dz            S )Nc              3   D   K   | ]}|j         t          j        k    d V  dS )r`   Nr   r   s     r=   r   z#extract_progress.<locals>.<genexpr>   s0      UU
in8T8T!8T8T8T8TUUr?   d   )r   sumrO   r   )r   completed_counts     r=   extract_progressr      sQ    = tUUx}UUUUUO#hm"4"44;<<<r?   r   c                    K   t          j        d           t          |t          dd          t          t          |           t          t                     d {V S )Nz-[ Rodin3D API - CheckStatus ] Generate Start!z/proxy/rodin/api/v2/statusrg   rh   )r   )r}   r~   status_extractorprogress_extractor)r   r   r   r   r   r   r   r   )r   rb   s     r=   poll_for_task_statusr      sx      L@AAA5fEEE1&8HIII++         r?   r   c                    K   t          j        d           t          |t          dd          t          t          |           d           d {V S )Nz4[ Rodin3D API - Downloading ] Generate Successfully!z/proxy/rodin/api/v2/downloadrg   rh   )r   F)r}   r~   monitor_progress)r   r   r   r   r   r   )r   rb   s     r=   get_rodin_download_listr      st      LGHHH7GGG.#d333         r?   r   c                   K   d| }t           j                            t          j                    |          }t          j        |d           d }d }| j        D ]}t           j                            ||j                  }|j                                        	                    d          rt           j                            ||j                  }t          |j        d           d {V }t          |d          5 }|                    |                                           d d d            n# 1 swxY w Y   t          |j        |           d {V  ||fS )NRodin3D_Texist_ok.glbglbwb)osri   joincomfy_pathsget_output_directorymakedirsitemsnamelowerendswithr   urlrx   write	get_bytesr   )	url_listr   result_folder_name	save_pathmodel_file_pathfile_3di	file_pathfs	            r=   download_filesr      s     /I//[=??ASTTIK	D))))OG^ 	< 	<GLLAF33	6<<>>""6** 	< gll+=qvFFO3AE5AAAAAAAAGi&& -!))++,,,- - - - - - - - - - - - - - - *!%;;;;;;;;;;G##s   =(D11D5	8D5	c                   ^    e Zd ZdZedej        fd            Zedej        fd            Z	dS )Rodin3D_Regular"Generate 3D Assets using Rodin APIr:   c                    t          j        dddt          | j        pd          t           j                            d          gt          t           j                            d          t           j	                            d          gt           j
        j        t           j
        j        t           j
        j        gd	t          j        d
          	  	        S )Nr   z$Rodin 3D Generate - Regular Generatepartner/3d/Rodin Images3D Model Pathdisplay_nameGLBT{"type":"usd","usd":0.4}expr	node_idr   categorydescriptioninputsoutputshiddenis_api_nodeprice_badger   Schemar   __doc__r   InputCOMMON_PARAMETERSStringOutput	File3DGLBHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgerb   s    r=   define_schemazRodin3D_Regular.define_schema   s    y%?' !233x(("
 	  o >>###77
 	.	+	#
 3  '
 
 
 	
r?   c           	        K   d}|j         d         }g }t          |          D ]}|                    ||                    t          |          \  }	}
t	          | ||||
||	           d {V \  }}t          ||            d {V  t          ||            d {V }t          ||           d {V \  }}t          j	        ||          S )Nra   r   rs   rk   rm   rn   rl   ro   
shaperangeappendr>   r   r   r   r   r   
NodeOutputrb   r   r   r!   r&   rl   
num_imagesm_imagesr   ro   rn   r   r   download_list
model_pathr   s                   r=   executezRodin3D_Regular.execute   s+      \!_
z"" 	' 	'AOOF1I&&&&&6}&E&E#	#,@"--
 -
 -
 '
 '
 '
 '
 '
 '
#	# ##3S9999999995iEEEEEEEE$2=)$L$LLLLLLL
G}Z111r?   N
__name__
__module____qualname__r   classmethodr   r   r   r   r   r   r?   r=   r   r      m        ,,
bi 
 
 
 [
2 2 
2 2 2 [2 2 2r?   r   c                   ^    e Zd ZdZedej        fd            Zedej        fd            Z	dS )Rodin3D_Detailr   r:   c                    t          j        dddt          | j        pd          t           j                            d          gt          t           j                            d          t           j	                            d          gt           j
        j        t           j
        j        t           j
        j        gd	t          j        d
          	  	        S )Nr  z#Rodin 3D Generate - Detail Generater   r   r   r   r   r   Tr   r   r   r   r   s    r=   r   zRodin3D_Detail.define_schema      y$>' !233x(("
 	  o >>###77
 	.	+	#
 3  '
 
 
 	
r?   c           	        K   d}|j         d         }g }t          |          D ]}|                    ||                    t          |          \  }	}
t	          | ||||
||	           d {V \  }}t          ||            d {V  t          ||            d {V }t          ||           d {V \  }}t          j	        ||          S )NDetailr   r   r   r   s                   r=   r   zRodin3D_Detail.execute9  s+      \!_
z"" 	' 	'AOOF1I&&&&&6}&E&E#	#,@"--
 -
 -
 '
 '
 '
 '
 '
 '
#	# ##3S9999999995iEEEEEEEE$2=)$L$LLLLLLL
G}Z111r?   Nr   r   r?   r=   r  r    r  r?   r  c                   ^    e Zd ZdZedej        fd            Zedej        fd            Z	dS )Rodin3D_Smoothr   r:   c                    t          j        dddt          | j        pd          t           j                            d          gt          t           j                            d          t           j	                            d          gt           j
        j        t           j
        j        t           j
        j        gd	t          j        d
          	  	        S )Nr  z#Rodin 3D Generate - Smooth Generater   r   r   r   r   r   Tr   r   r   r   r   s    r=   r   zRodin3D_Smooth.define_schemaZ  r  r?   c           	        K   |j         d         }g }t          |          D ]}|                    ||                    t          |          \  }}	t	          | ||||	d|           d {V \  }
}t          ||            d {V  t          |
|            d {V }t          ||
           d {V \  }}t          j	        ||          S )Nr   Smoothr   r   )rb   r   r   r!   r&   r   r   r   ro   rn   r   r   r   r   r   s                  r=   r   zRodin3D_Smooth.executet  s&      \!_
z"" 	' 	'AOOF1I&&&&&6}&E&E#	#,@"--
 -
 -
 '
 '
 '
 '
 '
 '
#	# ##3S9999999995iEEEEEEEE$2=)$L$LLLLLLL
G}Z111r?   Nr   r   r?   r=   r  r  W  sm        ,,
bi 
 
 
 [
2 2 
2 2 2 [2 2 2r?   r  c                   ^    e Zd ZdZedej        fd            Zedej        fd            Z	dS )Rodin3D_Sketchr   r:   c                    t          j        dddt          | j        pd          t           j                            d          t           j                            ddddt           j        j        d	
          gt           j	        
                    d          t           j        
                    d          gt           j        j        t           j        j        t           j        j        gd	t          j        d          	  	        S )Nr  z#Rodin 3D Generate - Sketch Generater   r   r   r   r   r   Tr   r   r   r   r   r   r   )r   r   r   r   r   r   IntNumberDisplaynumberr   r   r   r   r   r   r   r   r   s    r=   r   zRodin3D_Sketch.define_schema  s    y$>' !233x((!#!1!8!   
 	  o >>###77
 	.	+	#
 3  5
 
 
 	
r?   c           	      p  K   |j         d         }g }t          |          D ]}|                    ||                    t          | ||dddd           d {V \  }}t	          ||            d {V  t          ||            d {V }t          ||           d {V \  }	}
t          j        |	|
          S )Nr   r"   r.   Sketchr,   r   )	r   r   r   r   r   r   r   r   r   )rb   r   r   r   r   r   r   r   r   r   r   s              r=   r   zRodin3D_Sketch.execute  s      \!_
z"" 	' 	'AOOF1I&&&&,@"-
 -
 -
 '
 '
 '
 '
 '
 '
#	# ##3S9999999995iEEEEEEEE$2=)$L$LLLLLLL
G}Z111r?   Nr   r   r?   r=   r  r    sn        ,,
bi 
 
 
 [
@ 2 
	2 2 2 [2 2 2r?   r  c                   ^    e Zd ZdZedej        fd            Zedej        fd            Z	dS )Rodin3D_Gen2r   r:   c                    t          j        dddt          | j        pd          t           j                            d          t           j                            ddddt           j        j        d	
          t           j	                            dddgdd	          t           j	                            dg ddd	          t           j
                            ddd	          gt           j                            d          t           j                            d          gt           j        j        t           j        j        t           j        j        gd	t          j        d          	  	        S )Nr  z"Rodin 3D Generate - Gen-2 Generater   r   r   r   r   r   Tr   r!   r"   r#   r$   r&   )r'   r(   r)   r*   r3   r4   r5   r6   r6   rp   F)r   advancedr   r   r   r   r   r   )r   r   r   r   r   r   r  r  r  ComboBooleanr   r   r   r   r   r   r   r   r   s    r=   r   zRodin3D_Gen2.define_schema  s[   y"=' !233x((!#!1!8!    8ISXcghh#	 	 	 ,!    
  54 HH5: 	  o >>###77
 	.	+	#
 3  W.
 .
 .
 .	
r?   c           
        K   d}|j         d         }g }t          |          D ]}	|                    ||	                    t          |          \  }
}t	          | ||||||
|           d {V \  }}t          ||            d {V  t          ||            d {V }t          ||           d {V \  }}t          j	        ||          S )NzGen-2r   )rs   rk   rm   rn   rl   ro   rc   r   )rb   r   r   r!   r&   rp   rl   r   r   r   ro   rn   r   r   r   r   r   s                    r=   r   zRodin3D_Gen2.execute  s.      \!_
z"" 	' 	'AOOF1I&&&&&6}&E&E#	#,@"-	-
 	-
 	-
 	'
 	'
 	'
 	'
 	'
 	'
#	# ##3S9999999995iEEEEEEEE$2=)$L$LLLLLLL
G}Z111r?   Nr   r   r?   r=   r  r    sn        ,,/
bi /
 /
 /
 [/
b 2 
2 2 2 [2 2 2r?   r  r~   c                    t          j        d          }|                                 D ]\  }}|t          |t                    r|                    ||rdnd           8t          |t                    r)|D ]%}|                    |t          |                     &vt          |t          t          f          r|                    ||           |                    |t          |                     |S )zConvert a Rodin request dict to an aiohttp form, fixing bool/list serialization.

    Booleans --> "true"/"false". Lists --> one field per element.
    T)default_to_multipartNtruefalse)
aiohttpFormDatar   rv   bool	add_fieldlistrw   bytes	bytearray)r~   formkeyvalueitems        r=   _rodin_multipart_parserr.  $  s    
 666Djjll , ,
U=eT"" 	,NN3% <W====t$$ 	, / /sCII..../y122 	,NN3&&&&NN3E

++++Kr?   requestrs   c           	      `  K   |"t          |          dk    rt          d          d}|rd |D             }t          | t          dd          t          ||dt
          	           d{V }|j        r|j        r|j        j        st          d
|j
                  |j        |j        j        fS )zESubmit a Gen-2.5 generate job; returns (task_uuid, subscription_key).Nre   z.Rodin Gen-2.5 supports at most 5 input images.c                 ~    g | ]:}|dt          |t                    rt          |d          nt          |          f;S rr   ru   ry   s     r=   r{   z&_create_gen25_task.<locals>.<listcomp>E  s\     
 
 

  	 %/s%;%;ZUD!!!ASTYAZAZ
 !  r?   rf   rg   rh   r|   )r}   r~   r   r   multipart_parserz%Rodin Gen-2.5 submit failed: message=)r   
ValueErrorr   r   r   r.  r   r   r   RuntimeErrorr   )rb   r/  rs   r   r   s        r=   _create_gen25_taskr5  9  s       c&kkAooIJJJE 

 

  
 
 
 4VDDD.*0        H = Y YX]5S YW8CSWWXXX=(-888r?   >   .fbx.obj.stl.gltfr   r   geometry_file_formatc                 *  K   d| }t           j                            t          j                    |          }t          j        |d           d|                                                    d           }d}| j        D ]}t           j                            ||j	                  }t           j        
                    |j	                                                  d         }	||	|k    r|	t          v r~t          |j        |                    d                     d{V }t          |d          5 }
|
                    |                                           ddd           n# 1 swxY w Y   t#          |j        |           d{V  || j        D ]w}t           j        
                    |j	                                                  d         }	|	t          v r0t          |j        |	                    d                     d{V } nx|S )zNDownload every file in the list; return the File3D matching the chosen format.Rodin3D_Gen25_Tr   .Nr`   r   )r   ri   r   r   r   r   r   lstripr   r   splitext_PREVIEWABLE_3D_EXTSr   r   rx   r   r   r   )r   r   r:  folder_namesave_dir
target_extr   r-  r   extr   s              r=   _download_gen25_filesrE  `  sC      /9..Kw||K<>>LLHK4((((?)//1188==??J#'G# 	; 	;GLL4955	gty0011!4?sj00S<P5P5P3DHj>O>OPS>T>TUUUUUUUUGi&& -!))++,,,- - - - - - - - - - - - - - -%dh	:::::::::: !' 	 	D'""49??#4#455a8C*** 7#**S// R RRRRRRR + Ns   5(E))E-	0E-	FastzExtreme-High)
Defaultr'   r(   r)   r*   r3   r4   r5   r6   r7   )rG  legacyzextreme-lowlowmediumhigh)r   fbxobjstl)r"   r#   AllNonemoder   c                    t           j                            | t           j                            t          t           j                            dg ddd          t           j                            dt          dd          t           j                            d	d
d          g          t           j                            t          t           j                            dg dd          t           j	                            ddddt           j
        j        d          g          t           j                            t          t           j                            dddgd          t           j	                            ddddt           j
        j        d          t           j                            dd
d          t           j                            d	d
d          g          gd          S ) Nrl   )Gen-2.5-LowGen-2.5-MediumGen-2.5-HighrU  z<Quality tier. Higher tiers produce higher-fidelity geometry.)r%   r   tooltippolygon_countrG  zMPreset face count. 'Default' uses the server's default for the selected tier.creativeFzACreative mode (Medium/High only). Enhances generative robustness.)r   rV  )zGen-2.5-Extreme-LowrS  rT  rU  rS  r%   r   
mesh_facesr1   i  z&Mesh face count (1K-20K in Fast mode).)r   r   r   r   rV  ro   r0   r,   r2   i zbMesh face count. Raw mode: 20K-2M. Quad mode: keep under 200K (upstream may reject higher values).is_microz(Enable micro detail (Extreme-High only).z.Creative mode. Enhances generative robustness.zGeneration mode. Regular = balanced. Fast = 1K-20K faces for rapid prototyping. Extreme-High = 20K-2M faces with optional micro details.)r%   rV  )r   DynamicCombor   Option_MODE_REGULARr  _REGULAR_POLY_OPTIONSr  
_MODE_FASTr  r  r  _MODE_EXTREME_HIGH)r   s    r=   _build_mode_inputrb    s    ?  O""HNN Q Q Q . ^	 #   HNN' 5 ) o	 #   J$$" % c %   , O""HNN! ! ! !. # 	 	 FLL$ % !%'%5%< H !   . O"""HNN;QVNWWFLL$ '!#%'%5%<^ ! 
 
 J$$" % J %  
 J$$" % P %  % ]I
VG[ ! P P Pr?   include_image_onlyc                    t           j                            dt          d          t           j                            dt          d          t           j                            dt
          ddd	
          t           j                            ddddt           j        j        dd          t           j	                            ddddd          t           j	                            ddddd          t           j	                            ddddd          g}| r7|
                    t           j	                            ddddd                     |                    t           j	                            ddddd          t           j                            ddddt           j        j        ddd          t           j                            ddddt           j        j        ddd           t           j                            d!dddt           j        j        ddd"          t           j                            d#ddd$t           j        j        ddd%          g           |S )&Nrm   r#   rY  r:  r   texture_moderG  TzRTexture quality preset. 'Default' uses the server's default for the selected tier.)r%   r   r    rV  rk   r   r   )r   r   r   r   control_after_generater    rp   FzT/A pose for human-like models.)r   r    r  rV  
hd_texturez!High-quality texture enhancement.texture_delightz$Remove baked lighting from textures.use_original_alphazPreserve image transparency.addon_highpackz8HighPack addon: 4K textures and ~16x faces in Quad mode.
bbox_widthi,  zCBounding-box width (Y axis). Set to 0 with the others to skip bbox.)r   r   r   r   r    r  rV  bbox_heightzBounding-box height (Z axis).bbox_lengthzBounding-box length (X axis).	height_cmi'  z4Approximate model height in centimeters (0 to skip).)r   r  r   _MATERIAL_OPTIONS_GEOMETRY_FORMAT_OPTIONS_TEXTURE_MODE_OPTIONSr  r  r  r  r   extend)rc  r   s     r=   _build_common_inputsrs    s   
z+<hOO
-7OY^__
)h 	 	
 	
 	)0#' 	 	
 	
 	
edTKl 	 	
 	
 	
%$Or 	 	
 	
 	
: 	 	
 	
3 FB  	
J$6   	
 	
 	
 MMJ R    FLL-4]  	 	 FLL-47  	 	 FLL-47  	 	 FLL-4N  	 	M0	
2 2 2f Mr?   z
(
  $baseCredits := widgets.mode = "extreme-high" ? 1.0 : 0.5;
  $addonCredits := widgets.addon_highpack ? 1.0 : 0.0;
  $total := ($baseCredits * 1.5) + ($addonCredits * 0.8);
  {"type":"usd","usd": $total}
)

mode_inputc                 "   | d         }i }|t           k    r^| d         |d<   |                     dd          }|dk    rt          |          \  }}||d<   ||d<   |                     d          rd|d<   n|t          k    r)| d         |d<   d	|d<   t	          | d
                   |d<   ng|t
          k    r\d|d<   | d         |d<   t	          | d
                   |d<   |                     d          rd|d<   |                     d          rd|d<   |S )zTranslate the DynamicCombo `mode` payload into Gen-2.5 request fields.

    Returns a dict with: tier, quality_override, mesh_mode, geometry_instruct_mode, is_micro.
    Missing keys mean "do not send" (so we don't override server defaults).
    rQ  rl   rW  rG  ro   rn   rX  geometry_instruct_moder0   rZ  zGen-2.5-Extreme-Highr[  T)r^  r<   r>   r`  rO   ra  )rt  selectedoutpolygonro   facess         r=   _resolve_mode_paramsr{  Y  sL    &!HC=   (F..)<<i/88Iu(C&+C"#>>*%% 	7,6C()	Z		 (F K"%j&>"?"?	'	'	',F%k2K"%j&>"?"?>>*%% 	#"C
O>>*%% 	7,6C()Jr?   )promptri  rm   re  rk   rp   rg  rh  rj  rk  rl  rm  rn  r|  ri  c                    t          |           }d }|	r	|
r|r|	|
|g}t          di d|d         d|pd d|d|d|d|dk    rd n|d|                    d          d	|                    d	          d
|                    d
          d|d|pd d|pd d|pd d|pd d|                    d          d|pd d|rdgnd S )Nrl   r|  rk   rm   r:  re  rG  ro   rn   rv  bbox_conditionheightrp   rg  rh  r[  ri  addonsHighPackr   )r{  r   r<   )rt  rm   r:  re  rk   rp   rg  rh  rj  rk  rl  rm  rn  r|  ri  mode_paramsbboxs                    r=   _build_requestr  |  s   $ 'z22KD 6k 6k 6K5     ~ T 	
 21 *Y66TTL //+... %);<<<  +/GHHH t  D ~ % (/4 ,,,  .5!"  .7
||4# r?   c            !           e Zd Zedej        fd            Zedej        j        de	de
de
de
ded	ed
ededededededededej        f d            ZdS )Rodin3D_Gen25_Imager:   c                 .   t          j        ddddt           j                            dt           j                            t           j                            d          ddd	          d
          t                      gt          d          t           j        	                    d          gt           j
        j        t           j
        j        t           j
        j        gdt          j        t          j        ddg          t                     	  	        S )Nr  zRodin 3D Gen-2.5 - Image to 3Dr   zGenerate a 3D model from 1-5 reference images via Rodin Gen-2.5. Pick a mode (Fast / Regular / Extreme-High) to tune quality vs. cost.rs   rW   r`   re   )prefixr   r   zB1-5 images. The first image is used for materials when multi-view.)templaterV  Trc  
model_filer   rQ  rj  widgets
depends_onr   r   )r   r   Autogrowr   TemplatePrefixr   rb  rs  	File3DAnyr   r   r   r   r   r   PriceBadgeDepends_PRICE_EXPRr   s    r=   r   z!Rodin3D_Gen25_Image.define_schema  s	   y)9'X !![77w8O8OX_eflm7nn` "  
 "## &>>> \((l(CCD	.	+	#
 /AQ8RSSS   1
 
 
 	
r?   rs   rQ  rm   r:  re  rk   rp   rg  rh  ri  rj  rk  rl  rm  rn  c                   K   d |                                 D             }|st          d          g }|D ]x}t          |d          rQt          |j                  dk    r9t          |j        d                   D ]}|                    ||                    c|                    |           yt          |          dk    r t          dt          |           d          t          ||||||||	|||||d |
	          }t          | ||           d {V \  }}t          ||            d {V  t          ||            d {V }t          |||           d {V }t          j        |          S )
Nc                     g | ]}||S r   r   )rz   imgs     r=   r{   z/Rodin3D_Gen25_Image.execute.<locals>.<listcomp>  s    KKK3????r?   z6Rodin Gen-2.5 Image-to-3D requires at least one image.r      r   re   z1Rodin Gen-2.5 accepts at most 5 images; received r=  )rt  rm   r:  re  rk   rp   rg  rh  rj  rk  rl  rm  rn  r|  ri  )valuesr3  r   r   r   r   r   r  r5  r   r   rE  r   r   )rb   rs   rQ  rm   r:  re  rk   rp   rg  rh  ri  rj  rk  rl  rm  rn  image_tensorsflat_imagesrU   r   r/  r   r   r   r   s                            r=   r   zRodin3D_Gen25_Image.execute  s     & LKKKK 	WUVVV # 	+ 	+Fvw'' +C,=,=,B,Bv|A// 2 2A&&vay11112 ""6****{adQTU`QaQadddeee !5%!+)!##1
 
 
$ -?sG[,Y,Y&Y&Y&Y&Y&Y&Y#	#"#3S9999999995iEEEEEEEE-mYH\]]]]]]]]}W%%%r?   N)r   r  r  r  r   r   r   r  Typedictrw   rO   r%  r   r   r   r?   r=   r  r    s        
bi 
 
 
 [
> 8& 8& 8& 	8&
 "8& 8& 8& 8& 8& 8& !8& 8& 8& 8& 8&  !8&" 
#8& 8& 8& [8& 8& 8&r?   r  c                       e Zd Zedej        fd            Zedededededede	d	e
d
e
de
de
de	de	de	de	dej        fd            ZdS )Rodin3D_Gen25_Textr:   c                    t          j        ddddt           j                            dddd	          t	                      gt          d
          t           j                            d          gt           j        j	        t           j        j
        t           j        j        gdt          j        t          j        ddg          t                    	  	        S )Nr  zRodin 3D Gen-2.5 - Text to 3Dr   zGenerate a 3D model from a text prompt via Rodin Gen-2.5. Pick a mode (Fast / Regular / Extreme-High) to tune quality vs. cost.r|  Tr   zText prompt for the 3D model.)	multiliner   rV  Fr  r  r   rQ  rj  r  r  r   )r   r   r   r   rb  rs  r  r   r   r   r   r   r   r  r  r   s    r=   r   z Rodin3D_Gen25_Text.define_schema	  s    y(8'X 	";	     "##	 &???	 \((l(CCD	.	+	#
 /AQ8RSSS   3
 
 
 	
r?   r|  rQ  rm   r:  re  rk   rp   rg  rh  rj  rk  rl  rm  rn  c                 J  K   t          |ddd           t          ||||||||	|
|||||          }t          | |d            d {V \  }}t          ||            d {V  t	          ||            d {V }t          |||           d {V }t          j        |          S )Nr|  r`   i	  )
field_name
min_length
max_length)rt  rm   r:  re  rk   rp   rg  rh  rj  rk  rl  rm  rn  r|  )rs   )r   r  r5  r   r   rE  r   r   )rb   r|  rQ  rm   r:  re  rk   rp   rg  rh  rj  rk  rl  rm  rn  r/  r   r   r   r   s                       r=   r   zRodin3D_Gen25_Text.execute*  s     $ 	8dSSSS !5%!+)!##
 
 
  -?sGTX,Y,Y,Y&Y&Y&Y&Y&Y&Y#	#"#3S9999999995iEEEEEEEE-mYH\]]]]]]]]}W%%%r?   N)r   r  r  r  r   r   r   rw   r  rO   r%  r   r   r   r?   r=   r  r    s        
bi 
 
 
 [
@ &&&& && 	&&
 "&& && && && && && && && && && &&  
!&& && && [&& && &&r?   r  c                   L    e Zd Zedeeej                          fd            ZdS )Rodin3DExtensionr:   c                 ^   K   t           t          t          t          t          t
          t          gS r   )r   r  r  r  r  r  r  )selfs    r=   get_node_listzRodin3DExtension.get_node_listU  s'       
 	
r?   N)	r   r  r  r   r'  typer   	ComfyNoder  r   r?   r=   r  r  T  sE        	
T$r|*<%= 	
 	
 	
 X	
 	
 	
r?   r  c                  "   K   t                      S r   )r  r   r?   r=   comfy_entrypointr  b  s      r?   )r@   )Nr`   r"   r.   ra   r,   F)rQ  )Yr   r   rM   r   inspectr   ior   typingr   r#  PILr   typing_extensionsr   folder_pathsr   comfy_api.latestr   r	   r
   comfy_api_nodes.apis.rodinr   r   r   r   r   r   r   r   comfy_api_nodes.utilr   r   r   r   r   r   r  r   r  r  r  r   r8   r  rw   tuplerO   __annotations__r>   r_   r  r  r%  r   r   r   r   r   File3Dr   r   r  r  r  r  r$  r.  r'  r5  r@  rE  r^  r`  ra  r_  rq  rp  ro  r\  rb  rs  r  r{  r  r  r  r  r  r   r?   r=   <module>r     s       				                          & & & & & & " " " " 6 6 6 6 6 6 6 6 6 6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                FLL%,    HNN?UH,=uW[N\\HNNOOO	    ( $#$$%"#$$$%5 5 tCsCx01   B BsCx B B B B 3    F 	
	,' ,'	bl	,' ,' ,' ,' ,'^	!; 	 	 	 	 	=9 =cDj = = = =	 	4;M 	Rl 	 	 	 	 $r|2D I`    $c $eC$JW[H[<[6\ $ $ $ $*82 82 82 82 82bl 82 82 82v82 82 82 82 82R\ 82 82 82v72 72 72 72 72R\ 72 72 72t;2 ;2 ;2 ;2 ;2R\ ;2 ;2 ;2|R2 R2 R2 R2 R22< R2 R2 R2j$sCx. W5E    *!9	bl	!9 !9 4K!9 38_	!9 !9 !9 !9H A@@  *     \D	       F 
#     VUU 777 444 Q QC QR_-B Q Q Q Qh_ _ _ _ _ _D T  d        d $!* * ** * 	*
 * * * * * * * * * * $J*  !*" #* * * *Z[& [& [& [& [&", [& [& [&|J& J& J& J& J& J& J& J&Z
 
 
 
 
~ 
 
 
 0      r?   