
    +j                     B   d dl m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mZmZmZmZ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  dede!fdZ"	 d5d	e#ej$                 ded
e%dz  dej&        fdZ' G d dej$                  Z( G d dej$                  Z) G d dej$                  Z* G d dej$                  Z+ G d dej$                  Z, G d dej$                  Z- G d dej$                  Z. G d dej$                  Z/de%de%de%de!fdZ0d e1de2fd!Z3d e1dej4        j        fd"Z5d#e6de6fd$Z7de2fd%Z8d#e6d&e%d'e%d(e1d)e1d*e1de6fd+Z9 G d, d-ej$                  Z: G d. d/ej$                  Z; G d0 d1ej$                  Z< G d2 d3e          Z=de=fd4Z>dS )6    )override)IOComfyExtensionInput)TripoAnimateRetargetRequestTripoAnimateRigRequestTripoConvertModelRequestTripoFileEmptyReferenceTripoFileReferenceTripoImageToModelRequestTripoModelVersionTripoMultiviewToModelRequestTripoOrientationTripoP1ImageToModelRequestTripoP1MultiviewToModelRequestTripoP1TextToModelRequestTripoRefineModelRequest
TripoStyleTripoTaskResponseTripoTaskStatusTripoTaskTypeTripoTextToModelRequestTripoTextureModelRequestTripoUrlReference)ApiEndpointdownload_url_to_file_3dpoll_opsync_opupload_images_to_comfyapiresponsereturnc                     | j         <dD ]9}t          | j         j        |d           t          | j         j        |          c S :t          d|            )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_responser,   #   sh    } 7 	: 	:Cx}+S$77Cx}3S99999 D
KKK
L
LL    Nnode_clsaverage_durationc                 ,  K   |j         dk    rt          d|j                   |j        j        }t          | t          d|           t          t          j	        gt          j
        t          j        t          j        t          j        t          j        gd d d |	  	         d	{V }|j        j        t          j	        k    r@t!          |          }t#          |d
