#animation #sketch #back-end #framework #draw #setup #multiple

nightly bin+lib sunburst

简单的处理,如具有多个渲染后端的动画框架

2 个不稳定版本

0.2.0 2022 年 8 月 1 日
0.1.0 2022 年 7 月 31 日

#728 in 图形 API

自定义许可

105KB
911

Sunburst

Sunburst 是一个简单的类似 Processing 框架,用于简单的动画,具有多个后端。

您的动画在包含用户定义的 SketchStateSketch 中运行。 Sketch 允许指定 setupupdatedraw 函数。

洛伦兹吸引子的示例

use sunburst::{
    canvas::{Canvas, IntPoint},
    path::Path,
    renderer::RendererType::SDL2,
    sketch::{Sketch, SketchMetrics},
};

const ORIGIN: isize = 450;
const A: f32 = 10.0;
const B: f32 = 28.0;
const C: f32 = 8.0 / 3.0;
const DT: f32 = 0.01;

struct SketchState {
    x: f32,
    y: f32,
    z: f32,
    path: Path,
}

fn state_create() -> SketchState {
    let mut path = Path::new();
    path.move_to(&IntPoint::new(ORIGIN, ORIGIN));
    SketchState {
        x: 0.5,
        y: 0.05,
        z: 0.3,
        path,
    }
}

fn update(state: &mut SketchState, _: &SketchMetrics) {
    let dx = (A * (state.y - state.x)) * DT;
    let dy = (state.x * (B - state.z) - state.y) * DT;
    let dz = (state.x * state.y - C * state.z) * DT;
    state.x += dx;
    state.y += dy;
    state.z += dz;

    state.path.line_to(&IntPoint::new(
        ORIGIN + (14.0 * state.x) as isize,
        ORIGIN + (14.0 * state.y) as isize,
    ));
}

fn draw(canvas: &mut Canvas, state: &SketchState, _: &SketchMetrics) {
    canvas.clear();
    canvas.draw_path(&state.path);
}

fn main() {
    let sketch = Sketch::new(state_create, 900, 900)
        .renderer(SDL2("Lorenz Attractor"))
        .update(update)
        .draw(draw);
    sketch.run();
}

lorenz-attractor

待办事项

  • 椭圆的正确绘制算法
  • 笔划重量支持
  • 使用用户选择的字体进行通用字体渲染
  • 用于视频创建的 OpenCV 渲染器后端
  • 类似于函数的 noLoop()
  • 贝塞尔曲线
  • 路径关闭
  • 路径填充(多边形填充)
  • 所有原语的通用 lerping
  • 矢量原语
  • HSL 颜色支持
  • 在编译时使用十六进制颜色值
  • 噪声(Perlin、Simplex)
  • 加载和绘制用户图像
  • 反走样绘制
  • 对摄像头支持?

依赖关系

~17MB
~366K SLoC