gled-core 2.31.2

The engine of gled without a user interface: inputs, timing, rendering, Art-Net/DMX output and storage
Documentation
//! What an effect of a scene instance does: its values, curves, layout and
//! animation.

use rosc::OscMessage;

use super::args::{parse_curve_id, parse_f32, parse_i32, parse_optional_uuid};
use crate::action::UiAction;
use crate::storage::asset::animation::Animation;
use crate::storage::asset::project::scene_instance_path::SceneInstanceUnion;
use crate::storage::asset_id::AssetId;

pub(super) fn parse_target_effect_action(
    msg: &OscMessage,
    target: SceneInstanceUnion,
    effect_index: usize,
    action: &str,
) -> Result<UiAction, ()> {
    match action {
        "opacity" => Ok(UiAction::SetSceneEffectOpacity(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        "color_shift" => Ok(UiAction::SetSceneEffectColorShift(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        "beat_progression" => Ok(UiAction::SetSceneEffectBeatProgression(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        "beat_offset" => Ok(UiAction::SetSceneEffectBeatOffset(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        "speed_exponent" => Ok(UiAction::SetSceneEffectSpeedExponent(
            target,
            effect_index,
            parse_i32(msg, 0)?,
        )),
        // A stack index, 0 the topology; a negative one (-1) inherits.
        "layout" => Ok(UiAction::SetSceneEffectLayout(
            target,
            effect_index,
            usize::try_from(parse_i32(msg, 0)?).ok(),
        )),
        "animation" => Ok(UiAction::SetSceneEffectAnimation(
            target,
            effect_index,
            parse_optional_animation_id(msg, 0)?,
        )),
        "delete" => Ok(UiAction::RemoveSceneEffect(target, effect_index)),
        "clone" => Ok(UiAction::CloneSceneEffect(target, effect_index)),
        _ => Err(()),
    }
}

fn parse_optional_animation_id(
    msg: &OscMessage,
    index: usize,
) -> Result<Option<AssetId<Animation>>, ()> {
    parse_optional_uuid(msg, index).map(|id| id.map(AssetId::from_uuid))
}

pub(super) fn parse_target_effect_curve_action(
    msg: &OscMessage,
    target: SceneInstanceUnion,
    effect_index: usize,
    field: &str,
    sub_action: &str,
) -> Result<UiAction, ()> {
    match (field, sub_action) {
        ("opacity", "value") => Ok(UiAction::SetSceneEffectOpacityMultiplier(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        ("opacity", "static") => Ok(UiAction::SetSceneEffectOpacity(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        ("opacity", "curve") => Ok(UiAction::SetSceneEffectOpacityCurve(
            target,
            effect_index,
            parse_curve_id(msg, 0)?,
        )),
        ("color_shift", "value") => Ok(UiAction::SetSceneEffectColorShiftMultiplier(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        ("color_shift", "static") => Ok(UiAction::SetSceneEffectColorShift(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        ("color_shift", "curve") => Ok(UiAction::SetSceneEffectColorShiftCurve(
            target,
            effect_index,
            parse_curve_id(msg, 0)?,
        )),
        ("beat_progression", "value") => Ok(UiAction::SetSceneEffectBeatProgressionMultiplier(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        ("beat_progression", "static") => Ok(UiAction::SetSceneEffectBeatProgression(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        ("beat_progression", "curve") => Ok(UiAction::SetSceneEffectBeatProgressionCurve(
            target,
            effect_index,
            parse_curve_id(msg, 0)?,
        )),
        ("beat_offset", "value") => Ok(UiAction::SetSceneEffectBeatOffsetMultiplier(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        ("beat_offset", "static") => Ok(UiAction::SetSceneEffectBeatOffset(
            target,
            effect_index,
            parse_f32(msg, 0)?,
        )),
        ("beat_offset", "curve") => Ok(UiAction::SetSceneEffectBeatOffsetCurve(
            target,
            effect_index,
            parse_curve_id(msg, 0)?,
        )),
        _ => Err(()),
    }
}