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