
    h              	       T   d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlZd dlmZ d dl mZmZ dd	lmZ dd
lmZ e G d de                      Ze G d d                      Z G d de	          Z G d de          Z G d de          Z	 ddedededefdZdedefdZdS )    )List)heappushheappopheapify)	dataclass)ABCabstractmethodN)ndarray)DictTuple   )Asset)
ConfigSpecc                   d    e Zd ZU dZeed<   eed<   eed<   eeef         ed<   ed	d            Z	dS )
SamplerConfigz-
    Config to handle bones re-ordering.
    methodnum_samplesvertex_sampleskwargsreturnc           	          |                      |           t          |j        |                    dd          |                    dd          |                    di                     S )Nr   r   r   r   )r   r   r   r   )
check_keysr   r   get)clsconfigs     2/data/cameron/tmprepos/2unirig/src/data/sampler.pyparsezSamplerConfig.parse   sd    v=

=!44!::&6::::h++	
 
 
 	
    N)r   r   )
__name__
__module____qualname____doc__str__annotations__intr   classmethodr    r   r   r   r      s{           KKK   dO
 
 
 [
 
 
r   r   c                   >    e Zd ZU eed<   eed<   eeef         ed<   dS )SamplerResultverticesnormalsvertex_groupsN)r   r    r!   r
   r$   r   r#   r'   r   r   r)   r)   (   sE            W%%%%%%r   r)   c                   f    e Zd ZdZdedededefdZedefd            Zed	e	d
e
fd            ZdS )Samplerz&
    Abstract class for samplers.
    vertex_groupfaces
face_indexrandom_lengthsc                     |||df                  }|||dd f                  }||d d t           j        d d f         z  }||z                      d          }||z   }|S )Nr   r   axis)npnewaxissum)	selfr/   r0   r1   r2   	v_origins	v_vectorssample_vector	v_sampless	            r   _sample_barycentriczSampler._sample_barycentric8   sy     !z1}!56	 z122~!67	Yqqq"*aaa/00	"^388a8@@!I-	r   r   c                     d S Nr'   )r9   r   s     r   __init__zSampler.__init__G   s    r   assetr   c                     dS )zM
        Return sampled vertices, sampled normals and vertex groups.
        Nr'   )r9   rB   s     r   samplezSampler.sampleK   s	     	r   N)r   r    r!   r"   r
   r>   r	   r   rA   r   r)   rD   r'   r   r   r.   r.   3   s           	
      }    ^  
   ^  r   r.   c                   4     e Zd Zdef fdZdedefdZ xZS )SamplerOriginr   c                 z    t                                          |           |j        | _        |j        | _        d S r@   superrA   r   r   r9   r   	__class__s     r   rA   zSamplerOrigin.__init__V   s7       $0$3r   rB   r   c                    t           j                            |j        j        d                   |j        j        d         | j        k     r`| j        |j        j        d         z
  }t          j        t           j                            d|j        j        d         |f          g          d | j                 |j                 }|j                 }fd|j	        
                                D             }t          |||          S )Nr   c                 (    i | ]\  }}||         S r'   r'   .0namevperms      r   
<dictcomp>z(SamplerOrigin.sample.<locals>.<dictcomp>f   s#    III'$agIIIr   r*   r+   r,   )r6   randompermutationr*   shaper   concatenaterandintvertex_normalsr,   itemsr)   )r9   rB   mn_vn_nn_vgrR   s         @r   rD   zSamplerOrigin.sample[   s     y$$U^%9!%<==>"T%555 5>#7#::A>4):):1en>RST>UXYW[)\)\"]^^D%T%%&nT""4(IIIIU-@-F-F-H-HIII
 
 
 	
r   )	r   r    r!   r   rA   r   r)   rD   __classcell__rK   s   @r   rF   rF   U   sj        4} 4 4 4 4 4 4


 

 
 
 
 
 
 
 
r   rF   c                   J     e Zd Zdef fdZed             ZdedefdZ	 xZ
S )
SamplerMixr   c                     t                                          |           |j        | _        |j        | _        | j        | j        k    s
J d            d S )Nz$num_samples should >= vertex_samplesrH   rJ   s     r   rA   zSamplerMix.__init__n   sW       $0$34#66668^66666r   c                     | j         dk    S )N)r   )r9   s    r   mesh_preservezSamplerMix.mesh_preservet   s    ##r   rB   r   c                 0   | j         }t          j                            |j        j        d                   t          | j        |j        j        d                   }||z  }d |         |j                 }|j                 }fd|j	        
                                D             }t          j                            |          t          ||j        |j        d          \  }}}t          j        ||gd          }t          j        ||j        |         gd          }	i }
|j	        
                                D ]D\  }}|                     ||j        ||          }t          j        ||         |gd          |
|<   Et!          ||	|
          S )Nr   c                 (    i | ]\  }}||         S r'   r'   rN   s      r   rS   z%SamplerMix.sample.<locals>.<dictcomp>   s#    HHHqtQtWHHHr   T)r   r*   r0   return_weightr4   )r/   r0   r1   r2   rT   )r   r6   rU   rV   r*   rW   minr   rZ   r,   r[   sample_surfacer0   rX   face_normalsr>   r)   )r9   rB   r   r   n_vertexn_normalr]   r1   r2   normal_samplesvertex_group_samplesnrQ   grR   s                 @r   rD   zSamplerMix.samplex   s   
 &y$$U^%9!%<==T0%.2Fq2IJJ~%O^O$>$''-HHHHE,?,E,E,G,GHHH y$$[115C#^+	6
 6
 6
2
N >(BKKK53Ej3Q(RYZ[[[!'--// 	J 	JDAq((k%-	 )  A ')nc!fa[q&I&I&I ###".
 
 
 	
r   )r   r    r!   r   rA   propertyrg   r   r)   rD   r`   ra   s   @r   rc   rc   m   s        _} _ _ _ _ _ _ $ $ X$%
%
 
