public static GameObject SetDebugMarker(this GameObject obj, MarkerType type, float scaleMult = 1f) { if (BaseObjects.markerMaterials.ContainsKey(type)) { GameObject marker = new GameObject("DebugMarker"); marker.transform.parent = obj.transform; MeshFilter filter = marker.AddComponent <MeshFilter>(); filter.sharedMesh = BaseObjects.cubeMesh; MeshRenderer render = marker.AddComponent <MeshRenderer>(); render.sharedMaterial = BaseObjects.markerMaterials[type]; DebugMarker dm = marker.AddComponent <DebugMarker>(); dm.scaleMult = scaleMult; dm.type = type; marker.transform.localPosition = Vector3.zero; marker.transform.localEulerAngles = Vector3.zero; } return(obj); }
public FeedbackHandler(Highlight highlight, DebugMarker debug) { _ingress = new Subject <SuppaChatto>(); _ingressMouseMovements = new Subject <Point>(); _highlight = highlight; _debug = debug; _uiThread = highlight.Dispatcher; _hideTimer = new DispatcherTimer(TimeSpan.FromSeconds(1), DispatcherPriority.Normal, HideTimerTick, _uiThread); _hideTimer.Stop(); _subscriptions = new CompositeDisposable(); var sub1 = _ingress .Where(x => x.DollaDollaBill?.Currency != null && x.DollaDollaBill?.Amount != null) .ObserveOn(_uiThread) .Subscribe(x => { _hideTimer.Stop(); UpdateDebugWindow(x); UpdateHighlight(x); }); _subscriptions.Add(sub1); var popupOpened = Observable.FromEventPattern <EventHandler, EventArgs>( h => _highlight.Opened += h, h => _highlight.Opened -= h) .Select(_ => Unit.Default); var popupClosed = Observable.FromEventPattern <EventHandler, EventArgs>( h => _highlight.Closed += h, h => _highlight.Closed += h) .Select(_ => Unit.Default); var whenMouseEntered = Observable.FromEventPattern <MouseEventHandler, MouseEventArgs>( h => _highlight.MouseEnter += h, h => _highlight.MouseEnter -= h) .Select(_ => CircuitBreaker.Closed); var whenMouseLeaves = Observable.FromEventPattern <MouseEventHandler, MouseEventArgs>( h => _highlight.MouseLeave += h, h => _highlight.MouseLeave -= h) .Select(_ => CircuitBreaker.Open); var circuit = whenMouseEntered .Merge(whenMouseLeaves) // NOTE; Circuit starts off in OPEN state .StartWith(CircuitBreaker.Open) // WARN; Keep circuit condition as state for new subscriptions! .Replay(1); var cancelDispatchTimer = whenMouseEntered .Subscribe(x => { Debug.WriteLine($"cancelDispatchTimer: {x}"); _hideTimer.Stop(); }); _subscriptions.Add(cancelDispatchTimer); var startDispatcherTimer = popupOpened .Select(_ => _ingressMouseMovements) .Switch() // NOTE; Create dead zone to catch mouse drift .IgnoreDelta(5, 5) .CombineLatest(circuit) .Where(x => x.Second == CircuitBreaker.Open) .TakeUntil(popupClosed) .Repeat() .Subscribe(x => { Debug.WriteLine($"startDispatcherTimer: {x}"); _hideTimer.Start(); }); _subscriptions.Add(startDispatcherTimer); _subscriptions.Add(circuit.Connect()); }