pub struct CollisionConfig { /* private fields */ }Expand description
The game’s collision tunables, all in the caller’s world units.
There is deliberately no Default: skin and snap_distance are lengths
in the game’s own units and up is the game’s axis convention, so a default
would silently bake one game’s world into every other.
Construct it with Self::new, which validates lengths and thresholds and
normalizes up. Read-only accessors preserve these invariants.
A struct literal cannot bypass validation:
use sgl_core::{collision::CollisionConfig, math::Vec2};
let config = CollisionConfig {
up: Vec2::new(0.0, 2.0),
skin: -1.0,
snap_distance: 0.1,
normal_threshold: 0.7,
block_epsilon: 0.0,
};Implementations§
Source§impl CollisionConfig
impl CollisionConfig
Sourcepub fn new(
up: Vec2,
skin: f32,
snap_distance: f32,
normal_threshold: f32,
block_epsilon: f32,
) -> Self
pub fn new( up: Vec2, skin: f32, snap_distance: f32, normal_threshold: f32, block_epsilon: f32, ) -> Self
Builds a config, normalizing up.
§Panics
If up is not a usable direction, including an overflowing length;
if normal_threshold is outside
(0, 1) — outside that range every face classifies the same way and
floors, ceilings, and walls stop being distinguishable; or if skin,
snap_distance or block_epsilon is negative or not finite — a
negative skin backs a contact off into the surface. All are
authoring errors.
Sourcepub fn up(&self) -> Vec2
pub fn up(&self) -> Vec2
Unit vector naming the world’s up axis. Vec2::Y for a y-up world,
Vec2::NEG_Y for a y-down one. Every floor, ceiling, one-way, and
ground-snap decision is made against this axis and nothing else.
Sourcepub fn skin(&self) -> f32
pub fn skin(&self) -> f32
Gap left between the body and a surface after a contact resolves, so the next frame’s sweep starts clear of the surface instead of touching it. Small relative to the body. Finite and non-negative.
Sourcepub fn snap_distance(&self) -> f32
pub fn snap_distance(&self) -> f32
How far snap_to_ground probes along -up. Finite and
non-negative.
Sourcepub fn normal_threshold(&self) -> f32
pub fn normal_threshold(&self) -> f32
normal · up above which a face counts as a floor, and below whose
negation it counts as a ceiling. 0.7 is roughly 45 degrees.
Sourcepub fn block_epsilon(&self) -> f32
pub fn block_epsilon(&self) -> f32
Tolerance when comparing requested against achieved motion along up
for the blocked flags. Must be well under skin, or a resolved contact
reads as unblocked. Finite and non-negative.
Sourcepub fn is_floor(&self, normal: Vec2) -> bool
pub fn is_floor(&self, normal: Vec2) -> bool
Whether normal belongs to a face the body can stand on.
Sourcepub fn is_ceiling(&self, normal: Vec2) -> bool
pub fn is_ceiling(&self, normal: Vec2) -> bool
Whether normal belongs to a face the body can bump its head on.