diff --git a/src/content/loading/EntityLoader.cpp b/src/content/loading/EntityLoader.cpp index b8dfa9f4e..91967ea89 100644 --- a/src/content/loading/EntityLoader.cpp +++ b/src/content/loading/EntityLoader.cpp @@ -89,5 +89,7 @@ template<> void ContentUnitLoader::loadUnit( root.at("skeleton-name").get(def.skeletonName); root.at("blocking").get(def.blocking); root.at("solid").get(def.solid); + root.at("mass").get(def.mass); + root.at("elasticity").get(def.elasticity); root.at("step-height").get(def.stepHeight); } diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index e445b738a..bc9c0860d 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -22,6 +22,7 @@ #include #include +#include #include static debug::Logger logger("entities"); @@ -318,6 +319,9 @@ void Entities::preparePhysics(float delta) { if (!eid.def.solid) { continue; } + rigidbody.hitbox.mass = eid.def.bodyType == BodyType::DYNAMIC + ? eid.def.mass + : std::numeric_limits::infinity(); solidHitboxes.emplace_back(&rigidbody.hitbox); } } diff --git a/src/objects/EntityDef.cpp b/src/objects/EntityDef.cpp index cab635584..ae1f87c68 100644 --- a/src/objects/EntityDef.cpp +++ b/src/objects/EntityDef.cpp @@ -10,6 +10,8 @@ void EntityDef::cloneTo(EntityDef& dst) { dst.skeletonName = skeletonName; dst.blocking = blocking; dst.solid = solid; + dst.mass = mass; + dst.elasticity = elasticity; dst.stepHeight = stepHeight; dst.save = save; } diff --git a/src/objects/EntityDef.hpp b/src/objects/EntityDef.hpp index ad93d445e..195d07a17 100644 --- a/src/objects/EntityDef.hpp +++ b/src/objects/EntityDef.hpp @@ -45,6 +45,12 @@ struct EntityDef { /// @brief Is the entity solid (blocks other entities) bool solid = false; + /// @brief Mass for physics calculations + float mass = 1.0f; + + /// @brief Elasticity for physics calculations + float elasticity = 0.0f; + /// @brief Max obstacle height that does not require jumping float stepHeight = 0.5f; diff --git a/src/physics/PhysicsSolver.cpp b/src/physics/PhysicsSolver.cpp index c680d3f5b..65a2191d2 100644 --- a/src/physics/PhysicsSolver.cpp +++ b/src/physics/PhysicsSolver.cpp @@ -26,6 +26,12 @@ static glm::vec3 calc_collsion_velocity_result( ) { const auto& vA = a.velocity; const auto& vB = b.velocity; + if (glm::isinf(a.mass)) { + return vA; + } + if (glm::isinf(b.mass)) { + return vA * -a.elasticity + vB; + } const auto& mA = a.mass; const auto& mB = b.mass; return (mA * vA + mB * vB + a.elasticity * mB * (vB - vA)) / (mA + mB);