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 Color activeColor; private Color inactiveColor; private Color specialColor; private Texture2D rendererButtonTexture; private int targetRendererMode = -1; // CONSTRUCTOR public QRendererComponent() { rect.width = 12; rendererButtonTexture = QResources.getInstance().getTexture(QTexture.QRendererButton); QSettings.getInstance().addEventListener(QSetting.RendererShow , settingsChanged); QSettings.getInstance().addEventListener(QSetting.RendererShowDuringPlayMode, settingsChanged); QSettings.getInstance().addEventListener(QSetting.AdditionalActiveColor , settingsChanged); QSettings.getInstance().addEventListener(QSetting.AdditionalInactiveColor , settingsChanged); QSettings.getInstance().addEventListener(QSetting.AdditionalSpecialColor , settingsChanged); settingsChanged(); } // PRIVATE private void settingsChanged() { enabled = QSettings.getInstance().get(QSetting.RendererShow); showComponentDuringPlayMode = QSettings.getInstance().get(QSetting.RendererShowDuringPlayMode); activeColor = QSettings.getInstance().getColor(QSetting.AdditionalActiveColor); inactiveColor = QSettings.getInstance().getColor(QSetting.AdditionalInactiveColor); specialColor = QSettings.getInstance().getColor(QSetting.AdditionalSpecialColor); } // DRAW public override QLayoutStatus layout(GameObject gameObject, QObjectList objectList, Rect selectionRect, ref Rect curRect, float maxWidth) { if (maxWidth < 12) { return QLayoutStatus.Failed; } else { curRect.x -= 12; rect.x = curRect.x; rect.y = curRect.y; return QLayoutStatus.Success; } } 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) { Renderer renderer = gameObject.GetComponent(); if (renderer != null) { bool wireframeHiddenObjectsContains = isWireframeHidden(gameObject, objectList); if (wireframeHiddenObjectsContains) { QColorUtils.setColor(specialColor); GUI.DrawTexture(rect, rendererButtonTexture); QColorUtils.clearColor(); } else if (renderer.enabled) { QColorUtils.setColor(activeColor); GUI.DrawTexture(rect, rendererButtonTexture); QColorUtils.clearColor(); } else { QColorUtils.setColor(inactiveColor); GUI.DrawTexture(rect, rendererButtonTexture); QColorUtils.clearColor(); } } } public override void eventHandler(GameObject gameObject, QObjectList objectList, Event currentEvent) { 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 } } }