%
 %
 %
 %
 %
 %
 %
 %
r   rc   Fr   r*   r0   rj   c                    ||dddf                  ||dddf                  z
  }||dddf                  ||dddf                  z
  }t          j        ||d          }||z                      d          }t          j        |d          }t           j                            |           |d         z  }t          j        ||          }	||dddf                  }
||ddddf                  }|t          j        |
d                              d          z  }|
|	         }
||	         }t           j                            t          |          dd          }|                    d                              d          d	k    }||xx         d	z  cc<   t          j
        |          }||z                      d          }||
z   }|s|S ||	|fS )
z
    Randomly pick samples according to face area.
    
    See sample_surface: https://github.com/mikedh/trimesh/blob/main/trimesh/sample.py
    Nr   r      rf   r4   )r   rv   )rf   rv      g      ?)r6   crossr8   cumsumrU   randsearchsortedtilereshapelenabs)r   r*   r0   rj   offset_0offset_1face_weight
weight_cum	face_pickr1   tri_originstri_vectorsr2   random_testr<   r   s                   r   rl   rl      s    aaad$xaaad'<<Haaad$xaaad'<<H(8XB777K,11q199K;Q///J	{++jn<IY77J 5A;'K5ABB<(K27;//77
CCCK j)Kj)K Y^^C$4$4a;;N $$!$,,44R883>K;3&VN++N >166A6>>M"[0N :~55r   r   r   c                     | j         }|dk    rt          |           }n)|dk    rt          |           }nt          d| d          |S )Noriginmixzsampler method z not supported)r   rF   rc   
ValueError)r   r   samplers      r   get_samplerr      sZ    ]Fx''	V$$A6AAABBBNr   )F)typingr   heapqr   r   r   dataclassesr   abcr   r	   numpyr6   r
   r   r   rB   r   specr   r   r)   r.   rF   rc   r%   boolrl   r   r'   r   r   <module>r      s         , , , , , , , , , , ! ! ! ! ! ! # # # # # # # #                              

 
 
 
 
J 
 
 
4 & & & & & & & &         c      D
 
 
 
 
G 
 
 
00
 0
 0
 0
 0
 0
 0
 0
l 	)6 )6)6)6 )6 	)6 )6 )6 )6V '      r   