File size: 2,563 Bytes
9d7cf7f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from dataclasses import dataclass
from typing import List, Optional

from ..rig_package.info.asset import Asset
from .augment import Augment, get_augments
from .order import Order
from .sampler import Sampler, get_sampler
from .spec import ConfigSpec
from .vertex_group import VertexGroup, get_vertex_groups

@dataclass
class Transform(ConfigSpec):
    
    order: Optional[Order]=None
    
    vertex_groups: Optional[List[VertexGroup]]=None
    
    augments: Optional[List[Augment]]=None
    
    sampler: Optional[Sampler]=None
    
    @classmethod
    def parse(cls, **kwargs) -> 'Transform':
        cls.check_keys(kwargs)
        order_config = kwargs.get('order')
        vertex_groups_config = kwargs.get('vertex_groups')
        augments_config = kwargs.get('augments')
        sampler_config = kwargs.get('sampler')
        
        d = {}
        if order_config is not None:
            d['order'] = Order.parse(**order_config)
        if vertex_groups_config is not None:
            d['vertex_groups'] = get_vertex_groups(*vertex_groups_config)
        if augments_config is not None:
            d['augments'] = get_augments(*augments_config)
        if sampler_config is not None:
            d['sampler'] = get_sampler(**sampler_config)
        return Transform(**d)
    
    def apply(self, asset: Asset, **kwargs):
        
        # 1. arrange bones
        if self.order is not None:
            if asset.joint_names is not None and asset.parents is not None:
                new_names, _ = self.order.arrange_names(cls=asset.cls, names=asset.joint_names, parents=asset.parents.tolist())
                asset.set_order(new_orders=new_names) # type: ignore
        
        # 2. collapse must perform first
        if self.augments is not None:
            kwargs = {}
            for augment in self.augments:
                augment.transform(asset=asset, **kwargs)
        
        # 3. get vertex groups
        if self.vertex_groups is not None:
            d = {}
            for v in self.vertex_groups:
                d.update(v.get_vertex_group(asset=asset))
            asset.vertex_groups = d
        else:
            asset.vertex_groups = {}
        
        # 4. sample
        if self.sampler is not None:
            res = self.sampler.sample(asset=asset)
            asset.sampled_vertices          = res.sampled_vertices
            asset.sampled_normals           = res.sampled_normals
            asset.sampled_vertex_groups     = res.sampled_vertex_groups
            asset.skin_samples              = res.skin_samples