Browse Source

Merge pull request #63 from DavidWyand-GG/issue62-LargeDecalsDisappear

Fix for Issue #62 for Large decal disappears
David Wyand 13 năm trước cách đây
mục cha
commit
59e7229088

+ 14 - 5
Engine/source/T3D/decal/decalManager.cpp

@@ -361,19 +361,28 @@ bool DecalManager::clipDecal( DecalInstance *decal, Vector<Point3F> *edgeVerts,
    mClipper.cullUnusedVerts();
    mClipper.triangulate();
    
+   const U32 numVerts = mClipper.mVertexList.size();
+   const U32 numIndices = mClipper.mIndexList.size();
+
+   if ( !numVerts || !numIndices )
+      return false;
+
+   // Fail if either of the buffer metrics exceeds our limits
+   // on dynamic geometry buffers.
+   if ( numVerts > smMaxVerts ||
+        numIndices > smMaxIndices )
+      return false;
+
    if ( !decalData->skipVertexNormals )
       mClipper.generateNormals();
    
-   if ( mClipper.mVertexList.empty() )
-      return false;
-
 #ifdef DECALMANAGER_DEBUG
    mDebugPlanes.clear();
    mDebugPlanes.merge( mClipper.mPlaneList );
 #endif
 
-   decal->mVertCount = mClipper.mVertexList.size();
-   decal->mIndxCount = mClipper.mIndexList.size();
+   decal->mVertCount = numVerts;
+   decal->mIndxCount = numIndices;
    
    Vector<Point3F> tmpPoints;
 

+ 13 - 1
Engine/source/gui/worldEditor/guiDecalEditorCtrl.cpp

@@ -394,7 +394,19 @@ void GuiDecalEditorCtrl::on3DMouseDragged(const Gui3DMouseEvent & event)
 
       // Assign the appropriate changed value back to the decal.
       if ( mGizmo->getMode() == ScaleMode )
-         mSELDecal->mSize = (scale.x + scale.y) * 0.5f;
+      {
+         // Save old size.
+         const F32 oldSize = mSELDecal->mSize;
+
+         // Set new size.
+         mSELDecal->mSize = ( scale.x + scale.y ) * 0.5f;
+
+         // See if the decal properly clips/projects at this size.  If not,
+         // stick to the old size.
+         mSELEdgeVerts.clear();
+         if ( !gDecalManager->clipDecal( mSELDecal, &mSELEdgeVerts ) )
+            mSELDecal->mSize = oldSize;
+      }
       else if ( mGizmo->getMode() == MoveMode )
          mSELDecal->mPosition = gizmoPos;
       else if ( mGizmo->getMode() == RotateMode )