From edf3fbf68f75a2bd3cd30e49797e65a943d1fb94 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Sat, 15 Mar 2025 10:51:59 +0100 Subject: [PATCH] Added script API methods for static mesh collision --- CHANGELOG.md | 3 +- Documentation/doc/1 modules/Effects.html | 2 +- .../doc/2 classes/Objects.Static.html | 51 +++++++++++++++++++ TombEngine/Game/collision/collide_item.cpp | 9 ++++ TombEngine/Game/control/los.cpp | 4 ++ TombEngine/Game/room.h | 5 +- .../Scripting/Internal/ReservedScriptNames.h | 2 + .../TEN/Objects/Static/StaticObject.cpp | 25 +++++++++ .../TEN/Objects/Static/StaticObject.h | 2 + 9 files changed, 99 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 270e4aa5d..4a0b7ac08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,8 @@ TombEngine releases are located in this repository (alongside with Tomb Editor): * Added `Effects.EmitStreamer` function to emit streamers. * Added `Flow.GetTotalSecretCount` function to get total amount of secrets in the game. * Added `View.GetFlyByPosition` and `View.GetFlyByRotation` functions to get flyby sequence parameters at a specified time point. -* Added `Moveable:GetScale` and `Movebale:SetScale` methods to set visible scale of moveables. +* Added `Moveable:GetScale` and `Movebale:SetScale` methods to get or set visible scale of moveables. +* Added `Static:GetCollidable` and `Static:SetCollidable` methods to get or set collision status of static meshes. * Added `Rotation:Lerp` function to allow linear interpolation between rotations. * Added ability to perform additive and subtractive operations on `Rotation` class and compare one `Rotation` to another. * Added various `Translate` methods to `Vec2` and `Vec3` script objects. diff --git a/Documentation/doc/1 modules/Effects.html b/Documentation/doc/1 modules/Effects.html index 24f9a971a..45b15294c 100644 --- a/Documentation/doc/1 modules/Effects.html +++ b/Documentation/doc/1 modules/Effects.html @@ -390,7 +390,7 @@ poison = false, burn = false, damageHit = 80, - sound = 197, + soundID = 197, light = true, lightRadius = 6, lightFlicker = 5, diff --git a/Documentation/doc/2 classes/Objects.Static.html b/Documentation/doc/2 classes/Objects.Static.html index a8009b0a2..5259af90f 100644 --- a/Documentation/doc/2 classes/Objects.Static.html +++ b/Documentation/doc/2 classes/Objects.Static.html @@ -156,6 +156,10 @@ Get this static's visibility status. + Static:GetCollidable() + Get this static's collision status. + + Static:GetSolid() Get this static's solid collision status. @@ -192,6 +196,10 @@ Set this static's solid collision status. + Static:SetCollidable(collidable) + Set this static's collision status. + + Static:Enable() Enable this static. @@ -379,6 +387,27 @@ + +
+ + Static:GetCollidable() +
+
+ Get this static's collision status. + + + + +

Returns:

+
    + + bool + Collision status. true: can be collided with, false: no collision +
+ + + +
@@ -576,6 +605,28 @@ + +
+ + Static:SetCollidable(collidable) +
+
+ Set this static's collision status. + + + +

Parameters:

