
    hOH                         d dl Zd dl mZ d dlmZmZmZ d dlmZ d dl	Z		 d dl
ZdZn#   ed           dZY nxY w G d d	          Zd
efdZdefdZdS )    N)ndarray)ListUnionTuple)defaultdictTzdo not have open3dFc            !          e Zd Zd Zdedeeedf                  defdZ	dedefdZ
dedeeedf                  defd	Zd
ededefdZd%d
ededeedf         defdZ	 	 	 	 	 	 	 	 	 d&d
eedf         dedeedf         deeedf                  dee         deedf         dedededededededeedf         fdZd  Z	 	 	 	 	 	 	 	 	 d&ded
eedf         dedeedf         deeedf                  dee         deedf         dedededededededeedf         fd!Zd"d"gfded
eedf         deedf         deedf         d#eeef         f
d$ZdS )'Exporterc                     t           j                            |          dk    rd S t          j        t           j                            |          d           d S )N T)exist_ok)ospathdirnamemakedirs)selfr   s     3/data/cameron/tmprepos/2unirig/src/data/exporter.py_safe_make_dirzExporter._safe_make_dir   sI    7??4  B&&F
BGOOD))D999999    jointsparentsNr   c                    |                     d          d         }|dv sJ |                    d          }|dz   }|                     |           |j        d         }t	          |d          5 }|                    d           g }t          |          D ]g}	||	         }
|
|
dk    r||	         \  }}}||
         \  }}}|                    d| d	| d	|  d
d| d	| d	|  d
d| d	| d	| dz    d
g           h|                    |           d t          |          D             }|                    |           d d d            d S # 1 swxY w Y   d S )N.obj.objr   wo spring_joint
v  
h㈵>c           	      J    g | ] }d |dz  dz    d|dz  dz    d|dz  dz    d!S f       r       r!    .0ids     r   
<listcomp>z-Exporter._export_skeleton.<locals>.<listcomp>,   L    KKKB72a4677BqDF77RT!V777KKKr   )	splitremovesuffixr   shapeopenwriterangeextend
writelines)r   r   r   r   formatnameJfile_jointsr,   pidbxbybzexeyez_facess                     r   _export_skeletonzExporter._export_skeleton   s   C$      ((f}D!!!LO$__ 	$JJ)***GAhh 
 
bk;#))#BZ
B#C[
B***b**B3******b**B3***444b44B3=444     
 OOG$$$KK%((KKKFOOF####	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   .CEEEbonesc                    |                     d          d         }|dv sJ |                    d          }|dz   }|                     |           |j        d         }t	          |d          5 }|                    d           g }|D ]Z}|d d         \  }	}
}|dd          \  }}}|                    d	|	 d
| d
|
  dd	| d
| d
|  dd	| d
| d
| dz    dg           [|                    |           d t          |          D             }|                    |           d d d            d S # 1 swxY w Y   d S )Nr   r   r   r   r   r   zo bones
r&   r   r    r!   r"   c           	      J    g | ] }d |dz  dz    d|dz  dz    d|dz  dz    d!S r$   r)   r*   s     r   r-   z*Exporter._export_bones.<locals>.<listcomp>C   r.   r   )	r/   r0   r   r1   r2   r3   r5   r6   r4   )r   rE   r   r7   r8   r9   r:   r;   boner=   r>   r?   r@   rA   rB   rC   s                   r   _export_boneszExporter._export_bones/   s   C$      ((f}D!!!KN$__ 	$JJ{###G  !"1"X
B!!""X
B***b**B3******b**B3***444b44B3=444     
 OOG$$$KK%((KKKFOOF###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   .B8D33D7:D7c                    |                     d          d         }|dv sJ |                    d          }|dz   }|                     |           |j        d         }t	          |          D ]}t          |d| dz   d          }|                    d           g }	t	          |d	z             D ]a}
||
         }|||
         \  }}}||         \  }}}|	                    d
