public void applyBinding(string gesture, bool down) { var b = getBinding(gesture); if (b != null && b.KeyMouseEvent != null && b.KeyMouseEvent != "") { var key = b.KeyMouseEvent; var mod = ""; if (b.KeyMouseEvent.Contains("+")) { var tokens = key.Split('+'); if (tokens.Length > 1) { key = tokens[1]; mod = tokens[0]; } else if (tokens.Length > 0) { key = tokens[0]; } } // First handle modifiers if (mod.Length > 0) { MouseKeyboardSimulator.sendKeyEvent("Left" + mod, down); } // Handle mouse buttons if (key == "LMB") { if (down || Fubi.getCurrentTime() - m_lastMouseClick > 1) { MouseKeyboardSimulator.sendMouseButton(MouseKeyboardSimulator.MouseButtonType.LEFT, down); if (!down) { m_lastMouseClick = Fubi.getCurrentTime(); } } } else if (key == "RMB") { MouseKeyboardSimulator.sendMouseButton(MouseKeyboardSimulator.MouseButtonType.RIGHT, down); } else if (key == "MMB") { MouseKeyboardSimulator.sendMouseButton(MouseKeyboardSimulator.MouseButtonType.MIDDLE, down); } else if (key == "X1MB" || key == "X2MB") { MouseKeyboardSimulator.sendMouseButton(MouseKeyboardSimulator.MouseButtonType.X, down); } // Handle keys else if (key.Length > 0) { MouseKeyboardSimulator.sendKeyEvent(key, down); } } }
// AA: Removing this function disables click functionality so have not commented it out static public bool FubiGesture(Rect r, string name, GUIStyle style) { GUI.depth = -2; instance.m_gesturesDisplayed = true; if (instance.m_gestureSymbolDict.ContainsKey(name)) { MultiTexture2D animation = instance.m_gestureSymbolDict[name]; int index = (int)(Time.realtimeSinceStartup * animation.animationFps) % animation.Length; GUI.DrawTexture(r, animation[index], ScaleMode.ScaleToFit); if (GUI.Button(r, "", style)) { return(true); } if (instance.m_disableCursorWithGestures && instance.m_gesturesDisplayedLastFrame && rectContainsCursor(r) && clickRecognized()) { return(true); } } if (Fubi.getCurrentTime() - instance.m_lastGesture > 0.8f) { uint userID = instance.m_currentUser; if (userID > 0) { FubiTrackingData[] userStates; if (Fubi.getCombinationRecognitionProgressOn(name, userID, out userStates, false) == FubiUtils.RecognitionResult.RECOGNIZED && userStates.Length > 0) { double time = userStates[userStates.Length - 1].timeStamp; // Check if gesture did not happen longer ago then 1 second if (Fubi.getCurrentTime() - time < 1.0f) { instance.m_lastGesture = time; // Reset all recognizers Fubi.enableCombinationRecognition(FubiPredefinedGestures.Combinations.NUM_COMBINATIONS, userID, false); return(true); } } // Unsuccesfull recognition so start the recognizer for the next recognition Fubi.enableCombinationRecognition(name, userID, true); if (Fubi.recognizeGestureOn(name, userID) == FubiUtils.RecognitionResult.RECOGNIZED) { instance.m_lastGesture = Fubi.getCurrentTime(); // Reset all recognizers Fubi.enableCombinationRecognition(FubiPredefinedGestures.Combinations.NUM_COMBINATIONS, userID, false); return(true); } } } return(false); }
static private bool clickRecognized() { bool click = false; if (Fubi.getCurrentTime() - instance.m_lastMouseClick > 0.5f) { uint userID = instance.m_currentUser; if (userID > 0) { // Check for mouse click as defined in xml FubiTrackingData[] userStates; if (Fubi.getCombinationRecognitionProgressOn("mouseClick", userID, out userStates, false) == FubiUtils.RecognitionResult.RECOGNIZED) { if (userStates != null && userStates.Length > 0) { double clickTime = userStates[userStates.Length - 1].timeStamp; // Check that click occured no longer ago than 1 second if (Fubi.getCurrentTime() - clickTime < 1.0f) { click = true; instance.m_lastMouseClick = clickTime; // Reset all recognizers Fubi.enableCombinationRecognition(FubiPredefinedGestures.Combinations.NUM_COMBINATIONS, userID, false); } } } if (!click) { Fubi.enableCombinationRecognition("mouseClick", userID, true); } if (Fubi.recognizeGestureOn("mouseClick", userID) == FubiUtils.RecognitionResult.RECOGNIZED) { Debug.Log("Mouse click recognized."); click = true; instance.m_lastMouseClick = Fubi.getCurrentTime(); // Reset all recognizers Fubi.enableCombinationRecognition(FubiPredefinedGestures.Combinations.NUM_COMBINATIONS, userID, false); } } } return(click); }
private void updateStats() { //Check all users var numUsers = Fubi.getNumUsers(); var numHands = Fubi.getNumHands(); if (numUsers == 0 && numHands == 0) { warnLabel.Visibility = Visibility.Visible; } else { warnLabel.Visibility = Visibility.Hidden; } int currentIndex = 0; for (uint i = 0; i < numUsers + 1; i++) { var id = (i == numUsers && Fubi.isPlayingSkeletonData()) ? FubiUtils.PlaybackUserID : Fubi.getUserID(i); if (id > 0) { // Not existent yet if (currentIndex >= statsTree.Items.Count) { statsTree.Items.Add(new TvUser()); ((TvUser)statsTree.Items[currentIndex]).IsExpanded = true; } // Wrong type, i.e. TvHand instead of TvUser if (statsTree.Items[currentIndex].GetType() != typeof(TvUser)) { statsTree.Items[currentIndex] = new TvUser(); ((TvUser)statsTree.Items[currentIndex]).IsExpanded = true; } var tUser = (TvUser)statsTree.Items[currentIndex]; tUser.id = id; // Update user defined combinations var numRecs = Fubi.getNumUserDefinedCombinationRecognizers(); uint actualRecs = 0; for (uint pc = 0; pc < numRecs; ++pc) { var name = Fubi.getUserDefinedCombinationRecognizerName(pc); while (actualRecs >= tUser.Recs.Count) { tUser.Recs.Add(new TvRec()); } var rec = tUser.Recs[(int)actualRecs]; rec.id = pc; rec.name = name; uint numStates; bool isInterrupted, isInTransition; rec.currState = Fubi.getCurrentCombinationRecognitionState(name, id, out numStates, out isInterrupted, out isInTransition) + 1; rec.numStates = numStates; rec.isInterrupted = isInterrupted; rec.isInTransition = isInTransition; if (Recognitions.ContainsKey(id) && Recognitions[id].ContainsKey(name) && Fubi.getCurrentTime() - Recognitions[id][name] < 2.0) { rec.bgColor = "LightGreen"; } else { rec.bgColor = Color.Transparent.Name; } if (Hints.ContainsKey(id) && Hints[id].ContainsKey(name)) { rec.hint = Hints[id][name]; } actualRecs++; } while (tUser.Recs.Count > actualRecs) { tUser.Recs.RemoveAt(tUser.Recs.Count - 1); } ++currentIndex; } } for (uint i = 0; i < numHands + 1; i++) { var id = (i == numHands && Fubi.isPlayingSkeletonData()) ? FubiUtils.PlaybackHandID : Fubi.getHandID(i); if (id > 0) { if (currentIndex >= statsTree.Items.Count) { statsTree.Items.Add(new TvHand()); ((TvHand)statsTree.Items[currentIndex]).IsExpanded = true; } // Wrong type, i.e. TvUser instead of TvUHand if (statsTree.Items[currentIndex].GetType() != typeof(TvHand)) { statsTree.Items[currentIndex] = new TvHand(); ((TvHand)statsTree.Items[currentIndex]).IsExpanded = true; } var tHand = (TvHand)statsTree.Items[currentIndex]; tHand.id = id; // Update combinations var numRecs = Fubi.getNumUserDefinedCombinationRecognizers(); uint actualRecs = 0; for (uint pc = 0; pc < numRecs; ++pc) { var name = Fubi.getUserDefinedCombinationRecognizerName(pc); while (actualRecs >= tHand.Recs.Count) { tHand.Recs.Add(new TvRec()); } var rec = tHand.Recs[(int)actualRecs]; rec.id = pc; rec.name = name; uint numStates; bool isInterrupted, isInTransition; rec.currState = Fubi.getCurrentCombinationRecognitionStateForHand(name, id, out numStates, out isInterrupted, out isInTransition) + 1; rec.numStates = numStates; rec.isInterrupted = isInterrupted; rec.isInTransition = isInTransition; if (HandRecognitions.ContainsKey(id) && HandRecognitions[id].ContainsKey(name) && Fubi.getCurrentTime() - HandRecognitions[id][name] < 2.0) { rec.bgColor = "LightGreen"; } else { rec.bgColor = Color.Transparent.Name; } if (HandHints.ContainsKey(id) && HandHints[id].ContainsKey(name)) { rec.hint = HandHints[id][name]; } actualRecs++; } while (tHand.Recs.Count > actualRecs) { tHand.Recs.RemoveAt(tHand.Recs.Count - 1); } ++currentIndex; } } while (statsTree.Items.Count > currentIndex) { statsTree.Items.RemoveAt(statsTree.Items.Count - 1); } }