float variableOscillator::updateVariableOscillator(float deltaTime) { float returnVal; float halfRange; mCumTime += deltaTime; // has the function crossed a max or a min? if ((mGoingUp && (mCumTime > (mPeriod / 2.0f))) || (!mGoingUp && (mCumTime > mPeriod))) { mStartVal = mLastVal; if (mGoingUp) { mEndVal = computeEndVal(mStartVal, mMin); } else { mEndVal = computeEndVal(mStartVal, mMax); mCumTime = mCumTime - mPeriod; } mGoingUp = !mGoingUp; } halfRange = 0.5f * PxAbs(mEndVal - mStartVal); returnVal = -halfRange * PxCos(mCumTime * PxTwoPi / mPeriod) + halfRange + PxMin(mStartVal, mEndVal); mLastVal = returnVal; return(returnVal); }
variableOscillator::variableOscillator(float min, float max, float initial, float period) : mMin(min), mMax(max), mPeriod(period), mStartVal(initial), mLastVal(initial) { mCumTime = 0.0f; mGoingUp = true; mEndVal = computeEndVal(mMin, mMax); }
variableOscillator::variableOscillator(physx::PxF32 min, physx::PxF32 max, physx::PxF32 initial, physx::PxF32 period) : mMin(min), mMax(max), mPeriod(period), mStartVal(initial), mLastVal(initial) { mCumTime = 0.0f; mGoingUp = true; mEndVal = computeEndVal(mMin, mMax); }