use crate::constants::huge;
use crate::core::{get_length_units_per_meter, SECRET_COOKIE};
use crate::id::BodyId;
use crate::math_functions::{Transform, Vec2, ROT_IDENTITY, TRANSFORM_IDENTITY, VEC2_ZERO};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct JointDef {
pub user_data: u64,
pub body_id_a: BodyId,
pub body_id_b: BodyId,
pub local_frame_a: Transform,
pub local_frame_b: Transform,
pub force_threshold: f32,
pub torque_threshold: f32,
pub constraint_hertz: f32,
pub constraint_damping_ratio: f32,
pub draw_scale: f32,
pub collide_connected: bool,
}
pub(crate) fn default_joint_def() -> JointDef {
JointDef {
user_data: 0,
body_id_a: BodyId::default(),
body_id_b: BodyId::default(),
local_frame_a: Transform {
q: ROT_IDENTITY,
..TRANSFORM_IDENTITY
},
local_frame_b: Transform {
q: ROT_IDENTITY,
..TRANSFORM_IDENTITY
},
force_threshold: f32::MAX,
torque_threshold: f32::MAX,
constraint_hertz: 60.0,
constraint_damping_ratio: 2.0,
draw_scale: get_length_units_per_meter(),
collide_connected: false,
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct DistanceJointDef {
pub base: JointDef,
pub length: f32,
pub enable_spring: bool,
pub lower_spring_force: f32,
pub upper_spring_force: f32,
pub hertz: f32,
pub damping_ratio: f32,
pub enable_limit: bool,
pub min_length: f32,
pub max_length: f32,
pub enable_motor: bool,
pub max_motor_force: f32,
pub motor_speed: f32,
pub internal_value: i32,
}
pub fn default_distance_joint_def() -> DistanceJointDef {
DistanceJointDef {
base: default_joint_def(),
length: 1.0,
enable_spring: false,
lower_spring_force: -f32::MAX,
upper_spring_force: f32::MAX,
hertz: 0.0,
damping_ratio: 0.0,
enable_limit: false,
min_length: 0.0,
max_length: huge(),
enable_motor: false,
max_motor_force: 0.0,
motor_speed: 0.0,
internal_value: SECRET_COOKIE,
}
}
impl Default for DistanceJointDef {
fn default() -> Self {
default_distance_joint_def()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct MotorJointDef {
pub base: JointDef,
pub linear_velocity: Vec2,
pub max_velocity_force: f32,
pub angular_velocity: f32,
pub max_velocity_torque: f32,
pub linear_hertz: f32,
pub linear_damping_ratio: f32,
pub max_spring_force: f32,
pub angular_hertz: f32,
pub angular_damping_ratio: f32,
pub max_spring_torque: f32,
pub internal_value: i32,
}
pub fn default_motor_joint_def() -> MotorJointDef {
MotorJointDef {
base: default_joint_def(),
linear_velocity: VEC2_ZERO,
max_velocity_force: 0.0,
angular_velocity: 0.0,
max_velocity_torque: 0.0,
linear_hertz: 0.0,
linear_damping_ratio: 0.0,
max_spring_force: 0.0,
angular_hertz: 0.0,
angular_damping_ratio: 0.0,
max_spring_torque: 0.0,
internal_value: SECRET_COOKIE,
}
}
impl Default for MotorJointDef {
fn default() -> Self {
default_motor_joint_def()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct FilterJointDef {
pub base: JointDef,
pub internal_value: i32,
}
pub fn default_filter_joint_def() -> FilterJointDef {
FilterJointDef {
base: default_joint_def(),
internal_value: SECRET_COOKIE,
}
}
impl Default for FilterJointDef {
fn default() -> Self {
default_filter_joint_def()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct PrismaticJointDef {
pub base: JointDef,
pub enable_spring: bool,
pub hertz: f32,
pub damping_ratio: f32,
pub target_translation: f32,
pub enable_limit: bool,
pub lower_translation: f32,
pub upper_translation: f32,
pub enable_motor: bool,
pub max_motor_force: f32,
pub motor_speed: f32,
pub internal_value: i32,
}
pub fn default_prismatic_joint_def() -> PrismaticJointDef {
PrismaticJointDef {
base: default_joint_def(),
enable_spring: false,
hertz: 0.0,
damping_ratio: 0.0,
target_translation: 0.0,
enable_limit: false,
lower_translation: 0.0,
upper_translation: 0.0,
enable_motor: false,
max_motor_force: 0.0,
motor_speed: 0.0,
internal_value: SECRET_COOKIE,
}
}
impl Default for PrismaticJointDef {
fn default() -> Self {
default_prismatic_joint_def()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct RevoluteJointDef {
pub base: JointDef,
pub target_angle: f32,
pub enable_spring: bool,
pub hertz: f32,
pub damping_ratio: f32,
pub enable_limit: bool,
pub lower_angle: f32,
pub upper_angle: f32,
pub enable_motor: bool,
pub max_motor_torque: f32,
pub motor_speed: f32,
pub internal_value: i32,
}
pub fn default_revolute_joint_def() -> RevoluteJointDef {
RevoluteJointDef {
base: default_joint_def(),
target_angle: 0.0,
enable_spring: false,
hertz: 0.0,
damping_ratio: 0.0,
enable_limit: false,
lower_angle: 0.0,
upper_angle: 0.0,
enable_motor: false,
max_motor_torque: 0.0,
motor_speed: 0.0,
internal_value: SECRET_COOKIE,
}
}
impl Default for RevoluteJointDef {
fn default() -> Self {
default_revolute_joint_def()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct WeldJointDef {
pub base: JointDef,
pub linear_hertz: f32,
pub angular_hertz: f32,
pub linear_damping_ratio: f32,
pub angular_damping_ratio: f32,
pub internal_value: i32,
}
pub fn default_weld_joint_def() -> WeldJointDef {
WeldJointDef {
base: default_joint_def(),
linear_hertz: 0.0,
angular_hertz: 0.0,
linear_damping_ratio: 0.0,
angular_damping_ratio: 0.0,
internal_value: SECRET_COOKIE,
}
}
impl Default for WeldJointDef {
fn default() -> Self {
default_weld_joint_def()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct WheelJointDef {
pub base: JointDef,
pub enable_spring: bool,
pub hertz: f32,
pub damping_ratio: f32,
pub enable_limit: bool,
pub lower_translation: f32,
pub upper_translation: f32,
pub enable_motor: bool,
pub max_motor_torque: f32,
pub motor_speed: f32,
pub internal_value: i32,
}
pub fn default_wheel_joint_def() -> WheelJointDef {
WheelJointDef {
base: default_joint_def(),
enable_spring: true,
hertz: 1.0,
damping_ratio: 0.7,
enable_limit: false,
lower_translation: 0.0,
upper_translation: 0.0,
enable_motor: false,
max_motor_torque: 0.0,
motor_speed: 0.0,
internal_value: SECRET_COOKIE,
}
}
impl Default for WheelJointDef {
fn default() -> Self {
default_wheel_joint_def()
}
}