/*
   A collection of quick and dirty maths hacks to let us do funky stuff with Clutter.

   Although we don't recommend these hacks for general use, to avoid questions being asked
   please feel free to use this code under the WTFPL (http://sam.zoy.org/wtfpl/COPYING)
*/

double clamp(double value, double minval, double maxval) {
	if (value > maxval) {
		value = maxval;
	} else if (value < minval) {
		value = minval;
	}

	return value;
}

double hermite(double value1, double tangent1, double value2, double tangent2, double amount) {
	double AmountSquared = amount * amount;
	double AmountCubed = AmountSquared * amount;

	double result;

	if (amount == 0.0) {
		result = value1;
	} else if (amount == 1.0) {
		result = value2;
	} else {
		result = (2 * value1 - 2 * value2 + tangent2 + tangent1) * AmountCubed + (3 * value2 - 3 * value1 - 2 * tangent1 - tangent2) * AmountSquared + tangent1 * amount + value1;
	}

	return result;
}

double smooth_step(double value1, double value2, double amount) {
	double result = clamp(amount, 0.0, 1.0);
	result = hermite(value1, 0.0, value2, 0.0, result);
	return result;
}

double smooth_step2(double value1, double value2, double amount) {
	double result = clamp(amount, 0.0, 1.0);

	if (result > 0.5) {
		result = hermite(value2, 0.0, value1, 0.0, (result - 0.5) * 2);
	} else {
		result = hermite(value1, 0.0, value2, 0.0, result * 2);
	}

	return result;
}

