use ranim_core::{RanimScene, SealedRanimScene};
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;
#[doc(hidden)]
#[derive(Clone)]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
pub struct Scene {
#[cfg_attr(target_arch = "wasm32", wasm_bindgen(skip))]
pub name: String,
#[cfg_attr(target_arch = "wasm32", wasm_bindgen(skip))]
pub constructor: fn(&mut RanimScene),
#[cfg_attr(target_arch = "wasm32", wasm_bindgen(skip))]
pub config: SceneConfig,
#[cfg_attr(target_arch = "wasm32", wasm_bindgen(skip))]
pub outputs: Vec<Output>,
}
#[derive(Debug, Clone)]
pub struct SceneConfig {
pub clear_color: String,
}
impl Default for SceneConfig {
fn default() -> Self {
Self {
clear_color: "#333333ff".to_string(),
}
}
}
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
pub enum OutputFormat {
#[default]
Mp4,
Webm,
Mov,
Gif,
}
impl std::fmt::Display for OutputFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Mp4 => write!(f, "mp4"),
Self::Webm => write!(f, "webm"),
Self::Mov => write!(f, "mov"),
Self::Gif => write!(f, "gif"),
}
}
}
#[derive(Debug, Clone)]
pub struct Output {
pub width: u32,
pub height: u32,
pub fps: u32,
pub save_frames: bool,
pub name: Option<String>,
pub dir: String,
pub format: OutputFormat,
}
impl Default for Output {
fn default() -> Self {
Self {
width: 1920,
height: 1080,
fps: 60,
save_frames: false,
name: None,
dir: "./output".to_string(),
format: OutputFormat::default(),
}
}
}
pub trait SceneConstructor: Send + Sync {
fn construct(&self, r: &mut RanimScene);
fn build_scene(&self) -> SealedRanimScene {
let mut scene = RanimScene::new();
self.construct(&mut scene);
scene.seal()
}
}
impl<F: Fn(&mut RanimScene) + Send + Sync> SceneConstructor for F {
fn construct(&self, r: &mut RanimScene) {
self(r);
}
}