use crate::core::NULL_INDEX;
use crate::math_functions::{
Matrix3, Pos, Quat, Vec3, WorldTransform, MAT3_ZERO, POS_ZERO, QUAT_IDENTITY, VEC3_ZERO,
WORLD_TRANSFORM_IDENTITY,
};
use crate::types::BodyType;
pub mod body_flags {
pub const LOCK_LINEAR_X: u32 = 0x0000_0001;
pub const LOCK_LINEAR_Y: u32 = 0x0000_0002;
pub const LOCK_LINEAR_Z: u32 = 0x0000_0004;
pub const LOCK_ANGULAR_X: u32 = 0x0000_0008;
pub const LOCK_ANGULAR_Y: u32 = 0x0000_0010;
pub const LOCK_ANGULAR_Z: u32 = 0x0000_0020;
pub const IS_FAST: u32 = 0x0000_0040;
pub const IS_BULLET: u32 = 0x0000_0080;
pub const IS_SPEED_CAPPED: u32 = 0x0000_0100;
pub const HAD_TIME_OF_IMPACT: u32 = 0x0000_0200;
pub const ALLOW_FAST_ROTATION: u32 = 0x0000_0400;
pub const ENLARGE_BOUNDS: u32 = 0x0000_0800;
pub const DYNAMIC_FLAG: u32 = 0x0000_1000;
pub const ENABLE_SLEEP: u32 = 0x0000_2000;
pub const BODY_ENABLE_CONTACT_RECYCLING: u32 = 0x0000_4000;
pub const DIRTY_MASS: u32 = 0x0000_8000;
pub const ALL_LOCKS: u32 = LOCK_LINEAR_X
| LOCK_LINEAR_Y
| LOCK_LINEAR_Z
| LOCK_ANGULAR_X
| LOCK_ANGULAR_Y
| LOCK_ANGULAR_Z;
pub const FIXED_ROTATION: u32 = LOCK_ANGULAR_X | LOCK_ANGULAR_Y | LOCK_ANGULAR_Z;
pub const BODY_TRANSIENT_FLAGS: u32 = IS_FAST | IS_SPEED_CAPPED | HAD_TIME_OF_IMPACT;
}
#[derive(Debug, Clone)]
pub struct Body {
pub user_data: u64,
pub set_index: i32,
pub local_index: i32,
pub head_contact_key: i32,
pub contact_count: i32,
pub head_shape_id: i32,
pub shape_count: i32,
pub head_chain_id: i32,
pub head_joint_key: i32,
pub joint_count: i32,
pub island_id: i32,
pub island_index: i32,
pub sleep_threshold: f32,
pub sleep_time: f32,
pub sleep_velocity: f32,
pub mass: f32,
pub inertia: Matrix3,
pub body_move_index: i32,
pub id: i32,
pub flags: u32,
pub name_id: u32,
pub type_: BodyType,
pub generation: u16,
}
impl Default for Body {
fn default() -> Self {
Body {
user_data: 0,
set_index: NULL_INDEX,
local_index: NULL_INDEX,
head_contact_key: NULL_INDEX,
contact_count: 0,
head_shape_id: NULL_INDEX,
shape_count: 0,
head_chain_id: NULL_INDEX,
head_joint_key: NULL_INDEX,
joint_count: 0,
island_id: NULL_INDEX,
island_index: NULL_INDEX,
sleep_threshold: 0.0,
sleep_time: 0.0,
sleep_velocity: 0.0,
mass: 0.0,
inertia: MAT3_ZERO,
body_move_index: NULL_INDEX,
id: NULL_INDEX,
flags: 0,
name_id: 0,
type_: BodyType::Static,
generation: 0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct BodyState {
pub linear_velocity: Vec3,
pub angular_velocity: Vec3,
pub delta_position: Vec3,
pub delta_rotation: Quat,
pub flags: u32,
}
pub const IDENTITY_BODY_STATE: BodyState = BodyState {
linear_velocity: VEC3_ZERO,
angular_velocity: VEC3_ZERO,
delta_position: VEC3_ZERO,
delta_rotation: QUAT_IDENTITY,
flags: 0,
};
impl Default for BodyState {
fn default() -> Self {
IDENTITY_BODY_STATE
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct BodySim {
pub transform: WorldTransform,
pub center: Pos,
pub rotation0: Quat,
pub center0: Pos,
pub local_center: Vec3,
pub force: Vec3,
pub torque: Vec3,
pub inv_mass: f32,
pub inv_inertia_local: Matrix3,
pub inv_inertia_world: Matrix3,
pub min_extent: f32,
pub max_extent: Vec3,
pub max_angular_velocity: f32,
pub linear_damping: f32,
pub angular_damping: f32,
pub gravity_scale: f32,
pub body_id: i32,
pub flags: u32,
}
impl Default for BodySim {
fn default() -> Self {
BodySim {
transform: WORLD_TRANSFORM_IDENTITY,
center: POS_ZERO,
rotation0: QUAT_IDENTITY,
center0: POS_ZERO,
local_center: VEC3_ZERO,
force: VEC3_ZERO,
torque: VEC3_ZERO,
inv_mass: 0.0,
inv_inertia_local: MAT3_ZERO,
inv_inertia_world: MAT3_ZERO,
min_extent: 0.0,
max_extent: VEC3_ZERO,
max_angular_velocity: 0.0,
linear_damping: 0.0,
angular_damping: 0.0,
gravity_scale: 1.0,
body_id: NULL_INDEX,
flags: 0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct BodyPlaneResult {
pub shape_id: crate::id::ShapeId,
pub result: crate::geometry::PlaneResult,
}
impl Default for BodyPlaneResult {
fn default() -> Self {
BodyPlaneResult {
shape_id: crate::id::NULL_SHAPE_ID,
result: crate::geometry::PlaneResult::default(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct BodyCastResult {
pub shape_id: crate::id::ShapeId,
pub point: crate::math_functions::Pos,
pub normal: crate::math_functions::Vec3,
pub fraction: f32,
pub triangle_index: i32,
pub user_material_id: u64,
pub iterations: i32,
pub hit: bool,
}
impl Default for BodyCastResult {
fn default() -> Self {
BodyCastResult {
shape_id: crate::id::NULL_SHAPE_ID,
point: crate::math_functions::POS_ZERO,
normal: crate::math_functions::VEC3_ZERO,
fraction: 0.0,
triangle_index: 0,
user_material_id: 0,
iterations: 0,
hit: false,
}
}
}