o
    i                     @   s  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 d dlmZmZmZmZmZmZ G dd dejZG dd dejZG d	d
 d
ejZG dd dejZG dd dejZ G dd dejZ!G dd dejZ"G dd deZ#de#fddZ$dS )    )override)IOComfyExtensionInput)InputShouldRemeshInputShouldTextureMeshyAnimationRequestMeshyAnimationResultMeshyImageToModelRequestMeshyModelResultMeshyMultiImageToModelRequestMeshyRefineTaskMeshyRiggedResultMeshyRiggingRequestMeshyTaskResponseMeshyTextToModelRequestMeshyTextureRequest)ApiEndpointdownload_url_to_file_3dpoll_opsync_opupload_images_to_comfyapivalidate_stringc                   @   sH   e Zd Zedd Zededededededed	ed
ej	fddZ
dS )MeshyTextToModelNodec                 C   s4  t jdddt jjddgdt jjddd	d
t jjdddgdt jjdt jdt jjdddgdt jjddddt jj	dgt jdg gddt jjdg dddt jjdg dddd t jjd!d"d"d#t jj	dd$d%gt jj
d&d't d(j
d)d't jj
d*d't jj
d+d'gt jjt jjt jjgddt jd,d-d.	S )/Nr   zMeshy: Text to Modelapi node/3d/MeshymodellatestoptionspromptT )	multilinedefaultstyle	realistic	sculptureshould_remeshtruetopologytrianglequadtarget_polycount d   r"   minmaxdisplay_modefalse:When set to false, returns an unprocessed triangular mesh.r   tooltipsymmetry_modeautoonoffr   advanced	pose_moder    zA-posezT-pose.Specify the pose mode for the generated model.r   r5   r<   seedr   _Seed controls whether the node should re-run; results are non-deterministic regardless of seed.r"   r/   r0   r1   control_after_generater5   
model_filedisplay_nameMESHY_TASK_IDmeshy_task_idGLBFBXz{"type":"usd","usd":0.8}expr	node_idrH   categoryinputsoutputshiddenis_api_nodeis_output_nodeprice_badge)r   SchemaCombor   StringDynamicComboOptionIntNumberDisplaynumberOutputCustom	File3DGLB	File3DFBXHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgecls rk   9/mnt/c/Users/fbmor/ComfyUI/comfy_api_nodes/nodes_meshy.pydefine_schema   sr   +z"MeshyTextToModelNode.define_schemar   r   r#   r&   r6   r=   rA   returnc                    s   t |dddd t| tdddtt||||dd |d	d |d
 dk|| |d	dI d H }|j}	t| td|	 dt	dd dd dI d H }
t
|	 d|	t|
jjd|	dI d H t|
jjd|	dI d H S )Nr      X  )
field_name
min_length
max_length"/proxy/meshy/openapi/v2/text-to-3dPOSTpathmethodr(   r+   r&   r'   )	r   	art_styleai_modelr(   r+   r&   r6   r=   rA   response_modeldata#/proxy/meshy/openapi/v2/text-to-3d/rw   c                 S      | j S Nstatusrrk   rk   rl   <lambda>       z.MeshyTextToModelNode.execute.<locals>.<lambda>c                 S   r   r   progressr   rk   rk   rl   r      r   r|   status_extractorprogress_extractor.glbglbtask_idfbx)r   r   r   r   r   getlowerresultr   r   r   
NodeOutputr   
model_urlsr   r   )rj   r   r   r#   r&   r6   r=   rA   responser   r   rk   rk   rl   executea   s@   



