From 783e4c05ec8f07bf348ee749e796931947f1b34f Mon Sep 17 00:00:00 2001 From: pochang007 Date: Mon, 25 Jan 2021 18:48:30 +0900 Subject: [PATCH 1/2] updated MeshUtility editor --- .../Documentation/images/interface_2.jpg | Bin 21774 -> 24605 bytes .../Documentation/images/interface_4.jpg | Bin 0 -> 14706 bytes .../Documentation/images/interface_4.jpg.meta | 88 ++++++++++++++++++ .../Documentation/notes/MeshSeparator.md | 8 +- .../MeshUtility/Editor/MeshProcessDialog.cs | 68 +++++++++++--- .../UniGLTF/MeshUtility/Editor/MeshUtility.cs | 70 +++++++------- .../Runtime/MeshIntegratorUtility.cs | 8 +- .../Runtime/StaticMeshIntegrator.cs | 2 +- 8 files changed, 194 insertions(+), 50 deletions(-) create mode 100644 Assets/UniGLTF/MeshUtility/Documentation/images/interface_4.jpg create mode 100644 Assets/UniGLTF/MeshUtility/Documentation/images/interface_4.jpg.meta diff --git a/Assets/UniGLTF/MeshUtility/Documentation/images/interface_2.jpg b/Assets/UniGLTF/MeshUtility/Documentation/images/interface_2.jpg index ce16445a5c750af608c0c4c23d0175decce6fa81..aa2f3d15cf83e645898e6235ef7775cf7ceb53aa 100644 GIT binary patch literal 24605 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 F{x7|ML9GA) literal 21774 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 diff --git a/Assets/UniGLTF/MeshUtility/Documentation/images/interface_4.jpg b/Assets/UniGLTF/MeshUtility/Documentation/images/interface_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..712ee0531642d15fb2fa6d432022c80dd5b1697b GIT binary patch literal 14706 zcmeHM2UJs8x4tw9MGyo8DIx@E(n1eSP`XG5X;MQ#dg$E&6h&%~t{?)^dmvO1QKTci z3epFpNDCq*FO2hMoO%EJ>!1I<_11dpakEac@5#PrpZ)Fc?6cQB*iq~!;GCM0suF;Q zhX+{TJ^*&++`6KVy)6J}XaGC_0Du5OJShMlCz0cB)WYonLY$0;lMS9eJNX6Z0pMKE z3KKw#>%-{)vbY8?t>C^uC(`M4iohuXrwE)PaEibw0{YF%O?QLW@ z4MjBsHC(U5?Ce$i5HMZ8TYA=h4%U)3oN}^fNu_yG0Gq5d!p0V=b3^G@4cwg!+plx+_V(uY7Up+Bzy*XPB_#y}Ap#HxA5MeM-PhT} z(udF4o&DDVZou5F5%#Vg_Abt>Cj(kqxp;cWuz7mg+dyqCZAGnYY()92EQM|OgoJD? z`7CXOh4^fQg>A$|g(M)hLRM_Qnzyn3&AO{6!toc|Hr4_#N0<}L*~1-&hL8Z8!1qc2 zPuavl^qbLt2tUq8oDTFl0%qv}yMb%6C*kE26yk%3>iuWP`5~f$(gJ_dlNLAuSw-ESS%BSo)h3ju2@VAst+4X-6uHS22m@}@x z^~P1Q*a=+GOiV;{hKP{(4AB`7F)@ggiVRm{kkV3~Bd4OLy~sdMOMiiph4V5aGY9hp zdNzJG4lZuqtGpLk1%w57Ae=nBJST(T5raUaB&0NCWHdZX^h`W|`@+5ks6c=l9uEN? z8-P!RM?i&#eG6Q|okbGiPA^XmFn_)9@CgWs&Jcr0NXc*tRp$VFJOToILINTpLfp|M zULfv&fRKua`m&Jxne*C~#B6Rfke}i*LF@|U&9pjwU%D3zNJ6jQP*hS@QB~8`(>E}@ZDee11G9zO+23{d@bvQb@%0N0yZ<2k;iCv-{F8*l zq~w&;7g^akFLU$q3o0s6Rn_R4+PXI_Z{M}PZ)@-99~c}O9vK}QpP8MTUszoFd3j}X zYkOxGv-frX+lgOz0Ks>+e)H^4eo^84!Y3poAS6EV3lHBL*9fQxi7pGBp_bPswsbqs z2Kfm@qY#%_-b}(Stn-D|3eiVO2Ns#(*gSFV7tj7R$3p%s&wg|4cfZB~asoVD@Cc{? zIbf$Q+CSMTgz*ub;99vl6Mmqa8nXOQ1158vK`vIl5iEUvg1`Y`M_^UZHoJUBB6GW; zx_K$Va(Yld@PbCofKx#IHw_ z^g-n;NFbY%=j|BMK$_C>7{6*)hGj#4lOhw8U{PLEhK{gxK&)K>XI#GIO8T0rhmrB8 zSyZ9YQy#>0?h216T*6(%17#@3QJo1+-TBh)j(M2lvbtl>VBKC7iBGJ=*y-6uc)qzC zUSO_n>CXK4?y}?d7>{Uk>@E5p=`FH=2`_88mc82!jDv1pFb8gs!pj=H(b*UT*U&?MRW-Vbbj);Xh$5$egqaFD9>)8}{mcQJVeyn8}!A{gr7WxrXtWcjJ-S536Vpl9%-T?f@{vyw+3@_mg0huY zS87rIg>G(q4L0GaQd(`<E@+6#Sgs=?k7ad-Fi-M<^!ngmi_pyFK`R(v_-9%w8G$Qv9{H^Km z2n)=Eag∓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 @@ -12,10 +12,14 @@ From menu go to `UniGLTF` -> `Mesh Utility` -> `MeshProcessing Wizard`, select ` -The separate meshes are saved in the Assets folder. GameObjects with separate meshes are also available in the Hierarchy Window: +The separate meshes are saved in the Assets folder. +In the Hierarchy Window, click the generated GameObject and export. + + + In this example, the model's mesh are split into two parts: face and body: Face: with BlendShape | Body: without BlendShape diff --git a/Assets/UniGLTF/MeshUtility/Editor/MeshProcessDialog.cs b/Assets/UniGLTF/MeshUtility/Editor/MeshProcessDialog.cs index 7ce167d11..6cecdc4e4 100644 --- a/Assets/UniGLTF/MeshUtility/Editor/MeshProcessDialog.cs +++ b/Assets/UniGLTF/MeshUtility/Editor/MeshProcessDialog.cs @@ -1,10 +1,8 @@ +using System; +using System.Reflection; using UnityEngine; using UnityEditor; -using System.Reflection; -using MeshUtility; -using System.IO; -using System; -using System.Linq; +using MeshUtility.M17N; namespace MeshUtility { @@ -34,25 +32,67 @@ namespace MeshUtility GUIStyle _tabButtonStyle => "LargeButton"; GUI.ToolbarButtonSize _tabButtonSize => GUI.ToolbarButtonSize.Fixed; + private enum MeshProcessingMessages + { + [LangMsg(Languages.ja, "ターゲットオブジェクト")] + [LangMsg(Languages.en, "TargetObject")] + TARGET_OBJECT, + + [LangMsg(Languages.ja, "BlendShapeを含むメッシュは分割されます")] + [LangMsg(Languages.en, "Meshes containing BlendShape will be split")] + MESH_SEPARATOR, + + [LangMsg(Languages.ja, "メッシュを統合する。BlendShapeを含むメッシュは独立して統合されます")] + [LangMsg(Languages.en, "Generate a single mesh. Meshes w/ BlendShape will be grouped into another one")] + MESH_INTEGRATOR, + + [LangMsg(Languages.ja, "静的メッシュを一つに統合する")] + [LangMsg(Languages.en, "Integrate static meshes into one")] + STATIC_MESH_INTEGRATOR, + + [LangMsg(Languages.ja, "GameObjectを選んでください")] + [LangMsg(Languages.en, "Select a GameObject first")] + NO_GAMEOBJECT_SELECTED, + + [LangMsg(Languages.ja, "GameObjectにスキンメッシュが含まれていません")] + [LangMsg(Languages.en, "No skinned mesh is contained")] + NO_SKINNED_MESH, + + [LangMsg(Languages.ja, "GameObjectに静的メッシュが含まれていません")] + [LangMsg(Languages.en, "No static mesh is contained")] + NO_STATIC_MESH, + + [LangMsg(Languages.ja, "GameObjectにスキンメッシュ・静的メッシュが含まれていません")] + [LangMsg(Languages.en, "Skinned/Static mesh is not contained")] + NO_MESH, + + [LangMsg(Languages.ja, "ターゲットオブジェクトはVRMモデルです。`VRM0-> MeshIntegrator`を使ってください")] + [LangMsg(Languages.en, "Target object is VRM model, use `VRM0 -> MeshIntegrator` instead")] + VRM_DETECTED, + } + private void OnGUI() { EditorGUIUtility.labelWidth = 150; + // lang + Getter.OnGuiSelectLang(); + _tab = TabBar.OnGUI(_tab, _tabButtonStyle, _tabButtonSize); switch (_tab) { case Tabs.MeshSeparator: - EditorGUILayout.TextField("Meshes containing BlendShape data will be split"); + EditorGUILayout.TextField(MeshProcessingMessages.MESH_SEPARATOR.Msg()); break; case Tabs.MeshIntegrator: - EditorGUILayout.TextField("Generate a single mesh. Meshes w/ BlendShape will be grouped into another one"); + EditorGUILayout.TextField(MeshProcessingMessages.MESH_INTEGRATOR.Msg()); break; case Tabs.StaticMeshIntegrator: - EditorGUILayout.TextField("Integrate static meshes into one"); + EditorGUILayout.TextField(MeshProcessingMessages.STATIC_MESH_INTEGRATOR.Msg()); break; } - EditorGUILayout.LabelField("ExportTarget"); + EditorGUILayout.LabelField(MeshProcessingMessages.TARGET_OBJECT.Msg()); _exportTarget = (GameObject)EditorGUILayout.ObjectField(_exportTarget, typeof(GameObject), true); if (_exportTarget == null && MeshUtility.IsGameObjectSelected()) { @@ -111,7 +151,7 @@ namespace MeshUtility private bool GameObjectNull() { - EditorUtility.DisplayDialog("Failed", "No GameObject Selected", "ok"); + EditorUtility.DisplayDialog("Failed", MeshProcessingMessages.NO_GAMEOBJECT_SELECTED.Msg(), "ok"); return false; } @@ -127,7 +167,7 @@ namespace MeshUtility } else { - EditorUtility.DisplayDialog("Failed", "No skinned mesh contained", "ok"); + EditorUtility.DisplayDialog("Failed", MeshProcessingMessages.NO_SKINNED_MESH.Msg(), "ok"); return false; } } @@ -146,7 +186,7 @@ namespace MeshUtility var sourceString = component.ToString(); if (sourceString.Contains(keyWord)) { - EditorUtility.DisplayDialog("Failed", "Target object is VRM file, use `VRM0 -> MeshIntegrator` instead", "ok"); + EditorUtility.DisplayDialog("Failed", MeshProcessingMessages.VRM_DETECTED.Msg(), "ok"); return false; } } @@ -158,7 +198,7 @@ namespace MeshUtility } else { - EditorUtility.DisplayDialog("Failed", "Neither skinned mesh nor static mesh contained", "ok"); + EditorUtility.DisplayDialog("Failed", MeshProcessingMessages.NO_MESH.Msg(), "ok"); return false; } } @@ -174,7 +214,7 @@ namespace MeshUtility } else { - EditorUtility.DisplayDialog("Failed", "No static mesh contained", "ok"); + EditorUtility.DisplayDialog("Failed", MeshProcessingMessages.NO_STATIC_MESH.Msg(), "ok"); return false; } } diff --git a/Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs b/Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs index 400d752a9..72ae33a66 100644 --- a/Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs +++ b/Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine; @@ -9,14 +9,9 @@ namespace MeshUtility public class MeshUtility { public const string MENU_PARENT = "UniGLTF/Mesh Utility/"; - private const string ASSET_SUFFIX = ".mesh.asset"; - private const string MENU_NAME = MENU_PARENT + "MeshSeparator"; private static readonly Vector3 ZERO_MOVEMENT = Vector3.zero; - private const string INTEGRATED_MESH_NAME = "MeshesIntegrated"; - private const string INTEGRATED_MESH_BLENDSHAPE_NAME = "MeshesBlendShapeIntegrated"; - public static Object GetPrefab(GameObject instance) { #if UNITY_2018_2_OR_NEWER @@ -32,15 +27,6 @@ namespace MeshUtility WithoutBlendShape, } - [MenuItem(MENU_NAME, validate = true)] - private static bool ShowLogValidation() - { - if (Selection.activeTransform == null) - return false; - else - return true; - } - [MenuItem(MENU_PARENT + "MeshUtility Docs", priority = 32)] public static void LinkToMeshSeparatorDocs() { @@ -344,32 +330,35 @@ namespace MeshUtility // destroy integrated meshes in the source foreach (var skinnedMesh in go.GetComponentsInChildren()) { - if (skinnedMesh.sharedMesh.name == INTEGRATED_MESH_NAME) + if (skinnedMesh.sharedMesh.name == MeshIntegratorUtility.INTEGRATED_MESH_NAME || + skinnedMesh.sharedMesh.name == MeshIntegratorUtility.INTEGRATED_MESH_BLENDSHAPE_NAME) { GameObject.DestroyImmediate(skinnedMesh.gameObject); } } - // destroy original meshes in the copied GameObject foreach (var skinnedMesh in skinnedMeshes) { - if (skinnedMesh.sharedMesh.name != INTEGRATED_MESH_NAME) - { - GameObject.DestroyImmediate(skinnedMesh); - } - // avoid repeated name - else if (skinnedMesh.sharedMesh.blendShapeCount > 0) - { - skinnedMesh.sharedMesh.name = INTEGRATED_MESH_BLENDSHAPE_NAME; - } - // check if the integrated mesh is empty - else if (skinnedMesh.sharedMesh.subMeshCount == 0) - { - GameObject.DestroyImmediate(skinnedMesh.gameObject); - } + // destroy original meshes in the copied GameObject + if (!(skinnedMesh.sharedMesh.name == MeshIntegratorUtility.INTEGRATED_MESH_NAME || + skinnedMesh.sharedMesh.name == MeshIntegratorUtility.INTEGRATED_MESH_BLENDSHAPE_NAME)) + { + GameObject.DestroyImmediate(skinnedMesh); + } + // check if the integrated mesh is empty + else if (skinnedMesh.sharedMesh.subMeshCount == 0) + { + GameObject.DestroyImmediate(skinnedMesh.gameObject); + } + // save mesh data + else if (skinnedMesh.sharedMesh.name == MeshIntegratorUtility.INTEGRATED_MESH_NAME || + skinnedMesh.sharedMesh.name == MeshIntegratorUtility.INTEGRATED_MESH_BLENDSHAPE_NAME) + { + SaveMeshData(skinnedMesh.sharedMesh); + } } foreach (var normalMesh in normalMeshes) { - if (normalMesh.sharedMesh.name != INTEGRATED_MESH_NAME) + if (normalMesh.sharedMesh.name != MeshIntegratorUtility.INTEGRATED_MESH_NAME) { if (normalMesh.gameObject.GetComponent()) { @@ -379,5 +368,22 @@ namespace MeshUtility } } } + + private static void SaveMeshData(Mesh mesh) + { + var assetPath = string.Format("{0}{1}", Path.GetFileNameWithoutExtension(mesh.name), ASSET_SUFFIX); + Debug.Log(assetPath); + if (!string.IsNullOrEmpty((AssetDatabase.GetAssetPath(mesh)))) + { + var directory = Path.GetDirectoryName(AssetDatabase.GetAssetPath(mesh)).Replace("\\", "/"); + assetPath = string.Format("{0}/{1}{2}", directory, Path.GetFileNameWithoutExtension(mesh.name), ASSET_SUFFIX); + } + else + { + assetPath = string.Format("Assets/{0}{1}", Path.GetFileNameWithoutExtension(mesh.name), ASSET_SUFFIX); + } + Debug.LogFormat("CreateAsset: {0}", assetPath); + AssetDatabase.CreateAsset(mesh, assetPath); + } } } \ No newline at end of file diff --git a/Assets/UniGLTF/MeshUtility/Runtime/MeshIntegratorUtility.cs b/Assets/UniGLTF/MeshUtility/Runtime/MeshIntegratorUtility.cs index 2f5b343ef..8285af6e6 100644 --- a/Assets/UniGLTF/MeshUtility/Runtime/MeshIntegratorUtility.cs +++ b/Assets/UniGLTF/MeshUtility/Runtime/MeshIntegratorUtility.cs @@ -6,6 +6,8 @@ namespace MeshUtility { public static class MeshIntegratorUtility { + public const string INTEGRATED_MESH_NAME = "MeshesIntegrated"; + public const string INTEGRATED_MESH_BLENDSHAPE_NAME = "MeshesBlendShapeIntegrated"; /// /// go を root としたヒエラルキーから Renderer を集めて、統合された Mesh 作成する /// @@ -54,7 +56,6 @@ namespace MeshUtility } var mesh = new Mesh(); - mesh.name = "MeshesIntegrated"; if (integrator.Positions.Count > ushort.MaxValue) { @@ -77,6 +78,11 @@ namespace MeshUtility if (onlyBlendShapeRenderers) { integrator.AddBlendShapesToMesh(mesh); + mesh.name = INTEGRATED_MESH_BLENDSHAPE_NAME; + } + else + { + mesh.name = INTEGRATED_MESH_NAME; } var integrated = meshNode.AddComponent(); diff --git a/Assets/UniGLTF/MeshUtility/Runtime/StaticMeshIntegrator.cs b/Assets/UniGLTF/MeshUtility/Runtime/StaticMeshIntegrator.cs index 219b0d04f..e865b5a17 100644 --- a/Assets/UniGLTF/MeshUtility/Runtime/StaticMeshIntegrator.cs +++ b/Assets/UniGLTF/MeshUtility/Runtime/StaticMeshIntegrator.cs @@ -66,7 +66,7 @@ namespace MeshUtility public Mesh ToMesh() { var mesh = new Mesh(); - mesh.name = "MeshesIntegrated"; + mesh.name = MeshIntegratorUtility.INTEGRATED_MESH_NAME; mesh.vertices = m_positions.ToArray(); if (m_normals.Count > 0) From 81055e80dffaa9c13887d99b068ffbb5307a53d2 Mon Sep 17 00:00:00 2001 From: pochang007 Date: Mon, 25 Jan 2021 19:00:24 +0900 Subject: [PATCH 2/2] comment out mesh saver --- Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs b/Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs index 72ae33a66..a7eb133de 100644 --- a/Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs +++ b/Assets/UniGLTF/MeshUtility/Editor/MeshUtility.cs @@ -353,7 +353,7 @@ namespace MeshUtility else if (skinnedMesh.sharedMesh.name == MeshIntegratorUtility.INTEGRATED_MESH_NAME || skinnedMesh.sharedMesh.name == MeshIntegratorUtility.INTEGRATED_MESH_BLENDSHAPE_NAME) { - SaveMeshData(skinnedMesh.sharedMesh); + // SaveMeshData(skinnedMesh.sharedMesh); } } foreach (var normalMesh in normalMeshes)