- floatified scale_point stuff.

This commit is contained in:
Christoph Oelckers 2022-09-03 22:57:07 +02:00
parent aa88eb49e0
commit d0422ae1b5
5 changed files with 45 additions and 46 deletions

View file

@ -114,6 +114,10 @@ inline int RANDOM(void)
randomseed = ((randomseed * 21 + 1) & 65535); randomseed = ((randomseed * 21 + 1) & 65535);
return randomseed; return randomseed;
} }
inline double RandomRangeF(double range)
{
return RANDOM() * range / 65536;
}
int RANDOM_P2(int pwr_of_2) { return (RANDOM() & (pwr_of_2 - 1)); } int RANDOM_P2(int pwr_of_2) { return (RANDOM() & (pwr_of_2 - 1)); }
double RANDOM_P2F(int pwr_of_2, int shift) { return (RANDOM() & ((pwr_of_2 << shift) - 1)) * (1./(1 << shift)); } double RANDOM_P2F(int pwr_of_2, int shift) { return (RANDOM() & ((pwr_of_2 << shift) - 1)) * (1./(1 << shift)); }
DAngle RANDOM_ANGLE() { return DAngle::fromBuild(RANDOM_P2(2048)); } DAngle RANDOM_ANGLE() { return DAngle::fromBuild(RANDOM_P2(2048)); }
@ -1522,15 +1526,15 @@ struct SECTOR_OBJECT
double scale_dist, // distance from center double scale_dist, // distance from center
scale_dist_min, // absolute min scale_dist_min, // absolute min
scale_dist_max, // absolute max scale_dist_max, // absolute max
scale_speed; // speed of scaling scale_speed, // speed of scaling
// values for single point scaling // values for single point scaling
int16_t _scale_point_dist[MAX_SO_POINTS], // distance from center scale_point_dist[MAX_SO_POINTS], // distance from center
_scale_point_speed[MAX_SO_POINTS], // speed of scaling scale_point_speed[MAX_SO_POINTS], // speed of scaling
_scale_point_base_speed, // base speed of scaling scale_point_base_speed, // base speed of scaling
_scale_point_dist_min, // absolute min scale_point_dist_min, // absolute min
_scale_point_dist_max, // absolute max scale_point_dist_max; // absolute max
scale_point_rand_freq, // freqency of direction change - based on rand(1024) int16_t scale_point_rand_freq, // freqency of direction change - based on rand(1024)
scale_x_mult, // x multiplyer for scaling scale_x_mult, // x multiplyer for scaling
scale_y_mult, // y multiplyer for scaling scale_y_mult, // y multiplyer for scaling

View file

