
    3j                        S SK Jr  S SKJr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JrJrJrJrJrJr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$  S\S\%4S jr& S7S	\'\RP                     S\S
\)S-  S\RT                  4S jjr+ " S S\RP                  5      r, " S S\RP                  5      r- " S S\RP                  5      r. " S S\RP                  5      r/ " S S\RP                  5      r0 " S S\RP                  5      r1 " S S\RP                  5      r2 " S S\RP                  5      r3 " S S\RP                  5      r4S\)S\)S \)S\%4S! jr5S"\6S\74S# jr8S"\6S\Rr                  R
                  4S$ jr:S%\;S\;4S& jr<S\74S' jr=S%\;S(\)S)\)S*\6S+\6S,\6S\;4S- jr> " S. S/\RP                  5      r? " S0 S1\RP                  5      r@ " S2 S3\RP                  5      rA " S4 S5\5      rBS\B4S6 jrCg)8    )override)IOComfyExtensionInputTypes)TripoAnimateRetargetRequestTripoAnimateRigRequestTripoConvertModelRequestTripoFileEmptyReferenceTripoFileReferenceTripoImageToModelRequestTripoImportModelRequestTripoModelVersionTripoMultiviewToModelRequestTripoOrientationTripoP1ImageToModelRequestTripoP1MultiviewToModelRequestTripoP1TextToModelRequestTripoRefineModelRequest
TripoStyleTripoTaskResponseTripoTaskStatusTripoTaskTypeTripoTextToModelRequestTripoTextureModelRequestTripoTexturePromptTripoUrlReference)ApiEndpointdownload_url_to_file_3dpoll_opsync_opupload_3d_model_to_comfyapiupload_images_to_comfyapiresponsereturnc                     U R                   bM  S HG  n[        U R                   R                  US 5      c  M'  [        U R                   R                  U5      s  $    [        SU  35      e)N)	pbr_modelmodel
base_modelz'Failed to get model url from response: )datagetattroutputRuntimeError)r$   keys     ;/home/wildlama/comfy/ComfyUI/comfy_api_nodes/nodes_tripo.pyget_model_url_from_responser0   &   s[    }} 7Cx}}++S$7Cx}}33S99 8 @
K
LL    Nnode_clsaverage_durationc                 r  #    UR                   S:w  a  [        SUR                   35      eUR                  R                  n[        U [        SU 3S9[        [        R                  /[        R                  [        R                  [        R                  [        R                  [        R                  /S S S US9	I S	h  vN nUR                  R                  [        R                  :X  a8  [!        U5      n[#        US
US9I S	h  vN n[$        R&                  " U S3X65      $ [        SU 35      e Nr N.7f)z`Polls the Tripo API endpoint until the task reaches a terminal state, then returns the response.r   zFailed to generate mesh: /proxy/tripo/v2/openapi/task/pathc                 .    U R                   R                  $ Nr*   statusxs    r/   <lambda>%poll_until_finished.<locals>.<lambda>C   s    166==r1   c                 .    U R                   R                  $ r9   r*   progressr<   s    r/   r>   r?   D   s    QVV__r1   c                 n    U R                   R                  (       a  U R                   R                  S-  $ S $ )Ng{Gz?)r*   consumed_creditr<   s    r/   r>   r?   E   s(    166CYCY!&&"8"84"?"c_c"cr1   )poll_endpointresponse_modelcompleted_statusesfailed_statusesstatus_extractorprogress_extractorprice_extractorestimated_durationNglb)task_idz.glb)coder-   errorr*   rN   r    r   r   r   SUCCESSFAILED	CANCELLEDUNKNOWNBANNEDEXPIREDr;   r0   r   r   
NodeOutput)r2   r$   r3   rN   response_pollurlfile_glbs          r/   poll_until_finishedr[   .   s     }}6x~~6FGHHmm##G!!)Fwi'PQ(+334""%%##""##
 14c+ M"   O$;$;;)-80eWMM}}y-wAA
