use bevy_asset::Asset;
use bevy_color::prelude::*;
use bevy_ecs::component::Component;
use bevy_ecs::prelude::ReflectComponent;
use bevy_pbr::prelude::*;
use bevy_reflect::prelude::*;
use bevy_utils::prelude::*;
use derive_more::derive::From;
use crate::traits::{AssetHandleComponent, AssetState, AssetWrapper};
#[derive(Component, Reflect, Clone, PartialEq, From)]
#[reflect(Component)]
pub enum Material3dFlag {
Pure(MaterialWrapper),
Path(String),
}
#[derive(Clone, From, PartialEq, Reflect)]
pub enum MaterialWrapper {
Color(Color),
}
impl AssetWrapper for Material3dFlag {
type WrapperTarget = MeshMaterial3d<StandardMaterial>;
type PureVariant = MaterialWrapper;
fn asset_state(&self) -> AssetState<Self::PureVariant, String> {
match self {
Material3dFlag::Pure(material_wrapper) => AssetState::Pure(material_wrapper),
Material3dFlag::Path(path) => AssetState::Path(path),
}
}
}
impl From<&MaterialWrapper> for StandardMaterial {
fn from(value: &MaterialWrapper) -> Self {
match value {
MaterialWrapper::Color(color) => Self {
base_color: *color,
..default()
},
}
}
}
impl From<&StandardMaterial> for MaterialWrapper {
fn from(value: &StandardMaterial) -> Self {
Self::Color(value.base_color)
}
}
impl From<&StandardMaterial> for Material3dFlag {
fn from(value: &StandardMaterial) -> Self {
Self::Pure(value.base_color.into())
}
}
impl<T: Asset + Material> AssetHandleComponent for MeshMaterial3d<T> {
type AssetType = T;
}
impl Default for Material3dFlag {
fn default() -> Self {
Material3dFlag::Pure(Color::default().into())
}
}