Preview App
use std::f64::consts::PI;

use ranim::{
    animation::{creation::WritingAnim, fading::FadingAnim, transform::TransformAnim},
    color::palettes::manim,
    glam::DVec3,
    items::vitem::{
        VItem,
        geometry::{Circle, Square},
    },
    prelude::*,
    timeline::TimeMark,
};

#[scene]
#[output(dir = "hello_ranim")]
fn hello_ranim(r: &mut RanimScene) {
    let _r_cam = r.insert_and_show(CameraFrame::default());

    let mut square = Square::new(2.0);
    square.set_color(manim::BLUE_C);

    let r_square = r.insert(square);
    {
        let t = r.timeline_mut(&r_square);
        t.play_with(|square| square.fade_in());
    }

    let mut circle = Circle::new(2.0);
    circle
        .set_color(manim::RED_C)
        .rotate(-PI / 4.0 + PI, DVec3::Z);

    let r_vitem = r.map(r_square, VItem::from);
    {
        let t = r.timeline_mut(&r_vitem);
        t.play_with(|state| state.transform_to(circle.into()));
        t.forward(1.0);
        let circle = t.snapshot();
        t.play_with(|circle| circle.unwrite());
        t.play(circle.write());
        t.play_with(|circle| circle.fade_out());
    };

    r.insert_time_mark(3.7, TimeMark::Capture("preview.png".to_string()));
}

#[allow(unused)]
fn hello_ranim_chained(r: &mut RanimScene) {
    let _r_cam = r.insert_and_show(CameraFrame::default());
    let square = Square::new(2.0).with(|square| {
        square.set_color(manim::BLUE_C);
    });

    let r_square = r.insert(square);
    r.timeline_mut(&r_square)
        .play_with(|square| square.fade_in());

    let circle = Circle::new(2.0).with(|circle| {
        circle
            .set_color(manim::RED_C)
            .rotate(-PI / 4.0 + PI, DVec3::Z);
    });

    let r_vitem = r.map(r_square, VItem::from);
    r.timeline_mut(&r_vitem)
        .play_with(|state| state.transform_to(circle.into()))
        .forward(1.0)
        .with_snapshot(|t, snapshot| {
            t.play_with(|circle| circle.unwrite())
                .play(snapshot.write())
                .play_with(|circle| circle.fade_out());
        });

    r.insert_time_mark(3.7, TimeMark::Capture("preview.png".to_string()));
}