
    +jB                     z   d dl Z d dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
mZmZ d dlmZm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dZddZ G d dej                  Z G d dej                  Z G d de
          ZdefdZdS )    N)'get_1d_sincos_pos_embed_from_grid_torch)pack_variable_mesh_batch)override)ComfyExtensionIOTypes)MESHVOXELc                   N    e Zd Zed             Zedej        fd            ZeZdS )EmptyLatentHunyuan3Dv2c                     t          j        ddt           j                            dddd          t           j                            dddd	d
          gt           j                                        g          S )Nr   model/latent/3d
resolutioni      i    )defaultminmax
batch_sizei   z)The number of latent images in the batch.)r   r   r   tooltipnode_idcategoryinputsoutputs)r   SchemaIntInputLatentOutputclss    </home/wildlama/comfy/ComfyUI/comfy_extras/nodes_hunyuan3d.pydefine_schemaz$EmptyLatentHunyuan3Dv2.define_schema   ss    y,&\4QDII\1!Oz{{
 	  ""

 

 

 
	
    returnc                     t          j        |d|gt          j                                                  }t          j        |dd          S )N@   devicehunyuan3dv2)samplestype)torchzeroscomfymodel_managementintermediate_devicer   
NodeOutput)r!   r   r   latents       r"   executezEmptyLatentHunyuan3Dv2.execute   sD    j"j9%BXBlBlBnBnooo}GGHHHr$   N)	__name__
__module____qualname__classmethodr#   r   r2   r4   generate r$   r"   r   r   
   s\        
 
 [
 I I I I [I HHHr$   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )Hunyuan3Dv2Conditioningc           	          t          j        ddt           j                            d          gt           j                            d          t           j                            d          g          S )Nr<   model/conditioning/3d_modelsclip_vision_outputpositivedisplay_namenegativer   r   r   ClipVisionOutputr   Conditioningr   r    s    r"   r#   z%Hunyuan3Dv2Conditioning.define_schema"   sn    y-3#))*>?? &&J&??&&J&??

 

 

 
	
r$   r%   c                 r    |j         }|i gg}t          j        |          i gg}t          j        ||          S N)last_hidden_stater-   
zeros_liker   r2   )r!   r?   embedsr@   rC   s        r"   r4   zHunyuan3Dv2Conditioning.execute0   s?    #5RL>%f--r23}Xx000r$   N	r5   r6   r7   r8   r#   r   r2   r4   encoder:   r$   r"   r<   r<   !   sW        
 
 [
 1BM 1 1 1 [1 FFFr$   r<   c                   P    e Zd Zed             Zeddej        fd            ZeZdS ) Hunyuan3Dv2ConditioningMultiViewc                    t          j        ddt           j                            dd          t           j                            dd          t           j                            dd          t           j                            dd          gt           j                            d	
          t           j                            d
          g          S )NrO   r>   frontT)optionalleftbackrightr@   rA   rC   r   rD   r    s    r"   r#   z.Hunyuan3Dv2ConditioningMultiView.define_schema;   s    y63#))'D)AA#))&4)@@#))&4)@@#))'D)AA	 &&J&??&&J&??
 
 
 	
r$   Nr%   c           	         ||||g}g }d }t          |          D ]s\  }}	|	l|2t          |	j        j        d         t	          j        d                    }|                    |	j        ||                             ddd          z              tt	          j        |d          }
|
i gg}t	          j	        |
          i gg}t          j        ||          S )N   r   dim)	enumerater   rI   shaper-   arangeappendreshapecatrJ   r   r2   )r!   rQ   rS   rT   rU   
all_embedsout
pos_embedsierK   r@   rC   s                r"   r4   z(Hunyuan3Dv2ConditioningMultiView.executeL   s    T4/

j)) 	R 	RDAq}%!HI\IbceIfhmhtuvhwhw!x!xJ

