void OnEnable() { if (!PrefUtility.VersionCheck()) { PrefUtility.ClearPrefs(); } PolyEditor.s_Instance = this; // Editor window setup titleContent = new GUIContent("Polybrush"); wantsMouseMove = true; minSize = k_EditorWindowMinimumSize; m_BrushMirrorEditor = new MirrorSettingsEditor(); #if PROBUILDER_4_0_OR_NEWER if (ProBuilderBridge.ProBuilderExists()) { ProBuilderBridge.SubscribeToSelectModeChanged(OnProBuilderSelectModeChanged); } #endif m_GCToolmodeIcons = new GUIContent[] { EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/Sculpt"), "Sculpt on meshes"), EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/Smooth"), "Smooth mesh geometry"), EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/PaintVertexColors"), "Paint vertex colors on meshes"), EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/PaintPrefabs"), "Scatter Prefabs on meshes"), EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/PaintTextures"), "Paint textures on meshes"), }; #if UNITY_2019_1_OR_NEWER SceneView.duringSceneGui += OnSceneGUI; #else SceneView.onSceneGUIDelegate += OnSceneGUI; #endif Undo.undoRedoPerformed += UndoRedoPerformed; // force update the preview m_LastHoveredGameObject = null; EnsureBrushSettingsListIsValid(); SetTool(BrushTool.RaiseLower, false); Selection.selectionChanged -= OnSelectionChanged; Selection.selectionChanged += OnSelectionChanged; }
private static void RemovedDeletedPrefabFromloadout() { // If the prefab paint mode is the current one in polybrush, // and the prefab that has just been deleted is in the loadout, // Need to remove it from there or error spam will occur PolyEditor editor = PolyEditor.instance; if (editor == null || editor.tool != BrushTool.Prefab) { return; } BrushModePrefab brushMode = (BrushModePrefab)editor.mode; PrefabLoadoutEditor loadouteditor = brushMode.prefabLoadoutEditor; if (loadouteditor == null) { return; } List <LoadoutInfo> toRemove = new List <LoadoutInfo>(); foreach (LoadoutInfo info in loadouteditor.CurrentLoadout) { if (info.prefab == null) { toRemove.Add(info); } } foreach (LoadoutInfo info in toRemove) { loadouteditor.RemovePrefabFromLoadout(info); } // Clear the list of selected items in the current PrefabPalette // NOTE: This is not ideal, but it's easier to make it this way for now // a solution would be to keep a reference to the deleted items before deleting them // then make a comparison with the new list, to keep selected only the ones that were // not deleted and refresh the indices of the selected list loadouteditor.prefabPaletteEditors[loadouteditor.currentPalette].selected.Clear(); }
internal void Update(Event e) { if (e.type == EventType.Layout) { m_IsBetweenRepaint = true; } else if (e.type == EventType.Repaint) { m_IsBetweenRepaint = false; } if (!m_WantsUpdate || m_IsBetweenRepaint) { return; } m_WantsUpdate = false; m_Status = m_QueuedStatus; m_SourceIndex = m_QueuedSourceIndex; m_DestinationIndex = m_QueuedDestinationIndex; PolyEditor.DoRepaint(); }
public override void OnInspectorGUI() { if (s_StyleForColorSwatch == null) { GenerateStaticGUIStyle(); } Event e = Event.current; serializedObject.Update(); Color current = m_CurrentProperty.colorValue; EditorGUI.BeginChangeCheck(); current = EditorGUILayout.ColorField(current); if (EditorGUI.EndChangeCheck()) { SetCurrent(current); } int swatchSize = 12; int viewWidth = (int)EditorGUIUtility.currentViewWidth - 12; int swatchesPerRow = viewWidth / swatchSize; swatchSize += (viewWidth % swatchSize) / swatchesPerRow; int mouseOverIndex = k_DragOverNull; int index = 0; int arraySize = m_ColorsProperty.arraySize; int arraySizeWithAdd = m_ColorsProperty.arraySize + 1; using (new GUILayout.HorizontalScope()) { for (int i = 0; i < arraySizeWithAdd; i++) { bool isColorSwatch = i < arraySize; bool isActiveDrag = m_Drag.status == DragState.Status.Dragging && m_Drag.destinationIndex == i && i != arraySizeWithAdd - 1; SerializedProperty swatch = isColorSwatch ? m_ColorsProperty.GetArrayElementAtIndex(i) : null; Rect swatchRect = new Rect(-1f, -1f, 0f, 0f); if (isActiveDrag) { GUILayout.Space(swatchSize + 4); index = IncrementIndex(index, swatchesPerRow); } if (isColorSwatch) { GUI.backgroundColor = swatch.colorValue; if (m_Drag.status != DragState.Status.Dragging || i != m_Drag.sourceIndex) { GUILayout.Label("", s_StyleForColorSwatch, GUILayout.MinWidth(swatchSize), GUILayout.MaxWidth(swatchSize), GUILayout.MinHeight(swatchSize), GUILayout.MaxHeight(swatchSize));; swatchRect = GUILayoutUtility.GetLastRect(); index = IncrementIndex(index, swatchesPerRow); } } else { if (m_Drag.status != DragState.Status.Dragging) { GUI.backgroundColor = current; EditorGUIUtility.SetIconSize(new Vector2(10, 11)); if (GUILayout.Button(m_GCAddColorSwatch, s_StyleForColorSwatch, GUILayout.MinWidth(swatchSize), GUILayout.MaxWidth(swatchSize), GUILayout.Height(swatchSize), GUILayout.MaxHeight(swatchSize))) { m_ColorsProperty.arraySize++; SerializedProperty added = m_ColorsProperty.GetArrayElementAtIndex(m_ColorsProperty.arraySize - 1); added.colorValue = current; } } else { GUILayout.FlexibleSpace(); GUILayout.Label(m_GCRemoveSwatch); } swatchRect = GUILayoutUtility.GetLastRect(); index = IncrementIndex(index, swatchesPerRow); } GUI.backgroundColor = Color.white; if (swatchRect.Contains(e.mousePosition)) { if (m_Drag.status == DragState.Status.Dragging) { mouseOverIndex = i >= m_Drag.destinationIndex ? i + 1 : i; } else { mouseOverIndex = i; } if (i == arraySize) { mouseOverIndex = k_DragOverTrash; } if (e.type == EventType.MouseDrag) { if (m_Drag.status == DragState.Status.Ready && isColorSwatch) { e.Use(); m_Drag.Init(mouseOverIndex, m_ColorsProperty.GetArrayElementAtIndex(mouseOverIndex), swatchRect.position - e.mousePosition); } else if (m_Drag.status == DragState.Status.Dragging) { m_Drag.destinationIndex = mouseOverIndex; } } else if (e.type == EventType.MouseUp && m_Drag.status != DragState.Status.Dragging && isColorSwatch) { if (onSelectIndex != null) { SetCurrent(swatch.colorValue); } } } } } // If drag was previously over the trash bin but has moved, reset the index to be over the last array entry // instead. if (e.type == EventType.MouseDrag && m_Drag.status == DragState.Status.Dragging && mouseOverIndex == k_DragOverNull && m_Drag.destinationIndex == k_DragOverTrash) { m_Drag.destinationIndex = arraySize; } bool dragIsOverTrash = m_Drag.destinationIndex == k_DragOverTrash; if (m_Drag.status == DragState.Status.Dragging && m_Drag.swatch != null) { Rect r = new Rect(e.mousePosition.x + m_Drag.offset.x, e.mousePosition.y + m_Drag.offset.y, swatchSize, swatchSize); GUI.backgroundColor = m_Drag.swatch.colorValue; GUI.Label(r, "", s_StyleForColorSwatch); GUI.backgroundColor = Color.white; PolyEditor.DoRepaint(); Repaint(); } switch (e.type) { case EventType.MouseUp: { if (m_Drag.status == DragState.Status.Dragging) { if (m_Drag.destinationIndex != k_DragOverNull) { if (dragIsOverTrash) { m_ColorsProperty.DeleteArrayElementAtIndex(m_Drag.sourceIndex); } else { m_ColorsProperty.MoveArrayElement(m_Drag.sourceIndex, m_Drag.destinationIndex > m_Drag.sourceIndex ? m_Drag.destinationIndex - 1 : m_Drag.destinationIndex); } } } m_Drag.Reset(); PolyEditor.DoRepaint(); Repaint(); } break; } GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); serializedObject.ApplyModifiedProperties(); m_Drag.Update(e); }
/// <summary> /// Draw everything concerning a single Prefab Palette in the Polybrush Window /// </summary> /// <param name="thumbSize">size of the preview textures</param> internal void OnInspectorGUI_Internal(int thumbSize) { EditorGUILayout.LabelField(m_GCCurrentPaletteLabel); serializedObject.Update(); int count = prefabs != null ? prefabs.arraySize : 0; Rect dropDownZone = EditorGUILayout.BeginVertical(paletteStyle); Rect backGroundRect = new Rect(dropDownZone); dropDownZone.width = EditorGUIUtility.currentViewWidth; if (count != 0) { const int margin_x = 8; const int pad = 4; int size = thumbSize + pad; int container_width = (int)Mathf.Floor(EditorGUIUtility.currentViewWidth) - (margin_x * 2); int columns = (int)Mathf.Floor(container_width / size); int rows = count / columns + (count % columns == 0 ? 0 : 1); if (rows < 1) { rows = 1; } backGroundRect.x += 8; backGroundRect.y += 4; backGroundRect.width -= 16; backGroundRect.height = 8 + rows * thumbSize + (rows - 1) * pad; EditorGUI.DrawRect(backGroundRect, EditorGUIUtility.isProSkin ? PolyGUI.k_BoxBackgroundDark : PolyGUI.k_BoxBackgroundLight); int currentIndex = 0; for (int i = 0; i < rows; i++) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(pad); for (int j = 0; j < columns; j++) { var prefab = prefabs.GetArrayElementAtIndex(currentIndex); DrawPrefabPreview(prefab, currentIndex, thumbSize); if (j != columns - 1) { GUILayout.Space(pad); } currentIndex++; if (currentIndex >= count) { break; } } EditorGUILayout.EndHorizontal(); GUILayout.Space(pad); } EditorGUILayout.EndVertical(); if (selected.Count > 0) { EditorGUILayout.LabelField(m_GCPlacementSettingsLabel); GUILayout.Space(pad); } EditorGUILayout.BeginVertical(); foreach (var i in selected) { DrawSinglePrefabPlacementSettings(prefabs.GetArrayElementAtIndex(i), i); } /// Little Hack to get the Rect for dropping new prefabs Rect endDropDownZone = EditorGUILayout.BeginVertical(); dropDownZone.height = endDropDownZone.y - dropDownZone.y; EditorGUILayout.EndVertical(); } else { dropDownZone.height = thumbSize; var r = EditorGUILayout.BeginVertical(GUILayout.Height(thumbSize)); EditorGUI.DrawRect(r, EditorGUIUtility.isProSkin ? PolyGUI.k_BoxBackgroundDark : PolyGUI.k_BoxBackgroundLight); GUILayout.FlexibleSpace(); if (GUI.skin.name.Contains("polybrush")) { GUI.Label(dropDownZone, "Drag Prefabs Here!", "dragprefablabel"); } else { GUI.Label(dropDownZone, "Drag Prefabs Here!", EditorStyles.centeredGreyMiniLabel); } GUILayout.FlexibleSpace(); EditorGUILayout.EndVertical(); } EditorGUILayout.EndVertical(); Event e = Event.current; if (dropDownZone.Contains(e.mousePosition) && (e.type == EventType.DragUpdated || e.type == EventType.DragPerform) && DragAndDrop.objectReferences.Length > 0) { if (PolyEditorUtility.ContainsPrefabAssets(DragAndDrop.objectReferences)) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; } else { DragAndDrop.visualMode = DragAndDropVisualMode.Rejected; } if (e.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); IEnumerable <GameObject> dragAndDropReferences = DragAndDrop.objectReferences .Where(x => x is GameObject && PolyEditorUtility.IsPrefabAsset(x)).Cast <GameObject>(); foreach (GameObject go in dragAndDropReferences) { prefabs.InsertArrayElementAtIndex(prefabs.arraySize); SerializedProperty last = prefabs.GetArrayElementAtIndex(prefabs.arraySize - 1); SerializedProperty gameObject = last.FindPropertyRelative("gameObject"); gameObject.objectReferenceValue = go; PlacementSettings.PopulateSerializedProperty(last.FindPropertyRelative("settings")); last.FindPropertyRelative("name").stringValue = go.name; } } } if (e.type == EventType.KeyUp) { if (IsDeleteKey(e) && !GUI.GetNameOfFocusedControl().Contains("cancelbackspace")) { PrefabPalette t = target as PrefabPalette; t.RemoveRange(selected.ToArray()); selected.Clear(); if (onSelectionChanged != null) { onSelectionChanged(null); } PolyEditor.DoRepaint(); } } serializedObject.ApplyModifiedProperties(); redrawCounter += 1; }
void OnEnable() { if (!PrefUtility.VersionCheck()) { PrefUtility.ClearPrefs(); } PolyEditor.s_Instance = this; // Editor window setup titleContent = new GUIContent("Polybrush"); wantsMouseMove = true; minSize = k_EditorWindowMinimumSize; m_BrushMirrorEditor = new MirrorSettingsEditor(); #if PROBUILDER_4_0_OR_NEWER if (ProBuilderBridge.ProBuilderExists()) { ProBuilderBridge.SubscribeToSelectModeChanged(OnProBuilderSelectModeChanged); } #endif m_GCToolmodeIcons = new GUIContent[] { EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/Sculpt"), "Sculpt on meshes"), EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/Smooth"), "Smooth mesh geometry"), EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/PaintVertexColors"), "Paint vertex colors on meshes"), EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/PaintPrefabs"), "Scatter Prefabs on meshes"), EditorGUIUtility.TrIconContent(IconUtility.GetIcon("Toolbar/PaintTextures"), "Paint textures on meshes"), }; #if UNITY_2019_1_OR_NEWER SceneView.duringSceneGui += OnSceneGUI; #else SceneView.onSceneGUIDelegate += OnSceneGUI; #endif Undo.undoRedoPerformed += UndoRedoPerformed; // force update the preview m_LastHoveredGameObject = null; if (brushSettings == null) { if (brushSettingsAsset == null) { brushSettingsAsset = AssetDatabase.LoadAssetAtPath <BrushSettings>(AssetDatabase.GUIDToAssetPath(EditorPrefs.GetString(k_BrushSettingsAssetPref, ""))); } if (EditorPrefs.HasKey(k_BrushSettingsPref)) { brushSettings = ScriptableObject.CreateInstance <BrushSettings>(); JsonUtility.FromJsonOverwrite(EditorPrefs.GetString(k_BrushSettingsPref), brushSettings); if (EditorPrefs.HasKey(k_BrushSettingsName)) { brushSettings.name = EditorPrefs.GetString(k_BrushSettingsName); } } else { SetBrushSettings(brushSettingsAsset != null ? brushSettingsAsset : PolyEditorUtility.GetFirstOrNew <BrushSettings>()); } } RefreshAvailableBrushes(); SetTool(BrushTool.RaiseLower, false); Selection.selectionChanged -= OnSelectionChanged; Selection.selectionChanged += OnSelectionChanged; }