static SkinnedMeshRenderer _Integrate(GameObject go, IEnumerable <string> notCombineRendererObjectNames) { var meshNode = new GameObject(); meshNode.name = Random.Range(int.MinValue, int.MaxValue).ToString(); meshNode.transform.SetParent(go.transform, false); var renderers = EnumerateRenderer(go.transform).ToArray(); // レンダラから情報を集める var integrator = new Integrator(); foreach (var x in renderers.Where(renderer => !notCombineRendererObjectNames.Contains(renderer.name))) { integrator.Push(x); } var mesh = new Mesh(); mesh.name = "integrated"; if (integrator.Positions.Count > ushort.MaxValue) { #if UNITY_2017_3_OR_NEWER Debug.LogFormat("exceed 65535 vertices: {0}", integrator.Positions.Count); mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; #else throw new NotImplementedException(String.Format("exceed 65535 vertices: {0}", integrator.Positions.Count.ToString())); #endif } mesh.vertices = integrator.Positions.ToArray(); mesh.normals = integrator.Normals.ToArray(); mesh.uv = integrator.UV.ToArray(); mesh.tangents = integrator.Tangents.ToArray(); mesh.boneWeights = integrator.BoneWeights.ToArray(); mesh.subMeshCount = integrator.SubMeshes.Count; for (var i = 0; i < integrator.SubMeshes.Count; ++i) { mesh.SetIndices(integrator.SubMeshes[i].Indices.ToArray(), MeshTopology.Triangles, i); } mesh.bindposes = integrator.BindPoses.ToArray(); integrator.AddBlendShapesToMesh(mesh); var integrated = meshNode.AddComponent <SkinnedMeshRenderer>(); integrated.sharedMesh = mesh; integrated.sharedMaterials = integrator.SubMeshes.Select(x => x.Material).ToArray(); integrated.bones = integrator.Bones.ToArray(); return(integrated); }
static SkinnedMeshRenderer _Integrate(GameObject go, bool hasBlendShape) { var meshNode = new GameObject(); if (hasBlendShape) { meshNode.name = "MeshIntegrator(BlendShape)"; } else { meshNode.name = "MeshIntegrator"; } meshNode.transform.SetParent(go.transform, false); var renderers = EnumerateRenderer(go.transform, hasBlendShape).ToArray(); // Root objectを選出する var root = renderers.Select(x => x.rootBone != null ? x.rootBone : x.transform) .Select(x => Ancestors(x).Reverse().ToArray()) .Aggregate((a, b) => { int i = 0; for (; i < a.Length && i < b.Length; ++i) { if (a[i] != b[i]) { break; } } return(a.Take(i).ToArray()); }) .Last() ; Debug.LogFormat("root bone: {0}", root.name); // レンダラから情報を集める var integrator = new Integrator(); foreach (var x in renderers) { integrator.Push(x); } var mesh = new Mesh(); mesh.name = "integrated"; if (integrator.Positions.Count > ushort.MaxValue) { #if UNITY_2017_3_OR_NEWER Debug.LogFormat("exceed 65535 vertices: {0}", integrator.Positions.Count); mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; #else throw new NotImplementedException(String.Format("exceed 65535 vertices: {0}", integrator.Positions.Count.ToString())); #endif } mesh.vertices = integrator.Positions.ToArray(); mesh.normals = integrator.Normals.ToArray(); mesh.uv = integrator.UV.ToArray(); mesh.tangents = integrator.Tangents.ToArray(); mesh.boneWeights = integrator.BoneWeights.ToArray(); mesh.subMeshCount = integrator.SubMeshes.Count; for (var i = 0; i < integrator.SubMeshes.Count; ++i) { mesh.SetIndices(integrator.SubMeshes[i].Indices.ToArray(), MeshTopology.Triangles, i); } mesh.bindposes = integrator.BindPoses.ToArray(); if (hasBlendShape) { integrator.AddBlendShapesToMesh(mesh); } var integrated = meshNode.AddComponent <SkinnedMeshRenderer>(); integrated.sharedMesh = mesh; integrated.sharedMaterials = integrator.SubMeshes.Select(x => x.Material).ToArray(); integrated.bones = integrator.Bones.ToArray(); return(integrated); }