1#[cfg(feature = "extensions")]
2use serde_json::{Map, Value};
3
4use crate::{Accessor, Document, Node};
5
6#[cfg(feature = "utils")]
7use crate::Buffer;
8
9pub mod iter;
11
12#[cfg(feature = "utils")]
14#[cfg_attr(docsrs, doc(cfg(feature = "utils")))]
15pub mod util;
16
17#[cfg(feature = "utils")]
18#[doc(inline)]
19pub use self::util::Reader;
20
21#[derive(Clone, Debug)]
23pub struct Skin<'a> {
24 document: &'a Document,
26
27 index: usize,
29
30 json: &'a json::skin::Skin,
32}
33
34impl<'a> Skin<'a> {
35 pub(crate) fn new(document: &'a Document, index: usize, json: &'a json::skin::Skin) -> Self {
37 Self {
38 document,
39 index,
40 json,
41 }
42 }
43
44 pub fn index(&self) -> usize {
46 self.index
47 }
48
49 #[cfg(feature = "extensions")]
51 #[cfg_attr(docsrs, doc(cfg(feature = "extensions")))]
52 pub fn extensions(&self) -> Option<&Map<String, Value>> {
53 let ext = self.json.extensions.as_ref()?;
54 Some(&ext.others)
55 }
56
57 #[cfg(feature = "extensions")]
59 #[cfg_attr(docsrs, doc(cfg(feature = "extensions")))]
60 pub fn extension_value(&self, ext_name: &str) -> Option<&Value> {
61 let ext = self.json.extensions.as_ref()?;
62 ext.others.get(ext_name)
63 }
64
65 pub fn extras(&self) -> &'a json::Extras {
67 &self.json.extras
68 }
69
70 pub fn inverse_bind_matrices(&self) -> Option<Accessor<'a>> {
75 self.json
76 .inverse_bind_matrices
77 .as_ref()
78 .map(|index| self.document.accessors().nth(index.value()).unwrap())
79 }
80
81 #[cfg(feature = "utils")]
83 #[cfg_attr(docsrs, doc(cfg(feature = "utils")))]
84 pub fn reader<'s, F>(&'a self, get_buffer_data: F) -> Reader<'a, 's, F>
85 where
86 F: Clone + Fn(Buffer<'a>) -> Option<&'s [u8]>,
87 {
88 Reader {
89 skin: self.clone(),
90 get_buffer_data,
91 }
92 }
93
94 pub fn joints(&self) -> iter::Joints<'a> {
97 iter::Joints {
98 document: self.document,
99 iter: self.json.joints.iter(),
100 }
101 }
102
103 #[cfg(feature = "names")]
105 #[cfg_attr(docsrs, doc(cfg(feature = "names")))]
106 pub fn name(&self) -> Option<&'a str> {
107 self.json.name.as_deref()
108 }
109
110 pub fn skeleton(&self) -> Option<Node<'a>> {
113 self.json
114 .skeleton
115 .as_ref()
116 .map(|index| self.document.nodes().nth(index.value()).unwrap())
117 }
118}