
    hF                        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-j`                  d1                  Z0e-jb                  Z1e-jd                  Z2e-jf                  Z4e-jj                  jm                  d2      Z5e-jn                  Z7e-jp                  Z9e-jt                  re-jt                  e0_;        e-jx                  re-jx                  e0_=        e0jv                  e-j|                  J d3        e*d4e-j|                  e0jv                  e0jz                  e5e7d&5      Z? e&e0jz                  e9e1e2e4e?6       yy)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                  j                  |       st        d|  d      	 | j                  d      r_t        j                  j                  j                  d       t        j                  j                  j                  | ddddddddd
       n| j                  d	      r,t        j                  j                  j!                  | 
       n| j                  d      s| j                  d      r.t        j                  j                  j#                  | dd       n7| j                  d      s| j                  d      r,t        j                  j                  j%                  | d       n| j                  d      r+t        j                  j                  j'                  | 
       n| j                  d      rt        j(                  j*                  j-                  |       5 \  }}|j                  |_        d d d        j                  D ]8  }|t        j                  j.                  j                  j1                  |       : nt        d|        t        t        j                  j                  j                        |z
  D cg c]  }|j2                  dk(  s| }}t5        |      dk(  ry t5        |      dkD  rt        d      |d   }|j7                  d       |t        j                  j8                  j                  _        t        j                  j<                  j?                  d       t        j(                  j@                  d   jB                  D ]	  }d|_"         t        j                  j<                  j?                  d       |j7                  d       t        j                  j<                  jG                  d       |S # 1 sw Y   xY w#  t        d|        xY wc c}w )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 ARMATUREr   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typelen
select_set
view_layeractiveobjectmode_set	armatures
edit_bonesroll
select_all)r   old_objs	data_fromdata_toobjxarmaturebones           2/data/cameron/tmprepos/2unirig/src/data/extract.pyr?   r?      s;   3;;$$,,-H77>>(#5
*;<==#7V$GG,,E,:GG  $$!&*-2(-7<9=-16:37! %  v&GGJJ!!8!4v&(*;*;F*CGG  $$h%bg$hv&(*;*;G*DGG  %%xE%Rv&GGJJ%%x%8x(##((2 46Jy'"+"3"34 =?KK**2277<= 1(<== s{{00889(BYaaffjFXYHY
8}a
8}Q355{H,4CKK"")GGNN(""1%00 	 GGNN*GGNNZ0O74 47?8*566Ys8   GP P	3P AP P)P)	PP P&c                  V   	 t         j                  j                  j                  ddd       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 ]  }	 |j)                  |         dd l}|j/                          y # t        $ r} t        d|         Y d } ~ d } ~ ww xY w# t        $ r(} t        d|j*                   d| d|         Y d } ~ d } ~ ww xY w# t        $ r} t        d| d|         Y d } ~ d } ~ ww xY w)	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   )r+   r4   outlinerorphans_purge	Exceptionprintr=   actionsrI   camerascollectionscurvesimageslights	materialsmeshesr.   texturesworldsnode_groupsremovenamegccollect)e
data_typesdata_collectionitemrj   s        rT   	clean_bpyrp   R   s   8&&D[_&` 	J  & G	G' ``#**40`G JJLA  821#67782 ! `6tyykGXXZ[\Z]^__` 	G..?r!EFF	GsY   ,F+ ;HGH+	G4GG	HG<7H<HH	H(H##H(c                 X   | j                   }g }| j                  j                  d   }|j                  |j                  }|j                  |g}t	        j
                  |      d dd df   }t        |      dk7  r|j                  d      }|j                  |       g }|j                  D ]B  }|t	        j
                  |j                        z  }	|j                  ||	d   |	d   |	d   f       D t        |d       }|D 
cg c]  }
|
d   	 }}
||z   }t        |      dk7  r|S c c}
w )Nr      r      c                     | d   | d   | d   fS )Nrr   r   rs    )rQ   s    rT   <lambda>z$get_arranged_bones.<locals>.<lambda>   s    1Q41qt2D     )key)matrix_worldposebonesparentnparrayrC   popappendchildrenheadsorted)rR   ry   arranged_bonesrootQrotbr   cbr   rQ   _cs               rT   get_arranged_bonesr   x   s,   ((LN==q!D
++
!{{ ++
!	A
((<
 !RaR
(C a&A+EE!Ha ** 	=B!&&))DOORa$q'47;<	= ((DE$%qad%%F a&A+  &s   D'c            	      	   g } t         j                  j                  D ]#  }|j                  dk(  s| j	                  |       % 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 ]}  }|t        j                  |j                        z  |
|j                  <   ||j                  z  }t        j                  |      |z   }||	dd|j                  f<   d|	d   |j                  <    |j                  j                  D ]  }|j                  }g }i }|D ]  }|j!                  |d         g ||d   <   ||d      j	                  |d          |j!                  |d         g ||d   <   ||d      j	                  |d          |j	                  |d          |j	                  |d           |j                  }t#        t%        t'        |                  }|d   }g }|}i }	 |j	                  |       d||<   |j!                  ||   d         	||   d   }n!|j!                  ||   d         	||   d   }nnXt)        |dd  |dd        D ]6  \  }}|j	                  |dz   |dz   |dz   f       |j	                  ||z         8  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  j/                         dkD  r|j	                  |       |j	                  |d   |d   |d   f        t        |      dkD  s|	|d||j0                  <    t        j2                  |D !cg c]
  }!||!   d	    c}!d
      d dd d f   j5                         }	d}"d}#|D ]  }!|"t        ||!   d         z  }" t        j                  |"dft
        j6                        }d}$|D ]o  }!t        j                  ||!   d   t
        j6                        }%|%|#z   ||$|$|%j8                  d   z    |#||!   d	   j8                  d   z  }#|$|%j8                  d   z  }$q |	|fS c c}!w )NMESHrr      r   r   Trs   )vertexfacer   )axisr   dtype)r+   r=   r.   rB   r   r}   r~   ry   rC   verticeszerosnormalindexcopolygons	edge_keysgetlistr*   r   zip	enumeratecrosssumri   concatenate	transposeint64shape)&rd   v
