public void OnEnable() { lastBoundsCheckRefreshTime = 0; grouper = new SerializedObject(target); SerializedProperty d = grouper.FindProperty("data"); clusterType = grouper.FindProperty("clusterType"); includeCellsWithOnlyOneRenderer = d.FindPropertyRelative("includeCellsWithOnlyOneRenderer"); gridOrigin = d.FindPropertyRelative("origin"); cellSize = d.FindPropertyRelative("cellSize"); clusterOnLMIndex = d.FindPropertyRelative("clusterOnLMIndex"); clusterByLODLevel = d.FindPropertyRelative("clusterByLODLevel"); numSegments = d.FindPropertyRelative("pieNumSegments"); pieAxis = d.FindPropertyRelative("pieAxis"); clusterDistance = d.FindPropertyRelative("maxDistBetweenClusters"); mbSettings = grouper.FindProperty("meshBakerSettings"); mbSettingsAsset = grouper.FindProperty("meshBakerSettingsAsset"); pieRingSpacing = d.FindPropertyRelative("ringSpacing"); pieCombineAllInCenterRing = d.FindPropertyRelative("combineSegmentsInInnermostRing"); meshBakerSettingsMe = new MB_MeshBakerSettingsEditor(); meshBakerSettingsMe.OnEnable(mbSettings); if (mbSettingsAsset.objectReferenceValue != null) { meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); UnityEngine.Object targetObj; string propertyName; ((MB3_MeshCombinerSettings)mbSettingsAsset.objectReferenceValue).GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); meshBakerSettingsExternal.OnEnable(meshBakerSettings); } }
public void OnEnable() { settingsSerializedObj = new SerializedObject(target); mbSettings = settingsSerializedObj.FindProperty("data"); meshBakerSettingsEditor = new MB_MeshBakerSettingsEditor(); meshBakerSettingsEditor.OnEnable(mbSettings); }
void _init(SerializedObject mb) { this.meshBaker = mb; objsToMesh = meshBaker.FindProperty("objsToMesh"); combiner = meshBaker.FindProperty("_meshCombiner"); logLevel = combiner.FindPropertyRelative("_LOG_LEVEL"); outputOptions = combiner.FindPropertyRelative("_outputOption"); useObjsToMeshFromTexBaker = meshBaker.FindProperty("useObjsToMeshFromTexBaker"); textureBakeResults = combiner.FindPropertyRelative("_textureBakeResults"); mesh = combiner.FindPropertyRelative("_mesh"); sortOrderAxis = meshBaker.FindProperty("sortAxis"); settingsHolder = combiner.FindPropertyRelative("_settingsHolder"); meshBakerSettingsThis = new MB_MeshBakerSettingsEditor(); meshBakerSettingsThis.OnEnable(combiner, meshBaker); editorStyles.Init(); }
public void DrawGUI(SerializedObject meshBaker, MB3_MeshBakerCommon target, System.Type editorWindowType) { if (meshBaker == null) { return; } meshBaker.Update(); showInstructions = EditorGUILayout.Foldout(showInstructions, "Instructions:"); if (showInstructions) { EditorGUILayout.HelpBox("1. Bake combined material(s).\n\n" + "2. If necessary set the 'Texture Bake Results' field.\n\n" + "3. Add scene objects or prefabs to combine or check 'Same As Texture Baker'. For best results these should use the same shader as result material.\n\n" + "4. Select options and 'Bake'.\n\n" + "6. Look at warnings/errors in console. Decide if action needs to be taken.\n\n" + "7. (optional) Disable renderers in source objects.", UnityEditor.MessageType.None); EditorGUILayout.Separator(); } MB3_MeshBakerCommon momm = (MB3_MeshBakerCommon)target; EditorGUILayout.PropertyField(logLevel, gc_logLevelContent); EditorGUILayout.PropertyField(textureBakeResults, gc_textureBakeResultsGUIContent); bool doingTextureArray = false; if (textureBakeResults.objectReferenceValue != null) { doingTextureArray = ((MB2_TextureBakeResults)textureBakeResults.objectReferenceValue).resultType == MB2_TextureBakeResults.ResultType.textureArray; showContainsReport = EditorGUILayout.Foldout(showContainsReport, "Shaders & Materials Contained"); if (showContainsReport) { EditorGUILayout.HelpBox(((MB2_TextureBakeResults)textureBakeResults.objectReferenceValue).GetDescription(), MessageType.Info); } } EditorGUILayout.BeginVertical(editorStyles.editorBoxBackgroundStyle); EditorGUILayout.LabelField("Objects To Be Combined", EditorStyles.boldLabel); if (momm.GetTextureBaker() != null) { EditorGUILayout.PropertyField(useObjsToMeshFromTexBaker, gc_useTextureBakerObjsGUIContent); } else { useObjsToMeshFromTexBaker.boolValue = false; momm.useObjsToMeshFromTexBaker = false; GUI.enabled = false; EditorGUILayout.PropertyField(useObjsToMeshFromTexBaker, gc_useTextureBakerObjsGUIContent); GUI.enabled = true; } if (!momm.useObjsToMeshFromTexBaker) { if (GUILayout.Button(gc_openToolsWindowLabelContent)) { MB3_MeshBakerEditorWindowInterface mmWin = (MB3_MeshBakerEditorWindowInterface)EditorWindow.GetWindow(editorWindowType); mmWin.target = (MB3_MeshBakerRoot)target; } object[] objs = MB3_EditorMethods.DropZone("Drag & Drop Renderers Or Parents Here To Add Objects To Be Combined", 300, 50); MB3_EditorMethods.AddDroppedObjects(objs, momm); EditorGUILayout.PropertyField(objsToMesh, gc_objectsToCombineGUIContent, true); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Select Objects In Scene")) { Selection.objects = momm.GetObjectsToCombine().ToArray(); if (momm.GetObjectsToCombine().Count > 0) { SceneView.lastActiveSceneView.pivot = momm.GetObjectsToCombine()[0].transform.position; } } if (GUILayout.Button(gc_SortAlongAxis)) { MB3_MeshBakerRoot.ZSortObjects sorter = new MB3_MeshBakerRoot.ZSortObjects(); sorter.sortAxis = sortOrderAxis.vector3Value; sorter.SortByDistanceAlongAxis(momm.GetObjectsToCombine()); } EditorGUILayout.PropertyField(sortOrderAxis, GUIContent.none); EditorGUILayout.EndHorizontal(); } else { GUI.enabled = false; EditorGUILayout.PropertyField(objsToMesh, gc_objectsToCombineGUIContent, true); GUI.enabled = true; } EditorGUILayout.EndVertical(); EditorGUILayout.Space(); EditorGUILayout.LabelField("Output", EditorStyles.boldLabel); EditorGUILayout.PropertyField(outputOptions, gc_outputOptoinsGUIContent); if (momm.meshCombiner.outputOption == MB2_OutputOptions.bakeIntoSceneObject) { //todo switch to renderer momm.meshCombiner.resultSceneObject = (GameObject)EditorGUILayout.ObjectField("Combined Mesh Object", momm.meshCombiner.resultSceneObject, typeof(GameObject), true); if (momm is MB3_MeshBaker) { string l = "Mesh"; Mesh m = (Mesh)mesh.objectReferenceValue; if (m != null) { l += " (" + m.GetInstanceID() + ")"; } Mesh nm = (Mesh)EditorGUILayout.ObjectField(new GUIContent(l), m, typeof(Mesh), true); if (nm != m) { Undo.RecordObject(momm, "Assign Mesh"); ((MB3_MeshCombinerSingle)momm.meshCombiner).SetMesh(nm); mesh.objectReferenceValue = nm; } } } else if (momm.meshCombiner.outputOption == MB2_OutputOptions.bakeIntoPrefab) { momm.resultPrefab = (GameObject)EditorGUILayout.ObjectField(gc_combinedMeshPrefabGUIContent, momm.resultPrefab, typeof(GameObject), true); if (momm is MB3_MeshBaker) { string l = "Mesh"; Mesh m = (Mesh)mesh.objectReferenceValue; if (m != null) { l += " (" + m.GetInstanceID() + ")"; } Mesh nm = (Mesh)EditorGUILayout.ObjectField(new GUIContent(l), m, typeof(Mesh), true); if (nm != m) { Undo.RecordObject(momm, "Assign Mesh"); ((MB3_MeshCombinerSingle)momm.meshCombiner).SetMesh(nm); mesh.objectReferenceValue = nm; } } } else if (momm.meshCombiner.outputOption == MB2_OutputOptions.bakeMeshAssetsInPlace) { EditorGUILayout.HelpBox("NEW! Try the BatchPrefabBaker component. It makes preparing a batch of prefabs for static/ dynamic batching much easier.", MessageType.Info); if (GUILayout.Button("Choose Folder For Bake In Place Meshes")) { string newFolder = EditorUtility.SaveFolderPanel("Folder For Bake In Place Meshes", Application.dataPath, ""); if (!newFolder.Contains(Application.dataPath)) { Debug.LogWarning("The chosen folder must be in your assets folder."); } momm.bakeAssetsInPlaceFolderPath = "Assets" + newFolder.Replace(Application.dataPath, ""); } EditorGUILayout.LabelField("Folder For Meshes: " + momm.bakeAssetsInPlaceFolderPath); } if (momm is MB3_MultiMeshBaker) { MB3_MultiMeshCombiner mmc = (MB3_MultiMeshCombiner)momm.meshCombiner; mmc.maxVertsInMesh = EditorGUILayout.IntField("Max Verts In Mesh", mmc.maxVertsInMesh); } //----------------------------------- EditorGUILayout.Space(); EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel); bool settingsEnabled = true; //------------- Mesh Baker Settings is a bit tricky because it is an interface. EditorGUILayout.Space(); UnityEngine.Object obj = settingsHolder.objectReferenceValue; // Don't use a PropertyField because we may not be able to use the assigned object. It may not implement requried interface. obj = EditorGUILayout.ObjectField(gc_Settings, obj, typeof(UnityEngine.Object), true); if (obj == null) { settingsEnabled = true; settingsHolder.objectReferenceValue = null; if (meshBakerSettingsExternal != null) { meshBakerSettingsExternal.OnDisable(); meshBakerSettingsExternal = null; } } else if (obj is GameObject) { // Check to see if there is a component on this game object that implements MB_IMeshBakerSettingsHolder MB_IMeshBakerSettingsHolder itf = (MB_IMeshBakerSettingsHolder)((GameObject)obj).GetComponent(typeof(MB_IMeshBakerSettingsHolder)); if (itf != null) { settingsEnabled = false; Component settingsHolderComponent = (Component)itf; if (settingsHolder.objectReferenceValue != settingsHolderComponent) { settingsHolder.objectReferenceValue = settingsHolderComponent; meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); UnityEngine.Object targetObj; string propertyName; itf.GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); meshBakerSettingsExternal.OnEnable(meshBakerSettings); } } else { settingsEnabled = true; settingsHolder = null; if (meshBakerSettingsExternal != null) { meshBakerSettingsExternal.OnDisable(); meshBakerSettingsExternal = null; } } } else if (obj is MB_IMeshBakerSettingsHolder) { settingsEnabled = false; if (settingsHolder.objectReferenceValue != obj) { settingsHolder.objectReferenceValue = obj; meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); UnityEngine.Object targetObj; string propertyName; ((MB_IMeshBakerSettingsHolder)obj).GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); meshBakerSettingsExternal.OnEnable(meshBakerSettings); } } else { Debug.LogError("Object was not a Mesh Baker Settings object."); } EditorGUILayout.Space(); if (settingsHolder.objectReferenceValue == null) { // Use the meshCombiner settings meshBakerSettingsThis.DrawGUI(momm.meshCombiner, settingsEnabled, doingTextureArray); } else { if (meshBakerSettingsExternal == null) { meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); UnityEngine.Object targetObj; string propertyName; ((MB_IMeshBakerSettingsHolder)obj).GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); meshBakerSettingsExternal.OnEnable(meshBakerSettings); } meshBakerSettingsExternal.DrawGUI(((MB_IMeshBakerSettingsHolder)settingsHolder.objectReferenceValue).GetMeshBakerSettings(), settingsEnabled, doingTextureArray); } Color oldColor = GUI.backgroundColor; GUI.backgroundColor = buttonColor; if (GUILayout.Button("Bake")) { bake(momm, ref meshBaker); } GUI.backgroundColor = oldColor; string enableRenderersLabel; bool disableRendererInSource = false; if (momm.GetObjectsToCombine().Count > 0) { Renderer r = MB_Utility.GetRenderer(momm.GetObjectsToCombine()[0]); if (r != null && r.enabled) { disableRendererInSource = true; } } if (disableRendererInSource) { enableRenderersLabel = "Disable Renderers On Source Objects"; } else { enableRenderersLabel = "Enable Renderers On Source Objects"; } if (GUILayout.Button(enableRenderersLabel)) { momm.EnableDisableSourceObjectRenderers(!disableRendererInSource); } meshBaker.ApplyModifiedProperties(); meshBaker.SetIsDifferentCacheDirty(); }
public void DrawGUI(SerializedObject meshBaker, MB3_MeshBakerCommon target, UnityEngine.Object[] targets, System.Type editorWindowType) { if (meshBaker == null) { return; } meshBaker.Update(); showInstructions = EditorGUILayout.Foldout(showInstructions, "Instructions:"); if (showInstructions) { EditorGUILayout.HelpBox("1. Bake combined material(s).\n\n" + "2. If necessary set the 'Texture Bake Results' field.\n\n" + "3. Add scene objects or prefabs to combine or check 'Same As Texture Baker'. For best results these should use the same shader as result material.\n\n" + "4. Select options and 'Bake'.\n\n" + "6. Look at warnings/errors in console. Decide if action needs to be taken.\n\n" + "7. (optional) Disable renderers in source objects.", UnityEditor.MessageType.None); EditorGUILayout.Separator(); } MB3_MeshBakerCommon momm = (MB3_MeshBakerCommon)target; EditorGUILayout.PropertyField(logLevel, gc_logLevelContent); EditorGUILayout.PropertyField(textureBakeResults, gc_textureBakeResultsGUIContent); bool doingTextureArray = false; if (textureBakeResults.objectReferenceValue != null) { doingTextureArray = ((MB2_TextureBakeResults)textureBakeResults.objectReferenceValue).resultType == MB2_TextureBakeResults.ResultType.textureArray; showContainsReport = EditorGUILayout.Foldout(showContainsReport, "Shaders & Materials Contained"); if (showContainsReport) { EditorGUILayout.HelpBox(((MB2_TextureBakeResults)textureBakeResults.objectReferenceValue).GetDescription(), MessageType.Info); } } EditorGUILayout.BeginVertical(editorStyles.editorBoxBackgroundStyle); EditorGUILayout.LabelField("Objects To Be Combined", EditorStyles.boldLabel); if (momm.GetTextureBaker() != null) { EditorGUILayout.PropertyField(useObjsToMeshFromTexBaker, gc_useTextureBakerObjsGUIContent); } else { useObjsToMeshFromTexBaker.boolValue = false; momm.useObjsToMeshFromTexBaker = false; GUI.enabled = false; EditorGUILayout.PropertyField(useObjsToMeshFromTexBaker, gc_useTextureBakerObjsGUIContent); GUI.enabled = true; } if (!momm.useObjsToMeshFromTexBaker) { if (GUILayout.Button(gc_openToolsWindowLabelContent)) { MB3_MeshBakerEditorWindow mmWin = (MB3_MeshBakerEditorWindow)EditorWindow.GetWindow(editorWindowType); mmWin.SetTarget((MB3_MeshBakerRoot)momm); } object[] objs = MB3_EditorMethods.DropZone("Drag & Drop Renderers or Parents\n" + "HERE\n" + "to add objects to be combined", 300, 50); MB3_EditorMethods.AddDroppedObjects(objs, momm); EditorGUILayout.PropertyField(objsToMesh, gc_objectsToCombineGUIContent, true); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Select Objects In Scene")) { List <MB3_MeshBakerCommon> selectedBakers = _getBakersFromTargets(targets); List <GameObject> obsToCombine = new List <GameObject>(); foreach (MB3_MeshBakerCommon baker in selectedBakers) { obsToCombine.AddRange(baker.GetObjectsToCombine()); } Selection.objects = obsToCombine.ToArray(); if (momm.GetObjectsToCombine().Count > 0) { SceneView.lastActiveSceneView.pivot = momm.GetObjectsToCombine()[0].transform.position; } } if (GUILayout.Button(gc_SortAlongAxis)) { MB3_MeshBakerRoot.ZSortObjects sorter = new MB3_MeshBakerRoot.ZSortObjects(); sorter.sortAxis = sortOrderAxis.vector3Value; sorter.SortByDistanceAlongAxis(momm.GetObjectsToCombine()); } EditorGUILayout.PropertyField(sortOrderAxis, GUIContent.none); EditorGUILayout.EndHorizontal(); } else { GUI.enabled = false; EditorGUILayout.PropertyField(objsToMesh, gc_objectsToCombineGUIContent, true); GUI.enabled = true; } EditorGUILayout.EndVertical(); EditorGUILayout.Space(); EditorGUILayout.LabelField("Output", EditorStyles.boldLabel); EditorGUILayout.PropertyField(outputOptions, gc_outputOptoinsGUIContent); if (momm.meshCombiner.outputOption == MB2_OutputOptions.bakeIntoSceneObject) { 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; } //todo switch to renderer momm.meshCombiner.resultSceneObject = (GameObject)EditorGUILayout.ObjectField("Combined Mesh Object", momm.meshCombiner.resultSceneObject, typeof(GameObject), true); if (momm is MB3_MeshBaker) { string l = "Mesh"; Mesh m = (Mesh)mesh.objectReferenceValue; if (m != null) { l += " (" + m.GetInstanceID() + ")"; } Mesh nm = (Mesh)EditorGUILayout.ObjectField(gc_combinedMesh, m, typeof(Mesh), true); if (nm != m) { Undo.RecordObject(momm, "Assign Mesh"); ((MB3_MeshCombinerSingle)momm.meshCombiner).SetMesh(nm); mesh.objectReferenceValue = nm; } } } else if (momm.meshCombiner.outputOption == MB2_OutputOptions.bakeIntoPrefab) { if (momm.meshCombiner.settings.renderType == MB_RenderType.skinnedMeshRenderer) { EditorGUILayout.HelpBox("The workflow for baking Skinned Meshes into prefabs has changed as of version 29.1. " + "It is no longer necessary to manually copy bones to the target prefab after baking. This should happen automatically.", MessageType.Info); } 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.BeginHorizontal(); momm.resultPrefab = (GameObject)EditorGUILayout.ObjectField(gc_combinedMeshPrefabGUIContent, momm.resultPrefab, typeof(GameObject), true); if (momm.resultPrefab != null) { string assetPath = AssetDatabase.GetAssetPath(momm.resultPrefab); if (assetPath == null || assetPath.Length == 0) { Debug.LogError("The " + gc_combinedMeshPrefabGUIContent.text + " must be a prefab asset, not a scene GameObject"); momm.resultPrefab = null; } else { MB_PrefabType pt = MBVersionEditor.PrefabUtility_GetPrefabType(momm.resultPrefab); if (pt != MB_PrefabType.prefabAsset) { Debug.LogError("The " + gc_combinedMeshPrefabGUIContent.text + " must be a prefab asset, the prefab type was '" + pt + "'"); momm.resultPrefab = null; } } } else { if (GUILayout.Button("Create Empty Prefab")) { if (!Application.isPlaying) { string path = EditorUtility.SaveFilePanelInProject("Create Empty Prefab", "MyPrefab", "prefab", "Create a prefab containing an empty GameObject"); string pathNoFolder = Path.GetDirectoryName(path); string fileNameNoExt = Path.GetFileNameWithoutExtension(path); List <MB3_MeshBakerCommon> selectedBakers = _getBakersFromTargets(targets); if (selectedBakers.Count > 1) { Debug.Log("About to create prefabs for " + selectedBakers.Count); } int idx = 0; foreach (MB3_MeshBakerCommon baker in selectedBakers) { createEmptyPrefab(baker, pathNoFolder, fileNameNoExt, idx); idx++; } } } } EditorGUILayout.EndHorizontal(); EditorGUILayout.PropertyField(resultPrefabLeaveInstanceInSceneAfterBake, gc_resultPrefabLeaveInstanceInSceneAfterBake); if (momm is MB3_MeshBaker) { string l = "Mesh"; Mesh m = (Mesh)mesh.objectReferenceValue; if (m != null) { l += " (" + m.GetInstanceID() + ")"; } Mesh nm = (Mesh)EditorGUILayout.ObjectField(gc_combinedMesh, m, typeof(Mesh), true); if (nm != m) { Undo.RecordObject(momm, "Assign Mesh"); ((MB3_MeshCombinerSingle)momm.meshCombiner).SetMesh(nm); mesh.objectReferenceValue = nm; } } } else if (momm.meshCombiner.outputOption == MB2_OutputOptions.bakeMeshAssetsInPlace) { EditorGUILayout.HelpBox("Try the BatchPrefabBaker component! It makes preparing a batch of prefabs for static/ dynamic batching much easier.", MessageType.Info); if (GUILayout.Button("Choose Folder For Bake In Place Meshes")) { string newFolder = EditorUtility.SaveFolderPanel("Folder For Bake In Place Meshes", Application.dataPath, ""); if (!newFolder.Contains(Application.dataPath)) { Debug.LogWarning("The chosen folder must be in your assets folder."); } string folder = "Assets" + newFolder.Replace(Application.dataPath, ""); List <MB3_MeshBakerCommon> selectedBakers = _getBakersFromTargets(targets); Undo.RecordObjects(targets, "Undo Set Folder"); foreach (MB3_MeshBakerCommon baker in selectedBakers) { baker.bakeAssetsInPlaceFolderPath = folder; EditorUtility.SetDirty(baker); } } EditorGUILayout.LabelField("Folder For Meshes: " + momm.bakeAssetsInPlaceFolderPath); } if (momm is MB3_MultiMeshBaker) { MB3_MultiMeshCombiner mmc = (MB3_MultiMeshCombiner)momm.meshCombiner; mmc.maxVertsInMesh = EditorGUILayout.IntField("Max Verts In Mesh", mmc.maxVertsInMesh); } //----------------------------------- EditorGUILayout.Space(); EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel); bool settingsEnabled = true; //------------- Mesh Baker Settings is a bit tricky because it is an interface. EditorGUILayout.Space(); UnityEngine.Object obj = settingsHolder.objectReferenceValue; // Don't use a PropertyField because we may not be able to use the assigned object. It may not implement requried interface. obj = EditorGUILayout.ObjectField(gc_Settings, obj, typeof(UnityEngine.Object), true); if (obj == null) { settingsEnabled = true; settingsHolder.objectReferenceValue = null; if (meshBakerSettingsExternal != null) { meshBakerSettingsExternal.OnDisable(); meshBakerSettingsExternal = null; } } else if (obj is GameObject) { // Check to see if there is a component on this game object that implements MB_IMeshBakerSettingsHolder MB_IMeshBakerSettingsHolder itf = (MB_IMeshBakerSettingsHolder)((GameObject)obj).GetComponent(typeof(MB_IMeshBakerSettingsHolder)); if (itf != null) { settingsEnabled = false; Component settingsHolderComponent = (Component)itf; if (settingsHolder.objectReferenceValue != settingsHolderComponent) { settingsHolder.objectReferenceValue = settingsHolderComponent; meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); UnityEngine.Object targetObj; string propertyName; itf.GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); meshBakerSettingsExternal.OnEnable(meshBakerSettings); } } else { settingsEnabled = true; settingsHolder = null; if (meshBakerSettingsExternal != null) { meshBakerSettingsExternal.OnDisable(); meshBakerSettingsExternal = null; } } } else if (obj is MB_IMeshBakerSettingsHolder) { settingsEnabled = false; if (settingsHolder.objectReferenceValue != obj) { settingsHolder.objectReferenceValue = obj; meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); UnityEngine.Object targetObj; string propertyName; ((MB_IMeshBakerSettingsHolder)obj).GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); meshBakerSettingsExternal.OnEnable(meshBakerSettings); } } else { Debug.LogError("Object was not a Mesh Baker Settings object."); } EditorGUILayout.Space(); if (settingsHolder.objectReferenceValue == null) { // Use the meshCombiner settings meshBakerSettingsThis.DrawGUI(momm.meshCombiner, settingsEnabled, doingTextureArray); } else { if (meshBakerSettingsExternal == null) { meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); UnityEngine.Object targetObj; string propertyName; ((MB_IMeshBakerSettingsHolder)obj).GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); meshBakerSettingsExternal.OnEnable(meshBakerSettings); } meshBakerSettingsExternal.DrawGUI(((MB_IMeshBakerSettingsHolder)settingsHolder.objectReferenceValue).GetMeshBakerSettings(), settingsEnabled, doingTextureArray); } Color oldColor = GUI.backgroundColor; GUI.backgroundColor = buttonColor; if (GUILayout.Button("Bake")) { List <MB3_MeshBakerCommon> selectedBakers = _getBakersFromTargets(targets); if (selectedBakers.Count > 1) { Debug.Log("About to bake " + selectedBakers.Count); } foreach (MB3_MeshBakerCommon baker in selectedBakers) { // Why are we caching and recreating the SerializedObject? Because "bakeIntoPrefab" corrupts the serialized object // and the meshBaker SerializedObject throws an NRE the next time it gets used. MB3_MeshBakerCommon mbr = (MB3_MeshBakerCommon)meshBaker.targetObject; bake(baker); meshBaker = new SerializedObject(mbr); } } GUI.backgroundColor = oldColor; string enableRenderersLabel; bool disableRendererInSource = false; if (momm.GetObjectsToCombine().Count > 0) { Renderer r = MB_Utility.GetRenderer(momm.GetObjectsToCombine()[0]); if (r != null && r.enabled) { disableRendererInSource = true; } } if (disableRendererInSource) { enableRenderersLabel = "Disable Renderers On Source Objects"; } else { enableRenderersLabel = "Enable Renderers On Source Objects"; } if (GUILayout.Button(enableRenderersLabel)) { List <MB3_MeshBakerCommon> selectedBakers = _getBakersFromTargets(targets); foreach (MB3_MeshBakerCommon baker in selectedBakers) { baker.EnableDisableSourceObjectRenderers(!disableRendererInSource); } } meshBaker.ApplyModifiedProperties(); meshBaker.SetIsDifferentCacheDirty(); }
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; MB3_TextureBaker tb = grouper.GetComponent <MB3_TextureBaker>(); 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; 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("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(grouper.meshBakerSettings, true, doingTextureArrays); } 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, doingTextureArrays); } }
public void DrawGrouperInspector() { EditorGUILayout.HelpBox("This component groups meshes that are close together so they can be combined." + " 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!", 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 child MeshBaker components.", 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) { if (meshBakerSettingsExternal == null) { meshBakerSettingsExternal = new MB_MeshBakerSettingsEditor(); } UnityEngine.Object targetObj; string propertyName; ((MB3_MeshCombinerSettings)mbSettingsAsset.objectReferenceValue).GetMeshBakerSettingsAsSerializedProperty(out propertyName, out targetObj); SerializedProperty meshBakerSettings = new SerializedObject(targetObj).FindProperty(propertyName); meshBakerSettingsExternal.OnEnable(meshBakerSettings); } meshBakerSettingsExternal.DrawGUI(((MB3_MeshCombinerSettings)mbSettingsAsset.objectReferenceValue).data, false, doingTextureArrays); } }