Merge pull request #57954 from TokageItLab/refactor-cubic-interpolate
Implement `cubic_interpolate()` as MathFunc for refactoring
This commit is contained in:
commit
7224389468
12 changed files with 142 additions and 115 deletions
|
@ -235,6 +235,21 @@ public:
|
|||
static _ALWAYS_INLINE_ double lerp(double p_from, double p_to, double p_weight) { return p_from + (p_to - p_from) * p_weight; }
|
||||
static _ALWAYS_INLINE_ float lerp(float p_from, float p_to, float p_weight) { return p_from + (p_to - p_from) * p_weight; }
|
||||
|
||||
static _ALWAYS_INLINE_ double cubic_interpolate(double p_from, double p_to, double p_pre, double p_post, double p_weight) {
|
||||
return 0.5 *
|
||||
((p_from * 2.0) +
|
||||
(-p_pre + p_to) * p_weight +
|
||||
(2.0 * p_pre - 5.0 * p_from + 4.0 * p_to - p_post) * (p_weight * p_weight) +
|
||||
(-p_pre + 3.0 * p_from - 3.0 * p_to + p_post) * (p_weight * p_weight * p_weight));
|
||||
}
|
||||
static _ALWAYS_INLINE_ float cubic_interpolate(float p_from, float p_to, float p_pre, float p_post, float p_weight) {
|
||||
return 0.5f *
|
||||
((p_from * 2.0f) +
|
||||
(-p_pre + p_to) * p_weight +
|
||||
(2.0f * p_pre - 5.0f * p_from + 4.0f * p_to - p_post) * (p_weight * p_weight) +
|
||||
(-p_pre + 3.0f * p_from - 3.0f * p_to + p_post) * (p_weight * p_weight * p_weight));
|
||||
}
|
||||
|
||||
static _ALWAYS_INLINE_ double lerp_angle(double p_from, double p_to, double p_weight) {
|
||||
double difference = fmod(p_to - p_from, Math_TAU);
|
||||
double distance = fmod(2.0 * difference, Math_TAU) - difference;
|
||||
|
|
|
@ -153,22 +153,10 @@ Vector2 Vector2::limit_length(const real_t p_len) const {
|
|||
}
|
||||
|
||||
Vector2 Vector2::cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, const real_t p_weight) const {
|
||||
Vector2 p0 = p_pre_a;
|
||||
Vector2 p1 = *this;
|
||||
Vector2 p2 = p_b;
|
||||
Vector2 p3 = p_post_b;
|
||||
|
||||
real_t t = p_weight;
|
||||
real_t t2 = t * t;
|
||||
real_t t3 = t2 * t;
|
||||
|
||||
Vector2 out;
|
||||
out = 0.5f *
|
||||
((p1 * 2.0f) +
|
||||
(-p0 + p2) * t +
|
||||
(2.0f * p0 - 5.0f * p1 + 4 * p2 - p3) * t2 +
|
||||
(-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t3);
|
||||
return out;
|
||||
Vector2 res = *this;
|
||||
res.x = Math::cubic_interpolate(res.x, p_b.x, p_pre_a.x, p_post_b.x, p_weight);
|
||||
res.y = Math::cubic_interpolate(res.y, p_b.y, p_pre_a.y, p_post_b.y, p_weight);
|
||||
return res;
|
||||
}
|
||||
|
||||
Vector2 Vector2::move_toward(const Vector2 &p_to, const real_t p_delta) const {
|
||||
|
|
|
@ -83,22 +83,11 @@ Vector3 Vector3::limit_length(const real_t p_len) const {
|
|||
}
|
||||
|
||||
Vector3 Vector3::cubic_interpolate(const Vector3 &p_b, const Vector3 &p_pre_a, const Vector3 &p_post_b, const real_t p_weight) const {
|
||||
Vector3 p0 = p_pre_a;
|
||||
Vector3 p1 = *this;
|
||||
Vector3 p2 = p_b;
|
||||
Vector3 p3 = p_post_b;
|
||||
|
||||
real_t t = p_weight;
|
||||
real_t t2 = t * t;
|
||||
real_t t3 = t2 * t;
|
||||
|
||||
Vector3 out;
|
||||
out = 0.5f *
|
||||
((p1 * 2.0f) +
|
||||
(-p0 + p2) * t +
|
||||
(2.0f * p0 - 5.0f * p1 + 4.0f * p2 - p3) * t2 +
|
||||
(-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t3);
|
||||
return out;
|
||||
Vector3 res = *this;
|
||||
res.x = Math::cubic_interpolate(res.x, p_b.x, p_pre_a.x, p_post_b.x, p_weight);
|
||||
res.y = Math::cubic_interpolate(res.y, p_b.y, p_pre_a.y, p_post_b.y, p_weight);
|
||||
res.z = Math::cubic_interpolate(res.z, p_b.z, p_pre_a.z, p_post_b.z, p_weight);
|
||||
return res;
|
||||
}
|
||||
|
||||
Vector3 Vector3::move_toward(const Vector3 &p_to, const real_t p_delta) const {
|
||||
|
|
|
@ -231,6 +231,10 @@ struct VariantUtilityFunctions {
|
|||
return Math::lerp(from, to, weight);
|
||||
}
|
||||
|
||||
static inline double cubic_interpolate(double from, double to, double pre, double post, double weight) {
|
||||
return Math::cubic_interpolate(from, to, pre, post, weight);
|
||||
}
|
||||
|
||||
static inline double lerp_angle(double from, double to, double weight) {
|
||||
return Math::lerp_angle(from, to, weight);
|
||||
}
|
||||
|
@ -1204,6 +1208,7 @@ void Variant::_register_variant_utility_functions() {
|
|||
FUNCBINDR(snapped, sarray("x", "step"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||
|
||||
FUNCBINDR(lerp, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||
FUNCBINDR(cubic_interpolate, sarray("from", "to", "pre", "post", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||
FUNCBINDR(lerp_angle, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||
FUNCBINDR(inverse_lerp, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||
FUNCBINDR(range_lerp, sarray("value", "istart", "istop", "ostart", "ostop"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||
|
|
|
@ -221,6 +221,17 @@
|
|||
[/codeblock]
|
||||
</description>
|
||||
</method>
|
||||
<method name="cubic_interpolate">
|
||||
<return type="float" />
|
||||
<argument index="0" name="from" type="float" />
|
||||
<argument index="1" name="to" type="float" />
|
||||
<argument index="2" name="pre" type="float" />
|
||||
<argument index="3" name="post" type="float" />
|
||||
<argument index="4" name="weight" type="float" />
|
||||
<description>
|
||||
Cubic interpolates between two values by the factor defined in [code]weight[/code] with pre and post values.
|
||||
</description>
|
||||
</method>
|
||||
<method name="db2linear">
|
||||
<return type="float" />
|
||||
<argument index="0" name="db" type="float" />
|
||||
|
|
|
@ -179,6 +179,24 @@ namespace Godot
|
|||
return (real_t)Math.Cosh(s);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cubic interpolates between two values by a normalized value with pre and post values.
|
||||
/// </summary>
|
||||
/// <param name="from">The start value for interpolation.</param>
|
||||
/// <param name="to">The destination value for interpolation.</param>
|
||||
/// <param name="pre">The value which before "from" value for interpolation.</param>
|
||||
/// <param name="post">The value which after "to" value for interpolation.</param>
|
||||
/// <param name="weight">A value on the range of 0.0 to 1.0, representing the amount of interpolation.</param>
|
||||
/// <returns>The resulting value of the interpolation.</returns>
|
||||
public static real_t CubicInterpolate(real_t from, real_t to, real_t pre, real_t post, real_t weight)
|
||||
{
|
||||
return 0.5f *
|
||||
((from * 2.0f) +
|
||||
(-pre + to) * weight +
|
||||
(2.0f * pre - 5.0f * from + 4.0f * to - post) * (weight * weight) +
|
||||
(-pre + 3.0f * from - 3.0f * to + post) * (weight * weight * weight));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts an angle expressed in degrees to radians.
|
||||
/// </summary>
|
||||
|
|
|
@ -204,20 +204,10 @@ namespace Godot
|
|||
/// <returns>The interpolated vector.</returns>
|
||||
public Vector2 CubicInterpolate(Vector2 b, Vector2 preA, Vector2 postB, real_t weight)
|
||||
{
|
||||
Vector2 p0 = preA;
|
||||
Vector2 p1 = this;
|
||||
Vector2 p2 = b;
|
||||
Vector2 p3 = postB;
|
||||
|
||||
real_t t = weight;
|
||||
real_t t2 = t * t;
|
||||
real_t t3 = t2 * t;
|
||||
|
||||
return 0.5f * (
|
||||
(p1 * 2.0f) +
|
||||
((-p0 + p2) * t) +
|
||||
(((2.0f * p0) - (5.0f * p1) + (4 * p2) - p3) * t2) +
|
||||
((-p0 + (3.0f * p1) - (3.0f * p2) + p3) * t3)
|
||||
return new Vector2
|
||||
(
|
||||
Mathf.CubicInterpolate(x, b.x, preA.x, postB.x, weight),
|
||||
Mathf.CubicInterpolate(y, b.y, preA.y, postB.y, weight)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -195,19 +195,11 @@ namespace Godot
|
|||
/// <returns>The interpolated vector.</returns>
|
||||
public Vector3 CubicInterpolate(Vector3 b, Vector3 preA, Vector3 postB, real_t weight)
|
||||
{
|
||||
Vector3 p0 = preA;
|
||||
Vector3 p1 = this;
|
||||
Vector3 p2 = b;
|
||||
Vector3 p3 = postB;
|
||||
|
||||
real_t t = weight;
|
||||
real_t t2 = t * t;
|
||||
real_t t3 = t2 * t;
|
||||
|
||||
return 0.5f * (
|
||||
(p1 * 2.0f) + ((-p0 + p2) * t) +
|
||||
(((2.0f * p0) - (5.0f * p1) + (4f * p2) - p3) * t2) +
|
||||
((-p0 + (3.0f * p1) - (3.0f * p2) + p3) * t3)
|
||||
return new Vector3
|
||||
(
|
||||
Mathf.CubicInterpolate(x, b.x, preA.x, postB.x, weight),
|
||||
Mathf.CubicInterpolate(y, b.y, preA.y, postB.y, weight),
|
||||
Mathf.CubicInterpolate(z, b.z, preA.z, postB.z, weight)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -96,123 +96,125 @@
|
|||
<constant name="MATH_LERP" value="26" enum="BuiltinFunc">
|
||||
Returns a number linearly interpolated between the first two inputs, based on the third input. Uses the formula [code]a + (a - b) * t[/code].
|
||||
</constant>
|
||||
<constant name="MATH_INVERSE_LERP" value="27" enum="BuiltinFunc">
|
||||
<constant name="MATH_CUBIC_INTERPOLATE" value="27" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="MATH_RANGE_LERP" value="28" enum="BuiltinFunc">
|
||||
<constant name="MATH_INVERSE_LERP" value="28" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="MATH_MOVE_TOWARD" value="29" enum="BuiltinFunc">
|
||||
<constant name="MATH_RANGE_LERP" value="29" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="MATH_MOVE_TOWARD" value="30" enum="BuiltinFunc">
|
||||
Moves the number toward a value, based on the third input.
|
||||
</constant>
|
||||
<constant name="MATH_RANDOMIZE" value="30" enum="BuiltinFunc">
|
||||
<constant name="MATH_RANDOMIZE" value="31" enum="BuiltinFunc">
|
||||
Randomize the seed (or the internal state) of the random number generator. Current implementation reseeds using a number based on time.
|
||||
</constant>
|
||||
<constant name="MATH_RANDI" value="31" enum="BuiltinFunc">
|
||||
<constant name="MATH_RANDI" value="32" enum="BuiltinFunc">
|
||||
Returns a random 32 bits integer value. To obtain a random value between 0 to N (where N is smaller than 2^32 - 1), you can use it with the remainder function.
|
||||
</constant>
|
||||
<constant name="MATH_RANDF" value="32" enum="BuiltinFunc">
|
||||
<constant name="MATH_RANDF" value="33" enum="BuiltinFunc">
|
||||
Returns a random floating-point value between 0 and 1. To obtain a random value between 0 to N, you can use it with multiplication.
|
||||
</constant>
|
||||
<constant name="MATH_RANDI_RANGE" value="33" enum="BuiltinFunc">
|
||||
<constant name="MATH_RANDI_RANGE" value="34" enum="BuiltinFunc">
|
||||
Returns a random 32-bit integer value between the two inputs.
|
||||
</constant>
|
||||
<constant name="MATH_RANDF_RANGE" value="34" enum="BuiltinFunc">
|
||||
<constant name="MATH_RANDF_RANGE" value="35" enum="BuiltinFunc">
|
||||
Returns a random floating-point value between the two inputs.
|
||||
</constant>
|
||||
<constant name="MATH_RANDFN" value="35" enum="BuiltinFunc">
|
||||
<constant name="MATH_RANDFN" value="36" enum="BuiltinFunc">
|
||||
Returns a normally-distributed pseudo-random number, using Box-Muller transform with the specified mean and a standard deviation. This is also called Gaussian distribution.
|
||||
</constant>
|
||||
<constant name="MATH_SEED" value="36" enum="BuiltinFunc">
|
||||
<constant name="MATH_SEED" value="37" enum="BuiltinFunc">
|
||||
Set the seed for the random number generator.
|
||||
</constant>
|
||||
<constant name="MATH_RANDSEED" value="37" enum="BuiltinFunc">
|
||||
<constant name="MATH_RANDSEED" value="38" enum="BuiltinFunc">
|
||||
Returns a random value from the given seed, along with the new seed.
|
||||
</constant>
|
||||
<constant name="MATH_DEG2RAD" value="38" enum="BuiltinFunc">
|
||||
<constant name="MATH_DEG2RAD" value="39" enum="BuiltinFunc">
|
||||
Convert the input from degrees to radians.
|
||||
</constant>
|
||||
<constant name="MATH_RAD2DEG" value="39" enum="BuiltinFunc">
|
||||
<constant name="MATH_RAD2DEG" value="40" enum="BuiltinFunc">
|
||||
Convert the input from radians to degrees.
|
||||
</constant>
|
||||
<constant name="MATH_LINEAR2DB" value="40" enum="BuiltinFunc">
|
||||
<constant name="MATH_LINEAR2DB" value="41" enum="BuiltinFunc">
|
||||
Convert the input from linear volume to decibel volume.
|
||||
</constant>
|
||||
<constant name="MATH_DB2LINEAR" value="41" enum="BuiltinFunc">
|
||||
<constant name="MATH_DB2LINEAR" value="42" enum="BuiltinFunc">
|
||||
Convert the input from decibel volume to linear volume.
|
||||
</constant>
|
||||
<constant name="MATH_WRAP" value="42" enum="BuiltinFunc">
|
||||
<constant name="MATH_WRAP" value="43" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="MATH_WRAPF" value="43" enum="BuiltinFunc">
|
||||
<constant name="MATH_WRAPF" value="44" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="MATH_PINGPONG" value="44" enum="BuiltinFunc">
|
||||
<constant name="MATH_PINGPONG" value="45" enum="BuiltinFunc">
|
||||
Returns the [code]value[/code] wrapped between [code]0[/code] and the [code]length[/code]. If the limit is reached, the next value the function returned is decreased to the [code]0[/code] side or increased to the [code]length[/code] side (like a triangle wave). If [code]length[/code] is less than zero, it becomes positive.
|
||||
</constant>
|
||||
<constant name="LOGIC_MAX" value="45" enum="BuiltinFunc">
|
||||
<constant name="LOGIC_MAX" value="46" enum="BuiltinFunc">
|
||||
Returns the greater of the two numbers, also known as their maximum.
|
||||
</constant>
|
||||
<constant name="LOGIC_MIN" value="46" enum="BuiltinFunc">
|
||||
<constant name="LOGIC_MIN" value="47" enum="BuiltinFunc">
|
||||
Returns the lesser of the two numbers, also known as their minimum.
|
||||
</constant>
|
||||
<constant name="LOGIC_CLAMP" value="47" enum="BuiltinFunc">
|
||||
<constant name="LOGIC_CLAMP" value="48" enum="BuiltinFunc">
|
||||
Returns the input clamped inside the given range, ensuring the result is never outside it. Equivalent to [code]min(max(input, range_low), range_high)[/code].
|
||||
</constant>
|
||||
<constant name="LOGIC_NEAREST_PO2" value="48" enum="BuiltinFunc">
|
||||
<constant name="LOGIC_NEAREST_PO2" value="49" enum="BuiltinFunc">
|
||||
Returns the nearest power of 2 to the input.
|
||||
</constant>
|
||||
<constant name="OBJ_WEAKREF" value="49" enum="BuiltinFunc">
|
||||
<constant name="OBJ_WEAKREF" value="50" enum="BuiltinFunc">
|
||||
Create a [WeakRef] from the input.
|
||||
</constant>
|
||||
<constant name="TYPE_CONVERT" value="50" enum="BuiltinFunc">
|
||||
<constant name="TYPE_CONVERT" value="51" enum="BuiltinFunc">
|
||||
Convert between types.
|
||||
</constant>
|
||||
<constant name="TYPE_OF" value="51" enum="BuiltinFunc">
|
||||
<constant name="TYPE_OF" value="52" enum="BuiltinFunc">
|
||||
Returns the type of the input as an integer. Check [enum Variant.Type] for the integers that might be returned.
|
||||
</constant>
|
||||
<constant name="TYPE_EXISTS" value="52" enum="BuiltinFunc">
|
||||
<constant name="TYPE_EXISTS" value="53" enum="BuiltinFunc">
|
||||
Checks if a type is registered in the [ClassDB].
|
||||
</constant>
|
||||
<constant name="TEXT_CHAR" value="53" enum="BuiltinFunc">
|
||||
<constant name="TEXT_CHAR" value="54" enum="BuiltinFunc">
|
||||
Returns a character with the given ascii value.
|
||||
</constant>
|
||||
<constant name="TEXT_STR" value="54" enum="BuiltinFunc">
|
||||
<constant name="TEXT_STR" value="55" enum="BuiltinFunc">
|
||||
Convert the input to a string.
|
||||
</constant>
|
||||
<constant name="TEXT_PRINT" value="55" enum="BuiltinFunc">
|
||||
<constant name="TEXT_PRINT" value="56" enum="BuiltinFunc">
|
||||
Print the given string to the output window.
|
||||
</constant>
|
||||
<constant name="TEXT_PRINTERR" value="56" enum="BuiltinFunc">
|
||||
<constant name="TEXT_PRINTERR" value="57" enum="BuiltinFunc">
|
||||
Print the given string to the standard error output.
|
||||
</constant>
|
||||
<constant name="TEXT_PRINTRAW" value="57" enum="BuiltinFunc">
|
||||
<constant name="TEXT_PRINTRAW" value="58" enum="BuiltinFunc">
|
||||
Print the given string to the standard output, without adding a newline.
|
||||
</constant>
|
||||
<constant name="TEXT_PRINT_VERBOSE" value="58" enum="BuiltinFunc">
|
||||
<constant name="TEXT_PRINT_VERBOSE" value="59" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="VAR_TO_STR" value="59" enum="BuiltinFunc">
|
||||
<constant name="VAR_TO_STR" value="60" enum="BuiltinFunc">
|
||||
Serialize a [Variant] to a string.
|
||||
</constant>
|
||||
<constant name="STR_TO_VAR" value="60" enum="BuiltinFunc">
|
||||
<constant name="STR_TO_VAR" value="61" enum="BuiltinFunc">
|
||||
Deserialize a [Variant] from a string serialized using [constant VAR_TO_STR].
|
||||
</constant>
|
||||
<constant name="VAR_TO_BYTES" value="61" enum="BuiltinFunc">
|
||||
<constant name="VAR_TO_BYTES" value="62" enum="BuiltinFunc">
|
||||
Serialize a [Variant] to a [PackedByteArray].
|
||||
</constant>
|
||||
<constant name="BYTES_TO_VAR" value="62" enum="BuiltinFunc">
|
||||
<constant name="BYTES_TO_VAR" value="63" enum="BuiltinFunc">
|
||||
Deserialize a [Variant] from a [PackedByteArray] serialized using [constant VAR_TO_BYTES].
|
||||
</constant>
|
||||
<constant name="MATH_SMOOTHSTEP" value="63" enum="BuiltinFunc">
|
||||
<constant name="MATH_SMOOTHSTEP" value="64" enum="BuiltinFunc">
|
||||
Returns a number smoothly interpolated between the first two inputs, based on the third input. Similar to [constant MATH_LERP], but interpolates faster at the beginning and slower at the end. Using Hermite interpolation formula:
|
||||
[codeblock]
|
||||
var t = clamp((weight - from) / (to - from), 0.0, 1.0)
|
||||
return t * t * (3.0 - 2.0 * t)
|
||||
[/codeblock]
|
||||
</constant>
|
||||
<constant name="MATH_POSMOD" value="64" enum="BuiltinFunc">
|
||||
<constant name="MATH_POSMOD" value="65" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="MATH_LERP_ANGLE" value="65" enum="BuiltinFunc">
|
||||
<constant name="MATH_LERP_ANGLE" value="66" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="TEXT_ORD" value="66" enum="BuiltinFunc">
|
||||
<constant name="TEXT_ORD" value="67" enum="BuiltinFunc">
|
||||
</constant>
|
||||
<constant name="FUNC_MAX" value="67" enum="BuiltinFunc">
|
||||
<constant name="FUNC_MAX" value="68" enum="BuiltinFunc">
|
||||
Represents the size of the [enum BuiltinFunc] enum.
|
||||
</constant>
|
||||
</constants>
|
||||
|
|
|
@ -65,6 +65,7 @@ const char *VisualScriptBuiltinFunc::func_name[VisualScriptBuiltinFunc::FUNC_MAX
|
|||
"step_decimals",
|
||||
"snapped",
|
||||
"lerp",
|
||||
"cubic_interpolate",
|
||||
"inverse_lerp",
|
||||
"range_lerp",
|
||||
"move_toward",
|
||||
|
@ -212,6 +213,7 @@ int VisualScriptBuiltinFunc::get_func_argument_count(BuiltinFunc p_func) {
|
|||
case MATH_WRAPF:
|
||||
case LOGIC_CLAMP:
|
||||
return 3;
|
||||
case MATH_CUBIC_INTERPOLATE:
|
||||
case MATH_RANGE_LERP:
|
||||
return 5;
|
||||
case FUNC_MAX: {
|
||||
|
@ -329,6 +331,19 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
|
|||
return PropertyInfo(Variant::FLOAT, "weight");
|
||||
}
|
||||
} break;
|
||||
case MATH_CUBIC_INTERPOLATE: {
|
||||
if (p_idx == 0) {
|
||||
return PropertyInfo(Variant::FLOAT, "from");
|
||||
} else if (p_idx == 1) {
|
||||
return PropertyInfo(Variant::FLOAT, "to");
|
||||
} else if (p_idx == 2) {
|
||||
return PropertyInfo(Variant::FLOAT, "pre");
|
||||
} else if (p_idx == 3) {
|
||||
return PropertyInfo(Variant::FLOAT, "post");
|
||||
} else {
|
||||
return PropertyInfo(Variant::FLOAT, "weight");
|
||||
}
|
||||
} break;
|
||||
case MATH_RANGE_LERP: {
|
||||
if (p_idx == 0) {
|
||||
return PropertyInfo(Variant::FLOAT, "value");
|
||||
|
@ -525,6 +540,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_output_value_port_info(int p_idx) cons
|
|||
} break;
|
||||
case MATH_SNAPPED:
|
||||
case MATH_LERP:
|
||||
case MATH_CUBIC_INTERPOLATE:
|
||||
case MATH_LERP_ANGLE:
|
||||
case MATH_INVERSE_LERP:
|
||||
case MATH_RANGE_LERP:
|
||||
|
@ -795,6 +811,14 @@ void VisualScriptBuiltinFunc::exec_func(BuiltinFunc p_func, const Variant **p_in
|
|||
VALIDATE_ARG_NUM(2);
|
||||
*r_return = Math::lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]);
|
||||
} break;
|
||||
case VisualScriptBuiltinFunc::MATH_CUBIC_INTERPOLATE: {
|
||||
VALIDATE_ARG_NUM(0);
|
||||
VALIDATE_ARG_NUM(1);
|
||||
VALIDATE_ARG_NUM(2);
|
||||
VALIDATE_ARG_NUM(3);
|
||||
VALIDATE_ARG_NUM(4);
|
||||
*r_return = Math::cubic_interpolate((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2], (double)*p_inputs[3], (double)*p_inputs[4]);
|
||||
} break;
|
||||
case VisualScriptBuiltinFunc::MATH_LERP_ANGLE: {
|
||||
VALIDATE_ARG_NUM(0);
|
||||
VALIDATE_ARG_NUM(1);
|
||||
|
@ -1220,6 +1244,7 @@ void VisualScriptBuiltinFunc::_bind_methods() {
|
|||
BIND_ENUM_CONSTANT(MATH_STEP_DECIMALS);
|
||||
BIND_ENUM_CONSTANT(MATH_SNAPPED);
|
||||
BIND_ENUM_CONSTANT(MATH_LERP);
|
||||
BIND_ENUM_CONSTANT(MATH_CUBIC_INTERPOLATE);
|
||||
BIND_ENUM_CONSTANT(MATH_INVERSE_LERP);
|
||||
BIND_ENUM_CONSTANT(MATH_RANGE_LERP);
|
||||
BIND_ENUM_CONSTANT(MATH_MOVE_TOWARD);
|
||||
|
@ -1309,6 +1334,7 @@ void register_visual_script_builtin_func_node() {
|
|||
VisualScriptLanguage::singleton->add_register_func("functions/built_in/step_decimals", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_STEP_DECIMALS>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/built_in/snapped", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SNAPPED>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/built_in/lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_LERP>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/built_in/cubic_interpolate", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_CUBIC_INTERPOLATE>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/built_in/lerp_angle", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_LERP_ANGLE>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/built_in/inverse_lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_INVERSE_LERP>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/built_in/range_lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RANGE_LERP>);
|
||||
|
|
|
@ -65,6 +65,7 @@ public:
|
|||
MATH_STEP_DECIMALS,
|
||||
MATH_SNAPPED,
|
||||
MATH_LERP,
|
||||
MATH_CUBIC_INTERPOLATE,
|
||||
MATH_INVERSE_LERP,
|
||||
MATH_RANGE_LERP,
|
||||
MATH_MOVE_TOWARD,
|
||||
|
|
|
@ -2320,22 +2320,12 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a
|
|||
|
||||
if (vformat == ((1 << Variant::INT) | (1 << Variant::FLOAT)) || vformat == (1 << Variant::FLOAT)) {
|
||||
//mix of real and int
|
||||
real_t a = p_a;
|
||||
real_t b = p_b;
|
||||
real_t pa = p_pre_a;
|
||||
real_t pb = p_post_b;
|
||||
|
||||
real_t p0 = p_pre_a;
|
||||
real_t p1 = p_a;
|
||||
real_t p2 = p_b;
|
||||
real_t p3 = p_post_b;
|
||||
|
||||
real_t t = p_c;
|
||||
real_t t2 = t * t;
|
||||
real_t t3 = t2 * t;
|
||||
|
||||
return 0.5f *
|
||||
((p1 * 2.0f) +
|
||||
(-p0 + p2) * t +
|
||||
(2.0f * p0 - 5.0f * p1 + 4 * p2 - p3) * t2 +
|
||||
(-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t3);
|
||||
|
||||
return Math::cubic_interpolate(a, b, pa, pb, p_c);
|
||||
} else if ((vformat & (vformat - 1))) {
|
||||
return p_a; //can't interpolate, mix of types
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue