ranim_core/core_item/
mod.rs1use 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
18pub mod camera_frame;
20pub mod mesh_item;
22pub mod transformed;
24pub mod vitem;
26
27#[derive(Debug, Clone, PartialEq)]
29pub enum CoreItem {
30 CameraFrame(CameraFrame),
32 VItem(VItem),
34 MeshItem(MeshItem),
36}
37
38impl CoreItem {
39 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
61pub 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#[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}