using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; using qtools.qhierarchy.pcomponent.pbase; using qtools.qhierarchy.pdata; namespace qtools.qhierarchy.pcomponent { public class QVerticesAndTrianglesCountComponent: QBaseComponent { // PRIVATE private GUIStyle labelStyle; private Color verticesLabelColor; private Color trianglesLabelColor; private bool calculateTotalCount; private bool showTrianglesCount; private bool showVerticesCount; private QHierarchySize labelSize; // CONSTRUCTOR public QVerticesAndTrianglesCountComponent () { labelStyle = new GUIStyle(); labelStyle.clipping = TextClipping.Clip; labelStyle.alignment = TextAnchor.MiddleRight; QSettings.getInstance().addEventListener(QSetting.VerticesAndTrianglesShow , settingsChanged); QSettings.getInstance().addEventListener(QSetting.VerticesAndTrianglesShowDuringPlayMode , settingsChanged); QSettings.getInstance().addEventListener(QSetting.VerticesAndTrianglesCalculateTotalCount , settingsChanged); QSettings.getInstance().addEventListener(QSetting.VerticesAndTrianglesShowTriangles , settingsChanged); QSettings.getInstance().addEventListener(QSetting.VerticesAndTrianglesShowVertices , settingsChanged); QSettings.getInstance().addEventListener(QSetting.VerticesAndTrianglesLabelSize , settingsChanged); QSettings.getInstance().addEventListener(QSetting.VerticesAndTrianglesVerticesLabelColor , settingsChanged); QSettings.getInstance().addEventListener(QSetting.VerticesAndTrianglesTrianglesLabelColor , settingsChanged); settingsChanged(); } // PRIVATE private void settingsChanged() { enabled = QSettings.getInstance().get(QSetting.VerticesAndTrianglesShow); showComponentDuringPlayMode = QSettings.getInstance().get(QSetting.VerticesAndTrianglesShowDuringPlayMode); calculateTotalCount = QSettings.getInstance().get(QSetting.VerticesAndTrianglesCalculateTotalCount); showTrianglesCount = QSettings.getInstance().get(QSetting.VerticesAndTrianglesShowTriangles); showVerticesCount = QSettings.getInstance().get(QSetting.VerticesAndTrianglesShowVertices); verticesLabelColor = QSettings.getInstance().getColor(QSetting.VerticesAndTrianglesVerticesLabelColor); trianglesLabelColor = QSettings.getInstance().getColor(QSetting.VerticesAndTrianglesTrianglesLabelColor); labelSize = (QHierarchySize)QSettings.getInstance().get(QSetting.VerticesAndTrianglesLabelSize); #if UNITY_2019_1_OR_NEWER labelStyle.fontSize = labelSize == QHierarchySize.Big ? 7 : 6; rect.width = labelSize == QHierarchySize.Big ? 24 : 22; #else labelStyle.fontSize = labelSize == QHierarchySize.Big ? 9 : 8; rect.width = labelSize == QHierarchySize.Big ? 33 : 25; #endif } // DRAW public override QLayoutStatus layout(GameObject gameObject, QObjectList objectList, Rect selectionRect, ref Rect curRect, float maxWidth) { if (maxWidth < rect.width) { return QLayoutStatus.Failed; } else { curRect.x -= rect.width + 2; rect.x = curRect.x; rect.y = curRect.y; #if UNITY_2019_1_OR_NEWER rect.y += labelSize == QHierarchySize.Big ? 2 : 1; #endif return QLayoutStatus.Success; } } public override void draw(GameObject gameObject, QObjectList objectList, Rect selectionRect) { int vertexCount = 0; int triangleCount = 0; MeshFilter[] meshFilterArray = calculateTotalCount ? gameObject.GetComponentsInChildren(true) : gameObject.GetComponents(); for (int i = 0; i < meshFilterArray.Length; i++) { Mesh sharedMesh = meshFilterArray[i].sharedMesh; if (sharedMesh != null) { if (showVerticesCount) vertexCount += sharedMesh.vertexCount; if (showTrianglesCount) triangleCount += sharedMesh.triangles.Length; } } SkinnedMeshRenderer[] skinnedMeshRendererArray = calculateTotalCount ? gameObject.GetComponentsInChildren(true) : gameObject.GetComponents(); for (int i = 0; i < skinnedMeshRendererArray.Length; i++) { Mesh sharedMesh = skinnedMeshRendererArray[i].sharedMesh; if (sharedMesh != null) { if (showVerticesCount) vertexCount += sharedMesh.vertexCount; if (showTrianglesCount) triangleCount += sharedMesh.triangles.Length; } } triangleCount /= 3; if (vertexCount > 0 || triangleCount > 0) { if (showTrianglesCount && showVerticesCount) { rect.y -= 4; labelStyle.normal.textColor = verticesLabelColor; EditorGUI.LabelField(rect, getCountString(vertexCount), labelStyle); rect.y += 8; labelStyle.normal.textColor = trianglesLabelColor; EditorGUI.LabelField(rect, getCountString(triangleCount), labelStyle); } else if (showVerticesCount) { labelStyle.normal.textColor = verticesLabelColor; EditorGUI.LabelField(rect, getCountString(vertexCount), labelStyle); } else { labelStyle.normal.textColor = trianglesLabelColor; EditorGUI.LabelField(rect, getCountString(triangleCount), labelStyle); } } } // PRIVATE private string getCountString(int count) { if (count < 1000) return count.ToString(); else if (count < 1000000) { if (count > 100000) return (count / 1000.0f).ToString("0") + "k"; else return (count / 1000.0f).ToString("0.0") + "k"; } else { if (count > 10000000) return (count / 1000.0f).ToString("0") + "M"; else return (count / 1000000.0f).ToString("0.0") + "M"; } } } }