Merge pull request #48442 from akien-mga/posmod-int64_t

Re-bind posmod, use int64_t instead of int
This commit is contained in:
Rémi Verschelde 2021-05-04 15:15:52 +02:00 committed by GitHub
commit c9e874b62d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 3 deletions

View File

@ -218,8 +218,8 @@ public:
return value; return value;
} }
static _ALWAYS_INLINE_ int posmod(int p_x, int p_y) { static _ALWAYS_INLINE_ int64_t posmod(int64_t p_x, int64_t p_y) {
int value = p_x % p_y; int64_t value = p_x % p_y;
if ((value < 0 && p_y > 0) || (value > 0 && p_y < 0)) { if ((value < 0 && p_y > 0) || (value > 0 && p_y < 0)) {
value += p_y; value += p_y;
} }

View File

@ -93,6 +93,10 @@ struct VariantUtilityFunctions {
return Math::fposmod(b, r); return Math::fposmod(b, r);
} }
static inline int64_t posmod(int64_t b, int64_t r) {
return Math::posmod(b, r);
}
static inline double floor(double x) { static inline double floor(double x) {
return Math::floor(x); return Math::floor(x);
} }
@ -1154,6 +1158,7 @@ void Variant::_register_variant_utility_functions() {
FUNCBINDR(sqrt, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(sqrt, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(fmod, sarray("x", "y"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(fmod, sarray("x", "y"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(fposmod, sarray("x", "y"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(fposmod, sarray("x", "y"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(posmod, sarray("x", "y"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(floor, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(floor, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(ceil, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(ceil, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(round, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(round, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);

View File

@ -652,6 +652,31 @@
Converts a 2D point expressed in the polar coordinate system (a distance from the origin [code]r[/code] and an angle [code]th[/code]) to the cartesian coordinate system (X and Y axis). Converts a 2D point expressed in the polar coordinate system (a distance from the origin [code]r[/code] and an angle [code]th[/code]) to the cartesian coordinate system (X and Y axis).
</description> </description>
</method> </method>
<method name="posmod">
<return type="int">
</return>
<argument index="0" name="x" type="int">
</argument>
<argument index="1" name="y" type="int">
</argument>
<description>
Returns the integer modulus of [code]x/y[/code] that wraps equally in positive and negative.
[codeblock]
for i in range(-3, 4):
print("%2d %2d %2d" % [i, i % 3, posmod(i, 3)])
[/codeblock]
Produces:
[codeblock]
-3 0 0
-2 -2 1
-1 -1 2
0 0 0
1 1 1
2 2 2
3 0 0
[/codeblock]
</description>
</method>
<method name="pow"> <method name="pow">
<return type="float"> <return type="float">
</return> </return>

View File

@ -723,7 +723,7 @@ void VisualScriptBuiltinFunc::exec_func(BuiltinFunc p_func, const Variant **p_in
case VisualScriptBuiltinFunc::MATH_POSMOD: { case VisualScriptBuiltinFunc::MATH_POSMOD: {
VALIDATE_ARG_NUM(0); VALIDATE_ARG_NUM(0);
VALIDATE_ARG_NUM(1); VALIDATE_ARG_NUM(1);
*r_return = Math::posmod((int)*p_inputs[0], (int)*p_inputs[1]); *r_return = Math::posmod((int64_t)*p_inputs[0], (int64_t)*p_inputs[1]);
} break; } break;
case VisualScriptBuiltinFunc::MATH_FLOOR: { case VisualScriptBuiltinFunc::MATH_FLOOR: {
VALIDATE_ARG_NUM(0); VALIDATE_ARG_NUM(0);