+ + + + + +
diff --git a/TombEngine/Game/collision/collide_item.cpp b/TombEngine/Game/collision/collide_item.cpp index 1e9dc1ca2..42af317b6 100644 --- a/TombEngine/Game/collision/collide_item.cpp +++ b/TombEngine/Game/collision/collide_item.cpp @@ -946,6 +946,10 @@ void CollideSolidStatics(ItemInfo* item, CollisionInfo* coll) if (!(mesh.flags & StaticMeshFlags::SM_VISIBLE)) continue; + // Bypass static meshes which are marked as non-collidable. + if (!(mesh.flags & StaticMeshFlags::SM_COLLISION)) + continue; + // Only process meshes which are solid, or if solid mode is set by the setup. if (!coll->Setup.ForceSolidStatics && !(mesh.flags & StaticMeshFlags::SM_SOLID)) continue; @@ -1894,9 +1898,14 @@ void DoObjectCollision(ItemInfo* item, CollisionInfo* coll) for (auto& staticObject : neighborRoom.mesh) { + // Check if static is visible. if (!(staticObject.flags & StaticMeshFlags::SM_VISIBLE)) continue; + // Check if static is collidable. + if (!(staticObject.flags & StaticMeshFlags::SM_COLLISION)) + continue; + // For Lara, solid static mesh collisions are directly managed by GetCollisionInfo, // so we bypass them here to avoid interference. if (isPlayer && (staticObject.flags & StaticMeshFlags::SM_SOLID)) diff --git a/TombEngine/Game/control/los.cpp b/TombEngine/Game/control/los.cpp index 861b92bb4..3f1c0b2ab 100644 --- a/TombEngine/Game/control/los.cpp +++ b/TombEngine/Game/control/los.cpp @@ -705,6 +705,10 @@ std::optional GetStaticObjectLos(const Vector3& origin, int roomNumber, if (!(staticObject.flags & StaticMeshFlags::SM_VISIBLE)) continue; + // Check if static is collidable. + if (!(staticObject.flags & StaticMeshFlags::SM_COLLISION)) + continue; + // Check if static is solid (if applicable). if (onlySolid && !(staticObject.flags & StaticMeshFlags::SM_SOLID)) continue; diff --git a/TombEngine/Game/room.h b/TombEngine/Game/room.h index eec49f807..a43e2c428 100644 --- a/TombEngine/Game/room.h +++ b/TombEngine/Game/room.h @@ -37,8 +37,9 @@ enum RoomEnvFlags enum StaticMeshFlags : short { - SM_VISIBLE = 1, - SM_SOLID = 2 + SM_VISIBLE = (1 << 0), + SM_SOLID = (1 << 1), + SM_COLLISION = (1 << 2) }; struct ROOM_VERTEX diff --git a/TombEngine/Scripting/Internal/ReservedScriptNames.h b/TombEngine/Scripting/Internal/ReservedScriptNames.h index c3307b918..c21c3f3e3 100644 --- a/TombEngine/Scripting/Internal/ReservedScriptNames.h +++ b/TombEngine/Scripting/Internal/ReservedScriptNames.h @@ -474,6 +474,7 @@ constexpr char ScriptReserved_StaticGetPosition[] = "GetPosition"; constexpr char ScriptReserved_StaticGetRotation[] = "GetRotation"; constexpr char ScriptReserved_StaticGetScale[] = "GetScale"; constexpr char ScriptReserved_StaticGetSlot[] = "GetSlot"; +constexpr char ScriptReserved_StaticGetCollidable[] = "GetCollidable"; constexpr char ScriptReserved_StaticGetSolid[] = "GetSolid"; constexpr char ScriptReserved_StaticSetColor[] = "SetColor"; constexpr char ScriptReserved_StaticSetHitPoints[] = "SetHP"; @@ -483,6 +484,7 @@ constexpr char ScriptReserved_StaticSetRotation[] = "SetRotation"; constexpr char ScriptReserved_StaticSetScale[] = "SetScale"; constexpr char ScriptReserved_StaticSetSlot[] = "SetSlot"; constexpr char ScriptReserved_StaticSetSolid[] = "SetSolid"; +constexpr char ScriptReserved_StaticSetCollidable[] = "SetCollidable"; constexpr char ScriptReserved_StaticShatter[] = "Shatter"; // ===== diff --git a/TombEngine/Scripting/Internal/TEN/Objects/Static/StaticObject.cpp b/TombEngine/Scripting/Internal/TEN/Objects/Static/StaticObject.cpp index ff42fdbf0..c2fd4ddbb 100644 --- a/TombEngine/Scripting/Internal/TEN/Objects/Static/StaticObject.cpp +++ b/TombEngine/Scripting/Internal/TEN/Objects/Static/StaticObject.cpp @@ -38,6 +38,7 @@ namespace TEN::Scripting ScriptReserved_StaticGetColor, &Static::GetColor, ScriptReserved_StaticGetHP, &Static::GetHitPoints, // TODO: Deprecate. ScriptReserved_StaticGetActive, &Static::GetActiveStatus, // TODO: Deprecate. Rename Lua func to GetActiveStatus. + ScriptReserved_StaticGetCollidable, &Static::GetCollidable, ScriptReserved_StaticGetSolid, &Static::GetSolidStatus, // TODO: Deprecate. Rename Lua func to GetSolidStatus. ScriptReserved_StaticSetName, &Static::SetName, @@ -47,6 +48,7 @@ namespace TEN::Scripting ScriptReserved_StaticSetScale, &Static::SetScale, ScriptReserved_StaticSetColor, &Static::SetColor, ScriptReserved_StaticSetHitPoints, &Static::SetHitPoints, // TODO: Deprecate. Rename Lua func to SetHitPoints. + ScriptReserved_StaticSetCollidable, &Static::SetCollidable, ScriptReserved_StaticSetSolid, &Static::SetSolidStatus, // TODO: Deprecate. Rename Lua func to SetSolidStatus. ScriptReserved_StaticEnable, &Static::Enable, @@ -123,6 +125,14 @@ namespace TEN::Scripting return ((_static.flags & StaticMeshFlags::SM_VISIBLE) != 0); } + /// Get this static's collision status. + // @function Static:GetCollidable + // @treturn bool Collision status. __true: can be collided with__, __false: no collision__ + bool Static::GetCollidable() const + { + return ((_static.flags & StaticMeshFlags::SM_COLLISION) != 0); + } + /// Get this static's solid collision status. // @function Static:GetSolid // @treturn bool Solid Status. __true: solid__, __false: soft__ @@ -219,6 +229,21 @@ namespace TEN::Scripting } } + /// Set this static's collision status. + // @function Static:SetCollidable + // @tparam bool collidable New collision status. __true: can be collided with__, __false: no collision__ + void Static::SetCollidable(bool collidable) + { + if (collidable) + { + _static.flags |= StaticMeshFlags::SM_COLLISION; + } + else + { + _static.flags &= ~StaticMeshFlags::SM_COLLISION; + } + } + /// Enable this static. Used when previously shattered disabled manually. // @function Static:Enable void Static::Enable() diff --git a/TombEngine/Scripting/Internal/TEN/Objects/Static/StaticObject.h b/TombEngine/Scripting/Internal/TEN/Objects/Static/StaticObject.h index 82123db6a..33906b8da 100644 --- a/TombEngine/Scripting/Internal/TEN/Objects/Static/StaticObject.h +++ b/TombEngine/Scripting/Internal/TEN/Objects/Static/StaticObject.h @@ -45,6 +45,7 @@ namespace TEN::Scripting ScriptColor GetColor() const; int GetHitPoints() const; bool GetActiveStatus() const; + bool GetCollidable() const; bool GetSolidStatus() const; // Setters @@ -56,6 +57,7 @@ namespace TEN::Scripting void SetScale(float scale); void SetColor(const ScriptColor& color); void SetHitPoints(int hitPoints); + void SetCollidable(bool status); void SetSolidStatus(bool status); // Utilities