|           d	{V }t%          j        | d||          S t          d|           )z`Polls the Tripo API endpoint until the task reaches a terminal state, then returns the response.r   zFailed to generate mesh: z/proxy/tripo/v2/openapi/task/)pathc                     | j         j        S N)r&   statusxs    r+   <lambda>z%poll_until_finished.<locals>.<lambda>@   s
    16= r-   c                     | j         j        S r3   )r&   progressr5   s    r+   r7   z%poll_until_finished.<locals>.<lambda>A   s
    QV_ r-   c                 <    | j         j        r| j         j        dz  nd S )Ng{Gz?)r&   consumed_creditr5   s    r+   r7   z%poll_until_finished.<locals>.<lambda>B   s     16CY"c!&"84"?"?_c r-   )poll_endpointresponse_modelcompleted_statusesfailed_statusesstatus_extractorprogress_extractorprice_extractorestimated_durationNglb)task_idz.glb)coder)   errorr&   rE   r   r   r   r   SUCCESSFAILED	CANCELLEDUNKNOWNBANNEDEXPIREDr4   r,   r   r   
NodeOutput)r.   r    r/   rE   response_pollurlfile_glbs          r+   poll_until_finishedrR   +   sG      }Gx~GGHHHm#G!!'Pw'P'PQQQ(+34"%#"#
 1044cc+        M"  O$;;;)-880eWMMMMMMMMM}---wAAA
B=BB
C
CCr-   c                       e Zd ZdZed             Ze	 	 	 	 	 	 	 	 	 	 	 	 ddededz  dedz  dedz  dedz  d	edz  d
edz  dedz  dedz  dedz  dedz  dedz  de	j
        fd            ZdS )TripoTextToModelNodezU
    Generates 3D models synchronously based on a text prompt using Tripo's API.
    c                 Z   t          j        dddt           j                            dd          t           j                            ddd          t           j                            d	t
          t
          j        d
          t           j                            dt          dd
          t           j                            ddd          t           j                            ddd          t           j	                            dddd          t           j	                            dddd          t           j	                            dddd          t           j                            ddddgdd          t           j	                            dddddd          t           j                            dddd          t           j                            ddddgdd          gt           j        
                    d !          t          j        d"          
                    d#!          t           j        
                    d$!          gt           j        j        t           j        j        t           j        j        gddt          j        t          j        g d%&          d'(          )	  	        S )*NrT   zTripo: Text to Modelpartner/3d/TripopromptT)	multilinenegative_prompt)rX   optionalmodel_versionoptionsdefaultrZ   styleNonetexturer^   rZ   pbr
image_seed*   r^   rZ   advanced
model_seedtexture_seedtexture_qualitystandarddetailedr^   r]   rZ   rg   
face_limit逄 r^   minmaxrZ   rg   quadFgeometry_quality
model_filedisplay_nameMODEL_TASK_IDmodel task_idGLBr[   ra   rc   rt   rj   ru   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_idrx   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_schemaz"TripoTextToModelNode.define_schemaQ   si   y*/'	D99	 1TDQQ#->HYHgrv    w
FUYZZ
  D4 HH
  t DD\2tTT\2tTT^R$QUVV%&'4!!    \227UYdhii
  PT UU&&'4!!   +< 	  l ;;	/**111OO###77 	.	+	#
 /  	 	 	  [I
 I
 I
 I	
r-   NrW   rY   r_   ra   rc   rd   rh   ri   rj   ru   rn   rt   r!   c                 *  K   |dk    rd n|}|st          d          t          | t          dd          t          t	          t
          j        ||r|nd |||||||	|
|dk    r|nd |d|          	           d {V }t          | |d
           d {V S )Nr`   Prompt is required/proxy/tripo/v2/openapi/taskPOSTr1   methodro   T)typerW   rY   r[   r_   ra   rc   rd   rh   ri   rj   rn   ru   	auto_sizert   endpointr=   r&   P   r/   )r)   r   r   r   r   r   TEXT_TO_MODELrR   )r   rW   rY   r[   r_   ra   rc   rd   rh   ri   rj   ru   rn   rt   
style_enumr    s                   r+   executezTripoTextToModelNode.execute   s      " #f__TT%
 	53444  &DVTTT,("03B L+ %%) /)3r)9)9::t!1  	
 
 
 
 
 
 
 
 
, )hLLLLLLLLLLr-   NNNNNNNNNNNN)__name__
__module____qualname____doc__classmethodr   strboolintr   rN   r    r-   r+   rT   rT   L   sJ         J
 J
 [J
X  '+ #!%!%#'&*'+!% )M )M)M t)M
 Tz)M )M D[)M $J)M $J)M Dj)M t)M *)M $J)M Tk)M 
)M )M )M [)M )M )Mr-   rT   c                       e Zd ZdZed             Ze	 	 	 	 	 	 	 	 	 	 	 	 ddej        dedz  dedz  de	dz  de	dz  d	e
dz  d
e
dz  dedz  dedz  dedz  de
dz  de	dz  dej        fd            ZdS )TripoImageToModelNodezV
    Generates 3D models synchronously based on a single image using Tripo's API.
    c                 j   t          j        dddt           j                            d          t           j                            dt
          dd          t           j                            d	t          d
d          t           j                            ddd          t           j                            ddd          t           j                            dddd          t           j                            dt          t          j
        dd          t           j                            dddd          t           j                            ddddgdd          t           j                            ddddgdd          t           j                            dddddd          t           j                            d d!dd          t           j                            d"dddgdd          gt           j                            d#$          t          j        d%                              d&$          t           j                            d'$          gt           j        j        t           j        j        t           j        j        gddt          j        t          j        g d()          d*+          ,	  	        S )-Nr   zTripo: Image to ModelrV   imager[   'The model version to use for generationT)r]   tooltiprZ   r_   r`   r\   ra   rb   rc   rh   re   rf   orientationr]   r^   rZ   rg   ri   rj   rk   rl   rm   texture_alignmentoriginal_imagegeometryrn   ro     rq   rt   Fru   rv   rw   ry   rz   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   z#TripoImageToModelNode.define_schema   s   y+0'w''#-E!	    w
FUYZZ
  D4 HH
  t DD\2tTT!,,4!!    ^R$QUVV%&'4!!    ',-z:!!    \226TXcghh
  PT UU&&'4!!   I+Z 	  l ;;	/**111OO###77 	.	+	#
 /  	 	 	  yX
 X
 X
 X	
r-   Nr   r[   r_   ra   rc   rh   ri   rj   ru   r   rn   rt   r!   c                   K   |dk    rd n|}|t          d          t          t          t          | |d           d {V d         d                    }t	          | t          d	d
          t          t          t          j	        ||||||||
