vm_vector_2_matrix was improperly guarded against bad parameters. In the
case I encountered the uvec was the negative of fvec which produced a
null vector when the cross product of the two vector was constructed.
These changes should fix that bug by ignoring the uvec parameter. Since
vm_vector_2_matrix and vm_vector_2_matrix_norm are basically the same, I
converted the former into an alias of the latter and only fixed that
code.
The routine vm_vec_normalize_quick_mag() did not normalize a vector.
Instead of dividing the vector by the 'quick magnitude', it multiplied
it. This routine was only called by one other routine (which was
fortunately unused)--vm_vec_normalized_dir_quick_mag().
Given both the incorrect behavior as well as their lack of use, those
routines have been removed.
Signed-off-by: Peter Mitsis <[email protected]>
Uses fl_abs() (which evaluates to fabsf()) instead of an if-else
statement to get the absolute value of a float. A compiler for the
x86 platform is able use SSE instructions to optimize calls to fabsf().
Signed-off-by: Peter Mitsis <[email protected]>
Fix calculations of server ping in in-game server list. Minimize floating
point calculations, using double instead of float, avoid calling timer
twice when receiving pong, and capture pong time more precisely.
Replaces calls to double-precision floating point trig functions with
calls to single-precision floating point trig functions as follows:
cos() -> cosf()
sin() -> sinf()
tan() -> tanf()
acos() -> acosf()
asin() -> asinf()
atan() -> atanf()
This allows the compiler to avoid generating unnecessary instructions
that convert a float to a double and then a double back to a float.
Signed-off-by: Peter Mitsis <[email protected]>
The classic solution to the quadratic equation ...
a*x*x + b*x + c = 0
is ...
-b +- sqrt(b*b - 4*ac)
x = ----------------------
2*a
This can be optimized by substituting b = 2*B.
-2*B +- sqrt((2*B)*(2*B) - 4*a*c)
x = ---------------------------------
2*a
This expands to ...
-2*B +- sqrt(4*B*B - 4*a*c)
x = ---------------------------
2*a
And simplifies to ...
-2*B +- 2*sqrt(B*B - 4*a*c)
x = ---------------------------
2*a
-B +- sqrt(B*B - a*c)
x = ---------------------
a
Signed-off-by: Peter Mitsis <[email protected]>
Uses an array of precalculated factorials that are accessed as a lookup table
instead of computing the factorials at runtime. This cuts down on compiled
code bloat (compiler was both unrolling and inlining the computation's loop)
everywhere it was used.
NOTE: The original implementation returned an 'int'. As a result, the largest
uncorrupted factorial it could compute was 12!. For this reason, the lookup
table only goes up to 12!.
Signed-off-by: Peter Mitsis <[email protected]>
Rejiggers the macros fl_radians() and fl_degrees() to avoid unnecessary
operations. The new placement of the parentheses permit the compiler to
evaluate (PI / 180.f) and (180.f / PI) at compile time rather than run time.
Signed-off-by: Peter Mitsis <[email protected]>
Instead of performing three consecutive divisions, vm_vec_avg_n() now performs
one division at the start and three multiplications at the end. Recall that
multiplication is faster than division.
Signed-off-by: Peter Mitsis <[email protected]>
The routine atan2_safe() already contains a test that checks if both parameters
are zero--that is the point of the routine. Thus, there is no need for the
caller of atan2_safe() to perform that same check.
Signed-off-by: Peter Mitsis <[email protected]>
The routine vm_vec_normalize() always returns a value greater than zero.
Thus, there is no need to test its return value for values that are less
than or equal to zero.
Signed-off-by: Peter Mitsis <[email protected]>
The routine vm_vec_copy_normalize() always returns a value greater than zero.
Thus, there is no need to test its return value for values that are less than
or equal to zero.
Signed-off-by: Peter Mitsis <[email protected]>