ranim 0.1.0-alpha.4

An animation engine inspired by manim and JAnim
Documentation
name = "basic"
code = """
```rust,linenos
use std::f32;\r
\r
use env_logger::Env;\r
use glam::{vec3, Vec3};\r
use ranim::animation::creation::{Color, CreationAnimSchedule, WritingAnimSchedule};\r
use ranim::animation::fading::FadingAnimSchedule;\r
use ranim::animation::transform::TransformAnimSchedule;\r
use ranim::color::palettes::manim;\r
use ranim::items::svg_item::SvgItem;\r
use ranim::items::vitem::{Arc, Polygon, VItem};\r
use ranim::items::Group;\r
use ranim::timeline::TimeMark;\r
use ranim::utils::rate_functions::linear;\r
use ranim::{prelude::*, typst_svg};\r
\r
const SVG: &str = include_str!(\"../../assets/Ghostscript_Tiger.svg\");\r
\r
#[scene]\r
struct BasicScene;\r
\r
impl TimelineConstructor for BasicScene {\r
    fn construct<'t: 'r, 'r>(\r
        self,\r
        timeline: &'t RanimTimeline,\r
        _camera: &'r mut Rabject<'t, CameraFrame>,\r
    ) {\r
        timeline.forward(0.2);\r
\r
        let mut svg = SvgItem::from_svg(SVG);\r
        svg.scale(Vec3::splat(2.0)).shift(vec3(0.0, 200.0, 0.0));\r
        let mut svg = timeline.insert(svg);\r
        let mut text = Group::<VItem>::from_svg(&typst_svg!(\r
            r#\"\r
            #align(center)[\r
                #text(60pt)[Ranim]\r
\r
                #text(20pt)[Hello 你好]\r
            ]\r
            \"#\r
        ));\r
        text.items.iter_mut().for_each(|item| {\r
            item.set_fill_opacity(0.8).shift(Vec3::NEG_Y * 200.0);\r
        });\r
        let mut text = timeline.insert_group(text);\r
        let len = text.rabjects.len() as f32;\r
        let dur = 3.0 / (1.0 + (len - 1.0) * 0.2);\r
        // println!(\"{len}, {dur}\");\r
\r
        timeline.play_group(text.lagged_anim(0.2, |item| {\r
            item.write().with_duration(dur).with_rate_func(linear)\r
        }));\r
        timeline.play(svg.fade_in().with_duration(3.0)); // At the same time, the svg fade in\r
        timeline.sync();\r
        timeline.insert_time_mark(\r
            timeline.duration_secs(),\r
            TimeMark::Capture(\"preview.png\".to_string()),\r
        );\r
\r
        timeline.forward(0.5);\r
        timeline.play_group(text.lagged_anim(0.2, |item| {\r
            item.unwrite().with_duration(dur).with_rate_func(linear)\r
        }));\r
        timeline.play(svg.fade_out().with_duration(3.0));\r
        timeline.sync();\r
\r
        let mut polygon = Polygon(vec![\r
            vec3(0.0, 0.0, 0.0),\r
            vec3(-100.0, -300.0, 0.0),\r
            vec3(0.0, 700.0, 0.0),\r
            vec3(200.0, 300.0, 0.0),\r
            vec3(500.0, 0.0, 0.0),\r
        ])\r
        .build();\r
        polygon\r
            .set_color(color!(\"#FF8080FF\"))\r
            .set_fill_opacity(0.5)\r
            .rotate(std::f32::consts::FRAC_PI_2, Vec3::Z);\r
\r
        // [polygon] 0.5s wait -> fade in -> 0.5s wait\r
        timeline.forward(0.5);\r
        let mut polygon = timeline.insert(polygon);\r
        timeline.play(polygon.fade_in()).sync();\r
        timeline.forward(0.5);\r
\r
        let mut arc = Arc {\r
            angle: f32::consts::PI / 3.0,\r
            radius: 100.0,\r
        }\r
        .build();\r
        arc.set_stroke_color(manim::BLUE_C);\r
        let mut arc = timeline.insert(arc);\r
        // [polygon] interpolate [svg] -> 0.5s wait\r
\r
        let polygon_data = polygon.data.clone();\r
        drop(polygon);\r
        timeline.play(arc.transform_from(polygon_data)).sync();\r
        timeline.forward(0.5);\r
\r
        // [svg] fade_out -> 0.5s wait\r
        timeline.play(arc.uncreate()).sync();\r
        timeline.forward(0.5);\r
    }\r
}\r
\r
fn main() {\r
    #[cfg(debug_assertions)]\r
    env_logger::Builder::from_env(Env::default().default_filter_or(\"basic=trace\")).init();\r
    #[cfg(not(debug_assertions))]\r
    env_logger::Builder::from_env(Env::default().default_filter_or(\"basic=info,ranim=info\")).init();\r
\r
    render_timeline(BasicScene, &AppOptions::default());\r
}\r

```"""
hash = "dd6b12b4519c0edd2d42ccf2e79537791e2bda96"
preview_imgs = ["/examples/basic/preview.png"]
output_files = ["/examples/basic/output.mp4"]