|||	|dk    r|nd d|                     d {V }t          | |d           d {V S )Nr`   Image is required   
max_imagesr   jpegrP   r   rootr   r   r   ro   T)r   filer[   r_   ra   rc   rh   r   ru   r   ri   rj   rn   r   rt   r   r   r   )r)   r   r   r   r   r   r   r   r   IMAGE_TO_MODELrR   )r   r   r[   r_   ra   rc   rh   r   ri   rj   ru   r   rn   rt   r   
tripo_filer    s                    r+   r   zTripoImageToModelNode.execute,  sD     " #f__TT%
=2333'"4S%ANNNNNNNNNPQR  
 
 

 ! &DVTTT,)"1+ %'!1"3) /)3r)9)9::t  	
 
 
 
 
 
 
 
 
, )hLLLLLLLLLLr-   r   r   r   r   r   r   r   r   r   r   r   r   r   rN   r   r   r-   r+   r   r      sL         Y
 Y
 [Y
v  %) #!%#'&*'+(,!% /M /M{/M Tz/M Tz	/M
 /M D[/M $J/M Dj/M t/M */M :/M $J/M Tk/M 
/M /M /M [/M /M /Mr-   r   c            "       $   e Zd ZdZed             Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddej        dej        dz  dej        dz  dej        dz  dedz  d	edz  d
e	dz  de	dz  de
dz  de
dz  dedz  dedz  dedz  de
dz  de	dz  dej        f d            ZdS )TripoMultiviewToModelNodezt
    Generates 3D models synchronously based on up to four images (front, left, back, right) using Tripo's API.
    c                    t          j        dddt           j                            d          t           j                            dd          t           j                            dd          t           j                            d	d          t           j                            d
t
          dd          t           j                            dt          t          j        dd          t           j                            ddd          t           j                            ddd          t           j	                            dddd          t           j	                            dddd          t           j                            ddddgdd          t           j                            ddddgdd          t           j	                            dddddd           t           j                            d!d"ddd#$          t           j                            d%dddgdd          gt           j
                            d&'          t          j        d(                              d)'          t           j                            d*'          gt           j        j        t           j        j        t           j        j        gddt          j        t          j        g d+,          d-.          /	  	        S )0Nr   zTripo: Multiview to ModelrV   r   
image_leftT)rZ   
image_backimage_rightr[   r   )r]   rZ   r   r   r   ra   rb   rc   rh   re   rf   ri   rj   rk   rl   rm   r   r   r   rn   ro   r   rq   rt   Fz.This parameter is deprecated and does nothing.r^   rZ   rg   r   ru   rv   rw   ry   rz   r{   )r[   ra   rc   rj   ru   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   z'TripoMultiviewToModelNode.define_schemad  s   y/4'w''|d;;|d;;}t<<#-!E	    !,,4!!    
  D4 HH
  t DD\2tTT^R$QUVV%&'4!!    ',-z:!!    \226TXcghh
  !!!L !   &&'4!!   Y3j 	  l ;;	/**111OO###77 	.	+	#
 /      I^
 ^
 ^
 ^	
r-   Nr   r   r   r   r[   r   ra   rc   rh   ri   rj   ru   r   rn   rt   r!   c                 D  K   |t          d          g }||||d}|||t          d          dD ]|}||         }|O|                    t          t          t	          | |d           d {V d         d          	                     [|                    t                                 }t          | t          d
d          t          t          t          j        ||||||	|
||||dk    r|nd d                      d {V }t          | |d           d {V S )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   ro   )r   filesr[   r   ra   rc   rh   ri   rj   ru   r   rn   rt   )r=   r&   r   r   )r)   appendr   r   r   r
   r   r   r   r   r   MULTIVIEW_TO_MODELrR   )r   r   r   r   r   r[   r   ra   rc   rh   ri   rj   ru   r   rn   rt   images
image_dict
image_nameimage_r    s                        r+   r   z!TripoMultiviewToModelNode.execute  s     & =FGGG$Jjituu
*"49LjkkkN 	9 	9J
+F!&.'@fYZ'['['[![![![![![![]^ _fl        5778888 ;FKKK,-"5+'%) /!1"3)3r)9)9::t  	
 
 
 
 
 
 
 
 
( )hLLLLLLLLLLr-   )NNNNNNNNNNNNNNr   r   r-   r+   r   r   _  s         _
 _
 [_
B  *.)-*.$("&#!%#'&*'+(,!% !8M 8M{8M K$&8M K$&	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 8M [8M 8M 8Mr-   r   c                       e Zd Zed             Ze	 	 	 	 	 d
dedz  dedz  dedz  dedz  dedz  dej	        fd	            Z
dS )TripoTextureNodec                 ^   t          j        dddt          j        d                              d          t           j                            ddd          t           j                            d	dd          t           j                            d
ddd          t           j                            ddddgdd          t           j                            ddddgdd          gt           j                            d          t          j        d                              d          t           j	                            d          gt           j
        j        t           j
        j        t           j
        j        gddt          j        t          j        dg          d          	  	        S )Nr   zTripo: Texture modelrV   ry   model_task_idra   Trb   rc   ri   re   rf   rj   rk   rl   rm   r   r   r   rv   rw   rz   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   zTripoTextureNode.define_schema  s   y&/'	/**00AA
  D4 HH
  t DD^R$QUVV%&'4!!    ',-z:!!   * 	  l ;;	/**111OO###77 	.	+	#
 /9J8KLLL  I-
 -
 -
 -	
r-   Nra   rc   ri   rj   r   r!   c                    K   t          | t          dd          t          t          ||||||                     d {V }t	          | |d           d {V S )Nr   r   r   )original_model_task_idra   rc   ri   rj   r   r   r   r   )r   r   r   r   rR   )r   r   ra   rc   ri   rj   r   r    s           r+   r   zTripoTextureNode.execute5  s       ! &DVTTT,)'4) /"3  	
 
 
 
 
 
 
 
 
 )hLLLLLLLLLLr-   )NNNNN)r   r   r   r   r   r   r   r   r   rN   r   r   r-   r+   r   r     s        .
 .
 [.
`   $#'&*(,M M M D[	M
 DjM tM :M 
