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}