| d| d|  dd
| d| d|  dd
| d| d| dz    dg           b|                    |	           d t	          |          D             }|                    |           |	                                 d S )Nr   r   r   r   r   _r   r   r'   r   r    r!   r"   c           	      J    g | ] }d |dz  dz    d|dz  dz    d|dz  dz    d!S r$   r)   r*   s     r   r-   z6Exporter._export_skeleton_sequence.<locals>.<listcomp>^   r.   r   )
r/   r0   r   r1   r4   r2   r3   r5   r6   close)r   r   r   r   r7   r8   r9   ir:   r;   r,   r<   r=   r>   r?   r@   rA   rB   rC   s                      r   _export_skeleton_sequencez"Exporter._export_skeleton_sequenceF   s   C$      ((f}D!!!LOq 	 	A{1{{{*C00DJJ)***GAEll 
 
bk;#BZ
B#C[
B***b**B3******b**B3***444b44B3=444     
 OOG$$$KK%((KKKFOOF###JJLLLL'	 	r   verticesfacesc                    |                     d          d         }|dv sJ |                    d          rt          st          d          t          j                                        }t          j                            |          |_	        t          j        
                    |          |_        |                     |           t          j                            ||           d S |                    d          }|dz   }|                     |           t!          |d          5 }|                    d           g }|D ]4}	|                    d	|	d
          d|	d          d|	d           d           5|                    |           g }
|D ]<}|
                    d|d
         dz    d|d         dz    d|d         dz    d           =|                    |
           d d d            d S # 1 swxY w Y   d S )Nr   r   )r   plyrS   zopen3d is not availabler   r   zo mesh
