
    h"7                         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 ddlmZ ddlmZ dd	lmZ d
dlmZ ddlmZ d dlZe G d de                      ZdS )    )defaultdict)	dataclassN)ndarray)DictUnionListTuple   )Order)RawData)Exporter   )TokenizeInput)linear_blend_skinningc                      e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   d	Zeed	f         ed
<   d	Z	eed	f         ed<   d	Z
eed	f         ed<   d	Zeed	f         ed<   d	Zeeeef         d	f         ed<   d	Zeeeed	f                  d	f         ed<   d	Zeee         d	f         ed<   d	Zeed	f         ed<   d	Zeed	f         ed<   d	Zeeeef         d	f         ed<   d	Zeeeeed	f         f         d	f         ed<   d	Zeed	f         ed<   d	Zeed	f         ed<   d	Zeeedf         d	f         ed<   ed             Zed             Zed             ZdAdedeed	f         fdZdefdZdee         fd Zd!e fd"Z!d#ee         fd$Z"e#d%e$dededed&d f
d'            Z%d&e&fd(Z'dBded+e(fd,Z)defd-Z*defd.Z+defd/Z,	 	 	 	 	 	 	 	 	 dCded3ed4e-d5ed6e(d7e(d8e(d9e(d:e(d;e(d<e(fd=Z.d>d>gd2fded?e/eef         d;e(fd@Z0d	S )DAssetz8
    Dataclass to handle data parsed from raw data.
    clspath	data_nameverticesvertex_normalsfacesface_normalsNjointstailsskinno_skinvertex_groupsparentsnamessampled_verticessampled_normalssampled_vertex_groups
parts_biasmatrix_localpose_matrix.metac                 &    | j         j        d         S )z$
        number of vertices
        r   )r   shapeselfs    0/data/cameron/tmprepos/2unirig/src/data/asset.pyNzAsset.NW   s    
 }"1%%    c                 &    | j         j        d         S )z!
        number of faces
        r   )r   r)   r*   s    r,   FzAsset.F^   s    
 z""r.   c                 &    | j         j        d         S )z"
        number of joints
        r   )r   r)   r*   s    r,   JzAsset.Je   s    
 { ##r.   matrix_basisc                 R   || j         J | j        }|pt          j        | j        ddf          }d|ddddf<   d|ddddf<   d|ddddf<   d|ddddf<   t          | j                  D ]}| j         |         ||dddf<   t          j        | j        ddf          }t          | j                  D ]q}|dk    r||         ||         z  ||<   | j        |         }||         }||         }|t          j                            |          ||         z  z  ||         z  ||<   r|S )zE
        get matrix
        
        matrix_basis: (J, 4, 4)
        N         ?r   r
   r      )	r   r%   npzerosr2   ranger   linalginv)r+   r3   r%   imatrixpidmatrix_parentmatrix_local_parents           r,   
get_matrixzAsset.get_matrixl   ss    ;***,L#!xA77(*QQQ1W%(*QQQ1W%(*QQQ1W%(*QQQ1W%tv < <A-1[^LBQB**461a.))tv 	 	A!tt(Ol1o=q		l1o &s&23&7# "Y]]#677,q/IK O$ q		
 r.   c                    | j         }|pt          j        | j        ddf          }d|ddddf<   d|ddddf<   d|ddddf<   d|ddddf<   t	          | j                  D ]}| j        |         ||dddf<   |                     ||          }|dddddf         | _        t          | j        ||| j	        dd	          }|| _         | j
        8t          j        | j                  }t          | j
        |||dd	          | _
        t          j        || j        d
          }|| _        |j                                        | _        |j                                        | _        dS )zS
        apply a pose to armature
        
        matrix_basis: (J, 4, 4)
        Nr5   r6   r   r
   r   r7   )r3   r%   )padvalueF)r   r   process)r%   r8   r9   r2   r:   r   rB   r   r   r   r   eyetrimeshTrimeshr   r   copyr   )r+   r3   r%   r=   r>   r   t_skinmeshs           r,   apply_matrix_basiszAsset.apply_matrix_basis   s    (8TVQN33L$&LAq!$&LAq!$&LAq!$&LAq!46]] 8 8)-QQAX&&lVVQQQAX&(fdi]^fhiii" :!VDF^^F.tz<QW]^fhiiiDJ
