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; } } } } }
/// <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); }
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(); }
/// <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); }