zMeshyTextToModelNode.executeN)__name__
__module____qualname__classmethodrm   strr   intr   r   r   rk   rk   rk   rl   r      s*    
A	r   c                   @   sJ   e Zd Zedd Ze	ddededededejdB d	e	j
fd
dZdS )MeshyRefineNodec                 C   s   t jddddt jjddgdt dd	t jjd
ddddt jjdddddt jjddddgt jjddt djd	dt j	jddt j
jddgt jjt jjt jjgddt jddd
S )Nr   zMeshy: Refine Draft Modelr   z(Refine a previously created draft model.r   r   r   rI   rJ   
enable_pbrFzGenerate PBR Maps (metallic, roughness, normal) in addition to the base color. Note: this should be set to false when using Sculpture style, as Sculpture style generates its own set of PBR maps.Tr"   r5   r<   texture_promptr    Provide a text prompt to guide the texturing process. Maximum 600 characters. Cannot be used at the same time as 'texture_image'.r"   r!   r5   texture_imageMOnly one of 'texture_image' or 'texture_prompt' may be used at the same time.r5   optionalrF   rG   rK   rL   {"type":"usd","usd":0.4}rM   
rP   rH   rQ   descriptionrR   rS   rT   rU   rV   rW   r   rX   rY   r   ra   BooleanrZ   Imager`   rb   rc   rd   re   rf   rg   rh   ri   rk   rk   rl   rm      sP   zMeshyRefineNode.define_schemaNr   rJ   r   r   r   rn   c           
         s   |r|d urt dd }|rt|ddd |d ur&t| |ddI d H d }t| tdd	d
tt|||r5|nd ||ddI d H }|j}t| td| dt	dd dd dI d H }	t
| d|t|	jjd|dI d H t|	jjd|dI d H S )N@texture_prompt and texture_image cannot be used at the same timer   rp   rq   rs   Uploading texture
wait_labelr   rt   ru   rv   )preview_task_idr   r   texture_image_urlrz   endpointr|   r}   r~   r   c                 S   r   r   r   r   rk   rk   rl   r      r   z)MeshyRefineNode.execute.<locals>.<lambda>c                 S   r   r   r   r   rk   rk   rl   r      r   r   r   r   r   r   )
ValueErrorr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )
rj   r   rJ   r   r   r   r   r   r   r   rk   rk   rl   r      sD   	

zMeshyRefineNode.executer   r   r   r   r   rm   r   boolr   r   r   r   r   rk   rk   rk   rl   r      s$    
0r   c                   @   sJ   e Zd Zedd Zededejdedede	ded	e
d
ejfddZdS )MeshyImageToModelNodec                 C   s  t jdddt jjddgdt jdt jjdt jd	t jjd
ddgdt jjddddt jj	dgt jdg gddt jjdg ddt jjdt jd	t j
jddddt jjdddddt jjd d!dd"gt jdg gd#dt jjd$g d%d&dd't jjd(d)d)d*t jj	dd+d,gt jjd-d.t d/jd0d.t jjd1d.t jjd2d.gt jjt jjt jjgddt jt jdgd3d4d5d6	S )7Nr   zMeshy: Image to Modelr   r   r   r   imager&   r'   r(   r)   r*   r+   r,   r-   r.   r2   r3   r4   r6   r7   should_texturer   FNGenerate PBR Maps (metallic, roughness, normal) in addition to the base color.r"   r5   r   r    Tr   r   r   r   r   {Determines whether textures are generated. Setting it to false skips the texture phase and returns a mesh without textures.r=   r>   r?   r@   rA   r   rB   rC   rD   rF   rG   rI   rJ   rK   rL   widgetsz
                (
                  $prices := {"true": 1.2, "false": 0.8};
                  {"type":"usd","usd": $lookup($prices, widgets.should_texture)}
                )
                
depends_onrN   rO   )r   rX   rY   r   r   r[   r\   r]   r^   r_   r   rZ   r`   ra   rb   rc   rd   re   rf   rg   rh   PriceBadgeDependsri   rk   rk   rl   rm      s   
 Jz#MeshyImageToModelNode.define_schemar   r   r&   r6   r   r=   rA   rn   c                    sb  |d dk}d  }	}
|r@|d r|d d urt d|d r,t|d ddd |d }
|d d ur@t| |d dd	I d H d
 }	t| tdddttt| |dd	I d H d
 ||dd |dd ||d dk||dd | |
|	|ddI d H }|j	}t
| td| dtdd dd dI d H }t| d|t|jjd|dI d H t|jjd|dI d H S )Nr   r'   r   r   r   rp   r   r   r   r   z#/proxy/meshy/openapi/v1/image-to-3dru   rv   zUploading base imager(   r+   r&   r   )	image_urlrz   r(   r+   r6   r&   r   r   r=   r   r   rA   r{   z$/proxy/meshy/openapi/v1/image-to-3d/r   c                 S   r   r   r   r   rk   rk   rl   r     r   z/MeshyImageToModelNode.execute.<locals>.<lambda>c                 S   r   r   r   r   rk   rk   rl   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   )rj   r   r   r&   r6   r   r=   rA   texturer   r   r   r   r   rk   rk   rl   r   U  s`   






