use super::ffi;
use crate::{Quat, Vec2, Vec3, Vec4};
use ark_api_ffi::{TransparentPad, PodBool};
use ffi::{Value, ValueData, ValueType};
#[derive(Copy, Clone, PartialEq, Debug)]
#[cfg_attr(feature = "with_serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ParamType {
None,
Bool(bool),
Float(f32),
Int(i64),
Vec2(Vec2),
Vec3(Vec3),
Vec4(Vec4),
Quat(Quat),
}
impl From<ParamType> for Value {
fn from(param_type: ParamType) -> Self {
match param_type {
ParamType::None => Self::none(),
ParamType::Bool(v) => Self {
value_type: ValueType::Bool,
value_data: ValueData { data_bool: TransparentPad::new(PodBool::from(v)) },
_pad: Default::default(),
},
ParamType::Float(v) => Self {
value_type: ValueType::Float32,
value_data: ValueData { data_f32: TransparentPad::new(v) },
_pad: Default::default(),
},
ParamType::Int(v) => Self {
value_type: ValueType::Int64,
value_data: ValueData { data_i64: TransparentPad::new(v) },
_pad: Default::default(),
},
ParamType::Vec2(v) => Self {
value_type: ValueType::Vec2,
value_data: ValueData {
data_vec2: TransparentPad::new(v.into()),
},
_pad: Default::default(),
},
ParamType::Vec3(v) => Self {
value_type: ValueType::Vec3,
value_data: ValueData {
data_vec3: TransparentPad::new(v.into()),
},
_pad: Default::default(),
},
ParamType::Vec4(v) => Self {
value_type: ValueType::Vec4,
value_data: ValueData {
data_vec4: TransparentPad::new(v.into()),
},
_pad: Default::default(),
},
ParamType::Quat(v) => Self {
value_type: ValueType::Quat,
value_data: ValueData {
data_quat: TransparentPad::new(v.into()),
},
_pad: Default::default(),
},
}
}
}
impl From<&Value> for ParamType {
fn from(v: &Value) -> Self {
match v.value_type {
ValueType::None => Self::None,
ValueType::Float32 => Self::Float(*v.value_data.as_data_f32()),
ValueType::Vec2 => Self::Vec2((*v.value_data.as_data_vec2()).into()),
ValueType::Vec3 => Self::Vec3((*v.value_data.as_data_vec3()).into()),
ValueType::Vec4 => Self::Vec4((*v.value_data.as_data_vec4()).into()),
ValueType::Quat => Self::Quat(Quat::from_vec4((*v.value_data.as_data_quat()).into())),
ValueType::Bool => Self::Bool(v.value_data.as_data_bool().as_bool()),
ValueType::Int64 => Self::Int(*v.value_data.as_data_i64()),
}
}
}