#[cfg(feature = "schema")]
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::features::{FinitePoint3, FiniteVector3};
use crate::ids::{
ArticulationId, BodyId, ColliderId, MassPropertiesId, OccurrenceId, PhysicalMaterialId,
PhysicsSceneId, ProductDefinitionId, RigidBodyId,
};
use crate::scalar::{NonNegativeReal, PositiveReal};
use crate::transform::Transform;
use crate::units::UnitVector3;
pub mod solver;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum PhysicsTarget {
Body {
body: BodyId,
},
Occurrence {
occurrence: OccurrenceId,
},
Definition {
definition: ProductDefinitionId,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct PhysicalMaterial {
pub id: PhysicalMaterialId,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_name"
)]
pub name: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_density"
)]
pub density: Option<PositiveReal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_static_friction"
)]
pub static_friction: Option<NonNegativeReal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_dynamic_friction"
)]
pub dynamic_friction: Option<NonNegativeReal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_restitution"
)]
pub restitution: Option<NonNegativeReal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_native_ref"
)]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct PrincipalInertia {
pub moments: [NonNegativeReal; 3],
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_axes"
)]
pub axes: Option<Transform>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct MassProperties {
pub id: MassPropertiesId,
pub target: PhysicsTarget,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_mass"
)]
pub mass: Option<PositiveReal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_density"
)]
pub density: Option<PositiveReal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_center_of_mass"
)]
pub center_of_mass: Option<FinitePoint3>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_inertia"
)]
pub inertia: Option<PrincipalInertia>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_material"
)]
pub material: Option<PhysicalMaterialId>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_native_ref"
)]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct RigidBody {
pub id: RigidBodyId,
pub target: PhysicsTarget,
pub kinematic: bool,
pub enabled: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_linear_velocity"
)]
pub linear_velocity: Option<FiniteVector3>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_angular_velocity"
)]
pub angular_velocity: Option<FiniteVector3>,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub starts_asleep: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_native_ref"
)]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum ColliderShape {
Exact {},
ConvexHull {},
ConvexDecomposition {},
BoundingBox {},
BoundingSphere {},
Simplified {},
Native {
name: String,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct Collider {
pub id: ColliderId,
pub target: PhysicsTarget,
pub shape: ColliderShape,
pub enabled: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_material"
)]
pub material: Option<PhysicalMaterialId>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_native_ref"
)]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct Articulation {
pub id: ArticulationId,
pub root: PhysicsTarget,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_native_ref"
)]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct PhysicsScene {
pub id: PhysicsSceneId,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_name"
)]
pub name: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_gravity_direction"
)]
pub gravity_direction: Option<UnitVector3>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_gravity_magnitude"
)]
pub gravity_magnitude: Option<NonNegativeReal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "deserialize_native_ref"
)]
pub native_ref: Option<String>,
}
mod identity_rewrite;
#[cfg(test)]
mod tests;
cadmpeg_core::named_optional_field!(deserialize_name, String, "name");
cadmpeg_core::named_optional_field!(deserialize_density, PositiveReal, "density");
cadmpeg_core::named_optional_field!(
deserialize_static_friction,
NonNegativeReal,
"static_friction"
);
cadmpeg_core::named_optional_field!(
deserialize_dynamic_friction,
NonNegativeReal,
"dynamic_friction"
);
cadmpeg_core::named_optional_field!(deserialize_restitution, NonNegativeReal, "restitution");
cadmpeg_core::named_optional_field!(deserialize_native_ref, String, "native_ref");
cadmpeg_core::named_optional_field!(deserialize_axes, Transform, "axes");
cadmpeg_core::named_optional_field!(deserialize_mass, PositiveReal, "mass");
cadmpeg_core::named_optional_field!(deserialize_center_of_mass, FinitePoint3, "center_of_mass");
cadmpeg_core::named_optional_field!(deserialize_inertia, PrincipalInertia, "inertia");
cadmpeg_core::named_optional_field!(deserialize_material, PhysicalMaterialId, "material");
cadmpeg_core::named_optional_field!(
deserialize_linear_velocity,
FiniteVector3,
"linear_velocity"
);
cadmpeg_core::named_optional_field!(
deserialize_angular_velocity,
FiniteVector3,
"angular_velocity"
);
cadmpeg_core::named_optional_field!(
deserialize_gravity_direction,
UnitVector3,
"gravity_direction"
);
cadmpeg_core::named_optional_field!(
deserialize_gravity_magnitude,
NonNegativeReal,
"gravity_magnitude"
);