add lod selection for visiblemesh collisions

add box filtering for visiblemesh buildPolyList
This commit is contained in:
AzaezelX 2025-01-27 15:37:05 -06:00
parent b105fce2f2
commit e2a0fbefa3
2 changed files with 12 additions and 6 deletions

View file

@ -137,6 +137,7 @@ TSStatic::TSStatic()
mAlphaFade = 1.0f; mAlphaFade = 1.0f;
mPhysicsRep = NULL; mPhysicsRep = NULL;
mCollisionLOD = 0;
mCollisionType = CollisionMesh; mCollisionType = CollisionMesh;
mDecalType = CollisionMesh; mDecalType = CollisionMesh;
@ -238,7 +239,8 @@ void TSStatic::initPersistFields()
endGroup("Reflection"); endGroup("Reflection");
addGroup("Collision"); addGroup("Collision");
addField("collisionLOD", TypeS32, Offset(mCollisionLOD, TSStatic),
"The level of detail to use for 'Visible Mesh' collision queries.");
addField("collisionType", TypeTSMeshType, Offset(mCollisionType, TSStatic), addField("collisionType", TypeTSMeshType, Offset(mCollisionType, TSStatic),
"The type of mesh data to use for collision queries."); "The type of mesh data to use for collision queries.");
addField("decalType", TypeTSMeshType, Offset(mDecalType, TSStatic), addField("decalType", TypeTSMeshType, Offset(mDecalType, TSStatic),
@ -531,20 +533,20 @@ void TSStatic::prepCollision()
if (mCollisionType == CollisionMesh || mCollisionType == VisibleMesh) if (mCollisionType == CollisionMesh || mCollisionType == VisibleMesh)
{ {
mShape->findColDetails(mCollisionType == VisibleMesh, &mCollisionDetails, &mLOSDetails); mShape->findColDetails(mCollisionType == VisibleMesh, &mCollisionDetails, &mLOSDetails, mCollisionLOD);
if (mDecalType == mCollisionType) if (mDecalType == mCollisionType)
{ {
mDecalDetailsPtr = &mCollisionDetails; mDecalDetailsPtr = &mCollisionDetails;
} }
else if (mDecalType == CollisionMesh || mDecalType == VisibleMesh) else if (mDecalType == CollisionMesh || mDecalType == VisibleMesh)
{ {
mShape->findColDetails(mDecalType == VisibleMesh, &mDecalDetails, 0); mShape->findColDetails(mDecalType == VisibleMesh, &mDecalDetails, 0, mCollisionLOD);
mDecalDetailsPtr = &mDecalDetails; mDecalDetailsPtr = &mDecalDetails;
} }
} }
else if (mDecalType == CollisionMesh || mDecalType == VisibleMesh) else if (mDecalType == CollisionMesh || mDecalType == VisibleMesh)
{ {
mShape->findColDetails(mDecalType == VisibleMesh, &mDecalDetails, 0); mShape->findColDetails(mDecalType == VisibleMesh, &mDecalDetails, 0, mCollisionLOD);
mDecalDetailsPtr = &mDecalDetails; mDecalDetailsPtr = &mDecalDetails;
} }
@ -947,8 +949,10 @@ U32 TSStatic::packUpdate(NetConnection* con, U32 mask, BitStream* stream)
} }
if (stream->writeFlag(mask & UpdateCollisionMask)) if (stream->writeFlag(mask & UpdateCollisionMask))
{
stream->write(mCollisionLOD);
stream->write((U32)mCollisionType); stream->write((U32)mCollisionType);
}
if (stream->writeFlag(mask & SkinMask)) if (stream->writeFlag(mask & SkinMask))
con->packNetStringHandleU(stream, mSkinNameHandle); con->packNetStringHandleU(stream, mSkinNameHandle);
@ -1045,6 +1049,7 @@ void TSStatic::unpackUpdate(NetConnection* con, BitStream* stream)
{ {
U32 collisionType = CollisionMesh; U32 collisionType = CollisionMesh;
stream->read(&mCollisionLOD);
stream->read(&collisionType); stream->read(&collisionType);
// Handle it if we have changed CollisionType's // Handle it if we have changed CollisionType's
@ -1255,7 +1260,7 @@ bool TSStatic::buildPolyList(PolyListContext context, AbstractPolyList* polyList
else if (meshType == Bounds) else if (meshType == Bounds)
polyList->addBox(mObjBox); polyList->addBox(mObjBox);
else if (meshType == VisibleMesh) else if (meshType == VisibleMesh)
mShapeInstance->buildPolyList(polyList, 0); mShapeInstance->buildPolyListOpcode(0, polyList, box);
else if (context == PLC_Decal && mDecalDetailsPtr != 0) else if (context == PLC_Decal && mDecalDetailsPtr != 0)
{ {
for (U32 i = 0; i < mDecalDetailsPtr->size(); i++) for (U32 i = 0; i < mDecalDetailsPtr->size(); i++)

View file

@ -205,6 +205,7 @@ protected:
TSThread* mAmbientThread; TSThread* mAmbientThread;
F32 mAnimOffset; F32 mAnimOffset;
F32 mAnimSpeed; F32 mAnimSpeed;
S16 mCollisionLOD;
/// The type of mesh data to return for collision queries. /// The type of mesh data to return for collision queries.
MeshType mCollisionType; MeshType mCollisionType;