//public float TouchDistance { get; } //public Pointable.Zone TouchZone { get; } public Pointable(Leap.Pointable pointable, Frame frame, Hand hand) { IsTraveled = false; this.Frame = frame; this.Hand = hand; this.Id = pointable.Id; this.IsFinger = pointable.IsFinger; this.IsTool = pointable.IsTool; this.IsValid = pointable.IsValid; this.Length = pointable.Length; this.Width = pointable.Width; this.TimeVisible = pointable.TimeVisible; this.TipPosition = new Vector(pointable.TipPosition); this.TipVelocity = new Vector(pointable.TipVelocity); this.StabilizedTipPosition = new Vector(pointable.StabilizedTipPosition); }
public static void Update(GameTime gameTime, Leap.Frame frame) { Leap.Pointable currentPointer = null; foreach (Leap.Hand hand in frame.Hands) { Vector3 furthest = new Vector3(0, 0, 1000); foreach (Leap.Pointable p in hand.Pointables) { if (p.IsExtended) { Vector3 worldPos = Util.toWorldNoTransform(p.StabilizedTipPosition) - new Vector3(0, Main.handOffset, 0); if (worldPos.Z < furthest.Z) { furthest = worldPos; currentPointer = p; } } } Vector3 screenPos = Main.main.GraphicsDevice.Viewport.Project(furthest, Main.main.handCamera.projection, Main.main.handCamera.view, Matrix.Identity); screenFingerPos = new Vector2((screenPos.X - Main.screenWidth / 2) * 2f + (Main.screenWidth / 2), screenPos.Y); if (screenFingerPos.Y > Main.screenHeight * .5f) { screenFingerPos.Y += (screenFingerPos.Y - Main.screenHeight / 2) * 1.5f; } } int w = Main.screenWidth; int h = Main.screenHeight; Point finger = new Point((int)screenFingerPos.X, (int)screenFingerPos.Y); foreach (Screen screen in screens) { if (screen.visible) { float sw = screen.Size.calc(w, h).X; float sh = screen.Size.calc(w, h).Y; foreach (UIElement e in screen.elements) { if (e is Button) { Button btn = e as Button; Rectangle r = new Rectangle((int)btn.Position.calc(sw, sh).X, (int)btn.Position.calc(sw, sh).Y, (int)btn.Size.calc(sw, sh).X + (int)btn.selOffset.X + (int)btn.selOffset.X, (int)btn.Size.calc(sw, sh).Y); if (r.Contains(finger)) { btn.hover = true; btn.selOffset.X = MathHelper.Lerp(btn.selOffset.X, 50, .2f); if (currentPointer != null) { if (currentPointer.TipVelocity.x > 200 && finger.X > r.Right - 40) { if (btn.onClick != null) { btn.onClick.Invoke(); } } } } else { btn.hover = false; btn.selOffset.X = MathHelper.Lerp(btn.selOffset.X, 0, .2f); } } else if (e is RadioList) { RadioList rl = e as RadioList; for (int i = 0; i < rl.items.Count; i++) { RadioListElement item = rl.items[i]; int yoffset = (int)(i * rl.Size.calc(sw, sh).Y + i * 5); Rectangle r = new Rectangle((int)rl.Position.calc(sw, sh).X, (int)rl.Position.calc(sw, sh).Y + yoffset, (int)rl.Size.calc(sw, sh).X, (int)rl.Size.calc(sw, sh).Y); if (r.Contains(finger) && !item.disabled) { item.hover = true; item.offset = MathHelper.Lerp(item.offset, i == rl.selected ? 50 : 25, .2f); if (currentPointer != null) { if (currentPointer.TipVelocity.x > 150 && finger.X > r.Center.X) { rl.selected = i; if (item.onSelected != null) { item.onSelected.Invoke(); } } } } else { item.hover = false; if (i != rl.selected) { item.offset = MathHelper.Lerp(item.offset, 0, .2f); } else { item.offset = MathHelper.Lerp(item.offset, 50, .2f); if (item.disabled) { rl.selected = -1; } } } rl.items[i] = item; } } } } } }