
    hF                     L   d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZ d dlm	Z	m
Z
mZmZmZ d dlZd dlZd dlmZ d dlZd dlZd dlmZ d dlZdd	lmZmZmZmZmZ dd
lmZ defdZd Z d Z!d Z"de
ej        ej        f         fdZ#dedededeedf         deedf         deeee$df                  df         deee         df         deedf         de$fdZ%dede$de$de$ded eeeef                  fd!Z&d" Z'd# Z(dg d$d%d&fd'ed(ed)ed*eedf         d+ee         d,e)d-e)dee
eef                  fd.Z*d/ Z+e,d0k    r e+            Z- e ej.         e/e-j0        d1                              Z0e-j1        Z1e-j2        Z2e-j3        Z4e-j5        6                    d2          Z5e-j7        Z7e-j8        Z9e-j:        re-j:        e0_;        e-j<        re-j<        e0_=        e0j;        e-j>        
J d3             e*d4e-j>        e0j;        e0j=        e5e7d&5          Z? e&e0j=        e9e1e2e4e?6           dS dS )7    N)defaultdict)tqdm)ndarray)DictTupleListOptionalUnion)KDTree)Box   )	new_entry	add_erroradd_warningnew_logend_log)RawDatafilepathc                    t          t          j        j        j                  }t
          j                            |           st          d|  d          	 | 	                    d          rUt          j
        j                            d           t          j
        j                            | ddddddddd
  
         n| 	                    d	          r't          j
        j                            | 
           n| 	                    d          s| 	                    d          r)t          j
        j                            | dd           n4| 	                    d          s| 	                    d          r't          j
        j                            | d           n| 	                    d          r&t          j
        j                            | 
           n| 	                    d          rt          j        j                            |           5 \  }}|j        |_        d d d            n# 1 swxY w Y   |j        D ]-}|)t          j        j        j                            |           .nt          d|            n#  t          d|            xY wd t          t          j        j        j                  |z
  D             }t3          |          dk    rd S t3          |          dk    rt          d          |d         }|                    d           |t          j        j        j        _        t          j
        j                            d           t          j        j        d         j         D ]	}d|_!        
t          j
        j                            d           |                    d           t          j
        j        "                    d           |S )NzFile z does not exist !z.vrmvrm)moduleTF)
r   use_addon_preferencesextract_textures_into_foldermake_new_texture_folder&set_shading_type_to_material_on_import(set_view_transform_to_standard_on_importset_armature_display_to_wire%set_armature_display_to_show_in_front"set_armature_bone_shape_to_defaultdisable_bakez.obj)r   z.fbxz.FBX)r   ignore_leaf_bonesuse_image_searchz.glbz.gltf)r   import_pack_imagesz.daez.blendznot suported type zfailed to load c                 (    g | ]}|j         d k    |S )ARMATURE)type.0xs     2/data/cameron/tmprepos/2unirig/src/data/extract.py
<listcomp>zload.<locals>.<listcomp>>   s$    YYYaafjFXFXFXFXFX    r   r   zmultiple armatures foundEDIT)modeg        OBJECTDESELECT)action)#setbpycontextsceneobjectsospathexists
ValueErrorendswithopspreferencesaddon_enableimport_scener   wm
obj_importfbxgltfcollada_importdata	librariesload
collectionlinklen
select_set
view_layeractiveobjectmode_set	armatures
edit_bonesroll
select_all)r   old_objs	data_fromdata_toobjarmaturebones          r*   rG   rG      s   3;$,--H7>>(## ><<<<===#7V$$  	>G,,E,:::G $$!&*-2(-7<9=-16:37! %     v&& 	>GJ!!8!4444v&& 	>(*;*;F*C*C 	>G $$h%bg$hhhhv&& 	>(*;*;G*D*D 	>G %%xE%RRRRv&& 		>GJ%%x%8888x(( 	>#((22 46Jy'"+"34 4 4 4 4 4 4 4 4 4 4 4 4 4 4 = =?K*277<<<= <(<<===75855666YY3s{0899(BYYYH
8}}at
8}}Q4555{H,4CK")GN((("1%0  		GN***GNZ000Os2   F>J H1%J 1H55J 8H59AJ Jc                     	 t           j        j                            ddd           n)# t          $ r} t          d|             Y d } ~ nd } ~ ww xY wt           j        j        t           j        j        t           j        j	        t           j        j
        t           j        j        t           j        j        t           j        j        t           j        j        t           j        j        t           j        j        t           j        j        t           j        j        t           j        j        g}|D ]~}	 |D ]L}	 |                    |           # t          $ r'} t          d|j         d| d|             Y d } ~ Ed } ~ ww xY wS# t          $ r} t          d| d|             Y d } ~ wd } ~ ww xY wdd l}|                                 d S )	NT)do_local_idsdo_linked_idsdo_recursivez"Warning: Could not purge orphans: zWarning: Could not remove z from z: zWarning: Error processing r   )r3   r<   outlinerorphans_purge	ExceptionprintrE   actionsrP   camerascollectionscurvesimageslights	materialsmeshesr6   texturesworldsnode_groupsremovenamegccollect)e
