Browse Source

Merge pull request #23310 from aaronfranke/posmod-int

Add integer posmod and rename default arg names
Rémi Verschelde 6 years ago
parent
commit
f796779f7c

+ 8 - 0
core/math/expression.cpp

@@ -52,6 +52,7 @@ const char *Expression::func_name[Expression::FUNC_MAX] = {
 	"sqrt",
 	"fmod",
 	"fposmod",
+	"posmod",
 	"floor",
 	"ceil",
 	"round",
@@ -175,6 +176,7 @@ int Expression::get_func_argument_count(BuiltinFunc p_func) {
 		case MATH_ATAN2:
 		case MATH_FMOD:
 		case MATH_FPOSMOD:
+		case MATH_POSMOD:
 		case MATH_POW:
 		case MATH_EASE:
 		case MATH_STEPIFY:
@@ -283,6 +285,12 @@ void Expression::exec_func(BuiltinFunc p_func, const Variant **p_inputs, Variant
 			VALIDATE_ARG_NUM(1);
 			*r_return = Math::fposmod((double)*p_inputs[0], (double)*p_inputs[1]);
 		} break;
+		case MATH_POSMOD: {
+
+			VALIDATE_ARG_NUM(0);
+			VALIDATE_ARG_NUM(1);
+			*r_return = Math::posmod((int)*p_inputs[0], (int)*p_inputs[1]);
+		} break;
 		case MATH_FLOOR: {
 
 			VALIDATE_ARG_NUM(0);

+ 1 - 0
core/math/expression.h

@@ -51,6 +51,7 @@ public:
 		MATH_SQRT,
 		MATH_FMOD,
 		MATH_FPOSMOD,
+		MATH_POSMOD,
 		MATH_FLOOR,
 		MATH_CEIL,
 		MATH_ROUND,

+ 7 - 0
core/math/math_funcs.h

@@ -198,6 +198,13 @@ public:
 		value += 0.0;
 		return value;
 	}
+	static _ALWAYS_INLINE_ int posmod(int p_x, int p_y) {
+		int value = p_x % p_y;
+		if ((value < 0 && p_y > 0) || (value > 0 && p_y < 0)) {
+			value += p_y;
+		}
+		return value;
+	}
 
 	static _ALWAYS_INLINE_ double deg2rad(double p_y) { return p_y * Math_PI / 180.0; }
 	static _ALWAYS_INLINE_ float deg2rad(float p_y) { return p_y * Math_PI / 180.0; }

+ 52 - 19
modules/gdscript/doc_classes/@GDScript.xml

@@ -345,45 +345,78 @@
 		<method name="fmod">
 			<return type="float">
 			</return>
-			<argument index="0" name="x" type="float">
+			<argument index="0" name="a" type="float">
 			</argument>
-			<argument index="1" name="y" type="float">
+			<argument index="1" name="b" type="float">
 			</argument>
 			<description>
-				Returns the floating-point remainder of [code]x/y[/code].
+				Returns the floating-point remainder of [code]a/b[/code], keeping the sign of [code]a[/code].
 				[codeblock]
 				# Remainder is 1.5
 				var remainder = fmod(7, 5.5)
 				[/codeblock]
+				For the integer remainder operation, use the % operator.
 			</description>
 		</method>
 		<method name="fposmod">
 			<return type="float">
 			</return>
-			<argument index="0" name="x" type="float">
+			<argument index="0" name="a" type="float">
 			</argument>
-			<argument index="1" name="y" type="float">
+			<argument index="1" name="b" type="float">
+			</argument>
+			<description>
+				Returns the floating-point modulus of [code]a/b[/code] that wraps equally in positive and negative.
+				[codeblock]
+				var i = -6
+				while i &lt; 5:
+				    prints(i, fposmod(i, 3))
+				    i += 1
+				[/codeblock]
+				Produces:
+				[codeblock]
+				-6 0
+				-5 1
+				-4 2
+				-3 0
+				-2 1
+				-1 2
+				0 0
+				1 1
+				2 2
+				3 0
+				4 1
+				[/codeblock]
+			</description>
+		</method>
+		<method name="posmod">
+			<return type="int">
+			</return>
+			<argument index="0" name="a" type="int">
+			</argument>
+			<argument index="1" name="b" type="int">
 			</argument>
 			<description>
-				Returns the floating-point remainder of [code]x/y[/code] that wraps equally in positive and negative.
+				Returns the integer modulus of [code]a/b[/code] that wraps equally in positive and negative.
 				[codeblock]
-				var i = -10
-				while i &lt; 0:
-				    prints(i, fposmod(i, 10))
+				var i = -6
+				while i &lt; 5:
+				    prints(i, posmod(i, 3))
 				    i += 1
 				[/codeblock]
 				Produces:
 				[codeblock]
-				-10 10
-				-9 1
-				-8 2
-				-7 3
-				-6 4
-				-5 5
-				-4 6
-				-3 7
-				-2 8
-				-1 9
+				-6 0
+				-5 1
+				-4 2
+				-3 0
+				-2 1
+				-1 2
+				0 0
+				1 1
+				2 2
+				3 0
+				4 1
 				[/codeblock]
 			</description>
 		</method>

+ 16 - 3
modules/gdscript/gdscript_functions.cpp

@@ -58,6 +58,7 @@ const char *GDScriptFunctions::get_func_name(Function p_func) {
 		"sqrt",
 		"fmod",
 		"fposmod",
+		"posmod",
 		"floor",
 		"ceil",
 		"round",
@@ -243,6 +244,12 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
 			VALIDATE_ARG_NUM(1);
 			r_ret = Math::fposmod((double)*p_args[0], (double)*p_args[1]);
 		} break;
+		case MATH_POSMOD: {
+			VALIDATE_ARG_COUNT(2);
+			VALIDATE_ARG_NUM(0);
+			VALIDATE_ARG_NUM(1);
+			r_ret = Math::posmod((int)*p_args[0], (int)*p_args[1]);
+		} break;
 		case MATH_FLOOR: {
 			VALIDATE_ARG_COUNT(1);
 			VALIDATE_ARG_NUM(0);
@@ -1456,6 +1463,7 @@ bool GDScriptFunctions::is_deterministic(Function p_func) {
 		case MATH_SQRT:
 		case MATH_FMOD:
 		case MATH_FPOSMOD:
+		case MATH_POSMOD:
 		case MATH_FLOOR:
 		case MATH_CEIL:
 		case MATH_ROUND:
@@ -1568,15 +1576,20 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) {
 			return mi;
 		} break;
 		case MATH_FMOD: {
-			MethodInfo mi("fmod", PropertyInfo(Variant::REAL, "x"), PropertyInfo(Variant::REAL, "y"));
+			MethodInfo mi("fmod", PropertyInfo(Variant::REAL, "a"), PropertyInfo(Variant::REAL, "b"));
 			mi.return_val.type = Variant::REAL;
 			return mi;
 		} break;
 		case MATH_FPOSMOD: {
-			MethodInfo mi("fposmod", PropertyInfo(Variant::REAL, "x"), PropertyInfo(Variant::REAL, "y"));
+			MethodInfo mi("fposmod", PropertyInfo(Variant::REAL, "a"), PropertyInfo(Variant::REAL, "b"));
 			mi.return_val.type = Variant::REAL;
 			return mi;
 		} break;
+		case MATH_POSMOD: {
+			MethodInfo mi("posmod", PropertyInfo(Variant::INT, "a"), PropertyInfo(Variant::INT, "b"));
+			mi.return_val.type = Variant::INT;
+			return mi;
+		} break;
 		case MATH_FLOOR: {
 			MethodInfo mi("floor", PropertyInfo(Variant::REAL, "s"));
 			mi.return_val.type = Variant::REAL;
@@ -1603,7 +1616,7 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) {
 			return mi;
 		} break;
 		case MATH_POW: {
-			MethodInfo mi("pow", PropertyInfo(Variant::REAL, "x"), PropertyInfo(Variant::REAL, "y"));
+			MethodInfo mi("pow", PropertyInfo(Variant::REAL, "base"), PropertyInfo(Variant::REAL, "exp"));
 			mi.return_val.type = Variant::REAL;
 			return mi;
 		} break;

+ 1 - 0
modules/gdscript/gdscript_functions.h

@@ -49,6 +49,7 @@ public:
 		MATH_SQRT,
 		MATH_FMOD,
 		MATH_FPOSMOD,
+		MATH_POSMOD,
 		MATH_FLOOR,
 		MATH_CEIL,
 		MATH_ROUND,

+ 42 - 89
modules/visual_script/visual_script_builtin_funcs.cpp

@@ -104,6 +104,7 @@ const char *VisualScriptBuiltinFunc::func_name[VisualScriptBuiltinFunc::FUNC_MAX
 	"bytes2var",
 	"color_named",
 	"smoothstep",
+	"posmod",
 };
 
 VisualScriptBuiltinFunc::BuiltinFunc VisualScriptBuiltinFunc::find_function(const String &p_string) {
@@ -192,6 +193,7 @@ int VisualScriptBuiltinFunc::get_func_argument_count(BuiltinFunc p_func) {
 		case MATH_ATAN2:
 		case MATH_FMOD:
 		case MATH_FPOSMOD:
+		case MATH_POSMOD:
 		case MATH_POW:
 		case MATH_EASE:
 		case MATH_STEPIFY:
@@ -261,7 +263,16 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 		case MATH_ASIN:
 		case MATH_ACOS:
 		case MATH_ATAN:
-		case MATH_SQRT: {
+		case MATH_SQRT:
+		case MATH_FLOOR:
+		case MATH_CEIL:
+		case MATH_ROUND:
+		case MATH_ABS:
+		case MATH_SIGN:
+		case MATH_LOG:
+		case MATH_EXP:
+		case MATH_ISNAN:
+		case MATH_ISINF: {
 			return PropertyInfo(Variant::REAL, "s");
 		} break;
 		case MATH_ATAN2: {
@@ -271,32 +282,25 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 				return PropertyInfo(Variant::REAL, "x");
 		} break;
 		case MATH_FMOD:
-		case MATH_FPOSMOD: {
+		case MATH_FPOSMOD:
+		case LOGIC_MAX:
+		case LOGIC_MIN: {
 			if (p_idx == 0)
-				return PropertyInfo(Variant::REAL, "x");
+				return PropertyInfo(Variant::REAL, "a");
 			else
-				return PropertyInfo(Variant::REAL, "y");
+				return PropertyInfo(Variant::REAL, "b");
 		} break;
-		case MATH_FLOOR:
-		case MATH_CEIL:
-		case MATH_ROUND:
-		case MATH_ABS:
-		case MATH_SIGN: {
-			return PropertyInfo(Variant::REAL, "s");
-
+		case MATH_POSMOD: {
+			if (p_idx == 0)
+				return PropertyInfo(Variant::INT, "a");
+			else
+				return PropertyInfo(Variant::INT, "b");
 		} break;
-
 		case MATH_POW: {
 			if (p_idx == 0)
-				return PropertyInfo(Variant::REAL, "x");
+				return PropertyInfo(Variant::REAL, "base");
 			else
-				return PropertyInfo(Variant::REAL, "y");
-		} break;
-		case MATH_LOG:
-		case MATH_EXP:
-		case MATH_ISNAN:
-		case MATH_ISINF: {
-			return PropertyInfo(Variant::REAL, "s");
+				return PropertyInfo(Variant::REAL, "exp");
 		} break;
 		case MATH_EASE: {
 			if (p_idx == 0)
@@ -313,14 +317,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 			else
 				return PropertyInfo(Variant::REAL, "steps");
 		} break;
-		case MATH_LERP: {
-			if (p_idx == 0)
-				return PropertyInfo(Variant::REAL, "from");
-			else if (p_idx == 1)
-				return PropertyInfo(Variant::REAL, "to");
-			else
-				return PropertyInfo(Variant::REAL, "weight");
-		} break;
+		case MATH_LERP:
 		case MATH_INVERSE_LERP: {
 			if (p_idx == 0)
 				return PropertyInfo(Variant::REAL, "from");
@@ -365,12 +362,8 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 			else
 				return PropertyInfo(Variant::REAL, "step");
 		} break;
-		case MATH_RANDOMIZE: {
-
-		} break;
-		case MATH_RAND: {
-
-		} break;
+		case MATH_RANDOMIZE:
+		case MATH_RAND:
 		case MATH_RANDF: {
 
 		} break;
@@ -380,9 +373,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 			else
 				return PropertyInfo(Variant::REAL, "to");
 		} break;
-		case MATH_SEED: {
-			return PropertyInfo(Variant::INT, "seed");
-		} break;
+		case MATH_SEED:
 		case MATH_RANDSEED: {
 			return PropertyInfo(Variant::INT, "seed");
 		} break;
@@ -418,26 +409,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 			else
 				return PropertyInfo(Variant::INT, "max");
 		} break;
-		case MATH_WRAPF: {
-			if (p_idx == 0)
-				return PropertyInfo(Variant::REAL, "value");
-			else if (p_idx == 1)
-				return PropertyInfo(Variant::REAL, "min");
-			else
-				return PropertyInfo(Variant::REAL, "max");
-		} break;
-		case LOGIC_MAX: {
-			if (p_idx == 0)
-				return PropertyInfo(Variant::REAL, "a");
-			else
-				return PropertyInfo(Variant::REAL, "b");
-		} break;
-		case LOGIC_MIN: {
-			if (p_idx == 0)
-				return PropertyInfo(Variant::REAL, "a");
-			else
-				return PropertyInfo(Variant::REAL, "b");
-		} break;
+		case MATH_WRAPF:
 		case LOGIC_CLAMP: {
 			if (p_idx == 0)
 				return PropertyInfo(Variant::REAL, "value");
@@ -450,20 +422,15 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 			return PropertyInfo(Variant::INT, "value");
 		} break;
 		case OBJ_WEAKREF: {
-
 			return PropertyInfo(Variant::OBJECT, "source");
-
 		} break;
 		case FUNC_FUNCREF: {
-
 			if (p_idx == 0)
 				return PropertyInfo(Variant::OBJECT, "instance");
 			else
 				return PropertyInfo(Variant::STRING, "funcname");
-
 		} break;
 		case TYPE_CONVERT: {
-
 			if (p_idx == 0)
 				return PropertyInfo(Variant::NIL, "what");
 			else
@@ -471,45 +438,24 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 		} break;
 		case TYPE_OF: {
 			return PropertyInfo(Variant::NIL, "what");
-
 		} break;
 		case TYPE_EXISTS: {
-
 			return PropertyInfo(Variant::STRING, "type");
-
 		} break;
 		case TEXT_CHAR: {
-
 			return PropertyInfo(Variant::INT, "ascii");
-
-		} break;
-		case TEXT_STR: {
-
-			return PropertyInfo(Variant::NIL, "value");
-
-		} break;
-		case TEXT_PRINT: {
-
-			return PropertyInfo(Variant::NIL, "value");
-
-		} break;
-		case TEXT_PRINTERR: {
-			return PropertyInfo(Variant::NIL, "value");
-
 		} break;
+		case TEXT_STR:
+		case TEXT_PRINT:
+		case TEXT_PRINTERR:
 		case TEXT_PRINTRAW: {
-
 			return PropertyInfo(Variant::NIL, "value");
-
-		} break;
-		case VAR_TO_STR: {
-			return PropertyInfo(Variant::NIL, "var");
-
 		} break;
 		case STR_TO_VAR: {
 
 			return PropertyInfo(Variant::STRING, "string");
 		} break;
+		case VAR_TO_STR:
 		case VAR_TO_BYTES: {
 			if (p_idx == 0)
 				return PropertyInfo(Variant::NIL, "var");
@@ -525,12 +471,10 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const
 				return PropertyInfo(Variant::BOOL, "allow_objects");
 		} break;
 		case COLORN: {
-
 			if (p_idx == 0)
 				return PropertyInfo(Variant::STRING, "name");
 			else
 				return PropertyInfo(Variant::REAL, "alpha");
-
 		} break;
 		case FUNC_MAX: {
 		}
@@ -561,6 +505,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_output_value_port_info(int p_idx) cons
 		case MATH_CEIL: {
 			t = Variant::REAL;
 		} break;
+		case MATH_POSMOD:
 		case MATH_ROUND: {
 			t = Variant::INT;
 		} break;
@@ -806,6 +751,12 @@ void VisualScriptBuiltinFunc::exec_func(BuiltinFunc p_func, const Variant **p_in
 			VALIDATE_ARG_NUM(1);
 			*r_return = Math::fposmod((double)*p_inputs[0], (double)*p_inputs[1]);
 		} break;
+		case VisualScriptBuiltinFunc::MATH_POSMOD: {
+
+			VALIDATE_ARG_NUM(0);
+			VALIDATE_ARG_NUM(1);
+			*r_return = Math::posmod((int)*p_inputs[0], (int)*p_inputs[1]);
+		} break;
 		case VisualScriptBuiltinFunc::MATH_FLOOR: {
 
 			VALIDATE_ARG_NUM(0);
@@ -1365,6 +1316,7 @@ void VisualScriptBuiltinFunc::_bind_methods() {
 	BIND_ENUM_CONSTANT(MATH_SQRT);
 	BIND_ENUM_CONSTANT(MATH_FMOD);
 	BIND_ENUM_CONSTANT(MATH_FPOSMOD);
+	BIND_ENUM_CONSTANT(MATH_POSMOD);
 	BIND_ENUM_CONSTANT(MATH_FLOOR);
 	BIND_ENUM_CONSTANT(MATH_CEIL);
 	BIND_ENUM_CONSTANT(MATH_ROUND);
@@ -1454,6 +1406,7 @@ void register_visual_script_builtin_func_node() {
 	VisualScriptLanguage::singleton->add_register_func("functions/built_in/sqrt", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SQRT>);
 	VisualScriptLanguage::singleton->add_register_func("functions/built_in/fmod", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FMOD>);
 	VisualScriptLanguage::singleton->add_register_func("functions/built_in/fposmod", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FPOSMOD>);
+	VisualScriptLanguage::singleton->add_register_func("functions/built_in/posmod", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_POSMOD>);
 	VisualScriptLanguage::singleton->add_register_func("functions/built_in/floor", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FLOOR>);
 	VisualScriptLanguage::singleton->add_register_func("functions/built_in/ceil", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_CEIL>);
 	VisualScriptLanguage::singleton->add_register_func("functions/built_in/round", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ROUND>);

+ 1 - 0
modules/visual_script/visual_script_builtin_funcs.h

@@ -104,6 +104,7 @@ public:
 		BYTES_TO_VAR,
 		COLORN,
 		MATH_SMOOTHSTEP,
+		MATH_POSMOD,
 		FUNC_MAX
 	};