r   r   r    r(   r'   r!   r%   )r/   endswithOPEN3D_EQUIPPEDRuntimeErroro3dgeometryTriangleMeshutilityVector3dVectorrP   Vector3iVector	trianglesr   iowrite_triangle_meshr0   r2   r3   appendr6   )r   rP   rQ   r   r7   meshr8   r:   	_verticescorC   faces               r   _export_meshzExporter._export_meshb   sO   C$''''== 	" >"#<===<,,..DK66x@@DM [77>>DN%%%F&&tT222F  ((f}D!!!$__ 		$JJz"""I B B  !@be!@!@be!@!@r!uf!@!@!@AAAAOOI&&&F J JH4719HHtAwqyHH4719HHHIIIIOOF###		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$s   )B:G00G47G4{Gz?vertex_normalsnormal_sizec                 `   |                     d          r|t          d           |                    d          }|dz   }t          j                                        }t          j                            |          |_        | 	                    |           t          j
                            ||           d S |                    d          }|dz   }| 	                    |           t          |d          5 }|                    d           g }|D ]4}	|                    d|	d          d|	d	          d|	d
           d           5|                    |           |6|                    dd          }
t          |
d          }|                    d           g }t#          |j        d                   D ]}||         }	||df         }||d
f         }||d	f         }|                    d|	d          d|	d	          d|	d
           dd|	d         dz    d|	d	          d|	d
           dd|	d         ||z  z    d|	d	         ||z  z    d|	d
         ||z  z     dd|dz  d
z    d|dz  d	z    d|dz  dz    dg           |                    |           d d d            d S # 1 swxY w Y   d S )Nz.plyz2normal result will not be displayed in .ply formatr   r   zo pc
r   r   r    r(   r'   r!   z_normal.objz	o normal
g-C6?r%   r&   )rT   printr0   rW   rX   
PointCloudrZ   r[   pointsr   r^   write_point_cloudr2   r3   r`   r6   replacer4   r1   r5   )r   rP   r   rg   rh   r8   pcr:   _vertexrc   new_pathnfile_normalrN   xyzs                    r   
_export_pczExporter._export_pc|   s]   ==   
	)JKKK$$V,,D&=D((**B228<<BI%%%F$$T2...F  ((f}D!!!$__ 	*JJx   G @ @>BqE>>BqE>>RUF>>>????OOG$$$)<<>>Xs++L)))x~a011 
 
A!!B&q!t,A&q!t,A&q!t,ANN7RU77RU77beV777>RU6\>>BqE>>RUF>>>cRU1[=0cc2a5;3Fcc2a5QRS^Q^K^I_ccc6QqSU66QqSU66QqSU666	$       )))-	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   9FJ##J'*J'Q?r   FTskinnamesextrude_sizegroup_per_vertexadd_rootdo_not_normalizeuse_extrude_boneuse_connect_unique_childextrude_from_parenttailsc                 ^  - dd l }ddlm- |j        j                            d          }|j        j        j        j	        
                    |           ||j        j                            d          }|g }|                    |g |           |                                 |j        j                            d|          }|j        
                    |           |j        j                            d           |j        j                            d          }|j        }|j        d         }|(|                                }|d d d	fxx         |z  cc<   d
 t/          |          D             }t1          t2                    }t/          d|          D ]#}|||                                      |           $|)|rt/          |          D ]}t7          ||                   dk    r|r|dk    r|||                  }||         }||z
  }t8          j                            |          dk     rt9          j        g d          }n"|t8          j                            |          z  }|||z  z   ||<   |rpt/          |          D ]`}t7          ||                   dk    r||         d         }||         ||<   ||         $t7          |||                            dk    rd||<   a|	rB|                    d          }d|_          -|d         |d         |d         f          |_!        no|                    d          }|d         |_          -|d         |d         |d         f          |_"         -|d         |d         |d         |z   f          |_!        dtF          dtF          dtH          tJ          tJ          tJ          f         dtH          tJ          tJ          tJ          f         dtL          f
-fd}t/          |          D ]T}|	du r|dk    r|j        }||         dn|||                  } ||||         |||         ||         ||                    Ut/          |          D ]s}|                    ||                   }  -||df         ||df         ||d	f         f          | _"         -||df         ||df         ||d	f         f          | _!        t||d S |j        j        '                    d           |j        j        }!|j        j(        D ]}"|")                    d           |!d         }#|j        j        d         }$|#)                    d           |$)                    d           |j        j        *                    d           g }%|#j+        D ]}&|%                    |&j                    t9          j,        | d          }'|t9          j-        |j        d                   d         |'f         }(|d k    r|(j        d          }|
s)|(|(d!d |f         .                    d          d         z  }(t_          |          D ]`\  })}*t/          |          D ]K}+|'|)|+f         }||k    r||         },|,|%vr |#j+        |,         0                    |)g|(|)|+f         d"           Lad S )#Nr   Vectornew_collectionra   	characterT)enter_editmodeArmaturer(   c                     g | ]}d S )Fr)   )r+   rK   s     r   r-   z+Exporter._make_armature.<locals>.<listcomp>   s    ,,,aE,,,r   r'   gư>)        r         ?BoneRootr   r   )r   r'   )r   r(   r8   parent_nameheadtailconnectc                    |                      |          } |d         |d         |d         f          |_         |d         |d         |d         f          |_        ||_        |                     |          }||_        ||_        t          j        |          	                                rJ d|             t          j        |          	                                rJ d|             d S )Nr   r'   r(   znan found in head of bone znan found in tail of bone )
newr   r   r8   getparentuse_connectnpisnanany)	
edit_bonesr8   r   r   r   r   rH   parent_boner   s	           r   extrude_bonez-Exporter._make_armature.<locals>.extrude_bone   s     >>$''DQa$q':;;DIQa$q':;;DIDI$..55K%DK&Dx~~))++PP-P$-P-PPP+x~~))++PP-P$-P-PPP+PPr   FOBJECT)modeARMATURE_NAMEtypeaxis).Nr   .REPLACE)1bpy	mathutilsr   datacollectionsr   contextscene
collectionchildrenlinkmeshesfrom_pydataupdateobjectsopsobjectarmature_add	armaturesr   r   r1   copyr4   r   listr`   lenr   linalgnormarrayr8   r   r   strr   floatboolmode_setselected_objects
select_set
parent_setvertex_groupsargsortarangesum	enumerateadd).r   rP   r   ry   r   rz   rQ   r{   r|   r}   r~   r   r   r   r   r   r   ra   r   armaturer   r9   connectsr   rN   pjointjointdchild	bone_rootr   pnamerH   r   oobarmvisrt   	argsortedvertex_group_reweightvr   iinr   s.                                                @r   _make_armaturezExporter._make_armature   s<   " 	


$$$$$$ X)--.>??
$-22:>>> 8?&&v..D}Xr5111KKMMM X%))+t<<F ##F+++ 	##4#8888%))*55(
LO=KKMME!!!Q$KKK<'KKK,,588,,,t$$q! 	+ 	+AWQZ ''**** 
<q 	< 	<A8A;''1,,1D,a!'
!3 &q	!FN9>>!,,x77 " 6 6AA !BINN1$5$5 5A#(1|+;#;a' +q + +A8A;''1,, (A#)%=aqz-#hwqz6J2K2Kq2P2P&* 	_"v..I#IN#VVD\6$<$NOOINN"v..I"1XIN#VVD\6$<$NOOIN#VVD\6$<P\A\$]^^IN	Q	Q 	Q ue+,		Q
 ue+,	Q 	Q 	Q 	Q 	Q 	Q 	Q$ q 	X 	XA5  QTT!,J%aj0FFeGAJ6GELU1XufQiq8TU;WWWWq 	H 	HA>>%(++Dq!tfQTlF1a4LIJJDIadU1a4[%1+FGGDIIt|FX...("- 	  	 ALL[!hz*
dt!!!777! 	 	AJJqvJu1---	 $RYtz!}%=%=i%H)%S Tr!!4:2> 	@$9<QRUWhXhWhRh<i<m<mst<m<u<uv~<$!dOO 	V 	VDAq,-- V Vae$66!HC<< #''-B1b5-I9UUUUV	V 	Vr   c                 J   dd l }|j        j        D ]!}|j        j                            |           "|j        j        D ]!}|j        j                            |           "|j        j        D ]!}|j        j                            |           "|j        j        D ]!}|j        j                            |           "|j        j        D ]!}|j        j                            |           "|j        j        D ]!}|j        j                            |           "|j        j	        D ]!}|j        j	                            |           "|j        j
        D ]!}|j        j
                            |           "|j        j        D ]!}|j        j                            |           "d S )Nr   )r   r   actionsremover   camerasr   images	materialsr   r   textures)r   r   cs      r   
_clean_bpyzExporter._clean_bpy2  s   


! 	' 	'AH##A&&&&# 	) 	)AH%%a((((! 	' 	'AH##A&&&&% 	+ 	+AH ''**** 	& 	&AHO""1%%%%# 	) 	)AH%%a(((( 	& 	&AHO""1%%%%! 	' 	'AH##A&&&&" 	( 	(AH$$Q''''	( 	(r   c                     ddl }|                     |           |                                  |                     ||||||||	|
|||||           |j        j                            |dd           dS )z(
        Requires bpy installed
        r   N)rP   r   ry   r   rz   rQ   r{   r|   r}   r~   r   r   r   r   F)filepathcheck_existingadd_leaf_bones)r   r   r   r   r   export_scenefbx)r   r   rP   r   ry   r   rz   rQ   r{   r|   r}   r~   r   r   r   r   r   s                    r   _export_fbxzExporter._export_fbxG  s    * 	


