Exemplo n.º 1
0
 public static IObservable <float> ScaleToScreenHeight(
     this IObservable <float> observable,
     ScaleAdapter scaleAdapter
     )
 => observable.CombineLatest(
     scaleAdapter.WindowSize,
     (value, windowSize) => value * windowSize.Y
     );
Exemplo n.º 2
0
 public static IObservable <Vector2> ScaleToScreen(
     this IObservable <Vector2> observable,
     ScaleAdapter scaleAdapter
     )
 => observable
 .CombineLatest(
     scaleAdapter.WindowSize,
     (vector, windowSize) => new Vector2(
         vector.X * windowSize.X,
         vector.Y * windowSize.Y
         )
     );
Exemplo n.º 3
0
        public MarkerTrackingViewModel(ITrackingService markerTracking, ScaleAdapter scaleAdapter)
        {
            _scaleAdapter = scaleAdapter;

            _disposables = new List <IDisposable>()
            {
                Observable.FromEvent <TrackerEvents>(
                    handler => markerTracking.OnEvents += handler,
                    handler => markerTracking.OnEvents -= handler
                    )
                .SelectMany(events => events.markerEvents)
                .ObserveOn(SynchronizationContext.Current)
                .Subscribe(HandleMarkerEvent)
            };
        }
Exemplo n.º 4
0
        public MainViewModel()
        {
            ScaleAdapter       = new ScaleAdapter();
            MarkerRegistration = new MarkerRegistrationViewModel(
                _modelRoot.RegistrationService,
                _modelRoot.RegistrationField,
                ScaleAdapter
                );
            MarkerTracking = new MarkerTrackingViewModel(_modelRoot.TrackingService, ScaleAdapter);
            Pointers       = new PointersViewModel(_modelRoot.TrackingService);

            Dispatcher.CurrentDispatcher.ShutdownStarted += (sender, e) => Dispose();

            _modelRoot.Start();
        }
        public MarkerRegistrationViewModel(
            IMarkerRegistrationService registrationService,
            IMarkerRegistrationField registrationField,
            ScaleAdapter scaleAdapter
            )
        {
            IdSelectionPanel = new IdSelectionViewModel(registrationService);

            FieldPosition = Observable.Return(registrationField.FieldPosition)
                            .ScaleToScreen(scaleAdapter)
                            .ToReactiveProperty();

            FieldSize = Observable.Return(registrationField.FieldSize)
                        .ScaleToScreen(scaleAdapter)
                        .ToReactiveProperty();

            IsCandidatePlaced = Observable.FromEvent <MarkerCandidateState>(
                h => registrationService.OnMarkerCandidateUpdated += h,
                h => registrationService.OnMarkerCandidateUpdated -= h
                )
                                .Do(value => Debug.WriteLine($"-> Candidate update = {value}"))
                                .Select(state => state == MarkerCandidateState.Detected)
                                .ToReactiveProperty();

            IsSelectingId = IsCandidatePlaced
                            .SelectMany(async isSelecting =>
            {
                if (isSelecting)
                {
                    await IdSelectionPanel.UpdateRegisteredIdsAsync();
                    return(IsCandidatePlaced.Value);
                }
                return(false);
            })
                            .ToReactiveProperty();

            _disposable = IdSelectionPanel.SelectedId
                          .Subscribe(id =>
            {
                registrationService.RegisterCandidate(id);
                IsSelectingId.Value = false;
                IsCandidatePlaced.ForceNotify();
            });
        }
Exemplo n.º 6
0
        public TrackedMarkerViewModel(int index, ScaleAdapter scaleAdapter)
        {
            Index = index;
            Color = _colors[index % _colors.Length];

            Position = new ReactiveProperty <Vector2>();
            Radius   = new ReactiveProperty <float>();
            Rotation = new ReactiveProperty <float>();

            ScaledPosition = Observable.CombineLatest(
                Position,
                scaleAdapter.WindowWidth,
                scaleAdapter.WindowHeight,
                (position, width, height) => new Vector2(position.X * width, position.Y * height)
                )
                             .ToReactiveProperty();

            ScaledRadius = Radius.ScaleToScreenHeight(scaleAdapter)
                           .ToReactiveProperty();
        }