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
//! `Deformer` object (skin).

use anyhow::{format_err, Error};

use crate::v7400::object::{
    deformer::{self, DeformerHandle},
    geometry, TypedObjectHandle,
};

define_object_subtype! {
    /// `Deformer` node handle (skin).
    SkinHandle: DeformerHandle
}

impl<'a> SkinHandle<'a> {
    /// Returns the parant geometry mesh.
    pub fn mesh(&self) -> Result<geometry::MeshHandle<'a>, Error> {
        self.destination_objects()
            .filter(|obj| obj.label().is_none())
            .filter_map(|obj| obj.object_handle())
            .filter_map(|obj| match obj.get_typed() {
                TypedObjectHandle::Geometry(geometry::TypedGeometryHandle::Mesh(o)) => Some(o),
                _ => None,
            })
            .next()
            .ok_or_else(|| {
                format_err!(
                    "Deformer skin object should have a parent geometry mesh: object={:?}",
                    self
                )
            })
    }

    /// Returns an iterator of child subdeformer clusters.
    pub fn clusters(&self) -> impl Iterator<Item = deformer::ClusterHandle<'a>> {
        self.source_objects()
            .filter(|obj| obj.label().is_none())
            .filter_map(|obj| obj.object_handle())
            .filter_map(|obj| match obj.get_typed() {
                TypedObjectHandle::SubDeformer(deformer::TypedSubDeformerHandle::Cluster(o)) => {
                    Some(o)
                }
                _ => None,
            })
    }
}