void ResetAnalyzedData(MeshEditorData meshEditorData)
    {
        List <int> children = new List <int>();

        GetAllChildren(meshEditorData, ref children);
        ResetAnalyzedData(children);
    }
    Pair <Utilities.SampleSize, float> GetCommonChildrenData(MeshEditorData meshEditorData)
    {
        if (meshEditorData.childrenData.Count == 0)
        {
            return(new Pair <Utilities.SampleSize, float>(meshData[meshEditorData.analyzerMesh].sampleRenderSize, meshData[meshEditorData.analyzerMesh].thresholdAngle));
        }
        Pair <Utilities.SampleSize, float> curr = new Pair <Utilities.SampleSize, float>();

        if (meshEditorData.analyzerMesh != -1)
        {
            curr.first  = meshData[meshEditorData.analyzerMesh].sampleRenderSize;
            curr.second = meshData[meshEditorData.analyzerMesh].thresholdAngle;
        }
        else if (meshEditorData.childrenData.Count > 0)
        {
            curr = GetCommonChildrenData(meshEditorData.childrenData[0]);
        }
        for (int i = 0; i < meshEditorData.childrenData.Count; i++)
        {
            Pair <Utilities.SampleSize, float> child = GetCommonChildrenData(meshEditorData.childrenData[i]);
            if (child.first != curr.first)
            {
                curr.first = (Utilities.SampleSize)(-1);
            }
            if (child.second != curr.second)
            {
                curr.second = float.NaN;
            }
        }
        return(curr);
    }
    void StartAnalyzing(MeshEditorData meshEditorData)
    {
        List <int> children = new List <int>();

        GetAllChildren(meshEditorData, ref children);
        StartAnalyzing(children);
    }
 void Initialize()
 {
     viewButtonImage = Resources.Load("viewButtonImage") as Texture;
     playerPosition  = Camera.main.transform.position;
     root            = new MeshEditorData();
     root.GenerateChildData(UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects());
     meshData = new List <AnalyzerMeshData>();
     GenerateMeshEditorData(root);
     coroutineInProgress = null;
     isAnalyzing         = false;
 }
 void GetAllChildren(MeshEditorData meshEditorData, ref List <int> analyzerMeshes)
 {
     if (meshEditorData.analyzerMesh != -1)
     {
         analyzerMeshes.Add(meshEditorData.analyzerMesh);
     }
     for (int i = 0; i < meshEditorData.childrenData.Count; i++)
     {
         GetAllChildren(meshEditorData.childrenData[i], ref analyzerMeshes);
     }
 }
 void UpdateAllChildrenThreshold(MeshEditorData meshEditorData, float threshold)
 {
     if (meshEditorData.analyzerMesh != -1)
     {
         meshData[meshEditorData.analyzerMesh].thresholdAngle = threshold;
     }
     for (int i = 0; i < meshEditorData.childrenData.Count; i++)
     {
         UpdateAllChildrenThreshold(meshEditorData.childrenData[i], threshold);
     }
 }
 void UpdateAllChildrenSampleSize(MeshEditorData meshEditorData, Utilities.SampleSize sampleSize)
 {
     if (meshEditorData.analyzerMesh != -1)
     {
         meshData[meshEditorData.analyzerMesh].sampleRenderSize = sampleSize;
     }
     for (int i = 0; i < meshEditorData.childrenData.Count; i++)
     {
         UpdateAllChildrenSampleSize(meshEditorData.childrenData[i], sampleSize);
     }
 }
 void GenerateMeshEditorData(MeshEditorData root)
 {
     if (root.gameObject != null && root.gameObject.GetComponent <MeshFilter>() != null)
     {
         meshData.Add(new AnalyzerMeshData(root.gameObject.GetComponent <MeshFilter>(), Utilities.SampleSize._128, 20));
         root.analyzerMesh = meshData.Count - 1;
     }
     for (int i = 0; i < root.childrenData.Count; i++)
     {
         GenerateMeshEditorData(root.childrenData[i]);
     }
 }
 bool IsChildrenOptimized(MeshEditorData meshEditorData)
 {
     if (meshEditorData.analyzerMesh != -1)
     {
         if (meshData[meshEditorData.analyzerMesh].OptimizedMesh == null)
         {
             return(false);
         }
     }
     for (int i = 0; i < meshEditorData.childrenData.Count; i++)
     {
         if (!IsChildrenOptimized(meshEditorData.childrenData[i]))
         {
             return(false);
         }
     }
     return(true);
 }
 public void GenerateChildData(Transform[] childrenTransforms)
 {
     foreach (Transform child in childrenTransforms)
     {
         if (!child.gameObject.activeInHierarchy)
         {
             continue;
         }
         MeshEditorData childMeshData = new MeshEditorData(child.transform);
         Transform[]    childChildren = new Transform[child.childCount];
         for (int i = 0; i < childChildren.Length; i++)
         {
             childChildren[i] = child.GetChild(i);
         }
         childMeshData.GenerateChildData(childChildren);
         if ((childMeshData.current != null && childMeshData.current.GetComponent <MeshFilter>() != null) || childMeshData.children.Count > 0)
         {
             this.children.Add(childMeshData);
         }
     }
 }
 void MeshDataGUI(MeshEditorData meshEditorData, bool foldout = true)
 {
     if (meshEditorData.gameObject != null)
     {
         if (meshEditorData.analyzerMesh != -1)
         {
             if (meshData[meshEditorData.analyzerMesh].AnalyzedMesh == null)
             {
                 isAnalyzed = false;
             }
             if (meshData[meshEditorData.analyzerMesh].OptimizedMesh == null)
             {
                 isOptimized = false;
             }
         }
         if (foldout)
         {
             EditorGUILayout.BeginHorizontal();
             if (GUILayout.Button(viewButtonImage, EditorStyles.label, GUILayout.Width(15), GUILayout.Height(15)))
             {
                 EditorGUIUtility.PingObject(meshEditorData.gameObject);
                 Selection.activeGameObject = meshEditorData.gameObject;
             }
             if (meshEditorData.childrenData.Count > 0)
             {
                 bool foldoutStatus = EditorGUILayout.Foldout(meshEditorData.foldout, meshEditorData.gameObject.name);
                 if (foldoutStatus != meshEditorData.foldout)
                 {
                     meshEditorData.foldout = foldoutStatus;
                     Pair <Utilities.SampleSize, float> data = GetCommonChildrenData(meshEditorData);
                     meshEditorData.sampleRenderSize = data.first;
                     meshEditorData.thresholdAngle   = data.second;
                 }
             }
             else
             {
                 EditorGUILayout.LabelField(meshEditorData.gameObject.name);
             }
             //GUILayout.FlexibleSpace();
             //GUILayout.FlexibleSpace();
             if (!isAnalyzing)
             {
                 if (!meshEditorData.foldout)
                 {
                     if (!IsChildrenAnalyzed(meshEditorData))
                     {
                         Utilities.SampleSize sampleSizeStatus =
                             (Utilities.SampleSize)EditorGUILayout.EnumPopup(meshEditorData.sampleRenderSize, GUILayout.Width(100));
                         if (sampleSizeStatus != meshEditorData.sampleRenderSize)
                         {
                             meshEditorData.sampleRenderSize = sampleSizeStatus;
                             UpdateAllChildrenSampleSize(meshEditorData, sampleSizeStatus);
                         }
                         if (GUILayout.Button("Analyze Children", GUILayout.Width(150)))
                         {
                             StartAnalyzing(meshEditorData);
                         }
                     }
                     else if (!IsChildrenOptimized(meshEditorData))
                     {
                         float thresholdStatus = EditorGUILayout.FloatField(meshEditorData.thresholdAngle, GUILayout.Width(100));
                         if (thresholdStatus != meshEditorData.thresholdAngle)
                         {
                             meshEditorData.thresholdAngle = thresholdStatus;
                             UpdateAllChildrenThreshold(meshEditorData, thresholdStatus);
                         }
                         if (GUILayout.Button("Reanalyze Children", GUILayout.Width(150)))
                         {
                             ResetAnalyzedData(meshEditorData);
                         }
                         if (GUILayout.Button("Optimize Children", GUILayout.Width(150)))
                         {
                             StartOptimizing(meshEditorData);
                         }
                     }
                     else
                     {
                         if (GUILayout.Button("Revert Children", GUILayout.Width(150)))
                         {
                             ResetOptimizedData(meshEditorData);
                         }
                     }
                 }
                 else if (meshEditorData.analyzerMesh != -1)
                 {
                     if (meshData[meshEditorData.analyzerMesh].AnalyzedMesh == null)
                     {
                         Utilities.SampleSize sampleSizeStatus =
                             (Utilities.SampleSize)EditorGUILayout.EnumPopup(meshData[meshEditorData.analyzerMesh].sampleRenderSize, GUILayout.Width(100));
                         if (!meshEditorData.foldout)
                         {
                             if (sampleSizeStatus != meshData[meshEditorData.analyzerMesh].sampleRenderSize)
                             {
                                 UpdateAllChildrenSampleSize(meshEditorData, sampleSizeStatus);
                             }
                         }
                         meshData[meshEditorData.analyzerMesh].sampleRenderSize = sampleSizeStatus;
                         if (GUILayout.Button("Analyze", GUILayout.Width(150)))
                         {
                             StartAnalyzing(new List <int>()
                             {
                                 meshEditorData.analyzerMesh
                             });
                         }
                     }
                     else if (meshData[meshEditorData.analyzerMesh].OptimizedMesh == null)
                     {
                         float thresholdStatus =
                             EditorGUILayout.FloatField(meshData[meshEditorData.analyzerMesh].thresholdAngle, GUILayout.Width(100));
                         if (!meshEditorData.foldout)
                         {
                             if (thresholdStatus != meshData[meshEditorData.analyzerMesh].thresholdAngle)
                             {
                                 UpdateAllChildrenThreshold(meshEditorData, thresholdStatus);
                             }
                         }
                         meshData[meshEditorData.analyzerMesh].thresholdAngle = thresholdStatus;
                         if (GUILayout.Button("Reanalyze", GUILayout.Width(150)))
                         {
                             ResetAnalyzedData(new List <int>()
                             {
                                 meshEditorData.analyzerMesh
                             });
                         }
                         if (GUILayout.Button("Optimize", GUILayout.Width(150)))
                         {
                             StartOptimizing(new List <int>()
                             {
                                 meshEditorData.analyzerMesh
                             });
                         }
                     }
                     else
                     {
                         if (GUILayout.Button("Revert", GUILayout.Width(150)))
                         {
                             ResetOptimizedData(new List <int>()
                             {
                                 meshEditorData.analyzerMesh
                             });
                         }
                     }
                 }
             }
             EditorGUILayout.EndHorizontal();
         }
     }
     EditorGUI.indentLevel++;
     for (int i = 0; i < meshEditorData.childrenData.Count; i++)
     {
         MeshDataGUI(meshEditorData.childrenData[i], foldout && meshEditorData.foldout);
     }
     EditorGUI.indentLevel--;
 }