From 4b4026b0284ce84fb518824c162247d5a7ada076 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 23 Aug 2026 12:01:18 +0300 Subject: [PATCH 1/3] add rigidbody:is_selectable, :set_selectable --- res/modules/internal/stdcomp.lua | 2 ++ src/logic/scripting/lua/libs/lib__rigidbody.cpp | 16 ++++++++++++++++ src/objects/Entities.cpp | 5 +++-- src/objects/Rigidbody.cpp | 3 +++ src/objects/Rigidbody.hpp | 1 + src/physics/Hitbox.hpp | 1 + 6 files changed, 26 insertions(+), 2 deletions(-) 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 {}; From 1e2baf9d5eccd43b024326248c8a8fa29d6968bc Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 23 Aug 2026 12:10:47 +0300 Subject: [PATCH 2/3] update doc/*/entity-properties.md --- doc/en/entity-properties.md | 3 ++- doc/ru/entity-properties.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/en/entity-properties.md b/doc/en/entity-properties.md index b0aee9aea..e25c6d71d 100644 --- a/doc/en/entity-properties.md +++ b/doc/en/entity-properties.md @@ -67,9 +67,10 @@ If true - the entity blocks the placement of a block that intersects with the en Default value: *true*. -### *selectable* +### *selectable* (raycast opacity) If set to `false` the cursor will ignore the entity, passing the ray. +Applies to all uses of raycast without the include_non_selectable flag. ### *sensors* diff --git a/doc/ru/entity-properties.md b/doc/ru/entity-properties.md index 2f5ca3791..71dc6dc88 100644 --- a/doc/ru/entity-properties.md +++ b/doc/ru/entity-properties.md @@ -67,9 +67,10 @@ Значение по-умолчанию: *true*. -### Выделяемость - *selectable* +### Непрозрачность для лучей - *selectable* При значении в `false` курсор будет игнорировать cущность, пропуская луч далее. +Распространяется на все использования raycast без флага include_non_selectable. ### Список сенсоров - *sensors* From b768730067aaa99f07816c1051a72edc001a95df Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 23 Aug 2026 12:14:35 +0300 Subject: [PATCH 3/3] update doc/*/scripting/ecs.md --- doc/en/scripting/ecs.md | 5 +++++ doc/ru/scripting/ecs.md | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/doc/en/scripting/ecs.md b/doc/en/scripting/ecs.md index 9636cf763..f8bce6d3f 100644 --- a/doc/en/scripting/ecs.md +++ b/doc/en/scripting/ecs.md @@ -36,6 +36,11 @@ entity:set_enabled(name: str, enable: bool) -- At components initialization -1 is also returned, -- since the binding occurs after initialization. entity:get_player() -> int or nil + +-- Checks the 'selectable' property of an entity (raycast opacity) +body:is_selectable() -> bool +-- Sets the value of the 'selectable' property of an entity +body:set_selectable(flag: bool) ``` ## Custom Components diff --git a/doc/ru/scripting/ecs.md b/doc/ru/scripting/ecs.md index cb4a79bec..be99774d5 100644 --- a/doc/ru/scripting/ecs.md +++ b/doc/ru/scripting/ecs.md @@ -134,6 +134,11 @@ body:set_elasticity(elasticity: number) -- Возвращает скорость поверхности, на которой находится тело, либо {0,0,0} body:get_ground_vel() -> vec3 + +-- Проверяет свойство 'selectable' у сущности (непрозрачность для лучей) +body:is_selectable() -> bool +-- Устанавливает значение свойство 'selectable' у сущности +body:set_selectable(flag: bool) ``` ### Skeleton