ark-api 0.17.0-pre.15

Ark API
Documentation
use super::ffi;
use crate::{Quat, Vec2, Vec3, Vec4};
use ark_api_ffi::{TransparentPad, PodBool};
use ffi::{Value, ValueData, ValueType};

/// Parameter type
#[derive(Copy, Clone, PartialEq, Debug)]
#[cfg_attr(feature = "with_serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ParamType {
    /// No param type
    None,
    /// Boolean
    Bool(bool),
    /// Float
    Float(f32),
    /// Integer
    Int(i64),
    /// 2d vector
    Vec2(Vec2),
    /// 3d vector
    Vec3(Vec3),
    /// 4d vector
    Vec4(Vec4),
    /// Quaternion
    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()),
        }
    }
}