コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Core_Combine.cs プロジェクト: metkarna/AgeOfVoxels
        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));
        }
コード例 #3
0
        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);
        }