fbxcel_dom/v7400/object/
texture.rs

1//! `Texture` object.
2
3use mint::{Point3, Vector3};
4
5use crate::v7400::{
6    data::texture::{BlendMode, BlendModeLoader, WrapMode, WrapModeLoader},
7    object::{
8        property::{
9            loaders::{BorrowedStringLoader, F64Arr3Loader, MintLoader, PrimitiveLoader},
10            ObjectProperties,
11        },
12        video, ObjectHandle, TypedObjectHandle,
13    },
14};
15
16define_object_subtype! {
17    /// `Texture` node handle.
18    TextureHandle: ObjectHandle
19}
20
21impl<'a> TextureHandle<'a> {
22    /// Returns a video clip object if available.
23    pub fn video_clip(&self) -> Option<video::ClipHandle<'a>> {
24        self.source_objects()
25            .filter(|obj| obj.label().is_none())
26            .filter_map(|obj| obj.object_handle())
27            .filter_map(|obj| match obj.get_typed() {
28                TypedObjectHandle::Video(video::TypedVideoHandle::Clip(o)) => Some(o),
29                _ => None,
30            })
31            .next()
32    }
33
34    /// Returns properties.
35    pub fn properties(&self) -> TextureProperties<'a> {
36        TextureProperties {
37            properties: self.properties_by_native_typename("FbxFileTexture"),
38        }
39    }
40}
41
42/// Proxy type to texture properties.
43#[derive(Debug, Clone, Copy)]
44pub struct TextureProperties<'a> {
45    /// Properties.
46    properties: ObjectProperties<'a>,
47}
48
49impl<'a> TextureProperties<'a> {
50    impl_prop_proxy_getters! {
51        /// Returns default alpha value.
52        alpha -> f64 {
53            name = "Texture alpha",
54            loader = PrimitiveLoader::<f64>::new(),
55            description = "texture alpha value",
56            default: {
57                /// Returns default alpha value.
58                ///
59                /// Returns default if the value is not set.
60                alpha_or_default = 1.0
61            }
62        }
63
64        /// Returns wrap mode U.
65        wrap_mode_u -> WrapMode {
66            name = "WrapModeU",
67            loader = WrapModeLoader::default(),
68            description = "wrap mode U",
69            default: {
70                /// Returns wrap mode U.
71                ///
72                /// Returns default if the value is not set.
73                wrap_mode_u_or_default = WrapMode::Repeat
74            }
75        }
76
77        /// Returns wrap mode V.
78        wrap_mode_v -> WrapMode {
79            name = "WrapModeV",
80            loader = WrapModeLoader::default(),
81            description = "wrap mode V",
82            default: {
83                /// Returns wrap mode V.
84                ///
85                /// Returns default if the value is not set.
86                wrap_mode_v_or_default = WrapMode::Repeat
87            }
88        }
89
90        /// Returns whether the UV should be swapped or not.
91        ///
92        /// Returns `Some(true)` if UV should be swapped.
93        uv_swap -> bool {
94            name = "UVSwap",
95            loader = PrimitiveLoader::<bool>::new(),
96            description = "UV swap flag",
97            default: {
98                /// Returns whether the UV should be swapped or not.
99                ///
100                /// Returns `true` if UV should be swapped.
101                ///
102                /// Returns default if the value is not set.
103                uv_swap_or_default = false
104            }
105        }
106
107        /// Returns premultiply-alpha flag.
108        ///
109        /// Returns `Some(true)` if the alpha is premultiplied.
110        premultiply_alpha -> bool {
111            name = "PremultiplyAlpha",
112            loader = PrimitiveLoader::<bool>::new(),
113            description = "premultiply-alpha flag",
114            default: {
115                /// Returns premultiply-alpha flag.
116                ///
117                /// Returns `true` if the alpha is premultiplied.
118                ///
119                /// Returns default if the value is not set.
120                premultiply_alpha_or_default = false
121            }
122        }
123
124        /// Returns default translation vector.
125        translation -> Vector3<f64> {
126            name = "Translation",
127            loader = MintLoader::<Vector3<f64>>::new(),
128            description = "translation vector",
129            default: {
130                /// Returns default translation vector.
131                ///
132                /// Returns default if the value is not set.
133                translation_or_default = Vector3 { x: 0.0, y: 0.0, z: 0.0 }
134            }
135        }
136
137        /// Returns default rotation vector.
138        // TODO: I'm not sure which type to use here, `mint::Vector3` or
139        // `mint::Euler`.
140        rotation -> [f64; 3] {
141            name = "Rotation",
142            loader = F64Arr3Loader::new(),
143            description = "rotation vector",
144            default: {
145                /// Returns default rotation vector.
146                ///
147                /// Returns default if the value is not set.
148                rotation_or_default = [0.0; 3]
149            }
150        }
151
152        /// Returns default scaling vector.
153        scaling -> Vector3<f64> {
154            name = "Scaling",
155            loader = MintLoader::<Vector3<f64>>::new(),
156            description = "scaling vector",
157            default: {
158                /// Returns default scaling vector.
159                ///
160                /// Returns default if the value is not set.
161                scaling_or_default = Vector3 { x: 1.0, y: 1.0, z: 1.0 }
162            }
163        }
164
165        /// Returns rotation pivot vector.
166        rotation_pivot -> Point3<f64> {
167            name = "TextureRotationPivot",
168            loader = MintLoader::<Point3<f64>>::new(),
169            description = "rotation pivot vector",
170            default: {
171                /// Returns rotation pivot vector.
172                ///
173                /// Returns default if the value is not set.
174                rotation_pivot_or_default = Point3 { x: 0.0, y: 0.0, z: 0.0 }
175            }
176        }
177
178        /// Returns rotation pivot vector.
179        scaling_pivot -> Point3<f64> {
180            name = "TextureScalingPivot",
181            loader = MintLoader::<Point3<f64>>::new(),
182            description = "scaling pivot vector",
183            default: {
184                /// Returns scaling pivot vector.
185                ///
186                /// Returns default if the value is not set.
187                scaling_pivot_or_default = Point3 { x: 0.0, y: 0.0, z: 0.0 }
188            }
189        }
190
191        /// Returns texture blend mode.
192        blend_mode -> BlendMode {
193            name = "CurrentTextureBlendMode",
194            loader = BlendModeLoader::default(),
195            description = "texture blend mode",
196            default: {
197                /// Returns texture blend mode.
198                ///
199                /// Returns default if the value is not set.
200                blend_mode_or_default = BlendMode::Additive
201            }
202        }
203
204        /// Returns UV set name.
205        uv_set -> &'a str {
206            name = "UVSet",
207            loader = BorrowedStringLoader::new(),
208            description = "UV set name",
209            default: {
210                /// Returns UV set name.
211                ///
212                /// Returns default if the value is not set.
213                uv_set_or_default = "default"
214            }
215        }
216    }
217}
218
219impl<'a> std::ops::Deref for TextureProperties<'a> {
220    type Target = ObjectProperties<'a>;
221
222    fn deref(&self) -> &Self::Target {
223        &self.properties
224    }
225}