
    +j7              !          % S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	  SSK
r
SSKJr  SSKJr  SSKrSSKJrJrJr  SS	KJrJrJrJrJrJrJrJr  SS
KJrJ r J!r!J"r"J#r#J$r$  \RJ                  RM                  SSSS\RN                  RP                  SS9\RR                  RM                  SSS/SSS9\RR                  RM                  S/ SQSSS9/r*SSSSSSSSSSS S!.r+\,\-\.\-\/4   4   \0S"'   S#\-S$\.\-\/4   4S% jr1SlS&\/4S' jjr2       SmS*\3\Rh                     S+\54S, jjr6S-\S$\-4S. jr7S-\S$\/S-  4S/ jr8S0\-S*\3\Rh                     S$\4S1 jr9S2\-S*\3\Rh                     S$\4S3 jr:S4\-S$\.\-S-  \Rv                  S-  4   4S5 jr< " S6 S7\Rh                  5      r= " S8 S9\Rh                  5      r> " S: S;\Rh                  5      r? " S< S=\Rh                  5      r@ " S> S?\Rh                  5      rAS@\,\-\	4   S$\
R                  4SA jrCS*\3\Rh                     SB\SC\DS-  S$\.\-\-4   4SD jrE1 SEkrFSF\S4\-SG\-S$\Rv                  S-  4SH jrGS(rHSIrISJrJ/ SKQrK/ SLQrL/ SMQrM/ SNQrNSnSO\-S$\R                  RL                  4SP jjrPSQ\5S$\D4SR jrQSSrRST\,S$\,4SU jrSSS)SV.ST\,SW\-SG\-SX\-SY\/SZ\5S[\5S\\5S]\5S^\/S_\/S`\/Sa\/Sb\-S-  Sc\5S$\4 Sd jjrT " Se Sf\Rh                  5      rU " Sg Sh\Rh                  5      rV " Si Sj\5      rWS$\W4Sk jrXg)ozU
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                 .    [         R                  U S5      $ )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    
max_pixelsc                    U R                  5       R                  5       nUS-  R                  S5      n[        R                  " US5      nUR
                  u  pEXE-  nXa:  a3  [        R                  " X-  5      n[        XG-  5      n[        XW-  5      n	OXEpX:w  d  X:w  a+  UR                  X4[        R                  R                  5      n[        5       n
UR                  U
SS9  U
R                  S5        U
$ )a  
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)tensorr@   arrayimageoriginal_widthoriginal_heightoriginal_pixelsscale	new_width
new_heightimg_byte_arrs              r=   tensor_to_fileliker^   R   s     JJL ES[  )EOOE5)E&+jj#N$6O#		*67./	01
 .:"j&Ci4e6F6F6N6NO9L	JJ|EJ*ar?   RegularFclsta_posec                   #    Uc  [        S5      e[        U5      S:  a  [        S5      e[        U [        SSS9[        [        UUUUUUS9U Vs/ s H6  nUc  M  S[        U[        5      (       a  [        US	5      O
[        U5      4PM8     snS
S9I S h  vN n	[        U	S5      (       a=  SU	R                   SU	R                   3n
[        R                  " U
5        [        U
5      e[        R                  " S5        U	R                  R                   nU	R"                  n[        R                  " SU5        X4$ s  snf  N7f)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TAPoseimagesrb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   
isinstancestropenr^   hasattrmessagerv   logginginfojobssubscription_keyuuid)r`   ro   ri   rk   rl   rj   rm   ra   rV   responseerror_messager   	task_uuids                r=   create_generate_taskr   s   sB     ~FGG
6{QCDD4VD.#-
  
 cXJuc,B,BtE4(HZ[`Hab

 +# H( x!!KHL\L\K]]fgogugufvwm$&&LLNO}}55ILL99E&&#
s%   AED;2D;	EE B*Er   c                 h   [        S U R                   5       5      nU R                   Vs/ s H  n[        UR                  5      PM     nn[        R
                  " SU5        [        S U R                   5       5      (       a"  [        R                  " SU5        [        S5      eU(       a  ggs  snf )Nc              3   Z   #    U  H!  oR                   [        R                  :H  v   M#     g 7fNstatusr   Done.0jobs     r=   	<genexpr>%check_rodin_status.<locals>.<genexpr>   s     I=C::/=   )+z1[ Rodin3D API - CheckStatus ] Generate Status: %sc              3   Z   #    U  H!  oR                   [        R                  :H  v   M#     g 7fr   )r   r   Failedr   s     r=   r   r      s     
C]c::)))]r   zD[ Rodin3D API - CheckStatus ] Generate Failed: %s, Please try again.z2[ Rodin3D API ] Generate Failed, Please Try again.DONE
Generating)	allr   rz   r   r~   r   anyrv   rw   )r   all_doner   status_lists       r=   check_rodin_statusr      s    I8==IIH.6mm<ms3szz?mK<LLDkR

CX]]
CCC\^ijLMM =s   B/c                     U R                   (       d  g [        S U R                    5       5      n[        U[        U R                   5      -  S-  5      $ )Nc              3   d   #    U  H&  oR                   [        R                  :X  d  M"  S v   M(     g7f)   Nr   r   s     r=   r   #extract_progress.<locals>.<genexpr>   s     U}

inn8T!!}s   !0	0d   )r   sumrN   rx   )r   completed_counts     r=   extract_progressr      s>    ==Ux}}UUO#hmm"44;<<r?   r   c           	         #    [         R                  " S5        [        U[        SSS9[        [        U S9[        [        S9I S h  vN $  N7f)Nz-[ Rodin3D API - CheckStatus ] Generate Start!z/proxy/rodin/api/v2/statusre   rf   )r   )rr   rs   status_extractorprogress_extractor)r~   r   r   r   r   r   r   r   )r   r`   s     r=   poll_for_task_statusr      sI     LL@A5fE1&8HI++   s   AAA
Ar   c           	         #    [         R                  " S5        [        U[        SSS9[        [        U S9SS9I S h  vN $  N7f)Nz4[ Rodin3D API - Downloading ] Generate Successfully!z/proxy/rodin/api/v2/downloadre   rf   )r   F)rr   rs   monitor_progress)r~   r   r   r   r   r   )r   r`   s     r=   get_rodin_download_listr      sE     LLGH7G.#d3   s   :AAAr   c                   #    SU 3n[         R                  R                  [        R                  " 5       U5      n[         R
                  " USS9  S nS nU R                   H  n[         R                  R                  X6R                  5      nUR                  R                  5       R                  S5      (       a}  [         R                  R                  X&R                  5      n[        UR                  S5      I S h  vN n[        US5       nUR                  UR                  5       5        S S S 5        M  [        UR                  U5      I S h  vN   M     XE4$  N_! , (       d  f       GM  = f N 7f)NRodin3D_Texist_ok.glbglbwb)osrg   joincomfy_pathsget_output_directorymakedirsitemsnamelowerendswithr   urlr{   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TIKK	D)OG^^GGLLFF3	66<<>""6** ggll+=vvFO3AEE5AAGi&!))+, '& *!%%;;;  ## B&& <s6   C:E3<E=E3 E-#E3E1E3
E.	(
E3c                   p    \ rS rSrSr\S\R                  4S j5       r\S\R                  4S j5       r
Srg)Rodin3D_Regular   "Generate 3D Assets using Rodin APIr:   c                    [         R                  " SSS[        U R                  =(       d    S5      [         R                  R                  S5      /[        Q[         R                  R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S	[         R                  " S
S9S9	$ )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r`   s    r=   define_schemaRodin3D_Regular.define_schema   s    yy%?' !23x("
 		  o >###7
 		..		++		##
 3'
 	
r?   c           
      x  #    SnUR                   S   n/ n[        U5       H  nUR                  X   5        M     [        U5      u  p[	        U UUUU
UU	S9I S h  vN u  p[        X5      I S h  vN   [        X5      I S h  vN n[        X5      I S h  vN u  p[        R                  " X5      $  NW ND N3 N"7f)Nr_   r   ro   ri   rk   rl   rj   rm   
shaperangeappendr>   r   r   r   r   r   
NodeOutputr`   r   r   r!   r&   rj   
num_imagesm_imagesr   rm   rl   r   r   download_list
model_pathr   s                   r=   executeRodin3D_Regular.execute   s      \\!_
z"AOOFI& #&6}&E#	,@"--
 '
#	 ##39995iEE$2=$LL
}}Z11'
 	:ELH   AB:B2B:/B40B:B6B:B8B:4B:6B:8B: N__name__
__module____qualname____firstlineno__r   classmethodr   r   r   r   r   __static_attributes__r   r?   r=   r   r      D    ,
bii 
 
2 2 
2 2r?   r   c                   p    \ rS rSrSr\S\R                  4S j5       r\S\R                  4S j5       r
Srg)Rodin3D_Detaili  r   r:   c                    [         R                  " SSS[        U R                  =(       d    S5      [         R                  R                  S5      /[        Q[         R                  R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S	[         R                  " S
S9S9	$ )Nr  z#Rodin 3D Generate - Detail Generater   r   r   r   r   r   Tr   r   r   r   r   s    r=   r   Rodin3D_Detail.define_schema      yy$>' !23x("
 		  o >###7
 		..		++		##
 3'
 	
r?   c           
      x  #    SnUR                   S   n/ n[        U5       H  nUR                  X   5        M     [        U5      u  p[	        U UUUU
UU	S9I S h  vN u  p[        X5      I S h  vN   [        X5      I S h  vN n[        X5      I S h  vN u  p[        R                  " X5      $  NW ND N3 N"7f)NDetailr   r   r   r   s                   r=   r   Rodin3D_Detail.execute9  s      \\!_
z"AOOFI& #&6}&E#	,@"--
 '
#	 ##39995iEE$2=$LL
}}Z11'
 	:ELr   r   Nr   r   r?   r=   r  r    r  r?   r  c                   p    \ rS rSrSr\S\R                  4S j5       r\S\R                  4S j5       r
Srg)Rodin3D_SmoothiW  r   r:   c                    [         R                  " SSS[        U R                  =(       d    S5      [         R                  R                  S5      /[        Q[         R                  R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S	[         R                  " S
S9S9	$ )Nr  z#Rodin 3D Generate - Smooth Generater   r   r   r   r   r   Tr   r   r   r   r   s    r=   r   Rodin3D_Smooth.define_schemaZ  r  r?   c           
      t  #    UR                   S   n/ n[        U5       H  nUR                  X   5        M     [        U5      u  p[	        U UUUU	SUS9I S h  vN u  p[        X5      I S h  vN   [        X5      I S h  vN n[        X5      I S h  vN u  p[        R                  " X5      $  NW ND N3 N"7f)Nr   Smoothr   r   )r`   r   r   r!   r&   r   r   r   rm   rl   r   r   r   r   r   s                  r=   r   Rodin3D_Smooth.executet  s      \\!_
z"AOOFI& #&6}&E#	,@"--
 '
#	 ##39995iEE$2=$LL
}}Z11'
 	:ELsH   AB8B0B8-B2.B8 B4B8B6B82B84B86B8r   Nr   r   r?   r=   r  r  W  sD    ,
bii 
 
2 2 
2 2r?   r  c                   p    \ rS rSrSr\S\R                  4S j5       r\S\R                  4S j5       r
Srg)Rodin3D_Sketchi  r   r:   c                 J   [         R                  " SSS[        U R                  =(       d    S5      [         R                  R                  S5      [         R                  R                  SSSS[         R                  R                  S	S
9/[         R                  R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S	[         R                   " SS9S9	$ )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   Rodin3D_Sketch.define_schema  s    yy$>' !23x(!#!1!1!8!8!  
 		  o >###7
 		..		++		##
 35
 	
r?   c           
      Z  #    UR                   S   n/ n[        U5       H  nUR                  X   5        M     [        U UUSSSSS9I S h  vN u  pg[	        Xp5      I S h  vN   [        X`5      I S h  vN n[        X5      I S h  vN u  p[        R                  " X5      $  NW ND N3 N"7f)Nr   r"   r.   Sketchr,   r   )	r   r   r   r   r   r   r   r   r   )r`   r   r   r   r   r   r   r   r   r   r   s              r=   r   Rodin3D_Sketch.execute  s      \\!_
z"AOOFI& #,@"-
 '
#	 ##39995iEE$2=$LL
}}Z11'
 	:ELsH   A	B+B#B+ B%!B+3B'4B+B)B+%B+'B+)B+r   Nr   r   r?   r=   r  r    sE    ,
bii 
 
@ 2 
	2 2r?   r  c                   p    \ rS rSrSr\S\R                  4S j5       r\S\R                  4S j5       r
Srg)Rodin3D_Gen2i  r   r:   c                 
   [         R                  " SSS[        U R                  =(       d    S5      [         R                  R                  S5      [         R                  R                  SSSS[         R                  R                  S	S
9[         R                  R                  SSS/SS	S9[         R                  R                  S/ SQSS	S9[         R                  R                  SSS	S9/[         R                  R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                   [         R                  R"                  /S	[         R$                  " SS9S9	$ )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   rn   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   Rodin3D_Gen2.define_schema  sJ   yy"=' !23x(!#!1!1!8!8!   8ISXcgh#	 ,!   

  54 H5: 		  o >###7
 		..		++		##
 3W.
 .	
r?   c                 ~  #    SnUR                   S   n/ n[        U5       H  n	UR                  X   5        M     [        U5      u  p[	        U UUUUUU
US9I S h  vN u  p[        X5      I S h  vN   [        X5      I S h  vN n[        X5      I S h  vN u  nn[        R                  " UU5      $  NY NF N5 N$7f)NzGen-2r   )ro   ri   rk   rl   rj   rm   ra   r   )r`   r   r   r!   r&   rn   rj   r   r   r   rm   rl   r   r   r   r   r   s                    r=   r   Rodin3D_Gen2.execute  s      \\!_
z"AOOFI& #&6}&E#	,@"-	-
 	'
#	 ##39995iEE$2=$LL
G}}Z11	'
 	:ELsH   AB=B5B=0B71B=B9B=B;B=7B=9B=;B=r   Nr   r   r?   r=   r!  r!    sE    ,/
bii /
 /
b 2 
2 2r?   r!  rs   c                    [         R                  " SS9nU R                  5        H  u  p#Uc  M
  [        U[        5      (       a  UR                  X#(       a  SOS5        M;  [        U[        5      (       a&  U H  nUR                  U[        U5      5        M      Mv  [        U[        [        45      (       a  UR                  X#5        M  UR                  U[        U5      5        M     U$ )zConvert a Rodin request dict to an aiohttp form, fixing bool/list serialization.

Booleans --> "true"/"false". Lists --> one field per element.
T)default_to_multiparttruefalse)
aiohttpFormDatar   ry   bool	add_fieldlistrz   bytes	bytearray)rs   formkeyvalueitems        r=   _rodin_multipart_parserr8  $  s    
 6Djjl
=eT""NN3%W=t$$sCI. y122NN3&NN3E
+ # Kr?   requestro   c           
      (  #    Ub  [        U5      S:  a  [        S5      eSnU(       aC  U Vs/ s H6  nUc  M  S[        U[        5      (       a  [	        US5      O
[        U5      4PM8     nn[        U [        SSS9[        UUS	[        S
9I Sh  vN nUR                  (       a,  UR                  (       a  UR                  R                  (       d  [        SUR                  < 35      eUR                  UR                  R                  4$ s  snf  N7f)zESubmit a Gen-2.5 generate job; returns (task_uuid, subscription_key).Nrc   z.Rodin Gen-2.5 supports at most 5 input images.ro   rp   rd   re   rf   rq   )rr   rs   rt   ru   multipart_parserz%Rodin Gen-2.5 submit failed: message=)rx   
ValueErrorry   rz   r{   r^   r   r   r   r8  r   r   r   RuntimeErrorr}   )r`   r9  ro   rt   rV   r   s         r=   _create_gen25_taskr>  9  s     c&kAoIJJE  

  %/s%;%;UD!ASTYAZ   	 
 4VD.*0 H ==X]]5S5SB8CSCSBVWXX==(--8888+
s"   +DD2D*$DDBD>   .fbxr   .obj.stl.gltfr   geometry_file_formatc                 D  #    SU 3n[         R                  R                  [        R                  " 5       U5      n[         R
                  " USS9  SUR                  5       R                  S5       3nSnU R                   H  n[         R                  R                  XGR                  5      n[         R                  R                  UR                  R                  5       5      S   n	Ucr  X:X  am  U	[        ;   ac  [        UR                  UR                  S5      5      I Sh  vN n[        US5       n
U
R                  UR!                  5       5        SSS5        M  [#        UR                  U5      I Sh  vN   M     Uc  U R                   Hw  n[         R                  R                  UR                  R                  5       5      S   n	U	[        ;   d  MI  [        UR                  U	R                  S5      5      I Sh  vN n  U$    U$  N! , (       d  f       N= f N N 7f)zNDownload every file in the list; return the File3D matching the chosen format.Rodin3D_Gen25_Tr   .Nr   r   )r   rg   r   r   r   r   r   lstripr   r   splitext_PREVIEWABLE_3D_EXTSr   r   r{   r   r   r   )r   r   rC  folder_namesave_dir
target_extr   r7  r   extr   s              r=   _download_gen25_filesrN  `  s     #9+.Kww||K<<>LHKK4()//188=>?J#'G##GGLL995	ggtyy01!4?s0S<P5P3DHHj>O>OPS>TUUGi&!))+, '%dhh	::: $ !''D''""499??#45a8C** 7#**S/ RRN (
 N V&& 	; SsO   DH  H	!H 1 H#H 4H5AH (H =H>H 
H	H H FastzExtreme-High)
Defaultr'   r(   r)   r*   r3   r4   r5   r6   r7   )rP  legacyzextreme-lowlowmediumhigh)r   fbxobjstl)r"   r#   AllNoner   c                    [         R                  R                  U [         R                  R                  [        [         R
                  R                  S/ SQSSS9[         R
                  R                  S[        SSS9[         R                  R                  S	S
SS9/5      [         R                  R                  [        [         R
                  R                  S/ SQSS9[         R                  R                  SSSS[         R                  R                  SS9/5      [         R                  R                  [        [         R
                  R                  SSS/SS9[         R                  R                  SSSS[         R                  R                  SS9[         R                  R                  SS
SS9[         R                  R                  S	S
SS9/5      /SS9$ ) Nrj   )Gen-2.5-LowGen-2.5-MediumGen-2.5-Highr]  z<Quality tier. Higher tiers produce higher-fidelity geometry.)r%   r   tooltippolygon_countrP  zMPreset face count. 'Default' uses the server's default for the selected tier.creativeFzACreative mode (Medium/High only). Enhances generative robustness.)r   r^  )zGen-2.5-Extreme-Lowr[  r\  r]  r[  r%   r   
mesh_facesr1   i  z&Mesh face count (1K-20K in Fast mode).)r   r   r   r   r^  rm   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%   r^  )r   DynamicCombor   Option_MODE_REGULARr$  _REGULAR_POLY_OPTIONSr%  
_MODE_FASTr  r  r  _MODE_EXTREME_HIGH)r   s    r=   _build_mode_inputrj    s   ??  OO""HHNN Q . ^	 #  HHNN' 5 ) o	 #  JJ$$" % c % , OO""HHNN! !. # 	 FFLL$ % !%'%5%5%<%< H ! . OO"""HHNN;QVNWFFLL$ '!#%'%5%5%<%<^ ! 
 JJ$$" % J % 
 JJ$$" % P % %]I
VG[ ! P Pr?   include_image_onlyc                    [         R                  R                  S[        SS9[         R                  R                  S[        SS9[         R                  R                  S[
        SSS	S
9[         R                  R                  SSSS[         R                  R                  SSS9[         R                  R                  SSSSSS9[         R                  R                  SSSSSS9[         R                  R                  SSSSSS9/nU (       a0  UR                  [         R                  R                  SSSSSS95        UR                  [         R                  R                  SSSSSS9[         R                  R                  SSSS[         R                  R                  SSSS9[         R                  R                  SSSS[         R                  R                  SSS S9[         R                  R                  S!SSS[         R                  R                  SSS"S9[         R                  R                  S#SSS$[         R                  R                  SSS%S9/5        U$ )&Nrk   r#   ra  rC  r   texture_moderP  TzRTexture quality preset. 'Default' uses the server's default for the selected tier.)r%   r   r    r^  ri   r   r   )r   r   r   r   control_after_generater    rn   FzT/A pose for human-like models.)r   r    r#  r^  
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#  r^  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)rk  r   s     r=   _build_common_inputsr{    sm   
z+<hO
-7OY^_
)h 	 	
 	))00#' 	 	
 	

edTKl 	 	
 	

%$Or 	 	
 	

: 	 	
3 FB JJ$6  	
 MMJJ R   FFLL--44]  	 FFLL--447  	 FFLL--447  	 FFLL--44N  	M0	
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                    U S   n0 nU[         :X  aR  U S   US'   U R                  SS5      nUS:w  a  [        U5      u  pEXBS'   XRS'   U R                  S5      (       a  SUS'   U$ U[        :X  a   U S   US'   S	US'   [	        U S
   5      US'   U$ U[
        :X  aT  SUS'   U S   US'   [	        U S
   5      US'   U R                  S5      (       a  SUS'   U R                  S5      (       a  SUS'   U$ )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).
moderj   r_  rP  rm   rl   r`  geometry_instruct_moder0   rb  zGen-2.5-Extreme-Highrc  T)rf  r<   r>   rh  rN   ri  )r|  selectedoutpolygonrm   facess         r=   _resolve_mode_paramsr  Y  s-    &!HC=  (F..)<i/8I(&+"#>>*%%,6C() J 
Z	 (F K"%j&>"? J 
'	',F%k2K"%j&>"?>>*%%"C
O>>*%%,6C()Jr?   )promptrq  rk   rm  ri   rn   ro  rp  rr  rs  rt  ru  rv  r  rq  c                    [        U 5      nS nU	(       a  U
(       a  U(       a  XU/n[        S0 SUS   _SU=(       d    S _SU_SU_SU_SUS:X  a  S OU_SUR                  S5      _S	UR                  S	5      _S
UR                  S
5      _SU_SU=(       d    S _SU=(       d    S _SU=(       d    S _SU=(       d    S _SUR                  S5      _SU=(       d    S _SU(       a  S/_6$ S _6$ )Nrj   r  ri   rk   rC  rm  rP  rm   rl   r  bbox_conditionheightrn   ro  rp  rc  rq  addonsHighPackr   )r  r   r<   )r|  rk   rC  rm  ri   rn   ro  rp  rr  rs  rt  ru  rv  r  rq  mode_paramsbboxs                    r=   _build_requestr  |  sA   $ 'z2KDkk5  ~  	
 2 *Y6TL //+. %);<  +/GH   D ~ % (/4 ,  .5!"  .
|# " 48# r?   c            !           \ rS rSr\S\R                  4S j5       r\S\R                  R                  S\
S\S\S\S	\S
\S\S\S\S\S\S\S\S\S\R                  4 S j5       rSrg)Rodin3D_Gen25_Imagei  r:   c                 4   [         R                  " SSSS[         R                  R                  S[         R                  R	                  [         R
                  R                  S5      SSSS	9S
S9[        5       /[        SS9Q[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                  " [         R                  " SS/S9[         S9S9	$ )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.ro   rV   r   rc   )prefixr   r   zB1-5 images. The first image is used for materials when multi-view.)templater^  Trk  
model_filer   r~  rr  widgets
depends_onr   r   )r   r   Autogrowr   TemplatePrefixr   rj  r{  	File3DAnyr   r   r   r   r   r   PriceBadgeDepends_PRICE_EXPRr   s    r=   r   !Rodin3D_Gen25_Image.define_schema  s    yy)9'X !![[77w8OX_eflm7n` " 
 "# &> \\((l(CD		..		++		##
 //AQ8RS 1
 	
r?   ro   r~  rk   rC  rm  ri   rn   ro  rp  rq  rr  rs  rt  ru  rv  c                   #    UR                  5        Vs/ s H
  nUc  M  UPM     nnU(       d  [        S5      e/ nU Hs  n[        US5      (       aN  [        UR                  5      S:X  a5  [        UR                  S   5       H  nUR                  UU   5        M     Mb  UR                  U5        Mu     [        U5      S:  a  [        S[        U5       S35      e[        UUUUUUUU	UUUUUS U
S9n[        U UU5      I S h  vN u  nn[        UU 5      I S h  vN   [        UU 5      I S h  vN n[        UUU5      I S h  vN n[        R                  " U5      $ s  snf  N_ NJ N8 N%7f)	Nz6Rodin Gen-2.5 Image-to-3D requires at least one image.r      r   rc   z1Rodin Gen-2.5 accepts at most 5 images; received rF  )r|  rk   rC  rm  ri   rn   ro  rp  rr  rs  rt  ru  rv  r  rq  )valuesr<  r|   rx   r   r   r   r  r>  r   r   rN  r   r   )r`   ro   r~  rk   rC  rm  ri   rn   ro  rp  rq  rr  rs  rt  ru  rv  imgimage_tensorsflat_imagesrT   r   r9  r   r   r   r   s                             r=   r   Rodin3D_Gen25_Image.execute  sn    & )/K3KUVV #Fvw''C,=,Bv||A/A&&vay1 0 ""6* $ {aPQTU`QaPbbcdee !5%!+)!##1
$ -?sG[,Y&Y#	#"#3S9995iEE-mYH\]]}}W%%M LD 'Z9E]sW   E+EECE+E#E+E%E+.E'/E+E) E+%E+'E+)E+r   N)r   r  r  r  r  r   r   r   r  Typedictrz   rN   r/  r   r   r  r   r?   r=   r  r    s    
bii 
 
> 8&  8& 8& 	8&
 "8& 8& 8& 8& 8& 8& !8& 8& 8& 8& 8&  !8&" 
#8& 8&r?   r  c                       \ rS rSr\S\R                  4S j5       r\S\S\	S\S\S\S	\
S
\S\S\S\S\
S\
S\
S\
S\R                  4S j5       rSrg)Rodin3D_Gen25_Texti  r:   c                    [         R                  " SSSS[         R                  R                  SSSSS	9[	        5       /[        S
S9Q[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                  " [         R                  " SS/S9[        S9S9	$ )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   r^  Fr  r  r   r~  rr  r  r  r   )r   r   r   r   rj  r{  r  r   r   r   r   r   r   r  r  r   s    r=   r    Rodin3D_Gen25_Text.define_schema	  s    yy(8'X 		";	    "#	 &?	 \\((l(CD		..		++		##
 //AQ8RS 3
 	
r?   r  r~  rk   rC  rm  ri   rn   ro  rp  rr  rs  rt  ru  rv  c                 .  #    [        USSSS9  [        UUUUUUUU	U
UUUUUS9n[        XS S9I S h  vN u  nn[        UU 5      I S h  vN   [	        UU 5      I S h  vN n[        UUU5      I S h  vN n[        R                  " U5      $  NZ NE N3 N 7f)Nr  r   i	  )
field_name
min_length
max_length)r|  rk   rC  rm  ri   rn   ro  rp  rr  rs  rt  ru  rv  r  )ro   )r   r  r>  r   r   rN  r   r   )r`   r  r~  rk   rC  rm  ri   rn   ro  rp  rr  rs  rt  ru  rv  r9  r   r   r   r   s                       r=   r   Rodin3D_Gen25_Text.execute*  s     $ 	8dS !5%!+)!##
  -?sTX,Y&Y#	#"#3S9995iEE-mYH\]]}}W%%	 'Z9E]sE   0BBB	B
BBB2B3BBBBr   N)r   r  r  r  r  r   r   r   rz   r  rN   r/  r   r   r  r   r?   r=   r  r    s    
bii 
 
@ &&&& && 	&&
 "&& && && && && && && && && && &&  
!&& &&r?   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)Rodin3DExtensioniT  r:   c                 T   #    [         [        [        [        [        [
        [        /$ 7fr   )r   r  r  r  r!  r  r  )selfs    r=   get_node_listRodin3DExtension.get_node_listU  s&      
 	
s   &(r   N)r   r  r  r  r   r1  typer   	ComfyNoder  r  r   r?   r=   r  r  T  s)    	
T$r||*<%= 	
 	
r?   r  c                     #    [        5       $ 7fr   )r  r   r?   r=   comfy_entrypointr  b  s     s   )i  @ )Nr   r"   r.   r_   r,   F)r~  )Yr   r~   rL   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  rz   tuplerN   __annotations__r>   r^   r  r  r/  r   r   r   r   r   File3Dr   r   r  r  r  r!  r.  r8  r1  r>  rI  rN  rf  rh  ri  rg  ry  rx  rw  rd  rj  r{  r  r  r  r  r  r  r  r   r?   r=   <module>r     sq     	      & " 6 6	 	 	  FFLL%%,,   HHNN?UH,=uW[N\HHNNO	   ( $#$$%"#$$$%5 tCsCx01 B BsCx B3 F 	
	,'	bll	,' ,'^	!; 	 	=9 =cDj =	 	4;M 	Rl 	 $r||2D I` $c $eC$JW[H[<[6\ $*82bll 82v82R\\ 82v72R\\ 72t;2R\\ ;2|R22<< R2j$sCx. W5E5E *!9	bll	!9 !9 4K!9 38_	!9H A  *     \\D	 F 
#   V 7 4 QC QR__-B-B Qh_ _ _D T  d  d $!** * 	*
 * * * * * * * * * * $J*  !*" #*Z[&",, [&|J& J&Z
~ 
 0 r?   