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:
+
+ - collidable
+ bool
+ New collision status. true: can be collided with, false: no collision
+
+
+
+
+
+
+
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