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);
}