public override void OnInspectorGUI()
    {
        SerializedProperty isReadyProp   = serializedObject.FindProperty("isReady");
        SerializedProperty transProp     = serializedObject.FindProperty("trans");
        SerializedProperty zonesSizeProp = serializedObject.FindProperty("zonesSize");

        MeshDataClass target = (MeshDataClass)serializedObject.targetObject;

        GUIStyle headerStyle = new GUIStyle();

        headerStyle.fontStyle = FontStyle.Bold;

        serializedObject.Update();

        EditorGUI.BeginChangeCheck(); {
            EditorGUILayout.PropertyField(isReadyProp, false);

            //target transform
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Target Transform", headerStyle);
            EditorGUILayout.PropertyField(transProp, false);
            if (target.trans == null)
            {
                EditorGUILayout.HelpBox("target transform not assigned", MessageType.Error);
            }
            else if (!target.trans.gameObject.isStatic)
            {
                EditorGUILayout.HelpBox("target transform is not set static", MessageType.Error);
            }
            else if (target.trans.gameObject.GetComponent <MeshFilter>() == null)
            {
                EditorGUILayout.HelpBox("target transform does not have MeshFilter component", MessageType.Error);
            }
            else if (GUILayout.Button("Convert"))
            {
                target.Convert();
            }

            if (target.isConverted == true)
            {
                EditorGUILayout.LabelField("Coupled Tris Count: " + target.coupledTris.Length.ToString());

                //mesh zones
                EditorGUILayout.Space();
                EditorGUILayout.LabelField("Mesh Zones", headerStyle);

                EditorGUILayout.PropertyField(zonesSizeProp, false);
                if (GUILayout.Button("Create Zones"))
                {
                    target.CreateZones();
                }
                EditorGUILayout.LabelField("Mesh Zones Count: " + target.meshZones.Count.ToString());

                if (target.meshZones.Count != 0)
                {
//					EditorGUILayout.BeginHorizontal();{

                    for (int i = 0; i < target.meshZones.Count; i++)
                    {
                        EditorGUILayout.BeginVertical(); {
                            EditorGUILayout.BeginHorizontal(); {
                                target.meshZones[i].showZone = EditorGUILayout.Foldout(target.meshZones[i].showZone,
                                                                                       target.meshZones[i].zoneName);
                                target.meshZones[i].zoneColor = EditorGUILayout.ColorField(target.meshZones[i].zoneColor);
                                EditorGUILayout.LabelField("Zone Tris Count: " + target.meshZones[i].zoneTris.Count.ToString());
                            } EditorGUILayout.EndHorizontal();

//								if(target.meshZones[i].showZone){
//									EditorGUILayout.BeginHorizontal();{

//										EditorGUILayout.LabelField(target.meshZones[i].zoneName, GUILayout.Width(100));

//									}EditorGUILayout.EndHorizontal();

                            //EditorGUILayout.LabelField("Zone Tris Count: " + target.meshZones[i].zoneTris.Count.ToString());

//									target.meshZones[i].showZoneTris = EditorGUILayout.Foldout(target.meshZones[i].showZoneTris,
//										"Zone Tris count: " + target.meshZones[i].zoneTris.Count.ToString());
                            if (target.meshZones[i].showZone)
                            {
                                if (target.meshZones[i].zoneTris.Count != 0)
                                {
                                    for (int j = 0; j < target.meshZones[i].zoneTris.Count; j++)
                                    {
                                        EditorGUILayout.LabelField(target.meshZones[i].zoneTris[j].triName);
                                    }
                                }
                                else
                                {
                                    EditorGUILayout.HelpBox("There's no zone tris assigned yet", MessageType.Error);
                                }
                            }
                        } EditorGUILayout.EndVertical();
                    }
//					}EditorGUILayout.EndHorizontal();

                    //Active Zone
                    EditorGUILayout.Space();
                    EditorGUILayout.LabelField("Active Zone", headerStyle);

                    target.SetActiveZone(GUILayout.Toolbar(target.activeZoneIndex, target.toolBarStrings));


                    if (target.activeZone != null)
                    {
                        EditorGUILayout.BeginVertical(); {
//							EditorGUILayout.LabelField(target.activeZone.index.ToString());
                            EditorGUILayout.BeginHorizontal(); {
                                EditorGUILayout.LabelField(target.activeZone.zoneName.ToString(), GUILayout.MaxWidth(100));
                                EditorGUILayout.ColorField(target.activeZone.zoneColor, GUILayout.MinWidth(100));
                                EditorGUILayout.LabelField("active zone tris count: " + target.activeZone.zoneTris.Count.ToString());
                            } EditorGUILayout.EndHorizontal();
                            for (int i = 0; i < target.activeZone.zoneTris.Count; i++)
                            {
                                EditorGUILayout.LabelField(target.activeZone.zoneTris[i].triName.ToString());
                            }
                        } EditorGUILayout.EndVertical();
                    }
                    else
                    {
                        EditorGUILayout.HelpBox("Active Zone is not set", MessageType.Error);
                    }
                }
                else
                {
                    EditorGUILayout.HelpBox("There's no Mesh Zones created", MessageType.Error);
                }
            }
            else
            {
                EditorGUILayout.HelpBox("target trans not converted", MessageType.Error);
            }
        }

        if (EditorGUI.EndChangeCheck())
        {
            serializedObject.ApplyModifiedProperties();
        }
    }
    static void Convert(MenuCommand menuComm)
    {
        MeshDataClass component = (MeshDataClass)menuComm.context;

        component.Convert();
    }
    static void CreateZones(MenuCommand menuComm)
    {
        MeshDataClass component = (MeshDataClass)menuComm.context;

        component.CreateZones();
    }
    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);
        }
    }