Exemplo n.º 1
0
        //
        // 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);
        }