_dict_meshrP   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v2ri   total_facesnow_biastotfs&                                         rT   process_meshr      sM   FXX 66VMM! J EHHS%%&RaR!V9bqb!eHSXX../1n-..!!45HH%%	 	#A%(288AHH+=%=M!''"qttB" 11B#%F1Q3< !"F1Iagg	# xx(( 	-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+CWWSXa[)1c(1+C  $'tABxab#: -eai!UQY?@sV|,-9	-@ "5) 	BIQQZFa1Ba1Ba1Brr2vB/rr2vB/A &~~!#$$T*$$d1gtAwQ%@A	B }! %$Jsxx EEN ^^JODZ-h7OVWXY[Z[Y[]^Y^_iikFKH 5s:d+F3445HHk1%RXX6E
C HHZ%f-RXX>$%Lc#aggaj.!Jt$X.44Q77qwwqz	 5= Ps   0Sreturnc                 b   | j                   }i }t        |      D ]  \  }}|||j                  <    | j                  j                  d   }|j
                  |j
                  }|j
                  t        j                  |j                               }t        j                  j                  t        j                  |j                                     }|d dd df   }	|d ddf   }
g }t        j                  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 ]F  \  }}|j                  }|j-                  |       t        j                  |j.                  j0                        }|j.                  j2                  }|dk(  rt5        d| d       |	|dddf   z  |
z   }|j-                  |       |j7                  |      }|	t        j                  |j8                        z  |
z   }|||<   |||<   |||<   |j-                  |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<   |||<   I t        j                  j                  j!                          |||||fS )Nr   rr   r   r   Fzuse_inherit_rotation of bone z is False !)ry   r   ri   rz   r{   r|   r}   r~   to_4x4linalginvdiagto_scaler+   r4   rG   editmode_toggler=   rJ   rC   r   float32r   rS   matrix_localuse_inherit_rotationr   r   tail)rR   r   ry   r   idpboner   r   	scale_invr   biassrJ   Jjointstailsparents
name_to_idnamesmatrix_local_stackri   r   r   r   	edit_boner   s                             rT   process_armaturer      s    ((LE 0 Uejj ==q!D
++
!{{ ++
!
$$&'A		bggl&;&;&=>?I
BQBF)CRaRU8D
AGGNN""$))JNAXXq!fBJJ/FHHaV2::.EGJE1a)2::> 0 .UzzTxx

 7 78$zz>>5(7v[IJ\!A#q&))D0	NN4(	RXXinn--4
4r
b	u||>AtzRWR^R^RcRcGde <1Q3#77Q!V(<BQB+??RaR!V!-2'.( GGNN""$5'5*<<<rw   r0   r   r   r   r   r   r   r   target_countc	                    t        j                  ||      }	t        j                  |	j                  t        j
                        }t        j                  |	j                  t        j                        }|j                  d   |kD  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 |||      }|j                          |j                  |        y )N)r   r   r   r   )r   )r   vertex_normalsr   face_normalsr   r   skinno_skinr   r   r   )r0   )trimeshTrimeshr}   r~   r   r   r   r   r   fast_simplificationsimplifyr   r   r   checksave)r0   r   r   r   r   r   r   r   r   meshnew_verticesnew_vertex_normals	new_facesnew_face_normals
new_jointsraw_datas                   rT   save_raw_datar   !  sG    ??HE:DxxRZZ8HHHTZZrxx0E{{1~$-66xUab%??HE:D88DMM<L$"5"5RZZH2884Ixx 1 1DXXfBJJ7

)%!H NNMMtMrw   output_foldernum_runsr   timefilesc                    d}t         j                  j                  ||      }t        |      }||z  }||z  }	||dz   z  }
|dz   |k(  r|}
t	        |      }|
dk7  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                  j                  |d      }t        |||dz
  ||||||	       |dz  } t-                t        | d       y # t         $ r6}t#        t%        |             t        dt%        |              Y d }~(d }~wt&        $ r6}t#        t%        |             t        dt%        |              Y d }~ed }~wt(        $ r!}t#        d       t        d       Y d }~d }~wt*        $ r9}t#        dt%        |              t        dt%        |              Y d }~d }~ww xY w)Nz./logsr   extract_builtin__r   zNow processing z...zsave to:T)exist_okraw_data.npz)	r0   r   r   r   r   r   r   r   r   zValueError: zRuntimeError: ztime outz"TimeoutError: Processing timed outzUnexpected error: z models processed)r/   r0   joinrC   r   r   r   rp   r   r\   r?   makedirsr   r   r   r   r2   r   strRuntimeErrorTimeoutErrorr[   r   )r   r   r   r   r   r   log_path	num_filesgapstartendr   file
