public MaterialToAtlasRectMapper(TextureBakeResults res)
        {
            resultAsset      = res;
            matsAndSrcUVRect = res.materialsAndUVRects;

            //count the number of times a material appears in the atlas. used for fast lookup
            numTimesMatAppearsInAtlas = new int[matsAndSrcUVRect.Length];
            for (int i = 0; i < matsAndSrcUVRect.Length; i++)
            {
                if (numTimesMatAppearsInAtlas[i] > 1)
                {
                    continue;
                }
                int count = 1;
                for (int j = i + 1; j < matsAndSrcUVRect.Length; j++)
                {
                    if (matsAndSrcUVRect[i].material == matsAndSrcUVRect[j].material)
                    {
                        count++;
                    }
                }
                numTimesMatAppearsInAtlas[i] = count;
                if (count > 1)
                {
                    for (int j = i + 1; j < matsAndSrcUVRect.Length; j++)
                    {
                        if (matsAndSrcUVRect[i].material == matsAndSrcUVRect[j].material)
                        {
                            numTimesMatAppearsInAtlas[j] = count;
                        }
                    }
                }
            }
        }
Example #2
0
 /// <summary>
 /// 创建临时合并材质
 /// </summary>
 protected virtual bool _CreateTemporaryTextrueBakeResult(GameObject[] gos, List <Material> matsOnTargetRenderer)
 {
     if (GetNumObjectsInCombined() > 0)
     {
         Debug.LogError("Can't add objects if there are already objects in combined mesh when 'Texture Bake Result' is not set. " +
                        "Perhaps enable 'Clear Buffers After Bake'");
         return(false);
     }
     _usingTemporaryTextureBakeResult = true;
     _textureBakeResults = TextureBakeResults.CreateForMaterialsOnRenderer(gos, matsOnTargetRenderer);
     return(true);
 }
Example #3
0
        void unpackMat2RectMap(TextureBakeResults tbr)
        {
            List <Material>          ms  = new List <Material>();
            List <MaterialAndUVRect> mss = new List <MaterialAndUVRect>();
            List <Rect> rs = new List <Rect>();

            for (int i = 0; i < OnCombinedTexturesCoroutineAtlasesAndRects.Length; i++)
            {
                AtlasesAndRects          newMesh = OnCombinedTexturesCoroutineAtlasesAndRects[i];
                List <MaterialAndUVRect> map     = newMesh.originMatToRect_map;
                if (map != null)
                {
                    for (int j = 0; j < map.Count; j++)
                    {
                        mss.Add(map[j]);
                        ms.Add(map[j].material);
                        rs.Add(map[j].atlasRect);
                    }
                }
            }
            //tbr.version = MB2_TextureBakeResults.VERSION;
            tbr.materialsAndUVRects = mss.ToArray();
        }
Example #4
0
        /// <summary>
        /// Creates for materials on renderer.
        /// 生成 TextureBakeResult,如果要合并的所有游戏物体都使用相同的材质,则可以使用该 TextureBakeResult。
        /// 将游戏物体的渲染器所使用的所有材质映射到 Atlas 中的矩形0,0..1,1 中。
        /// 用于创建临时 TextureCombineResult,Mesh 合并时,TextureCombineResult 为空时调用
        /// </summary>
        public static TextureBakeResults CreateForMaterialsOnRenderer(GameObject[] gos, List <Material> matsOnTargetRenderer)
        {
            HashSet <Material> fullMaterialList = new HashSet <Material>(matsOnTargetRenderer);

            for (int i = 0; i < gos.Length; i++)
            {
                if (gos[i] == null)
                {
                    Debug.LogError(string.Format("列表中第 {0} 个游戏物体为空", i));
                    return(null);
                }
                Material[] oMats = MeshBakerUtility.GetGOMaterials(gos[i]);
                if (oMats.Length == 0)
                {
                    Debug.LogError(string.Format("列表中第 {0} 个游戏物体没有 renderer 组件", i));
                    return(null);
                }
                for (int j = 0; j < oMats.Length; j++)
                {
                    if (!fullMaterialList.Contains(oMats[j]))
                    {
                        fullMaterialList.Add(oMats[j]);
                    }
                }
            }
            //所有游戏位图的源材质
            Material[] rms = new Material[fullMaterialList.Count];
            fullMaterialList.CopyTo(rms);

            TextureBakeResults       textureCombineResult = (TextureBakeResults)CreateInstance(typeof(TextureBakeResults));
            List <MaterialAndUVRect> sourceMatUVRects     = new List <MaterialAndUVRect>();

            for (int i = 0; i < rms.Length; i++)
            {
                if (rms[i] != null)
                {
                    MaterialAndUVRect matAndUVRect = new MaterialAndUVRect(rms[i],
                                                                           new Rect(0f, 0f, 1f, 1f),
                                                                           true,
                                                                           new Rect(0f, 0f, 1f, 1f),
                                                                           new Rect(0f, 0f, 1f, 1f),
                                                                           new Rect(0, 0, 0, 0),
                                                                           TextureTilingTreatment.none,
                                                                           "");
                    if (!sourceMatUVRects.Contains(matAndUVRect))
                    {
                        sourceMatUVRects.Add(matAndUVRect);
                    }
                }
            }

            textureCombineResult.resultMaterials = new MultiMaterial[sourceMatUVRects.Count];
            for (int i = 0; i < sourceMatUVRects.Count; i++)
            {
                textureCombineResult.resultMaterials[i] = new MultiMaterial();
                List <Material> sourceMats = new List <Material>();
                sourceMats.Add(sourceMatUVRects[i].material);
                textureCombineResult.resultMaterials[i].sourceMaterials  = sourceMats;
                textureCombineResult.resultMaterials[i].combinedMaterial = sourceMatUVRects[i].material;
                textureCombineResult.resultMaterials[i].considerMeshUVs  = false;
            }
            if (rms.Length == 1)
            {
                textureCombineResult.doMultiMaterial = false;
            }
            else
            {
                textureCombineResult.doMultiMaterial = true;
            }

            textureCombineResult.materialsAndUVRects = sourceMatUVRects.ToArray();
            return(textureCombineResult);
        }