Skip to main content

ranim_core/core_item/
mod.rs

1//! Core items of Ranim.
2//!
3//! [`crate::core_item::CoreItem`]s are the fundamental items of Ranim. All other Items are built upon them.
4//!
5//! Currently, there are three types of [`crate::core_item::CoreItem`]s:
6//! - [`crate::core_item::camera_frame::CameraFrame`]: The camera frame.
7//! - [`crate::core_item::vitem::VItem`]: The vitem primitive.
8//! - [`crate::core_item::mesh_item::MeshItem`]: The mesh primitive.
9use std::any::Any;
10
11use dyn_clone::DynClone;
12
13use crate::{
14    Extract,
15    core_item::{camera_frame::CameraFrame, mesh_item::MeshItem, vitem::VItem},
16};
17
18/// Camera frame
19pub mod camera_frame;
20/// MeshItem
21pub mod mesh_item;
22/// Transformed
23pub mod transformed;
24/// Vitem
25pub mod vitem;
26
27/// The core ranim builtin items
28#[derive(Debug, Clone, PartialEq)]
29pub enum CoreItem {
30    /// [`CameraFrame`]
31    CameraFrame(CameraFrame),
32    /// [`VItem`]
33    VItem(VItem),
34    /// [`MeshItem`]
35    MeshItem(MeshItem),
36}
37
38impl CoreItem {
39    /// Apply a local-to-world transform to this item.
40    ///
41    /// - [`CameraFrame`]: transforms `pos` as a point, re-normalizes `up`/`facing` as vectors.
42    /// - [`VItem`]: left-multiplies its `transform` matrix (points untouched).
43    /// - [`MeshItem`]: left-multiplies its `transform` matrix (vertices untouched).
44    pub fn apply_transform(&mut self, transform: &glam::DAffine3) {
45        match self {
46            CoreItem::CameraFrame(cam) => {
47                cam.pos = transform.transform_point3(cam.pos);
48                cam.up = transform.transform_vector3(cam.up).normalize();
49                cam.facing = transform.transform_vector3(cam.facing).normalize();
50            }
51            CoreItem::VItem(item) => {
52                item.transform = glam::DMat4::from(*transform).as_mat4() * item.transform;
53            }
54            CoreItem::MeshItem(item) => {
55                item.transform = glam::DMat4::from(*transform).as_mat4() * item.transform;
56            }
57        }
58    }
59}
60
61/// The item that can be extracted to [`CoreItem`]s
62pub trait AnyExtractCoreItem: Any + Extract<Target = CoreItem> + DynClone {}
63impl<T: Extract<Target = CoreItem> + Any + DynClone> AnyExtractCoreItem for T {}
64
65dyn_clone::clone_trait_object!(AnyExtractCoreItem);
66
67/// A dynamic item, basically type erased [`AnyExtractCoreItem`]
68#[derive(Clone)]
69pub struct DynItem(pub Box<dyn AnyExtractCoreItem>);
70
71impl Extract for DynItem {
72    type Target = CoreItem;
73    fn extract_into(&self, buf: &mut Vec<Self::Target>) {
74        self.0.extract_into(buf);
75    }
76}