use crate::*;
#[cfg(feature = "bevy")]
use bevy::prelude::{Bundle, Component, Reflect, ReflectComponent};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(Bundle))]
pub struct Model {
pub name: NameInSite,
pub source: AssetSource,
pub pose: Pose,
#[serde(default, skip_serializing_if = "is_default")]
pub is_static: IsStatic,
#[serde(default, skip_serializing_if = "is_default")]
pub scale: Scale,
#[serde(skip)]
pub marker: ModelMarker,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, Default, PartialEq, Eq)]
#[cfg_attr(feature = "bevy", derive(Component, Reflect))]
#[cfg_attr(feature = "bevy", reflect(Component))]
pub struct ModelMarker;
impl Default for Model {
fn default() -> Self {
Self {
name: NameInSite("<Unnamed>".to_string()),
source: AssetSource::default(),
pose: Pose::default(),
is_static: IsStatic(false),
scale: Scale::default(),
marker: ModelMarker,
}
}
}
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(Component, Reflect))]
pub struct ModelProperty<T: Default + Clone>(pub T);
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(Component))]
pub struct ExportWith(pub HashMap<String, serde_json::Value>);
#[derive(Debug, Default, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(Component))]
pub struct ExportData(pub HashMap<String, sdformat::XmlElement>);
#[derive(Serialize, Deserialize, Debug, Clone)]
#[cfg_attr(feature = "bevy", derive(Bundle))]
pub struct ModelDescriptionBundle {
pub name: NameInSite,
pub source: ModelProperty<AssetSource>,
#[serde(default, skip_serializing_if = "is_default")]
pub is_static: ModelProperty<IsStatic>,
#[serde(default, skip_serializing_if = "is_default")]
pub scale: ModelProperty<Scale>,
#[serde(skip)]
pub export: ExportWith,
#[serde(skip)]
pub group: Group,
#[serde(skip)]
pub marker: ModelMarker,
}
impl Default for ModelDescriptionBundle {
fn default() -> Self {
Self {
name: NameInSite("<Unnamed>".to_string()),
source: ModelProperty(AssetSource::default()),
is_static: ModelProperty(IsStatic::default()),
scale: ModelProperty(Scale::default()),
export: ExportWith::default(),
group: Group,
marker: ModelMarker,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(Bundle))]
pub struct ModelInstance<T: RefTrait> {
pub name: NameInSite,
pub pose: Pose,
pub description: Affiliation<T>,
#[serde(skip)]
pub export_data: ExportData,
#[serde(skip)]
pub marker: ModelMarker,
#[serde(skip)]
pub instance_marker: InstanceMarker,
}
impl<T: RefTrait> Default for ModelInstance<T> {
fn default() -> Self {
Self {
name: NameInSite("<Unnamed>".to_string()),
pose: Pose::default(),
description: Affiliation::default(),
export_data: ExportData::default(),
marker: ModelMarker,
instance_marker: InstanceMarker,
}
}
}
impl<T: RefTrait> ModelInstance<T> {
pub fn convert<U: RefTrait>(&self, id_map: &HashMap<T, U>) -> Result<ModelInstance<U>, T> {
Ok(ModelInstance {
name: self.name.clone(),
pose: self.pose.clone(),
description: self.description.convert(id_map)?,
..Default::default()
})
}
}