From 7d09a7957c2b778c5d7a5d989ca7510d13c58a31 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 6 Mar 2026 19:47:43 +0300 Subject: [PATCH] fix division by zero in some cases --- src/objects/Entities.cpp | 26 +++++++++++++++++--------- src/physics/PhysicsSolver.cpp | 9 +++++++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index 6750116df..17b5acd83 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -1,28 +1,29 @@ #define VC_ENABLE_REFLECTION #include "Entities.hpp" -#include -#include -#include - #include "assets/Assets.hpp" #include "content/Content.hpp" #include "data/dv_util.hpp" #include "debug/Logger.hpp" #include "engine/Engine.hpp" +#include "Entity.hpp" +#include "EntityDef.hpp" +#include "graphics/commons/Model.hpp" #include "graphics/core/DrawContext.hpp" #include "graphics/core/LineBatch.hpp" -#include "graphics/commons/Model.hpp" #include "graphics/render/ModelBatch.hpp" #include "logic/scripting/scripting.hpp" #include "maths/FrustumCulling.hpp" #include "maths/rays.hpp" -#include "EntityDef.hpp" -#include "Entity.hpp" -#include "rigging.hpp" +#include "maths/util.hpp" #include "physics/PhysicsSolver.hpp" +#include "rigging.hpp" #include "world/Level.hpp" +#include +#include +#include + static debug::Logger logger("entities"); Entities::Entities(Level& level) @@ -336,7 +337,14 @@ void Entities::updatePhysics(float delta) { ? 8.0f : (!grounded ? 2.0f : 10.0f); hitbox.scale = transform.size; - transform.setPos(hitbox.position); + if (util::is_nan_or_inf(hitbox.position)) { + logger.error() + << "something bad happened in physics engine (entity " + << eid.def.name << "#" << eid.uid << ")"; + hitbox.position = transform.pos; + } else { + transform.setPos(hitbox.position); + } if (hitbox.grounded && !grounded) { scripting::on_entity_grounded( *get(eid.uid), glm::length(prevVel - hitbox.velocity) diff --git a/src/physics/PhysicsSolver.cpp b/src/physics/PhysicsSolver.cpp index bf78f860a..f9e4b6e23 100644 --- a/src/physics/PhysicsSolver.cpp +++ b/src/physics/PhysicsSolver.cpp @@ -140,8 +140,10 @@ static bool calc_collision_neg_y( if (pos.y < newy && glm::abs(pos.y - newy) < 0.5f) { pos.y = newy; } - hitbox.groundVelocity = - (box->position - box->prevPosition) / box->delta; + if (glm::abs(box->delta) > 1e-5f) { + hitbox.groundVelocity = + (box->position - box->prevPosition) / box->delta; + } if (vel.y < 0.0f) { vel.y = 0.0f; if (hitbox.groundMaterial.empty()) { @@ -300,6 +302,9 @@ void PhysicsSolver::calcSubstep( ) { if (hitbox.grounded) { pos.x += hitbox.groundVelocity.x * dt * substeps; + if (hitbox.groundVelocity.y < 0.0f) { + pos.y += hitbox.groundVelocity.y * dt * substeps; + } pos.z += hitbox.groundVelocity.z * dt * substeps; }