@ -253,42 +253,38 @@ void ScaleSectorObject(SECTOR_OBJECT* sop)
DVector2 ScaleRandomPoint(SECTOR_OBJECT* sop, short k, DAngle ang, const DVector2& pos) DVector2 ScaleRandomPoint(SECTOR_OBJECT* sop, short k, DAngle ang, const DVector2& pos)
{ {
int xmul, ymul; sop->scale_point_dist[k] += sop->scale_point_speed[k];
if (sop->scale_point_dist[k] > sop->scale_point_dist_max)
sop->_scale_point_dist[k] += sop->_scale_point_speed[k];
if (sop->_scale_point_dist[k] > sop->_scale_point_dist_max)
{ {
sop->_scale_point_speed[k] *= -1; sop->scale_point_speed[k] *= -1;
sop->_scale_point_dist[k] = sop->_scale_point_dist_max; sop->scale_point_dist[k] = sop->scale_point_dist_max;
} }
else if (sop->_scale_point_dist[k] < sop->_scale_point_dist_min) else if (sop->scale_point_dist[k] < sop->scale_point_dist_min)
{ {
sop->_scale_point_speed[k] *= -1; sop->scale_point_speed[k] *= -1;
sop->_scale_point_dist[k] = sop->_scale_point_dist_min; sop->scale_point_dist[k] = sop->scale_point_dist_min;
} }
if (RANDOM_P2(1024) < sop->scale_point_rand_freq) if (RANDOM_P2(1024) < sop->scale_point_rand_freq)
{ {
sop->_scale_point_speed[k] *= -1; sop->scale_point_speed[k] *= -1;
} }
// change up speed at random // change up speed at random
if (RANDOM_P2(1024) < (sop->scale_point_rand_freq / 2)) if (RANDOM_P2(1024) < (sop->scale_point_rand_freq / 2))
{ {
//sop->scale_point_speed[k] = SCALE_POINT_SPEED; double half = sop->scale_point_base_speed / 2;
short half = sop->_scale_point_base_speed / 2; double quart = sop->scale_point_base_speed / 4;
short quart = sop->_scale_point_base_speed / 4; sop->scale_point_speed[k] = sop->scale_point_base_speed + (RandomRangeF(half) - quart);
sop->_scale_point_speed[k] = sop->_scale_point_base_speed + (RandomRange(half) - quart);
} }
xmul = (sop->_scale_point_dist[k] * sop->scale_x_mult) >> 8; double xmul = (sop->scale_point_dist[k] * sop->scale_x_mult) * (1 / 256.);
ymul = (sop->_scale_point_dist[k] * sop->scale_y_mult) >> 8; double ymul = (sop->scale_point_dist[k] * sop->scale_y_mult) * (1 / 256.);
DVector2 mul(xmul / 16., ymul / 16.);
DVector2 ret; DVector2 ret;
ret.X = pos.X + mul.X * ang.Cos(); ret.X = pos.X + xmul * ang.Cos();
ret.Y = pos.Y + mul.Y * ang.Sin(); ret.Y = pos.Y + ymul * ang.Sin();
return ret; return ret;
} }

View file

@ -686,11 +686,11 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, SECTOR_OBJECT& w,
.Array("clipbox_dist", w.clipbox_dist, def->clipbox_dist, w.clipbox_num) .Array("clipbox_dist", w.clipbox_dist, def->clipbox_dist, w.clipbox_num)
.Array("clipbox_ang", w.clipbox_ang, def->clipbox_ang, w.clipbox_num) .Array("clipbox_ang", w.clipbox_ang, def->clipbox_ang, w.clipbox_num)
.Array("clipbox_vdist", w.clipbox_vdist, def->clipbox_vdist, w.clipbox_num) .Array("clipbox_vdist", w.clipbox_vdist, def->clipbox_vdist, w.clipbox_num)
.Array("scale_point_dist", w._scale_point_dist, def->_scale_point_dist, MAX_SO_POINTS) .Array("scale_point_dist", w.scale_point_dist, def->scale_point_dist, MAX_SO_POINTS)
.Array("scale_point_speed", w._scale_point_speed, def->_scale_point_speed, MAX_SO_POINTS) .Array("scale_point_speed", w.scale_point_speed, def->scale_point_speed, MAX_SO_POINTS)
("scale_point_base_speed", w._scale_point_base_speed, def->_scale_point_base_speed) ("scale_point_base_speed", w.scale_point_base_speed, def->scale_point_base_speed)
("scale_point_dist_min", w._scale_point_dist_min, def->_scale_point_dist_min) ("scale_point_dist_min", w.scale_point_dist_min, def->scale_point_dist_min)
("scale_point_dist_max", w._scale_point_dist_max, def->_scale_point_dist_max) ("scale_point_dist_max", w.scale_point_dist_max, def->scale_point_dist_max)
("scale_point_rand_freq", w.scale_point_rand_freq, def->scale_point_rand_freq) ("scale_point_rand_freq", w.scale_point_rand_freq, def->scale_point_rand_freq)
("scale_x_mult", w.scale_x_mult, def->scale_x_mult) ("scale_x_mult", w.scale_x_mult, def->scale_x_mult)
("scale_y_mult", w.scale_y_mult, def->scale_y_mult) ("scale_y_mult", w.scale_y_mult, def->scale_y_mult)

