public void SetResult(HandTrackingResult model)
        {
            LeftDetected.Value        = model.Left.Detected;
            LeftConfidence.Value      = model.Left.Confidence;
            RightDetected.Value       = model.Right.Detected;
            RightConfidence.Value     = model.Right.Confidence;
            LeftOrRightDetected.Value = model.Left.Detected || model.Right.Detected;

            SwapBuffer(model);

            if (model.Left.Points.Length > 0)
            {
                var src = model.Left.Points;
                for (int i = 0; i < LeftPoints.Length; i++)
                {
                    LeftPoints[i].X = src[i].X * PanelWidth;
                    //NOTE: UI座標系は上が0になってるので反転が必要
                    LeftPoints[i].Y = (1.0 - src[i].Y) * PanelHeight;
                }
                //NOTE: 配列スワップ + 値の書き込みが終わったのを受けてViewに通知
                RaisePropertyChanged(nameof(LeftPoints));
            }

            if (model.Right.Points.Length > 0)
            {
                var src = model.Right.Points;
                for (int i = 0; i < RightPoints.Length; i++)
                {
                    RightPoints[i].X = src[i].X * PanelWidth;
                    RightPoints[i].Y = (1.0 - src[i].Y) * PanelHeight;
                }
                RaisePropertyChanged(nameof(RightPoints));
            }
        }
        private void SwapBuffer(HandTrackingResult model)
        {
            if (model.Left.Points.Length > 0 && _leftPointsBuffer.Length != model.Left.Points.Length)
            {
                _leftPointsBuffer = new Point[model.Left.Points.Length];
            }

            if (model.Right.Points.Length > 0 && _rightPointsBuffer.Length != model.Right.Points.Length)
            {
                _rightPointsBuffer = new Point[model.Right.Points.Length];
            }

            (_leftPointsBuffer, LeftPoints)   = (LeftPoints, _leftPointsBuffer);
            (_rightPointsBuffer, RightPoints) = (RightPoints, _rightPointsBuffer);
        }
示例#3
0
        private void OnReceivedCommand(object?sender, CommandReceivedEventArgs e)
        {
            switch (e.Command)
            {
            case ReceiveMessageNames.SetCalibrationFaceData:
                //NOTE: Unity側がすでにこの値を把握しているので、投げ返す必要がない
                _model.CalibrateFaceData.SilentSet(e.Args);
                break;

            case ReceiveMessageNames.AutoAdjustResults:
                _model.SetAutoAdjustResults(e.Args);
                break;

            case ReceiveMessageNames.MicrophoneVolumeLevel:
                if (ShowMicrophoneVolume.Value && int.TryParse(e.Args, out int i))
                {
                    MicrophoneVolumeValue.Value = i;
                }
                break;

            case ReceiveMessageNames.ExtraBlendShapeClipNames:
                try
                {
                    //いちおう信頼はするけどIPCだし…みたいな書き方。FaceSwitchと同じ
                    var names = e.Args
                                .Split(',')
                                .Where(w => !string.IsNullOrEmpty(w))
                                .ToArray();
                    _blendShapeNameStore.Refresh(names);
                }
                catch (Exception ex)
                {
                    LogOutput.Instance.Write(ex);
                }
                break;

            case ReceiveMessageNames.SetHandTrackingResult:
                HandTrackingResult.SetResult(HandTrackingResultBuilder.FromJson(e.Args));
                break;

            default:
                break;
            }
        }