M M M [M M Mr-   r   c                   J    e Zd Zed             Zedej        fd            ZdS )TripoRefineNodec                    t          j        ddddt          j        d                              dd          gt           j                            d	
          t          j        d                              d
          t           j                            d
          gt           j        j        t           j        j	        t           j        j
        gddt          j        d          
  
        S )Nr   zTripo: Refine Draft modelrV   z7Refine a draft model created by v1.4 Tripo models only.ry   r   zMust be a v1.4 Tripo modelr   rv   rw   rz   r{   Tz9{"type":"usd","usd":0.3, "format": {"approximate": true}}r   )
r   rx   r   descriptionr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r+   r   zTripoRefineNode.define_schemaQ  s    y%4'Q	/**00Jf0gg 	  l ;;	/**111OO###77 	.	+	#
 T  )
 
 
 	
r-   r!   c                    K   t          | t          dd          t          t          |                     d {V }t	          | |d           d {V S )Nr   r   r   )draft_model_task_idr      r   )r   r   r   r   rR   )r   r   r    s      r+   r   zTripoRefineNode.executel  s        &DVTTT,(]KKK	
 
 
 
 
 
 
 
 
 )hMMMMMMMMMMr-   Nr   r   r   r   r   r   rN   r   r   r-   r+   r   r   O  s]        
 
 [
4 NR] N N N [N N Nr-   r   c                   J    e Zd Zed             Zedej        fd            ZdS )TripoRigNodec                    t          j        dddt          j        d                              d          gt           j                            d          t          j        d                              d	          t           j                            d
          gt           j        j        t           j        j	        t           j        j
        gddt          j        d          	  	        S )Nr   zTripo: Rig modelrV   ry   r   rv   rw   RIG_TASK_IDzrig task_idr{   Tz:{"type":"usd","usd":0.25, "format": {"approximate": true}}r   r   r   r   s    r+   r   zTripoRigNode.define_schemay  s    y"+'Io..445MNNO	  l ;;	-((//]/KK###77 	.	+	#
 U  #
 
 
 	
r-   r!   c           
         K   t          | t          dd          t          t          |dd                     d {V }t	          | |d	           d {V S )
Nr   r   r   rD   tripo)r   
out_formatspecr      r   )r   r   r   r   rR   )r   r   r    s      r+   r   zTripoRigNode.execute  s        &DVTTT,'?Ubgnuvvv	
 
 
 
 
 
 
 
 
 )hMMMMMMMMMMr-   Nr   r   r-   r+   r   r   w  s]        
 
 [
. Nbm N N N [N N Nr-   r   c                   N    e Zd Zed             Zededej        fd            ZdS )TripoRetargetNodec                    t          j        dddt          j        d                              d          t           j                            dg d          gt           j                            d	
          t          j        d                              d
          t           j                            d
          gt           j        j	        t           j        j
        t           j        j        gddt          j        d          	  	        S )Nr   zTripo: Retarget rigged modelrV   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r]   rv   rw   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   zTripoRetargetNode.define_schema  s   y'7'	-((../GHH     2 	  l ;;	,--44BT4UU###77 	.	+	#
 T  Q+
 +
 +
 +	
r-   r   r!   c                    K   t          | t          dd          t          t          ||dd                     d {V }t	          | |d	           d {V S )
Nr   r   r   rD   T)r   r   r   bake_animationr      r   )r   r   r   r   rR   )r   r   r   r    s       r+   r   zTripoRetargetNode.execute  s        &DVTTT,,'=# #	  	

 

 

 

 

 

 

 

 

 )hLLLLLLLLLLr-   N)	r   r   r   r   r   r   r   rN   r   r   r-   r+   r   r     sf        ,
 ,
 [,
\ Mc Mbm M M M [M M Mr-   r   c            '           e Zd Zed             Ze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dededede
j        f&d            ZdS )TripoConversionNodec                 "   t          j        dddt          j        d                              d          t           j                            dg d          t           j                            d	d
dd          t           j                            dddddd          t           j                            dddddd          t           j                            dg dddd          t           j                            dd
dd          t           j                            dd
dd          t           j                            dddddd          t           j                            dd
dd          t           j                            ddddd          t           j                            d d
dd          t           j                            d!d
dd          t           j                            d"d
dd          t           j                            d#d$dd          t           j                            d%g d&d'dd          t           j                            d(d
dd          t           j                            d)d*d+gd+dd          t           j                            d,d
dd          gg t           j	        j
        t           j	        j        t           j	        j        gddt          j        t          j        g d-.          d/0          1	  	        S )2Nr  zTripo: Convert modelrV   z*MODEL_TASK_ID,RIG_TASK_ID,RETARGET_TASK_IDr   format)GLTFUSDZFBXOBJSTL3MFr   rt   FTrf   rn   ro   rp   rq   texture_size      texture_format)	BMPDPXHDRJPEGOPEN_EXRPNGTARGATIFFWEBPr  r   force_symmetryflatten_bottomflatten_bottom_threshold              ?pivot_to_center_bottomscale_factor)r^   rr   rZ   rg   with_animationpack_uvbake
