IEnumerator __RunTexturePackerOnly(CombineTexturesIntoAtlasesCoroutineResult result, MB3_TextureCombinerPipeline.TexturePipelineData data, bool splitAtlasWhenPackingIfTooBig, MB2_EditorMethodsInterface textureEditorMethods, List <AtlasPackingResult> packingResult) { if (LOG_LEVEL >= MB2_LogLevel.debug) { Debug.Log("__RunTexturePacker texture properties in shader:" + data.texPropertyNames.Count + " objsToMesh:" + data.allObjsToMesh.Count + " _fixOutOfBoundsUVs:" + data._fixOutOfBoundsUVs); } List <GameObject> usedObjsToMesh = new List <GameObject>(); yield return(MB3_TextureCombinerPipeline.__Step1_CollectDistinctMatTexturesAndUsedObjects(null, result, data, this, textureEditorMethods, usedObjsToMesh, LOG_LEVEL)); if (!result.success) { yield break; } data.allTexturesAreNullAndSameColor = new MB3_TextureCombinerPipeline.CreateAtlasForProperty[data.texPropertyNames.Count]; yield return(MB3_TextureCombinerPipeline.CalculateIdealSizesForTexturesInAtlasAndPadding(null, result, data, this, textureEditorMethods, LOG_LEVEL)); if (!result.success) { yield break; } MB_ITextureCombinerPacker texturePaker = MB3_TextureCombinerPipeline.CreatePacker(data.OnlyOneTextureInAtlasReuseTextures(), data._packingAlgorithm); // run the texture packer only AtlasPackingResult[] aprs = MB3_TextureCombinerPipeline.RunTexturePackerOnly(data, splitAtlasWhenPackingIfTooBig, texturePaker, LOG_LEVEL); for (int i = 0; i < aprs.Length; i++) { packingResult.Add(aprs[i]); } }
//texPropertyNames is the list of texture properties in the resultMaterial //allowedMaterialsFilter is a list of materials. Objects without any of these materials will be ignored. // this is used by the multiple materials filter //textureEditorMethods encapsulates editor only functionality such as saving assets and tracking texture assets whos format was changed. Is null if using at runtime. IEnumerator __CombineTexturesIntoAtlases(ProgressUpdateDelegate progressInfo, CombineTexturesIntoAtlasesCoroutineResult result, MB_AtlasesAndRects resultAtlasesAndRects, MB3_TextureCombinerPipeline.TexturePipelineData data, MB2_EditorMethodsInterface textureEditorMethods) { if (LOG_LEVEL >= MB2_LogLevel.debug) { Debug.Log("__CombineTexturesIntoAtlases texture properties in shader:" + data.texPropertyNames.Count + " objsToMesh:" + data.allObjsToMesh.Count + " _fixOutOfBoundsUVs:" + data._fixOutOfBoundsUVs); } if (progressInfo != null) { progressInfo("Collecting textures ", .01f); } MB3_TextureCombinerPipeline pipeline = new MB3_TextureCombinerPipeline(); /* * each atlas (maintex, bump, spec etc...) will have distinctMaterialTextures.Count images in it. * each distinctMaterialTextures record is a set of textures, one for each atlas. And a list of materials * that use that distinct set of textures. */ List <GameObject> usedObjsToMesh = new List <GameObject>(); yield return(pipeline.__Step1_CollectDistinctMatTexturesAndUsedObjects(progressInfo, result, data, this, textureEditorMethods, usedObjsToMesh, LOG_LEVEL)); if (!result.success) { yield break; } //Textures in each material (_mainTex, Bump, Spec ect...) must be same size //Calculate the best sized to use. Takes into account tiling //if only one texture in atlas re-uses original sizes yield return(pipeline.CalculateIdealSizesForTexturesInAtlasAndPadding(progressInfo, result, data, this, textureEditorMethods, LOG_LEVEL)); if (!result.success) { yield break; } //buildAndSaveAtlases StringBuilder report = pipeline.GenerateReport(data); MB_ITextureCombinerPacker texturePaker = pipeline.CreatePacker(data.OnlyOneTextureInAtlasReuseTextures(), data._packingAlgorithm); if (!texturePaker.Validate(data)) { result.success = false; yield break; } yield return(texturePaker.ConvertTexturesToReadableFormats(progressInfo, result, data, this, textureEditorMethods, LOG_LEVEL)); if (!result.success) { yield break; } AtlasPackingResult[] uvRects = texturePaker.CalculateAtlasRectangles(data, false, LOG_LEVEL); Debug.Assert(uvRects.Length == 1, "Error, there should not be more than one packing here."); yield return(pipeline.__Step3_BuildAndSaveAtlasesAndStoreResults(result, progressInfo, data, this, texturePaker, uvRects[0], textureEditorMethods, resultAtlasesAndRects, report, LOG_LEVEL)); }
//texPropertyNames is the list of texture properties in the resultMaterial //allowedMaterialsFilter is a list of materials. Objects without any of these materials will be ignored. // this is used by the multiple materials filter //textureEditorMethods encapsulates editor only functionality such as saving assets and tracking texture assets whos format was changed. Is null if using at runtime. IEnumerator __CombineTexturesIntoAtlases(ProgressUpdateDelegate progressInfo, CombineTexturesIntoAtlasesCoroutineResult result, MB_AtlasesAndRects resultAtlasesAndRects, MB3_TextureCombinerPipeline.TexturePipelineData data, bool splitAtlasWhenPackingIfTooBig, MB2_EditorMethodsInterface textureEditorMethods) { if (LOG_LEVEL >= MB2_LogLevel.debug) { Debug.Log("__CombineTexturesIntoAtlases texture properties in shader:" + data.texPropertyNames.Count + " objsToMesh:" + data.allObjsToMesh.Count + " _fixOutOfBoundsUVs:" + data._fixOutOfBoundsUVs); } if (progressInfo != null) { progressInfo("Collecting textures ", .01f); } /* * each atlas (maintex, bump, spec etc...) will have distinctMaterialTextures.Count images in it. * each distinctMaterialTextures record is a set of textures, one for each atlas. And a list of materials * that use that distinct set of textures. */ List <GameObject> usedObjsToMesh = new List <GameObject>(); yield return(MB3_TextureCombinerPipeline.__Step1_CollectDistinctMatTexturesAndUsedObjects(progressInfo, result, data, this, textureEditorMethods, usedObjsToMesh, LOG_LEVEL)); if (!result.success) { yield break; } if (MB3_MeshCombiner.EVAL_VERSION) { bool usesAllowedShaders = true; for (int i = 0; i < data.distinctMaterialTextures.Count; i++) { for (int j = 0; j < data.distinctMaterialTextures[i].matsAndGOs.mats.Count; j++) { if (!data.distinctMaterialTextures[i].matsAndGOs.mats[j].mat.shader.name.EndsWith("Diffuse") && !data.distinctMaterialTextures[i].matsAndGOs.mats[j].mat.shader.name.EndsWith("Bumped Diffuse")) { Debug.LogError("The free version of Mesh Baker only works with Diffuse and Bumped Diffuse Shaders. The full version can be used with any shader. Material " + data.distinctMaterialTextures[i].matsAndGOs.mats[j].mat.name + " uses shader " + data.distinctMaterialTextures[i].matsAndGOs.mats[j].mat.shader.name); usesAllowedShaders = false; } } } if (!usesAllowedShaders) { result.success = false; yield break; } } //Textures in each material (_mainTex, Bump, Spec ect...) must be same size //Calculate the best sized to use. Takes into account tiling //if only one texture in atlas re-uses original sizes yield return(MB3_TextureCombinerPipeline.CalculateIdealSizesForTexturesInAtlasAndPadding(progressInfo, result, data, this, textureEditorMethods, LOG_LEVEL)); if (!result.success) { yield break; } //buildAndSaveAtlases StringBuilder report = MB3_TextureCombinerPipeline.GenerateReport(data); MB_ITextureCombinerPacker texturePaker = MB3_TextureCombinerPipeline.CreatePacker(data.OnlyOneTextureInAtlasReuseTextures(), data._packingAlgorithm); yield return(texturePaker.ConvertTexturesToReadableFormats(progressInfo, result, data, this, textureEditorMethods, LOG_LEVEL)); if (!result.success) { yield break; } AtlasPackingResult[] uvRects = texturePaker.CalculateAtlasRectangles(data, splitAtlasWhenPackingIfTooBig, LOG_LEVEL); yield return(MB3_TextureCombinerPipeline.__Step3_BuildAndSaveAtlasesAndStoreResults(result, progressInfo, data, this, texturePaker, uvRects[0], textureEditorMethods, resultAtlasesAndRects, report, LOG_LEVEL)); }