1.A1F1Fq!R1P1PPQQQ3A&&&RL>%f--r23}Xx000r$   )NNNNrL   r:   r$   r"   rO   rO   :   s\        
 
 [
  1 1bm 1 1 1 [1 FFFr$   rO   c                   N    e Zd Zed             Zedej        fd            ZeZdS )VAEDecodeHunyuan3Dc                 p   t          j        ddt           j                            d          t           j                            d          t           j                            ddddd	
          t           j                            ddddd	
          gt           j                                        g          S )Nrg   r   r+   vae
num_chunksi@  i  i  T)r   r   r   advancedoctree_resolution      i   r   )r   r   r   r   Vaer   Voxelr   r    s    r"   r#   z VAEDecodeHunyuan3D.define_schema`   s    y(&		**U##\4TvX\]]0#23Y]^^	 !!
 
 
 	
r$   r%   c                     t          j        |                    |d         ||d                    }t          j        |          S )Nr+   )rj   rl   )vae_options)r   r
   decoder   r2   )r!   ri   r+   rj   rl   voxelss         r"   r4   zVAEDecodeHunyuan3D.executep   sX    SZZ	(:Wa  yJ  IK  IKZ  L  L  M  M}V$$$r$   N	r5   r6   r7   r8   r#   r   r2   r4   rs   r:   r$   r"   rg   rg   _   sW        
 
 [
 %R] % % % [% FFFr$   rg         ?c                 	   |t          j        d          }|                     |          } | |k                                    }t           j        j                            |ddd          }|j        \  }}}t          j        g dg dg dg dg d	g d
g|          }t          j	        t          j
        ||          t          j
        ||          t          j
        ||          d          \  }	}
}t          j        |	                                |
                                |                                gd          }|                                dk    }||         }t          j        g dg dg dg dg|          t          j        g dg d	g dg dg|          t          j        g dg dg dg dg|          t          j        g dg dg dg d	g|          t          j        g dg dg dg d	g|          t          j        g dg dg dg dg|          g}g }g }d}t          |          D ]\  }}||z   }|dz   }||d d df         |d d df         |d d df         f         dk    }|                                sR||         }||                             d          }|                    d          |z   }|                    |                    dd                     |j        d         }t          j
        ||d|z  z   |                              dd          }|                    t          j        |d d df         |d d df         |d d df         gd                     |                    t          j        |d d df         |d d df         |d d df         gd                     |d|z  z  }t%          |          dk    r-t          j        |d          }t          j        |d          }n(t          j        d          }t          j        d          }d}t+          | j                  } ||| z   dz  z
  }| |z
  dz  }!|!dk    r||!z  }t          j        |          }||fS )Ncpur   r   r   r   r   r   constantr   r   r   r   )r   r   rW   r   r   r   )r   rW   r   r   r   r   )rW   r   r   r(   ijindexingr   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      rW      rX   r   r   )r-   r)   tofloatnn
functionalpadr\   tensormeshgridr]   stackflattenr[   any	unsqueezer^   r_   lenr`   r.   r   fliplr)"rt   	thresholdr)   binarypaddedDHW	neighborszyxvoxel_indices
solid_masksolid_indicescorner_offsetsall_verticesall_indicesvertex_countface_idxoffsetneighbor_indicespadded_indices
is_exposedexposed_indicescornersface_vertices	num_facesface_indicesverticesfacesv_minv_maxscales"                                     r"   voxel_to_meshr   x   ss   ~e$$YYvFy ''))FX $$V-?QOOFlGAq!		

		

		

   I nQv&&&Qv&&&Qv&&&	  GAq! Kaiikk199;; GQOOOM!!A%J!*-M 	IIyyy)))YYY
	 	 	 	IIyyy)))YYY
	 	 	 	IIyyy)))YYY
	 	 	 	IIyyy)))YYY
	 	 	 	IIyyy)))YYY
	 	 	 	IIyyy)))YYY
	 	 	!N* LKL%i00  &  &&(61)A-111a4 111a4 111a4 !
 	
 ~~ 	'
3 *44Q77'11!44w>M11"a88999#)!,	|1y=(
 
 
 '"a..	 	 	5;QQQT(:LA<NP\]^]^]^`a]aPb'cijkkklll5;QQQT(:LA<NP\]^]^]^`a]aPb'cijkkklllI%
