Exemplo n.º 1
0
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));
            }
        }
    }
}
Exemplo n.º 2
0
void AnimationState::clearTracks()
{
    for (size_t i = 0; i < tracks.size(); ++i)
    {
        clearTrack(int(i));
    }

    tracks.clear();
}
Exemplo n.º 3
0
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();
}
Exemplo n.º 4
0
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());

  }
}