D!!!%---%= 3 	 	
 	
 	
$ 	  $uUZ [[[[[r      
resolutionc                 
   dd l }dd l}ddlm} |                     |           ||J g }	||	                    |           |B|	                    |d d d df                    |	                    |d d dd f                    t          j        |	d          }	|	                    d          }
|		                    d          }t          j
        d          }t          ||
z    dz            |z  }t          j	        ||
z
  dz            }t          d|z            |z  }dt          d	t          d
t          fd}| |||          }|B ||d d d df         |          |d d d df<    ||d d dd f         |          |d d dd f<   |                                  d|j        j        j        _        d|j        j        j        _        d|j        j        j        j        _        |j        j                            d          }|j        j        j        j                            |           ||j        j                            d          }|j        j                            d|          }|j                            |           |                    |                                 g |                                            |!                                 d }|j"        j#        $                    d           |j        j#        }t          j%        d          |j        _&         || |d                     ||j        j        _'        |d         |j        j        j        _(        |d         |j        j        j        _)        d|j        j        j        j*        _+        ||j        j        j        _,        |j"        j                            d           |ddl-m.}m/} |0                    |          1                    d          }|2                    |          }ddl3m4} d|j        j        _5        |j        j        j6        j7        } ||          }|                    d           }||_8        ts          |          D ]\  }}|d d         |dd          }}|j:        ;                    |j        j        | ||                    } |j:        ;                    |j        j        | ||                    }!|\  }"}#| j<        |"z  d| j=        z
  |#z  f}$|!j<        |"z  d|!j=        z
  |#z  f}%|>                    |$|%gd!d"           |?                    |           d S d S )#Nr   r   r&   r      r(   r   r   transreturnc                     t          j        | |d dd df                                                   |d ddf         z   S )Nr&   )r   matmul	transpose)r   r   s     r   _applyz'Exporter._export_render.<locals>._apply  sA    9Qbqb"1"f 7 7 9 9::U2A2q5\IIr   BLENDER_WORKBENCHTVIEWPORTr   MeshData)r8   
