// // Sanity-checking geometry generation // // Return a non-null error message if the mesh data is not identical private static string Compare( Vector3[] oldVerts, int iOldVert0, int iOldVert1, int[] oldTris, int iOldTri0, int iOldTri1, Vector2[] oldUv0s, BaseBrushScript newBrush) { Vector3[] newVerts; int nNewVerts; Vector2[] newUv0s; int[] newTris; int nNewTris; newBrush.DebugGetGeometry(out newVerts, out nNewVerts, out newUv0s, out newTris, out nNewTris); if (nNewVerts != iOldVert1 - iOldVert0) { return("vert count mismatch"); } for (int i = 0; i < nNewVerts; ++i) { Vector3 vo = oldVerts[iOldVert0 + i]; Vector3 vn = newVerts[i]; if (vo != vn) { return(string.Format("vert mismatch @ {0}/{1}", i, nNewVerts)); } } // Before enabling, we need a way of skipping this for brushes that // legitimately want randomized UVs. There is also a known nondeterminism // for QuadStripBrushStretchUV, though. #if false if (oldUv0s != null) { if (newUv0s == null) { return("uv0 mismatch (loaded mesh has no UVs)"); } for (int i = 0; i < nNewVerts; ++i) { Vector2 uvo = oldUv0s[iOldVert0 + i]; Vector2 uvn = newUv0s[i]; if (uvo != uvn) { return(string.Format("uv mismatch @ {0}/{1}", i, nNewVerts)); } } } #endif if (nNewTris != iOldTri1 - iOldTri0) { return("tri count mismatch"); } // Try to account for vert numbering { int triOffset = newTris[0] - oldTris[iOldTri0]; for (int i = 0; i < nNewTris; ++i) { int to = oldTris[iOldTri0 + i]; int tn = newTris[i]; if (to + triOffset != tn) { return(string.Format("tri mismatch @ {0}/{1}", i, nNewTris)); } } } return(null); }