use std::sync::Arc; use std::time::{Duration, Instant}; use cgmath::{Deg, Euler}; use rapier3d::dynamics::{RigidBody, RigidBodyHandle}; use rapier3d::geometry::Collider as r3dCollider; use rapier3d::geometry::ColliderHandle; use wgpu::{BindGroup, Buffer, TextureView}; use crate::runtime::state::{TomlPositionDescription, TomlRotationDescription}; use imgui::Ui; // a component is any type that is 'static, sized, send and sync pub struct ImguiWindow<'a, T> { pub window: fn() -> imgui::Window<'a>, pub func: fn(&Ui, Vec<&T>), } #[derive(Clone, Copy, Debug, PartialEq)] pub struct LoopState { pub delta_time: Duration, pub start_time: Instant, pub step_size: f32, } #[derive(Clone, Copy, Debug, PartialEq)] pub struct Position { pub x: f32, pub y: f32, pub z: f32, pub rot: cgmath::Euler>, } impl Default for Position { fn default() -> Self { Position { x: 0.0, y: 0.0, z: 0.0, rot: Euler { x: Deg(0.0), y: Deg(0.0), z: Deg(0.0), }, } } } impl From for Position { fn from(pos: TomlPositionDescription) -> Self { let euler = match pos.rot { None => Euler { x: Deg(0.0), y: Deg(0.0), z: Deg(0.0), }, Some(v) => Euler { x: Deg(v.x), y: Deg(v.y), z: Deg(v.z), }, }; Position { x: pos.x, y: pos.y, z: pos.z, rot: euler, } } } impl From> for Position { fn from(pos: Option) -> Self { match pos { None => Position { x: 0.0, y: 0.0, z: 0.0, rot: Euler { x: Deg(0.0), y: Deg(0.0), z: Deg(0.0), }, }, Some(v) => Position::from(v), } } } #[derive(Clone, Default, PartialEq, Eq, Hash, Copy, Debug)] pub struct RangeCopy { pub start: Idx, pub end: Idx, } #[derive(Clone, Debug)] pub struct Mesh { pub index_buffer: Arc, pub index_count: usize, pub index_format: wgpu::IndexFormat, pub vertex_buffer: Arc, pub uniform_buffer: Arc, pub bind_group: Arc, pub color: wgpu::Color, } #[derive(Clone, Debug)] pub struct Physics { pub rigid_body: RigidBody, pub rigid_body_handle: Option, } #[derive(Clone)] pub struct Collider { pub collider: r3dCollider, pub collider_handle: Option, }