- floatification of g_shared.
- rewrote FraggleScript's movecamera function because it was utterly incomprehensible.
This commit is contained in:
parent
6557f3b8c8
commit
4a79602325
30 changed files with 281 additions and 416 deletions
|
|
@ -69,6 +69,7 @@
|
|||
#include "farchive.h"
|
||||
#include "p_setup.h"
|
||||
#include "p_spec.h"
|
||||
#include "r_utility.h"
|
||||
#include "math/cmath.h"
|
||||
|
||||
static FRandom pr_script("FScript");
|
||||
|
|
@ -1463,6 +1464,7 @@ void FParser::SF_SetCamera(void)
|
|||
if (t_argc < 4) newcamera->Angles.Pitch = 0.;
|
||||
else newcamera->Angles.Pitch = clamp(floatvalue(t_argv[3]), -50., 50.) * (20. / 32.);
|
||||
player->camera=newcamera;
|
||||
R_ResetViewInterpolation();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3052,173 +3054,57 @@ void FParser::SF_SetWeapon()
|
|||
//
|
||||
// movecamera(camera, targetobj, targetheight, movespeed, targetangle, anglespeed)
|
||||
//
|
||||
// This has been completely rewritten in a sane fashion, using actual vector math.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void FParser::SF_MoveCamera(void)
|
||||
{
|
||||
fixed_t x, y, z;
|
||||
fixed_t zdist, xydist, movespeed;
|
||||
fixed_t xstep, ystep, zstep, targetheight;
|
||||
angle_t anglespeed, anglestep, angledist, targetangle, bigangle, smallangle;
|
||||
DAngle mobjangle;
|
||||
|
||||
// I have to use floats for the math where angles are divided
|
||||
// by fixed values.
|
||||
double fangledist, fanglestep, fmovestep;
|
||||
int angledir;
|
||||
AActor* target;
|
||||
int moved;
|
||||
int quad1, quad2;
|
||||
AActor * cam;
|
||||
|
||||
angledir = moved = 0;
|
||||
|
||||
if (CheckArgs(6))
|
||||
{
|
||||
cam = actorvalue(t_argv[0]);
|
||||
target = actorvalue(t_argv[1]);
|
||||
if(!cam || !target)
|
||||
AActor *cam = actorvalue(t_argv[0]);
|
||||
AActor *target = actorvalue(t_argv[1]);
|
||||
if(!cam || !target)
|
||||
{
|
||||
script_error("invalid target for camera\n"); return;
|
||||
}
|
||||
|
||||
DVector2 fdist = cam->Vec2To(target);
|
||||
fixed_t distx = FLOAT2FIXED(fdist.X);
|
||||
fixed_t disty = FLOAT2FIXED(fdist.Y);
|
||||
fixed_t camx = FLOAT2FIXED(cam->X());
|
||||
fixed_t camy = FLOAT2FIXED(cam->Y());
|
||||
fixed_t camz = FLOAT2FIXED(cam->Z());
|
||||
double targetheight = floatvalue(t_argv[2]);
|
||||
DVector3 campos = cam->Pos();
|
||||
DVector3 targpos = DVector3(target->Pos(), targetheight);
|
||||
if (campos != targpos)
|
||||
{
|
||||
DVector3 movement = targpos - campos;
|
||||
double movelen = movement.Length();
|
||||
double movespeed = floatvalue(t_argv[3]);
|
||||
DVector3 movepos;
|
||||
bool finished = (movespeed >= movelen);
|
||||
if (finished) movepos = targpos;
|
||||
else movepos = campos + movement.Resized(movespeed);
|
||||
|
||||
|
||||
targetheight = fixedvalue(t_argv[2]);
|
||||
movespeed = fixedvalue(t_argv[3]);
|
||||
targetangle = (angle_t)FixedToAngle(fixedvalue(t_argv[4]));
|
||||
anglespeed = (angle_t)FixedToAngle(fixedvalue(t_argv[5]));
|
||||
|
||||
// figure out how big one step will be
|
||||
zdist = targetheight - camz;
|
||||
|
||||
// Angle checking...
|
||||
// 90
|
||||
// Q1|Q0
|
||||
//180--+--0
|
||||
// Q2|Q3
|
||||
// 270
|
||||
angle_t camangle = cam->Angles.Yaw.BAMs();
|
||||
quad1 = targetangle / ANG90;
|
||||
quad2 = camangle / ANG90;
|
||||
bigangle = targetangle > camangle ? targetangle : camangle;
|
||||
smallangle = targetangle < camangle ? targetangle : camangle;
|
||||
if((quad1 > quad2 && quad1 - 1 == quad2) || (quad2 > quad1 && quad2 - 1 == quad1) ||
|
||||
quad1 == quad2)
|
||||
{
|
||||
angledist = bigangle - smallangle;
|
||||
angledir = targetangle > camangle ? 1 : -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
angle_t diff180 = (bigangle + ANG180) - (smallangle + ANG180);
|
||||
|
||||
if(quad2 == 3 && quad1 == 0)
|
||||
DAngle targetangle = floatvalue(t_argv[4]);
|
||||
DAngle anglespeed = floatvalue(t_argv[5]);
|
||||
DAngle diffangle = deltaangle(cam->Angles.Yaw, targetangle);
|
||||
|
||||
if (movespeed > 0 && anglespeed == 0.)
|
||||
{
|
||||
angledist = diff180;
|
||||
angledir = 1;
|
||||
}
|
||||
else if(quad1 == 3 && quad2 == 0)
|
||||
{
|
||||
angledist = diff180;
|
||||
angledir = -1;
|
||||
if (!finished) targetangle = diffangle * movespeed / movelen;
|
||||
}
|
||||
else
|
||||
{
|
||||
angledist = bigangle - smallangle;
|
||||
if(angledist > ANG180)
|
||||
{
|
||||
angledist = diff180;
|
||||
angledir = targetangle > camangle ? -1 : 1;
|
||||
}
|
||||
else
|
||||
angledir = targetangle > camangle ? 1 : -1;
|
||||
targetangle = cam->Angles.Yaw + anglespeed;
|
||||
}
|
||||
}
|
||||
|
||||
// set step variables based on distance and speed
|
||||
mobjangle = cam->AngleTo(target);
|
||||
xydist = FLOAT2FIXED(cam->Distance2D(target, true));
|
||||
|
||||
xstep = (fixed_t)(movespeed * mobjangle.Cos());
|
||||
ystep = (fixed_t)(movespeed * mobjangle.Sin());
|
||||
|
||||
if(xydist && movespeed)
|
||||
zstep = FixedDiv(zdist, FixedDiv(xydist, movespeed));
|
||||
else
|
||||
zstep = zdist > 0 ? movespeed : -movespeed;
|
||||
|
||||
if(xydist && movespeed && !anglespeed)
|
||||
{
|
||||
fangledist = ((double)angledist / (ANG45/45));
|
||||
fmovestep = ((double)FixedDiv(xydist, movespeed) / FRACUNIT);
|
||||
if(fmovestep)
|
||||
fanglestep = fangledist / fmovestep;
|
||||
else
|
||||
fanglestep = 360;
|
||||
|
||||
anglestep =(angle_t) (fanglestep * (ANG45/45));
|
||||
}
|
||||
else
|
||||
anglestep = anglespeed;
|
||||
|
||||
if(abs(xstep) >= (abs(distx) - 1))
|
||||
x = camx + distx;
|
||||
else
|
||||
{
|
||||
x = camx + xstep;
|
||||
moved = 1;
|
||||
}
|
||||
|
||||
if(abs(ystep) >= (abs(disty) - 1))
|
||||
y = camy + disty;
|
||||
else
|
||||
{
|
||||
y = camy + ystep;
|
||||
moved = 1;
|
||||
}
|
||||
|
||||
if(abs(zstep) >= (abs(zdist) - 1))
|
||||
z = targetheight;
|
||||
else
|
||||
{
|
||||
z = camz + zstep;
|
||||
moved = 1;
|
||||
}
|
||||
|
||||
if(anglestep >= angledist)
|
||||
cam->Angles.Yaw = ANGLE2DBL(targetangle);
|
||||
else
|
||||
{
|
||||
if(angledir == 1)
|
||||
{
|
||||
cam->Angles.Yaw += ANGLE2DBL(anglestep);
|
||||
moved = 1;
|
||||
}
|
||||
else if(angledir == -1)
|
||||
{
|
||||
cam->Angles.Yaw -= ANGLE2DBL(anglestep);
|
||||
moved = 1;
|
||||
}
|
||||
}
|
||||
|
||||
cam->radius = 1 / 8192.;
|
||||
cam->Height = 1 / 8192.;
|
||||
if ((x != camx || y != camy) && !P_TryMove(cam, FIXED2FLOAT(x), FIXED2FLOAT(y), true))
|
||||
cam->radius = 1 / 8192.;
|
||||
cam->Height = 1 / 8192.;
|
||||
cam->SetOrigin(movepos, true);
|
||||
t_return.value.i = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
Printf("Illegal camera move to (%f, %f)\n", x/65536.f, y/65536.f);
|
||||
return;
|
||||
t_return.value.i = 0;
|
||||
}
|
||||
cam->SetZ(FIXED2FLOAT(z));
|
||||
|
||||
t_return.type = svt_int;
|
||||
t_return.value.i = moved;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue