ranim_core/core_item/
mod.rs

1//! Core items of Ranim.
2//!
3//! [`CoreItem`]s are the fundamental items of Ranim. All other Items are built upon them.
4//!
5//! Currently, there are two types of [`CoreItem`]s:
6//! - [`CameraFrame`]: The camera frame.
7//! - [`VItem`]: The vitem primitive.
8use std::any::Any;
9
10use dyn_clone::DynClone;
11
12use crate::{
13    Extract,
14    core_item::{camera_frame::CameraFrame, mesh_item::MeshItem, vitem::VItem},
15};
16
17/// Camera frame
18pub mod camera_frame;
19/// MeshItem
20pub mod mesh_item;
21/// Vitem
22pub mod vitem;
23
24/// The core ranim builtin items
25#[derive(Debug, Clone, PartialEq)]
26pub enum CoreItem {
27    /// [`CameraFrame`]
28    CameraFrame(CameraFrame),
29    /// [`VItem`]
30    VItem(VItem),
31    /// [`MeshItem`]
32    MeshItem(MeshItem),
33}
34
35/// The item that can be extracted to [`CoreItem`]s
36pub trait AnyExtractCoreItem: Any + Extract<Target = CoreItem> + DynClone {}
37impl<T: Extract<Target = CoreItem> + Any + DynClone> AnyExtractCoreItem for T {}
38
39dyn_clone::clone_trait_object!(AnyExtractCoreItem);
40
41/// A dynamic item, basically type erased [`AnyExtractCoreItem`]
42#[derive(Clone)]
43pub struct DynItem(pub Box<dyn AnyExtractCoreItem>);
44
45impl Extract for DynItem {
46    type Target = CoreItem;
47    fn extract_into(&self, buf: &mut Vec<Self::Target>) {
48        self.0.extract_into(buf);
49    }
50}