浏览代码

add lod selection for visiblemesh collisions
add box filtering for visiblemesh buildPolyList

AzaezelX 7 月之前
父节点
当前提交
e2a0fbefa3
共有 2 个文件被更改,包括 12 次插入6 次删除
  1. 11 6
      Engine/source/T3D/tsStatic.cpp
  2. 1 0
      Engine/source/T3D/tsStatic.h

+ 11 - 6
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++)

+ 1 - 0
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;