private void LoadMetaData(VRMData meta) { if (meta != null) { CurrentMeta = meta; this.DataContext = meta; ImportButton.IsEnabled = true; IgnoreButton.IsEnabled = true; if (meta.ThumbnailPNGBytes != null) { using (var ms = new MemoryStream(meta.ThumbnailPNGBytes)) { var imageSource = new BitmapImage(); imageSource.BeginInit(); imageSource.CacheOption = BitmapCacheOption.OnLoad; imageSource.StreamSource = ms; imageSource.EndInit(); ThumbnailImage.Source = imageSource; } } else { ThumbnailImage.Source = null; } } }
/// <summary> /// メタが不要な場合のローダー /// </summary> async void LoadVRMClicked_without_meta() { #if UNITY_STANDALONE_WIN var path = FileDialogForWindows.FileDialog("open VRM", ".vrm"); #elif UNITY_EDITOR var path = UnityEditor.EditorUtility.OpenFilePanel("Open VRM", "", "vrm"); #else var path = Application.dataPath + "/default.vrm"; #endif if (string.IsNullOrEmpty(path)) { return; } // GLB形式でJSONを取得しParseします var data = new GlbFileParser(path).Parse(); // VRM extension を parse します var vrm = new VRMData(data); var context = new VRMImporterContext(vrm); var loaded = default(RuntimeGltfInstance); if (m_loadAsync) { loaded = await context.LoadAsync(); } else { loaded = context.Load(); } OnLoaded(loaded); }
async void OnLoadClicked() { #if UNITY_STANDALONE_WIN var path = FileDialogForWindows.FileDialog("open VRM", ".vrm"); #elif UNITY_EDITOR var path = UnityEditor.EditorUtility.OpenFilePanel("Open VRM", "", "vrm"); #else var path = Application.dataPath + "/default.vrm"; #endif if (string.IsNullOrEmpty(path)) { return; } // GLB形式でJSONを取得しParseします var data = new GlbFileParser(path).Parse(); // VRM extension を parse します var vrm = new VRMData(data); using (var context = new VRMImporterContext(vrm)) { // metaを取得(todo: thumbnailテクスチャのロード) var meta = await context.ReadMetaAsync(); Debug.LogFormat("meta: title:{0}", meta.Title); // ParseしたJSONをシーンオブジェクトに変換していく var loaded = await context.LoadAsync(); loaded.ShowMeshes(); loaded.EnableUpdateWhenOffscreen(); OnLoaded(loaded.gameObject); } }
async void LoadModelAsync(string path, bool isVrm) { if (!File.Exists(path)) { return; } Debug.LogFormat("{0}", path); GltfData data; try { data = new AutoGltfFileParser(path).Parse(); } catch (Exception ex) { Debug.LogWarningFormat("parse error: {0}", ex); return; } if (isVrm) { try { var vrm = new VRMData(data); using (var loader = new VRMImporterContext(vrm, materialGenerator: GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm.VrmExtension))) { await m_texts.UpdateMetaAsync(loader); var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn)); SetModel(instance); } } catch (NotVrm0Exception) { // retry Debug.LogWarning("file extension is vrm. but not vrm ?"); using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn))) { var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn)); SetModel(instance); } } } else { using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn))) { var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn)); SetModel(instance); } } }
private VRMData LoadVRM() { var path = WindowsDialogs.OpenFileDialog("VRMファイル選択", ".vrm"); if (string.IsNullOrEmpty(path)) { return null; } var vrmdata = new VRMData(); vrmdata.FilePath = path; var context = new VRMImporterContext(path); var bytes = File.ReadAllBytes(path); // GLB形式でJSONを取得しParseします context.ParseVrm(bytes); // metaを取得 var meta = context.ReadMeta(true); //サムネイル if (meta.Thumbnail != null) { vrmdata.ThumbnailPNGBytes = meta.Thumbnail.EncodeToPNG(); //Or SaveAsPng( memoryStream, texture.Width, texture.Height ) } //Info vrmdata.Title = meta.Title; vrmdata.Version = meta.Version; vrmdata.Author = meta.Author; vrmdata.ContactInformation = meta.ContactInformation; vrmdata.Reference = meta.Reference; // Permission vrmdata.AllowedUser = (ControlWindow.AllowedUser)meta.AllowedUser; vrmdata.ViolentUssage = (ControlWindow.UssageLicense)meta.ViolentUssage; vrmdata.SexualUssage = (ControlWindow.UssageLicense)meta.SexualUssage; vrmdata.CommercialUssage = (ControlWindow.UssageLicense)meta.CommercialUssage; vrmdata.OtherPermissionUrl = meta.OtherPermissionUrl; // Distribution License vrmdata.LicenseType = (ControlWindow.LicenseType)meta.LicenseType; vrmdata.OtherLicenseUrl = meta.OtherLicenseUrl; /* // ParseしたJSONをシーンオブジェクトに変換していく var now = Time.time; var go = await VRMImporter.LoadVrmAsync(context); var delta = Time.time - now; Debug.LogFormat("LoadVrmAsync {0:0.0} seconds", delta); //OnLoaded(go); */ return vrmdata; }
void Start() { uClient = GetComponent <uOSC.uOscClient>(); window = GameObject.Find("ControlWPFWindow").GetComponent <ControlWPFWindow>(); handTrackerRoot = GameObject.Find("HandTrackerRoot"); VMCEvents.OnModelLoaded += (GameObject CurrentModel) => { if (CurrentModel != null) { this.CurrentModel = CurrentModel; animator = CurrentModel.GetComponent <Animator>(); vrik = CurrentModel.GetComponent <VRIK>(); blendShapeProxy = CurrentModel.GetComponent <VRMBlendShapeProxy>(); } }; VMCEvents.OnCameraChanged += (Camera currentCamera) => { this.currentCamera = currentCamera; }; window.VRMmetaLodedAction += (VRMData vrmdata) => { this.vrmdata = vrmdata; this.remoteName = null; this.remoteJson = null; SendPerLowRate(); //即時送信 }; window.VRMRemoteLoadedAction += (string path) => { this.vrmdata = null; if (path.StartsWith("dmmvrconnect://")) { var parsed = path.Substring("dmmvrconnect://".Length).Split('/'); remoteName = "dmmvrconnect"; remoteJson = Json.Serializer.Serialize(new DMMVRConnectRemote { user_id = parsed[0], avatar_id = parsed[1] }); } else if (path.StartsWith("vroidhub://")) { var characterModelId = path.Substring("vroidhub://".Length); remoteName = "vroidhub"; remoteJson = Json.Serializer.Serialize(new VRoidHubRemote { characterModelId = characterModelId }); } SendPerLowRate(); //即時送信 }; VMCEvents.OnLightChanged += () => { SendPerLowRate(); //即時送信 }; VMCEvents.OnLoadedConfigPathChanged += path => { SendPerLowRate(); //即時送信 }; steamVR2Input.KeyDownEvent += (object sender, OVRKeyEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: ConDown"); try { uClient?.Send("/VMC/Ext/Con", 1, e.Name, e.IsLeft ? 1 : 0, e.IsTouch ? 1 : 0, e.IsAxis ? 1 : 0, e.Axis.x, e.Axis.y, e.Axis.z); } catch (Exception ex) { Debug.LogError(ex); } } }; steamVR2Input.KeyUpEvent += (object sender, OVRKeyEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: ConUp"); try { uClient?.Send("/VMC/Ext/Con", 0, e.Name, e.IsLeft ? 1 : 0, e.IsTouch ? 1 : 0, e.IsAxis ? 1 : 0, e.Axis.x, e.Axis.y, e.Axis.z); } catch (Exception ex) { Debug.LogError(ex); } } }; steamVR2Input.AxisChangedEvent += (object sender, OVRKeyEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: ConAxis"); try { if (e.IsAxis) { uClient?.Send("/VMC/Ext/Con", 2, e.Name, e.IsLeft ? 1 : 0, e.IsTouch ? 1 : 0, e.IsAxis ? 1 : 0, e.Axis.x, e.Axis.y, e.Axis.z); } } catch (Exception ex) { Debug.LogError(ex); } } }; KeyboardAction.KeyDownEvent += (object sender, KeyboardEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Key", 1, e.KeyName, e.KeyCode); } catch (Exception ex) { Debug.LogError(ex); } } }; KeyboardAction.KeyUpEvent += (object sender, KeyboardEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyUp"); try { uClient?.Send("/VMC/Ext/Key", 0, e.KeyName, e.KeyCode); } catch (Exception ex) { Debug.LogError(ex); } } }; midiCCWrapper.noteOnDelegateProxy += (MidiJack.MidiChannel channel, int note, float velocity) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Midi/Note", 1, (int)channel, note, velocity); } catch (Exception ex) { Debug.LogError(ex); } } }; midiCCWrapper.noteOffDelegateProxy += (MidiJack.MidiChannel channel, int note) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Midi/Note", 0, (int)channel, note, (float)0f); } catch (Exception ex) { Debug.LogError(ex); } } }; midiCCWrapper.knobUpdateFloatDelegate += (int knobNo, float value) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Midi/CC/Val", knobNo, value); } catch (Exception ex) { Debug.LogError(ex); } } }; midiCCWrapper.knobUpdateBoolDelegate += (int knobNo, bool value) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Midi/CC/Bit", knobNo, (int)(value ? 1 : 0)); } catch (Exception ex) { Debug.LogError(ex); } } }; this.gameObject.SetActive(false); uClient.enabled = true; }
void Start() { uClient = GetComponent <uOSC.uOscClient>(); window = GameObject.Find("ControlWPFWindow").GetComponent <ControlWPFWindow>(); handTrackerRoot = GameObject.Find("HandTrackerRoot"); trackerHandler = handTrackerRoot.GetComponent <TrackerHandler>(); window.ModelLoadedAction += (GameObject CurrentModel) => { if (CurrentModel != null) { this.CurrentModel = CurrentModel; animator = CurrentModel.GetComponent <Animator>(); vrik = CurrentModel.GetComponent <VRIK>(); blendShapeProxy = CurrentModel.GetComponent <VRMBlendShapeProxy>(); } }; window.CameraChangedAction += (Camera currentCamera) => { this.currentCamera = currentCamera; }; window.VRMmetaLodedAction += (VRMData vrmdata) => { this.vrmdata = vrmdata; SendPerLowRate(); //即時送信 }; window.LightChangedAction += () => { SendPerLowRate(); //即時送信 }; window.LoadedConfigPathChangedAction += () => { SendPerLowRate(); //即時送信 }; steamVR2Input.KeyDownEvent += (object sender, OVRKeyEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: ConDown"); try { uClient?.Send("/VMC/Ext/Con", 1, e.Name, e.IsLeft ? 1 : 0, e.IsTouch ? 1 : 0, e.IsAxis ? 1 : 0, e.Axis.x, e.Axis.y, e.Axis.z); } catch (Exception ex) { Debug.LogError(ex); } } }; steamVR2Input.KeyUpEvent += (object sender, OVRKeyEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: ConUp"); try { uClient?.Send("/VMC/Ext/Con", 0, e.Name, e.IsLeft ? 1 : 0, e.IsTouch ? 1 : 0, e.IsAxis ? 1 : 0, e.Axis.x, e.Axis.y, e.Axis.z); } catch (Exception ex) { Debug.LogError(ex); } } }; steamVR2Input.AxisChangedEvent += (object sender, OVRKeyEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: ConAxis"); try { if (e.IsAxis) { uClient?.Send("/VMC/Ext/Con", 2, e.Name, e.IsLeft ? 1 : 0, e.IsTouch ? 1 : 0, e.IsAxis ? 1 : 0, e.Axis.x, e.Axis.y, e.Axis.z); } } catch (Exception ex) { Debug.LogError(ex); } } }; KeyboardAction.KeyDownEvent += (object sender, KeyboardEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Key", 1, e.KeyName, e.KeyCode); } catch (Exception ex) { Debug.LogError(ex); } } }; KeyboardAction.KeyUpEvent += (object sender, KeyboardEventArgs e) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyUp"); try { uClient?.Send("/VMC/Ext/Key", 0, e.KeyName, e.KeyCode); } catch (Exception ex) { Debug.LogError(ex); } } }; midiCCWrapper.noteOnDelegateProxy += (MidiJack.MidiChannel channel, int note, float velocity) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Midi/Note", 1, (int)channel, note, velocity); } catch (Exception ex) { Debug.LogError(ex); } } }; midiCCWrapper.noteOffDelegateProxy += (MidiJack.MidiChannel channel, int note) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Midi/Note", 0, (int)channel, note, (float)0f); } catch (Exception ex) { Debug.LogError(ex); } } }; midiCCWrapper.knobUpdateFloatDelegate += (int knobNo, float value) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Midi/CC/Val", knobNo, value); } catch (Exception ex) { Debug.LogError(ex); } } }; midiCCWrapper.knobUpdateBoolDelegate += (int knobNo, bool value) => { if (this.isActiveAndEnabled) { //Debug.Log("Ext: KeyDown"); try { uClient?.Send("/VMC/Ext/Midi/CC/Bit", knobNo, (int)(value?1:0)); } catch (Exception ex) { Debug.LogError(ex); } } }; if (ControlWPFWindow.CurrentSettings.VRMPath != null) { //有効なVRMが読み込まれているならメタデータを記録する(低頻度送信に頼る) if (File.Exists(ControlWPFWindow.CurrentSettings.VRMPath)) { this.vrmdata = window.LoadVRM(ControlWPFWindow.CurrentSettings.VRMPath); } } }