gled-core 2.32.1

The engine of gled without a user interface: inputs, timing, rendering, Art-Net/DMX output and storage
Documentation
//! The feedback of one scene instance and its effects, under the address prefix
//! it is reported at.

use rosc::OscType;
use std::net::{SocketAddr, UdpSocket};

use gled_model::patching::layout::LayoutSelection;

use crate::storage::asset::scene::instance::SceneInstance;

use super::{osc_int, send_feedback};

pub(super) fn send_scene_instance_feedback(
    socket: &UdpSocket,
    addr: SocketAddr,
    prefix: &str,
    scene: &SceneInstance,
) {
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/active"),
        vec![OscType::Bool(scene.active)],
    );
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/opacity"),
        vec![OscType::Float(scene.opacity.multiplier)],
    );
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/name"),
        vec![OscType::String(scene.name.clone())],
    );
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/color"),
        vec![OscType::String(scene.color.to_string())],
    );
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/input_dimmer"),
        vec![OscType::Float(scene.input_dimmer)],
    );
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/ignore_main_dimmer"),
        vec![OscType::Bool(scene.ignore_main_dimmer)],
    );
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/beat_offset"),
        vec![OscType::Float(scene.beat_progression_offset.multiplier)],
    );
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/set_offset_on_flash"),
        vec![OscType::Bool(scene.set_offset_on_flash)],
    );

    let effects = &scene.scene.effects;
    send_feedback(
        socket,
        addr,
        &format!("{prefix}/effect/count"),
        vec![osc_int(effects.len())],
    );
    for (i, effect) in effects.iter().enumerate() {
        send_feedback(
            socket,
            addr,
            &format!("{prefix}/effect/{i}/opacity"),
            vec![OscType::Float(effect.opacity.multiplier)],
        );
        send_feedback(
            socket,
            addr,
            &format!("{prefix}/effect/{i}/color_shift"),
            vec![OscType::Float(effect.color_shift.multiplier)],
        );
        send_feedback(
            socket,
            addr,
            &format!("{prefix}/effect/{i}/beat_progression"),
            vec![OscType::Float(effect.beat_progression.multiplier)],
        );
        send_feedback(
            socket,
            addr,
            &format!("{prefix}/effect/{i}/beat_offset"),
            vec![OscType::Float(effect.beat_progression_offset.multiplier)],
        );
        send_feedback(
            socket,
            addr,
            &format!("{prefix}/effect/{i}/speed_exponent"),
            vec![OscType::Int(effect.speed_exponent)],
        );
        send_feedback(
            socket,
            addr,
            &format!("{prefix}/effect/{i}/layout"),
            vec![layout_feedback(effect.selection)],
        );
    }
}

/// An effect's layout as `.../effect/{i}/layout` takes it: the stack index (0
/// the topology), or -1 when it inherits its tile's layout.
pub(super) fn layout_feedback(selection: Option<LayoutSelection>) -> OscType {
    selection.map_or(OscType::Int(-1), |selection| {
        osc_int(selection.layout.stack_index())
    })
}