View file

@ -54,7 +54,6 @@ enum SO_SCALE_TYPE
SO_SCALE_RANDOM_POINT SO_SCALE_RANDOM_POINT
}; };
#define SCALE_POINT_SPEED (4 + RandomRange(8))
struct NEAR_TAG_INFO struct NEAR_TAG_INFO
{ {

View file

@ -1012,11 +1012,11 @@ void SetupSectorObject(sectortype* sectp, short tag)
case SO_SCALE_POINT_INFO: case SO_SCALE_POINT_INFO:
memset(sop->_scale_point_dist,0,sizeof(sop->_scale_point_dist)); memset(sop->scale_point_dist,0,sizeof(sop->scale_point_dist));
sop->_scale_point_base_speed = SP_TAG2(actor); sop->scale_point_base_speed = SP_TAG2(actor) * maptoworld;
for (j = 0; j < (int)SIZ(sop->_scale_point_speed); j++) for (j = 0; j < (int)SIZ(sop->scale_point_speed); j++)
{ {
sop->_scale_point_speed[j] = SP_TAG2(actor); sop->scale_point_speed[j] = SP_TAG2(actor) * maptoworld;
} }
if (SP_TAG4(actor)) if (SP_TAG4(actor))
@ -1024,8 +1024,8 @@ void SetupSectorObject(sectortype* sectp, short tag)
else else
sop->scale_point_rand_freq = 64; sop->scale_point_rand_freq = 64;
sop->_scale_point_dist_min = -SP_TAG5(actor); sop->scale_point_dist_min = -SP_TAG5(actor) * maptoworld;
sop->_scale_point_dist_max = SP_TAG6(actor); sop->scale_point_dist_max = SP_TAG6(actor) * maptoworld;
KillActor(actor); KillActor(actor);
break; break;
@ -1105,13 +1105,13 @@ void SetupSectorObject(sectortype* sectp, short tag)
sop->scale_type = SO_SCALE_RANDOM_POINT; sop->scale_type = SO_SCALE_RANDOM_POINT;
sop->PreMoveAnimator = ScaleSectorObject; sop->PreMoveAnimator = ScaleSectorObject;
memset(sop->_scale_point_dist,0,sizeof(sop->_scale_point_dist));; memset(sop->scale_point_dist,0,sizeof(sop->scale_point_dist));;
sop->_scale_point_base_speed = SCALE_POINT_SPEED; sop->scale_point_base_speed = 0.25 + RandomRangeF(0.5);
for (j = 0; j < (int)SIZ(sop->_scale_point_speed); j++) for (j = 0; j < (int)SIZ(sop->scale_point_speed); j++)
sop->_scale_point_speed[j] = SCALE_POINT_SPEED; sop->scale_point_speed[j] = 0.25 + RandomRangeF(0.5);
sop->_scale_point_dist_min = -256; sop->scale_point_dist_min = -16;
sop->_scale_point_dist_max = 256; sop->scale_point_dist_max = 16;
sop->scale_point_rand_freq = 32; sop->scale_point_rand_freq = 32;
KillActor(actor); KillActor(actor);
break; break;
@ -1792,8 +1792,8 @@ void RefreshPoints(SECTOR_OBJECT* sop, int nx, int ny, bool dynamic)
} }
else else
{ {
double xmul = (sop->scale_dist * sop->scale_x_mult) / 256.; double xmul = (sop->scale_dist * sop->scale_x_mult) * (1 / 256.);
double ymul = (sop->scale_dist * sop->scale_y_mult) / 256.; double ymul = (sop->scale_dist * sop->scale_y_mult) * (1 / 256.);
dpos.X = pos.X + xmul * ang.Cos(); dpos.X = pos.X + xmul * ang.Cos();
dpos.Y = pos.Y + ymul * ang.Sin(); dpos.Y = pos.Y + ymul * ang.Sin();