part_names 
fbx_preset)blendermixamo3dsmaxr'  export_vertex_colorsexport_orientationalign_imager^   animate_in_place)rt   rn   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   z!TripoConversionNode.define_schema  s1   y)/'	FGGMMNfggx1]1]1]^^
  PT UU !!    " !!    $eee"!!    
  !154Z^ __
  !154Z^ __.!!    
  !95SWbf gg"!!    
  !154Z^ __
  EDSW XX
  PT UU	b4RVWW ;;;%!!    
  !7QU`d ee(*I6%!!    
  !3UT\` aaAAD 	.	+	#
 /	 	 	       ]o
 o
 o
 o	
r-   c                     |d         dvrdS dS )Nr   )ry   r   r   zRoriginal_model_task_id must be MODEL_TASK_ID, RIG_TASK_ID or RETARGET_TASK_ID typeTr   )r   input_typess     r+   validate_inputsz#TripoConversionNode.validate_inputsR  s!     /08lllggtr-   r  rt   r  rn   r  r  r  r  r  r   r!  r"  r#  r$  r&  r*  r+  r-  r!   c                 Z  K   |st          d          d }|r3|                                rd |                    d          D             }t          | t	          dd          t
          t          d$i d|d|d	|r|nd d
|r|nd d|dk    r|nd d|r|nd d|dk    r|nd d|dk    r|nd d|	dk    r|	nd d|
r|
nd d|dk    r|nd d|r|nd d|r|nd d|r|nd d|d|dk    r|nd d|r|nd d|dk    r|nd d |r|nd !           d {V }t          | |d"#           d {V S )%Nz"original_model_task_id is requiredc                 ^    g | ]*}|                                 |                                 +S r   )strip).0names     r+   
<listcomp>z/TripoConversionNode.execute.<locals>.<listcomp>w  s2    ^^^QUQ[Q[Q]Q]^tzz||^^^r-   ,r   r   r   r   r  rt   r  rn   ro   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)   r4  splitr   r   r   r	   rR   )r   r   r  rt   r  rn   r  r  r  r  r  r   r!  r"  r#  r$  r&  r*  r+  r-  part_names_listr    s                         r+   r   zTripoConversionNode.executeZ  s     . & 	ECDDD  	_***,, 	_^^
8H8H8M8M^^^O  &DVTTT,)   '='=v "+TTt 2@I~~T	
 *4r)9)9::t 2@I~~T F^adEdEd)A)Ajn .:T-A-A\\t 2@61I1I~~t BX'a'='=]a .:S-@-@\\d 2@I~~T $+4 "+TTt +?  *4y)@)@::d!" >R%[%9%9W[#$ :Ly9X9X#5#5^b%& 6F!O!1!14'	
 
 
 
 
 
 
 
 
4 )hLLLLLLLLLLr-   N)r   r   r   r   r   r1  r   r   r   floatr   rN   r   r   r-   r+   r  r    sE       p
 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 8M [8M 8M 8Mr-   r  geometry_creditstextured_creditsdetailed_creditsc                     d|  d| d| dS )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_exprrA    sC    	 4D	 	 Vf	 	 k{	 	 	r-   include_image_alignmentc           	         t           j                            ddd          t           j                            dddgd          g}| r]|                    t           j                            d	d
dgd
d          t           j                            dddgdd          g           |                    t           j                            ddd                     |S )zMInputs shown inside the 'Textured' branch of the P1 output_mode DynamicCombo.rc   Tz9Include PBR maps. When on, base texture is forced on too.)r^   r   rj   rk   rl   )r]   r^   r   r   r   zRPrioritize visual fidelity to the source image, or alignment to the mesh geometry.)r]   r^   r   r   r^   r,  zHRotate the output to match the source image. Only applies when textured.ri   re   )r^   rg   )r   r   r   r   extendr   r   )rB  r   s     r+   _p1_textured_inputsrE    s     	
6qrr
(:z2JT^__F  
'-z:,p	    !&6%f	   	
 	
 	
  MM"&,,~rD,IIJJJMr-   c           
          t           j                            dt           j                            dg           t           j                            dt	          |                     gd          S )Noutput_modeGeometry onlyTexturedrB  zK"Geometry only" returns an untextured mesh. "Textured" adds color/PBR maps.)r]   r   )r   DynamicCombor   OptionrE  rJ  s    r+   _build_p1_output_moderM    sf    ?  O""?B77O"":/B[r/s/s/stt
 ^ !   r-   rG  c                    | d         }|dk    rdddS dt          |                     dd                    |                     dd          |                     d	          d
}d| v r| d         |d<   d| v r| d         |d<   |S )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.
    rG  rH  F)ra   rc   Trc   rj   rk   ri   )ra   rc   rj   ri   r   r   )r   get)rG  modeouts      r+   _resolve_p1_texture_fieldsrR    s     }%D ///KOOE40011&??+<jII#77	 C k))#./B#C ##(7MJr-   c                  f   t           j                            ddddddd          t           j                            dddd	          t           j                            d
dddd          t           j                            ddddd          t           j                            ddddd          gS )z9Inputs shared by all P1 nodes (placed after output_mode).rn   ro   i N  Tz;Target face count, 48-20000. -1 lets Tripo pick adaptively.)r^   rr   rs   rZ   rg   r   rh   re   rf   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   r-   r+   _p1_common_inputsrV    s     	Q 	 	
 	
 	\2tLL

H 	 	
 	
 	
Z 	 	
 	
 	
R 	 	
 	
3   r-   rn   rh   r   rT  rU  c                 r    ||dk    r|nd|||rdndd}|                     t          |                      |S )z8Common P1 request fields shared by all three node types.ro   Nr   )rh   rn   r   rT  compress)updaterR  )rG  rn   rh   r   rT  rU  kwargss          r+   _build_p1_request_kwargsr[    sX     !$."$4$4jj$"3=JJ F MM,[99:::Mr-   c                       e Zd Zed             Ze	 	 	 	 	 	 	 ddedededz  d	edz  d
ededz  dededede	j
        fd            ZdS )TripoP1TextToModelNodec                    t          j        ddddt           j                            ddd          t           j                            d	ddd
          t	          d          t           j                            dddd          gt                      t           j                            d          t          j        d                              d          t           j	                            d          gt           j
        j        t           j
        j        t           j
        j        gdt          j        t          j        ddg          t!          ddd                    	  	        S )Nr]  zTripo P1: Text to ModelrV   zTTripo P1 text-to-3D. Optimized for low-poly, game-ready meshes with stable topology.rW   TzUp to 1024 characters.)rX   r   rY   zUp to 255 characters.)rX   rZ   r   FrJ  rd   re   rf   rv   rw   ry   rz   r{   rG  output_mode.texture_qualityr}   r  (   2   r@  r   	r   rx   r   r   r   r   r   r   r   )r   r   r   r   rM  r   rV  r   r   r   r   r   r   r   r   r   rA  r   s    r+   r   z$TripoP1TextToModelNode.define_schema  sI   y,2'n	DBZ[[	 1TDZqrr%eDDD\2tTT	
 #$$ 	  l ;;	/**111OO###77 	.	+	#
 /He8fggg#R"_abbb  /
 
 
 	
r-   Nro   FTrW   rG  rY   rd   rn   rh   r   rT  rU  r!   c
                    K   |st          d          t          ||||||	          }
t          d
||pd |d|
}t          | t	          dd          t
          |           d {V }t          | |d	           d {V S )Nr   rG  rn   rh   r   rT  rU  )rW   rY   rd   r   r   r   r   <   r   r   )r)   r[  r   r   r   r   rR   )r   rW   rG  rY   rd   rn   rh   r   rT  rU  commonrequestr    s                r+   r   zTripoP1TextToModelNode.execute8  s        	53444)#!!/
 
 
 , 
+3t!
 
 	
 
 ! &DVTTT,	
 
 
 
 
 
 
 
 
 )hLLLLLLLLLLr-   )NNro   NFTF)r   r   r   r   r   r   dictr   r   r   rN   r   r   r-   r+   r]  r]    s        
 
 [
< 
 '+!%!%"'"M "M"M "M t	"M
 $J"M "M $J"M "M "M  "M 
"M "M "M ["M "M "Mr-   r]  c                       e Zd Zed             Ze	 	 	 	 	 	 ddej        deded	e	d
e	dz  dededede
j        fd            ZdS )TripoP1ImageToModelNodec                    t          j        ddddt           j                            d          t	          d          t           j                            dd	ddd
          gt                      t           j                            d          t          j	        d                              d          t           j
                            d          gt           j        j        t           j        j        t           j        j        gdt          j        t          j        ddg          t#          ddd                    	  	        S )Nrj  zTripo P1: Image to ModelrV   z@Tripo P1 image-to-3D. Optimized for low-poly, game-ready meshes.r   TrJ  enable_image_autofixFz:Pre-process the input image for better generation quality.r   rv   rw   ry   rz   r{   rG  r_  r}   r`  ra  re  r@  r   rb  )r   r   r   r   rM  r   rV  r   r   r   r   r   r   r   r   r   r   rA  r   s    r+   r   z%TripoP1ImageToModelNode.define_schema`  s7   y-3'Zw''%dCCC
  *!!!X !   #$$ 	  l ;;	/**111OO###77 	.	+	#
 /He8fggg#R"_abbb  9 
  
  
  	
r-   Fro   NTr   rG  rl  rn   rh   r   rT  rU  r!   c	           	      p  K   |t          d          t          t          t          | |d           d {V d         d                    }	t	          ||||||          }
t          d|	|d	|
}t          | t          d
d          t          |           d {V }t          | |d           d {V S )Nr   r   r   r   r   r   r   rd  )r   rl  r   r   r   r   re  r   r   )
r)   r   r   r   r[  r   r   r   r   rR   )r   r   rG  rl  rn   rh   r   rT  rU  r   rf  rg  r    s                r+   r   zTripoP1ImageToModelNode.execute  s9      =2333'"4S%ANNNNNNNNNPQR  
 
 

 *#!!/
 
 
 - 
!5
 
 
 

 ! &DVTTT,	
 
 
 
 
 
 
 
 
 )hLLLLLLLLLLr-   )Fro   NFTF)r   r   r   r   r   r   r   rh  r   r   r   rN   r   r   r-   r+   rj  rj  ^  s        !
 !
 [!
F 
 &+!%"'&M &M{&M &M #	&M
 &M $J&M &M &M  &M 
&M &M &M [&M &M &Mr-   rj  c                       e Zd Zed             Ze	 	 	 	 	 	 	 	 ddej        dedej        dz  d	ej        dz  d
ej        dz  dededz  de	de	de	de
j        fd            ZdS )TripoP1MultiviewToModelNodec                    t          j        ddddt           j                            dd          t           j                            dd	d
          t           j                            dd	d          t           j                            dd	d          t	          d	          gt                      t           j                            d          t          j        d                              d          t           j	                            d          gt           j
        j        t           j
        j        t           j
        j        gd	t          j        t          j        ddg          t!          ddd                    	  	        S )Nro  zTripo P1: Multiview to ModelrV   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.)rZ   r   r   u   Back view (180°).r   u2   Right view (270°), i.e. the subject's right side.rJ  rv   rw   ry   rz   r{   rG  r_  r}   r`  ra  re  r@  r   rb  )r   r   r   r   rM  rV  r   r   r   r   r   r   r   r   r   r   rA  r   s    r+   r   z)TripoP1MultiviewToModelNode.define_schema  sw   y17'T w0MNN !M   
 |dDXYY!!P   
 &dCCC #$$" 	  l ;;	/**111OO###77 	.	+	#
 /He8fggg#R"_abbb  C%
 %
 %
 %	
