Exemple #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);
        }
Exemple #2
0
        private static Result GetResult(Dictionary <MaterialData, RendererList> matMap, Texture2D texture, Rect[] newUV, bool combineMesh)
        {
            var result = new Result()
            {
                Meshs     = new List <Mesh>(),
                Materials = new List <Material>(),
                Texture   = texture,
                Root      = new GameObject("Root").transform,
            };

            result.Root.position   = Vector3.zero;
            result.Root.rotation   = Quaternion.identity;
            result.Root.localScale = Vector3.one;
            texture.name           = "Texture";
            int matIndex = 0;

            foreach (var pair in matMap)
            {
                // New Material
                var mat = pair.Key.GetMaterial(texture);
                mat.name = "Material " + matIndex.ToString();
                result.Materials.Add(mat);

                // Mesh Data
                List <Vector3> _verts = null;
                List <Vector2> _uvs   = null;
                if (combineMesh)
                {
                    _verts = new List <Vector3>();
                    _uvs   = new List <Vector2>();
                }

                for (int index = 0; index < pair.Value.List.Count; index++)
                {
                    var rData = pair.Value.List[index];

                    // New Mesh
                    var remap    = newUV[rData.PackingIndex];
                    var sourceUV = rData.Mesh.uv;
                    var uvs      = new Vector2[sourceUV.Length];
                    for (int i = 0; i < sourceUV.Length; i++)
                    {
                        uvs[i] = new Vector2(
                            ((sourceUV[i].x - rData.RemapUV.x) / rData.RemapUV.width) * remap.width + remap.x,
                            ((sourceUV[i].y - rData.RemapUV.y) / rData.RemapUV.height) * remap.height + remap.y
                            );
                    }

                    if (combineMesh)
                    {
                        var sourceVerts = rData.Mesh.vertices;
                        var vs          = new Vector3[sourceVerts.Length];
                        for (int i = 0; i < vs.Length; i++)
                        {
                            vs[i] = rData.Object.TransformPoint(sourceVerts[i]);
                        }
                        _verts.AddRange(vs);
                        _uvs.AddRange(uvs);
                    }
                    else
                    {
                        // Mesh
                        var mesh = new Mesh {
                            name      = "Mesh " + matIndex.ToString() + "-" + index.ToString(),
                            vertices  = rData.Mesh.vertices,
                            triangles = rData.Mesh.triangles,
                            colors    = rData.Mesh.colors,
                        };
                        mesh.uv = uvs;
                        mesh.RecalculateNormals();
                        mesh.UploadMeshData(false);
                        result.Meshs.Add(mesh);

                        // New Object in Root
                        var tf = new GameObject(rData.Object.name, typeof(MeshRenderer), typeof(MeshFilter)).transform;
                        tf.SetParent(result.Root);
                        tf.position   = rData.Object.position;
                        tf.rotation   = rData.Object.rotation;
                        tf.localScale = rData.Object.lossyScale;

                        // Renderer
                        var mr = tf.GetComponent <MeshRenderer>();
                        var mf = tf.GetComponent <MeshFilter>();
                        mr.material = mat;
                        mf.mesh     = mesh;
                    }
                }

                if (combineMesh)
                {
                    var mesh = new UnlimitiedMesh(_verts, _uvs);
                    for (int i = 0; i < mesh.Count; i++)
                    {
                        var _m = mesh.GetMeshAt(i);
                        _m.name = "Mesh " + matIndex.ToString() + "-" + i.ToString();
                        result.Meshs.Add(_m);

                        // New Object in Root
                        var tf = new GameObject("Combined Model " + i.ToString(), typeof(MeshRenderer), typeof(MeshFilter)).transform;
                        tf.SetParent(result.Root);
                        tf.position   = Vector3.zero;
                        tf.rotation   = Quaternion.identity;
                        tf.localScale = Vector3.one;

                        // Renderer
                        var mr = tf.GetComponent <MeshRenderer>();
                        var mf = tf.GetComponent <MeshFilter>();
                        mr.material = mat;
                        mf.mesh     = _m;
                    }
                }

                matIndex++;
            }
            return(result);
        }