gizmo-physics-core 0.8.0

A custom ECS and physics engine aimed for realistic simulations.
Documentation
use gizmo_math::Vec3;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CharacterController {
    pub speed: f32,
    pub jump_speed: f32,
    pub gravity: f32,
    pub max_slope_angle: f32, // in radians
    pub slope_slide_speed: f32,
    pub step_height: f32,

    #[serde(skip)]
    pub is_grounded: bool,

    pub target_velocity: Vec3, // Desired movement from input

    pub coyote_time: f32,
    #[serde(skip)]
    pub coyote_timer: f32,

    pub jump_buffer_time: f32,
    #[serde(skip)]
    pub jump_buffer_timer: f32,

    // ── Su / yüzme ──────────────────────────────────────────
    /// Batıkken yukarı net kaldırma ivmesi (m/s²). 0 = nötr yüzerlik, >0 yüzeye çıkar; drag ile
    /// terminal yükseliş hızına oturur.
    pub buoyancy: f32,
    /// Sudaki lineer sürüklenme katsayısı (her adım `vel *= 1 - water_drag*dt`). Suyu ağdalı yapar.
    pub water_drag: f32,
    /// Yüzme itişinin `target_velocity`'ye ne hızla yaklaştığı (su tepkiselliği).
    pub swim_acceleration: f32,
    /// Runtime: karakter şu an bir su hacminde mi (yüzme modu aktif). Serileştirilmez.
    #[serde(skip)]
    pub is_submerged: bool,
}

impl Default for CharacterController {
    fn default() -> Self {
        Self {
            speed: 5.0,
            jump_speed: 5.0,
            gravity: 9.81,
            max_slope_angle: 45.0_f32.to_radians(),
            slope_slide_speed: 10.0,
            step_height: 0.3,
            is_grounded: false,
            target_velocity: Vec3::ZERO,
            coyote_time: 0.1,
            coyote_timer: 0.0,
            jump_buffer_time: 0.1,
            jump_buffer_timer: 0.0,
            buoyancy: 2.0,
            water_drag: 2.0,
            swim_acceleration: 8.0,
            is_submerged: false,
        }
    }
}

gizmo_core::impl_component!(CharacterController);