From e2a0fbefa350b0617a25b2d39aace6b79f78ed89 Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Mon, 27 Jan 2025 15:37:05 -0600 Subject: [PATCH 1/2] add lod selection for visiblemesh collisions add box filtering for visiblemesh buildPolyList --- Engine/source/T3D/tsStatic.cpp | 17 +++++++++++------ Engine/source/T3D/tsStatic.h | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Engine/source/T3D/tsStatic.cpp b/Engine/source/T3D/tsStatic.cpp index c02cd5220..3182eeada 100644 --- a/Engine/source/T3D/tsStatic.cpp +++ b/Engine/source/T3D/tsStatic.cpp @@ -137,6 +137,7 @@ TSStatic::TSStatic() mAlphaFade = 1.0f; mPhysicsRep = NULL; + mCollisionLOD = 0; mCollisionType = CollisionMesh; mDecalType = CollisionMesh; @@ -238,7 +239,8 @@ void TSStatic::initPersistFields() endGroup("Reflection"); 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), "The type of mesh data to use for collision queries."); addField("decalType", TypeTSMeshType, Offset(mDecalType, TSStatic), @@ -531,20 +533,20 @@ void TSStatic::prepCollision() if (mCollisionType == CollisionMesh || mCollisionType == VisibleMesh) { - mShape->findColDetails(mCollisionType == VisibleMesh, &mCollisionDetails, &mLOSDetails); + mShape->findColDetails(mCollisionType == VisibleMesh, &mCollisionDetails, &mLOSDetails, mCollisionLOD); if (mDecalType == mCollisionType) { mDecalDetailsPtr = &mCollisionDetails; } else if (mDecalType == CollisionMesh || mDecalType == VisibleMesh) { - mShape->findColDetails(mDecalType == VisibleMesh, &mDecalDetails, 0); + mShape->findColDetails(mDecalType == VisibleMesh, &mDecalDetails, 0, mCollisionLOD); mDecalDetailsPtr = &mDecalDetails; } } else if (mDecalType == CollisionMesh || mDecalType == VisibleMesh) { - mShape->findColDetails(mDecalType == VisibleMesh, &mDecalDetails, 0); + mShape->findColDetails(mDecalType == VisibleMesh, &mDecalDetails, 0, mCollisionLOD); mDecalDetailsPtr = &mDecalDetails; } @@ -947,8 +949,10 @@ U32 TSStatic::packUpdate(NetConnection* con, U32 mask, BitStream* stream) } if (stream->writeFlag(mask & UpdateCollisionMask)) + { + stream->write(mCollisionLOD); stream->write((U32)mCollisionType); - + } if (stream->writeFlag(mask & SkinMask)) con->packNetStringHandleU(stream, mSkinNameHandle); @@ -1045,6 +1049,7 @@ void TSStatic::unpackUpdate(NetConnection* con, BitStream* stream) { U32 collisionType = CollisionMesh; + stream->read(&mCollisionLOD); stream->read(&collisionType); // Handle it if we have changed CollisionType's @@ -1255,7 +1260,7 @@ bool TSStatic::buildPolyList(PolyListContext context, AbstractPolyList* polyList else if (meshType == Bounds) polyList->addBox(mObjBox); else if (meshType == VisibleMesh) - mShapeInstance->buildPolyList(polyList, 0); + mShapeInstance->buildPolyListOpcode(0, polyList, box); else if (context == PLC_Decal && mDecalDetailsPtr != 0) { for (U32 i = 0; i < mDecalDetailsPtr->size(); i++) diff --git a/Engine/source/T3D/tsStatic.h b/Engine/source/T3D/tsStatic.h index d0c9f6c46..fef5ed0bb 100644 --- a/Engine/source/T3D/tsStatic.h +++ b/Engine/source/T3D/tsStatic.h @@ -205,6 +205,7 @@ protected: TSThread* mAmbientThread; F32 mAnimOffset; F32 mAnimSpeed; + S16 mCollisionLOD; /// The type of mesh data to return for collision queries. MeshType mCollisionType; From f5b7f70f50c3d1b0d4649acd93e9d3bce2d2fc17 Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Mon, 27 Jan 2025 17:19:22 -0600 Subject: [PATCH 2/2] add a specific lod option for findColDetails --- Engine/source/ts/tsCollision.cpp | 26 ++++++++++++++++++-------- Engine/source/ts/tsShape.h | 2 +- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Engine/source/ts/tsCollision.cpp b/Engine/source/ts/tsCollision.cpp index 22381436b..04adffdf8 100644 --- a/Engine/source/ts/tsCollision.cpp +++ b/Engine/source/ts/tsCollision.cpp @@ -811,11 +811,11 @@ bool TSShapeInstance::buildConvexOpcode( const MatrixF &objMat, const Point3F &o return emitted; } -void TSShape::findColDetails( bool useVisibleMesh, Vector *outDetails, Vector *outLOSDetails ) const +void TSShape::findColDetails( bool useVisibleMesh, Vector *outDetails, Vector *outLOSDetails, S32 specifiedLOD) const { PROFILE_SCOPE( TSShape_findColDetails ); - if ( useVisibleMesh ) + if ( useVisibleMesh || (specifiedLOD !=0)) { // If we're using the visible mesh for collision then // find the highest detail and use that. @@ -836,12 +836,23 @@ void TSShape::findColDetails( bool useVisibleMesh, Vector *outDetails, Vect dStrStartsWith( name, "LOS" ) ) continue; */ - - // Otherwise test against the current highest size - if ( details[i].size > highestSize ) + if (specifiedLOD != 0) { - highestDetail = i; - highestSize = details[i].size; + if (details[i].size == specifiedLOD) + { + highestDetail = i; + highestSize = details[i].size; + + } + } + else + { + // Otherwise test against the current highest size + if (details[i].size > highestSize) + { + highestDetail = i; + highestSize = details[i].size; + } } } @@ -852,7 +863,6 @@ void TSShape::findColDetails( bool useVisibleMesh, Vector *outDetails, Vect if ( outLOSDetails ) outLOSDetails->push_back( highestDetail ); } - return; } diff --git a/Engine/source/ts/tsShape.h b/Engine/source/ts/tsShape.h index c2a3fc1c4..c4446faa5 100644 --- a/Engine/source/ts/tsShape.h +++ b/Engine/source/ts/tsShape.h @@ -475,7 +475,7 @@ class TSShape /// @param outDetails The output detail index vector. /// @param outLOSDetails The optional output LOS detail vector. /// - void findColDetails( bool useVisibleMesh, Vector *outDetails, Vector *outLOSDetails ) const; + void findColDetails(bool useVisibleMesh, Vector* outDetails, Vector* outLOSDetails, S32 specifiedLOD = 0 ) const; /// Builds a physics collision shape at the requested scale. ///