MeshObject)r8   object_datac                 x    || j         z
  }|                    dd          }|                                | _        d S )Nz-ZY)locationto_track_quatto_eulerrotation_euler)camerapoint	directionrot_quats       r   look_atz(Exporter._export_render.<locals>.look_at  s=    /I ..tS99H$,$5$5$7$7F!!!r   )r   g      @)r   g      9@)r   r   gɿr'   PNG)write_still)Image	ImageDrawRGBA)
load_imageCompositorNodeImager   )   r   r   r  )fillwidth)@r   
bpy_extrasr   r   r   r`   r   concatenateminmaxeye_trans_to_m_scale_to_mr   r   r   r   renderenginefilm_transparentdisplayshadingbackground_typer   r   r   r   r   r   r   r   r   tolistr   r   r   
camera_addradiansangler  resolution_xresolution_yimage_settingsfile_formatr   PILr
  r  r2   convertDrawbpy_extras.image_utilsr  	use_nodes	node_treenodesimager   object_utilsworld_to_camera_viewrt   ru   linesave)&r   r   rP   rQ   rE   r   r   r  r   bounds	bound_min	bound_maxtrans_vertexscaler   r   	mesh_datamesh_objr  r  r
  r  img_pildrawr  r-  img
image_noderN   rH   r   r   head_2dtail_2dres_xres_yhead_pixtail_pixs&                                         r   _export_renderzExporter._export_renders  s    	


$$$$$$D!!! $%*;*;<MM(###MM%2A2,'''MM%122,'''Q///JJAJ&&	JJAJ&&	vayy"Y%:#;A#=>>M 	I-233"2:..=	Jg 	Jg 	J' 	J 	J 	J 	J vh55H!6%2A2,==E!!!RaR%L!6%122,==E!!!QRR%L 	*= '48 1<F!)9X)--.>??
$-22:>>>+++<<Ix'++9+UUH##H---!!8"3"3"5"5r5<<>>JJJ	8 	8 	8
 	!!<!888#Jt,,|,,---#) 0:1 -0:1 ->C /;,0 )$///,,,,,,,,jj&&..v66G>>'**D999999*.CK'K%/5E *T""C(=>>J"J$U++ P P4!"1"XtABBxd$1FFs{GXZ`bhbhimbnbnoo$1FFs{GXZ`bhbhimbnbnoo)u#I-GI/FG#I-GI/FG		8X.5EQ	OOOOLL1 r   )Nrf   )	Nrx   r   FFTTTN)__name__
__module____qualname__r   r   r   r   intr   rD   rI   rO   re   r   rw   r   r   r   r   r   rD  r)   r   r   r	   r	      s       : : :
$w $eCI>N9O $WZ $ $ $ $4$7 $# $ $ $ $. $uSRVYGWBX `c    8$W $W $C $ $ $ $4%* %*7 %*# %*uWVZ]G[ %*ot %* %* %* %*\ %)  $#'+"&$(MV MV&MV MV GTM"	MV
 eCI&'MV CyMV Wd]#MV MV MV MV MV MV #'MV "MV Wd]#MV MV MV MV^( ( (: %)  $#'+"&$(!*\ *\*\ &*\ 	*\
 GTM"*\ eCI&'*\ Cy*\ Wd]#*\ *\ *\ *\ *\ *\ #'*\ "*\  Wd]#!*\ *\ *\ *\d *-c
f ff &f Wd]#	f
 Wd]#f %,'f f f f f fr   r	   r   c                 @    t          j        d          }| |dddf<   |S )Nr   r   r&   )r   r  )r   ms     r   r  r    s%    
q		AAac1fIHr   rc                 V    t          j        d          }| |d<   | |d<   | |d<   d|d<   |S )N)r   r   r   )r'   r'   )r(   r(   r   )r&   r&   )r   zeros)rK  rJ  s     r   r  r    s:    
AAdGAdGAdGAdGHr   )numpyr   r   typingr   r   r   r   r   r   open3drW   rU   rj   r	   r  r  r)   r   r   <module>rQ     s             % % % % % % % % % % # # # # # # 				OO	E
OOOK K K K K K K KZ7    
7      s   ' 8