Fixes for standable collision tris visualization in Metroid Prime 3

This commit is contained in:
parax0 2017-01-29 05:01:41 -07:00
parent 9654cf1428
commit 57c2830b04
4 changed files with 25 additions and 9 deletions

View File

@ -1,5 +1,6 @@
#include "CCollisionMaterial.h" #include "CCollisionMaterial.h"
#include "EGame.h" #include "EGame.h"
#include <Common/Assert.h>
#include <unordered_map> #include <unordered_map>
ECollisionFlag CCollisionMaterial::SurfaceType(EGame Game) const ECollisionFlag CCollisionMaterial::SurfaceType(EGame Game) const
@ -71,3 +72,14 @@ CColor CCollisionMaterial::SurfaceColor(EGame Game) const
auto FindColor = gkTypeToColor.find(SurfType); auto FindColor = gkTypeToColor.find(SurfType);
return (FindColor == gkTypeToColor.end() ? CColor::skWhite : FindColor->second); return (FindColor == gkTypeToColor.end() ? CColor::skWhite : FindColor->second);
} }
bool CCollisionMaterial::IsFloor() const
{
return HasFlag(eCF_Floor) && !HasFlag(eCF_JumpNotAllowed);
}
bool CCollisionMaterial::IsUnstandable(EGame Game) const
{
BREAK_ONLY_ASSERT(!HasFlag(eCF_Wood));
return HasFlag(eCF_JumpNotAllowed) || (Game >= eEchoesDemo && !HasFlag(eCF_Floor) && HasAnyFlags(eCF_Wall | eCF_Ceiling));
}

View File

@ -41,11 +41,11 @@ enum ECollisionFlag
eCF_ScanThru = 0x01000000, eCF_ScanThru = 0x01000000,
eCF_AiWalkThru = 0x02000000, eCF_AiWalkThru = 0x02000000,
eCF_FlippedTri = 0x04000000, eCF_FlippedTri = 0x04000000,
eCF_Floor = 0x08000000, eCF_Ceiling = 0x08000000,
eCF_AiBlock = 0x10000000, eCF_Wall = 0x10000000,
eCF_JumpNotAllowed = 0x20000000, eCF_Floor = 0x20000000,
eCF_SpiderBall = 0x40000000, eCF_AiBlock = 0x40000000,
eCF_WallJump = 0x80000000 eCF_JumpNotAllowed = 0x80000000
}; };
class CCollisionMaterial : public TFlags<ECollisionFlag> class CCollisionMaterial : public TFlags<ECollisionFlag>
@ -56,6 +56,8 @@ class CCollisionMaterial : public TFlags<ECollisionFlag>
public: public:
ECollisionFlag SurfaceType(EGame Game) const; ECollisionFlag SurfaceType(EGame Game) const;
CColor SurfaceColor(EGame Game) const; CColor SurfaceColor(EGame Game) const;
bool IsFloor() const;
bool IsUnstandable(EGame Game) const;
inline u64 RawFlags() const { return mRawFlags; } inline u64 RawFlags() const { return mRawFlags; }
}; };

View File

@ -66,6 +66,8 @@ void CCollisionLoader::ReadPropertyFlags(IInputStream& rSrc)
if (RawFlags & 0x02000000) Material |= eCF_FlippedTri; if (RawFlags & 0x02000000) Material |= eCF_FlippedTri;
if (RawFlags & 0x08000000) Material |= eCF_ScanThru; if (RawFlags & 0x08000000) Material |= eCF_ScanThru;
if (RawFlags & 0x10000000) Material |= eCF_AiWalkThru; if (RawFlags & 0x10000000) Material |= eCF_AiWalkThru;
if (RawFlags & 0x20000000) Material |= eCF_Ceiling;
if (RawFlags & 0x40000000) Material |= eCF_Wall;
if (RawFlags & 0x80000000) Material |= eCF_Floor; if (RawFlags & 0x80000000) Material |= eCF_Floor;
} }
@ -95,12 +97,12 @@ void CCollisionLoader::ReadPropertyFlags(IInputStream& rSrc)
if (RawFlags & 0x02000000) Material |= eCF_Rubber; if (RawFlags & 0x02000000) Material |= eCF_Rubber;
if (RawFlags & 0x08000000) Material |= eCF_ScanThru; if (RawFlags & 0x08000000) Material |= eCF_ScanThru;
if (RawFlags & 0x10000000) Material |= eCF_AiWalkThru; if (RawFlags & 0x10000000) Material |= eCF_AiWalkThru;
if (RawFlags & 0x20000000) Material |= eCF_Ceiling;
if (RawFlags & 0x40000000) Material |= eCF_Wall;
if (RawFlags & 0x80000000) Material |= eCF_Floor; if (RawFlags & 0x80000000) Material |= eCF_Floor;
if (RawFlags & 0x0001000000000000) Material |= eCF_AiBlock; if (RawFlags & 0x0001000000000000) Material |= eCF_AiBlock;
if (RawFlags & 0x0400000000000000) Material |= eCF_JumpNotAllowed; if (RawFlags & 0x0400000000000000) Material |= eCF_JumpNotAllowed;
if (RawFlags & 0x2000000000000000) Material |= eCF_SpiderBall;
if (RawFlags & 0x4000000000000000) Material |= eCF_WallJump;
} }
else if (mVersion == eReturns) else if (mVersion == eReturns)

View File

@ -68,8 +68,8 @@ void CCollisionNode::Draw(FRenderOptions /*Options*/, int /*ComponentIndex*/, ER
else if (CollisionGame != eReturns && rkViewInfo.CollisionSettings.TintWithSurfaceColor) else if (CollisionGame != eReturns && rkViewInfo.CollisionSettings.TintWithSurfaceColor)
Tint *= rMat.SurfaceColor(CollisionGame); Tint *= rMat.SurfaceColor(CollisionGame);
bool IsFloor = (rkViewInfo.CollisionSettings.TintUnwalkableTris ? rMat.HasFlag(eCF_Floor) : true) || CollisionGame == eReturns; bool IsFloor = (rkViewInfo.CollisionSettings.TintUnwalkableTris ? rMat.IsFloor() : true) || CollisionGame == eReturns;
bool IsUnstandable = (rkViewInfo.CollisionSettings.TintUnwalkableTris ? rMat.HasFlag(eCF_JumpNotAllowed) : false) && CollisionGame != eReturns; bool IsUnstandable = (rkViewInfo.CollisionSettings.TintUnwalkableTris ? rMat.IsUnstandable(CollisionGame) : false) && CollisionGame != eReturns;
CDrawUtil::UseCollisionShader(IsFloor, IsUnstandable, Tint); CDrawUtil::UseCollisionShader(IsFloor, IsUnstandable, Tint);
pMesh->DrawMaterial(iMat, false); pMesh->DrawMaterial(iMat, false);