Beispiel #1
0
 protected void _EditHull(SECTR_Hull myHull)
 {
     HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));
     if (Event.current.type == EventType.MouseMove)
     {
         _ComputeCursorVert();
         closesetVertIsValid = true;
         if (newHullVerts.Count > 2)
         {
             Vector3 firstVert = newHullVerts[0];
             if (Vector3.SqrMagnitude(closestVert - firstVert) < SECTR_Geometry.kVERTEX_EPSILON)
             {
                 closestVert         = firstVert;
                 closesetVertIsValid = true;
             }
             else
             {
                 Plane hullPlane = new Plane(newHullVerts[0], newHullVerts[1], newHullVerts[2]);
                 closesetVertIsValid = hullPlane.GetDistanceToPoint(closestVert) < SECTR_Geometry.kVERTEX_EPSILON;
                 if (closesetVertIsValid)
                 {
                     List <Vector3> newVerts = new List <Vector3>(newHullVerts);
                     newVerts.Add(closestVert);
                     closesetVertIsValid = SECTR_Geometry.IsPolygonConvex(newVerts.ToArray());
                 }
             }
         }
     }
     else if (Event.current.type == EventType.MouseUp && Event.current.button == 0 && !Event.current.alt && !Event.current.control)
     {
         if (closesetVertIsValid)
         {
             if (!newHullVerts.Contains(closestVert))
             {
                 newHullVerts.Add(closestVert);
             }
             else if (newHullVerts.Count >= 3)
             {
                 _CompleteHull(myHull);
                 HandleUtility.Repaint();
             }
         }
     }
     else if (Event.current.type == EventType.KeyUp && Event.current.keyCode == KeyCode.Return)
     {
         if (newHullVerts.Count >= 3 || (myHull.ForceEditHull && newHullVerts.Count == 0))
         {
             _CompleteHull(myHull);
             HandleUtility.Repaint();
         }
     }
     else if (Event.current.type == EventType.KeyUp && Event.current.keyCode == KeyCode.Escape)
     {
         _EndNewHull(myHull, true);
     }
 }
Beispiel #2
0
    // Transforms the data in HullMesh into a linear list of vertices,
    // computes other mesh based data, and checks for convexity and planarity.
    protected void ComputeVerts()
    {
        if (HullMesh != previousMesh)
        {
            if (HullMesh)
            {
                int numVerts = HullMesh.vertexCount;
                vertsCW = new Vector3[numVerts];

                // Compute the hull centroid and initialize the CW verts array.
                meshCentroid = Vector3.zero;
                for (int vertIndex = 0; vertIndex < numVerts; ++vertIndex)
                {
                    Vector3 vertex = HullMesh.vertices[vertIndex];
                    vertsCW[vertIndex] = vertex;
                    meshCentroid      += vertex;
                }
                meshCentroid /= HullMesh.vertexCount;

                // Compute the hull normal
                meshNormal = Vector3.zero;
                int numNormals = HullMesh.normals.Length;
                for (int normalIndex = 0; normalIndex < numNormals; ++normalIndex)
                {
                    meshNormal += HullMesh.normals[normalIndex];
                }
                meshNormal /= HullMesh.normals.Length;
                meshNormal.Normalize();

                // Project the points onto a perfect plane and determine if the mesh is non-planar.
                bool meshIsPlanar = true;
                for (int vertIndex = 0; vertIndex < numVerts; ++vertIndex)
                {
                    Vector3 vertex        = vertsCW[vertIndex];
                    Vector3 projectedVert = vertex - Vector3.Dot(vertex - meshCentroid, meshNormal) * meshNormal;
                    meshIsPlanar       = meshIsPlanar && Vector3.SqrMagnitude(vertex - projectedVert) < SECTR_Geometry.kVERTEX_EPSILON;
                    vertsCW[vertIndex] = projectedVert;
                }

                if (!meshIsPlanar)
                {
                    Debug.LogWarning("Occluder mesh of " + name + " is not planar!");
                }

                // Reorder the verts to be clockwise about the normal
                Array.Sort(vertsCW, delegate(Vector3 a, Vector3 b)
                {
                    return(SECTR_Geometry.CompareVectorsCW(a, b, meshCentroid, meshNormal) * -1);
                });

                if (!SECTR_Geometry.IsPolygonConvex(vertsCW))
                {
                    Debug.LogWarning("Occluder mesh of " + name + " is not convex!");
                }
            }
            else
            {
                meshNormal   = Vector3.zero;
                meshCentroid = Vector3.zero;
                vertsCW      = null;
            }
            previousMesh = HullMesh;
        }
    }