public static bool Export(string folder, string filename, Mesh mesh, ExportMaterial[] textures, bool copyTextures) { exportMesh = mesh; exportTextures = textures; targetFolder = folder; targetName = filename; _copyTextures = copyTextures; if(folder.Contains(" ")) { EditorUtility.DisplayDialog("Filename Error","The filename can't contain spaces","I'm sorry"); return false; } if(filename.Contains(" ")) { EditorUtility.DisplayDialog("Filename Error","The filename can't contain spaces","I'm sorry"); return false; } MeshToFile(targetFolder, targetName); exportMesh = null; exportTextures = null; return true; }
public static bool Export(string folder, string filename, Mesh mesh, ExportMaterial[] textures, bool copyTextures) { exportMesh = mesh; exportTextures = textures; targetFolder = folder; targetName = filename; _copyTextures = copyTextures; if(folder.Contains(" ")) { EditorUtility.DisplayDialog("Filename Error","The filename can't contain spaces","I'm sorry"); return false; } if(filename.Contains(" ")) { EditorUtility.DisplayDialog("Filename Error","The filename can't contain spaces","I'm sorry"); return false; } /*if (!CreateTargetFolder()) { Debug.LogError("There was a problem with the destination folder"); return false; }*/ MeshToFile(targetFolder, targetName); exportMesh = null; exportTextures = null; return true; }
private static int[] ExportStairwells(BuildrData data) { int numberOfVolumes = data.plan.numberOfVolumes; int[] returnNumberOfMeshes = new int[numberOfVolumes]; for (int v = 0; v < numberOfVolumes; v++) { BuildrVolume volume = data.plan.volumes[v]; int numberOfUnpackedTextures = data.textures.Count; List<ExportMaterial> exportTextures = new List<ExportMaterial>(); if (!volume.generateStairs) continue; DynamicMeshGenericMultiMaterialMesh INT_STAIRWELL = new DynamicMeshGenericMultiMaterialMesh(); INT_STAIRWELL.subMeshCount = data.textures.Count; BuildrStairs.Build(INT_STAIRWELL, data, v, BuildrStairs.StairModes.Stepped, true); INT_STAIRWELL.Build(data.includeTangents); List<int> unusedStairTextures = INT_STAIRWELL.unusedSubmeshes; numberOfUnpackedTextures = data.textures.Count; for (int t = 0; t < numberOfUnpackedTextures; t++) { if (unusedStairTextures.Contains(t)) continue;//skip, unused ExportMaterial newTexture = new ExportMaterial(); newTexture.name = data.textures[t].name; newTexture.material = data.textures[t].material; newTexture.generated = false; newTexture.filepath = data.textures[t].filePath; exportTextures.Add(newTexture); } int numberOfStairMeshes = INT_STAIRWELL.meshCount; for (int i = 0; i < numberOfStairMeshes; i++) { MeshUtility.Optimize(INT_STAIRWELL[i].mesh); string VolumeSuffix = ((numberOfVolumes > 1) ? "_" + v : ""); string DetailSuffixIndex = ((numberOfStairMeshes > 1) ? "_" + i : ""); string DetailFileName = data.exportFilename + STAIR_SUFFIX + VolumeSuffix + DetailSuffixIndex; string DetailFolder = ROOT_FOLDER + data.exportFilename + "/"; Export(DetailFileName, DetailFolder, data, INT_STAIRWELL[i].mesh, exportTextures.ToArray()); } returnNumberOfMeshes[v] = numberOfStairMeshes; } return returnNumberOfMeshes; }
private static void ExportModel(BuildrData data) { try { EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.0f); //check overwrites... string newDirectory = ROOT_FOLDER + data.exportFilename; if(!CreateFolder(newDirectory)) { EditorUtility.ClearProgressBar(); return; } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.05f); if(data.fullmesh) { //export unpacked model DYN_MESH = new DynamicMeshGenericMultiMaterialMesh(); DYN_MESH.subMeshCount = data.textures.Count; BuildrBuilding.Build(DYN_MESH, data); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.30f); BuildrRoof.Build(DYN_MESH, data); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.60f); DYN_MESH.Build(data.includeTangents); int meshCount = DYN_MESH.meshCount; List<int> unusedTextures = DYN_MESH.unusedSubmeshes; int numberOfUnpackedTextures = data.textures.Count; List<ExportMaterial> exportTextureList = new List<ExportMaterial>(); for (int t = 0; t < numberOfUnpackedTextures; t++) { if (unusedTextures.Contains(t)) continue;//skip, unused ExportMaterial newTexture = new ExportMaterial(); newTexture.name = data.textures[t].name; newTexture.material = data.textures[t].material; newTexture.generated = false; newTexture.filepath = data.textures[t].filePath; exportTextureList.Add(newTexture); } for(int i = 0; i < meshCount; i++) { EXPORT_MESH = DYN_MESH[i].mesh; MeshUtility.Optimize(EXPORT_MESH); Export(data, EXPORT_MESH, exportTextureList.ToArray()); string filenameSuffix = (meshCount>1)? i.ToString() : ""; string filename = data.exportFilename + filenameSuffix; Export(filename, ROOT_FOLDER + data.exportFilename + "/", data, EXPORT_MESH, exportTextureList.ToArray()); } } //Export Collider if(data.generateCollider != BuildrData.ColliderGenerationModes.None) ExportCollider(data); int[] numberOfInteriorMeshes = new int[data.plan.numberOfVolumes]; if(data.renderInteriors && data.fullmesh) numberOfInteriorMeshes = ExportInteriors(data); int[] numberOfStairwells = new int[data.plan.numberOfVolumes]; if (data.renderInteriors && data.fullmesh) numberOfStairwells = ExportStairwells(data); int numberOfDetailMeshes = 0; if(data.fullmesh) numberOfDetailMeshes = ExportDetails(data); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.70f); //Place exported version into scene if(data.fullmesh) { AssetDatabase.Refresh();//ensure the database is up to date... GameObject baseObject = new GameObject(data.exportFilename); if((data.createPrefabOnExport || data.placeIntoScene)) { baseObject.transform.position = CURRENT_TRANSFORM.position; baseObject.transform.rotation = CURRENT_TRANSFORM.rotation; string modelFilePath = ROOT_FOLDER + data.exportFilename + "/" + data.exportFilename + FILE_EXTENTION; GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(modelFilePath)); newModel.name = "model"; newModel.transform.parent = baseObject.transform; newModel.transform.localPosition = Vector3.zero; newModel.transform.localRotation = Quaternion.identity; if(data.generateCollider != BuildrData.ColliderGenerationModes.None) { GameObject colliderObject = new GameObject("collider"); string colliderFilePath = ROOT_FOLDER + data.exportFilename + "/" + data.exportFilename + COLLIDER_SUFFIX + FILE_EXTENTION; colliderObject.AddComponent<MeshCollider>().sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(colliderFilePath, typeof(Mesh)); colliderObject.transform.parent = baseObject.transform; colliderObject.transform.localPosition = Vector3.zero; colliderObject.transform.localRotation = Quaternion.identity; } for (int i = 0; i < numberOfDetailMeshes; i++) { string detailSuffixIndex = ((numberOfDetailMeshes > 1) ? "_" + i : ""); string detailFileName = data.exportFilename + DETAIL_SUFFIX + detailSuffixIndex; string detailFolder = ROOT_FOLDER + data.exportFilename + "/"; string detailFilepath = detailFolder + detailFileName + FILE_EXTENTION; GameObject detailObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(detailFilepath)); detailObject.name = "details"; detailObject.transform.parent = baseObject.transform; detailObject.transform.localPosition = Vector3.zero; detailObject.transform.localRotation = Quaternion.identity; } int numberOfVolumes = data.plan.numberOfVolumes; GameObject interiorHolder = new GameObject("interiors"); interiorHolder.transform.parent = baseObject.transform; interiorHolder.transform.localPosition = Vector3.zero; interiorHolder.transform.localRotation = Quaternion.identity; for (int v = 0; v < numberOfInteriorMeshes.Length; v++) { int numMeshes = numberOfInteriorMeshes[v]; for (int i = 0; i < numMeshes; i++) { string VolumeSuffix = ((numberOfVolumes > 1) ? "_" + v : ""); string DetailSuffixIndex = ((numMeshes > 1) ? "_" + i : ""); string DetailFileName = data.exportFilename + INTERIOR_SUFFIX + VolumeSuffix + DetailSuffixIndex; string DetailFolder = ROOT_FOLDER + data.exportFilename + "/"; string filePath = DetailFolder + DetailFileName + FILE_EXTENTION; GameObject interiorObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(filePath)); interiorObject.name = INTERIOR_SUFFIX + VolumeSuffix + DetailSuffixIndex; interiorObject.transform.parent = interiorHolder.transform; interiorObject.transform.localPosition = Vector3.zero; interiorObject.transform.localRotation = Quaternion.identity; } } for(int v = 0; v < numberOfStairwells.Length; v++) { int numMeshes = numberOfStairwells[v]; for (int i = 0; i < numMeshes; i++) { string VolumeSuffix = ((numberOfVolumes > 1) ? "_" + v : ""); string DetailSuffixIndex = ((numMeshes > 1) ? "_" + i : ""); string DetailFileName = data.exportFilename + STAIR_SUFFIX + VolumeSuffix + DetailSuffixIndex; string DetailFolder = ROOT_FOLDER + data.exportFilename + "/"; string filePath = DetailFolder + DetailFileName + FILE_EXTENTION; GameObject interiorObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(filePath)); interiorObject.name = STAIR_SUFFIX + VolumeSuffix + DetailSuffixIndex; interiorObject.transform.parent = interiorHolder.transform; interiorObject.transform.localPosition = data.plan.volumes[v].stairBaseVector[i]; interiorObject.transform.localRotation = Quaternion.identity; } } } if(data.createPrefabOnExport) { string prefabPath = ROOT_FOLDER + data.exportFilename + "/" + data.exportFilename + ".prefab"; Object prefab = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)); if(prefab == null) prefab = PrefabUtility.CreateEmptyPrefab(prefabPath); PrefabUtility.ReplacePrefab(baseObject, prefab, ReplacePrefabOptions.ConnectToPrefab); } if(!data.placeIntoScene) Object.DestroyImmediate(baseObject); } if(data.exportLowLOD) { ExportLowLOD(data); } DYN_MESH = null; EXPORT_MESH = null; EditorUtility.ClearProgressBar(); EditorUtility.UnloadUnusedAssets(); AssetDatabase.Refresh(); }catch(System.Exception e) { Debug.LogError("BuildR Export Error: "+e); EditorUtility.ClearProgressBar(); } }
private static void ExportLowLOD(BuildrData data) { DynamicMeshGenericMultiMaterialMesh dynLODMesh = new DynamicMeshGenericMultiMaterialMesh(); dynLODMesh.subMeshCount = data.textures.Count; BuildrBuildingLowDetail2.Build(dynLODMesh, data); dynLODMesh.CollapseSubmeshes(); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.80f); dynLODMesh.Build(data.includeTangents); Mesh LODMesh = dynLODMesh[0].mesh;//TODO: support many meshes MeshUtility.Optimize(LODMesh); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.90f); string textureName = data.exportFilename + ATLASED_SUFFIX + LOD_SUFFIX; string textureFileName = textureName + ".png"; string newDirectory = ROOT_FOLDER + data.exportFilename; File.WriteAllBytes(newDirectory + "/" + textureFileName, data.LODTextureAtlas.EncodeToPNG()); ExportMaterial[] exportTextures = new ExportMaterial[1]; ExportMaterial newTexture = new ExportMaterial(); newTexture.name = textureName; newTexture.filepath = textureFileName; newTexture.generated = true; exportTextures[0] = newTexture; string LODFileName = data.exportFilename + LOD_SUFFIX; string LODFolder = ROOT_FOLDER + data.exportFilename + "/"; Export(LODFileName, LODFolder, data, LODMesh, exportTextures); if (data.placeIntoScene) { AssetDatabase.Refresh();//ensure the database is up to date... string filePath = LODFolder + LODFileName + FILE_EXTENTION; GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(filePath)); newModel.transform.position = CURRENT_TRANSFORM.position; newModel.transform.rotation = CURRENT_TRANSFORM.rotation; } Texture2D.DestroyImmediate(data.textureAtlas); Texture2D.DestroyImmediate(data.LODTextureAtlas); }
//returns the number of meshes private static int ExportDetails(BuildrData data) { DynamicMeshGenericMultiMaterialMesh DET_MESH = new DynamicMeshGenericMultiMaterialMesh(); BuildrDetailExportObject exportObject = BuildrBuildingDetails.Build(DET_MESH, data); int numberOfMeshes = exportObject.detailMeshes.Length; if (numberOfMeshes == 0) return 0; string textureName = data.exportFilename + ATLASED_SUFFIX + DETAIL_SUFFIX; string textureFileName = textureName + ".png"; string newDirectory = ROOT_FOLDER + data.exportFilename; File.WriteAllBytes(newDirectory + "/" + textureFileName, exportObject.texture.EncodeToPNG()); ExportMaterial[] exportTextures = new ExportMaterial[1]; ExportMaterial newTexture = new ExportMaterial(); newTexture.name = textureName; newTexture.filepath = textureFileName; newTexture.generated = true; exportTextures[0] = newTexture; for(int i = 0; i < numberOfMeshes; i++) { string DetailSuffixIndex = ((numberOfMeshes > 1) ? "_"+i : ""); string DetailFileName = data.exportFilename + DETAIL_SUFFIX + DetailSuffixIndex; string DetailFolder = ROOT_FOLDER + data.exportFilename + "/"; Export(DetailFileName, DetailFolder, data, exportObject.detailMeshes[i], exportTextures); } Texture2D.DestroyImmediate(exportObject.texture); return numberOfMeshes; }
private static void ExportCollider(BuildrData data) { DynamicMeshGenericMultiMaterialMesh COL_MESH = new DynamicMeshGenericMultiMaterialMesh(); COL_MESH.subMeshCount = data.textures.Count; BuildrBuildingCollider.Build(COL_MESH, data); // COL_MESH.CollapseSubmeshes(); COL_MESH.Build(false); ExportMaterial[] exportTextures = new ExportMaterial[1]; ExportMaterial newTexture = new ExportMaterial(); newTexture.name = "blank"; newTexture.filepath = ""; newTexture.generated = true; exportTextures[0] = newTexture; int numberOfColliderMeshes = COL_MESH.meshCount; for (int i = 0; i < numberOfColliderMeshes; i++) { MeshUtility.Optimize(COL_MESH[i].mesh); string ColliderSuffixIndex = ((numberOfColliderMeshes > 1) ? "_" + i : ""); string ColliderFileName = data.exportFilename + COLLIDER_SUFFIX + ColliderSuffixIndex; string ColliderFolder = ROOT_FOLDER + data.exportFilename + "/"; Export(ColliderFileName, ColliderFolder, data, COL_MESH[i].mesh, exportTextures); } }
private static void Export(string filename, string folder, BuildrData data, Mesh exportMesh, ExportMaterial[] exportTextures) { switch (data.filetype) { case BuildrData.filetypes.obj: OBJExporter.Export(folder, filename, exportMesh, exportTextures, data.copyTexturesIntoExportFolder); break; case BuildrData.filetypes.fbx: FBXExporter.Export(folder, filename, exportMesh, exportTextures, data.copyTexturesIntoExportFolder); break; } }
private static void Export(BuildrData data, Mesh exportMesh, ExportMaterial[] exportTextures) { Export(data.exportFilename, ROOT_FOLDER + data.exportFilename + "/", data, exportMesh, exportTextures); }
public virtual Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uiDoc = commandData.Application.ActiveUIDocument; Document doc = uiDoc.Document; this.application = commandData.Application.Application; Debug("[STREAMVR] EXECUTING STREAMING SERVER EVENT!1!!"); this.Converter = new GenericConverter(Debug); Debug("Exporting to " + StreamVRApp.Instance.ModelServerURL); IBaseCommand command = new ExportMaterial(Debug, this.Converter, StreamVRApp.Instance.ModelServerURL); IEnumerable <string> materials = new FilteredElementCollector(doc). OfClass(typeof(Material)). Select(e => e.Id.ToString()); int success = 0; int noMaterial = 0; int failure = 0; Debug("EXPORTING " + materials.Count() + " MATERIALS"); foreach (string id in materials) { try { Message response = command.Execute(doc, new Message { Type = "EXPORT_MATERIAL", Reply = null, Data = JsonConvert.SerializeObject(new { Id = id }) }); if (response.Type == "EMPTY") { noMaterial++; continue; } if (response.Type == "ERROR") { throw new Exception(response.Data); } Debug(response.Data); success++; } catch (Exception e) { Debug($"Error 2 {id} {e.ToString()}"); failure++; } } Debug("EXPORT RESULTS " + JsonConvert.SerializeObject(new { Successes = success, NoExportable = noMaterial, Failures = failure })); TaskDialog mainDialog = new TaskDialog("Export Report"); mainDialog.MainInstruction = "Export Report"; mainDialog.MainContent = $"Successes: {success}\nNot Exportable: {noMaterial}\nFailures: {failure}"; TaskDialogResult tResult = mainDialog.Show(); return(Result.Succeeded); }
private static void ExportModel(TrackBuildR track) { GameObject baseObject = new GameObject(track.exportFilename); baseObject.transform.position = CURRENT_TRANSFORM.position; baseObject.transform.rotation = CURRENT_TRANSFORM.rotation; EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.0f); track.ForceFullRecalculation(); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.1f); try { TrackBuildRTrack trackData = track.track; //check overwrites... string newDirectory = ROOT_FOLDER + track.exportFilename; if (!CreateFolder(newDirectory)) { EditorUtility.ClearProgressBar(); return; } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.15f); int numberOfCurves = trackData.numberOfCurves; float exportProgress = 0.75f / (numberOfCurves * 6.0f); ExportMaterial[] exportMaterials = new ExportMaterial[1]; ExportMaterial exportTexture = new ExportMaterial(); string[] dynNames = new [] { "track", "bumper", "boundary", "bottom", "offread", "trackCollider" }; for (int c = 0; c < numberOfCurves; c++) { TrackBuildRPoint curve = trackData[c]; int numberOfDynMeshes = 6; DynamicMeshGenericMultiMaterialMesh[] dynMeshes = new DynamicMeshGenericMultiMaterialMesh[6]; dynMeshes[0] = curve.dynamicTrackMesh; dynMeshes[1] = curve.dynamicBumperMesh; dynMeshes[2] = curve.dynamicBoundaryMesh; dynMeshes[3] = curve.dynamicBottomMesh; dynMeshes[4] = curve.dynamicOffroadMesh; dynMeshes[5] = curve.dynamicColliderMesh; int[] textureIndeices = new int[] { curve.trackTextureStyleIndex, curve.bumperTextureStyleIndex, curve.boundaryTextureStyleIndex, curve.bottomTextureStyleIndex, curve.offroadTextureStyleIndex, 0 }; for (int d = 0; d < numberOfDynMeshes; d++) { if (EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "Exporting Track Curve " + c + " " + dynNames[d], 0.15f + exportProgress * (c * 6 + d))) { EditorUtility.ClearProgressBar(); return; } DynamicMeshGenericMultiMaterialMesh exportDynMesh = dynMeshes[d]; if (track.includeTangents || exportDynMesh.isEmpty) { exportDynMesh.Build(track.includeTangents);//rebuild with tangents } TrackBuildRTexture texture = trackData.Texture(textureIndeices[d]); exportTexture.name = texture.customName; exportTexture.material = texture.material; exportTexture.generated = false; exportTexture.filepath = texture.filePath; exportMaterials[0] = exportTexture; int meshCount = exportDynMesh.meshCount; for (int i = 0; i < meshCount; i++) { Mesh exportMesh = exportDynMesh[i].mesh; MeshUtility.Optimize(exportMesh); string filenameSuffix = trackModelName(dynNames[d], c, (meshCount > 1) ? i : -1);// "trackCurve" + c + ((meshCount > 1) ? "_" + i.ToString() : ""); string filename = track.exportFilename + filenameSuffix; Export(filename, ROOT_FOLDER + track.exportFilename + "/", track, exportMesh, exportMaterials); if (track.createPrefabOnExport) { AssetDatabase.Refresh();//ensure the database is up to date... string modelFilePath = ROOT_FOLDER + track.exportFilename + "/" + filename + FILE_EXTENTION; if (d < numberOfDynMeshes - 1) { GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(modelFilePath)); newModel.name = filename; newModel.transform.parent = baseObject.transform; newModel.transform.localPosition = Vector3.zero; newModel.transform.localRotation = Quaternion.identity; } else { GameObject colliderObject = new GameObject("trackCollider"); colliderObject.AddComponent <MeshCollider>().sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(modelFilePath, typeof(Mesh)); colliderObject.transform.parent = baseObject.transform; colliderObject.transform.localPosition = Vector3.zero; colliderObject.transform.localRotation = Quaternion.identity; } } } } } if (track.createPrefabOnExport) { string prefabPath = ROOT_FOLDER + track.exportFilename + "/" + track.exportFilename + ".prefab"; Object prefab = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)); if (prefab == null) { prefab = PrefabUtility.CreateEmptyPrefab(prefabPath); } PrefabUtility.ReplacePrefab(baseObject, prefab, ReplacePrefabOptions.ConnectToPrefab); } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.70f); AssetDatabase.Refresh();//ensure the database is up to date... } catch (System.Exception e) { Debug.LogError("BuildR Export Error: " + e); EditorUtility.ClearProgressBar(); } Object.DestroyImmediate(baseObject); EditorUtility.ClearProgressBar(); EditorUtility.UnloadUnusedAssets(); AssetDatabase.Refresh(); }
private static void Export(string filename, string folder, TrackBuildR data, Mesh exportMesh, ExportMaterial[] exportTextures) { switch (data.fileType) { case TrackBuildR.fileTypes.Obj: OBJExporter.Export(folder, filename, exportMesh, exportTextures, data.copyTexturesIntoExportFolder); break; case TrackBuildR.fileTypes.Fbx: FBXExporter.Export(folder, filename, exportMesh, exportTextures, data.copyTexturesIntoExportFolder); break; } }
private static void ExportCollider(TrackBuildR data) { DynamicMesh COL_MESH = new DynamicMesh(); // COL_MESH.subMeshCount = data.textures.Count; // BuildrBuildingCollider.Build(COL_MESH, data); // COL_MESH.CollapseSubmeshes(); COL_MESH.Build(); ExportMaterial[] exportTextures = new ExportMaterial[1]; ExportMaterial newTexture = new ExportMaterial(); newTexture.name = "blank"; newTexture.filepath = ""; newTexture.generated = true; exportTextures[0] = newTexture; int numberOfColliderMeshes = COL_MESH.meshCount; Mesh[] meshes = COL_MESH.meshes; for (int i = 0; i < numberOfColliderMeshes; i++) { MeshUtility.Optimize(meshes[i]); string ColliderSuffixIndex = ((numberOfColliderMeshes > 1) ? "_" + i : ""); string ColliderFileName = data.exportFilename + COLLIDER_SUFFIX + ColliderSuffixIndex; string ColliderFolder = ROOT_FOLDER + data.exportFilename + "/"; Export(ColliderFileName, ColliderFolder, data, meshes[i], exportTextures); } //string newDirectory = rootFolder+track.exportFilename; //if(!CreateFolder(newDirectory)) // return; // ExportMaterial[] exportTextures = new ExportMaterial[1]; // ExportMaterial newTexture = new ExportMaterial(); // newTexture.customName = ""; // newTexture.filepath = ""; // newTexture.generated = true; // exportTextures[0] = newTexture; // Export(track.exportFilename + COLLIDER_SUFFIX, ROOT_FOLDER + track.exportFilename + "/", track, EXPORT_MESH, exportTextures); // // COL_MESH = null; // EXPORT_MESH = null; }
private static void ExportModel(TrackBuildR track) { GameObject baseObject = new GameObject(track.exportFilename); baseObject.transform.position = CURRENT_TRANSFORM.position; baseObject.transform.rotation = CURRENT_TRANSFORM.rotation; EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.0f); track.ForceFullRecalculation(); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.1f); try { TrackBuildRTrack trackData = track.track; //check overwrites... string newDirectory = ROOT_FOLDER + track.exportFilename; if(!CreateFolder(newDirectory)) { EditorUtility.ClearProgressBar(); return; } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.15f); int numberOfCurves = trackData.numberOfCurves; int numberOfDynMeshes = 9; float exportProgress = 0.75f / (numberOfCurves * numberOfDynMeshes); ExportMaterial[] exportMaterials = new ExportMaterial[1]; ExportMaterial exportTexture = new ExportMaterial(); TrackBuildRTexture[] textures = trackData.GetTexturesArray(); int textureCount = textures.Length; Material[] materials = new Material[textureCount]; for (int t = 0; t < textureCount; t++) { TrackBuildRTexture texture = textures[t]; if (!texture.isSubstance && !texture.isUSer) { string materialPath = string.Format("{0}{1}/{2}.mat", ROOT_FOLDER, track.exportFilename, texture.customName); if(File.Exists(materialPath)) { Material mat = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material)); EditorUtility.CopySerialized(texture.material, mat); AssetDatabase.SaveAssets(); materials[t] = mat; continue; } Material tempMat = Object.Instantiate(texture.material); AssetDatabase.CreateAsset(tempMat, materialPath); materials[t] = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material)); } else { materials[t] = texture.isUSer ? texture.userMaterial : texture.proceduralMaterial; } } string[] dynNames = {"track","bumper","boundary","bottom","offroad","trackCollider"}; string[] colliderNames = { "track collider", "wall collider", "offroad collider", "bumper collider" }; for (int c = 0; c < numberOfCurves; c++) { TrackBuildRPoint curve = trackData[c]; DynamicMesh[] dynMeshes = new DynamicMesh[numberOfDynMeshes]; dynMeshes[0] = curve.dynamicTrackMesh; dynMeshes[1] = curve.dynamicBumperMesh; dynMeshes[2] = curve.dynamicBoundaryMesh; dynMeshes[3] = curve.dynamicBottomMesh; dynMeshes[4] = curve.dynamicOffroadMesh; dynMeshes[5] = curve.dynamicColliderMesh1;//track surface dynMeshes[6] = curve.dynamicColliderMesh2;//walls and roof dynMeshes[7] = curve.dynamicColliderMesh3;//track bottom and offroad dynMeshes[8] = curve.dynamicColliderMesh4;//bumpers int[] textureIndeices = { curve.trackTextureStyleIndex ,curve.bumperTextureStyleIndex, curve.boundaryTextureStyleIndex, curve.bottomTextureStyleIndex, curve.offroadTextureStyleIndex, 0}; PhysicMaterial[] physicMaterials = { trackData.Texture(curve.trackTextureStyleIndex).physicMaterial, trackData.Texture(curve.boundaryTextureStyleIndex).physicMaterial, trackData.Texture(curve.offroadTextureStyleIndex).physicMaterial, trackData.Texture(curve.bumperTextureStyleIndex).physicMaterial }; for (int d = 0; d < numberOfDynMeshes; d++) { int textureIndex = Mathf.Clamp(d, 0, 5); if (EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "Exporting Track Curve " + c + " " + dynNames[textureIndex], 0.15f + exportProgress * (c * numberOfDynMeshes + d))) { EditorUtility.ClearProgressBar(); return; } DynamicMesh exportDynMesh = dynMeshes[d]; // if(track.includeTangents || exportDynMesh.isEmpty) // exportDynMesh.Build();//rebuild with tangents TrackBuildRTexture texture = trackData.Texture(textureIndeices[textureIndex]); exportTexture.name = texture.customName; exportTexture.material = texture.material; exportTexture.generated = false; exportTexture.filepath = texture.filePath; exportMaterials[0] = exportTexture; Material mat = materials[textureIndeices[textureIndex]]; int meshCount = exportDynMesh.meshCount; Mesh[] meshes = exportDynMesh.meshes; for (int i = 0; i < meshCount; i++) { Mesh exportMesh = meshes[i]; MeshUtility.Optimize(exportMesh); string filenameSuffix = trackModelName(dynNames[textureIndex], c, (meshCount > 1) ? i : -1);// "trackCurve" + c + ((meshCount > 1) ? "_" + i.ToString() : ""); if(d > 4)//colliders filenameSuffix = string.Format("{0}_{1}", filenameSuffix, (d % 5)); string filename = track.exportFilename + filenameSuffix; Export(filename, ROOT_FOLDER + track.exportFilename + "/", track, exportMesh, exportMaterials); if(track.createPrefabOnExport) { AssetDatabase.Refresh();//ensure the database is up to date... string modelFilePath = ROOT_FOLDER + track.exportFilename + "/" + filename + FILE_EXTENTION; if(d < numberOfDynMeshes - 4) { GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(modelFilePath)); newModel.name = filename; newModel.transform.parent = baseObject.transform; newModel.transform.localPosition = Vector3.zero; newModel.transform.localRotation = Quaternion.identity; MeshRenderer[] renders = newModel.GetComponentsInChildren<MeshRenderer>(); foreach(MeshRenderer rend in renders) rend.material = mat; } else { int colliderIndex = d - (numberOfDynMeshes - 4); GameObject colliderObject = new GameObject(colliderNames[colliderIndex]); MeshCollider collider = colliderObject.AddComponent<MeshCollider>(); collider.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(modelFilePath, typeof(Mesh)); collider.material = physicMaterials[colliderIndex]; colliderObject.transform.parent = baseObject.transform; colliderObject.transform.localPosition = Vector3.zero; colliderObject.transform.localRotation = Quaternion.identity; } } } } } if(track.createPrefabOnExport) { string prefabPath = ROOT_FOLDER + track.exportFilename + "/" + track.exportFilename + ".prefab"; Object prefab = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)); if(prefab == null) prefab = PrefabUtility.CreateEmptyPrefab(prefabPath); PrefabUtility.ReplacePrefab(baseObject, prefab, ReplacePrefabOptions.ConnectToPrefab); } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.70f); AssetDatabase.Refresh();//ensure the database is up to date... } catch(System.Exception e) { Debug.LogError("Track BuildR Export Error: "+e); EditorUtility.ClearProgressBar(); AssetDatabase.Refresh();//ensure the database is up to date... } Object.DestroyImmediate(baseObject); EditorUtility.ClearProgressBar(); EditorUtility.UnloadUnusedAssetsImmediate(); AssetDatabase.Refresh(); }