Skip to content

Commit e824f80

Browse files
authored
Merge pull request #23 from from2001/develop
Vision OS Support (Shader replacement)
2 parents e7df6f2 + 68a6d66 commit e824f80

4 files changed

Lines changed: 95 additions & 6 deletions

File tree

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,17 @@ These samples can be imported.
6262

6363
![InstallSamples](https://github.com/from2001/VRM_VisualScriptingNodes/assets/387880/31c42fde-8b71-46e5-a4d5-a488015ca379)
6464

65+
## Vision OS Support
66+
67+
Shaders are replaced with `Universal Render Pipeline/Unlit` shader
68+
6569
## ToDo
6670

6771
Implement features of [VRM-1.0 APIs](https://vrm-c.github.io/UniVRM/ja/vrm1/api_update.html#expression)
6872

6973
- ~~Load~~
74+
- ~~VisionOS Support (Partially supported)~~
75+
- Improve Shader replacement for VisionOS Support
7076
- Expression
7177
- LookAt
7278
- Gaze

VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Nodes/LoadVRM.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using UnityEngine.Rendering;
77
using UnityEngine.Rendering.Universal;
88
using System.Collections;
9+
using VisualScriptingNodes;
910

1011
namespace VrmVisualScriptingNodes
1112
{
@@ -35,16 +36,19 @@ protected override void Definition()
3536

3637
VrmURL = ValueInput<string>("VRM URL", "");
3738
result = ValueOutput<GameObject>("Game Object", (flow) => resultValue);
38-
39+
3940
}
4041

4142
private IEnumerator Enter(Flow flow)
4243
{
4344
string url = flow.GetValue<string>(VrmURL);
4445
Vrm10Instance vrmInstance = null;
45-
UniTask.Create(async () => {vrmInstance = await LoadVrm(url);}).Forget();
46+
UniTask.Create(async () => { vrmInstance = await LoadVrm(url); }).Forget();
4647
yield return new WaitUntil(() => vrmInstance);
4748
resultValue = vrmInstance.gameObject;
49+
50+
if (Utils.IsVisionOS()) Utils.ChangeShadersWithTexture(resultValue, "Universal Render Pipeline/Unlit", "_MainTex", "_BaseMap");
51+
4852
yield return outputTrigger;
4953
}
5054

@@ -62,6 +66,7 @@ private async UniTask<Vrm10Instance> LoadVrm(string URL)
6266
{
6367
VrmBytes = request.downloadHandler.data;
6468
}
69+
6570
Vrm10Instance vrmInstance = await Vrm10.LoadBytesAsync(
6671
VrmBytes,
6772
canLoadVrm0X: true,

VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/Runtime/Utils/Utils.cs

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,92 @@
22
using System;
33
using UnityEngine.Networking;
44
using System.Runtime.CompilerServices;
5+
using UnityEngine.Rendering;
6+
using UnityEngine.Rendering.Universal;
7+
using Unity.VisualScripting;
8+
using System.Collections.Generic;
59

6-
namespace from2001
10+
namespace VisualScriptingNodes
711
{
812
public class Utils : MonoBehaviour
913
{
10-
static int addTest(int a, int b)
14+
/// <summary>
15+
/// Return true if current OS is VisionOS.
16+
/// </summary>
17+
/// <returns></returns>
18+
public static bool IsVisionOS()
1119
{
12-
return a + b;
20+
//When operatingSystem is "visionOS", return true
21+
if (SystemInfo.operatingSystem.Contains("visionOS")) return true;
22+
23+
//When VolumeCamera exists in scene, return true
24+
foreach (GameObject obj in GetAllObjectsInScene())
25+
{
26+
Component[] components = obj.GetComponents<Component>();
27+
foreach (Component component in components)
28+
{
29+
if (component.GetType().Name=="VolumeCamera") return true;
30+
}
31+
}
32+
33+
return false;
34+
}
35+
36+
/// <summary>
37+
/// Return all GameObjects in scene.
38+
/// </summary>
39+
/// <returns></returns>
40+
public static List<GameObject> GetAllObjectsInScene()
41+
{
42+
List<GameObject> objectsInScene = new List<GameObject>();
43+
foreach (GameObject obj in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects())
44+
{
45+
objectsInScene.Add(obj);
46+
GetChildObjects(obj, ref objectsInScene);
47+
}
48+
return objectsInScene;
49+
50+
static void GetChildObjects(GameObject obj, ref List<GameObject> objectsInScene)
51+
{
52+
foreach (Transform child in obj.transform)
53+
{
54+
objectsInScene.Add(child.gameObject);
55+
GetChildObjects(child.gameObject, ref objectsInScene);
56+
}
57+
}
58+
}
59+
60+
61+
62+
/// <summary>
63+
/// Change all shaders of GameObject to new one.
64+
/// This method is intended to be used for VRM and glTF models on VisionOS.
65+
/// </summary>
66+
/// <param name="targetObject"></param>
67+
/// <param name="newShader">"Universal Render Pipeline/Unlit", "Universal Render Pipeline/Lit", etc.</param>
68+
/// <param name="texturePropertyName_old">Set "_MainTex" for Built-in shader</param>
69+
/// <param name="texturePropertyName_new">Set "_BaseMap" for URP Shader</param>
70+
public static void ChangeShadersWithTexture(GameObject targetObject, string newShader = "Universal Render Pipeline/Unlit", string texturePropertyName_old = "_MainTex", string texturePropertyName_new = "_BaseMap")
71+
{
72+
SkinnedMeshRenderer[] skinedMeshrenderers = targetObject.GetComponentsInChildren<SkinnedMeshRenderer>();
73+
foreach (SkinnedMeshRenderer renderer in skinedMeshrenderers) foreach (Material mat in renderer.materials) ChangeShader(mat, newShader);
74+
75+
MeshRenderer[] meshrenderers = targetObject.GetComponentsInChildren<MeshRenderer>();
76+
foreach (MeshRenderer renderer in meshrenderers) foreach (Material mat in renderer.materials) ChangeShader(mat, newShader);
77+
78+
void ChangeShader(Material mat, string shaderName)
79+
{
80+
if (mat.HasProperty(texturePropertyName_old))
81+
{
82+
Texture texture = mat.GetTexture(texturePropertyName_old);
83+
mat.shader = Shader.Find(shaderName);
84+
mat.SetTexture(texturePropertyName_new, texture);
85+
}
86+
else
87+
{
88+
mat.shader = Shader.Find(newShader);
89+
}
90+
}
1391
}
1492
}
1593
}

VRM_VisualScriptingNodes/Packages/com.from2001.vrm-visualscripting-nodes/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "com.from2001.vrm-visualscripting-nodes",
3-
"version": "0.1.3",
3+
"version": "0.1.4",
44
"displayName": "VRM Visual Scripting Nodes",
55
"description": "Unity Visual Scripting node library for VRM",
66
"unity": "2021.3",

0 commit comments

Comments
 (0)