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 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..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 @@ -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; + + if (Utils.IsVisionOS()) Utils.ChangeShadersWithTexture(resultValue, "Universal Render Pipeline/Unlit", "_MainTex", "_BaseMap"); + yield return outputTrigger; } @@ -62,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 7a06f6f..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 @@ -2,14 +2,92 @@ using System; using UnityEngine.Networking; using System.Runtime.CompilerServices; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; +using Unity.VisualScripting; +using System.Collections.Generic; -namespace from2001 +namespace VisualScriptingNodes { public class Utils : MonoBehaviour { - static 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; + + //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; + } + } + + return false; + } + + /// + /// Return all GameObjects in scene. + /// + /// + public static List GetAllObjectsInScene() + { + List objectsInScene = new List(); + foreach (GameObject obj in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects()) + { + objectsInScene.Add(obj); + GetChildObjects(obj, ref objectsInScene); + } + return objectsInScene; + + static void GetChildObjects(GameObject obj, ref List objectsInScene) + { + 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 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",