private static void _bakeAllChildMeshBakers(UnityEngine.Object target, ref SerializedObject grouper) { MB3_MeshBakerGrouper tbg = (MB3_MeshBakerGrouper)target; MB3_TextureBaker tb = tbg.GetComponent <MB3_TextureBaker>(); try { MB3_MeshBakerCommon[] mBakers = tbg.GetComponentsInChildren <MB3_MeshBakerCommon>(); for (int i = 0; i < mBakers.Length; i++) { bool createdDummyMaterialBakeResult; if (grouper.targetObject == tbg) { MB3_MeshBakerEditorFunctions.BakeIntoCombined(mBakers[i], out createdDummyMaterialBakeResult, ref grouper); } else { MB3_MeshBakerEditorFunctions.BakeIntoCombined(mBakers[i], out createdDummyMaterialBakeResult); } } } catch (Exception ex) { Debug.LogError(ex.Message + "\n" + ex.StackTrace.ToString()); } finally { EditorUtility.ClearProgressBar(); } }
private static void _enableDisableRenderers(UnityEngine.Object target, bool enableRenderers) { MB3_MeshBakerGrouper tbg = (MB3_MeshBakerGrouper)target; MB3_TextureBaker tb = tbg.GetComponent <MB3_TextureBaker>(); try { MB3_MeshBakerCommon[] mBakers = tbg.GetComponentsInChildren <MB3_MeshBakerCommon>(); for (int i = 0; i < mBakers.Length; i++) { mBakers[i].EnableDisableSourceObjectRenderers(enableRenderers); } } catch (Exception ex) { Debug.LogError(ex.Message + "\n" + ex.StackTrace.ToString()); } finally { EditorUtility.ClearProgressBar(); } }
private static void _generateMeshBakers(UnityEngine.Object target) { MB3_MeshBakerGrouper tbg = (MB3_MeshBakerGrouper)target; MB3_TextureBaker tb = tbg.GetComponent <MB3_TextureBaker>(); if (tb == null) { Debug.LogError("There must be an MB3_TextureBaker attached to this game object."); return; } if (tb.GetObjectsToCombine().Count == 0) { Debug.LogError("The MB3_MeshBakerGrouper creates clusters based on the objects to combine in the MB3_TextureBaker component. There were no objects in this list."); return; } if (tbg.parentSceneObject == null || !MB_Utility.IsSceneInstance(tbg.parentSceneObject.gameObject)) { GameObject g = new GameObject("CombinedMeshes-" + tbg.name); tbg.parentSceneObject = g.transform; } //check if any of the objes that will be added to bakers already exist in child bakers List <GameObject> objsWeAreGrouping = tb.GetObjectsToCombine(); MB3_MeshBakerCommon[] alreadyExistBakers = tbg.GetComponentsInChildren <MB3_MeshBakerCommon>(); bool foundChildBakersWithObjsToCombine = false; for (int i = 0; i < alreadyExistBakers.Length; i++) { List <GameObject> childOjs2Combine = alreadyExistBakers[i].GetObjectsToCombine(); for (int j = 0; j < childOjs2Combine.Count; j++) { if (childOjs2Combine[j] != null && objsWeAreGrouping.Contains(childOjs2Combine[j])) { foundChildBakersWithObjsToCombine = true; break; } } } bool proceed = true; if (foundChildBakersWithObjsToCombine) { proceed = EditorUtility.DisplayDialog("Replace Previous Generated Bakers", "Delete child bakers?\n\n" + "This grouper has child Mesh Baker objects from a previous clustering. Do you want to delete these and create new ones?", "OK", "Cancel"); } if (tbg.prefabOptions_autoGeneratePrefabs) { if (!MB_BatchPrefabBakerEditorFunctions.ValidateFolderIsInProject("Output Folder", tbg.prefabOptions_outputFolder)) { Debug.LogError("If " + gc_prefabOptions_autoGeneratePrefabs.text + " is enabled, you must provide an output folder. Prefabs will be saved in this folder."); proceed = false; } } if (proceed) { if (foundChildBakersWithObjsToCombine) { tbg.DeleteAllChildMeshBakers(); } List <MB3_MeshBakerCommon> newBakers = tbg.grouper.DoClustering(tb, tbg); if (newBakers.Count > 0) { DoGeneratePrefabsIfNecessary(tbg, newBakers); } } }
public void DrawGrouperInspector() { EditorGUILayout.HelpBox("This component helps you group meshes that are close together so they can be combined together." + " It generates multiple MB3_MeshBaker objects from the List Of Objects to be combined in the MB3_TextureBaker component." + " Objects that are close together will be grouped together and added to a new child MB3_MeshBaker object.\n\n" + " TIP: Try the new agglomerative cluster type. It's awsome!", MessageType.Info); MB3_MeshBakerGrouper tbg = (MB3_MeshBakerGrouper)target; MB3_TextureBaker tb = tbg.GetComponent <MB3_TextureBaker>(); Transform pgo = (Transform)EditorGUILayout.ObjectField(gc_ParentSceneObject, parentSceneObject.objectReferenceValue, typeof(Transform), true); if (pgo != null && MB_Utility.IsSceneInstance(pgo.gameObject)) { parentSceneObject.objectReferenceValue = pgo; } else { parentSceneObject.objectReferenceValue = null; } EditorGUILayout.PropertyField(clusterType, gc_ClusterType); MB3_MeshBakerGrouper.ClusterType gg = (MB3_MeshBakerGrouper.ClusterType)clusterType.enumValueIndex; if ((gg == MB3_MeshBakerGrouper.ClusterType.none && !(tbg.grouper is MB3_MeshBakerGrouperNone)) || (gg == MB3_MeshBakerGrouper.ClusterType.grid && !(tbg.grouper is MB3_MeshBakerGrouperGrid)) || (gg == MB3_MeshBakerGrouper.ClusterType.pie && !(tbg.grouper is MB3_MeshBakerGrouperPie)) || (gg == MB3_MeshBakerGrouper.ClusterType.agglomerative && !(tbg.grouper is MB3_MeshBakerGrouperCluster)) ) { tbg.CreateGrouper(gg, tbg.data); tbg.clusterType = gg; } if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.grid) { EditorGUILayout.PropertyField(gridOrigin, gc_GridOrigin); EditorGUILayout.PropertyField(cellSize, gc_CellSize); } else if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.pie) { EditorGUILayout.PropertyField(gridOrigin, gc_GridOrigin); EditorGUILayout.PropertyField(numSegments, gc_NumSegements); EditorGUILayout.PropertyField(pieAxis, gc_PieAxis); EditorGUILayout.PropertyField(pieRingSpacing, gc_PieRingSpacing); EditorGUILayout.PropertyField(pieCombineAllInCenterRing, gc_PieCombineAllInCenterRing); } else if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.agglomerative) { float dist = clusterDistance.floatValue; float maxDist = 100f; float minDist = .000001f; MB3_MeshBakerGrouperCluster cl = null; if (tbg.grouper is MB3_MeshBakerGrouperCluster) { cl = (MB3_MeshBakerGrouperCluster)tbg.grouper; maxDist = cl._ObjsExtents; minDist = cl._minDistBetweenClusters; if (dist < minDist) { dist = Mathf.Lerp(minDist, maxDist, .11f); } } dist = EditorGUILayout.Slider(gc_ClusterDistance, dist, minDist, maxDist); clusterDistance.floatValue = dist; string btnName = "Refresh Clusters"; if (cl.cluster == null || cl.cluster.clusters == null || cl.cluster.clusters.Length == 0) { btnName = "Click To Build Clusters"; } if (GUILayout.Button(btnName)) { if (tbg.grouper is MB3_MeshBakerGrouperCluster) { MB3_MeshBakerGrouperCluster cg = (MB3_MeshBakerGrouperCluster)tbg.grouper; if (tb != null) { cg.BuildClusters(tb.GetObjectsToCombine(), updateProgressBar); EditorUtility.ClearProgressBar(); Repaint(); } } } } EditorGUILayout.PropertyField(clusterOnLMIndex, gc_ClusterOnLMIndex); EditorGUILayout.PropertyField(clusterByLODLevel, gc_ClusterByLODLevel); EditorGUILayout.PropertyField(includeCellsWithOnlyOneRenderer, gc_IncludeCellsWithOnlyOneRenderer); EditorGUILayout.Space(); EditorGUILayout.LabelField("Prefab Output Settings", EditorStyles.boldLabel); EditorGUILayout.PropertyField(prefabOptions_autoGeneratePrefabs, gc_prefabOptions_autoGeneratePrefabs); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PropertyField(prefabOptions_outputFolder, gc_prefabOptions_outputFolder); if (GUILayout.Button("Browse")) { string path = EditorUtility.OpenFolderPanel("Browse For Output Folder", "", ""); path = MB_BatchPrefabBakerEditorFunctions.ConvertFullPathToProjectRelativePath(path); prefabOptions_outputFolder.stringValue = path; } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); EditorGUILayout.LabelField("Mesh Baker Settings", EditorStyles.boldLabel); EditorGUILayout.HelpBox("These settings will be shared by all created Mesh Bakers.", MessageType.Info); UnityEngine.Object oldObjVal = mbSettingsAsset.objectReferenceValue; EditorGUILayout.PropertyField(mbSettingsAsset, gc_Settings); bool doingTextureArrays = false; if (tb != null && tb.textureBakeResults != null) { doingTextureArrays = tb.textureBakeResults.resultType == MB2_TextureBakeResults.ResultType.textureArray; } if (mbSettingsAsset.objectReferenceValue == null) { meshBakerSettingsMe.DrawGUI(tbg.meshBakerSettings, true, doingTextureArrays); } else { if (meshBakerSettingsExternal == null || oldObjVal != mbSettingsAsset.objectReferenceValue) { UnityEngine.Object targetObj; string propertyName; ((MB3_MeshCombinerSettings)mbSettingsAsset.objectReferenceValue).GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); } meshBakerSettingsExternal.DrawGUI(((MB3_MeshCombinerSettings)mbSettingsAsset.objectReferenceValue).data, false, doingTextureArrays); } }
public void DrawGrouperInspector() { EditorGUILayout.HelpBox("This component helps you group meshes that are close together so they can be combined together." + " It generates multiple MB3_MeshBaker objects from the List Of Objects to be combined in the MB3_TextureBaker component." + " Objects that are close together will be grouped together and added to a new child MB3_MeshBaker object.\n\n" + " TIP: Try the new agglomerative cluster type. It's awsome!", MessageType.Info); MB3_MeshBakerGrouper grouper = (MB3_MeshBakerGrouper)target; EditorGUILayout.PropertyField(clusterType, gc_ClusterType); MB3_MeshBakerGrouper.ClusterType gg = (MB3_MeshBakerGrouper.ClusterType)clusterType.enumValueIndex; if ((gg == MB3_MeshBakerGrouper.ClusterType.none && !(grouper.grouper is MB3_MeshBakerGrouperNone)) || (gg == MB3_MeshBakerGrouper.ClusterType.grid && !(grouper.grouper is MB3_MeshBakerGrouperGrid)) || (gg == MB3_MeshBakerGrouper.ClusterType.pie && !(grouper.grouper is MB3_MeshBakerGrouperPie)) || (gg == MB3_MeshBakerGrouper.ClusterType.agglomerative && !(grouper.grouper is MB3_MeshBakerGrouperCluster)) ) { grouper.CreateGrouper(gg, grouper.data); grouper.clusterType = gg; } if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.grid) { EditorGUILayout.PropertyField(gridOrigin, gc_GridOrigin); EditorGUILayout.PropertyField(cellSize, gc_CellSize); } else if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.pie) { EditorGUILayout.PropertyField(gridOrigin, gc_GridOrigin); EditorGUILayout.PropertyField(numSegments, gc_NumSegements); EditorGUILayout.PropertyField(pieAxis, gc_PieAxis); EditorGUILayout.PropertyField(pieRingSpacing, gc_PieRingSpacing); EditorGUILayout.PropertyField(pieCombineAllInCenterRing, gc_PieCombineAllInCenterRing); } else if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.agglomerative) { float dist = clusterDistance.floatValue; float maxDist = 100f; float minDist = .000001f; MB3_MeshBakerGrouperCluster cl = null; if (grouper.grouper is MB3_MeshBakerGrouperCluster) { cl = (MB3_MeshBakerGrouperCluster)grouper.grouper; maxDist = cl._ObjsExtents; minDist = cl._minDistBetweenClusters; if (dist < minDist) { dist = Mathf.Lerp(minDist, maxDist, .11f); } } dist = EditorGUILayout.Slider(gc_ClusterDistance, dist, minDist, maxDist); clusterDistance.floatValue = dist; string btnName = "Refresh Clusters"; if (cl.cluster == null || cl.cluster.clusters == null || cl.cluster.clusters.Length == 0) { btnName = "Click To Build Clusters"; } if (GUILayout.Button(btnName)) { if (grouper.grouper is MB3_MeshBakerGrouperCluster) { MB3_MeshBakerGrouperCluster cg = (MB3_MeshBakerGrouperCluster)grouper.grouper; MB3_TextureBaker tb = grouper.GetComponent <MB3_TextureBaker>(); if (tb != null) { //MB3_EditorMethods em = new MB3_EditorMethods(); cg.BuildClusters(tb.GetObjectsToCombine(), updateProgressBar); EditorUtility.ClearProgressBar(); Repaint(); } } } } EditorGUILayout.PropertyField(clusterOnLMIndex, gc_ClusterOnLMIndex); EditorGUILayout.PropertyField(clusterByLODLevel, gc_ClusterByLODLevel); EditorGUILayout.PropertyField(includeCellsWithOnlyOneRenderer, gc_IncludeCellsWithOnlyOneRenderer); EditorGUILayout.Space(); EditorGUILayout.LabelField("Mesh Baker Settings", EditorStyles.boldLabel); EditorGUILayout.HelpBox("These settings will be shared by all created Mesh Bakers.", MessageType.Info); UnityEngine.Object oldObjVal = mbSettingsAsset.objectReferenceValue; EditorGUILayout.PropertyField(mbSettingsAsset, gc_Settings); if (mbSettingsAsset.objectReferenceValue == null) { meshBakerSettingsMe.DrawGUI(grouper.meshBakerSettings, true); } else { if (meshBakerSettingsExternal == null || oldObjVal != mbSettingsAsset.objectReferenceValue) { meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); meshBakerSettingsExternal.OnEnable(((MB3_MeshCombinerSettings)mbSettingsAsset.objectReferenceValue).GetMeshBakerSettingsAsSerializedProperty()); } meshBakerSettingsExternal.DrawGUI(((MB3_MeshCombinerSettings)mbSettingsAsset.objectReferenceValue).data, false); } }
public void DrawGrouperInspector() { EditorGUILayout.HelpBox("This component helps you group meshes that are close together so they can be combined together." + " It generates multiple MB3_MeshBaker objects from the List Of Objects to be combined in the MB3_TextureBaker component." + " Objects that are close together will be grouped together and added to a new child MB3_MeshBaker object.\n\n" + " TIP: Try the new agglomerative cluster type. It's awsome!", MessageType.Info); MB3_MeshBakerGrouper grouper = (MB3_MeshBakerGrouper)target; EditorGUILayout.PropertyField(clusterType, gc_ClusterType); MB3_MeshBakerGrouper.ClusterType gg = (MB3_MeshBakerGrouper.ClusterType)clusterType.enumValueIndex; if ((gg == MB3_MeshBakerGrouper.ClusterType.none && !(grouper.grouper is MB3_MeshBakerGrouperNone)) || (gg == MB3_MeshBakerGrouper.ClusterType.grid && !(grouper.grouper is MB3_MeshBakerGrouperGrid)) || (gg == MB3_MeshBakerGrouper.ClusterType.pie && !(grouper.grouper is MB3_MeshBakerGrouperPie)) || (gg == MB3_MeshBakerGrouper.ClusterType.agglomerative && !(grouper.grouper is MB3_MeshBakerGrouperCluster)) ) { grouper.CreateGrouper(gg, grouper.data); grouper.clusterType = gg; } if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.grid) { EditorGUILayout.PropertyField(gridOrigin, gc_GridOrigin); EditorGUILayout.PropertyField(cellSize, gc_CellSize); } else if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.pie) { EditorGUILayout.PropertyField(gridOrigin, gc_GridOrigin); EditorGUILayout.PropertyField(numSegments, gc_NumSegements); EditorGUILayout.PropertyField(pieAxis, gc_PieAxis); } else if (clusterType.enumValueIndex == (int)MB3_MeshBakerGrouper.ClusterType.agglomerative) { float dist = clusterDistance.floatValue; float maxDist = 100f; float minDist = .000001f; MB3_MeshBakerGrouperCluster cl = null; if (grouper.grouper is MB3_MeshBakerGrouperCluster) { cl = (MB3_MeshBakerGrouperCluster)grouper.grouper; maxDist = cl._ObjsExtents; minDist = cl._minDistBetweenClusters; if (dist < minDist) { dist = Mathf.Lerp(minDist, maxDist, .11f); } } dist = EditorGUILayout.Slider(gc_ClusterDistance, dist, minDist, maxDist); clusterDistance.floatValue = dist; string btnName = "Refresh Clusters"; if (cl.cluster == null || cl.cluster.clusters == null || cl.cluster.clusters.Length == 0) { btnName = "Click To Build Clusters"; } if (GUILayout.Button(btnName)) { if (grouper.grouper is MB3_MeshBakerGrouperCluster) { MB3_MeshBakerGrouperCluster cg = (MB3_MeshBakerGrouperCluster)grouper.grouper; MB3_TextureBaker tb = grouper.GetComponent <MB3_TextureBaker>(); if (tb != null) { //MB3_EditorMethods em = new MB3_EditorMethods(); cg.BuildClusters(tb.GetObjectsToCombine(), updateProgressBar); EditorUtility.ClearProgressBar(); Repaint(); } } } } EditorGUILayout.PropertyField(clusterOnLMIndex, gc_ClusterOnLMIndex); EditorGUILayout.PropertyField(clusterByLODLevel, gc_ClusterByLODLevel); }