ERRR "16688 -2244r.   	new_namesc                    t          |          t          | j                  k    sJ d t          | j                  D             }d t          |          D             }g }g }t          |          D ]\  }}|                    ||                    | j        ||                  }|dk    r|
J d            n%| j        |         }	||	         }||k     s
J d            |                    |           | j        | j        |         | _        || _        | j        | j        |         | _        | j        | j        d d |f         | _        | j        | j        |         | _        | j	        | j	        |         | _	        || _        d S )Nc                     i | ]\  }}||	S  rQ   .0idnames      r,   
<dictcomp>z,Asset.set_order_by_names.<locals>.<dictcomp>   s    GGG:BdBGGGr.   c                     i | ]\  }}||	S rQ   rQ   rR   s      r,   rV   z,Asset.set_order_by_names.<locals>.<dictcomp>   s    JJJzD$JJJr.   r   zfirst bone is not root boneznew order does not form a tree)
lenr    	enumerateappendr   r   r   r   r   r%   )
r+   rN   
name_to_idnew_name_to_idpermnew_parentsnew_idrU   r?   pnames
             r,   set_order_by_nameszAsset.set_order_by_names   s   9~~TZ0000GG4:1F1FGGG
JJYy5I5IJJJ'	22 		$ 		$NVTKK
4())),z$/0C{{{{$A{{{{
3$U+V|||%E|||s####;"+d+DK":!D)DJ9 	!!!T'*DI<#<-DL( $ 1$ 7D


r.   orderc                     | j         | j        d S |                    | j        | j         | j                  \  }| _        |                     |           d S )N)r   r    r   )rN   )r    r   arrange_namesr   r$   ra   )r+   rb   rN   s      r,   	set_orderzAsset.set_order   s\    :!5F%*%8%8TXTZaeam%8%n%n"	4?)44444r.   keepc                    d t          | j                  D             dt          dt          ffddt          dt          ffd}| j        | j                                        }nd }| j        | j                                        }nd }| j        | j                                        }nd }| j        | j                                        }nd }g }g }g }	i }
d}t          | j	                  D ]
\  }}||v r|
                    |           ||
|<   |dz  }|	
                    |           | j        |         }||
                    d            n1 |          }|
                    |
| j	        |                             |dk    s
J d	             |          } | j        |                   }||d d |fxx         |d d |f         z  cc<   |||xx         ||         z  cc<    |||           |||	         }||d d |	f         }|||	         }|||	         }| j        | j        |	         | _        || _        || _        || _        || _        || _	        || _        d S )
Nc                     g | ]}|S rQ   rQ   )rS   r=   s     r,   
<listcomp>z"Asset.collapse.<locals>.<listcomp>   s    (((Qq(((r.   xreturnc                 P    |          | k    r| S  |                    }|| <   |S NrQ   rj   ydsufinds     r,   rq   zAsset.collapse.<locals>.find   s4    1v{{SVACFHr.   ro   c                 6     |           |           <   d S rm   rQ   rn   s     r,   mergezAsset.collapse.<locals>.merge   s     477CQLLLr.   r   r
   zcannot remove root)r:   r2   intr   rJ   r   r   r%   rY   r    rZ   r   r   )r+   rf   rs   	new_tailsnew_skinnew_no_skinr%   rN   r^   r]   r\   totr=   rU   r?   rT   rp   rq   s                   @@r,   collapsezAsset.collapse   s   ((%--(((	C 	C 	 	 	 	 	 	 		#S 	#S 	# 	# 	# 	# 	# 	# 	# :!
))III9 y~~''HHH<#,++--KKK(,1133LLL	"4:.. 	 	IQt||  &&&'*t$qAl1o;&&t,,,,$s))C&&~djo'FGGG666/666aB$t|B'((C #C   HQQQUO3   &C   KO3   E"cNNNN !$I4(H"%d+K#'-L;"+d+DK)'
&	)'
*r.   raw_datark   c                     t          |||| j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        i           S )zM
        Return an asset initialized from raw data and do transform.
        )r   r   r   r   r   r   r   r   r   r   r   r   r    r%   r'   )r   r   r   r   r   r   r   r   r   r   r    r%   )rz   r   r   r   s       r,   from_raw_datazAsset.from_raw_data   sd     &#2.!.?.$$.!.
 
 
 	
r.   c           	         t          t                    }t          | j                  D ]"\  }}|||                             |           #g }g }g }d }t          | j                  D ]}|                    t          ||                   dk               |dk    rU|                    t          j	        | j
        |         | j
        |         g                     |                    d           ne| j        |         }	|                    t          j	        | j
        |	         | j
        |         g                     |                    |	|k               |}t          j        |          }t          j        |t                    }t          j        |t                    }t          || j        ||| j        | j        | j                  S )Nr   F)dtype)bonesr   branchis_leafr   r   r$   )r   listrY   r   rZ   r:   r2   rX   r8   concatenater   stackarrayboolr   r   r   r   r$   )
