void AnimationState::update(float delta) { delta *= timeScale; for (size_t i = 0; i < tracks.size(); ++i) { auto current = tracks[i]; if (!current) continue; current->time += delta * current->timeScale; if (current->previous) { float previousDelta = delta * current->previous->timeScale; current->previous->time += previousDelta; current->mixTime += previousDelta; } if (current->next) { current->next->time = current->lastTime - current->next->delay; if (current->next->time >= 0) { setCurrent(int(i), current->next); } } else { /* End non-looping animation when it reaches its end time and there is no next entry. */ if (!current->loop && current->lastTime >= current->endTime) { clearTrack(int(i)); } } } }
void AnimationState::clearTracks() { for (size_t i = 0; i < tracks.size(); ++i) { clearTrack(int(i)); } tracks.clear(); }
void Bodyseq::update() { buttons.read(); keypads.read(); updatePosition(); pots.update(); switch(mode) { case 0: // NO_BUTTONS playTrack(); break; case 1: // BUTTON_1 selectNote(); break; case 2: // BUTTON_2 selectStep(); break; case 3: // BUTTON_1_2 selectOctave(); break; case 4: // BUTTON_3 selectTrack(); break; case 5: // BUTTON_1_3 chainTrack(); break; case 6: // BUTTON_2_3 copyTrack(); break; case 7: // BUTTON_1_2_3 clearTrack(); break; default: break; } leds.update(); }
void ProjectorWindow::pushPred(KFPrediction pred) { if (mFitLocked && mLockFit) { // If we are locked, and we have "lock until manual clear" checked } else { if (mDataStale) { clearTrack(); } // Add the prediction to the list of predictions mPreds.append(KFPrediction(pred)); // Trim the viewer points if it's too long if (mPreds.size() > 20) { mPreds.removeFirst(); } if (!mNumPointFit) { // We fit to all predictions... mFitPreds.append(KFPrediction(pred)); // If the history is too large, remove old predictions if (mPreds.size() > 20) { mFitPreds.removeFirst(); } } else { if ((mWaitTilFall && pred.jet().y()*pred.dt() < mMinFallSpeed) || (mFitPreds.size() < mNumPointFit)) { mFitPreds.append(KFPrediction(pred)); mFitLocked = false; } if ((!mWaitTilFall || pred.jet().y()*pred.dt() >= mMinFallSpeed) && (mFitPreds.size() >= mNumPointFit)){ mFitLocked = true; } } // We fit our parabola to the predictions if (!mFitPoints) { polynomialFitKFX(2, mFitPreds.at(0).t(), mFitPreds, mFitLineX); polynomialFitKFY(3, mFitPreds.at(0).t(), mFitPreds, mFitParabolaY); } else if (mFitLocked && mFitPreds.size() > 3 && mMarkedPoints.empty()) { mMarkedPoints.append(mFitPreds.at(0)); mMarkedPoints.append(*std::min_element( ++mFitPreds.begin(), --mFitPreds.end(), comparePredY)); mMarkedPoints.append(mFitPreds.at(mFitPreds.size()-1)); fitYTPoints(mMarkedPoints, mFitParabolaY); fitXTPoints(mMarkedPoints, mFitLineX); } // Update the window. Hopefully, we can make this more efficient... update();//(pred.bbox()); } }