fbxcel_dom/v7400/data/texture/
primitive.rs1use std::convert::TryFrom;
4
5use anyhow::{bail, Error};
6
7use crate::v7400::object::property::{loaders::PrimitiveLoader, LoadProperty, PropertyHandle};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
11pub enum WrapMode {
12 Repeat,
14 Clamp,
16}
17
18impl TryFrom<i32> for WrapMode {
19 type Error = Error;
20
21 fn try_from(v: i32) -> Result<Self, Self::Error> {
22 match v {
23 0 => Ok(WrapMode::Repeat),
24 1 => Ok(WrapMode::Clamp),
25 v => bail!("Unexpected `WrapMode` value: {:?}", v),
26 }
27 }
28}
29
30#[derive(Default, Debug, Clone, Copy)]
32pub(crate) struct WrapModeLoader;
33
34impl<'a> LoadProperty<'a> for WrapModeLoader {
35 type Value = WrapMode;
36 type Error = Error;
37
38 fn expecting(&self) -> String {
39 "`i32` value as wrap mode".into()
40 }
41
42 fn load(self, node: &PropertyHandle<'a>) -> Result<Self::Value, Self::Error> {
43 if node.data_type()? != "enum" {
44 bail!(
45 "Unexpected data type: expected \"enum\", but got {:?}",
46 node.data_type()
47 );
48 }
49 node.load_value(PrimitiveLoader::<i32>::new())
50 .and_then(TryFrom::try_from)
51 }
52}
53
54#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
59pub enum BlendMode {
60 Translucent,
62 Additive,
64 Modulate,
66 Modulate2,
68 Over,
70}
71
72impl TryFrom<i32> for BlendMode {
73 type Error = Error;
74
75 fn try_from(v: i32) -> Result<Self, Self::Error> {
76 match v {
77 0 => Ok(BlendMode::Translucent),
78 1 => Ok(BlendMode::Additive),
79 2 => Ok(BlendMode::Modulate),
80 3 => Ok(BlendMode::Modulate2),
81 4 => Ok(BlendMode::Over),
82 v => bail!("Unexpected `BlendMode` value: {:?}", v),
83 }
84 }
85}
86
87#[derive(Default, Debug, Clone, Copy)]
89pub(crate) struct BlendModeLoader;
90
91impl<'a> LoadProperty<'a> for BlendModeLoader {
92 type Value = BlendMode;
93 type Error = Error;
94
95 fn expecting(&self) -> String {
96 "`i32` value as blend mode".into()
97 }
98
99 fn load(self, node: &PropertyHandle<'a>) -> Result<Self::Value, Self::Error> {
100 if node.data_type()? != "enum" {
101 bail!(
102 "Unexpected data type: expected \"enum\", but got {:?}",
103 node.data_type()
104 );
105 }
106 node.load_value(PrimitiveLoader::<i32>::new())
107 .and_then(TryFrom::try_from)
108 }
109}