zMeshyImageToModelNode.executeN)r   r   r   r   rm   r   r   r   r   r   r   r   r   r   rk   rk   rk   rl   r      s*    
f	r   c                   @   sL   e Zd Zedd Zededejjde	dede
ded	ed
ejfddZdS )MeshyMultiImageToModelNodec                 C   s  t jdddt jjddgdt jjdt jjt jddd	d
ddt jjdt jdt jjdddgdt j	jddddt j
jdgt jdg gddt jjdg dddt jjdt jdt jjddd d!t jjd"d#dd$d%t jjd&d'dd(gt jdg gd)dt jjd*g d+d,dd-t j	jd.d/d/d0t j
jdd1d2gt jjd3d4t d5jd6d4t jjd7d4t jjd8d4gt jjt jjt jjgddt jt jdgd9d:d;d<	S )=Nr   zMeshy: Multi-Image to Modelr   r   r   r   imagesr         )prefixr/   r0   )templater&   r'   r(   r)   r*   r+   r,   r-   r.   r2   r3   r4   r6   r7   Tr;   r   r   Fr   r   r   r    r   r   r   r   r   r   r=   r>   r?   r@   rA   r   rB   rC   rD   rF   rG   rI   rJ   rK   rL   r   z
                (
                  $prices := {"true": 0.6, "false": 0.2};
                  {"type":"usd","usd": $lookup($prices, widgets.should_texture)}
                )
                r   rO   )r   rX   rY   r   AutogrowTemplatePrefixr   r[   r\   r]   r^   r_   r   rZ   r`   ra   rb   rc   rd   re   rf   rg   rh   r   ri   rk   rk   rl   rm     s    Mz(MeshyMultiImageToModelNode.define_schemar   r   r&   r6   r   r=   rA   rn   c                    sf  |d dk}d  }	}
|r@|d r|d d urt d|d r,t|d ddd |d }
|d d ur@t| |d dd	I d H d
 }	t| tdddttt| t| dd	I d H ||	dd |	dd ||d dk||	dd |
 |
|	|ddI d H }|j}t| td| dtdd dd dI d H }t| d|t|jjd|dI d H t|jjd|dI d H S )Nr   r'   r   r   r   rp   r   r   r   r   z)/proxy/meshy/openapi/v1/multi-image-to-3dru   rv   zUploading base imagesr(   r+   r&   r   )
image_urlsrz   r(   r+   r6   r&   r   r   r=   r   r   rA   r{   z*/proxy/meshy/openapi/v1/multi-image-to-3d/r   c                 S   r   r   r   r   rk   rk   rl   r   0  r   z4MeshyMultiImageToModelNode.execute.<locals>.<lambda>c                 S   r   r   r   r   rk   rk   rl   r   1  r   r   r   r   r   r   )r   r   r   r   r   r   r   listvaluesr   r   r   r   r   r   r   r   r   r   r   )rj   r   r   r&   r6   r   r=   rA   r   r   r   r   r   r   rk   rk   rl   r     sd   







z"MeshyMultiImageToModelNode.executeN)r   r   r   r   rm   r   r   r   Typer   r   r   r   r   rk   rk   rk   rl   r     s*    
i	r   c                
   @   sB   e Zd Zedd Ze	d
dededejdB de	j
fdd	ZdS )MeshyRigModelNodec                 C   s   t jddddt ddt jjddd	d
ddt jjddddgt jjddt djddt jjddt j	jddgt j
jt j
jt j
jgddt jddd
S )Nr   zMeshy: Rig Modelr   zProvides a rigged character in standard formats. Auto-rigging is currently not suitable for untextured meshes, non-humanoid assets, or humanoid assets with unclear limb and body structure.rI   rJ   height_metersg?g      .@g333333?zcThe approximate height of the character model in meters. This aids in scaling and rigging accuracy.)r/   r0   r"   r5   r   z2The model's UV-unwrapped base color texture image.Tr   rF   rG   MESHY_RIGGED_TASK_IDrig_task_idrK   rL   z{"type":"usd","usd":0.2}rM   r   )r   rX   ra   r   Floatr   rZ   r`   rb   rc   rd   re   rf   rg   rh   ri   rk   rk   rl   rm   =  sD   zMeshyRigModelNode.define_schemaNrJ   r   r   rn   c              
      s   d }|d urt | |ddI d H d }t| tdddtt|||ddI d H }|j}t| td	| d
tdd dd dI d H }t	| d|t
|jjd|dI d H t
|jjd|dI d H S )Nr   r   r   z/proxy/meshy/openapi/v1/riggingru   rv   )input_task_idr   r   r   z /proxy/meshy/openapi/v1/rigging/r   c                 S   r   r   r   r   rk   rk   rl   r     r   z+MeshyRigModelNode.execute.<locals>.<lambda>c                 S   r   r   r   r   rk   rk   rl   r     r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   rigged_character_glb_urlrigged_character_fbx_url)rj   rJ   r   r   r   r   r   r   rk   rk   rl   r   h  s8   

