void InputManager::clearControlStates() { while (!mControlStates.empty()) { ControlState* controller = mControlStates.top(); mControlStates.pop(); controller->pause(); mFinishedControlStates.push_back(controller); } }
SequenceStatus GestureSeqRecorder::ensureSameState(ControlState state) { if (prevState != state.getMode()) { // Try and recover from corruption by resetting prevState, and returning // error. prevState = state.getMode(); return SequenceStatus::UNEXPECT_STATE_CHANGE; } return SequenceStatus::SUCCESS; }
void InputManager::popControlState() { ControlState* controller = mControlStates.top(); mControlStates.pop(); controller->pause(); mFinishedControlStates.push_back(controller); if (!mControlStates.empty()) { ControlState* newController = mControlStates.top(); newController->resume(); } }
void Control::Up() { if (state_->Active()) { Control* target = state_->Selection(); state_->Action(target); for (ControlState* c = state_; c != nil; c = c->Prev()) { c->Deactivate(); } if (target != nil) { Busy(); target->Do(); Done(); } } }
SequenceStatus GestureSeqRecorder::findActivation(Pose::Type gesture, ControlState state, commandData& response) { SequenceStatus status = SequenceStatus::SUCCESS; sequenceList *seqList = (*seqMapPerMode)[state.getMode()]; // Loop through all possible sequences in this mode, and activate any that // have a matching first gesture. for (sequenceList::iterator it = seqList->begin(); it != seqList->end(); it++) { if ((it->seq.size() >= 0) && (it->seq.at(0).type == gesture)) { clock_t now = clock(); progressBaseTime = now; if (it->seq.at(0).poseLen == SeqElement::PoseLength::IMMEDIATE) { // Special case. Immediate isn't 'held' response = it->sequenceResponse; break; } // found sequence to activate! activeSequencesMutex.lock(); activeSequences.push_back(&(*it)); activeSequencesMutex.unlock(); printStatus(true); holdGestTimer = REQ_HOLD_TIME; // set count on any progression } } seqList = NULL; return status; }
boolean Control::IsGrabbing(Interactor* i) { if (i == this) { return true; } ControlState* c; for (c = state_; c != nil; c = c->Next()) { if (c->IsView(i)) { return true; } } for (c = state_->Prev(); c != nil; c = c->Prev()) { if (c->IsView(i)) { return true; } } return false; }
SequenceStatus GestureSeqRecorder::progressSequence(Pose::Type gesture, ControlState state, CommandData& response) { SequenceStatus status = SequenceStatus::SUCCESS; response.setType(commandType::NONE); prevPose = gesture; if (activeSequences.size() != 0) { status = ensureSameState(state); if (status == SequenceStatus::SUCCESS) { status = progressActiveSequences(gesture, state, response); } } else { status = findActivation(gesture, state, response); if (state.getMode() != prevState) { updateGuiSequences(); } prevState = state.getMode(); } if (response.getType() != commandType::NONE || status != SequenceStatus::SUCCESS) { // if the response is not NONE, a sequence has completed. Therefore all // active sequences must be cleared so that all valid sequences can potentially // be started. emptyActiveSequences(); if (response.getType() != commandType::NONE) { std::cout << "GestureSeqRecorder returning a registered response." << std::endl; } } return status; }
void InputState::serializefrom(BitStream &bs) { m_send_deltas=false; #ifdef DEBUG_INPUT fprintf(stderr,"\nI:"); #endif if(bs.GetBits(1)) extended_input(bs); bool has_targeted_entity = bs.GetBits(1); int tgt_idx=bs.GetPackedBits(14); // targeted entity server index int ctrl_idx=0; #ifdef DEBUG_INPUT fprintf(stderr,"T:[%d]",has_targeted_entity); if(has_targeted_entity) fprintf(stderr,"TI:[%d]",tgt_idx); #endif ControlState prev_fld; while(bs.GetBits(1)) // receive control state array entries ? { ControlState fld; if(ctrl_idx) { fld.serializefrom_delta(bs,prev_fld); } else // initial values { fld.serializefrom_base(bs); } fld.dump(); prev_fld = fld; ctrl_idx++; } recv_client_opts(bs); // g_pak contents will follow #ifdef DEBUG_INPUT fprintf(stderr,"\n"); #endif }
SequenceStatus GestureSeqRecorder::findActivation(Pose::Type gesture, ControlState state, CommandData& response) { SequenceStatus status = SequenceStatus::SUCCESS; sequenceList *seqList = (*seqMapPerMode)[state.getMode()]; // Loop through all possible sequences in this mode, and activate any that // have a matching first gesture. for (sequenceList::iterator it = seqList->begin(); it != seqList->end(); it++) { if ((it->seq.size() >= 0) && (it->seq.at(0).type == gesture)) { clock_t now = clock(); progressBaseTime = now; // found sequence to activate! activeSequencesMutex.lock(); activeSequences.push_back(&(*it)); activeSequencesMutex.unlock(); printStatus(true); if (it->seq.at(0).poseLen == PoseLength::IMMEDIATE) { if (it->seq.size() == 1) { // Special case. Immediate of size one should return response! response = it->sequenceResponse; break; } else { it->progress++; updateGuiSequences(); } } holdGestTimer = settingsSignaller.getHoldLength(); // set count on any progression } } seqList = NULL; return status; }