fbxcel_dom/v7400/data/texture/
primitive.rs

1//! Primitive types.
2
3use std::convert::TryFrom;
4
5use anyhow::{bail, Error};
6
7use crate::v7400::object::property::{loaders::PrimitiveLoader, LoadProperty, PropertyHandle};
8
9/// Texture wrap mode.
10#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
11pub enum WrapMode {
12    /// Repeat.
13    Repeat,
14    /// Clamp to edge.
15    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/// `WrapMode` property loader.
31#[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/// Texture blend mode.
55///
56/// See
57/// <http://help.autodesk.com/cloudhelp/2019/ENU/FBX-Developer-Help/cpp_ref/class_fbx_texture.html#ae712bb955e55f00dc24eb98c3686dd5a>.
58#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
59pub enum BlendMode {
60    /// Transparent depending on alpha settings.
61    Translucent,
62    /// Additive.
63    Additive,
64    /// Multiply.
65    Modulate,
66    /// Multiply 2.
67    Modulate2,
68    /// Opaque.
69    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/// `BlendMode` property loader.
88#[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}