From bd7f58880063e9cfeb9be0065a94954ec24110e1 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 14 Mar 2026 21:02:02 +0300 Subject: [PATCH] add mass, elasticity getters, setters to entity.rigidbody --- .../scripting/lua/libs/lib__rigidbody.cpp | 32 +++++++++++++++++++ src/objects/Entities.cpp | 4 +-- src/objects/Rigidbody.cpp | 6 ++++ src/objects/Rigidbody.hpp | 2 ++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/logic/scripting/lua/libs/lib__rigidbody.cpp b/src/logic/scripting/lua/libs/lib__rigidbody.cpp index 1e04e3b3c..52234f91e 100644 --- a/src/logic/scripting/lua/libs/lib__rigidbody.cpp +++ b/src/logic/scripting/lua/libs/lib__rigidbody.cpp @@ -164,6 +164,34 @@ static int l_get_material(lua::State* L) { return 0; } +static int l_get_mass(lua::State* L) { + if (auto entity = get_entity(L, 1)) { + return lua::pushnumber(L, entity->getRigidbody().mass); + } + return 0; +} + +static int l_set_mass(lua::State* L) { + if (auto entity = get_entity(L, 1)) { + entity->getRigidbody().mass = lua::tonumber(L, 2); + } + return 0; +} + +static int l_get_elasticity(lua::State* L) { + if (auto entity = get_entity(L, 1)) { + return lua::pushnumber(L, entity->getRigidbody().elasticity); + } + return 0; +} + +static int l_set_elasticity(lua::State* L) { + if (auto entity = get_entity(L, 1)) { + entity->getRigidbody().elasticity = lua::tonumber(L, 2); + } + return 0; +} + const luaL_Reg rigidbodylib[] = { {"is_enabled", lua::wrap}, {"set_enabled", lua::wrap}, @@ -185,5 +213,9 @@ const luaL_Reg rigidbodylib[] = { {"set_body_type", lua::wrap}, {"set_material", lua::wrap}, {"get_material", lua::wrap}, + {"get_mass", lua::wrap}, + {"set_mass", lua::wrap}, + {"get_elasticity", lua::wrap}, + {"set_elasticity", lua::wrap}, {nullptr, nullptr} }; diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index 5d55098c2..82e293522 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -316,9 +316,9 @@ void Entities::preparePhysics(float delta) { continue; } rigidbody.hitbox.mass = eid.def.bodyType == BodyType::DYNAMIC - ? eid.def.mass + ? rigidbody.mass : std::numeric_limits::infinity(); - rigidbody.hitbox.elasticity = eid.def.elasticity; + rigidbody.hitbox.elasticity = rigidbody.elasticity; hitboxes.emplace_back(&rigidbody.hitbox); if (!eid.def.solid) { continue; diff --git a/src/objects/Rigidbody.cpp b/src/objects/Rigidbody.cpp index 9e2edba4a..2c885f8e0 100644 --- a/src/objects/Rigidbody.cpp +++ b/src/objects/Rigidbody.cpp @@ -22,6 +22,8 @@ dv::value Rigidbody::serialize(bool saveVelocity, bool saveBodySettings) const { if (hitbox.crouching) { bodymap["crouch"] = hitbox.crouching; } + bodymap["mass"] = mass; + bodymap["elasticity"] = elasticity; } return bodymap; } @@ -33,6 +35,8 @@ void Rigidbody::deserialize(const dv::value& root) { BodyTypeMeta.getItem(bodyTypeName, hitbox.type); root["crouch"].asBoolean(hitbox.crouching); root["damping"].asNumber(hitbox.linearDamping); + root["mass"].asNumber(mass); + root["elasticity"].asNumber(elasticity); } template @@ -49,6 +53,8 @@ static sensorcallback create_sensor_callback(Entities& entities) { void Rigidbody::initialize( const EntityDef& def, entityid_t id, Entities& entities ) { + mass = def.mass; + elasticity = def.elasticity; sensors.resize(def.radialSensors.size() + def.boxSensors.size()); for (auto& [i, box] : def.boxSensors) { SensorParams params {}; diff --git a/src/objects/Rigidbody.hpp b/src/objects/Rigidbody.hpp index 91790d8a2..bc2a85f90 100644 --- a/src/objects/Rigidbody.hpp +++ b/src/objects/Rigidbody.hpp @@ -13,6 +13,8 @@ struct Rigidbody { bool enabled = true; Hitbox hitbox; std::vector sensors; + float mass; + float elasticity; dv::value serialize(bool saveVelocity, bool saveBodySettings) const; void deserialize(const dv::value& root);