private void Bake(MeshGenerator gen) { gen.Bake(isStatic, lightmapUV); MeshRenderer renderer = gen.GetComponent <MeshRenderer>(); MeshFilter filter = gen.GetComponent <MeshFilter>(); if (saveMesh) { FileInfo[] files = dirInfo.GetFiles(filter.sharedMesh.name + "*.obj"); string meshName = filter.sharedMesh.name; if (files.Length > 0) { meshName += "_" + files.Length; } string path = savePath + "/" + meshName + ".obj"; string relativepath = "Assets" + path.Substring(Application.dataPath.Length); string objString = MeshUtility.ToOBJString(filter.sharedMesh, renderer.sharedMaterials); File.WriteAllText(path, objString); AssetDatabase.ImportAsset(relativepath, ImportAssetOptions.ForceSynchronousImport); #if UNITY_5_0 filter.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(relativepath, typeof(Mesh)); #else filter.sharedMesh = AssetDatabase.LoadAssetAtPath <Mesh>(relativepath); #endif } if (removeComputer) { GameObject.DestroyImmediate(gen.computer); } if (permanent) { GameObject.DestroyImmediate(gen); } }
void Bake() { meshGen.Bake(isStatic, true); if (permanent && !copy) { SplineComputer meshGenComputer = meshGen.computer; if (permanent) { meshGenComputer.Unsubscribe(meshGen); DestroyImmediate(meshGen); } if (removeComputer) { if (meshGenComputer.GetComponents <Component>().Length == 2) { DestroyImmediate(meshGenComputer.gameObject); } else { DestroyImmediate(meshGenComputer); } } } }
private void Bake(MeshGenerator gen) { MeshFilter filter = gen.GetComponent <MeshFilter>(); if (filter == null) { EditorUtility.DisplayDialog("Save error", "No mesh present in " + gen.name, "OK"); return; } if (copy) { UnityEditor.MeshUtility.Optimize(filter.sharedMesh); Unwrapping.GenerateSecondaryUVSet(filter.sharedMesh); } else { gen.Bake(isStatic, true); } if (format == BakeMeshWindow.SaveFormat.OBJ) { MeshRenderer renderer = gen.GetComponent <MeshRenderer>(); dirInfo = new DirectoryInfo(savePath); FileInfo[] files = dirInfo.GetFiles(filter.sharedMesh.name + "*.obj"); string meshName = filter.sharedMesh.name; if (files.Length > 0) { meshName += "_" + files.Length; } string path = savePath + "/" + meshName + ".obj"; string objString = MeshUtility.ToOBJString(filter.sharedMesh, renderer.sharedMaterials); File.WriteAllText(path, objString); if (copy) { string relativepath = "Assets" + path.Substring(Application.dataPath.Length); AssetDatabase.ImportAsset(relativepath, ImportAssetOptions.ForceSynchronousImport); filter.sharedMesh = AssetDatabase.LoadAssetAtPath <Mesh>(relativepath); } } if (format == BakeMeshWindow.SaveFormat.MeshAsset) { dirInfo = new DirectoryInfo(savePath); FileInfo[] files = dirInfo.GetFiles(filter.sharedMesh.name + "*.asset"); string meshName = filter.sharedMesh.name; if (files.Length > 0) { meshName += "_" + files.Length; } string path = savePath + "/" + meshName + ".asset"; string relativepath = "Assets" + path.Substring(Application.dataPath.Length); if (copy) { Mesh assetMesh = MeshUtility.Copy(filter.sharedMesh); AssetDatabase.CreateAsset(assetMesh, relativepath); } else { AssetDatabase.CreateAsset(filter.sharedMesh, relativepath); } } if (permanent && !copy) { SplineComputer meshGenComputer = gen.computer; if (permanent) { meshGenComputer.Unsubscribe(gen); Object.DestroyImmediate(gen); } if (removeComputer) { if (meshGenComputer.GetComponents <Component>().Length == 2) { Object.DestroyImmediate(meshGenComputer.gameObject); } else { Object.DestroyImmediate(meshGenComputer); } } } }
void OnGUI() { string bakeText = "Bake"; EditorGUILayout.BeginHorizontal(); GUIContent saveMeshText = new GUIContent("Save as OBJ [?]", "Saves the mesh as an OBJ file which can then be used in other scenes and prefabs. OBJ files do not support vertex colors and secondary UV sets."); saveMesh = EditorGUILayout.Toggle(saveMeshText, saveMesh); if (saveMesh) { copy = EditorGUILayout.Toggle("Save as copy", copy); if (copy) { bakeText = "Save Copy"; } } EditorGUILayout.EndHorizontal(); bool hold = false; if (saveMesh) { EditorGUILayout.LabelField("Save Path: " + savePath); if (GUILayout.Button("Browse Path")) { string meshName = "mesh"; if (filter != null) { meshName = filter.sharedMesh.name; } savePath = EditorUtility.SaveFilePanel("Save " + meshName + ".obj", Application.dataPath, meshName + ".obj", "obj"); } } EditorGUILayout.Space(); bool isCopy = saveMesh && copy; if (!isCopy) { isStatic = EditorGUILayout.Toggle("Make Static", isStatic); } if (!saveMesh) { lightmapUV = EditorGUILayout.Toggle("Generate Lightmap UVs", lightmapUV); } SplineUser[] users = meshGen.GetComponents <SplineUser>(); if (users.Length == 1 && !isCopy) { removeComputer = EditorGUILayout.Toggle("Remove SplineComputer", removeComputer); } if (!isCopy) { permanent = EditorGUILayout.Toggle("Permanent", permanent); } bool _removeComputer = removeComputer; if (users.Length != 1) { _removeComputer = false; } if (_removeComputer && meshGen.computer.subscriberCount > 1 && !isCopy) { EditorGUILayout.HelpBox("WARNING: Removing the SplineComputer from this object may cause other SplineUsers to malfunction!", MessageType.Warning); } if (saveMesh) { if (savePath == "") { hold = true; } else if (!Directory.Exists(Path.GetDirectoryName(savePath))) { hold = true; } } if (hold) { GUI.color = new Color(1f, 1f, 1f, 0.5f); } if (GUILayout.Button(bakeText)) { Undo.RecordObject(meshGen.gameObject, "Bake mesh"); if (hold) { return; } if (!isCopy) { meshGen.Bake(isStatic, lightmapUV); } else if (lightmapUV) { Unwrapping.GenerateSecondaryUVSet(filter.sharedMesh); } MeshRenderer renderer = meshGen.GetComponent <MeshRenderer>(); if (saveMesh) { string relativepath = "Assets" + savePath.Substring(Application.dataPath.Length); string objString = MeshUtility.ToOBJString(filter.sharedMesh, renderer.sharedMaterials); File.WriteAllText(savePath, objString); AssetDatabase.ImportAsset(relativepath, ImportAssetOptions.ForceSynchronousImport); #if UNITY_5_0 if (!isCopy) { filter.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(relativepath, typeof(Mesh)); } #else if (!isCopy) { filter.sharedMesh = AssetDatabase.LoadAssetAtPath <Mesh>(relativepath); } #endif } if (removeComputer && !isCopy) { DestroyImmediate(meshGen.computer); } if (permanent && !isCopy) { DestroyImmediate(meshGen); } Close(); } string add = ""; if (removeComputer) { add += "It will also remove the SplineComputer component from the object."; } EditorGUILayout.HelpBox("This operation will remove the mesh generator component and will make the mesh uneditable." + add, MessageType.Info); }