From 25042439e1454c000dc6d8e951ea9a67f6a980e2 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 25 Jul 2018 17:49:50 +0900 Subject: [PATCH] Separate MeshExtensions --- Scripts/SkinnedMeshUtility/BoneNormalizer.cs | 47 ++------------- Scripts/SkinnedMeshUtility/MeshExtensions.cs | 58 +++++++++++++++++++ .../SkinnedMeshUtility/MeshExtensions.cs.meta | 12 ++++ 3 files changed, 74 insertions(+), 43 deletions(-) create mode 100644 Scripts/SkinnedMeshUtility/MeshExtensions.cs create mode 100644 Scripts/SkinnedMeshUtility/MeshExtensions.cs.meta diff --git a/Scripts/SkinnedMeshUtility/BoneNormalizer.cs b/Scripts/SkinnedMeshUtility/BoneNormalizer.cs index 74fbc9697..8ae6d21d1 100644 --- a/Scripts/SkinnedMeshUtility/BoneNormalizer.cs +++ b/Scripts/SkinnedMeshUtility/BoneNormalizer.cs @@ -333,7 +333,10 @@ namespace VRM // Meshに乗っているボーンの姿勢を適用する var dstFilter = dst.gameObject.AddComponent(); - dstFilter.sharedMesh = TransformMesh(srcFilter.sharedMesh, src.localToWorldMatrix); + + var dstMesh = srcFilter.sharedMesh.Copy(); + dstMesh.ApplyRotationAndScale(src.localToWorldMatrix); + dstFilter.sharedMesh = dstMesh; // Materialをコピー var dstRenderer = dst.gameObject.AddComponent(); @@ -373,47 +376,5 @@ namespace VRM return normalized; } - - /// - /// - /// - /// - /// - /// - static Mesh TransformMesh(Mesh src, Matrix4x4 m) - { - m.SetColumn(3, new Vector4(0, 0, 0, 1)); - - var mesh = new Mesh(); - mesh.name = src.name + "(transformed)"; - - mesh.vertices = src.vertices.Select(x => m.MultiplyPoint(x)).ToArray(); - if (src.normals != null && src.normals.Length > 0) - { - mesh.normals = src.normals.Select(x => m.MultiplyVector(x)).ToArray(); - } - if (src.tangents != null && src.tangents.Length > 0) - { - mesh.tangents = src.tangents.Select(x => - { - var t = m.MultiplyVector((Vector3)x); - return new Vector4(t.x, t.y, t.z, x.w); - }).ToArray(); - } - - if (src.colors != null && src.colors.Length > 0) mesh.colors = src.colors; - if (src.uv != null && src.uv.Length > 0) mesh.uv = src.uv; - if (src.uv2 != null && src.uv2.Length > 0) mesh.uv2 = src.uv2; - if (src.uv3 != null && src.uv3.Length > 0) mesh.uv3 = src.uv3; - if (src.uv4 != null && src.uv4.Length > 0) mesh.uv4 = src.uv4; - - mesh.subMeshCount = src.subMeshCount; - for(int i=0; i 0) dst.colors = src.colors; + if (src.uv != null && src.uv.Length > 0) dst.uv = src.uv; + if (src.uv2 != null && src.uv2.Length > 0) dst.uv2 = src.uv2; + if (src.uv3 != null && src.uv3.Length > 0) dst.uv3 = src.uv3; + if (src.uv4 != null && src.uv4.Length > 0) dst.uv4 = src.uv4; + + dst.subMeshCount = src.subMeshCount; + for (int i = 0; i < dst.subMeshCount; ++i) + { + dst.SetIndices(src.GetIndices(i), src.GetTopology(i), i); + } + + return dst; + } + + public static void ApplyRotationAndScale(this Mesh src, Matrix4x4 m) + { + m.SetColumn(3, new Vector4(0, 0, 0, 1)); + src.ApplyMatrix(m); + } + + public static void ApplyMatrix(this Mesh src, Matrix4x4 m) + { + m.SetColumn(3, new Vector4(0, 0, 0, 1)); + + src.vertices = src.vertices.Select(x => m.MultiplyPoint(x)).ToArray(); + if (src.normals != null && src.normals.Length > 0) + { + src.normals = src.normals.Select(x => m.MultiplyVector(x)).ToArray(); + } + if (src.tangents != null && src.tangents.Length > 0) + { + src.tangents = src.tangents.Select(x => + { + var t = m.MultiplyVector((Vector3)x); + return new Vector4(t.x, t.y, t.z, x.w); + }).ToArray(); + } + } + } +} diff --git a/Scripts/SkinnedMeshUtility/MeshExtensions.cs.meta b/Scripts/SkinnedMeshUtility/MeshExtensions.cs.meta new file mode 100644 index 000000000..7485178c0 --- /dev/null +++ b/Scripts/SkinnedMeshUtility/MeshExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4181f0b5e9a271b45b3e995a38202780 +timeCreated: 1532506262 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: