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;
         }
     }
 }
示例#2
0
        /// <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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
                }
            }
        }
示例#5
0
    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;
        }
示例#7
0
    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);
            }
        }
    }