using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; using qtools.qhierarchy.pcomponent.pbase; using qtools.qhierarchy.phierarchy; using qtools.qhierarchy.pdata; using qtools.qhierarchy.phelper; namespace qtools.qhierarchy.pcomponent { public class QRendererComponent: QBaseComponent { // PRIVATE private Texture2D rendererOn; private Texture2D rendererOff; private Texture2D rendererWireframe; private int targetRendererMode = -1; private Color backgroundColor; // CONSTRUCTOR public QRendererComponent() { rendererWireframe = QResources.getInstance().getTexture(QTexture.QRendererWireframeButton); rendererOn = QResources.getInstance().getTexture(QTexture.QRendererOnButton); rendererOff = QResources.getInstance().getTexture(QTexture.QRendererOffButton); backgroundColor = QResources.getInstance().getColor(QColor.Background); QSettings.getInstance().addEventListener(QSetting.ShowRendererComponent , settingsChanged); QSettings.getInstance().addEventListener(QSetting.ShowRendererComponentDuringPlayMode, settingsChanged); settingsChanged(); } // PRIVATE private void settingsChanged() { enabled = QSettings.getInstance().get(QSetting.ShowRendererComponent); showComponentDuringPlayMode = QSettings.getInstance().get(QSetting.ShowRendererComponentDuringPlayMode); } // DRAW public override void layout(GameObject gameObject, QObjectList objectList, ref Rect rect) { rect.x -= 14; rect.width = 14; } public override void disabledHandler(GameObject gameObject, QObjectList objectList) { if (objectList != null && objectList.wireframeHiddenObjects.Contains(gameObject)) { objectList.wireframeHiddenObjects.Remove(gameObject); Renderer renderer = gameObject.GetComponent(); if (renderer != null) setSelectedRenderState(renderer, false); } } public override void draw(GameObject gameObject, QObjectList objectList, Rect selectionRect, Rect curRect) { Renderer renderer = gameObject.GetComponent(); if (renderer != null) { bool wireframeHiddenObjectsContains = isWireframeHidden(gameObject, objectList); GUI.DrawTexture(curRect, wireframeHiddenObjectsContains ? rendererWireframe : (renderer.enabled ? rendererOn : rendererOff)); } else { EditorGUI.DrawRect(curRect, backgroundColor); } } public override void eventHandler(GameObject gameObject, QObjectList objectList, Event currentEvent, Rect rect) { if (currentEvent.isMouse && currentEvent.button == 0 && rect.Contains(currentEvent.mousePosition)) { Renderer renderer = gameObject.GetComponent(); if (renderer != null) { bool wireframeHiddenObjectsContains = isWireframeHidden(gameObject, objectList); bool isEnabled = renderer.enabled; if (currentEvent.type == EventType.MouseDown) { targetRendererMode = ((!isEnabled) == true ? 1 : 0); } else if (currentEvent.type == EventType.MouseDrag && targetRendererMode != -1) { if (targetRendererMode == (isEnabled == true ? 1 : 0)) return; } else { targetRendererMode = -1; return; } Undo.RecordObject(renderer, "renderer visibility change"); if (currentEvent.control || currentEvent.command) { if (!wireframeHiddenObjectsContains) { setSelectedRenderState(renderer, true); SceneView.RepaintAll(); setWireframeMode(gameObject, objectList, true); } } else { if (wireframeHiddenObjectsContains) { setSelectedRenderState(renderer, false); SceneView.RepaintAll(); setWireframeMode(gameObject, objectList, false); } else { Undo.RecordObject(renderer, isEnabled ? "Disable Component" : "Enable Component"); renderer.enabled = !isEnabled; } } EditorUtility.SetDirty(gameObject); } currentEvent.Use(); } } // PRIVATE public bool isWireframeHidden(GameObject gameObject, QObjectList objectList) { return objectList == null ? false : objectList.wireframeHiddenObjects.Contains(gameObject); } public void setWireframeMode(GameObject gameObject, QObjectList objectList, bool targetWireframe) { if (objectList == null && targetWireframe) objectList = QObjectListManager.getInstance().getObjectList(gameObject, true); if (objectList != null) { Undo.RecordObject(objectList, "Renderer Visibility Change"); if (targetWireframe) objectList.wireframeHiddenObjects.Add(gameObject); else objectList.wireframeHiddenObjects.Remove(gameObject); EditorUtility.SetDirty(objectList); } } static public void setSelectedRenderState(Renderer renderer, bool visible) { #if UNITY_5_5_OR_NEWER EditorUtility.SetSelectedRenderState(renderer, visible ? EditorSelectedRenderState.Wireframe : EditorSelectedRenderState.Hidden); #else EditorUtility.SetSelectedWireframeHidden(renderer, visible); #endif } } }