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