diff --git a/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegrator.cs b/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegrator.cs index 76b4bffeb..c194ff9bf 100644 --- a/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegrator.cs +++ b/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegrator.cs @@ -21,8 +21,8 @@ namespace UniGLTF.MeshUtility public Vector3[] Normals; public Vector3[] Tangents; } - -// public List Renderers { get; private set; } + + public MeshIntegrationResult Result; public List Positions { get; private set; } public List Normals { get; private set; } public List UV { get; private set; } @@ -76,7 +76,7 @@ namespace UniGLTF.MeshUtility public MeshIntegrator() { -// Renderers = new List(); + Result = new MeshIntegrationResult(); Positions = new List(); Normals = new List(); @@ -103,6 +103,8 @@ namespace UniGLTF.MeshUtility public void Push(MeshRenderer renderer) { + Result.SourceMeshRenderers.Add(renderer); + var meshFilter = renderer.GetComponent(); if (meshFilter == null) { @@ -176,6 +178,8 @@ namespace UniGLTF.MeshUtility public void Push(SkinnedMeshRenderer renderer) { + Result.SourceSkinnedMeshRenderers.Add(renderer); + var mesh = renderer.sharedMesh; if (mesh == null) { @@ -183,8 +187,6 @@ namespace UniGLTF.MeshUtility return; } -// Renderers.Add(renderer); - var indexOffset = Positions.Count; var boneIndexOffset = Bones.Count; @@ -249,5 +251,57 @@ namespace UniGLTF.MeshUtility }); } } + + public const string INTEGRATED_MESH_NAME = "MeshesIntegrated"; + public const string INTEGRATED_MESH_BLENDSHAPE_NAME = "MeshesBlendShapeIntegrated"; + + public void Intgrate(bool 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(); + + if (onlyBlendShapeRenderers) + { + AddBlendShapesToMesh(mesh); + mesh.name = INTEGRATED_MESH_BLENDSHAPE_NAME; + } + else + { + mesh.name = INTEGRATED_MESH_NAME; + } + + var meshNode = new GameObject(); + if (onlyBlendShapeRenderers) + { + meshNode.name = "MeshIntegrator(BlendShape)"; + } + else + { + meshNode.name = "MeshIntegrator"; + } + + var integrated = meshNode.AddComponent(); + integrated.sharedMesh = mesh; + integrated.sharedMaterials = SubMeshes.Select(x => x.Material).ToArray(); + integrated.bones = Bones.ToArray(); + Result.IntegratedRenderer = integrated; + } } -} \ No newline at end of file +} diff --git a/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegratorUtility.cs b/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegratorUtility.cs index 5ae99d60a..b91ec7d5a 100644 --- a/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegratorUtility.cs +++ b/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegratorUtility.cs @@ -6,29 +6,17 @@ namespace UniGLTF.MeshUtility { public static class MeshIntegratorUtility { - public const string INTEGRATED_MESH_NAME = "MeshesIntegrated"; - public const string INTEGRATED_MESH_BLENDSHAPE_NAME = "MeshesBlendShapeIntegrated"; + public static string INTEGRATED_MESH_NAME => MeshIntegrator.INTEGRATED_MESH_NAME; + public static string INTEGRATED_MESH_BLENDSHAPE_NAME => MeshIntegrator.INTEGRATED_MESH_BLENDSHAPE_NAME; + /// /// go を root としたヒエラルキーから Renderer を集めて、統合された Mesh 作成する /// /// /// BlendShapeを保持するSkinnedMeshRendererのみ/BlendShapeを保持しないSkinnedMeshRenderer + MeshRenderer /// - public static MeshIntegrationResult Integrate(GameObject go, bool onlyBlendShapeRenderers) + public static MeshIntegrationResult Integrate(GameObject go, bool onlyBlendShapeRenderers, IReadOnlyList excludes = null) { - var result = new MeshIntegrationResult(); - - var meshNode = new GameObject(); - if (onlyBlendShapeRenderers) - { - meshNode.name = "MeshIntegrator(BlendShape)"; - } - else - { - meshNode.name = "MeshIntegrator"; - } - meshNode.transform.SetParent(go.transform, false); - // レンダラから情報を集める var integrator = new MeshUtility.MeshIntegrator(); @@ -37,7 +25,6 @@ namespace UniGLTF.MeshUtility foreach (var x in EnumerateSkinnedMeshRenderer(go.transform, true)) { integrator.Push(x); - result.SourceSkinnedMeshRenderers.Add(x); } } else @@ -45,53 +32,17 @@ namespace UniGLTF.MeshUtility foreach (var x in EnumerateSkinnedMeshRenderer(go.transform, false)) { integrator.Push(x); - result.SourceSkinnedMeshRenderers.Add(x); } foreach (var x in EnumerateMeshRenderer(go.transform)) { integrator.Push(x); - result.SourceMeshRenderers.Add(x); } } - var mesh = new Mesh(); - - if (integrator.Positions.Count > ushort.MaxValue) - { - Debug.LogFormat("exceed 65535 vertices: {0}", integrator.Positions.Count); - mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; - } - - 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 (onlyBlendShapeRenderers) - { - integrator.AddBlendShapesToMesh(mesh); - mesh.name = INTEGRATED_MESH_BLENDSHAPE_NAME; - } - else - { - mesh.name = INTEGRATED_MESH_NAME; - } - - var integrated = meshNode.AddComponent(); - integrated.sharedMesh = mesh; - integrated.sharedMaterials = integrator.SubMeshes.Select(x => x.Material).ToArray(); - integrated.bones = integrator.Bones.ToArray(); - result.IntegratedRenderer = integrated; - - return result; + integrator.Intgrate(onlyBlendShapeRenderers); + integrator.Result.IntegratedRenderer.transform.SetParent(go.transform, false); + return integrator.Result; } public static IEnumerable EnumerateSkinnedMeshRenderer(Transform root, bool hasBlendShape)