data_typesdata_collectionitemro   s        r*   	clean_bpyru   R   s   8&&D[_&```` 8 8 86166777777778
 	J  & G G	G' ` ``#**40000  ` ` `^ty^^^^[\^^________``
  	G 	G 	GEEE!EEFFFFFFFF	G IIIJJLLLLLsV   '* 
AAA*E:/EE:
E6E1,E:1E66E::
F#FF#c                 8   | j         }g }| j        j        d         }|j        |j        }|j        |g}t	          j        |          d dd df         }t          |          dk    r|                    d          }|                    |           g }|j	        D ]I}|t	          j        |j
                  z  }	|                    ||	d         |	d         |	d         f           Jt          |d           }d |D             }
|
|z   }t          |          dk    |S )Nr      r      c                 0    | d         | d         | d         fS )Nrw   r   rx    )r)   s    r*   <lambda>z$get_arranged_bones.<locals>.<lambda>   s    1Q41qt2D r,   )keyc                     g | ]
}|d          S )r   rz   r'   s     r*   r+   z&get_arranged_bones.<locals>.<listcomp>   s    %%%qad%%%r,   )matrix_worldposebonesparentnparrayrJ   popappendchildrenheadsorted)rX   r~   arranged_bonesrootQrotbr   cbr   _cs              r*   get_arranged_bonesr   x   s3   (LN=q!D
+
!{ +
!	A
(<
 
 !RaR
(C a&&A++EE!HHa   * 	= 	=B!&)))DOORa$q'47;<<<<((D(DEEE%%H%%%F a&&A++ r,   c            	      
  % g } t           j        j        D ]"}|j        dk    r|                     |           #i %| D ]}t          j        |j                  }|d dd df         }|d ddf         }|}t          |j        j	                  }t          j
        d|f          }t          j
        |df          }	|j        j	        }
g }g }|
D ]e}|t          j        |j                  z  |	|j        <   ||j        z  }t          j        |          |z   }||dd|j        f<   d|d         |j        <   f|j        j        D ]}|j        }g }i }|D ]}|                    |d                   g ||d         <   ||d                                      |d                    |                    |d                   g ||d         <   ||d                                      |d                    |                    |d                    |                    |d                    |j        }t#          t%          t'          |                              }|d         }g }|}i }	 |                    |           d||<   |                    ||         d                   ||         d         }n1|                    ||         d                   ||         d         }nn|t)          |dd          |dd                    D ]>\  }}|                    |dz   |dz   |dz   f           |                    ||z             ?g }t+          |          D ]\  }}||         }|d         dz
  }|d         dz
  }|d         dz
  }t          j        |d d|f         |d d|f         z
  |d d|f         |d d|f         z
            }||z                                  dk    r|                    |           |                    |d         |d         |d         f           t          |          dk    r||d%|j        <    t          j        %fd	%D             d
          d dd d f                                         }d} d}!%D ] }"| t          %|"         d                   z  } !t          j
        | dft
          j                  }d}#%D ]r}"t          j        %|"         d         t
          j                  }$|$|!z   ||#|#|$j        d         z   <   |!%|"         d         j        d         z  }!|#|$j        d         z  }#s||fS )NMESHrw      r   r   Trx   )vertexfacec                 ,    g | ]}|         d          S )r   rz   )r(   rn   
_dict_meshs     r*   r+   z process_mesh.<locals>.<listcomp>   s#    OOODZ-h7OOOr,   )axisr   dtyper   )r3   rE   r6   r&   r   r   r   r~   rJ   verticeszerosnormalindexcopolygons	edge_keysgetlistr2   r   zip	enumeratecrosssumrn   concatenate	transposeint64shape)&ri   vrW   mmatrix_world_rotmatrix_world_biasr   total_verticesr   vertex_normal	obj_vertsfacesnormalsvvpolygonedgesnodesadjedger   firstloopnowvissecondthirdcorrect_facesir   v0v1v2total_facesnow_biasrn   totfr   s&                                        @r*   process_meshr      s   FX  6VMM!J E EHS%&&RaR!V9bqb!eHSX.//1n-...!!455H%	 	# 	#A%(28AH+=+=%=M!'"qtB" 11B#%F1Q3< !"F1Iagx( 	- 	-G%EEC & &7747##+#%CQLDG##DG,,,7747##+#%CQLDG##DG,,,T!W%%%T!W%%%%^FVE]]++,,E!HEDCCC   C773s8A;''/c(1+CCWWSXa[))1c(1+CC $'tABBxabb#:#: - -eai!UQY?@@@sV|,,,,- "5)) 	B 	BIQQZFa1Ba1Ba1Brr2vB/rr2vB/ A &~~!##$$T****$$d1gtAwQ%@AAAA}!! %$ $Jsx 
 ^OOOOJOOOVWXXXY[Z[Y[]^]^]^Y^_iikkFKH 5 5s:d+F3444Hk1%RX666E
C  HZ%f-RX>>>$%Lc#agaj. !Jt$X.4Q77qwqz5=r,   returnc                    | j         }i }t          |          D ]\  }}|||j        <   | j        j        d         }|j        |j        }|j        t          j        |                                          }t          j	        
                    t          j        |                                                    }|d dd df         }	|d ddf         }
g }t          j        j                                         | j        j        }t'          |          }t          j        |dft          j                  }t          j        |dft          j                  }g }i }g }t          j        |ddft          j                  }t          |          D ]8\  }}|j        }|                    |           t          j        |j        j                  }|j        j        }|dk    rt5          d| d           |	|dddf         z  |
z   }|                    |           |                    |          }|	t          j        |j                  z  |
z   }|||<   |||<   |||<   |                    |j        |vrd n||j        j                            ||d d ddf         z  |d d ddf<   ||d dd df         z  |d dd df<   |||<   :t          j        j                                         |||||fS )Nr   rw   r   r   Fzuse_inherit_rotation of bone z is False !)r~   r   rn   r   r   r   r   r   to_4x4linalginvdiagto_scaler3   r<   rN   editmode_togglerE   rQ   rJ   r   float32r   rY   matrix_localuse_inherit_rotationr   r   tail)rX   r   r~   r   idpboner   r   	scale_invr   biassrQ   Jjointstailsparents
name_to_idnamesmatrix_local_stackrn   r   r   r   	edit_boner   s                             r*   process_armaturer      s    (LE 00  Uej=q!D
+
!{ +
!
$$&&''A	bgl&;&;&=&=>>??I
BQBF)CRaRU8D
AGN""$$$)JNAXq!fBJ///FHaV2:...EGJE1a)2:>>> 00 . .UzTx
 788$z>5((IIIIJJJ\!A#q&))D0	NN4((	RXin---4
4r
b	u|>AAttzRWR^RcGdeee <1Q3#77QQQ!V(<BQB+??RaR!V!-2GN""$$$5'5*<<<r,   r8   r   r   r   r   r   r   r   target_countc	                 B   t          j        ||          }	t          j        |	j        t          j                  }t          j        |	j        t          j                  }|j        d         |k    rt          j
        |||          \  }}t          j        ||          }	t          j        |	j        t          j                  }
