parent
09d911a5b6
commit
d2d1f83b62
|
@ -18,10 +18,8 @@
|
||||||
#define HAVE_SQRTF
|
#define HAVE_SQRTF
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "doomdef.h"
|
#include "doomdef.h"
|
||||||
#include "m_fixed.h"
|
#include "m_fixed.h"
|
||||||
#include "tables.h" // ANGLETOFINESHIFT
|
|
||||||
|
|
||||||
#ifdef __USE_C_FIXEDMUL__
|
#ifdef __USE_C_FIXEDMUL__
|
||||||
|
|
||||||
|
@ -107,34 +105,20 @@ fixed_t FixedSqrt(fixed_t x)
|
||||||
|
|
||||||
fixed_t FixedHypot(fixed_t x, fixed_t y)
|
fixed_t FixedHypot(fixed_t x, fixed_t y)
|
||||||
{
|
{
|
||||||
// Moved the code from R_PointToDist2 to here,
|
fixed_t ax, yx, yx2, yx1;
|
||||||
// since R_PointToDist2 did the same thing,
|
if (abs(y) > abs(x)) // |y|>|x|
|
||||||
// except less prone to overflowing.
|
|
||||||
|
|
||||||
angle_t angle;
|
|
||||||
fixed_t dist;
|
|
||||||
|
|
||||||
x = abs(x);
|
|
||||||
y = abs(y);
|
|
||||||
|
|
||||||
if (y > x)
|
|
||||||
{
|
{
|
||||||
fixed_t temp;
|
ax = abs(y); // |y| => ax
|
||||||
|
yx = FixedDiv(x, y); // (x/y)
|
||||||
temp = x;
|
|
||||||
x = y;
|
|
||||||
y = temp;
|
|
||||||
}
|
}
|
||||||
|
else // |x|>|y|
|
||||||
if (!y)
|
{
|
||||||
return x;
|
ax = abs(x); // |x| => ax
|
||||||
|
yx = FixedDiv(y, x); // (x/y)
|
||||||
angle = (tantoangle[FixedDiv(y, x)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
|
}
|
||||||
|
yx2 = FixedMul(yx, yx); // (x/y)^2
|
||||||
// use as cosine
|
yx1 = FixedSqrt(1 * FRACUNIT + yx2); // (1 + (x/y)^2)^1/2
|
||||||
dist = FixedDiv(x, FINESINE(angle));
|
return FixedMul(ax, yx1); // |x|*((1 + (x/y)^2)^1/2)
|
||||||
|
|
||||||
return dist;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vector2_t *FV2_Load(vector2_t *vec, fixed_t x, fixed_t y)
|
vector2_t *FV2_Load(vector2_t *vec, fixed_t x, fixed_t y)
|
||||||
|
|
24
src/r_main.c
24
src/r_main.c
|
@ -357,7 +357,29 @@ angle_t R_PointToAngle2(fixed_t pviewx, fixed_t pviewy, fixed_t x, fixed_t y)
|
||||||
|
|
||||||
fixed_t R_PointToDist2(fixed_t px2, fixed_t py2, fixed_t px1, fixed_t py1)
|
fixed_t R_PointToDist2(fixed_t px2, fixed_t py2, fixed_t px1, fixed_t py1)
|
||||||
{
|
{
|
||||||
return FixedHypot(px1 - px2, py1 - py2);
|
angle_t angle;
|
||||||
|
fixed_t dx, dy, dist;
|
||||||
|
|
||||||
|
dx = abs(px1 - px2);
|
||||||
|
dy = abs(py1 - py2);
|
||||||
|
|
||||||
|
if (dy > dx)
|
||||||
|
{
|
||||||
|
fixed_t temp;
|
||||||
|
|
||||||
|
temp = dx;
|
||||||
|
dx = dy;
|
||||||
|
dy = temp;
|
||||||
|
}
|
||||||
|
if (!dy)
|
||||||
|
return dx;
|
||||||
|
|
||||||
|
angle = (tantoangle[FixedDiv(dy, dx)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
|
||||||
|
|
||||||
|
// use as cosine
|
||||||
|
dist = FixedDiv(dx, FINESINE(angle));
|
||||||
|
|
||||||
|
return dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Little extra utility. Works in the same way as R_PointToAngle2
|
// Little extra utility. Works in the same way as R_PointToAngle2
|
||||||
|
|
Loading…
Reference in New Issue