/** * pass in System.IO.File.WriteAllBytes for parameter fileSaveFunction. This is necessary because on Web Player file saving * functions only exist for Editor classes */ public void CreateAndSaveAtlases(ProgressUpdateDelegate progressInfo, MB_TextureCombiner.FileSaveFunction fileSaveFunction) { MB_AtlasesAndRects[] mAndAs = null; try{ if (doCombinedValidate(this, MB_ObjsToCombineTypes.dontCare)) { mAndAs = CreateAtlases(progressInfo, true, fileSaveFunction); if (mAndAs != null) { MB2_MeshBakerCommon mb = GetComponent <MB2_MeshBakerCommon>(); if (mb != null) { mb.textureBakeResults = textureBakeResults; } } } } catch (Exception e) { Debug.LogError(e); } finally { if (mAndAs != null) { for (int j = 0; j < mAndAs.Length; j++) { MB_AtlasesAndRects mAndA = mAndAs[j]; if (mAndA != null && mAndA.atlases != null) { for (int i = 0; i < mAndA.atlases.Length; i++) { if (mAndA.atlases[i] != null) { MB_Utility.Destroy(mAndA.atlases[i]); } } } } } } }
public MB_AtlasesAndRects[] CreateAtlases(ProgressUpdateDelegate progressInfo, bool saveAtlasesAsAssets = false, MB_TextureCombiner.FileSaveFunction fileSaveFunction = null) { if (doMultiMaterial) { for (int i = 0; i < resultMaterials.Length; i++) { MB_MultiMaterial mm = resultMaterials[i]; if (mm.combinedMaterial == null) { Debug.LogError("Combined Material is null please create and assign a result material."); return(null); } UnityEngine.Shader targShader = mm.combinedMaterial.shader; for (int j = 0; j < mm.sourceMaterials.Count; j++) { if (mm.sourceMaterials[j] == null) { Debug.LogError("There are null entries in the list of Source Materials"); return(null); } if (targShader != mm.sourceMaterials[j].shader) { Debug.LogWarning("Source material " + mm.sourceMaterials[j] + " does not use shader " + targShader + " it may not have the required textures. If not empty textures will be generated."); } } } } else { if (resultMaterial == null) { Debug.LogError("Combined Material is null please create and assign a result material."); return(null); } UnityEngine.Shader targShader = resultMaterial.shader; for (int i = 0; i < objsToMesh.Count; i++) { Material[] ms = MB_Utility.GetGOMaterials(objsToMesh[i]); for (int j = 0; j < ms.Length; j++) { Material m = ms[j]; if (m == null) { Debug.LogError("Game object " + objsToMesh[i] + " has a null material. Can't build atlases"); return(null); } if (m.shader != targShader) { Debug.LogWarning("Game object " + objsToMesh[i] + " does not use shader " + targShader + " it may not have the required textures. If not empty textures will be generated."); } } } } int numResults = 1; if (doMultiMaterial) { numResults = resultMaterials.Length; } MB_AtlasesAndRects[] results = new MB_AtlasesAndRects[numResults]; for (int i = 0; i < results.Length; i++) { results[i] = new MB_AtlasesAndRects(); } MB_TextureCombiner tc = new MB_TextureCombiner(); Material resMatToPass = null; List <Material> sourceMats = null; for (int i = 0; i < results.Length; i++) { if (doMultiMaterial) { sourceMats = resultMaterials[i].sourceMaterials; resMatToPass = resultMaterials[i].combinedMaterial; } else { resMatToPass = resultMaterial; } Debug.Log("Creating atlases for result material " + resMatToPass); if (!tc.combineTexturesIntoAtlases(progressInfo, results[i], resMatToPass, objsToMesh, sourceMats, atlasPadding, customShaderPropNames, resizePowerOfTwoTextures, fixOutOfBoundsUVs, maxTilingBakeSize, saveAtlasesAsAssets, texturePackingAlgorithm, fileSaveFunction)) { return(null); } } if (results != null) { textureBakeResults.combinedMaterialInfo = results; textureBakeResults.doMultiMaterial = doMultiMaterial; textureBakeResults.resultMaterial = resultMaterial; textureBakeResults.resultMaterials = resultMaterials; textureBakeResults.fixOutOfBoundsUVs = fixOutOfBoundsUVs; unpackMat2RectMap(textureBakeResults); if (UnityEngine.Application.isPlaying) { if (doMultiMaterial) { for (int j = 0; j < resultMaterials.Length; j++) { Material resMat = resultMaterials[j].combinedMaterial; //resultMaterials[j].combinedMaterial; Texture2D[] atlases = results[j].atlases; for (int i = 0; i < atlases.Length; i++) { resMat.SetTexture(results[j].texPropertyNames[i], atlases[i]); // _setMaterialTextureProperty(resMat, newMesh.texPropertyNames[i], relativePath); } } } else { Material resMat = resultMaterial; //resultMaterials[j].combinedMaterial; Texture2D[] atlases = results[0].atlases; for (int i = 0; i < atlases.Length; i++) { resMat.SetTexture(results[0].texPropertyNames[i], atlases[i]); // _setMaterialTextureProperty(resMat, newMesh.texPropertyNames[i], relativePath); } } } } if (VERBOSE) { Debug.Log("Created Atlases"); } return(results); }