r+   childrenrT   pr   r   r   lastr=   r?   s
             r,   get_tokenize_inputzAsset.get_tokenize_input<  s   t$$ .. 	' 	'GR}""2&&&tv 		 		ANN3x{++Q.///AvvR^T[^T[^,LMMNNNe$$$$l1oR^T[-=t{1~,NOOPPPc4i(((DD&---(7$///*L
 
 
 	
r.   T{Gz?with_normalc                     | j         }| j        }| j        | j        }| j        }|dk    rd}|                     ||||           dS )z$
        export point cloud
        NF)r   r   r   normal_size)r   r   r!   r"   
_export_pc)r+   r   r   r   r   normalss         r,   	export_pczAsset.export_pc]  s]     m) ,/H.G%GWZefffffr.   c                 J    |                      | j        | j        |           dS )z
        export mesh
        )r   r   r   N)_export_meshr   r   r+   r   s     r,   export_meshzAsset.export_meshj  s)     	4=
NNNNNr.   c                 J    |                      | j        | j        |           dS z
        export spring
        )r   r   r   N)_export_skeletonr   r   r   s     r,   export_skeletonzAsset.export_skeletonp  s)     	T[$,TRRRRRr.   c                 J    |                      | j        | j        |           dS r   )_export_skeleton_sequencer   r   r   s     r,   export_skeleton_sequencezAsset.export_skeleton_sequencev  s*     	&&dk4<VZ&[[[[[r.   Q?Fvertex_group_nameextrude_sizegroup_per_vertexadd_rootdo_not_normalizeuse_extrude_boneuse_connect_unique_childextrude_from_parentuse_tail
use_originc                     |                      ||r| j        n| j        | j        | j        |         | j        | j        |r| j        nd|||||||	|
r| j        nd           dS )z5
        export the whole model with skining
        N)r   r   r   r   r   r    r   r   r   r   r   r   r   r   r   )	_export_fbxr   r!   r   r#   r   r    r   r   )r+   r   r   r   r   r   r   r   r   r   r   r   s               r,   
export_fbxzAsset.export_fbx|  s    " 	&0KT]]d6K;+,=>L* *4$**%---%= 3 (2$**d 	 	
 	
 	
 	
 	
r.      
resolutionc                 j   |rO| j         J |                     || j        | j        t	          j        | j        | j         gd          |           d S | j        | j        dd                   }|                     || j        | j        t	          j        || j        dd          gd          |           d S )Nr   )axis)r   r   r   r   r   r
   )r   _export_renderr   r   r8   r   r   r   )r+   r   r   r   pjointss        r,   export_renderzAsset.export_render  s     	:)))jndk4:%>RHHH%        k$,qrr"23Gjngt{122%?bIII%       r.   rm   )Tr   )	r   r   FFTTTFF)1__name__
__module____qualname____doc__str__annotations__r   r   r   r   r   r   r   r   r   r   rt   r    r!   r"   r#   r$   r%   r&   r'   propertyr-   r0   r2   rB   rM   ra   r   re   ry   staticmethodr   r|   r   r   r   r   r   r   r   floatr   r	   r   rQ   r.   r,   r   r      s         
 
HHH III NNN   NNN  "&FE'4- %%% !%E5$$$$  $D%
### #'GU7D=!&&& 48M5c7l+T12777 26GU4c4i()4/0555 #'E5cD!&&& ,0eGTM*/// +/OU7D=)... <@5c7l!3T!9:??? :>Jd3c4i 001478=== (,L%&+++ '+Kw}%***&*D%S#X$
%***& & X& # # X# $ $ X$   w  eGTM>R        D5w 5 5 5 5@DI    <5u 5 5 5 5L+T#Y L+ L+ L+ L+\ 


 
 	

 

 
 
 \
6
M 
 
 
 
Bg gc g g g g gO O O O OSC S S S S\S \ \ \ \ ! $#'+"&!
 !
!
 !
 	!

 !
 !
 !
 !
 #'!
 "!
 !
 !
 !
 !
 !
F EH:^c  # 5c? Y]      r.   r   )collectionsr   dataclassesr   numpyr8   r   typingr   r   r   r	   rb   r   rz   r   exporterr   tokenizer.specr   utilsr   rH   r   rQ   r.   r,   <module>r      s   # # # # # # ! ! ! ! ! !           + + + + + + + + + + + +                   * * * * * * ( ( ( ( ( (  ^ ^ ^ ^ ^H ^ ^ ^ ^ ^r.   