t          j        |	j        t          j                  }t          j        |	j        t          j                  }t          j        |	j        t          j                  }|!t          j        |t          j                  }nd }t          |
|||||d d |||          }|                                 |                    |            d S )N)r   r   r   r   )r   )r   vertex_normalsr   face_normalsr   r   skinno_skinr   r   r   )r8   )trimeshTrimeshr   r   r   r   r   r   r   fast_simplificationsimplifyr   r   r   checksave)r8   r   r   r   r   r   r   r   r   meshnew_verticesnew_vertex_normals	new_facesnew_face_normals
new_jointsraw_datas                   r*   save_raw_datar   !  sq    ?HE:::DxRZ888HHTZrx000E{1~$$-6xUabbb%?HE:::D8DM<<<L$"5RZHHH28444Ix 1DDDXfBJ777


)%!  H NNMMtMr,   output_foldernum_runsr   timefilesc                    d}t           j                            ||          }t          |          }||z  }||z  }	||dz   z  }
|dz   |k    r|}
t	          |          }|
dk    r
|d |
         }t          |d|	 d|
            d}t          ||	d                    D ]}|d         }|d         }t                       t          |           	 t          d| d           t          |          }t          d	|           t          j        |d
           t                      \  }}|&t          |          }t          ||          \  }}}}}n
d }d }d }d }d }t           j                            |d          }t          |||dz
  ||||||	  	         |dz  }# t           $ rF}t#          t%          |                     t          dt%          |                      Y d }~Hd }~wt&          $ rF}t#          t%          |                     t          dt%          |                      Y d }~d }~wt(          $ r)}t#          d           t          d           Y d }~d }~wt*          $ rI}t#          dt%          |                      t          dt%          |                      Y d }~d }~ww xY wt-                       t          | d           d S )Nz./logsr   extract_builtin__r   zNow processing z...zsave to:T)exist_okraw_data.npz)	r8   r   r   r   r   r   r   r   r   zValueError: zRuntimeError: ztime outz"TimeoutError: Processing timed outzUnexpected error: z models processed)r7   r8   joinrJ   r   r   r   ru   r   ra   rG   makedirsr   r   r   r   r:   r   strRuntimeErrorTimeoutErrorr`   r   )r   r   r   r   r   r   log_path	num_filesgapstartendr   file
input_file
output_dirrX   r   r   r   r   r   r   r   r   	save_filerq   s                             r*   extract_builtinr  K  si    Hw||Hd++HE

I
x
C"HE
a.C	!tX~~5MME
BwwdsdH66666777
CU566]## 31 31!W
!W
*.	13J333444J''H*j)))K
T2222*nnOHe#!3H!=!=>NxYg>h>h;w|| #Z@@I!Ag))
 
 
 
 1HCC 	+ 	+ 	+c!ff)Q))******** 	- 	- 	-c!ff+3q66++,,,,,,,, 	8 	8 	8j!!!677777777 	1 	1 	133q6633444/s1vv//00000000	1 III	S