input_file
output_dirrR   r   r   r   r   r   r   r   r   	save_filerl   s                             rT   extract_builtinr  K  s\    Hww||Hd+HE
I
x
C"HE
a.C	!tX~5ME
BwdsH(q67
CU56]# 31!W
!W
*.	1OJ<s34J'H*j)KK
T2*nOHe#!3H!=>NxYg>h;w| #Z@I!Ag))
 1HCM31h I	SE"
#$  	+c!fLQ)** 	-c!fN3q6(+,, 	8j!677 	1*3q6(34&s1vh/00	1s=   $B0E//	I8+F))I5+G&&I2HI.IIc                     t        | t              r| S | j                         dv ry| j                         dv ryt        j                  d      )N)yestruety1T)nofalser   n0FzBoolean value expected.)
isinstanceboollowerargparseArgumentTypeError)r   s    rT   str2boolr    sG    !Twwy22	
4	4(()BCCrw   c                     | sy | S )Nru   )vals    rT   nullable_stringr    s    Jrw   )rP   r:   FBXdaeglbr;   r   FT	data_nameinput_dataset_diroutput_dataset_dirinputsrequire_suffixforce_overridewarningc           	      P   g }|i }|j                  d      }|D ]  }	|	j                  d      }
dj                  |
j                  d      d d       }
t        j                  j                  ||
      }t        j                  j                  ||       }|s t        j                  j                  |      r|r||v rt        d| d       d||<   |j                  |	|f        |S i }t        j                  |      D ]'  \  }}}|D ]  }	|	j                  d      d   |v s|	j                  d      }
dj                  |
j                  d      d d       }
t        j                  j                  |t        j                  j                  ||      |
      }t        j                  j                  ||       }|s t        j                  j                  |      r|r||v rt        d| d       d||<   |j                  t        j                  j                  ||	      |f        * |S )N,z./.r   z*[33mWARNING: duplicate output directory: z;, you need to rename prefix of files to avoid ambiguity[0mT)
splitremoveprefixr   r/   r0   r1   r\   r   walkrelpath)r"  r#  r$  r%  r&  r'  r(  r   r   r  	file_namer	  raw_data_npzr   dirsr   s                   rT   	get_filesr3    s    Ec" 	-D))$/I!5cr!:;I&8)DJ77<<
I>L!bggnn\&B:,Ej\  RP  Q  R"C
OLL$
+,	-@ L' WW%67 	IMD$ I::c?2&.8 $ 1 1$ 7I #)=cr)B CI!#.@"''//RVXiBjlu!vJ#%77<<
I#FL *bggnn\.J :#4 Mj\  ZX  Y  Z&*C
OLL"'',,tT":J!GHI	I$ Lrw   c                  0   t        j                         } | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  dt        d       | j                  dt
        d       | j                  dt        d       | j                  d	t        d       | j                  d
t        dd        | j                  dt        dd        | j                  dt        dd        | j                         S )Nz--configT)rB   requiredz--require_suffixz--faces_target_countz
--num_runsz--force_overridez--idz--timez--inputF)rB   r5  defaultz--input_dirz--output_dir)r  ArgumentParseradd_argumentr   intr  r  
parse_args)parsers    rT   parser<    s    $$&F

t<
*tD
.S4H
3>
*DI
S48
sT:
	%QUV
OeUYZ
_uVZ[rw   __main__rr*  z+you cannot specify both input and input_dirr   )r"  r%  r#  r$  r&  r'  r(  )r   r   r   r   r   r   )@r+   r/   r_   r   r   numpyr}   r   typingr   r   r   r	   r
   r   r   scipy.spatialr   r  yamlboxr   logr   r   r   r   r   r   r   r   r?   rp   r   r   r   r9  r   r  r  r  r  r3  r<  __name__args	safe_loadopenconfigr   r   r   	timestampr&  r,  r'  faces_target_countr   	input_dirr#  r	  r$  inputr   ru   rw   rT   <module>rN     s    #    5 5        	 D D <3 <~$L,\|3= 2::rzz!"3=j(
(( ( '4- 	(
 $( 4c4i()4/0( cD!( &( (TL%L%L% L% 		L%
 L% c3h L%\D "J... . #t)	.
 I. . . 
%S/.` z7DT[[# 678FmmHggBiiI))//4N))N--L~~#'>> $(OO!##/4::3EtGtt zz 22!44%%E //!; rw   