2=/B
CC+& Ns%   B>D7 D3AD7D5-D75D7c                       \ rS rSrSr\S 5       r\            SS\S\S-  S\S-  S\S-  S	\S-  S
\	S-  S\	S-  S\	S-  S\S-  S\S-  S\	S-  S\S-  S\
R                  4S jj5       rSrg)TripoTextToModelNodeO   zM
Generates 3D models synchronously based on a text prompt using Tripo's API.
c                 *   [         R                  " SSS[         R                  R                  SSS9[         R                  R                  SSSS9[         R                  R                  S	[
        [
        R                  SS
9[         R                  R                  S[        SSS
9[         R                  R                  SSSS9[         R                  R                  SSSS9[         R                  R                  SSSSS9[         R                  R                  SSSSS9[         R                  R                  SSSSS9[         R                  R                  SSSS/SSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSS9[         R                  R                  SSSS/SSS9/[         R                  R                  S S!9[         R                  " S"5      R                  S#S!9[         R                  R                  S$S!9/[         R                  R                  [         R                  R                  [         R                  R                   /SS[         R"                  " [         R$                  " / S%QS&9S'S(9S)9	$ )*Nr]   zTripo: Text to Modelpartner/3d/TripopromptT)	multilinenegative_prompt)rb   optionalmodel_versionoptionsdefaultrd   styleNonetexturerh   rd   pbr
image_seed*   rh   rd   advanced
model_seedtexture_seedtexture_qualitystandarddetailedrh   rg   rd   rq   
face_limit逄 rh   minmaxrd   rq   quadFgeometry_quality
model_filedisplay_nameMODEL_TASK_IDmodel task_idGLBre   rk   rm   r~   rt   r   widgetsa  
                (
                  $isV14 := $contains(widgets.model_version,"v1.4");
                  $isV3OrLater := $contains(widgets.model_version,"v3.");
                  $withTexture := widgets.texture or widgets.pbr;
                  $isHdTexture := (widgets.texture_quality = "detailed");
                  $isDetailedGeometry := (widgets.geometry_quality = "detailed");
                  $credits := $isV14 ? 20 : (
                    ($withTexture ? 20 : 10)
                    + (widgets.quad ? 5 : 0)
                    + ($isHdTexture ? 10 : 0)
                    + (($isDetailedGeometry and $isV3OrLater) ? 20 : 0)
                  );
                  {"type":"usd","usd": $round($credits * 0.01, 2), "format": {"approximate": true}}
                )
                
depends_onexpr	node_idr   categoryinputsoutputshiddenis_api_nodeis_output_nodeprice_badge)r   SchemaStringr   Combor   v2_5_20250123r   BooleanIntOutputCustom	File3DGLBHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDependsclss    r/   define_schema"TripoTextToModelNode.define_schemaT   s?   yy*/'		D9		 1TDQ#->HYHgHgrv   w
FUYZ

  D4 H

  t D\2tT\2tT^R$QUV%&'4!!   \227UYdhi

  PT U&&'4!!  +< 		  l ;		/*111O###7 		..		++		##
 //	[I
 I	
r1   Nra   rc   ri   rk   rm   rn   rr   rs   rt   r   rx   r~   r%   c                   #    US:X  a  S OUnU(       d  [        S5      e[        U [        SSS9[        [	        [
        R                  UU(       a  UOS UUUUUUU	U
US:w  a  UOS USUS9S	9I S h  vN n[        XS
S9I S h  vN $  N N7f)Nrj   Prompt is required/proxy/tripo/v2/openapi/taskPOSTr7   methodry   T)typera   rc   re   ri   rk   rm   rn   rr   rs   rt   rx   r   	auto_sizer~   endpointrF   r*   P   r3   )r-   r!   r   r   r   r   TEXT_TO_MODELr[   )r   ra   rc   re   ri   rk   rm   rn   rr   rs   rt   r   rx   r~   
style_enumr$   s                   r/   executeTripoTextToModelNode.execute   s     " #f_T%
344  &DVT,("003B+ %%) /)3r)9:t!1	
 
, )LLL-
, Ms$   A,B	.B/B	 BB	B	 NNNNNNNNNNNN)__name__
__module____qualname____firstlineno____doc__classmethodr   strboolintr   rW   r   __static_attributes__r   r1   r/   r]   r]   O   s    J
 J
X  '+ #!%!%#'&*'+!% )M)M t)M
 Tz)M )M D[)M $J)M $J)M Dj)M t)M *)M $J)M Tk)M 
)M )Mr1   r]   c                       \ rS rSrSr\S 5       r\            SS\R                  S\	S-  S\	S-  S\
S-  S	\
S-  S
\S-  S\S-  S\	S-  S\	S-  S\	S-  S\S-  S\
S-  S\R                  4S jj5       rSrg)TripoImageToModelNode   zN
Generates 3D models synchronously based on a single image using Tripo's API.
c                 >   [         R                  " SSS[         R                  R                  S5      [         R                  R                  S[
        SSS9[         R                  R                  S	[        S
SS9[         R                  R                  SSSS9[         R                  R                  SSSS9[         R                  R                  SSSSS9[         R                  R                  S[        [        R                  SSS9[         R                  R                  SSSSS9[         R                  R                  SSSS/SSS9[         R                  R                  SSSS/SSS9[         R                  R                  SSSSSSS9[         R                  R                  S S!SSS9[         R                  R                  S"SSS/SSS9/[         R                  R                  S#S$9[         R                  " S%5      R                  S&S$9[         R                  R                  S'S$9/[         R                  R                   [         R                  R"                  [         R                  R$                  /SS[         R&                  " [         R(                  " / S(QS)9S*S+9S,9	$ )-Nr   zTripo: Image to Modelr`   imagere   'The model version to use for generationT)rg   tooltiprd   ri   rj   rf   rk   rl   rm   rr   ro   rp   orientationrg   rh   rd   rq   rs   rt   ru   rv   rw   texture_alignmentoriginal_imagegeometryrx   ry     r{   r~   Fr   r   r   r   r   r   r   r   a  
                (
                  $isV14 := $contains(widgets.model_version,"v1.4");
                  $isV3OrLater := $contains(widgets.model_version,"v3.");
                  $withTexture := widgets.texture or widgets.pbr;
                  $isHdTexture := (widgets.texture_quality = "detailed");
                  $isDetailedGeometry := (widgets.geometry_quality = "detailed");
                  $credits := $isV14 ? 30 : (
                    ($withTexture ? 30 : 20)
                    + (widgets.quad ? 5 : 0)
                    + ($isHdTexture ? 10 : 0)
                    + (($isDetailedGeometry and $isV3OrLater) ? 20 : 0)
                  );
                  {"type":"usd","usd": $round($credits * 0.01, 2), "format": {"approximate": true}}
                )
                r   r   )r   r   Imager   r   r   r   r   r   r   DEFAULTr   r   r   r   r   r   r   r   r   r   r   s    r/   r   #TripoImageToModelNode.define_schema   s_   yy+0'w'#-E!	   w
FUYZ

  D4 H

  t D\2tT!,,44!!   ^R$QUV%&'4!!   ',-z:!!   \226TXcgh

  PT U&&'4!!  I+Z 		  l ;		/*111O###7 		..		++		##
 //	yX
 X	
r1   Nr   re   ri   rk   rm   rr   rs   rt   r   r   rx   r~   r%   c                 J  #    US:X  a  S OUnUc  [        S5      e[        [        [        XSS9I S h  vN S   SS9S9n[	        U [        S	S
S9[        [        [        R                  UUUUUUUU
UUU	US:w  a  UOS SUS9S9I S h  vN n[        U USS9I S h  vN $  Nj N N7f)Nrj   Image is required   
max_imagesr   jpegrY   r   rootr   r   r   ry   T)r   filere   ri   rk   rm   rr   r   r   r   rs   rt   rx   r   r~   r   r   r   )r-   r   r   r#   r!   r   r   r   r   IMAGE_TO_MODELr[   )r   r   re   ri   rk   rm   rr   r   rs   rt   r   r   rx   r~   r   
tripo_filer$   s                    r/   r   TripoImageToModelNode.execute/  s     " #f_T%
=233'"4SANNPQR

 ! &DVT,)"11+ %'!1"3) /)3r)9:t	
 
, )hLLL5 O
, Ms4   0B#BAB#BB#B!B#B#!B#r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rW   r   r   r   r1   r/   r   r      s    Y
 Y
v  %) #!%#'&*'+(,!% /M{{/M Tz/M Tz	/M
 /M D[/M $J/M Dj/M t/M */M :/M $J/M Tk/M 
/M /Mr1   r   c            "       T   \ rS rSrSr\S 5       r\              SS\R                  S\R                  S-  S\R                  S-  S\R                  S-  S	\	S-  S
\	S-  S\
S-  S\
S-  S\S-  S\S-  S\	S-  S\	S-  S\	S-  S\S-  S\
S-  S\R                  4 S jj5       rSrg)TripoMultiviewToModelNodeib  zl
Generates 3D models synchronously based on up to four images (front, left, back, right) using Tripo's API.
c                    [         R                  " SSS[         R                  R                  S5      [         R                  R                  SSS9[         R                  R                  SSS9[         R                  R                  S	SS9[         R                  R                  S
[
        SSS9[         R                  R                  S[        [        R                  SSS9[         R                  R                  SSSS9[         R                  R                  SSSS9[         R                  R                  SSSSS9[         R                  R                  SSSSS9[         R                  R                  SSSS/SSS9[         R                  R                  SSSS/SSS9[         R                  R                  SSSSSSS 9[         R                  R                  S!S"SSS#S$9[         R                  R                  S%SSS/SSS9/[         R                  R                  S&S'9[         R                  " S(5      R                  S)S'9[         R                  R                  S*S'9/[         R                  R                  [         R                  R                   [         R                  R"                  /SS[         R$                  " [         R&                  " / S+QS,9S-S.9S/9	$ )0Nr   zTripo: Multiview to Modelr`   r   
image_leftT)rd   
image_backimage_rightre   r   )rg   rd   r   r   r   rk   rl   rm   rr   ro   rp   rs   rt   ru   rv   rw   r   r   r   rx   ry   r   r{   r~   Fz.This parameter is deprecated and does nothing.rh   rd   rq   r   r   r   r   r   r   r   )re   rk   rm   rt   r   r   a  
                (
                  $isV14 := $contains(widgets.model_version,"v1.4");
                  $isV3OrLater := $contains(widgets.model_version,"v3.");
                  $withTexture := widgets.texture or widgets.pbr;
                  $isHdTexture := (widgets.texture_quality = "detailed");
                  $isDetailedGeometry := (widgets.geometry_quality = "detailed");
                  $credits := $isV14 ? 30 : (
                    ($withTexture ? 30 : 20)
                    + ($isHdTexture ? 10 : 0)
                    + (($isDetailedGeometry and $isV3OrLater) ? 20 : 0)
                  );
                  {"type":"usd","usd": $round($credits * 0.01, 2), "format": {"approximate": true}}
                )
                r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   'TripoMultiviewToModelNode.define_schemag  s   yy/4'w'|d;|d;}t<#-!E	   !,,44!!   

  D4 H

  t D\2tT^R$QUV%&'4!!   ',-z:!!   \226TXcgh

  !!!L !  &&'4!!  Y3j 		  l ;		/*111O###7 		..		++		##
 //I^
 ^	
r1   Nr   r   r   r   re   r   rk   rm   rr   rs   rt   r   r   rx   r~   r%   c                   #    Uc  [        S5      e/ nXX4S.nUc  Uc  Uc  [        S5      eS HZ  nUU   nUb6  UR                  [        [        [	        U USS9I S h  vN S   SS9S	95        MA  UR                  [        5       5        M\     [        U [        S
SS9[        [        [        R                  UUUUUU	U
UUUUS:w  a  UOS S S9S9I S h  vN n[        U USS9I S h  vN $  N N N7f)Nz%front image for multiview is required)r   r   r   r   zIAt least one of left, back, or right image must be provided for multiviewr   r   r   r   r   r   r   r   r   ry   )r   filesre   r   rk   rm   rr   rs   rt   r   r   rx   r~   )rF   r*   r   r   )r-   appendr   r   r#   r   r!   r   r   r   r   MULTIVIEW_TO_MODELr[   )r   r   r   r   r   re   r   rk   rm   rr   rs   rt   r   r   rx   r~   images
image_dict
image_nameimage_r$   s                        r/   r   !TripoMultiviewToModelNode.execute  s*    & =FGG$ju
*"49LjkkNJ
+F!&.'@fYZ'[![]^ _fl 578 O !;FK,-"55+'%) /!1"3)3r)9:t	
 
( )hLLL5 "\
( Ms7   AC.C(A3C.C*C.#C,$C.*C.,C.r   )NNNNNNNNNNNNNNr   r   r1   r/   r   r   b  s]    _
 _
B  *.)-*.$("&#!%#'&*'+(,!% !8M{{8M KK$&8M KK$&	8M
 [[4'8M Tz8M 4Z8M 8M D[8M $J8M Dj8M t8M *8M :8M $J8M  Tk!8M" 
#8M 8Mr1   r   c                       \ rS rSr\S 5       r\      SS\S-  S\S-  S\S-  S\S-  S\S-  S	\S
\	R                  4S jj5       rSrg)TripoTextureNodei  c                    [         R                  " SSS[         R                  " S5      R                  S5      [         R                  R                  SSSS9[         R                  R                  S	SSS9[         R
                  R                  S
SSSS9[         R                  R                  SSSS/SSS9[         R                  R                  SSSS/SSS9[         R                  R                  SSSSSS9/[         R                  R                  SS9[         R                  " S5      R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /SS[         R                  " [         R                  " S/S9SS9S9	$ ) Nr   zTripo: Texture modelr`   r   model_task_idrk   Trl   rm   rs   ro   rp   rt   ru   rv   rw   r   r   r   texture_prompt zOptional text guidance for texturing. Required in practice for imported models (Tripo: Import Model), which carry no source image to infer colors from.)rh   rb   rd   r   r   r   r   r   r   z
                (
                  $tq := widgets.texture_quality;
                  {"type":"usd","usd": ($contains($tq,"detailed") ? 0.2 : 0.1), "format": {"approximate": true}}
                )
                r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   TripoTextureNode.define_schema  s   yy&/'		/*00A

  D4 H

  t D^R$QUV%&'4!!   ',-z:!!   		$"!f   ': 		  l ;		/*111O###7 		..		++		##
 //9J8KLY5
 5	
r1   Nrk   rm   rs   rt   r   r   r%   c                    #    [        U [        SSS9[        [        UUUUUUUR	                  5       (       a  [        UR	                  5       S9OS S9S9I S h  vN n[        XSS9I S h  vN $  N N7f)	Nr   r   r   )text)original_model_task_idrk   rm   rs   rt   r   r   r   r   r   )r!   r   r   r   stripr   r[   )	r   r   rk   rm   rs   rt   r   r   r$   s	            r/   r   TripoTextureNode.execute@  s      ! &DVT,)'4) /"3R`RfRfRhRh1~7K7K7MNnr	
 
 )LLL
 Ms$   AA2A.A2)A0*A20A2r   )NNNNNr   )r   r   r   r   r   r   r   r   r   r   rW   r   r   r   r1   r/   r   r     s    6
 6
p   $#'&*(, M M D[	M
 DjM tM :M M 
M Mr1   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)TripoRefineNodei\  c                    [         R                  " SSSS[         R                  " S5      R                  SSS9/[         R                  R                  S	S
9[         R                  " S5      R                  SS
9[         R                  R                  SS
9/[         R                  R                  [         R                  R                  [         R                  R                  /SS[         R                  " SS9S9
$ )Nr   zTripo: Refine Draft modelr`   z7Refine a draft model created by v1.4 Tripo models only.r   r   zMust be a v1.4 Tripo modelr   r   r   r   r   Tz9{"type":"usd","usd":0.3, "format": {"approximate": true}}r   )
r   r   r   descriptionr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   TripoRefineNode.define_schema^  s    yy%4'Q		/*00Jf0g 		  l ;		/*111O###7 		..		++		##
 T)
 	
r1   r%   c           	         #    [        U [        SSS9[        [        US9S9I S h  vN n[	        XSS9I S h  vN $  N N7f)Nr   r   r   )draft_model_task_idr      r   )r!   r   r   r   r[   )r   r   r$   s      r/   r   TripoRefineNode.executey  sJ       &DVT,(]K	
 
 )MMM
 Ns   #A <A >A A r   N
r   r   r   r   r   r   r   rW   r   r   r   r1   r/   r   r   \  s6    
 
4 NR]] N Nr1   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)TripoRigNodei  c                    [         R                  " SSS[         R                  " S5      R                  S5      /[         R                  R                  SS9[         R                  " S5      R                  S	S9[         R                  R                  S
S9/[         R                  R                  [         R                  R                  [         R                  R                  /SS[         R                  " SS9S9	$ )Nr  zTripo: Rig modelr`   r   r   r   r   RIG_TASK_IDzrig task_idr   Tz:{"type":"usd","usd":0.25, "format": {"approximate": true}}r  r   r  r   s    r/   r   TripoRigNode.define_schema  s    yy"+'IIo.445MNO		  l ;		-(//]/K###7 		..		++		##
 U#
 	
r1   r%   c                    #    [        U [        SSS9[        [        USSS9S9I S h  vN n[	        XSS	9I S h  vN $  N N7f)
Nr   r   r   rM   tripo)r   
out_formatspecr      r   )r!   r   r   r	   r[   )r   r   r$   s      r/   r   TripoRigNode.execute  sQ       &DVT,'?Ubgnuv	
 
 )MMM
 Ns   %A>AA A Ar   Nr  r   r1   r/   r  r    s6    
 
. Nbmm N Nr1   r  c                   T    \ rS rSr\S 5       r\S\S\R                  4S j5       r	Sr
g)TripoRetargetNodei  c                 .   [         R                  " SSS[         R                  " S5      R                  S5      [         R                  R                  S/ SQS9/[         R
                  R                  S	S
9[         R                  " S5      R                  SS
9[         R                  R                  SS
9/[         R                  R                  [         R                  R                  [         R                  R                  /SS[         R                  " SS9S9	$ )Nr  zTripo: Retarget rigged modelr`   r  r   	animation)zpreset:idlezpreset:walkz
preset:runzpreset:divezpreset:climbzpreset:jumpzpreset:slashzpreset:shootzpreset:hurtzpreset:fallzpreset:turnzpreset:quadruped:walkzpreset:hexapod:walkzpreset:octopod:walkzpreset:serpentine:marchzpreset:aquatic:marchrg   r   r   RETARGET_TASK_IDzretarget task_idr   Tz9{"type":"usd","usd":0.1, "format": {"approximate": true}}r  r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   TripoRetargetNode.define_schema  s    yy'7'		-(../GH  2 		  l ;		,-44BT4U###7 		..		++		##
 TQ+
 +	
r1   r  r%   c                    #    [        U [        SSS9[        [        UUSSS9S9I S h  vN n[	        XSS	9I S h  vN $  N N7f)
Nr   r   r   rM   T)r   r  r  bake_animationr      r   )r!   r   r   r   r[   )r   r   r  r$   s       r/   r   TripoRetargetNode.execute  sV       &DVT,,'=# #		

 

 )LLL

 Ms   &A?AAAAr   N)r   r   r   r   r   r   r   r   rW   r   r   r   r1   r/   r  r    s?    ,
 ,
\ Mc Mbmm M Mr1   r  c            '           \ rS rSr\S 5       r\S 5       r\S\S\S\S\	S\S	\
S
\	S\S\S\
S\S\S\S\S\S\S\S\S\R                  4&S j5       rSrg)TripoConversionNodei  c                    [         R                  " SSS[         R                  " S5      R                  S5      [         R                  R                  S/ SQS9[         R
                  R                  S	S
SSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSSS9[         R                  R                  S/ SQSSSS9[         R
                  R                  SS
SSS9[         R
                  R                  SS
SSS9[         R                  R                  SSSSSSS9[         R
                  R                  SS
SSS9[         R                  R                  SSSSSS9[         R
                  R                  S S
SSS9[         R
                  R                  S!S
SSS9[         R
                  R                  S"S
SSS9[         R                  R                  S#S$SSS9[         R                  R                  S%/ S&QS'SSS9[         R
                  R                  S(S
SSS9[         R                  R                  S)S*S+/S+SSS9[         R
                  R                  S,S
SSS9// [         R                  R                  [         R                  R                  [         R                  R                  /SS[         R                  " [         R                  " / S-QS.9S/S09S19	$ )2Nr#  zTripo: Convert modelr`   z*MODEL_TASK_ID,RIG_TASK_ID,RETARGET_TASK_IDr   format)GLTFUSDZFBXOBJSTL3MFr  r~   FTrp   rx   ry   rz   r{   texture_size      texture_format)	BMPDPXHDRJPEGOPEN_EXRPNGTARGATIFFWEBPr3  r   force_symmetryflatten_bottomflatten_bottom_threshold              ?pivot_to_center_bottomscale_factor)rh   r|   rd   rq   with_animationpack_uvbake
part_namesr   
fbx_preset)blendermixamo3dsmaxrE  export_vertex_colorsexport_orientationalign_imagerh   animate_in_place)r~   rx   r,  r/  r:  r;  r>  r?  r   a  
                (
                    $face := (widgets.face_limit != null) ? widgets.face_limit : -1;
                    $texSize := (widgets.texture_size != null) ? widgets.texture_size : 4096;
                    $flatThresh := (widgets.flatten_bottom_threshold != null) ? widgets.flatten_bottom_threshold : 0;
                    $scale := (widgets.scale_factor != null) ? widgets.scale_factor : 1;
                    $texFmt := (widgets.texture_format != "" ? widgets.texture_format : "jpeg");
                    $advanced :=
                      widgets.quad or
                      widgets.flatten_bottom or
                      widgets.pivot_to_center_bottom or
                      ($face != -1) or
                      ($texSize != 4096) or
                      ($flatThresh != 0) or
                      ($scale != 1) or
                      ($texFmt != "jpeg");
                    {"type":"usd","usd": ($advanced ? 0.1 : 0.05), "format": {"approximate": true}}
                )
                r   r   )r   r   r   r   r   r   r   Floatr   r   r   r   r   r   r   r   s    r/   r   !TripoConversionNode.define_schema  s   yy)/'		FGMMNfgx1]^

  PT U !!   " !!   $e"!!   

  !154Z^ _

  !154Z^ _.!!   

  !95SWbf g"!!   

  !154Z^ _

  EDSW X

  PT U		b4RVW ;%!!   

  !7QU`d e(*I6%!!   

  !3UT\` aAAD 		..		++		##
 //	 ]o
 o	
r1   c                     US   S;  a  gg)Nr   )r   r  r  zRoriginal_model_task_id must be MODEL_TASK_ID, RIG_TASK_ID or RETARGET_TASK_ID typeTr   )r   input_typess     r/   validate_inputs#TripoConversionNode.validate_inputs_  s     /08llgr1   r%  r~   r9  rx   r:  r;  r,  r/  r>  r?  r@  rA  rB  rC  rD  rH  rI  rK  r%   c                    #    U(       d  [        S5      eS nU(       a[  UR                  5       (       aF  UR                  S5       Vs/ s H*  nUR                  5       (       d  M  UR                  5       PM,     nn[        U [	        SSS9[
        [        S#0 SU_SU_SU(       a  UOS _S	U(       a  UOS _S
US:w  a  UOS _SU(       a  UOS _SUS:w  a  UOS _SUS:w  a  UOS _SU	S:w  a  U	OS _SU
(       a  U
OS _SUS:w  a  UOS _SU(       a  UOS _SU(       a  UOS _SU(       a  UOS _SU_SUS:w  a  UOS _SU(       a  UOS _SUS:w  a  UOS _SU(       a  UOS _6S 9I S h  vN n[        U US!S"9I S h  vN $ s  snf  N N7f)$Nz"original_model_task_id is required,r   r   r   r   r%  r~   r9  rx   ry   r:  r;  r<  r,  r-  r/  r3  r>  r?  r=  r@  rA  rB  rC  rD  rE  rH  rI  rh   rK  r   r   r   r   )r-   r   splitr!   r   r   r
   r[   )r   r   r%  r~   r9  rx   r:  r;  r,  r/  r>  r?  r@  rA  rB  rC  rD  rH  rI  rK  part_names_listnamer$   s                          r/   r   TripoConversionNode.executeg  s    . &CDD ***,,8B8H8H8M^8MQUQ[Q[Q]|tzz|8MO^  &DVT,) '= "Tt 2@~T	
 *4r)9:t 2@~T F^adEd)Ajn .:T-A\t 2@61I~t BX'=]a .:S-@\d 2@~T $+ "Tt +  *4y)@:d!" >R%9W[#$ :Ly9X#5^b%& 6F!14'	
 
4 )hLLL9 _
4 Ms7   AE>E5#E57C&E>E:E>0E<1
E><E>r   N)r   r   r   r   r   r   rP  r   r   r   floatr   rW   r   r   r   r1   r/   r#  r#    s   p
 p
d   8M 8M 	8M
 8M 8M 8M #(8M 8M 8M !%8M 8M 8M 8M 8M  !8M" #8M$ #%8M&  '8M( )8M* 
+8M 8Mr1   r#  c                   p    \ rS rSrSrSr\S 5       r\S\R                  S\
R                  4S j5       rSrg	)
TripoImportModelNodei  z]Imports an external 3D model into Tripo, producing a MODEL_TASK_ID for post-processing nodes.)rM   fbxobjstlc                 
   [         R                  " SSSS[         R                  R                  S[         R                  [         R
                  [         R                  [         R                  [         R                  /SS9/[         R                  " S5      R                  S	S
9/[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                  " SS9S9	$ )NrZ  zTripo: Import Modelr`   a%  Import an external 3D model (e.g. from Rodin, Hunyuan3D or a local file) into Tripo to use it with Tripo's post-processing nodes: Texture, Rig, Convert. GLB is recommended: textures survive import only when embedded in the file. Note that texturing an imported model requires a texture prompt.model_3dzg3D model to import (GLB / FBX / OBJ / STL, up to 150 MB). OBJ and STL files carry no embedded textures.)typesr   r   r   r   Tz{"type":"text","text":"Free"}r  	r   r   r   r  r   r   r   r   r   )r   r   	MultiTyper   r   	File3DFBX	File3DOBJ	File3DSTL	File3DAnyr   r   r   r   r   r   r   r   s    r/   r   "TripoImportModelNode.define_schema  s    yy*.'O
 ""<<r||R\\SUS_S_`D #  		/*111O 		..		++		##
 83
 	
r1   r_  r%   c           
        #    UR                   =(       d    SR                  S5      R                  5       nUS:X  a  [        S5      eX R                  ;  a;  [        SU=(       d    S SSR                  S	 U R                   5       5       S35      e[        UR                  5       5      nUS
:  a  [        SUS-  S S35      e[        XU5      I S h  vN n[        U [        SSS9[        [        XBS9S9I S h  vN nUR                  S:w  a  [        SUR                   35      eUR                   R"                  n[%        U [        SU 3S9[        [&        R(                  [&        R*                  [&        R,                  [&        R.                  [&        R0                  /S S SS9I S h  vN nUR                   R2                  [&        R4                  :w  a  [        SU 35      e[6        R8                  " U5      $  GN( GN NV7f)Nr   .gltfz`GLTF (.gltf) references external files and cannot be imported. Export a single-file GLB instead.zUnsupported 3D format 'unknownz'. Tripo import supports: z, c              3   @   #    U  H  oR                  5       v   M     g 7fr9   )upper).0fs     r/   	<genexpr>/TripoImportModelNode.execute.<locals>.<genexpr>  s     3]G\!GGIIG\s   i  `	zModel file is i   z.1fz& MB; Tripo import allows up to 150 MB.z/proxy/tripo/v2/openapi/importr   r   )rY   r%  r   r   zFailed to import model: r5   r6   c                 .    U R                   R                  $ r9   r:   r<   s    r/   r>   .TripoImportModelNode.execute.<locals>.<lambda>  s    qvv}}r1   c                 .    U R                   R                  $ r9   rA   r<   s    r/   r>   rs    s    r1   
   )rE   rF   rH   rI   rJ   rL   )r%  lstriplower
ValueErrorSUPPORTED_FORMATSjoinlen	get_bytesr"   r!   r   r   r   rO   r-   rP   r*   rN   r    r   rR   rS   rT   rU   rV   r;   rQ   r   rW   )r   r_  file_formatsizerY   r$   rN   rX   s           r/   r   TripoImportModelNode.execute  s    ,"44S9??A& r  333)+*B)C D**.))3]sG\G\3]*])^^_a  8%%'(##~dk.B3-GGmnoo/{KK  &FvV,(SE	
 
 ==A!9(..9IJKK--''%%-J7)+TU,&&))''&&'' 58!
 
 $$(?(??!9-IJJ}}W%%9 L

s8   CHG9&H8G<9B/H(G?)AH<H?Hr   N)r   r   r   r   r   ry  r   r   r   File3Dr   rW   r   r   r   r1   r/   rZ  rZ    sG    g4
 
> +&U\\ +&bmm +& +&r1   rZ  geometry_creditstextured_creditsdetailed_creditsc                     SU  SU SU S3$ )Nz(  $mode := widgets.output_mode;  $detailed := $lookup(widgets, "output_mode.texture_quality") = "detailed";  $credits := $mode = "geometry only" ? z : ($detailed ? z : zK);  {"type":"usd","usd": $credits * 0.01, "format": {"approximate": true}})r   r  r  r  s      r/   _p1_price_exprr    s2    	3 4D2DDTUeTffijzi{ |	r1   include_image_alignmentc           
         [         R                  R                  SSSS9[         R                  R                  SSS/SS9/nU (       aS  UR	                  [         R                  R                  S	S
S/S
SS9[         R                  R                  SSS/SSS9/5        UR                  [         R                  R                  SSSS95        U$ )zMInputs shown inside the 'Textured' branch of the P1 output_mode DynamicCombo.rm   Tz9Include PBR maps. When on, base texture is forced on too.)rh   r   rt   ru   rv   )rg   rh   r   r   r   zRPrioritize visual fidelity to the source image, or alignment to the mesh geometry.)rg   rh   r   r   rh   rJ  zHRotate the output to match the source image. Only applies when textured.rs   ro   )rh   rq   )r   r   r   r   extendr   r   )r  r   s     r/   _p1_textured_inputsr    s     	

6qr
(:z2JT^_F '-z:,p	   !&6%f	  	
  MM"&&,,~rD,IJMr1   c                     [         R                  R                  S[         R                  R                  S/ 5      [         R                  R                  S[	        U S95      /SS9$ )Noutput_modeGeometry onlyTexturedr  zK"Geometry only" returns an untextured mesh. "Textured" adds color/PBR maps.)rg   r   )r   DynamicCombor   Optionr  r  s    r/   _build_p1_output_moder    s[    ??  OO""?B7OO"":/B[r/st
 ^ !  r1   r  c                     U S   nUS:X  a  SSS.$ S[        U R                  SS5      5      U R                  SS5      U R                  S	5      S
.nSU ;   a  U S   US'   SU ;   a  U S   US'   U$ )zTranslate the output_mode DynamicCombo payload into P1 request fields.

pbr=true forces texture=true server-side, but we send both explicitly so the
intent is visible in the request body and logs.
r  r  F)rk   rm   Trm   rt   ru   rs   )rk   rm   rt   rs   r   r   )r   get)r  modeouts      r/   _resolve_p1_texture_fieldsr  (  s     }%D //KOOE401&??+<jI#7	C k)#./B#C #(7MJr1   c                  H   [         R                  R                  SSSSSSSS9[         R                  R                  SS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/$ )z9Inputs shared by all P1 nodes (placed after output_mode).rx   ry   i N  Tz;Target face count, 48-20000. -1 lets Tripo pick adaptively.)rh   r|   r}   rd   rq   r   rr   ro   rp   r   Fz2Scale the output to approximate real-world meters.r   	export_uvzDUV unwrap during generation. Turn off for faster geometry-only runs.compress_geometryz<Apply geometry-based compression. Decompress before editing.)r   r   r   r   r   r1   r/   _p1_common_inputsr  >  s     	Q 	 	
 	\2tL


H 	 	
 	

Z 	 	
 	

R 	 	
3   r1   rx   rr   r   r  r  c                 l    UUS:w  a  UOSUUU(       a  SOSS.nUR                  [        U 5      5        U$ )z8Common P1 request fields shared by all three node types.ry   Nr   )rr   rx   r   r  compress)updater  )r  rx   rr   r   r  r  kwargss          r/   _build_p1_request_kwargsr  c  s@     !$."$4j$"3JF MM,[9:Mr1   c                       \ rS rSr\S 5       r\       SS\S\S\S-  S\S-  S\S	\S-  S
\	S\	S\	S\
R                  4S jj5       rSrg)TripoP1TextToModelNodeix  c                    [         R                  " SSSS[         R                  R                  SSSS9[         R                  R                  S	SSS
S9[	        SS9[         R
                  R                  SSSSS9/[        5       Q[         R                  R                  SS9[         R                  " S5      R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                  " [         R                  " SS/S9[!        SSSS9S9S9	$ )Nr  zTripo P1: Text to Modelr`   zTTripo P1 text-to-3D. Optimized for low-poly, game-ready meshes with stable topology.ra   TzUp to 1024 characters.)rb   r   rc   zUp to 255 characters.)rb   rd   r   Fr  rn   ro   rp   r   r   r   r   r   r  output_mode.texture_qualityr   r   (   2   r  r   ra  )r   r   r   r   r  r   r  r   r   r   r   r   r   r   r   r   r  r   s    r/   r   $TripoP1TextToModelNode.define_schemaz  s-   yy,2'n		DBZ[		 1TDZqr%eD\2tT	
 #$ 		  l ;		/*111O###7 		..		++		##
 //He8fg#R"_ab/
 	
r1   Nra   r  rc   rn   rx   rr   r   r  r  r%   c
           	         #    U(       d  [        S5      e[        UUUUUU	S9n
[        S
UU=(       d    S US.U
D6n[        U [	        SSS9[
        US9I S h  vN n[        XSS	9I S h  vN $  N N7f)Nr   r  rx   rr   r   r  r  )ra   rc   rn   r   r   r   r   <   r   r   )r-   r  r   r!   r   r   r[   )r   ra   r  rc   rn   rx   rr   r   r  r  commonrequestr$   s                r/   r   TripoP1TextToModelNode.execute  s      344)#!!/
 , 
+3t!
 	
 ! &DVT,	
 
 )LLL
 Ms$   AA1A-A1(A/)A1/A1r   )NNry   NFTF)r   r   r   r   r   r   r   dictr   r   r   rW   r   r   r   r1   r/   r  r  x  s    
 
< 
 '+!%!%"'"M"M "M t	"M
 $J"M "M $J"M "M "M  "M 
"M "Mr1   r  c                       \ rS rSr\S 5       r\      SS\R                  S\S\	S\
S\
S-  S	\	S
\	S\	S\R                  4S jj5       rSrg)TripoP1ImageToModelNodei  c                    [         R                  " SSSS[         R                  R                  S5      [	        SS9[         R
                  R                  SS	SSS
S9/[        5       Q[         R                  R                  SS9[         R                  " S5      R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                  " [         R                   " SS/S9[#        SSSS9S9S9	$ )Nr  zTripo P1: Image to Modelr`   z@Tripo P1 image-to-3D. Optimized for low-poly, game-ready meshes.r   Tr  enable_image_autofixFz:Pre-process the input image for better generation quality.r   r   r   r   r   r   r  r  r   r  r  r  r  r   ra  )r   r   r   r   r  r   r  r   r   r   r   r   r   r   r   r   r   r  r   s    r/   r   %TripoP1ImageToModelNode.define_schema  s   yy-3'Zw'%dC

  *!!!X !  #$ 		  l ;		/*111O###7 		..		++		##
 //He8fg#R"_ab9 
  	
r1   Nr   r  r  rx   rr   r   r  r  r%   c	           
        #    Uc  [        S5      e[        [        [        XSS9I S h  vN S   SS9S9n	[	        UUUUUUS9n
[        SU	US	.U
D6n[        U [        S
SS9[        US9I S h  vN n[        XSS9I S h  vN $  NZ N N7f)Nr   r   r   r   r   r   r   r  )r   r  r   r   r   r   r  r   r   )
r-   r   r   r#   r  r   r!   r   r   r[   )r   r   r  r  rx   rr   r   r  r  r   r  r  r$   s                r/   r   TripoP1ImageToModelNode.execute  s      =233'"4SANNPQR

 *#!!/
 - 
!5
 

 ! &DVT,	
 
 )LLL/ O"
 Ms4   &B	BAB	,B-B	>B?B	B	B	r   )Fry   NFTF)r   r   r   r   r   r   r   r   r  r   r   r   rW   r   r   r   r1   r/   r  r    s    !
 !
F 
 &+!%"'&M{{&M &M #	&M
 &M $J&M &M &M  &M 
&M &Mr1   r  c                       \ rS rSr\S 5       r\        SS\R                  S\S\R                  S-  S\R                  S-  S\R                  S-  S	\	S
\	S-  S\
S\
S\
S\R                  4S jj5       rSrg)TripoP1MultiviewToModelNodei  c                    [         R                  " SSSS[         R                  R                  SSS9[         R                  R                  SS	S
S9[         R                  R                  SS	SS9[         R                  R                  SS	SS9[	        S	S9/[        5       Q[         R                  R                  SS9[         R                  " S5      R                  SS9[         R                  R                  SS9/[         R                  R                  [         R                  R                  [         R                  R                  /S	[         R                  " [         R                  " SS/S9[!        SSSS9S9S9	$ )Nr  zTripo P1: Multiview to Modelr`   zTripo P1 multiview-to-3D from 2-4 reference images in [front, left, back, right] order. Front is required; any combination of the other three may be omitted.r   u   Front view (0°). Required.r  r   Tu/   Left view (90°), i.e. the subject's left side.)rd   r   r   u   Back view (180°).r   u2   Right view (270°), i.e. the subject's right side.r  r   r   r   r   r   r  r  r   r  r  r  r  r   ra  )r   r   r   r   r  r  r   r   r   r   r   r   r   r   r   r   r  r   s    r/   r   )TripoP1MultiviewToModelNode.define_schema  sV   yy17'T w0MN !M  
 |dDXY!!P  
 &dC #$" 		  l ;		/*111O###7 		..		++		##
 //He8fg#R"_abC%
 %	
r1   Nr   r  r   r   r   rx   rr   r   r  r  r%   c           
        #    XXE/n[        S U 5       5      S:  a  [        S5      e/ nU H]  nUc"  UR                  [        [	        5       S95        M(  [        XSS9I S h  vN S   nUR                  [        [        USS	9S95        M_     [        UUUUU	U
S
9n[        SSU0UD6n[        U [        SSS9[        US9I S h  vN n[        U USS9I S h  vN $  Ny N N7f)Nc              3   .   #    U  H  oc  M  Sv   M     g 7f)Nr   r   )rn  vs     r/   rp  6TripoP1MultiviewToModelNode.execute.<locals>.<genexpr>I  s     1%Qqq%s   	   zRTripo P1 multiview requires at least 2 images (front plus one of left/back/right).r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   )sumr-   r   r   r   r#   r   r  r   r!   r   r   r[   )r   r   r  r   r   r   rx   rr   r   r  r  viewsr   viewrY   r  r  r$   s                     r/   r   #TripoP1MultiviewToModelNode.execute:  s     J<1%11A5stt*,D|/5L5NOP23KKQOCLL+1BsQW1XYZ  *#!!/
 1GuGG  &DVT,	
 
 )hLLL% L
 Ms7   AC!!C"A!C!CC!CC!C!C!r   )NNNry   NFTF)r   r   r   r   r   r   r   r   r  r   r   r   rW   r   r   r   r1   r/   r  r    s    &
 &
P 
 *.)-*.!%"'(M{{(M (M KK$&	(M
 KK$&(M [[4'(M (M $J(M (M (M  (M 
(M (Mr1   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)TripoExtensionif  r%   c                    #    [         [        [        [        [        [
        [        [        [        [        [        [        /$ 7fr9   )r]   r   r   r  r  r  rZ  r   r   r  r  r#  )selfs    r/   get_node_listTripoExtension.get_node_listg  s5      !!%"#' 
 	
s   ?Ar   N)r   r   r   r   r   listr   r   	ComfyNoder  r   r   r1   r/   r  r  f  s)    
T$r||*<%= 
 
r1   r  c                     #    [        5       $ 7fr9   )r  r   r1   r/   comfy_entrypointr  y  s     s   r9   )Dtyping_extensionsr   comfy_api.latestr   r   r   r   comfy_api_nodes.apis.tripor   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   comfy_api_nodes.utilr   r   r    r!   r"   r#   r   r0   r   r  r   rW   r[   r]   r   r   r   r   r  r  r#  rZ  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r   r1   r/   <module>r     sZ   & = =     0 M*; M M $(D2<< DD DjD ]]	DB|M2<< |M~QMBLL QMh`M `MFTMr|| TMn%Nbll %NP"N2<< "NJ>M >MBvM",, vMrQ&2<< Q&h s VY ^a D T 6d r?T?T D T ,"4 "J  	
    
*DMR\\ DMNMMbll MM`TM",, TMn
^ 
& r1   