#
#
#$$$$$s=   CF
J:$;G%%J:2;H33J: I$$J:1>J55J:c                     t          | t                    r| S |                                 dv rdS |                                 dv rdS t          j        d          )N)yestruety1T)nofalser   n0FzBoolean value expected.)
isinstanceboollowerargparseArgumentTypeError)r   s    r*   str2boolr!    s]    !T wwyy222t	
4	4	4u()BCCCr,   c                     | sd S | S )Nrz   )vals    r*   nullable_stringr$    s     tJr,   )rW   rB   FBXdaeglbrC   r   FT	data_nameinput_dataset_diroutput_dataset_dirinputsrequire_suffixforce_overridewarningc           	         g }|i }|                     d          }|D ]}	|	                    d          }
d                    |
                     d          d d                   }
t          j                            ||
          }t          j                            ||           }|s t          j                            |          r|r||v rt          d| d           d||<   |                    |	|f           ߐn]i }t          j        |          D ]E\  }}}|D ]:}	|	                     d          d         |v r|	                    d          }
d                    |
                     d          d d                   }
t          j                            |t          j        	                    ||          |
          }t          j                            ||           }|s t          j                            |          r|r||v rt          d| d           d||<   |                    t          j                            ||	          |f           <G|S )N,z./.r   z*[33mWARNING: duplicate output directory: z;, you need to rename prefix of files to avoid ambiguity[0mT)
splitremoveprefixr  r7   r8   r9   ra   r   walkrelpath)r(  r)  r*  r+  r,  r-  r.  r   r   r  	file_namer  raw_data_npzr   dirsr   s                   r*   	get_filesr9    s    Ec"" 	- 	-D))$//I!5!5crc!:;;I&8)DDJ7<<
I>>L! bgnn\&B&B  R:,,  Qj  Q  Q  Q  R  R  R"C
OLL$
+,,,,	- W%677 	I 	IMD$ I I::c??2&.88 $ 1 1$ 7 7I #)=)=crc)B C CI!#.@"'//RVXiBjBjlu!v!vJ#%7<<
I#F#FL * !bgnn\.J.J !  Z:#4#4  Yj  Y  Y  Y  Z  Z  Z&*C
OLL"',,tT":":J!GHHHI" Lr,   c                     t          j                    } |                     dt          d           |                     dt          d           |                     dt          d           |                     dt          d           |                     dt
          d           |                     dt          d           |                     d	t          d           |                     d
t          dd            |                     dt          dd            |                     dt          dd            |                                 S )Nz--configT)r&   requiredz--require_suffixz--faces_target_countz
--num_runsz--force_overridez--idz--timez--inputF)r&   r;  defaultz--input_dirz--output_dir)r  ArgumentParseradd_argumentr  intr!  r$  
parse_args)parsers    r*   parserB    s<   $&&F

t<<<
*tDDD
.S4HHH
3>>>
*DIII
S4888
sT:::
	%QUVVV
OeUYZZZ
_uVZ[[[r,   __main__rr0  z+you cannot specify both input and input_dirr  )r(  r+  r)  r*  r,  r-  r.  )r   r   r   r   r   r   )@r3   r7   rd   r   r   numpyr   r   typingr   r   r   r	   r
   r   r   scipy.spatialr   r  yamlboxr   logr   r   r   r   r   r   r   r  rG   ru   r   r   r   r?  r   r  r!  r$  r  r9  rB  __name__args	safe_loadopenconfigr   r   r   	timestampr,  r2  r-  faces_target_countr   	input_dirr)  r  r*  inputr   rz   r,   r*   <module>rT     s    # # # # # #                 5 5 5 5 5 5 5 5 5 5 5 5 5 5                          				 D D D D D D D D D D D D D D      <3 < < < <~$ $ $L  ,\ \ \|3= 2:rz!"3= 3= 3= 3=j(
(( ( '4- 	(
 $( 4c4i()4/0( cD!( &( ( ( ( (TL%L%L% L% 		L%
 L% c3h L% L% L% L%\D D D   "JJJ. ... . #t)	.
 I. . . 
%S/. . . .`   z577DST[# 6 67788FmHgBiI)//44N)N-L~ 2#'>  4$(O!#/4:3E3EGt3E3EEI z 2!4%%  E O/!     ; r,   