Commit 6ab01490 authored by Chaosus's avatar Chaosus Committed by Hein-Pieter van Braam-Stewart
Browse files

Added smoothstep built-in function

(cherry picked from commit 514a3fb9)
parent 340bf6e8
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ const char *Expression::func_name[Expression::FUNC_MAX] = {
	"lerp",
	"inverse_lerp",
	"range_lerp",
	"smoothstep",
	"dectime",
	"randomize",
	"randi",
@@ -185,6 +186,7 @@ int Expression::get_func_argument_count(BuiltinFunc p_func) {
			return 2;
		case MATH_LERP:
		case MATH_INVERSE_LERP:
		case MATH_SMOOTHSTEP:
		case MATH_DECTIME:
		case MATH_WRAP:
		case MATH_WRAPF:
@@ -392,6 +394,12 @@ void Expression::exec_func(BuiltinFunc p_func, const Variant **p_inputs, Variant
			VALIDATE_ARG_NUM(4);
			*r_return = Math::range_lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2], (double)*p_inputs[3], (double)*p_inputs[4]);
		} break;
		case MATH_SMOOTHSTEP: {
			VALIDATE_ARG_NUM(0);
			VALIDATE_ARG_NUM(1);
			VALIDATE_ARG_NUM(2);
			*r_return = Math::smoothstep((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]);
		} break;
		case MATH_DECTIME: {

			VALIDATE_ARG_NUM(0);
+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ public:
		MATH_LERP,
		MATH_INVERSE_LERP,
		MATH_RANGE_LERP,
		MATH_SMOOTHSTEP,
		MATH_DECTIME,
		MATH_RANDOMIZE,
		MATH_RAND,
+11 −0
Original line number Diff line number Diff line
@@ -208,6 +208,17 @@ public:
	static _ALWAYS_INLINE_ double range_lerp(double p_value, double p_istart, double p_istop, double p_ostart, double p_ostop) { return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); }
	static _ALWAYS_INLINE_ float range_lerp(float p_value, float p_istart, float p_istop, float p_ostart, float p_ostop) { return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); }

	static _ALWAYS_INLINE_ double smoothstep(double p_from, double p_to, double p_weight) {
		if (is_equal_approx(p_from, p_to)) return p_from;
		double x = CLAMP((p_weight - p_from) / (p_to - p_from), 0.0, 1.0);
		return x * x * (3.0 - 2.0 * x);
	}
	static _ALWAYS_INLINE_ float smoothstep(float p_from, float p_to, float p_weight) {
		if (is_equal_approx(p_from, p_to)) return p_from;
		float x = CLAMP((p_weight - p_from) / (p_to - p_from), 0.0f, 1.0f);
		return x * x * (3.0f - 2.0f * x);
	}

	static _ALWAYS_INLINE_ double linear2db(double p_linear) { return Math::log(p_linear) * 8.6858896380650365530225783783321; }
	static _ALWAYS_INLINE_ float linear2db(float p_linear) { return Math::log(p_linear) * 8.6858896380650365530225783783321; }

+18 −0
Original line number Diff line number Diff line
@@ -973,6 +973,24 @@
				[/codeblock]
			</description>
		</method>
		<method name="smoothstep">
			<return type="float">
			</return>
			<argument index="0" name="from" type="float">
			</argument>
			<argument index="1" name="to" type="float">
			</argument>
			<argument index="2" name="weight" type="float">
			</argument>
			<description>
				Returns a number smoothly interpolated between the [code]from[/code] and [code]to[/code], based on the [code]weight[/code]. Similar to [method lerp], but interpolates faster at the beginning and slower at the end.
				[codeblock]
				smooth_step(0, 2, 0.5) # returns 0.15
				smooth_step(0, 2, 1.0) # returns 0.5
				smooth_step(0, 2, 2.0) # returns 1.0
				[/codeblock]
			</description>
		</method>
		<method name="sqrt">
			<return type="float">
			</return>
+14 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ const char *GDScriptFunctions::get_func_name(Function p_func) {
		"lerp",
		"inverse_lerp",
		"range_lerp",
		"smoothstep",
		"dectime",
		"randomize",
		"randi",
@@ -369,6 +370,13 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
			VALIDATE_ARG_NUM(4);
			r_ret = Math::range_lerp((double)*p_args[0], (double)*p_args[1], (double)*p_args[2], (double)*p_args[3], (double)*p_args[4]);
		} break;
		case MATH_SMOOTHSTEP: {
			VALIDATE_ARG_COUNT(3);
			VALIDATE_ARG_NUM(0);
			VALIDATE_ARG_NUM(1);
			VALIDATE_ARG_NUM(2);
			r_ret = Math::smoothstep((double)*p_args[0], (double)*p_args[1], (double)*p_args[2]);
		} break;
		case MATH_DECTIME: {
			VALIDATE_ARG_COUNT(3);
			VALIDATE_ARG_NUM(0);
@@ -1435,6 +1443,7 @@ bool GDScriptFunctions::is_deterministic(Function p_func) {
		case MATH_LERP:
		case MATH_INVERSE_LERP:
		case MATH_RANGE_LERP:
		case MATH_SMOOTHSTEP:
		case MATH_DECTIME:
		case MATH_DEG2RAD:
		case MATH_RAD2DEG:
@@ -1618,6 +1627,11 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) {
			mi.return_val.type = Variant::REAL;
			return mi;
		} break;
		case MATH_SMOOTHSTEP: {
			MethodInfo mi("smoothstep", PropertyInfo(Variant::REAL, "from"), PropertyInfo(Variant::REAL, "to"), PropertyInfo(Variant::REAL, "weight"));
			mi.return_val.type = Variant::REAL;
			return mi;
		} break;
		case MATH_DECTIME: {
			MethodInfo mi("dectime", PropertyInfo(Variant::REAL, "value"), PropertyInfo(Variant::REAL, "amount"), PropertyInfo(Variant::REAL, "step"));
			mi.return_val.type = Variant::REAL;
Loading