Пример #1
0
    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);
    }
Пример #2
0
    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);
    }
Пример #3
0
    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);
        }
    }
Пример #4
0
    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);
        }
    }