1.3 update, cleaning up and GZDoom 4.11 features.

This commit is contained in:
Marisa the Magician 2023-08-25 23:45:52 +02:00
commit ac4c53b3ef
21 changed files with 279 additions and 351 deletions

View file

@ -71,4 +71,81 @@ Class dt_Utility
Quat r = Quat.FromAngles(angle,pitch,roll);
return r*x, r*y, r*z;
}
// included here until Gutamatics updates to use native quaternions
static double, double, double ToAngles( Quat q )
{
double angle = 0., pitch = 0., roll = 0.;
double stest = q.z*q.x-q.w*q.y;
double angY = 2.*(q.w*q.z+q.x*q.y);
double angX = 1.-2.*(q.y*q.y+q.z*q.z);
if ( stest < -.4999995 )
{
angle = atan2(angY,angX);
pitch = 90.;
roll = dt_GM_GlobalMaths.Normalize180(angle+(2.*atan2(q.x,q.w)));
}
else if ( stest > .4999995 )
{
angle = atan2(angY,angX);
pitch = -90.;
roll = dt_GM_GlobalMaths.Normalize180(angle+(2.*atan2(q.x,q.w)));
}
else
{
angle = atan2(angY,angX);
pitch = -asin(2.*stest);
roll = atan2(2.*(q.w*q.x+q.y*q.z),1.-2.*(q.x*q.x+q.y*q.y));
}
return angle, pitch, roll;
}
// for aiming and shooting
static Vector3 GetPlayerViewDir( Actor player )
{
Quat r = Quat.FromAngles(player.angle,player.pitch,player.roll);
return r*(1,0,0);
}
static play Vector3 GetPlayerAimDir( Actor player )
{
FTranslatedLineTarget t;
double pitch = player.BulletSlope(t);
Quat r;
if ( !t.linetarget ) r = Quat.FromAngles(player.angle,player.pitch,player.roll);
else r = Quat.FromAngles(player.angle,pitch,player.roll);
return r*(1,0,0);
}
static Vector3, Vector3, Vector3 GetPlayerAxes( Actor player )
{
Quat r = Quat.FromAngles(player.angle,player.pitch,player.roll);
return r*(1,0,0), r*(0,-1,0), r*(0,0,1);
}
static play Vector3, Vector3, Vector3 GetPlayerAxesAutoAimed( Actor player )
{
FTranslatedLineTarget t;
double pitch = player.BulletSlope(t);
Quat r;
if ( !t.linetarget ) r = Quat.FromAngles(player.angle,player.pitch,player.roll);
else r = Quat.FromAngles(player.angle,pitch,player.roll);
return r*(1,0,0), r*(0,-1,0), r*(0,0,1);
}
static Vector3 GetPlayerEye( Actor player )
{
if ( !player.viewpos )
return player.Vec2OffsetZ(0,0,player.player.viewz);
if ( player.viewpos.flags&VPSF_ABSOLUTEPOS )
return player.viewpos.offset;
Vector3 origin = player.Vec2OffsetZ(0,0,player.player.viewz);
if ( player.viewpos.flags&VPSF_ABSOLUTEOFFSET )
return level.Vec3Offset(origin,player.viewpos.offset);
Quat r = Quat.FromAngles(player.angle,player.pitch,player.roll);
return level.Vec3Offset(origin,r*player.viewpos.offset);
}
static Vector3 GetFireOffset( Actor player, double x, double y, double z )
{
Vector3 origin = GetPlayerEye(player);
Quat r = Quat.FromAngles(player.angle,player.pitch,player.roll);
return level.Vec3Offset(origin,r*(x,-y,z));
}
}