From 588ecf81cd3fdcabf474718c2ee22ce866f052a5 Mon Sep 17 00:00:00 2001 From: Masahiro Yamaguchi Date: Tue, 5 Dec 2023 19:27:27 +0900 Subject: [PATCH 1/4] Temporary commit --- .../Runtime/Nodes/LoadVRM.cs | 8 ++- .../Runtime/Utils/Utils.cs | 49 ++++++++++++++++++- 2 files changed, 53 insertions(+), 4 deletions(-) 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 1807bc2..5c6e510 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 @@ -6,6 +6,7 @@ using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using System.Collections; +using VisualScriptingNodes; namespace VrmVisualScriptingNodes { @@ -35,16 +36,19 @@ protected override void Definition() VrmURL = ValueInput("VRM URL", ""); result = ValueOutput("Game Object", (flow) => resultValue); - + } private IEnumerator Enter(Flow flow) { string url = flow.GetValue(VrmURL); Vrm10Instance vrmInstance = null; - UniTask.Create(async () => {vrmInstance = await LoadVrm(url);}).Forget(); + UniTask.Create(async () => { vrmInstance = await LoadVrm(url); }).Forget(); yield return new WaitUntil(() => vrmInstance); resultValue = vrmInstance.gameObject; + + Utils.ReplaceErrorShaders(resultValue, Utils.GetShaderForErrorReplacement()); + 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 7a06f6f..fb24dc0 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 @@ -2,14 +2,59 @@ using System; using UnityEngine.Networking; using System.Runtime.CompilerServices; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; -namespace from2001 +namespace VisualScriptingNodes { public class Utils : MonoBehaviour { - static int addTest(int a, int b) + static public int addTest(int a, int b) { return a + b; } + + + + public static Shader GetShaderForErrorReplacement(string shaderType = "Unlit") + { + Shader retShader = null; + retShader = shaderType switch + { + "Unlit" => Shader.Find(GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset + ? "Universal Render Pipeline/Unlit" : "Unlit/Texture"), + "Lit" => Shader.Find(GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset + ? "Universal Render Pipeline/Lit" : "Standard"), + _ => Shader.Find(GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset + ? "Universal Render Pipeline/Unlit" : "Unlit/Texture"), + }; + return retShader; + } + + + // GameObjectとその子孫のマテリアルのシェーダーを再帰的に置き換えるヘルパーメソッド + public static void ReplaceErrorShaders(GameObject obj, Shader replacementShader) + { + if (obj.TryGetComponent(out var renderer)) + { + foreach (Material mat in renderer.materials) + { + //if (mat.shader == null || Shader.Find(mat.shader.name) == null) + //{ + mat.shader = replacementShader; + //} + } + } + + // 子GameObjectに対しても同じ処理を行う + foreach (Transform child in obj.transform) + { + ReplaceErrorShaders(child.gameObject, replacementShader); + } + } + + + + } } \ No newline at end of file From a4a75aada978a4845662a01361fc75d99aa46e18 Mon Sep 17 00:00:00 2001 From: Masahiro Yamaguchi Date: Wed, 6 Dec 2023 00:14:10 +0900 Subject: [PATCH 2/4] Added Vision OS Suuport (Shader replacement) --- .../Runtime/Nodes/LoadVRM.cs | 3 +- .../Runtime/Utils/Utils.cs | 95 +++++++++++++------ 2 files changed, 66 insertions(+), 32 deletions(-) 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 5c6e510..f8a2b0c 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,7 @@ private IEnumerator Enter(Flow flow) yield return new WaitUntil(() => vrmInstance); resultValue = vrmInstance.gameObject; - Utils.ReplaceErrorShaders(resultValue, Utils.GetShaderForErrorReplacement()); + if (Utils.IsVisionOS()) Utils.ChangeShadersWithTexture(resultValue, "Universal Render Pipeline/Unlit", "_MainTex", "_BaseMap"); yield return outputTrigger; } @@ -66,6 +66,7 @@ private async UniTask LoadVrm(string URL) { VrmBytes = request.downloadHandler.data; } + Vrm10Instance vrmInstance = await Vrm10.LoadBytesAsync( VrmBytes, canLoadVrm0X: true, 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 fb24dc0..e9fa259 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 @@ -4,57 +4,90 @@ using System.Runtime.CompilerServices; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; +using Unity.VisualScripting; +using System.Collections.Generic; namespace VisualScriptingNodes { public class Utils : MonoBehaviour { - static public int addTest(int a, int b) + /// + /// Return true if current OS is VisionOS. + /// + /// + public static bool IsVisionOS() { - return a + b; - } - - + //When operatingSystem is "visionOS", return true + if (SystemInfo.operatingSystem.Contains("visionOS")) return true; - public static Shader GetShaderForErrorReplacement(string shaderType = "Unlit") - { - Shader retShader = null; - retShader = shaderType switch + //When VolumeCamera exists in scene, return true + foreach (GameObject obj in GetAllObjectsInScene()) { - "Unlit" => Shader.Find(GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset - ? "Universal Render Pipeline/Unlit" : "Unlit/Texture"), - "Lit" => Shader.Find(GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset - ? "Universal Render Pipeline/Lit" : "Standard"), - _ => Shader.Find(GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset - ? "Universal Render Pipeline/Unlit" : "Unlit/Texture"), - }; - return retShader; - } + Component[] components = obj.GetComponents(); + foreach (Component component in components) + { + if (component.GetType().Name=="VolumeCamera") return true; + } + } + return false; + } - // GameObjectとその子孫のマテリアルのシェーダーを再帰的に置き換えるヘルパーメソッド - public static void ReplaceErrorShaders(GameObject obj, Shader replacementShader) + /// + /// Return all GameObjects in scene. + /// + /// + public static List GetAllObjectsInScene() { - if (obj.TryGetComponent(out var renderer)) + List objectsInScene = new List(); + foreach (GameObject obj in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects()) { - foreach (Material mat in renderer.materials) - { - //if (mat.shader == null || Shader.Find(mat.shader.name) == null) - //{ - mat.shader = replacementShader; - //} - } + objectsInScene.Add(obj); + GetChildObjects(obj, ref objectsInScene); } + return objectsInScene; - // 子GameObjectに対しても同じ処理を行う - foreach (Transform child in obj.transform) + static void GetChildObjects(GameObject obj, ref List objectsInScene) { - ReplaceErrorShaders(child.gameObject, replacementShader); + foreach (Transform child in obj.transform) + { + objectsInScene.Add(child.gameObject); + GetChildObjects(child.gameObject, ref objectsInScene); + } } } + /// + /// Change all shaders of GameObject to new one. + /// This method is intended to be used for VRM and glTF models on VisionOS. + /// + /// + /// "Universal Render Pipeline/Unlit", "Universal Render Pipeline/Lit", etc. + /// Set "_MainTex" for Built-in shader + /// Set "_BaseMap" for URP Shader + public static void ChangeShadersWithTexture(GameObject targetObject, string newShader = "Universal Render Pipeline/Unlit", string texturePropertyName_old = "_MainTex", string texturePropertyName_new = "_BaseMap") + { + SkinnedMeshRenderer[] skinedMeshrenderers = targetObject.GetComponentsInChildren(); + foreach (SkinnedMeshRenderer renderer in skinedMeshrenderers) foreach (Material mat in renderer.materials) ChangeShader(mat, newShader); + + MeshRenderer[] meshrenderers = targetObject.GetComponentsInChildren(); + foreach (MeshRenderer renderer in meshrenderers) foreach (Material mat in renderer.materials) ChangeShader(mat, newShader); + void ChangeShader(Material mat, string shaderName) + { + if (mat.HasProperty(texturePropertyName_old)) + { + Texture texture = mat.GetTexture(texturePropertyName_old); + mat.shader = Shader.Find(shaderName); + mat.SetTexture(texturePropertyName_new, texture); + } + else + { + mat.shader = Shader.Find(newShader); + } + } + } } } \ No newline at end of file From 52e2ebd40bbe67ddd489bcf0d84c9f8cacc32497 Mon Sep 17 00:00:00 2001 From: Masahiro Yamaguchi Date: Wed, 6 Dec 2023 00:17:47 +0900 Subject: [PATCH 3/4] Version increment --- .../com.from2001.vrm-visualscripting-nodes/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/package.json b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/package.json index c35fb57..390bd61 100644 --- a/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/package.json +++ b/VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/package.json @@ -1,6 +1,6 @@ { "name": "com.from2001.vrm-visualscripting-nodes", - "version": "0.1.3", + "version": "0.1.4", "displayName": "VRM Visual Scripting Nodes", "description": "Unity Visual Scripting node library for VRM", "unity": "2021.3", From 68a6d66967a26839f07e03f93b1d6b5da795210e Mon Sep 17 00:00:00 2001 From: Masahiro Yamaguchi Date: Wed, 6 Dec 2023 00:30:45 +0900 Subject: [PATCH 4/4] Updated README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index d461abe..97e704f 100644 --- a/README.md +++ b/README.md @@ -62,11 +62,17 @@ These samples can be imported. ![InstallSamples](https://github.com/from2001/VRM_VisualScriptingNodes/assets/387880/31c42fde-8b71-46e5-a4d5-a488015ca379) +## Vision OS Support + +Shaders are replaced with `Universal Render Pipeline/Unlit` shader + ## ToDo Implement features of [VRM-1.0 APIs](https://vrm-c.github.io/UniVRM/ja/vrm1/api_update.html#expression) - ~~Load~~ +- ~~VisionOS Support (Partially supported)~~ +- Improve Shader replacement for VisionOS Support - Expression - LookAt - Gaze