Exemplo n.º 1
0
 /// <summary>
 /// ファイルからロードされたはずの設定を参照し、その中で使われているブレンドシェイプ名を参考にして名前一覧を更新します。
 /// </summary>
 /// <param name="currentSetting"></param>
 public void Refresh(ExternalTrackerFaceSwitchSetting currentSetting)
 {
     _settingUsedNames = currentSetting.Items
                         .Select(i => i.ClipName)
                         .ToArray();
     RefreshInternal();
 }
        internal ExternalTrackerViewModel(IMessageSender sender, IMessageReceiver receiver) : base(sender)
        {
            RefreshReceiverSetting();
            receiver.ReceivedCommand += OnMessageReceived;

            //DEBUG: ひとまずガワを見てみたい。
            _settingModel = ExternalTrackerFaceSwitchSetting.LoadDefault();
            FaceSwitchItems.Clear();
            foreach (var item in _settingModel.Items)
            {
                FaceSwitchItems.Add(new ExternalTrackerFaceSwitchItemViewModel(this, item));
            }
        }
        /// <summary>
        /// 顔スイッチングの設定について、シリアライズされた文字列からUIに表示するデータを復元します。
        /// 設定ファイルをロードしたときや、設定をリセットしたときに呼び出します。
        /// </summary>
        internal void LoadFaceSwitchSettingFromString()
        {
            _settingModel = ExternalTrackerFaceSwitchSetting.FromJson(SerializedFaceSwitchSetting);
            //NOTE: 先に名前を更新することで「ComboBoxに無い値をSelectedValueにしちゃう」みたいな不整合を防ぐのが狙い
            _blendShapeNameStore.Refresh(_settingModel);

            foreach (var item in FaceSwitchItems)
            {
                item.UnsubscribeLanguageSelector();
            }
            FaceSwitchItems.Clear();
            foreach (var item in _settingModel.Items)
            {
                var vm = new ExternalTrackerFaceSwitchItemViewModel(this, item);
                vm.SubscribeLanguageSelector();
                FaceSwitchItems.Add(vm);
            }
        }
        public ExternalTrackerSettingSync(IMessageSender sender) : base(sender)
        {
            var setting = ExternalTrackerSetting.Default;
            var factory = MessageFactory.Instance;

            //NOTE: ひとまず初期値を入れておくと非null保証できて都合がいい、という話
            _faceSwitchSetting = ExternalTrackerFaceSwitchSetting.LoadDefault();

            EnableExternalTracking = new RProperty <bool>(
                setting.EnableExternalTracking, b => SendMessage(factory.ExTrackerEnable(b))
                );
            EnableExternalTrackerLipSync = new RProperty <bool>(
                setting.EnableExternalTrackerLipSync, b => SendMessage(factory.ExTrackerEnableLipSync(b))
                );
            EnableExternalTrackerEmphasizeExpression = new RProperty <bool>(
                setting.EnableExternalTrackerEmphasizeExpression, b => SendMessage(factory.ExTrackerEnableEmphasizeExpression(b))
                );
            EnableExternalTrackerPerfectSync = new RProperty <bool>(
                setting.EnableExternalTrackerPerfectSync, b => SendMessage(factory.ExTrackerEnablePerfectSync(b))
                );

            TrackSourceType = new RProperty <int>(setting.TrackSourceType, i => SendMessage(factory.ExTrackerSetSource(i)));
            //NOTE: このアドレスはコマンド実行時に使うため、書き換わってもメッセージは送らない
            IFacialMocapTargetIpAddress = new RProperty <string>(setting.IFacialMocapTargetIpAddress);

            CalibrateData = new RProperty <string>(
                setting.CalibrateData, s => SendMessage(factory.ExTrackerSetCalibrateData(s))
                );

            SerializedFaceSwitchSetting = new RProperty <string>(
                setting.SerializedFaceSwitchSetting, v => SendMessage(factory.ExTrackerSetFaceSwitchSetting(v))
                );

            //NOTE: この時点で、とりあえずデフォルト設定がUnityに送られる
            SaveFaceSwitchSetting();
        }