diff --git a/res/modules/internal/stdcomp.lua b/res/modules/internal/stdcomp.lua index dbf7f9776..ac11692ca 100644 --- a/res/modules/internal/stdcomp.lua +++ b/res/modules/internal/stdcomp.lua @@ -39,6 +39,8 @@ local Rigidbody = {__index={ set_mass=function(self, v) return __rigidbody.set_mass(self.eid, v) end, set_elasticity=function(self, v) return __rigidbody.set_elasticity(self.eid, v) end, get_ground_vel=function(self) return __rigidbody.get_ground_vel(self.eid) end, + is_selectable=function (self) return __rigidbody.is_selectable(self.eid) end, + set_selectable=function (self, b) return __rigidbody.set_selectable(self.eid, b) end, }} local function new_Rigidbody(eid) diff --git a/src/logic/scripting/lua/libs/lib__rigidbody.cpp b/src/logic/scripting/lua/libs/lib__rigidbody.cpp index a36f2b080..5a65b1b53 100644 --- a/src/logic/scripting/lua/libs/lib__rigidbody.cpp +++ b/src/logic/scripting/lua/libs/lib__rigidbody.cpp @@ -199,6 +199,20 @@ static int l_get_ground_vel(lua::State* L) { return 0; } +static int l_is_selectable(lua::State* L) { + if (auto entity = get_entity(L, 1)) { + return lua::pushboolean(L, entity->getRigidbody().hitbox.selectable); + } + return 0; +} + +static int l_set_selectable(lua::State* L) { + if (auto entity = get_entity(L, 1)) { + entity->getRigidbody().selectable = lua::toboolean(L, 2); + } + return 0; +} + const luaL_Reg rigidbodylib[] = { {"is_enabled", lua::wrap}, @@ -226,5 +240,7 @@ const luaL_Reg rigidbodylib[] = { {"get_elasticity", lua::wrap}, {"set_elasticity", lua::wrap}, {"get_ground_vel", lua::wrap}, + {"is_selectable", lua::wrap}, + {"set_selectable", lua::wrap}, {nullptr, nullptr} }; diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index 70376e5fe..848b9d296 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -175,9 +175,10 @@ std::optional Entities::rayCast( glm::ivec3 foundNormal; for (auto [entity, eid, transform, body] : view.each()) { + const auto& hitbox = body.hitbox; if (eid.uid == settings.ignoredUid || !body.enabled || (settings.solidEntitiesOnly && !eid.def.solid) || - (!eid.def.selectable && !settings.includeNonSelectable)) { + (!hitbox.selectable && !settings.includeNonSelectable)) { continue; } if (settings.entitiesFilter) { @@ -187,7 +188,6 @@ std::optional Entities::rayCast( continue; } } - const auto& hitbox = body.hitbox; glm::ivec3 normal; double distance; if (ray.intersectAABB( @@ -330,6 +330,7 @@ void Entities::preparePhysics(float delta) { ? rigidbody.mass : std::numeric_limits::infinity(); rigidbody.hitbox.elasticity = rigidbody.elasticity; + rigidbody.hitbox.selectable = rigidbody.selectable; hitboxes.emplace_back(&rigidbody.hitbox); if (!eid.def.solid) { continue; diff --git a/src/objects/Rigidbody.cpp b/src/objects/Rigidbody.cpp index 2426aabac..337bb9f67 100644 --- a/src/objects/Rigidbody.cpp +++ b/src/objects/Rigidbody.cpp @@ -24,6 +24,7 @@ dv::value Rigidbody::serialize(bool saveVelocity, bool saveBodySettings) const { } bodymap["mass"] = mass; bodymap["elasticity"] = elasticity; + bodymap["selectable"] = selectable; } return bodymap; } @@ -37,6 +38,7 @@ void Rigidbody::deserialize(const dv::value& root) { root["damping"].asNumber(hitbox.linearDamping); root["mass"].asNumber(mass); root["elasticity"].asNumber(elasticity); + root["selectable"].asBoolean(selectable); } template @@ -55,6 +57,7 @@ void Rigidbody::initialize( ) { mass = def.mass; elasticity = def.elasticity; + selectable = def.selectable; 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 bc2a85f90..fb96f138f 100644 --- a/src/objects/Rigidbody.hpp +++ b/src/objects/Rigidbody.hpp @@ -15,6 +15,7 @@ struct Rigidbody { std::vector sensors; float mass; float elasticity; + bool selectable; dv::value serialize(bool saveVelocity, bool saveBodySettings) const; void deserialize(const dv::value& root); diff --git a/src/physics/Hitbox.hpp b/src/physics/Hitbox.hpp index 80c628491..91cabb2b3 100644 --- a/src/physics/Hitbox.hpp +++ b/src/physics/Hitbox.hpp @@ -65,6 +65,7 @@ struct Hitbox { float stepHeight = 0.5f; float mass = 1.0f; float elasticity = 0.0f; + bool selectable = true; std::string material; std::string groundMaterial; glm::vec3 groundVelocity {};