<19\q111	+1---;v&&F##EE55=A--HU]aEqyye#|H%%HU?r$   c                   U |t          j        d          }|                     |          } | j        \  }}}t           j        j                            | ddd          }t          j        t          j        ||          t          j        ||          t          j        ||          d          \  }}}	t          j	        |
                                |
                                |	
                                gd	          }
t          j        g d
g dg dg dg dg dg dg dg|          }|
                    d          |                    d          z   }|                    d          \  }}}||||f         }||k    }t          j        |d	          }t          j        | d	          }||z  }|
|         }||         }||         }|j        d         dk    r7t          j        d|          t          j        dt           j        |          fS t          j        ddgddgddgddgddgddgddgddgddgddgddgddgg|          }i }t"          j                            d          }t)          |          D ]\  }\  }}|                    d           |d d |f         |d d |f         k    }|                                sMt          j        |d          d         }|||f         } |||f         }!t          j        | |          }"|!| z
  }#|#dk    }$|| |$         z
  |#|$         z  |"|$<   d|"|$ <   ||                                         }%||                                         }&|%                    d          |"                    d          |&                    d          |%                    d          z
  z  z   }'t3          |                                |'          D ])\  }(})|(|vrg ||(<   ||(                             |)           *g }*i }+t9          t;          |          dz            },|                                D ]\  }(}-|(|,z  s|                    d           |-rt          j	        |-                              d	          }.|.||(                                         z   }.t;          |*          |+tA          ||(                                                   <   |*                    |.           |*s7t          j        d|          t          j        dt           j        |          fS t          j	        |*          }/|}0| }1|0!                    dd                                           }2|1!                    dd                                           }3t          j        |j        d         df|          }4t          j        |j        d         df|          }5tE          d!          D ]}(|0d d |(f                             d          }6|1d d |(f                             d          }7|4||(                                                             d          |6z  z  }4|5||(                                                             d          |7z  z  }5|4|2z  }4|5|3z  }5|4|5z
  }8t          j        g dg dg dg|          UUfd"tE          d          D             }9g }:tG          |+$                                          };t9          t;          |          d#z  dz            }<t)          g d$          D ]|\  }=\  }(}>U|(         }?U|>         }@|9|=         }A||?z   }B||@z   }C||?z   |@z   }Dt          j%        |8|A          }Eg }Fg }Gt)          |          D ]\  }H}I|H|<z  s|                    d           tA          |I                                          }JtA          |B|H                                                   }KtA          |C|H                                                   }LtA          |D|H                                                   }M|J|;v rZ|K|;v rV|L|;v rR|M|;v rN|+|J         }N|+|K         } |+|L         }!|+|M         }O|F                    |N| |!|Of           |G                    |H           t)          |F          D ]\  }P\  }N} }!}O|G|P         }Q|E|Q         dk    ro|:                    t          j        |N| |Og|t           j        %                     |:                    t          j        |N|O|!g|t           j        %                     |:                    t          j        |N|O| g|t           j        %                     |:                    t          j        |N|!|Og|t           j        %                     ~|:rt          j	        |:          }:n!t          j        dt           j        |          }:d}RtM          |||          }S|/|R|Sz   dz  z
  }/|S|Rz
  dz  }T|Tdk    r|/|Tz  }/t          j'        |/          }/|/|:fS )&Nrx   ry   rz   r   r(   r~   r   r   rY   r   r}   r|   r   r{   r   r   r   rW   )r   r   )dtyper)   r   rX   r            d   T)as_tuplerv   2   )rZ   keepdim   c                     g | ]h}t          |d z   d          D ]R}t          j                            |                                         |                                                   SiS r   )ranger-   linalgcrossr   ).0rd   jpos_dirss      r"   
