Added script API methods for static mesh collision

This commit is contained in:
Lwmte 2025-03-15 10:51:59 +01:00
parent f2d7044dfb
commit edf3fbf68f
9 changed files with 99 additions and 4 deletions

View file

@ -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.

View file

@ -390,7 +390,7 @@
poison = <span class="keyword">false</span>,
burn = <span class="keyword">false</span>,
damageHit = <span class="number">80</span>,
sound = <span class="number">197</span>,
soundID = <span class="number">197</span>,
light = <span class="keyword">true</span>,
lightRadius = <span class="number">6</span>,
lightFlicker = <span class="number">5</span>,

View file

@ -156,6 +156,10 @@
<td class="summary">Get this static's visibility status.</td>
</tr>
<tr>
<td class="name" ><a href="#Static:GetCollidable">Static:GetCollidable()</a></td>
<td class="summary">Get this static's collision status.</td>
</tr>
<tr>
<td class="name" ><a href="#Static:GetSolid">Static:GetSolid()</a></td>
<td class="summary">Get this static's solid collision status.</td>
</tr>
@ -192,6 +196,10 @@
<td class="summary">Set this static's solid collision status.</td>
</tr>
<tr>
<td class="name" ><a href="#Static:SetCollidable">Static:SetCollidable(collidable)</a></td>
<td class="summary">Set this static's collision status.</td>
</tr>
<tr>
<td class="name" ><a href="#Static:Enable">Static:Enable()</a></td>
<td class="summary">Enable this static.</td>
</tr>
@ -379,6 +387,27 @@
</dd>
<dt>
<a name = "Static:GetCollidable"></a>
<strong>Static:GetCollidable()</strong>
</dt>
<dd>
Get this static's collision status.
<h3>Returns:</h3>
<ol>
<span class="types"><span class="type">bool</span></span>
Collision status. <strong>true: can be collided with</strong>, <strong>false: no collision</strong>
</ol>
</dd>
<dt>
<a name = "Static:GetSolid"></a>
@ -576,6 +605,28 @@
</dd>
<dt>
<a name = "Static:SetCollidable"></a>
<strong>Static:SetCollidable(collidable)</strong>
</dt>
<dd>
Set this static's collision status.
<h3>Parameters:</h3>
<ul>
<li><span class="parameter">collidable</span>
<span class="types"><span class="type">bool</span></span>
New collision status. <strong>true: can be collided with</strong>, <strong>false: no collision</strong>
</li>
</ul>
</dd>
<dt>
<a name = "Static:Enable"></a>

View file

@ -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))

View file

@ -705,6 +705,10 @@ std::optional<Vector3> 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;

View file

@ -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

View file

@ -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";
// =====

View file

@ -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()

View file

@ -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