From e37eab2e0184378daf80bbe9fbe0ad9c543c9381 Mon Sep 17 00:00:00 2001 From: Masahiro Yamaguchi Date: Sun, 10 Dec 2023 16:16:52 +0900 Subject: [PATCH 1/4] Update .gitignore /Assets/_temp --- VRM_VisualScriptingNodes/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/VRM_VisualScriptingNodes/.gitignore b/VRM_VisualScriptingNodes/.gitignore index 6e9f214..6df5d85 100644 --- a/VRM_VisualScriptingNodes/.gitignore +++ b/VRM_VisualScriptingNodes/.gitignore @@ -85,4 +85,5 @@ crashlytics-build.properties # For this specific project /[Aa]ssets/temp/* /[Aa]ssets/temp.meta - +/[Aa]ssets/_temp/* +/[Aa]ssets/_temp.meta From d35aa32b2b5083ba46c8e8988e1b1ff1fab31d57 Mon Sep 17 00:00:00 2001 From: Masahiro Yamaguchi Date: Sun, 17 Dec 2023 20:03:26 +0900 Subject: [PATCH 2/4] Modified shader convert function from URP/MToon10 to URP/Unlit --- .../Runtime/Nodes/LoadVRM.cs | 3 +- .../Runtime/Utils/Utils.cs | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Nodes/LoadVRM.cs b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Nodes/LoadVRM.cs index f8a2b0c..c5c5cb0 100644 --- a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Nodes/LoadVRM.cs +++ b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Nodes/LoadVRM.cs @@ -47,7 +47,8 @@ private IEnumerator Enter(Flow flow) yield return new WaitUntil(() => vrmInstance); resultValue = vrmInstance.gameObject; - if (Utils.IsVisionOS()) Utils.ChangeShadersWithTexture(resultValue, "Universal Render Pipeline/Unlit", "_MainTex", "_BaseMap"); + // Change shaders of VRM to Unlit if platform is VisionOS + if (Utils.IsVisionOS()) Utils.ChangeMtoon10ShaderToUnlitOfGameobject(resultValue); yield return outputTrigger; } diff --git a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs index e9fa259..60af24a 100644 --- a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs +++ b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs @@ -89,5 +89,87 @@ void ChangeShader(Material mat, string shaderName) } } } + + /// + /// Change all URP/MToon10 shaders of GameObject to URP/Unlit. + /// This method is intended to be used for VRM models on VisionOS. + /// + /// + public static void ChangeMtoon10ShaderToUnlitOfGameobject(GameObject targetObject) + { + SkinnedMeshRenderer[] skinedMeshrenderers = targetObject.GetComponentsInChildren(); + foreach (SkinnedMeshRenderer renderer in skinedMeshrenderers) foreach (Material mat in renderer.materials) ChangeMToon10ShaderToUnlit(mat); + + MeshRenderer[] meshrenderers = targetObject.GetComponentsInChildren(); + foreach (MeshRenderer renderer in meshrenderers) foreach (Material mat in renderer.materials) ChangeMToon10ShaderToUnlit(mat); + } + + /// + /// Change URP/MToon10 shader to URP/Unlit shader. + /// + /// + static void ChangeMToon10ShaderToUnlit(Material mat_original) + { + if (mat_original.shader.name != "VRM10/Universal Render Pipeline/MToon10") + { + return; // Exit if the shader is not MToon10 + } + + // Create a temporary copy of the material to extract properties + Material tempMat = new(mat_original); + + // Create a new material with the Unlit shader + Material newMat = new(Shader.Find("Universal Render Pipeline/Unlit")); + + // Change the shader + newMat.shader = Shader.Find("Universal Render Pipeline/Unlit"); + + // Transfer texture and color properties + if (tempMat.HasProperty("_MainTex") && newMat.HasProperty("_BaseMap")) + { + newMat.SetTexture("_BaseMap", tempMat.GetTexture("_MainTex")); + } + if (tempMat.HasProperty("_Color") && newMat.HasProperty("_BaseColor")) + { + newMat.SetColor("_BaseColor", tempMat.GetColor("_Color")); + } + + // Transfer alpha cutoff property + if (tempMat.HasProperty("_Cutoff")) + { + newMat.SetFloat("_Cutoff", tempMat.GetFloat("_Cutoff")); + } + + // Handle Surface Type (Opaque/Transparent) + bool isTransparent = tempMat.GetFloat("_AlphaMode") > 0 || tempMat.GetFloat("_TransparentWithZWrite") > 0; + if (isTransparent) + { + newMat.SetFloat("_Surface", 1.0f); // Set to Transparent + newMat.SetFloat("_AlphaClip", 1.0f); // Enable Alpha Clipping + } + else + { + newMat.SetFloat("_Surface", 0.0f); // Set to Opaque + newMat.SetFloat("_AlphaClip", 0.0f); // Disable Alpha Clipping + } + + // Set blend modes for transparent materials + if (isTransparent) + { + newMat.SetFloat("_SrcBlend", (float)UnityEngine.Rendering.BlendMode.SrcAlpha); + newMat.SetFloat("_DstBlend", (float)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + newMat.SetFloat("_ZWrite", 0.0f); // Typically, ZWrite is off for transparent materials + } + + // Dispose of the temporary material + UnityEngine.Object.DestroyImmediate(tempMat); + + // Additional blend mode settings can be adjusted here if needed + + // Apply the new material + mat_original = newMat; + } + + } } \ No newline at end of file From 765a87627720d126ba060e5e9894062ba1aa4f7d Mon Sep 17 00:00:00 2001 From: Masahiro Yamaguchi Date: Sun, 17 Dec 2023 20:04:10 +0900 Subject: [PATCH 3/4] Fixed IsVisionOS() function --- .../Runtime/Utils/Utils.cs | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs index 60af24a..d25f25d 100644 --- a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs +++ b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs @@ -19,18 +19,12 @@ public static bool IsVisionOS() { //When operatingSystem is "visionOS", return true if (SystemInfo.operatingSystem.Contains("visionOS")) return true; - - //When VolumeCamera exists in scene, return true - foreach (GameObject obj in GetAllObjectsInScene()) - { - Component[] components = obj.GetComponents(); - foreach (Component component in components) - { - if (component.GetType().Name=="VolumeCamera") return true; - } - } - + if (Application.platform == RuntimePlatform.VisionOS) return true; +#if UNITY_VISIONOS + return true; +#else return false; +#endif } /// @@ -57,8 +51,6 @@ static void GetChildObjects(GameObject obj, ref List objectsInScene) } } - - /// /// Change all shaders of GameObject to new one. /// This method is intended to be used for VRM and glTF models on VisionOS. From 311985c8defaf21e430bc2069d49b1de9c4a336e Mon Sep 17 00:00:00 2001 From: Masahiro Yamaguchi Date: Sun, 17 Dec 2023 23:00:10 +0900 Subject: [PATCH 4/4] Fixed ChangeMtoon10ShaderToUnlitOfGameobject --- .../Runtime/Utils/Utils.cs | 82 ++++++++++--------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs index d25f25d..0d382ee 100644 --- a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs +++ b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs @@ -1,9 +1,4 @@ using UnityEngine; -using System; -using UnityEngine.Networking; -using System.Runtime.CompilerServices; -using UnityEngine.Rendering; -using UnityEngine.Rendering.Universal; using Unity.VisualScripting; using System.Collections.Generic; @@ -89,22 +84,34 @@ void ChangeShader(Material mat, string shaderName) /// public static void ChangeMtoon10ShaderToUnlitOfGameobject(GameObject targetObject) { - SkinnedMeshRenderer[] skinedMeshrenderers = targetObject.GetComponentsInChildren(); - foreach (SkinnedMeshRenderer renderer in skinedMeshrenderers) foreach (Material mat in renderer.materials) ChangeMToon10ShaderToUnlit(mat); - - MeshRenderer[] meshrenderers = targetObject.GetComponentsInChildren(); - foreach (MeshRenderer renderer in meshrenderers) foreach (Material mat in renderer.materials) ChangeMToon10ShaderToUnlit(mat); + ChangeToUnlitMaterialsRecursive(targetObject.transform); + static void ChangeToUnlitMaterialsRecursive(Transform target) + { + if (target.TryGetComponent(out var renderer)) + { + var materialsCopy = renderer.materials; + for (int i = 0; i < materialsCopy.Length; i++) + { + materialsCopy[i] = GetUnlitMaterialMadeByMToon10Shader(materialsCopy[i]); + } + renderer.materials = materialsCopy; + } + foreach (Transform child in target) + { + ChangeToUnlitMaterialsRecursive(child); + } + } } /// /// Change URP/MToon10 shader to URP/Unlit shader. /// /// - static void ChangeMToon10ShaderToUnlit(Material mat_original) + static Material GetUnlitMaterialMadeByMToon10Shader(Material mat_original) { if (mat_original.shader.name != "VRM10/Universal Render Pipeline/MToon10") { - return; // Exit if the shader is not MToon10 + return mat_original; // Exit if the shader is not MToon10 } // Create a temporary copy of the material to extract properties @@ -113,8 +120,26 @@ static void ChangeMToon10ShaderToUnlit(Material mat_original) // Create a new material with the Unlit shader Material newMat = new(Shader.Find("Universal Render Pipeline/Unlit")); - // Change the shader - newMat.shader = Shader.Find("Universal Render Pipeline/Unlit"); + // Handle Surface Type (Opaque/Transparent) + bool isTransparent = tempMat.GetFloat("_AlphaMode") > 0 || tempMat.GetFloat("_TransparentWithZWrite") > 0; + + if (isTransparent) + { + // Set surface type to Transparent and enable Alpha Clipping + newMat.SetFloat("_Surface", 1.0f); // Set to Transparent + newMat.SetFloat("_AlphaClip", 1.0f); // Enable Alpha Clipping + + // Set blend modes for transparent materials + newMat.SetFloat("_SrcBlend", (float)UnityEngine.Rendering.BlendMode.SrcAlpha); + newMat.SetFloat("_DstBlend", (float)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + newMat.SetFloat("_ZWrite", 0.0f); // Typically, ZWrite is off for transparent materials + } + else + { + // Set surface type to Opaque and disable Alpha Clipping + newMat.SetFloat("_Surface", 0.0f); // Set to Opaque + newMat.SetFloat("_AlphaClip", 0.0f); // Disable Alpha Clipping + } // Transfer texture and color properties if (tempMat.HasProperty("_MainTex") && newMat.HasProperty("_BaseMap")) @@ -132,34 +157,15 @@ static void ChangeMToon10ShaderToUnlit(Material mat_original) newMat.SetFloat("_Cutoff", tempMat.GetFloat("_Cutoff")); } - // Handle Surface Type (Opaque/Transparent) - bool isTransparent = tempMat.GetFloat("_AlphaMode") > 0 || tempMat.GetFloat("_TransparentWithZWrite") > 0; - if (isTransparent) - { - newMat.SetFloat("_Surface", 1.0f); // Set to Transparent - newMat.SetFloat("_AlphaClip", 1.0f); // Enable Alpha Clipping - } - else - { - newMat.SetFloat("_Surface", 0.0f); // Set to Opaque - newMat.SetFloat("_AlphaClip", 0.0f); // Disable Alpha Clipping - } - - // Set blend modes for transparent materials - if (isTransparent) - { - newMat.SetFloat("_SrcBlend", (float)UnityEngine.Rendering.BlendMode.SrcAlpha); - newMat.SetFloat("_DstBlend", (float)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); - newMat.SetFloat("_ZWrite", 0.0f); // Typically, ZWrite is off for transparent materials - } - // Dispose of the temporary material - UnityEngine.Object.DestroyImmediate(tempMat); + DestroyImmediate(tempMat); // Additional blend mode settings can be adjusted here if needed - // Apply the new material - mat_original = newMat; + // Set shader again (I don't know why this is necessary, but it doesn't work without it) + newMat.shader = Shader.Find("Universal Render Pipeline/Unlit"); + + return newMat; }