<listcomp>z)voxel_to_mesh_surfnet.<locals>.<listcomp>\  s{       51a==  	8A;,,..0A0A0C0CDD   r$   &   ))r   r   )r   r   )r   r   )r)   r   )(r-   r)   r   r\   r   r   r   r   r]   r   r   r   r   unbindr   r.   longr/   utilsProgressBarr[   updatenonzerorJ   r   ziptolistr^   roundr   itemsmeantuplesumr   setkeysmatmulr   r   )Vrt   r   r)   r   r   r   r   r   r   r   cell_positionsr   posz_idxy_idxx_idxcorner_valuescorner_signs
has_insidehas_outsidecontains_surfaceactive_cellsactive_signsactive_valuesedgescell_verticesprogressedge_idxe1e2crossingcell_indicesv1v2tdenomvalidp1p2intersectionrd   pointr   vertex_lookupvert_progress_modpointsvertexfinal_verticesinside_corners_maskoutside_corners_maskinside_countsoutside_counts
inside_posoutside_posmask_insidemask_outside	gradientscross_productsr   all_keysface_progress_modpair_idxr   dir_idir_jcross_productni_positionsnj_positionsdiag_positions
alignmentsvalid_quadsquad_indicesidxactive_cellcell_keyni_keynj_keydiag_keyv0v3q_idxcell_idxr   r   r   r   sV                                                                                        @r"   voxel_to_mesh_surfnetr     s
   ~e$$YYvFlGAq!X $$V-?QOOFnQv&&&Qv&&&Qv&&&	  GAq! [!))++qyy{{AIIKK!HaPPPN\		999iii		999iii#   N
 
"
"1
%
%(@(@(C(C
CC**R..E5%5%./M 9,L<Q///J)\Mq111K!K/!"23L 01L!"23M!!!{6&1115;vUZ`f3g3g3gggL	
AAAA	
AAAA	
AAAA 	  E M{&&s++H'.. + +(2r2&,qqq"u*==||~~ 	}X===a@<+,<+,R///R
5	)U5\9%5&	B%%''B%%''||AQ2<<??R\\Z[__;\)]]L//11<@@ 	+ 	+HAu%%#%a !##E****	+ HMc-00344"((** $ $	6$$ 	OOA 	$[((--!-44Fl1o33555F=@]]M%Q 6 6 8 899:OOF### h{6&1115;vUZ`f3g3g3ggg[**N&(='++4+@@FFHHM)--!T-BBHHJJNl03Q7GGGJ+|1!4a8HHHK1XX M M)!!!Q$/99!<<+AAAqD1;;A>>nQ'--//99!<<{JJ
~a(..00::1==LL-J>!K[(I|						 	  H   q  N
 E=%%''((Hc,//21455%&;&;&;<< &Z &Z&1a&x0#e+#e+%-5\)];;
 ), 7 7 	) 	)C** #"""[//1122H<,335566F<,335566F^C07799::H8##((:(:v?Q?QV^bjVjVj"8,"6*"6*"8,""BB#3444##C((('0'='= 	Z 	Z#E#BB#E*H(#a''U\2r2,vUZXXXYYYU\2r2,vUZXXXYYYYU\2r2,vUZXXXYYYU\2r2,vUZXXXYYYY	Z  EE""F%*VDDDE1aLLE#uu}&99NU]aEqyy'%/\.11N5  r$   c                   N    e Zd Zed             Zedej        fd            ZeZdS )VoxelToMeshBasicc                     t          j        dddddt           j                            d          t           j                            ddd	d
d          gt           j                                        g          S )Nr  z"Voxel to Mesh (Basic) (DEPRECATED)3d Converts a voxel grid to a mesh.Tvoxelr   333333?            ?{Gz?r   r   r   step)r   rB   r   descriptionis_deprecatedr   r   )r   r   rp   r   FloatMeshr   r    s    r"   r#   zVoxelToMeshBasic.define_schema  sr    y&=:w''{CTsQUVV
   
 
 
 	
r$   r%   c                    g g |j         D ]A}t          ||d           \  }}                    |                               |           Brt          fdD                       rft          fdD                       rKt	          j        t          j        t          j	                  t          j	                                      S t	          j        t                              S )Nr   r)   c              3   D   K   | ]}|j         d          j         k    V  dS r   Nr\   r   vr   s     r"   	<genexpr>z+VoxelToMeshBasic.execute.<locals>.<genexpr>  1      KKQAGx{'88KKKKKKr$   c              3   D   K   | ]}|j         d          j         k    V  dS r1  r2  r   fr   s     r"   r5  z+VoxelToMeshBasic.execute.<locals>.<genexpr>  7      S}S}rsTUT[_def_g_mTmS}S}S}S}S}S}r$   )datar   r^   allr   r2   r   r	   r-   r   r   )r!   r#  r   r   r4  r9  r   r   s         @@r"   r4   zVoxelToMeshBasic.execute  s     	 	A iEEEDAqOOALLOOOO 	XKKKK(KKKKK 	XPSS}S}S}S}w|S}S}S}P}P} 	X=EK,A,A5;uCUCU!V!VWWW}5hFFGGGr$   Nru   r:   r$   r"   r  r    s\        
 
 [
  
H"- 
H 
H 
H [
H FFFr$   r  c                   N    e Zd Zed             Zedej        fd            ZeZdS )VoxelToMeshc                 6   t          j        ddddt           j                            d          t           j                            dddg	          t           j                            d
dddd          gt           j                                        g          S )Nr>  zVoxel to Meshr!  r"  r#  	algorithmsurface netbasic)optionsr   r$  r%  r&  r'  r(  )r   rB   r   r*  r   r   )r   r   rp   r   Combor,  r-  r   r    s    r"   r#   zVoxelToMesh.define_schema  s    y!(:w''{]G4LMM{CTsQUVV   
 
 
 	
