#pragma once #include "Component.hpp" /** * Integrates velocity into transform each frame with a speed cap. */ struct PhysicsComponent : public Component { float vx = 0.0f; float vy = 0.0f; float speedCap = 400.0f; /** * Clamps the provided velocity vector to this component's speed cap. */ void ClampVelocity(float &vxRef, float &vyRef) const; void ClampVelocity(double &vxRef, double &vyRef) const; /** * Integrates a position by velocity over dt. */ static void IntegratePosition(float &xRef, float &yRef, float vxValue, float vyValue, float dt); static void IntegratePosition(double &xRef, double &yRef, double vxValue, double vyValue, double dt); /** * Returns true when the given X position is inside a null zone. */ bool IsInsideNullZone(double xPos) const; /** * Computes summed velocity delta from all gravity sources for a position. * Returns false when no gravity should apply. */ bool ComputeGravityDeltaVelocity(double px, double py, double dt, double &dvx, double &dvy, bool ignoreWellActive = false) const; /** * Performs one projected simulation step using well/null-zone rules, * velocity clamp, and position integration. */ void SimulateStep(double &xRef, double &yRef, double &vxRef, double &vyRef, double dt, bool ignoreWellActive = false) const; void Setup() override; void Update(float dt) override; void Cleanup() override; };