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); } }
// 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; } }