r$   r%   c                   	 g 	g |dk    rt           }n|dk    rt          }|j        D ]=} |||d           \  }}	                    |                               |           >	rt	          	fd	D                       rft	          fdD                       rKt          j        t          j        t          j
        	          t          j
                                      S t          j        t          	                    S )NrB  rA  r/  c              3   D   K   | ]}|j         d          j         k    V  dS r1  r2  r3  s     r"   r5  z&VoxelToMesh.execute.<locals>.<genexpr>  r6  r$   c              3   D   K   | ]}|j         d          j         k    V  dS r1  r2  r8  s     r"   r5  z&VoxelToMesh.execute.<locals>.<genexpr>  r:  r$   )r   r  r;  r^   r<  r   r2   r   r	   r-   r   r   )
r!   r#  r@  r   mesh_functionr   r4  r9  r   r   s
           @@r"   r4   zVoxelToMesh.execute  s   )MM-''1M 	 	A =iEEEDAqOOALLOOOO 	XKKKK(KKKKK 	XPSS}S}S}S}w|S}S}S}P}P} 	X=EK,A,A5;uCUCU!V!VWWW}5hFFGGGr$   Nru   r:   r$   r"   r>  r>    s\        
 
 [
  HR] H H H [H$ FFFr$   r>  c                   L    e Zd Zedeeej                          fd            ZdS )Hunyuan3dExtensionr%   c                 R   K   t           t          t          t          t          t
          gS rH   )r   r<   rO   rg   r  r>  )selfs    r"   get_node_listz Hunyuan3dExtension.get_node_list  s$       ##,
 	
r$   N)	r5   r6   r7   r   listr,   r   	ComfyNoderM  r:   r$   r"   rJ  rJ    sE        
T$r|*<%= 
 
 
 X
 
 
r$   rJ  r%   c                  "   K   t                      S rH   )rJ  r:   r$   r"   comfy_entrypointrQ    s      r$   )rv   N)r-   (comfy.ldm.modules.diffusionmodules.mmditr   comfy.model_managementr/   comfy_extras.nodes_save_3dr   typing_extensionsr   comfy_api.latestr   r   r   comfy_api.latest._utilr	   r
   rO  r   r<   rO   rg   r   r  r  r>  rJ  rQ  r:   r$   r"   <module>rX     s    \ \ \ \ \ \     ? ? ? ? ? ? & & & & & & 6 6 6 6 6 6 6 6 6 6 . . . . . . . .    R\   .    bl   2" " " " "r| " " "J       2k k k kZy! y! y! y!x    r|   D% % % % %", % % %P

 

 

 

 

 

 

 

  2            r$   