diff --git a/Assets/VRM10_Samples/VRM10Viewer/FaceCameraTarget.asset b/Assets/VRM10_Samples/VRM10Viewer/FaceCameraTarget.asset index c1311d8e0..dc5b55f8e 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/FaceCameraTarget.asset +++ b/Assets/VRM10_Samples/VRM10Viewer/FaceCameraTarget.asset @@ -26,6 +26,7 @@ CustomRenderTexture: m_UseDynamicScale: 0 m_BindMS: 0 m_EnableCompatibleFormat: 1 + m_EnableRandomWrite: 0 m_TextureSettings: serializedVersion: 2 m_FilterMode: 1 diff --git a/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs b/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs index 5dbc28055..cba67b0ab 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs +++ b/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs @@ -1,8 +1,11 @@ using System; +using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Threading; +using System.Threading.Tasks; using UniGLTF; using UniGLTF.SpringBoneJobs.Blittables; using UnityEngine; @@ -474,8 +477,7 @@ namespace UniVRM10.VRM10Viewer m_autoBlink = gameObject.AddComponent(); m_autoLipsync = gameObject.AddComponent(); - m_version.text = string.Format("VRMViewer {0}.{1}", - VRM10SpecVersion.MAJOR, VRM10SpecVersion.MINOR); + m_version.text = string.Format("VRM10ViewerUI {0}", PackageVersion.VERSION); m_openModel.onClick.AddListener(OnOpenModelClicked); m_openMotion.onClick.AddListener(OnOpenMotionClicked); @@ -491,7 +493,7 @@ namespace UniVRM10.VRM10Viewer if (ArgumentChecker.TryGetFirstLoadable(out var cmd)) { - LoadModel(cmd); + var _ = LoadModel(cmd); } m_texts.Start(); @@ -502,7 +504,6 @@ namespace UniVRM10.VRM10Viewer _cancellationTokenSource?.Dispose(); } - private void Update() { if (Input.GetKeyDown(KeyCode.Tab)) @@ -639,15 +640,29 @@ namespace UniVRM10.VRM10Viewer } } - void OnOpenModelClicked() + [DllImport("__Internal")] + public static extern void WebGLFileDialog(string target, string message); + + string FileDialog() { #if UNITY_STANDALONE_WIN - var path = VRM10FileDialogForWindows.FileDialog("open VRM", "vrm"); + return VRM10FileDialogForWindows.FileDialog("open VRM", "vrm"); +#elif UNITY_WEBGL + // Open WebGLFileDialog + // see: Assets/UniGLTF/Runtime/Utils/Plugins/OpenFile.jslib + WebGLFileDialog("Canvas", "FileSelected"); + // Control flow does not return here. return empty string with dummy + return null; #elif UNITY_EDITOR - var path = UnityEditor.EditorUtility.OpenFilePanel("Open VRM", "", "vrm"); + return UnityEditor.EditorUtility.OpenFilePanel("Open VRM", "", "vrm"); #else - var path = Application.dataPath + "/default.vrm"; + return Application.dataPath + "/default.vrm"; #endif + } + + void OnOpenModelClicked() + { + var path = FileDialog(); if (string.IsNullOrEmpty(path)) { return; @@ -660,7 +675,24 @@ namespace UniVRM10.VRM10Viewer return; } - LoadModel(path); + _ = LoadModel(path); + } + + /// + /// for WebGL + /// call from OpenFile.jslib + /// + public void FileSelected(string url) + { + Debug.Log($"FileSelected: {url}"); + StartCoroutine(LoadCoroutine(url)); + } + + IEnumerator LoadCoroutine(string url) + { + var www = new WWW(url); + yield return www; + var _ = LoadModel("WebGL.vrm", www.bytes); } async void OnOpenMotionClicked() @@ -760,7 +792,29 @@ namespace UniVRM10.VRM10Viewer } } - async void LoadModel(string path) + IAwaitCaller GetIAwaitCaller() + { + if (m_useAsync) + { +#if UNITY_WEBGL + return new RuntimeOnlyNoThreadAwaitCaller(); +#else + return new RuntimeOnlyAwaitCaller(); +#endif + } + else + { + return new ImmediateCaller(); + } + } + + async Task LoadModel(string path) + { + var bytes = await File.ReadAllBytesAsync(path); + await LoadModel(path, bytes); + } + + async Task LoadModel(string path, byte[] bytes) { // cleanup m_loaded?.Dispose(); @@ -772,10 +826,10 @@ namespace UniVRM10.VRM10Viewer try { Debug.LogFormat("{0}", path); - var vrm10Instance = await Vrm10.LoadPathAsync(path, + var vrm10Instance = await Vrm10.LoadBytesAsync(bytes, canLoadVrm0X: true, showMeshes: false, - awaitCaller: m_useAsync.enabled ? new RuntimeOnlyAwaitCaller() : new ImmediateCaller(), + awaitCaller: GetIAwaitCaller(), vrmMetaInformationCallback: m_texts.UpdateMeta, ct: cancellationToken, springboneRuntime: m_useSpringboneSingelton.isOn ? new Vrm10FastSpringboneRuntime() : new Vrm10FastSpringboneRuntimeStandalone()); diff --git a/Assets/VRM_Samples/SimpleViewer/FileDialog/FileUtil.cs b/Assets/VRM_Samples/SimpleViewer/FileDialog/FileUtil.cs index 5a8abf371..1aa1bda9d 100644 --- a/Assets/VRM_Samples/SimpleViewer/FileDialog/FileUtil.cs +++ b/Assets/VRM_Samples/SimpleViewer/FileDialog/FileUtil.cs @@ -8,7 +8,7 @@ namespace VRM.SimpleViewer return FileDialogForWindows.FileDialog(title, extensions); #elif UNITY_WEBGL // Open WebGLFileDialog - // see: Assets\VRM_Samples\SimpleViewer\Plugins\OpenFile.jslib + // see: Assets/UniGLTF/Runtime/Utils/Plugins/OpenFile.jslib WebGLUtil.WebGLFileDialog("Canvas", "FileSelected"); // Control flow does not return here. return empty string with dummy return ""; diff --git a/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs b/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs index 4671e1135..575f44556 100644 --- a/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs +++ b/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs @@ -293,7 +293,7 @@ namespace VRM.SimpleViewer private void Start() { - m_version.text = string.Format("VRMViewer {0}", PackageVersion.VERSION); + m_version.text = string.Format("SimpleViewer {0}", PackageVersion.VERSION); m_open.onClick.AddListener(OnOpenClicked); m_reset.onClick.AddListener(() => m_loaded?.ResetSpringbone()); @@ -311,12 +311,6 @@ namespace VRM.SimpleViewer } m_texts.Start(); - - if (Application.platform == RuntimePlatform.WebGLPlayer) - { - m_useAsync.isOn = false; - m_useAsync.interactable = false; - } } private void LoadMotion(string path, string source) diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 98205ba1b..62587d23f 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,7 +5,10 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 + - enabled: 0 path: Assets/VRM_Samples/SimpleViewer/SimpleViewer.unity guid: 5d0b0ec0bd1cdee4fbd25b64a6d059df + - enabled: 1 + path: Assets/VRM10_Samples/VRM10Viewer/VRM10Viewer.unity + guid: c91fa5ff7b6696646a8b16d9bf88a5c2 m_configObjects: {}