void SetActiveZone(int index, MeshDataConverterScr converterScr) { if (converterScr.meshData.meshZones.Count != 0 && converterScr.activeZoneIndex != -1) { converterScr.activeZone = converterScr.meshData.meshZones[index]; converterScr.activeZoneIndex = index; } else { return; } }
void CreateZones(int num, MeshDataConverterScr converter) { converter.meshData.meshZones = new List <MeshZone>(); MeshZone.zonesSize = 0; converter.toolBarStrings = new string[num]; converter.meshData.zoneGroup.Clear(); for (int i = 0; i < num; i++) { MeshZoneList newMeshZoneList = new MeshZoneList(); newMeshZoneList.childMeshZones = new List <MeshZone>(); converter.meshData.zoneGroup.Add(newMeshZoneList); MeshZone newMeshZone = new MeshZone(); converter.meshData.meshZones.Add(newMeshZone); converter.toolBarStrings[i] = i.ToString(); } }
public override void OnInspectorGUI() { //initialization for gui styles need to be done in here toggleButtonUp = new GUIStyle("Button"); toggleButtonDown = new GUIStyle("Button"); toggleButtonDown.normal.background = toggleButtonDown.active.background; serializedObject.Update(); EditorGUI.BeginChangeCheck(); { MeshDataConverterScr targetConverter = (MeshDataConverterScr)serializedObject.targetObject; //Beginning Converter Section EditorGUILayout.Space(); EditorGUILayout.LabelField("Converter", headerStyle); int curInd = EditorGUI.indentLevel; EditorGUI.indentLevel++; EditorGUILayout.PropertyField(transProp, false); targetTrans = targetConverter.targetTrans; #region After target trans is assigned if (targetTrans != null) { #region After the target trans is properly set if (targetTrans.gameObject.isStatic && targetTrans.gameObject.GetComponent <MeshFilter> () != null) { #region Asset Conversion targetConverter.assetName = EditorGUILayout.TextField("Asset Name", targetConverter.assetName); EditorGUI.BeginDisabledGroup(String.IsNullOrEmpty(targetConverter.assetName)); if (GUILayout.Button("Create MeshData")) { MeshDataObject namedAsset = (MeshDataObject)AssetDatabase.LoadAssetAtPath("Assets/" + targetConverter.assetName + ".asset", typeof(MeshDataObject)); if (namedAsset) { targetConverter.showAlreadyUsedError = true; } else { targetConverter.showAlreadyUsedError = false; targetConverter.isAssetNameValid = true; CreateMeshDataObject(targetConverter.assetName); } } EditorGUI.EndDisabledGroup(); if (targetConverter.showAlreadyUsedError) { EditorGUILayout.HelpBox("The asset name is already used", MessageType.Error); } #endregion // #region After Asset name is correctly fed // if(targetConverter.isAssetNameValid){ // } // #endregion } else if (!targetTrans.gameObject.isStatic) { EditorGUILayout.HelpBox("Target Trans is not set static", MessageType.Error); } else if (targetTrans.gameObject.GetComponent <MeshFilter> () == null) { EditorGUILayout.HelpBox("Target Trans does not have a mesh filter component", MessageType.Error); } #endregion } else { EditorGUILayout.HelpBox("No Target Trans assigned", MessageType.Error); } #endregion //Beginning Mesh Data Editor Section EditorGUI.indentLevel = curInd; EditorGUILayout.Space(); EditorGUILayout.LabelField("Mesh Data Editor", headerStyle); EditorGUI.indentLevel++; targetConverter.meshData = (MeshDataObject)EditorGUILayout.ObjectField("MeshData to edit", targetConverter.meshData, typeof(MeshDataObject), false); #region After Mesh Data is assigned if (targetConverter.meshData != null) { serializedMDObj = new UnityEditor.SerializedObject(targetConverter.meshData); serializedMDObj.Update(); targetConverter.isReady = EditorGUILayout.Toggle("Mesh Data ready for scene editing", targetConverter.isReady); #region Zones EditorGUILayout.Space(); EditorGUILayout.LabelField("Mesh Zones", headerStyle); targetConverter.zonesToCreate = EditorGUILayout.IntField("number of zones to create: ", targetConverter.zonesToCreate); Undo.RecordObject(serializedObject.targetObject, "myInspector"); if (targetConverter.zonesToCreate != 0) { if (GUILayout.Button("Create Zones", GUILayout.MaxWidth(200))) { CreateZones(targetConverter.zonesToCreate, targetConverter); } } #region Zone Display if (targetConverter.meshData.meshZones != null && targetConverter.meshData.meshZones.Count != 0) { targetConverter.showAllZones = EditorGUILayout.Foldout(targetConverter.showAllZones, "Show All " + targetConverter.meshData.meshZones.Count.ToString() + " Zones"); if (targetConverter.showAllZones) { for (int i = 0; i < targetConverter.meshData.meshZones.Count; i++) { EditorGUILayout.BeginVertical(); { EditorGUILayout.BeginHorizontal(); { targetConverter.meshData.meshZones [i].showZone = EditorGUILayout.Foldout(targetConverter.meshData.meshZones [i].showZone, targetConverter.meshData.meshZones [i].zoneName); targetConverter.meshData.meshZones [i].zoneColor = EditorGUILayout.ColorField(targetConverter.meshData.meshZones [i].zoneColor); Undo.RecordObject(serializedObject.targetObject, "myInpector"); EditorGUILayout.LabelField("Zone Tris Count: " + targetConverter.meshData.meshZones [i].zoneTris.Count.ToString()); } EditorGUILayout.EndHorizontal(); if (targetConverter.meshData.meshZones [i].showZone) { if (targetConverter.meshData.meshZones [i].zoneTris.Count != 0) { for (int j = 0; j < targetConverter.meshData.meshZones [i].zoneTris.Count; j++) { EditorGUILayout.LabelField(targetConverter.meshData.meshZones [i].zoneTris [j].triName); } } else { EditorGUILayout.HelpBox("There's no zone tris assigned yet", MessageType.Error); } } } EditorGUILayout.EndVertical(); } } } else { EditorGUILayout.HelpBox("There's no zones created", MessageType.Error); } #endregion #endregion #region After mesh zones are correctly set if (targetConverter.meshData.meshZones != null) { #region ActiveZone EditorGUILayout.Space(); EditorGUILayout.LabelField("Active Zone", headerStyle); #region Prev&Next Buttons EditorGUILayout.BeginHorizontal(); { // prev. cur. next EditorGUI.BeginDisabledGroup(targetConverter.activeZoneIndex <= 0); { if (GUILayout.Button("Prev")) { targetConverter.activeZoneIndex--; } } EditorGUI.EndDisabledGroup(); targetConverter.activeZoneIndex = EditorGUILayout.IntField(targetConverter.activeZoneIndex, GUILayout.MaxWidth(50f)); EditorGUILayout.LabelField(" of " + targetConverter.meshData.meshZones.Count.ToString() + " Zones", GUILayout.MaxWidth(100f)); EditorGUI.BeginDisabledGroup(targetConverter.activeZoneIndex >= targetConverter.meshData.meshZones.Count - 1); { if (GUILayout.Button("Next")) { targetConverter.activeZoneIndex++; } } EditorGUI.EndDisabledGroup(); } EditorGUILayout.EndHorizontal(); #endregion if (targetConverter.toolBarStrings != null) { SetActiveZone(GUILayout.Toolbar(targetConverter.activeZoneIndex, targetConverter.toolBarStrings), targetConverter); } if (targetConverter.activeZone != null) { EditorGUILayout.BeginVertical(); { EditorGUILayout.BeginHorizontal(); { EditorGUILayout.LabelField(targetConverter.activeZone.zoneName.ToString(), GUILayout.MaxWidth(100)); EditorGUILayout.ColorField(targetConverter.activeZone.zoneColor, GUILayout.MinWidth(100)); EditorGUILayout.LabelField("active zone tris count: " + targetConverter.activeZone.zoneTris.Count.ToString()); } EditorGUILayout.EndHorizontal(); targetConverter.showActiveZoneTris = EditorGUILayout.Foldout(targetConverter.showActiveZoneTris, "Show All " + targetConverter.activeZone.zoneTris.Count + " active zone tris"); if (targetConverter.showActiveZoneTris) { for (int i = 0; i < targetConverter.activeZone.zoneTris.Count; i++) { EditorGUILayout.LabelField(targetConverter.activeZone.zoneTris [i].triName.ToString()); } } } EditorGUILayout.EndVertical(); } else { EditorGUILayout.HelpBox("Active Zone is not set", MessageType.Error); } #endregion //Creating Adjuscent Zones if (GUILayout.Button("Create Zone Group")) { CreateZoneGroup(targetConverter.meshData); } //Controls for meshData scene display EditorGUILayout.BeginHorizontal(); { if (GUILayout.Button(targetConverter.showAllZoneTris ? "Show All Zone Tris: On" : "Show All Zones Tris: Off", targetConverter.showAllZoneTris ? toggleButtonDown : toggleButtonUp)) { targetConverter.showAllZoneTris = !targetConverter.showAllZoneTris; } if (GUILayout.Button(targetConverter.showNTB ? "Show N, T, B: On" : "Show N, T, B: Off", targetConverter.showNTB ? toggleButtonDown : toggleButtonUp)) { targetConverter.showNTB = !targetConverter.showNTB; } if (GUILayout.Button(targetConverter.showNTB ? "Show AZ Tri: On" : "Show AZ Tri: Off", targetConverter.showAZTrisOnScene ? toggleButtonDown : toggleButtonUp)) { targetConverter.showAZTrisOnScene = !targetConverter.showAZTrisOnScene; } } EditorGUILayout.EndHorizontal(); } #endregion } #endregion } if (EditorGUI.EndChangeCheck()) { serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(serializedObject.targetObject); if (serializedMDObj != null) { serializedMDObj.ApplyModifiedProperties(); EditorUtility.SetDirty(serializedMDObj.targetObject); } } }
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); } }