コード例 #1
0
 /**
  * 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]);
                         }
                     }
                 }
             }
         }
     }
 }
コード例 #2
0
    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);
    }