zMeshyRigModelNode.executer   )r   r   r   r   rm   r   floatr   r   r   r   r   rk   rk   rk   rl   r   ;  s    
*r   c                   @   s4   e Zd Zedd ZedededejfddZ	dS )	MeshyAnimateModelNodec                 C   s~   t jddddt ddt jjdddd	d
dgt jjddt jjddt jjddgt j	j
t j	jt j	jgddt jddd
S )Nr   zMeshy: Animate Modelr   zCApply a specific animation action to a previously rigged character.r   r   	action_idr   i  zTVisit https://docs.meshy.ai/en/api/animation-library for a list of available values.)r"   r/   r0   r5   rF   rG   rK   rL   Tz{"type":"usd","usd":0.12}rM   r   )r   rX   ra   r   r]   rZ   r`   rb   rc   rd   re   rf   rg   rh   ri   rk   rk   rl   rm     s8   z#MeshyAnimateModelNode.define_schemar   r   rn   c              	      s   t | tdddtt||ddI d H }|j}t| td| dtdd	 d
d	 dI d H }t| dt	|jj
d|dI d H t	|jjd|dI d H S )Nz"/proxy/meshy/openapi/v1/animationsru   rv   )r   r   r   z#/proxy/meshy/openapi/v1/animations/r   c                 S   r   r   r   r   rk   rk   rl   r     r   z/MeshyAnimateModelNode.execute.<locals>.<lambda>c                 S   r   r   r   r   rk   rk   rl   r     r   r   r   r   r   r   )r   r   r   r   r   r   r	   r   r   r   animation_glb_urlanimation_fbx_url)rj   r   r   r   r   r   rk   rk   rl   r     s.   
	zMeshyAnimateModelNode.executeN)
r   r   r   r   rm   r   r   r   r   r   rk   rk   rk   rl   r     s    
!r   c                   @   sN   e Zd Zedd Ze	ddededededed	ejdB d
e	j
fddZdS )MeshyTextureNodec                 C   s   t jdddt jjddgdt ddt jjd	d
dd
dt jjddd
dt jjddd
ddt jjdd
ddgt jjddt djddt j	jddt j
jddgt jjt jjt jjgd
d
t jddd	S )Nr   zMeshy: Texture Modelr   r   r   r   rI   rJ   enable_original_uvTzUse the original UV of the model instead of generating new UVs. When enabled, Meshy preserves existing textures from the uploaded model. If the model has no original UV, the quality of the output might not be as good.r   pbrF)r"   r<   text_style_promptr    zDescribe your desired texture style of the object using text. Maximum 600 characters.Maximum 600 characters. Cannot be used at the same time as 'image_style'.r   image_stylezeA 2d image to guide the texturing process. Can not be used at the same time with 'text_style_prompt'.)r   r5   rF   rG   MODEL_TASK_IDrK   rL   r   rM   rO   r   ri   rk   rk   rl   rm     sP   zMeshyTextureNode.define_schemaNr   rJ   r   r   r   r   rn   c                    s   |r|d urt d|s|d u rt dd }|d ur't| |ddI d H d }t| tdddtt|||||r8|nd |d	d
I d H }|j}	t| td|	 dtdd dd dI d H }
t	
|	 d|	t|
jjd|	dI d H t|
jjd|	dI d H S )NzAtext_style_prompt and image_style cannot be used at the same timez3Either text_style_prompt or image_style is requiredzUploading styler   r   z!/proxy/meshy/openapi/v1/retextureru   rv   )r   rz   r   r   r   image_style_urlr   z"/proxy/meshy/openapi/v1/retexture/r   c                 S   r   r   r   r   rk   rk   rl   r   %  r   z*MeshyTextureNode.execute.<locals>.<lambda>c                 S   r   r   r   r   rk   rk   rl   r   &  r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rj   r   rJ   r   r   r   r   r   r   r   r   rk   rk   rl   r     sF   


zMeshyTextureNode.executer   r   rk   rk   rk   rl   r     s(    
1r   c                   @   s(   e Zd Zedeeej  fddZdS )MeshyExtensionrn   c                    s   t ttttttgS r   )r   r   r   r   r   r   r   )selfrk   rk   rl   get_node_list1  s   zMeshyExtension.get_node_listN)	r   r   r   r   r   typer   	ComfyNoder   rk   rk   rk   rl   r   0  s    r   rn   c                      s   t  S r   )r   rk   rk   rk   rl   comfy_entrypoint>  s   r   N)%typing_extensionsr   comfy_api.latestr   r   r   comfy_api_nodes.apis.meshyr   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   r   r   r   r   r   r   rk   rk   rk   rl   <module>   s    < 
p_ & +QBb