private static void GetResultFromArea(out UnlimitiedMesh uMesh, out Texture2D texture) { // Texture var rects = RectPacking.PackTextures(out texture, PackingList, true, false); // Mesh var verts = new List <Vector3>(); var uvs = new List <Vector2>(); var boneWeights = new List <BoneWeight>(); Vector3 modelOffset = new Vector3( 0.5f - SizeX * Pivot.x, 0.5f - SizeY * Pivot.y, 0.5f - SizeZ * Pivot.z ); for (int i = 0; i < AreaList.Count; i++) { var area = AreaList[i]; // Vert verts.Add((area.A + modelOffset) * ModelScale); verts.Add((area.B + modelOffset) * ModelScale); verts.Add((area.C + modelOffset) * ModelScale); verts.Add((area.D + modelOffset) * ModelScale); // Weight if (PointWeights != null) { boneWeights.Add(PointWeights[Mathf.RoundToInt(area.A.x + 0.5f), Mathf.RoundToInt(area.A.y + 0.5f), Mathf.RoundToInt(area.A.z + 0.5f)]); boneWeights.Add(PointWeights[Mathf.RoundToInt(area.B.x + 0.5f), Mathf.RoundToInt(area.B.y + 0.5f), Mathf.RoundToInt(area.B.z + 0.5f)]); boneWeights.Add(PointWeights[Mathf.RoundToInt(area.C.x + 0.5f), Mathf.RoundToInt(area.C.y + 0.5f), Mathf.RoundToInt(area.C.z + 0.5f)]); boneWeights.Add(PointWeights[Mathf.RoundToInt(area.D.x + 0.5f), Mathf.RoundToInt(area.D.y + 0.5f), Mathf.RoundToInt(area.D.z + 0.5f)]); } // UV Rect uvRect = SupportLightMap ? rects[i] : rects[AreaPackingMap[i]]; if (area.IsLUB) { uvs.Add(uvRect.min); uvs.Add(new Vector2(uvRect.x + uvRect.width, uvRect.y)); uvs.Add(uvRect.max); uvs.Add(new Vector2(uvRect.x, uvRect.y + uvRect.height)); } else { uvs.Add(uvRect.min); uvs.Add(new Vector2(uvRect.x, uvRect.y + uvRect.height)); uvs.Add(uvRect.max); uvs.Add(new Vector2(uvRect.x + uvRect.width, uvRect.y)); } } uMesh = new UnlimitiedMesh(verts, uvs, boneWeights); }
private static Rect[] GetPackedTexture(Dictionary <MaterialData, RendererList> matMap, out Texture2D texture) { var packingList = new List <PackingData>(); foreach (var pair in matMap) { for (int index = 0; index < pair.Value.List.Count; index++) { var rData = pair.Value.List[index]; if (rData.Mesh == null) { continue; } var uvs = rData.Mesh.uv; // Get Remap UV var minmax = new Vector4(1, 1, 0, 0); Vector2 uv; for (int i = 0; i < uvs.Length; i++) { uv = uvs[i]; minmax.x = Mathf.Min(minmax.x, uv.x); minmax.y = Mathf.Min(minmax.y, uv.y); minmax.z = Mathf.Max(minmax.z, uv.x); minmax.w = Mathf.Max(minmax.w, uv.y); } var remapUV = new Rect(minmax.x, minmax.y, minmax.z - minmax.x, minmax.w - minmax.y); rData.RemapUV = remapUV; // Get New Texture if (rData.Texture) { int sourceWidth = rData.Texture.width; int sourceHeight = rData.Texture.height; int width = (int)(sourceWidth * remapUV.width); int height = (int)(sourceHeight * remapUV.height); var colors = rData.Texture.GetPixels( (int)(remapUV.x * sourceWidth), (int)(remapUV.y * sourceHeight), width, height ); rData.PackingIndex = packingList.Count; packingList.Add(new PackingData(width, height, colors)); } else { rData.PackingIndex = packingList.Count; packingList.Add(new PackingData(1, 1, new Color[1])); } } } return(RectPacking.PackTextures(out texture, packingList, true, false)); }
private static Result Pack2DTextures(Color[][] colorss, int[] widths, int[] heights, Vector2 pivot) { int tCount = colorss.Length; Result resultInfo = new Result() { Pivots = new Vector2[6] { pivot, pivot, pivot, pivot, Vector2.one * 0.5f, Vector2.one * 0.5f }, }; Texture2D[] textures = new Texture2D[colorss.Length]; for (int i = 0; i < textures.Length; i++) { textures[i] = new Texture2D(widths[i], heights[i], TextureFormat.ARGB32, false); textures[i].SetPixels(colorss[i]); textures[i].Apply(); } var packingList = new List <PackingData>(); for (int i = 0; i < textures.Length; i++) { var t = textures[i]; packingList.Add(new PackingData(t.width, t.height, t.GetPixels(), false)); } Rect[] rects = RectPacking.PackTextures(out resultInfo.Texture, packingList, false, true); resultInfo.Width = resultInfo.Texture.width; resultInfo.Height = resultInfo.Texture.height; for (int i = 0; i < rects.Length; i++) { rects[i].x *= resultInfo.Width; rects[i].y *= resultInfo.Height; rects[i].width *= resultInfo.Width; rects[i].height *= resultInfo.Height; rects[i].width = rects[i].width - 1; rects[i].height = rects[i].height - 1; } resultInfo.Rects = rects; return(resultInfo); }