void OneTimeSetup(MB3_AtlasPackerRenderTextureUsingMesh atlasRenderer, GameObject atlasMesh, GameObject cameraGameObject, int atlasWidth, int atlasHeight, int padding, int layer, MB2_LogLevel logLevel) { { // Set up game object for holding the atlas mesh atlasMesh.AddComponent <MeshFilter>(); atlasMesh.AddComponent <MeshRenderer>(); atlasMesh.transform.rotation = Quaternion.Euler(0, 0, 0); atlasMesh.transform.position = new Vector3(0, 0, .5f); atlasMesh.gameObject.layer = layer; } // set up the camera { atlasRenderer.Initialize(layer, atlasWidth, atlasHeight, padding, logLevel); atlasRenderer.SetupCameraGameObject(cameraGameObject); } }
public IEnumerator CreateAtlases(ProgressUpdateDelegate progressInfo, MB3_TextureCombinerPipeline.TexturePipelineData data, MB3_TextureCombiner combiner, AtlasPackingResult packedAtlasRects, Texture2D[] atlases, MB2_EditorMethodsInterface textureEditorMethods, MB2_LogLevel LOG_LEVEL) { Debug.Assert(!data.OnlyOneTextureInAtlasReuseTextures()); Rect[] uvRects = packedAtlasRects.rects; int atlasSizeX = packedAtlasRects.atlasX; int atlasSizeY = packedAtlasRects.atlasY; if (LOG_LEVEL >= MB2_LogLevel.debug) { Debug.Log("Generated atlas will be " + atlasSizeX + "x" + atlasSizeY); } int layer = data._layerTexturePackerFastV2; Debug.Assert(layer >= 0 && layer <= 32); //create a game object mesh = new Mesh(); renderAtlasesGO = null; cameraGameObject = null; try { System.Diagnostics.Stopwatch db_time_MB3_TextureCombinerPackerMeshBakerFastV2_CreateAtlases = new System.Diagnostics.Stopwatch(); db_time_MB3_TextureCombinerPackerMeshBakerFastV2_CreateAtlases.Start(); renderAtlasesGO = new GameObject("MBrenderAtlasesGO"); cameraGameObject = new GameObject("MBCameraGameObject"); MB3_AtlasPackerRenderTextureUsingMesh atlasRenderer = new MB3_AtlasPackerRenderTextureUsingMesh(); OneTimeSetup(atlasRenderer, renderAtlasesGO, cameraGameObject, atlasSizeX, atlasSizeY, data._atlasPadding, layer, LOG_LEVEL); if (data._considerNonTextureProperties && LOG_LEVEL >= MB2_LogLevel.warn) { Debug.LogWarning("Blend Non-Texture Properties has limited functionality when used with Mesh Baker Texture Packer Fast."); } List <Material> mats = new List <Material>(); for (int propIdx = 0; propIdx < data.numAtlases; propIdx++) { Texture2D atlas = null; if (!MB3_TextureCombinerPipeline._ShouldWeCreateAtlasForThisProperty(propIdx, data._considerNonTextureProperties, data.allTexturesAreNullAndSameColor)) { atlas = null; if (LOG_LEVEL >= MB2_LogLevel.debug) { Debug.Log("Not creating atlas for " + data.texPropertyNames[propIdx].name + " because textures are null and default value parameters are the same."); } } else { if (progressInfo != null) { progressInfo("Creating Atlas '" + data.texPropertyNames[propIdx].name + "'", .01f); } // configure it if (LOG_LEVEL >= MB2_LogLevel.debug) { Debug.Log("About to render " + data.texPropertyNames[propIdx].name + " isNormal=" + data.texPropertyNames[propIdx].isNormalMap); } // Create the mesh mats.Clear(); MB3_AtlasPackerRenderTextureUsingMesh.MeshAtlas.BuildAtlas(packedAtlasRects, data.distinctMaterialTextures, propIdx, packedAtlasRects.atlasX, packedAtlasRects.atlasY, mesh, mats, data.texPropertyNames[propIdx], data, combiner, textureEditorMethods, LOG_LEVEL); { MeshFilter mf = renderAtlasesGO.GetComponent <MeshFilter>(); mf.sharedMesh = mesh; MeshRenderer mrr = renderAtlasesGO.GetComponent <MeshRenderer>(); Material[] mrs = mats.ToArray(); mrr.sharedMaterials = mrs; } // Render atlas = atlasRenderer.DoRenderAtlas(cameraGameObject, packedAtlasRects.atlasX, packedAtlasRects.atlasY, data.texPropertyNames[propIdx].isNormalMap, data.texPropertyNames[propIdx]); { for (int i = 0; i < mats.Count; i++) { MB_Utility.Destroy(mats[i]); } mats.Clear(); } if (LOG_LEVEL >= MB2_LogLevel.debug) { Debug.Log("Saving atlas " + data.texPropertyNames[propIdx].name + " w=" + atlas.width + " h=" + atlas.height + " id=" + atlas.GetInstanceID()); } } atlases[propIdx] = atlas; if (progressInfo != null) { progressInfo("Saving atlas: '" + data.texPropertyNames[propIdx].name + "'", .04f); } if (data.resultType == MB2_TextureBakeResults.ResultType.atlas) { MB3_TextureCombinerPackerRoot.SaveAtlasAndConfigureResultMaterial(data, textureEditorMethods, atlases[propIdx], data.texPropertyNames[propIdx], propIdx); } combiner._destroyTemporaryTextures(data.texPropertyNames[propIdx].name); // need to save atlases before doing this } if (LOG_LEVEL >= MB2_LogLevel.debug) { Debug.LogFormat("Timing MB3_TextureCombinerPackerMeshBakerFastV2.CreateAtlases={0}", db_time_MB3_TextureCombinerPackerMeshBakerFastV2_CreateAtlases.ElapsedMilliseconds * .001f); } } catch (Exception ex) { Debug.LogError(ex.Message + "\n" + ex.StackTrace.ToString()); } finally { if (renderAtlasesGO != null) { MB_Utility.Destroy(renderAtlasesGO); } if (cameraGameObject != null) { MB_Utility.Destroy(cameraGameObject); } if (mesh != null) { MB_Utility.Destroy(mesh); } } yield break; }