Some ACSUtils functions return multiple values (e.g. vector math functions, but also some non-math functions). ACS doesn't support returning multiple values from a function.
ACSUtils uses a convention to fake returning multiple values from a function. The convention is as follows: there are 8 global variables with names r1
through r8
. If a function returns multiple values, it actually returns no value and writes the first “returned” value to r1
, the second one to r2
, and so on.
Here's an example, RotateVector
returns X and Y:
RotateVector(x, y, angle); int newX = r1; int newY = r2;
Don't do this:
SomeFunctionWithMultipleReturnValues(...); SomeOtherFunction(r1); int b = r2;
Because SomeOtherFunction
may call functions that overwrite r2
! Instead, strictly follow this style:
SomeFunctionWithMultipleReturnValues(...); int a = r1; int b = r2; SomeOtherFunction(a);
r1
..r8
are declared raw
in BCC to be able to accomodate any type of return value, and thus bypass strict typing, even if it's enabled.ParseFixed("1.0", 10); int error = r1; int result = r2; // no compiler error, despite assigning a fixed to int
But overwriting argument variables immediately after calling the function is valid:
RotateVector(x, y, angle); x = r1; y = r2;
An example of a function returning three values:
normalize3d(x, y, z); int newX = r1; int newY = r2; int newZ = r3;