mesh_tools/
builder_material_specular.rs1use crate::builder::GltfBuilder;
2use crate::models::{MaterialExtensions, PbrSpecularGlossiness, TextureInfo};
3
4impl GltfBuilder {
5 pub fn add_specular_glossiness_material(
30 &mut self,
31 name: Option<String>,
32 diffuse_factor: Option<[f32; 4]>,
33 diffuse_texture: Option<usize>,
34 specular_factor: Option<[f32; 3]>,
35 glossiness_factor: Option<f32>,
36 specular_glossiness_texture: Option<usize>,
37 normal_texture: Option<usize>,
38 occlusion_texture: Option<usize>,
39 emissive_texture: Option<usize>,
40 emissive_factor: Option<[f32; 3]>,
41 alpha_mode: Option<String>,
42 alpha_cutoff: Option<f32>,
43 double_sided: Option<bool>,
44 ) -> usize {
45 if self.gltf.extensions_used.is_none() {
47 self.gltf.extensions_used = Some(vec!["KHR_materials_pbrSpecularGlossiness".to_string()]);
48 } else if let Some(ext_used) = &mut self.gltf.extensions_used {
49 if !ext_used.contains(&"KHR_materials_pbrSpecularGlossiness".to_string()) {
50 ext_used.push("KHR_materials_pbrSpecularGlossiness".to_string());
51 }
52 }
53
54 let mut material = crate::models::Material::default();
56 material.name = name;
57
58 if alpha_mode.is_some() {
60 material.alpha_mode = alpha_mode;
61 }
62
63 if alpha_cutoff.is_some() {
64 material.alpha_cutoff = alpha_cutoff;
65 }
66
67 if double_sided.is_some() {
68 material.double_sided = double_sided;
69 }
70
71 if emissive_factor.is_some() {
72 material.emissive_factor = emissive_factor;
73 }
74
75 if let Some(normal_texture_index) = normal_texture {
77 material.normal_texture = Some(crate::models::NormalTextureInfo {
78 index: normal_texture_index,
79 tex_coord: Some(0),
80 scale: Some(1.0),
81 });
82 }
83
84 if let Some(occlusion_texture_index) = occlusion_texture {
85 material.occlusion_texture = Some(crate::models::OcclusionTextureInfo {
86 index: occlusion_texture_index,
87 tex_coord: Some(0),
88 strength: Some(1.0),
89 });
90 }
91
92 if let Some(emissive_texture_index) = emissive_texture {
93 material.emissive_texture = Some(TextureInfo {
94 index: emissive_texture_index,
95 tex_coord: Some(0),
96 });
97 }
98
99 let mut pbr_specular_glossiness = PbrSpecularGlossiness::default();
101
102 pbr_specular_glossiness.diffuse_factor = diffuse_factor;
103 pbr_specular_glossiness.specular_factor = specular_factor;
104 pbr_specular_glossiness.glossiness_factor = glossiness_factor;
105
106 if let Some(diffuse_texture_index) = diffuse_texture {
107 pbr_specular_glossiness.diffuse_texture = Some(TextureInfo {
108 index: diffuse_texture_index,
109 tex_coord: Some(0),
110 });
111 }
112
113 if let Some(specular_glossiness_texture_index) = specular_glossiness_texture {
114 pbr_specular_glossiness.specular_glossiness_texture = Some(TextureInfo {
115 index: specular_glossiness_texture_index,
116 tex_coord: Some(0),
117 });
118 }
119
120 let material_extensions = MaterialExtensions {
122 pbr_specular_glossiness: Some(pbr_specular_glossiness),
123 };
124
125 material.extensions = Some(material_extensions);
126
127 self.add_material_direct(material)
129 }
130
131 pub fn create_specular_material(
144 &mut self,
145 name: Option<String>,
146 diffuse_color: [f32; 4],
147 specular_color: [f32; 3],
148 glossiness: f32,
149 ) -> usize {
150 self.add_specular_glossiness_material(
151 name,
152 Some(diffuse_color),
153 None,
154 Some(specular_color),
155 Some(glossiness),
156 None,
157 None,
158 None,
159 None,
160 None,
161 Some("OPAQUE".to_string()),
162 None,
163 Some(false),
164 )
165 }
166
167 fn add_material_direct(&mut self, material: crate::models::Material) -> usize {
171 if let Some(materials) = &mut self.gltf.materials {
172 let index = materials.len();
173 materials.push(material);
174 index
175 } else {
176 self.gltf.materials = Some(vec![material]);
177 0
178 }
179 }
180}