use crate::identifiers::GroupIDChanger;
use super::{data::MaterialData, Material};
#[derive(Debug, PartialEq, Clone)]
pub struct MaterialDescriptor {
name: Option<String>,
data: MaterialData,
}
impl MaterialDescriptor {
pub fn new_color(red: f32, green: f32, blue: f32, alpha: f32) -> Self {
MaterialDescriptor {
name: None,
data: MaterialData::Color(red, green, blue, alpha),
}
}
pub fn new_rgb(red: f32, green: f32, blue: f32) -> Self {
MaterialDescriptor {
name: None,
data: MaterialData::Color(red, green, blue, 1.),
}
}
pub fn new_texture(texture_path: impl Into<String>) -> Self {
MaterialDescriptor {
name: None,
data: MaterialData::Texture(texture_path.into()),
}
}
pub(crate) fn new_data(data: MaterialData) -> Self {
MaterialDescriptor { name: None, data }
}
pub fn named(mut self, name: impl Into<String>) -> Self {
self.name = Some(name.into());
self
}
pub(crate) fn build(self) -> Material {
match self.name {
Some(name) => Material::new_named_uninited(name, self.data),
None => Material::new_unnamed(self.data),
}
}
}
impl MaterialDescriptor {
pub fn name(&self) -> Option<&String> {
self.name.as_ref()
}
pub fn data(&self) -> &MaterialData {
&self.data
}
}
impl GroupIDChanger for MaterialDescriptor {
unsafe fn change_group_id_unchecked(&mut self, new_group_id: &str) {
if let Some(name) = self.name.as_mut() {
name.change_group_id_unchecked(new_group_id);
}
}
fn apply_group_id(&mut self) {
if let Some(name) = self.name.as_mut() {
name.apply_group_id();
}
}
}
#[cfg(test)]
mod tests {
use super::MaterialDescriptor;
use test_log::test;
mod group_id_changer {
use super::{test, MaterialDescriptor};
use crate::identifiers::{GroupIDChanger, GroupIDError};
#[inline]
fn test_change_group_id_unchecked(
material_builder: MaterialDescriptor,
new_group_id: &str,
final_name: Option<&str>,
) {
let mut material_builder = material_builder;
unsafe {
material_builder.change_group_id_unchecked(new_group_id);
}
assert_eq!(
material_builder.name,
final_name.and_then(|final_name| Some(final_name.to_owned()))
)
}
#[test]
fn change_group_id_unchecked_no_name() {
test_change_group_id_unchecked(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.),
"R04",
None,
);
test_change_group_id_unchecked(MaterialDescriptor::new_rgb(1., 1., 0.), "C064w", None);
test_change_group_id_unchecked(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture"),
"Yellow",
None,
);
test_change_group_id_unchecked(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.),
"[[R04",
None,
);
test_change_group_id_unchecked(
MaterialDescriptor::new_rgb(1., 1., 0.),
"C064w]]",
None,
);
test_change_group_id_unchecked(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture"),
"",
None,
);
}
#[test]
fn change_group_id_unchecked_with_name() {
test_change_group_id_unchecked(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_[[L01]]_mat"),
"R04",
Some("Leg_[[R04]]_mat"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_rgb(1., 1., 0.).named("rgb_[[dsd]]_dsdadavj,hnmn b v"),
"C064w",
Some("rgb_[[C064w]]_dsdadavj,hnmn b v"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[[GroupID]]"),
"Yellow",
Some("SomeCoolTexture[[Yellow]]"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_[[L01]]_mat"),
"[[R04",
Some("Leg_[[[[R04]]_mat"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_rgb(1., 1., 0.).named("[[CADcs]]SomeColor"),
"C064w]]",
Some("[[C064w]]]]SomeColor"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[[GroupID]]"),
"",
Some("SomeCoolTexture[[]]"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_L01_mat"),
"R04",
Some("Leg_L01_mat"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_rgb(1., 1., 0.).named("rgb_[\\[dsd]\\]_dsdadavj,hnmn b v"),
"C064w",
Some("rgb_[\\[dsd]\\]_dsdadavj,hnmn b v"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[\\[GroupID]]"),
"Yellow",
Some("SomeCoolTexture[\\[GroupID]]"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_L01_mat"),
"[[R04",
Some("Leg_L01_mat"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_rgb(1., 1., 0.).named("[[CADcs]\\]SomeColor"),
"C064w]]",
Some("[[CADcs]\\]SomeColor"),
);
test_change_group_id_unchecked(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture_GroupID_"),
"",
Some("SomeCoolTexture_GroupID_"),
);
}
#[inline]
fn test_change_group_id(
material_builder: MaterialDescriptor,
new_group_id: &str,
change_result: Result<(), GroupIDError>,
final_name: Option<&str>,
) {
let mut material_builder = material_builder;
assert_eq!(
material_builder.change_group_id(new_group_id),
change_result
);
assert_eq!(
material_builder.name,
final_name.and_then(|final_name| Some(final_name.to_owned()))
)
}
#[test]
fn change_group_id_no_name() {
test_change_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.),
"R04",
Ok(()),
None,
);
test_change_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.),
"C064w",
Ok(()),
None,
);
test_change_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture"),
"Yellow",
Ok(()),
None,
);
test_change_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.),
"[[R04",
Err(GroupIDError::new_open("[[R04")),
None,
);
test_change_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.),
"C064w]]",
Err(GroupIDError::new_close("C064w]]")),
None,
);
test_change_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture"),
"",
Err(GroupIDError::new_empty()),
None,
);
}
#[test]
fn change_group_id_with_name() {
test_change_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_[[L01]]_mat"),
"R04",
Ok(()),
Some("Leg_[[R04]]_mat"),
);
test_change_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.).named("rgb_[[dsd]]_dsdadavj,hnmn b v"),
"C064w",
Ok(()),
Some("rgb_[[C064w]]_dsdadavj,hnmn b v"),
);
test_change_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[[GroupID]]"),
"Yellow",
Ok(()),
Some("SomeCoolTexture[[Yellow]]"),
);
test_change_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_[[L01]]_mat"),
"[[R04",
Err(GroupIDError::new_open("[[R04")),
Some("Leg_[[L01]]_mat"),
);
test_change_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.).named("[[CADcs]]SomeColor"),
"C064w]]",
Err(GroupIDError::new_close("C064w]]")),
Some("[[CADcs]]SomeColor"),
);
test_change_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[[GroupID]]"),
"",
Err(GroupIDError::new_empty()),
Some("SomeCoolTexture[[GroupID]]"),
);
test_change_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_L01_mat"),
"R04",
Ok(()),
Some("Leg_L01_mat"),
);
test_change_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.).named("rgb_[\\[dsd]\\]_dsdadavj,hnmn b v"),
"C064w",
Ok(()),
Some("rgb_[\\[dsd]\\]_dsdadavj,hnmn b v"),
);
test_change_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[\\[GroupID]]"),
"Yellow",
Ok(()),
Some("SomeCoolTexture[\\[GroupID]]"),
);
test_change_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_L01_mat"),
"[[R04",
Err(GroupIDError::new_open("[[R04")),
Some("Leg_L01_mat"),
);
test_change_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.).named("[[CADcs]\\]SomeColor"),
"C064w]]",
Err(GroupIDError::new_close("C064w]]")),
Some("[[CADcs]\\]SomeColor"),
);
test_change_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture_GroupID_"),
"",
Err(GroupIDError::new_empty()),
Some("SomeCoolTexture_GroupID_"),
);
}
#[inline]
fn test_apply_group_id(material_builder: MaterialDescriptor, final_name: Option<&str>) {
let mut material_builder = material_builder;
material_builder.apply_group_id();
assert_eq!(
material_builder.name,
final_name.and_then(|final_name| Some(final_name.to_owned()))
)
}
#[test]
fn apply_group_id_no_name() {
test_apply_group_id(MaterialDescriptor::new_color(1., 0.5, 0.25, 0.), None);
test_apply_group_id(MaterialDescriptor::new_rgb(1., 1., 0.), None);
test_apply_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture"),
None,
);
}
#[test]
fn apply_group_id_with_name() {
test_apply_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_[[L01]]_mat"),
Some("Leg_L01_mat"),
);
test_apply_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.).named("rgb_[[dsd]]_dsdadavj,hnmn b v"),
Some("rgb_dsd_dsdadavj,hnmn b v"),
);
test_apply_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[[GroupID]]"),
Some("SomeCoolTextureGroupID"),
);
test_apply_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_[\\[[[L01]]_mat]\\]"),
Some("Leg_[[L01_mat]]"),
);
test_apply_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.)
.named("rgb_[[dsd]]_d[\\[sdadavj]\\],hnmn b v"),
Some("rgb_dsd_d[[sdadavj]],hnmn b v"),
);
test_apply_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[[Gro[\\[upID]]"),
Some("SomeCoolTextureGro[[upID"),
);
test_apply_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.)
.named("rgb_[[dsd]]_d[[sdadavj]\\],hnmn b v"),
Some("rgb_[[dsd]]_d[[sdadavj]\\],hnmn b v"),
);
test_apply_group_id(
MaterialDescriptor::new_color(1., 0.5, 0.25, 0.).named("Leg_L01_mat"),
Some("Leg_L01_mat"),
);
test_apply_group_id(
MaterialDescriptor::new_rgb(1., 1., 0.).named("rgb_[\\[dsd]\\]_dsdadavj,hnmn b v"),
Some("rgb_[[dsd]]_dsdadavj,hnmn b v"),
);
test_apply_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[\\[GroupID"),
Some("SomeCoolTexture[[GroupID"),
);
test_apply_group_id(
MaterialDescriptor::new_texture("package://some/texture/path/text.texture")
.named("SomeCoolTexture[\\[GroupID]]"),
Some("SomeCoolTexture[\\[GroupID]]"),
);
}
}
}