From 71d35a062d5c3228ed6b87b4c6d860aa6e3bd615 Mon Sep 17 00:00:00 2001 From: TORISOUP Date: Wed, 15 Apr 2020 17:11:24 +0900 Subject: [PATCH] fix GC allocate on BoneMeshEraser --- .../SkinnedMeshUtility/BoneMeshEraser.cs | 82 ++++++++++++++++--- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/Assets/VRM/UniVRM/Scripts/SkinnedMeshUtility/BoneMeshEraser.cs b/Assets/VRM/UniVRM/Scripts/SkinnedMeshUtility/BoneMeshEraser.cs index 4a1015ff5..556c9f6c5 100644 --- a/Assets/VRM/UniVRM/Scripts/SkinnedMeshUtility/BoneMeshEraser.cs +++ b/Assets/VRM/UniVRM/Scripts/SkinnedMeshUtility/BoneMeshEraser.cs @@ -8,6 +8,22 @@ namespace VRM { public static class BoneMeshEraser { + private struct ExcludeBoneIndex + { + public readonly bool Bone0; + public readonly bool Bone1; + public readonly bool Bone2; + public readonly bool Bone3; + + public ExcludeBoneIndex(bool bone0, bool bone1, bool bone2, bool bone3) + { + Bone0 = bone0; + Bone1 = bone1; + Bone2 = bone2; + Bone3 = bone3; + } + } + [Serializable] public struct EraseBone { @@ -23,7 +39,7 @@ namespace VRM static int ExcludeTriangles(int[] triangles, BoneWeight[] bws, int[] exclude) { int count = 0; - if (bws != null && bws.Length>0) + if (bws != null && bws.Length > 0) { for (int i = 0; i < triangles.Length; i += 3) { @@ -33,24 +49,27 @@ namespace VRM { var bw = bws[a]; - if (bw.weight0 > 0 && exclude.Contains(bw.boneIndex0)) continue; - if (bw.weight1 > 0 && exclude.Contains(bw.boneIndex1)) continue; - if (bw.weight2 > 0 && exclude.Contains(bw.boneIndex2)) continue; - if (bw.weight3 > 0 && exclude.Contains(bw.boneIndex3)) continue; + var eb = AreBoneContains(ref exclude, bw.boneIndex0, bw.boneIndex1, bw.boneIndex2, bw.boneIndex3); + if (bw.weight0 > 0 && eb.Bone0) continue; + if (bw.weight1 > 0 && eb.Bone1) continue; + if (bw.weight2 > 0 && eb.Bone2) continue; + if (bw.weight3 > 0 && eb.Bone3) continue; } { var bw = bws[b]; - if (bw.weight0 > 0 && exclude.Contains(bw.boneIndex0)) continue; - if (bw.weight1 > 0 && exclude.Contains(bw.boneIndex1)) continue; - if (bw.weight2 > 0 && exclude.Contains(bw.boneIndex2)) continue; - if (bw.weight3 > 0 && exclude.Contains(bw.boneIndex3)) continue; + var eb = AreBoneContains(ref exclude, bw.boneIndex0, bw.boneIndex1, bw.boneIndex2, bw.boneIndex3); + if (bw.weight0 > 0 && eb.Bone0) continue; + if (bw.weight1 > 0 && eb.Bone1) continue; + if (bw.weight2 > 0 && eb.Bone2) continue; + if (bw.weight3 > 0 && eb.Bone3) continue; } { var bw = bws[c]; - if (bw.weight0 > 0 && exclude.Contains(bw.boneIndex0)) continue; - if (bw.weight1 > 0 && exclude.Contains(bw.boneIndex1)) continue; - if (bw.weight2 > 0 && exclude.Contains(bw.boneIndex2)) continue; - if (bw.weight3 > 0 && exclude.Contains(bw.boneIndex3)) continue; + var eb = AreBoneContains(ref exclude, bw.boneIndex0, bw.boneIndex1, bw.boneIndex2, bw.boneIndex3); + if (bw.weight0 > 0 && eb.Bone0) continue; + if (bw.weight1 > 0 && eb.Bone1) continue; + if (bw.weight2 > 0 && eb.Bone2) continue; + if (bw.weight3 > 0 && eb.Bone3) continue; } triangles[count++] = a; @@ -58,9 +77,46 @@ namespace VRM triangles[count++] = c; } } + return count; } + private static ExcludeBoneIndex AreBoneContains(ref int[] exclude, int boneIndex0, int boneIndex1, + int boneIndex2, int boneIndex3) + { + var b0 = false; + var b1 = false; + var b2 = false; + var b3 = false; + for (int i = 0; i < exclude.Length; i++) + { + if (exclude[i] == boneIndex0) + { + b0 = true; + continue; + } + + if (exclude[i] == boneIndex1) + { + b1 = true; + continue; + } + + if (exclude[i] == boneIndex2) + { + b2 = true; + continue; + } + + if (exclude[i] == boneIndex3) + { + b3 = true; + } + } + + return new ExcludeBoneIndex(b0, b1, b2, b3); + } + public static Mesh CreateErasedMesh(Mesh src, int[] eraseBoneIndices) { /*