MeshZone GetMouseOverZone(CoupledTri mouseOverTri, List <MeshZone> meshZones) { for (int i = 0; i < meshZones.Count; i++) { for (int j = 0; j < meshZones[i].zoneTris.Count; j++) { if (meshZones[i].zoneTris[j].triIndex == mouseOverTri.triIndex) { return(meshZones[i]); } } } return(null); }
CoupledTri GetMouseOverTri(CoupledTri[] tris, Event evt, Camera cam) { Vector2 mousePos = evt.mousePosition; CoupledTri prev = new CoupledTri(); prev.centroid = cam.transform.position * 100000000; prev.triName = "ng"; List <CoupledTri> containingTris = new List <CoupledTri>(); for (int i = 0; i < tris.Length; i++) { Vector3 p0 = cam.WorldToScreenPoint(tris[i].p0); Vector3 p1 = cam.WorldToScreenPoint(tris[i].p1); Vector3 p2 = cam.WorldToScreenPoint(tris[i].p2); float x0 = p0.x; float y0 = cam.pixelHeight - p0.y; float x1 = p1.x; float y1 = cam.pixelHeight - p1.y; float x2 = p2.x; float y2 = cam.pixelHeight - p2.y; float x = mousePos.x; float y = mousePos.y; float s = (((y1 - y2) * (x - x2)) + ((x2 - x1) * (y - y2))) / (((y1 - y2) * (x0 - x2)) + ((x2 - x1) * (y0 - y2))); float t = (((y2 - y0) * (x - x2)) + ((x0 - x2) * (y - y2))) / (((y1 - y2) * (x0 - x2)) + ((x2 - x1) * (y0 - y2))); if (s >= 0f && s <= 1f && t >= 0f && t <= 1f && s + t <= 1f) { containingTris.Add(tris[i]); } } if (containingTris.Count >= 1) { for (int j = 0; j < containingTris.Count; j++) { prev = (cam.transform.position - containingTris[j].centroid).sqrMagnitude <= (cam.transform.position - prev.centroid).sqrMagnitude ? containingTris[j] : prev; } } return(prev); }
void OnSceneGUI() { serializedObject.Update(); EditorGUI.BeginChangeCheck(); { Event curEv = Event.current; MeshDataConverterScr targetConverter = (MeshDataConverterScr)serializedObject.targetObject; MeshDataObject targetMeshData = targetConverter.meshData; int controlID = GUIUtility.GetControlID(FocusType.Passive); Camera curCam = Camera.current; if (targetMeshData == null) { return; } if (targetConverter.isReady) { CoupledTri mouseOverTri = GetMouseOverTri(targetMeshData.coupledTris, curEv, curCam); if (targetMeshData.meshZones.Count != 0) { mouseOverZone = GetMouseOverZone(mouseOverTri, targetMeshData.meshZones); } #region Control Switch //This switch controls input behaviour when the target gameobject is selected //in the hierarchy switch (curEv.GetTypeForControl(controlID)) { case EventType.MouseDown: GUIUtility.hotControl = controlID; curEv.Use(); break; case EventType.MouseUp: GUIUtility.hotControl = 0; curEv.Use(); break; case EventType.MouseDrag: GUIUtility.hotControl = controlID; if (curEv.modifiers == EventModifiers.Shift) { if (targetConverter.activeZone.zoneTris.Contains(mouseOverTri)) { targetConverter.activeZone.zoneTris.Remove(mouseOverTri); } curEv.Use(); break; } if (curEv.modifiers == EventModifiers.Control) { if (!targetConverter.activeZone.zoneTris.Contains(mouseOverTri) || targetConverter.activeZone.zoneTris.Count == 0) { if (mouseOverTri.triName != "ng") { targetConverter.activeZone.zoneTris.Add(mouseOverTri); } } } curEv.Use(); break; case EventType.KeyDown: if (curEv.keyCode == KeyCode.Escape) { // Do something on pressing Escape } if (curEv.keyCode == KeyCode.Space) { // Do something on pressing Spcae } if (curEv.keyCode == KeyCode.S) { // Do something on pressing S } break; case EventType.layout: HandleUtility.AddDefaultControl(controlID); break; } #endregion #region Drawing Hover Tri if (mouseOverTri.triName != "ng") { Handles.color = hoverTriFillCol; Handles.DrawAAConvexPolygon(mouseOverTri.p0, mouseOverTri.p1, mouseOverTri.p2); Handles.color = hoverTriOutlineCol; Handles.DrawAAPolyLine(mouseOverTri.p0, mouseOverTri.p1, mouseOverTri.p2, mouseOverTri.p0); Handles.color = hoverLabelCol; Handles.Label(mouseOverTri.centroid, mouseOverTri.triIndex.ToString()); Handles.Label(mouseOverTri.p0, "p0: " + mouseOverTri.p0uv.x.ToString() + ", " + mouseOverTri.p0uv.y.ToString()); Handles.Label(mouseOverTri.p1, "p1: " + mouseOverTri.p1uv.x.ToString() + ", " + mouseOverTri.p1uv.y.ToString()); Handles.Label(mouseOverTri.p2, "p2: " + mouseOverTri.p2uv.x.ToString() + ", " + mouseOverTri.p2uv.y.ToString()); } #endregion #region Drawing hover zone and adjuscent zones if (mouseOverTri.triName != "ng" && mouseOverZone != null) { //drawing hover zone for (int i = 0; i < mouseOverZone.zoneTris.Count; i++) { Handles.color = hoverZoneFillCol; Handles.DrawAAConvexPolygon(mouseOverZone.zoneTris [i].p0, mouseOverZone.zoneTris [i].p1, mouseOverZone.zoneTris [i].p2); } //drawing member zones if (targetMeshData.zoneGroup.Count != 0) { Handles.color = hoverZoneGroupFillCol; for (int i = 0; i < GetMemberZone(mouseOverZone, targetMeshData).Count; i++) { for (int j = 0; j < GetMemberZone(mouseOverZone, targetMeshData) [i].zoneTris.Count; j++) { Handles.DrawAAConvexPolygon(GetMemberZone(mouseOverZone, targetMeshData) [i].zoneTris [j].p0, GetMemberZone(mouseOverZone, targetMeshData) [i].zoneTris [j].p1, GetMemberZone(mouseOverZone, targetMeshData) [i].zoneTris [j].p2); } } } } #endregion #region Drawing All Zones Tris if (targetConverter.showAllZoneTris) { if (targetMeshData.meshZones.Count != 0) { for (int i = 0; i < targetMeshData.meshZones.Count; i++) { if (targetMeshData.meshZones [i].zoneTris.Count != 0) { for (int j = 0; j < targetMeshData.meshZones [i].zoneTris.Count; j++) { Handles.color = targetMeshData.meshZones [i].zoneColor; Handles.DrawAAConvexPolygon (targetMeshData.meshZones [i].zoneTris [j].p0, targetMeshData.meshZones [i].zoneTris [j].p1, targetMeshData.meshZones [i].zoneTris [j].p2); } } } } } if (targetConverter.showNTB) { for (int i = 0; i < targetMeshData.meshZones.Count; i++) { if (targetMeshData.meshZones [i].zoneTris.Count != 0) { for (int j = 0; j < targetMeshData.meshZones [i].zoneTris.Count; j++) { Handles.color = Handles.xAxisColor; Handles.ArrowCap(-1, targetMeshData.meshZones [i].zoneTris [j].centroid, Quaternion.LookRotation(targetMeshData.meshZones [i].zoneTris [j].normal), .3f); Handles.color = Handles.yAxisColor; Handles.ArrowCap(-1, targetMeshData.meshZones [i].zoneTris [j].centroid, Quaternion.LookRotation(targetMeshData.meshZones [i].zoneTris [j].tangent), .3f); Handles.color = Handles.zAxisColor; Handles.ArrowCap(-1, targetMeshData.meshZones [i].zoneTris [j].centroid, Quaternion.LookRotation(targetMeshData.meshZones [i].zoneTris [j].binormal), .3f); } } } } #endregion #region Draw Active Zone Tris if (targetConverter.showAZTrisOnScene) { Handles.color = targetConverter.activeZone.zoneColor; for (int i = 0; i < targetConverter.activeZone.zoneTris.Count; i++) { Handles.DrawAAConvexPolygon( targetConverter.activeZone.zoneTris [i].p0, targetConverter.activeZone.zoneTris [i].p1, targetConverter.activeZone.zoneTris [i].p2); } } #endregion #region Show Overlay GUI Handles.BeginGUI(); { GUILayout.BeginArea(new Rect(10, 10, 300, 300)); { //Buttons, toggles etc does not register appropriately GUILayout.Label("Mesh Zones Count: " + targetMeshData.meshZones.Count.ToString()); for (int i = 0; i < targetMeshData.meshZones.Count; i++) { GUILayout.Label("Mesh Zone " + i + " zone tris count: " + targetMeshData.meshZones [i].zoneTris.Count.ToString()); } } GUILayout.EndArea(); } Handles.EndGUI(); #endregion } } if (EditorGUI.EndChangeCheck()) { serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(serializedObject.targetObject); } }
void Convert(MeshDataObject obj) { if (targetTrans.gameObject.GetComponent <MeshFilter>() == null) { return; } else { obj.objectName = targetTrans.gameObject.name; Mesh mesh = targetTrans.gameObject.GetComponent <MeshFilter>().sharedMesh; int[] tris = mesh.triangles; Vector3[] verts = mesh.vertices; obj.coupledTris = new CoupledTri[mesh.triangles.Length / 3]; for (int i = 0; i < tris.Length; i += 3) { Vector3 p0 = verts[tris[i + 0]]; Vector3 p2 = verts[tris[i + 1]]; Vector3 p1 = verts[tris[i + 2]]; p0 = targetTrans.TransformPoint(p0); p1 = targetTrans.TransformPoint(p1); p2 = targetTrans.TransformPoint(p2); Vector3 centroid = new Vector3((p0.x + p1.x + p2.x) / 3, (p0.y + p1.y + p2.y) / 3, (p0.z + p1.z + p2.z) / 3); Vector2 p0uv = mesh.uv[tris[i + 0]]; Vector2 p2uv = mesh.uv[tris[i + 1]]; Vector2 p1uv = mesh.uv[tris[i + 2]]; Vector3 udir = Vector3.zero; Vector3 vdir = Vector3.zero; if (p0uv.x == p1uv.x) { if (p0uv.y > p1uv.y) { vdir = (p0 - p1).normalized; } else if (p0uv.y < p1uv.y) { vdir = (p1 - p0).normalized; } else { Debug.Log("vertices UV incorrectly set"); } } else if (p1uv.x == p2uv.x) { if (p1uv.y > p2uv.y) { vdir = (p1 - p2).normalized; } else if (p1uv.y < p2uv.y) { vdir = (p2 - p1).normalized; } else { Debug.Log("vertices UV incorrectly set"); } } else if (p2uv.x == p0uv.x) { if (p2uv.y > p0uv.y) { vdir = (p2 - p0).normalized; } else if (p2uv.y < p0uv.y) { vdir = (p0 - p2).normalized; } else { Debug.Log("vertices UV incorrectly set"); } } if (p0uv.y == p1uv.y) { if (p0uv.x > p1uv.x) { udir = (p0 - p1).normalized; } else if (p0uv.x < p1uv.x) { udir = (p1 - p0).normalized; } else { Debug.Log("vertices UV incorrectly set"); } } else if (p1uv.y == p2uv.y) { if (p1uv.x > p2uv.x) { udir = (p1 - p2).normalized; } else if (p1uv.x < p2uv.x) { udir = (p2 - p1).normalized; } else { Debug.Log("vertices UV incorrectly set"); } } else if (p2uv.y == p0uv.y) { if (p2uv.x > p0uv.x) { udir = (p2 - p0).normalized; } else if (p2uv.x < p0uv.x) { udir = (p0 - p2).normalized; } else { Debug.Log("vertices UV incorrectly set"); } } Vector3 normal = Vector3.Cross(vdir, udir); Vector3 tangent = (udir == Vector3.zero)? Vector3.Cross(normal, vdir): udir; Vector3 binormal = (vdir == Vector3.zero)? Vector3.Cross(udir, normal): vdir; CoupledTri newTri = new CoupledTri(); newTri.triIndex = i / 3; newTri.triName = "tri " + (i / 3).ToString(); newTri.p0 = p0; newTri.p1 = p1; newTri.p2 = p2; newTri.centroid = centroid; newTri.uDir = udir; newTri.vDir = vdir; newTri.normal = normal; newTri.tangent = tangent; newTri.binormal = binormal; newTri.p0uv = p0uv; newTri.p1uv = p1uv; newTri.p2uv = p2uv; obj.coupledTris[i / 3] = newTri; obj.isConverted = true; obj.zoneGroup = new List <MeshZoneList>(); } } }
void OnSceneGUI() { //get target's CoupledTris array //iterate through the array to find the mouseover tri //a) whose screenspace coord contains mousePos //b) if multiple tris are returned, select the one that is closest to camera pos // //clicking on the mouseover tri marks it as "Selected" //shift-Clike to DeSelect // //Draw suitable handles to represent various vectors and indeices of the selected tris Event curEv = Event.current; MeshDataClass myTarget = (MeshDataClass)target; int controlID = GUIUtility.GetControlID(FocusType.Passive); Camera curCam = Camera.current; if (curCam == null || myTarget.coupledTris == null) { return; } CoupledTri mouseOverTri = GetMouseOverTri(myTarget.coupledTris, curEv, curCam); GUIStyle newStyle = new GUIStyle(); newStyle.richText = true; if (myTarget.isReady) { #region Control Switch //This switch controls input behaviour when the target gameobject is selected //in the hierarchy switch (curEv.GetTypeForControl(controlID)) { case EventType.MouseDown: GUIUtility.hotControl = controlID; //CheckForPositions(curEv.mousePosition); curEv.Use(); break; case EventType.MouseUp: GUIUtility.hotControl = 0; if (curEv.modifiers == EventModifiers.Shift) { if (myTarget.activeZone.zoneTris.Contains(mouseOverTri)) { myTarget.activeZone.zoneTris.Remove(mouseOverTri); } Debug.Log("shift click"); curEv.Use(); break; } if (!myTarget.activeZone.zoneTris.Contains(mouseOverTri) || myTarget.activeZone.zoneTris.Count == 0) { if (mouseOverTri.triName != "ng") { myTarget.activeZone.zoneTris.Add(mouseOverTri); } } Debug.Log("click"); curEv.Use(); break; case EventType.MouseDrag: GUIUtility.hotControl = controlID; //CheckForPositions(curEv.mousePosition); curEv.Use(); break; case EventType.KeyDown: if (curEv.keyCode == KeyCode.Escape) { // Do something on pressing Escape } if (curEv.keyCode == KeyCode.Space) { // Do something on pressing Spcae } if (curEv.keyCode == KeyCode.S) { // Do something on pressing S } break; case EventType.layout: HandleUtility.AddDefaultControl(controlID); break; } #endregion //drawing hover tri if (mouseOverTri.triName != "ng") { Handles.Label(mouseOverTri.centroid, "<color=#ffffffff>" + mouseOverTri.triIndex.ToString() + "</color>", newStyle); Color newColor = Color.blue; newColor.a *= .2f; Handles.color = newColor; Handles.DrawAAConvexPolygon(mouseOverTri.p0, mouseOverTri.p1, mouseOverTri.p2); } //drawing zones tris if (myTarget.meshZones.Count != 0) { for (int i = 0; i < myTarget.meshZones.Count; i++) { Handles.color = myTarget.meshZones[i].zoneColor; if (myTarget.meshZones[i].zoneTris.Count != 0) { for (int j = 0; j < myTarget.meshZones[i].zoneTris.Count; j++) { Handles.DrawAAConvexPolygon (myTarget.meshZones[i].zoneTris[j].p0, myTarget.meshZones[i].zoneTris[j].p1, myTarget.meshZones[i].zoneTris[j].p2); } } } } Handles.BeginGUI(); GUILayout.BeginVertical(); GUILayout.Button("Button", GUILayout.Width(100)); //it's here for some button action...remove if you don't need GUILayout.Label("Mesh Zones Count: " + myTarget.meshZones.Count.ToString()); for (int i = 0; i < myTarget.meshZones.Count; i++) { GUILayout.Label("Mesh Zone " + i + " zone tris count: " + myTarget.meshZones[i].zoneTris.Count.ToString()); } GUILayout.EndVertical(); Handles.EndGUI(); } #region alternative switch //switch (curEv.type) // { // case EventType.mouseUp: // //// this works //// Debug.Log("mousepos" + curEv.mousePosition/*TopLeft is 0, 0 */); //// Vector3 targetPos = curCam.WorldToScreenPoint(myTarget.trans.position); //// Vector2 correctedPos = new Vector2(targetPos.x, curCam.pixelHeight - targetPos.y); // //Debug.Log("targetPos" + correctedPos); // // //Debug.Log("Hi"); // // curEv.Use(); // break; // // case EventType.layout: // // HandleUtility.AddDefaultControl(controlID); // // break; // } #endregion if (GUI.changed) { EditorUtility.SetDirty(myTarget); } }