r-   Nro   FTr   rG  r   r   r   rn   rh   r   rT  rU  r!   c           	      L  K   ||||g}t          d |D                       dk     rt          d          g }|D ]}|0|                    t          t	                                           4t          | |d           d {V d         }|                    t          t          |d	                               t          |||||	|

          }t          dd|i|}t          | t          dd          t          |           d {V }t          | |d           d {V S )Nc              3      K   | ]}|dV  	d S )Nr   r   )r5  vs     r+   	<genexpr>z6TripoP1MultiviewToModelNode.execute.<locals>.<genexpr>  s"      11Q1=q====11r-      zRTripo P1 multiview requires at least 2 images (front plus one of left/back/right).r   r   r   r   r   r   rd  r   r   r   r   r   r   r   r   )sumr)   r   r   r
   r   r   r[  r   r   r   r   rR   )r   r   rG  r   r   r   rn   rh   r   rT  rU  viewsr   viewrP   rf  rg  r    s                     r+   r   z#TripoP1MultiviewToModelNode.execute  s      
J<11%11111A55sttt*, 	[ 	[D|/5L5N5NOOOPPP23KKKKKKKKKQOCLL+1BsQW1X1X1XYYYZZZZ)#!!/
 
 
 1GGuGGG  &DVTTT,	
 
 
 
 
 
 
 
 
 )hLLLLLLLLLLr-   )NNNro   NFTF)r   r   r   r   r   r   r   rh  r   r   r   rN   r   r   r-   r+   ro  ro    s       &
 &
 [&
P 
 *.)-*.!%"'(M (M{(M (M K$&	(M
 K$&(M [4'(M (M $J(M (M (M  (M 
(M (M (M [(M (M (Mr-   ro  c                   L    e Zd Zedeeej                          fd            ZdS )TripoExtensionr!   c                    K   t           t          t          t          t          t
          t          t          t          t          t          gS r3   )rT   r   r   r]  rj  ro  r   r   r   r   r  )selfs    r+   get_node_listzTripoExtension.get_node_list  s3       !!%"#'
 	
r-   N)	r   r   r   r   listr   r   	ComfyNoder}  r   r-   r+   rz  rz    sE        
T$r|*<%= 
 
 
 X
 
 
r-   rz  c                  "   K   t                      S r3   )rz  r   r-   r+   comfy_entrypointr    s      r-   r3   )?typing_extensionsr   comfy_api.latestr   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   comfy_api_nodes.utilr   r   r   r   r   r   r,   r   r  r   rN   rR   rT   r   r   r   r   r   r   r  rA  r   r~  rE  rK  rM  rh  rR  rV  r[  r]  rj  ro  rz  r  r   r-   r+   <module>r     s   & & & & & & 6 6 6 6 6 6 6 6 6 6                                           ,             M*; M M M M M $(D D2< DD DjD ]	D D D DB|M |M |M |M |M2< |M |M |M~QM QM QM QM QMBL QM QM QMh`M `M `M `M `M `M `M `MFJM JM JM JM JMr| JM JM JMZ%N %N %N %N %Nbl %N %N %NP"N "N "N "N "N2< "N "N "NJ>M >M >M >M >M >M >M >MBvM vM vM vM vM", vM vM vMr s VY ^a    D T    6d r?T    D T    ,"4 " " " "J  	
    
   *DM DM DM DM DMR\ DM DM DMNMM MM MM MM MMbl MM MM MM`TM TM TM TM TM", TM TM TMn
 
 
 
 
^ 
 
 
$      r-   