dae_parser/physics/
material.rs1use crate::*;
2
3#[derive(Clone, Default, Debug)]
8pub struct PhysicsMaterial {
9 pub id: Option<String>,
11 pub name: Option<String>,
13 pub asset: Option<Box<Asset>>,
15 pub common: PhysicsMaterialCommon,
18 pub technique: Vec<Technique>,
20 pub extra: Vec<Extra>,
22}
23
24impl PhysicsMaterial {
25 pub fn new(id: impl Into<String>) -> Self {
27 Self {
28 id: Some(id.into()),
29 name: None,
30 asset: None,
31 common: Default::default(),
32 technique: vec![],
33 extra: vec![],
34 }
35 }
36}
37
38impl XNode for PhysicsMaterial {
39 const NAME: &'static str = "physics_material";
40 fn parse(element: &Element) -> Result<Self> {
41 debug_assert_eq!(element.name(), Self::NAME);
42 let mut it = element.children().peekable();
43 Ok(PhysicsMaterial {
44 id: element.attr("id").map(Into::into),
45 name: element.attr("name").map(Into::into),
46 asset: Asset::parse_opt_box(&mut it)?,
47 common: parse_one(Technique::COMMON, &mut it, PhysicsMaterialCommon::parse)?,
48 technique: Technique::parse_list(&mut it)?,
49 extra: Extra::parse_many(it)?,
50 })
51 }
52}
53
54impl XNodeWrite for PhysicsMaterial {
55 fn write_to<W: Write>(&self, w: &mut XWriter<W>) -> Result<()> {
56 let mut e = Self::elem();
57 e.opt_attr("id", &self.id);
58 e.opt_attr("name", &self.name);
59 let e = e.start(w)?;
60 self.asset.write_to(w)?;
61 let common = ElemBuilder::new(Technique::COMMON).start(w)?;
62 self.common.write_to(w)?;
63 common.end(w)?;
64 self.technique.write_to(w)?;
65 self.extra.write_to(w)?;
66 e.end(w)
67 }
68}
69
70#[derive(Clone, Copy, Default, Debug)]
73pub struct PhysicsMaterialCommon {
74 pub dynamic_friction: f32,
76 pub restitution: f32,
80 pub static_friction: f32,
82}
83
84impl PhysicsMaterialCommon {
85 fn parse(e: &Element) -> Result<Self> {
86 let mut it = e.children().peekable();
87 let res = PhysicsMaterialCommon {
88 dynamic_friction: parse_opt("dynamic_friction", &mut it, parse_elem)?.unwrap_or(0.),
89 restitution: parse_opt("restitution", &mut it, parse_elem)?.unwrap_or(0.),
90 static_friction: parse_opt("static_friction", &mut it, parse_elem)?.unwrap_or(0.),
91 };
92 finish(res, it)
93 }
94}
95
96impl XNodeWrite for PhysicsMaterialCommon {
97 fn write_to<W: Write>(&self, w: &mut XWriter<W>) -> Result<()> {
98 ElemBuilder::def_print("dynamic_friction", self.dynamic_friction, 0., w)?;
99 ElemBuilder::def_print("restitution", self.restitution, 0., w)?;
100 ElemBuilder::def_print("static_friction", self.static_friction, 0., w)
101 }
102}