//in kSourceThread, FPoint p is the current location of the selected source, as read on the automation void SourceMover::move(FPoint pointXY01, MoverType mt) { if (mMoverType != mt){ return; } //move selected source to pointXY01 (and store in setOldSrcLocRT) only if not kSourceThread. In kSourceThread it is already being moved by automation if (mMoverType != kSourceThread){ mFilter->setSourceXY01(mSelectedSrc, pointXY01); mFilter->setOldSrcLocRT(mSelectedSrc, mFilter->convertXy012Rt(pointXY01)); if (!mField->isDestructed()){ //mField could be null when we're exiting while playing mField->updatePositionTrace(pointXY01.x, pointXY01.y); } } // if we're not in independent mode and have more than 1 source if (mFilter->getMovementMode() != 0 && mFilter->getNumberOfSources() > 1) { //calculate delta for selected source //in normal, non-source-thread mode, we calculate delta for selected source compared to its starting point FPoint oldSelSrcPosRT = (mMoverType == kSourceThread) ? mFilter->getOldSrcLocRT(mSelectedSrc) : mSourcesDownRT[mSelectedSrc]; FPoint newSelSrcPosRT = mFilter->getSourceRT(mSelectedSrc); //in kSourceThread, this will be the same as mFilter->convertXy012Rt(pointXY01) FPoint delSelSrcPosRT = newSelSrcPosRT - oldSelSrcPosRT; if (delSelSrcPosRT.isOrigin()){ return; //return if delta is null } float vxo = pointXY01.x, vyo = pointXY01.y; if (kSourceThread){ mFilter->setPreventSourceLocationUpdate(true); } for (int iCurSrc = 0; iCurSrc < mFilter->getNumberOfSources(); iCurSrc++) { if (iCurSrc == mSelectedSrc) { mFilter->setOldSrcLocRT(iCurSrc, newSelSrcPosRT); continue; } //all x's and y's here are actually r's and t's switch(mFilter->getMovementMode()) { case 1: // circular case 2: // circular, fixed radius case 3: // circular, fixed angle case 4:{ // circular, fully fixed //calculate new position for curSrc using delta for selected source FPoint oldCurSrcPosRT = (mMoverType == kSourceThread) ? mFilter->getOldSrcLocRT(iCurSrc) : mSourcesDownRT[iCurSrc]; FPoint newCurSrcPosRT = oldCurSrcPosRT + delSelSrcPosRT; if (newCurSrcPosRT.x < 0){ newCurSrcPosRT.x = 0; } if (newCurSrcPosRT.x > kRadiusMax){ newCurSrcPosRT.x = kRadiusMax; } if (newCurSrcPosRT.y < 0){ newCurSrcPosRT.y += kThetaMax; } if (newCurSrcPosRT.y > kThetaMax){ newCurSrcPosRT.y -= kThetaMax; } mFilter->setSourceRT(iCurSrc, newCurSrcPosRT, false); mFilter->setOldSrcLocRT(iCurSrc, newCurSrcPosRT); break; } case 5:{ // delta lock FPoint delSelSrcPosXY; if (mMoverType == kSourceThread){ delSelSrcPosXY = mFilter->convertRt2Xy(newSelSrcPosRT) - mFilter->convertRt2Xy(oldSelSrcPosRT); } else { delSelSrcPosXY = mFilter->getSourceXY(mSelectedSrc) - mSourcesDownXY[mSelectedSrc]; } //calculate new position for curSrc using delta for selected source FPoint oldCurSrcPosXY = (mMoverType == kSourceThread) ? mFilter->convertRt2Xy(mFilter->getOldSrcLocRT(iCurSrc)) : mSourcesDownXY[iCurSrc]; FPoint newCurSrcPosXY = oldCurSrcPosXY + delSelSrcPosXY; mFilter->setSourceXY(iCurSrc, newCurSrcPosXY, false); mFilter->setOldSrcLocRT(iCurSrc, mFilter->convertXy2Rt(newCurSrcPosXY, false)); break; } case 6: // sym x vyo = 1 - vyo; mFilter->setSourceXY01(iCurSrc, FPoint(vxo, vyo)); break; case 7: // sym y vxo = 1 - vxo; mFilter->setSourceXY01(iCurSrc, FPoint(vxo, vyo)); break; default: jassert(0); break; } } if (kSourceThread){ mFilter->setPreventSourceLocationUpdate(false); } } }