//! Oxide Engine — physics module (`oxide-physics`).
//!
//! Stage 9 adds rigid-body physics — collision, queries, constraints, and a
//! character controller — as a **feature-gated module** built on
//! [`rapier3d`](https://rapier.rs), not a thin wrapper. It plugs into the engine
//! through the Stage-5 module system: add [`PhysicsModule`] to an
//! [`App`](oxide_engine::app::App) and physics components become live.
//!
//! The design keeps the **ECS as the source of truth**: an entity describes its
//! physics with two serializable, reflected components —
//! - [`RigidBody`] — *how* it moves (dynamic / kinematic / static, mass,
//!   damping, gravity scale, CCD), and
//! - [`Collider`] — *what shape* it is, its material, and the [`LayerMask`]
//!   filtering of what it collides with.
//!
//! The rapier simulation world is a transient resource rebuilt from these
//! components, so play-mode snapshot/restore (Stage 8.7) works for free: Stop
//! reverts the authored components and the next Play rebuilds the world fresh.
//!
//! [`LayerMask`]: oxide_engine::layer::LayerMask
//!
//! This first piece lands the component data model and the module wiring; the
//! rapier-backed simulation, scene queries, joints, and the character controller
//! follow in subsequent pieces.

#![deny(warnings)]

mod body;
mod character;
mod collider;
mod module;
mod world;

pub use body::{RigidBody, RigidBodyKind};
pub use character::CharacterController;
pub use collider::{Collider, ColliderShape};
pub use module::{PhysicsModule, PhysicsSettings, DEFAULT_GRAVITY};
pub use world::{CharacterMovement, CollisionEvent, JointId, JointKind, PhysicsWorld, RayHit};
