Beispiel #1
0
        /// <summary>
        /// go を root としたヒエラルキーから Renderer を集めて、統合された Mesh 作成する
        /// </summary>
        /// <param name="go"></param>
        /// <param name="onlyBlendShapeRenderers">
        /// true: BlendShapeを保持するSkinnedMeshRendererのみ
        /// false: BlendShapeを保持しないSkinnedMeshRenderer + MeshRenderer
        /// null: すべてのSkinnedMeshRenderer + MeshRenderer
        /// </param>
        /// <returns></returns>
        public static MeshIntegrationResult Integrate(GameObject go, MeshEnumerateOption onlyBlendShapeRenderers,
                                                      IEnumerable <Mesh> excludes    = null,
                                                      bool destroyIntegratedRenderer = false)
        {
            var exclude = new MeshExclude(excludes);

            var integrator = new MeshUtility.MeshIntegrator();

            switch (onlyBlendShapeRenderers)
            {
            case MeshEnumerateOption.OnlyWithBlendShape:
            {
                foreach (var x in EnumerateSkinnedMeshRenderer(go.transform, onlyBlendShapeRenderers))
                {
                    if (exclude.IsExcluded(x))
                    {
                        continue;
                    }
                    integrator.Push(x);
                }
                break;
            }

            case MeshEnumerateOption.OnlyWithoutBlendShape:
            {
                foreach (var x in EnumerateSkinnedMeshRenderer(go.transform, onlyBlendShapeRenderers))
                {
                    if (exclude.IsExcluded(x))
                    {
                        continue;
                    }
                    integrator.Push(x);
                }

                foreach (var x in EnumerateMeshRenderer(go.transform))
                {
                    if (exclude.IsExcluded(x))
                    {
                        continue;
                    }
                    integrator.Push(x);
                }

                break;
            }

            case MeshEnumerateOption.All:
            {
                foreach (var x in EnumerateSkinnedMeshRenderer(go.transform, onlyBlendShapeRenderers))
                {
                    if (exclude.IsExcluded(x))
                    {
                        continue;
                    }
                    integrator.Push(x);
                }

                foreach (var x in EnumerateMeshRenderer(go.transform))
                {
                    if (exclude.IsExcluded(x))
                    {
                        continue;
                    }
                    integrator.Push(x);
                }

                break;
            }
            }

            return(integrator.Integrate(onlyBlendShapeRenderers));
        }
Beispiel #2
0
        public static IEnumerable <SkinnedMeshRenderer> EnumerateSkinnedMeshRenderer(Transform root, MeshEnumerateOption hasBlendShape)
        {
            foreach (var x in Traverse(root))
            {
                var renderer = x.GetComponent <SkinnedMeshRenderer>();
                if (renderer != null &&
                    renderer.gameObject.activeInHierarchy &&
                    renderer.sharedMesh != null &&
                    renderer.enabled)
                {
                    switch (hasBlendShape)
                    {
                    case MeshEnumerateOption.OnlyWithBlendShape:
                        if (renderer.sharedMesh.blendShapeCount > 0)
                        {
                            yield return(renderer);
                        }
                        break;

                    case MeshEnumerateOption.OnlyWithoutBlendShape:
                        if (renderer.sharedMesh.blendShapeCount == 0)
                        {
                            yield return(renderer);
                        }
                        break;

                    case MeshEnumerateOption.All:
                    {
                        yield return(renderer);

                        break;
                    }
                    }
                }
            }
        }
Beispiel #3
0
        public MeshIntegrationResult Integrate(MeshEnumerateOption onlyBlendShapeRenderers)
        {
            var mesh = new Mesh();

            if (Positions.Count > ushort.MaxValue)
            {
                Debug.LogFormat("exceed 65535 vertices: {0}", Positions.Count);
                mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
            }

            mesh.vertices     = Positions.ToArray();
            mesh.normals      = Normals.ToArray();
            mesh.uv           = UV.ToArray();
            mesh.tangents     = Tangents.ToArray();
            mesh.boneWeights  = BoneWeights.ToArray();
            mesh.subMeshCount = SubMeshes.Count;
            for (var i = 0; i < SubMeshes.Count; ++i)
            {
                mesh.SetIndices(SubMeshes[i].Indices.ToArray(), MeshTopology.Triangles, i);
            }
            mesh.bindposes = BindPoses.ToArray();

            // blendshape
            switch (onlyBlendShapeRenderers)
            {
            case MeshEnumerateOption.OnlyWithBlendShape:
            {
                AddBlendShapesToMesh(mesh);
                mesh.name = INTEGRATED_MESH_WITH_BLENDSHAPE_NAME;
                break;
            }

            case MeshEnumerateOption.All:
            {
                AddBlendShapesToMesh(mesh);
                mesh.name = INTEGRATED_MESH_ALL_NAME;
                break;
            }

            case MeshEnumerateOption.OnlyWithoutBlendShape:
            {
                mesh.name = INTEGRATED_MESH_WITHOUT_BLENDSHAPE_NAME;
                break;
            }
            }

            // meshName
            var meshNode = new GameObject();

            switch (onlyBlendShapeRenderers)
            {
            case MeshEnumerateOption.OnlyWithBlendShape:
            {
                meshNode.name = INTEGRATED_MESH_WITH_BLENDSHAPE_NAME;
                break;
            }

            case MeshEnumerateOption.OnlyWithoutBlendShape:
            {
                meshNode.name = INTEGRATED_MESH_WITHOUT_BLENDSHAPE_NAME;
                break;
            }

            case MeshEnumerateOption.All:
            {
                meshNode.name = INTEGRATED_MESH_ALL_NAME;
                break;
            }
            }

            var integrated = meshNode.AddComponent <SkinnedMeshRenderer>();

            integrated.sharedMesh      = mesh;
            integrated.sharedMaterials = SubMeshes.Select(x => x.Material).ToArray();
            integrated.bones           = Bones.ToArray();
            Result.IntegratedRenderer  = integrated;
            Result.MeshMap.Integrated  = mesh;
            return(Result);
        }