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);
        }
Esempio n. 2
0
        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);
        }