From 3f0b660efdec37862decaa040af844d58f9f6d19 Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 28 Feb 2010 19:43:08 +0000 Subject: [PATCH] turn the angles the other way for consistency git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8696 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/projectile.qc | 2 +- data/qcsrc/server/cheats.qc | 2 +- data/qcsrc/server/portals.qc | 6 +- data/qcsrc/warpzonelib/anglestransform.qc | 72 +++++++++++++++++++++-- data/qcsrc/warpzonelib/anglestransform.qh | 8 +++ data/qcsrc/warpzonelib/common.qc | 1 + 6 files changed, 80 insertions(+), 11 deletions(-) diff --git a/data/qcsrc/client/projectile.qc b/data/qcsrc/client/projectile.qc index cd1fe267b..34299ea31 100644 --- a/data/qcsrc/client/projectile.qc +++ b/data/qcsrc/client/projectile.qc @@ -88,7 +88,7 @@ void Projectile_Draw() default: break; } - self.angles = AnglesTransform_Multiply(self.angles, rot * (t - self.spawntime)); + self.angles = AnglesTransform_ApplyToAngles(self.angles, rot * (t - self.spawntime)); } fixedmakevectors(self.angles); diff --git a/data/qcsrc/server/cheats.qc b/data/qcsrc/server/cheats.qc index 024370474..90f4b234e 100644 --- a/data/qcsrc/server/cheats.qc +++ b/data/qcsrc/server/cheats.qc @@ -339,7 +339,7 @@ float CheatCommand(float argc) if(f == 1) { e.angles = fixedvectoangles2(trace_plane_normal, v_forward); - e.angles = AnglesTransform_Multiply(e.angles, '-90 0 0'); // so unrotated models work + e.angles = AnglesTransform_ApplyToAngles(e.angles, '-90 0 0'); // so unrotated models work } oldself = self; self = e; diff --git a/data/qcsrc/server/portals.qc b/data/qcsrc/server/portals.qc index 4fd11aeb0..c7814e953 100644 --- a/data/qcsrc/server/portals.qc +++ b/data/qcsrc/server/portals.qc @@ -30,13 +30,13 @@ vector Portal_ApplyTransformToPlayerAngle(vector transform, vector vangle) ang = vangle; /* ang_x = bound(-89, mod(-ang_x + 180, 360) - 180, 89); - ang = AnglesTransform_Multiply(transform, ang); + ang = AnglesTransform_ApplyToVAngles(transform, ang); */ // PLAYERS use different math ang_x = -ang_x; - //print("reference: ", vtos(AnglesTransform_Multiply(transform, ang)), "\n"); + //print("reference: ", vtos(AnglesTransform_ApplyToVAngles(transform, ang)), "\n"); fixedmakevectors(ang); old_forward = v_forward; @@ -144,7 +144,7 @@ float Portal_TeleportPlayer(entity teleporter, entity player) if(player.classname == "player") ang = Portal_ApplyTransformToPlayerAngle(transform, player.v_angle); else - ang = AnglesTransform_Multiply(transform, player.angles); + ang = AnglesTransform_ApplyToAngles(transform, player.angles); // factor -1 allows chaining portals, but may be weird player.right_vector = -1 * AnglesTransform_Apply(transform, player.right_vector); diff --git a/data/qcsrc/warpzonelib/anglestransform.qc b/data/qcsrc/warpzonelib/anglestransform.qc index 0caaf8ac4..c542698c7 100644 --- a/data/qcsrc/warpzonelib/anglestransform.qc +++ b/data/qcsrc/warpzonelib/anglestransform.qc @@ -1,10 +1,26 @@ -// helper function +#ifdef POSITIVE_PITCH_IS_DOWN +vector fixedvectoangles(vector a) +{ + vector ang; + ang = vectoangles(a); + ang_x = -ang_x; + return ang; +} +vector fixedvectoangles2(vector a, vector b) +{ + vector ang; + ang = vectoangles2(a, b); + ang_x = -ang_x; + return ang; +} +#else void fixedmakevectors(vector a) { // a makevectors that actually inverts vectoangles a_x = -a_x; makevectors(a); } +#endif // angles transforms // angles in fixedmakevectors/fixedvectoangles space @@ -12,8 +28,8 @@ vector AnglesTransform_Apply(vector transform, vector v) { fixedmakevectors(transform); return v_forward * v_x - + v_right * (-v_y) - + v_up * v_z; + + v_right * (-v_y) + + v_up * v_z; } vector AnglesTransform_Multiply(vector t1, vector t2) @@ -93,14 +109,57 @@ vector AnglesTransform_Normalize(vector t, float minimize_roll) return t; } +vector AnglesTransform_CancelRoll(vector t) +{ + const float epsilon = 30; + float f; + + // constraints: + // forward vector (NOT SO important) + // right vector, up vector: screen rotation (MORE important) + // choose best match among all pitch-yaw only rotations + + // FIXME find a better method + + f = fabs(t_x - (-90)) / epsilon; + if(f < 1) + { + //t_x = -90; + t_y += t_z; + t_z = 0; + } + else + { + f = fabs(t_x - 90) / epsilon; + if(f < 1) + { + //t_x = 90; + t_y -= t_z; + t_z = 0; + } + } + return t; +} + +#ifdef POSITIVE_PITCH_IS_DOWN +vector AnglesTransform_ApplyToAngles(vector transform, vector v) +{ + v_x = -v_x; + v = AnglesTransform_Multiply(transform, v); + v_x = -v_x; + return v; +} +vector AnglesTransform_ApplyToVAngles(vector transform, vector v) +{ + v = AnglesTransform_Multiply(transform, v); + return v; +} +#else vector AnglesTransform_ApplyToAngles(vector transform, vector v) { - //v_x = -v_x; v = AnglesTransform_Multiply(transform, v); - //v_x = -v_x; return v; } - vector AnglesTransform_ApplyToVAngles(vector transform, vector v) { v_x = -v_x; @@ -108,3 +167,4 @@ vector AnglesTransform_ApplyToVAngles(vector transform, vector v) v_x = -v_x; return v; } +#endif diff --git a/data/qcsrc/warpzonelib/anglestransform.qh b/data/qcsrc/warpzonelib/anglestransform.qh index a91cddc27..714c4a382 100644 --- a/data/qcsrc/warpzonelib/anglestransform.qh +++ b/data/qcsrc/warpzonelib/anglestransform.qh @@ -1,6 +1,14 @@ +#define POSITIVE_PITCH_IS_DOWN + +#ifdef POSITIVE_PITCH_IS_DOWN +#define fixedmakevectors makevectors +vector fixedvectoangles(vector a); +vector fixedvectoangles2(vector a, vector b); +#else void fixedmakevectors(vector a); #define fixedvectoangles2 vectoangles2 #define fixedvectoangles vectoangles +#endif vector AnglesTransform_Apply(vector transform, vector v); vector AnglesTransform_Multiply(vector t1, vector t2); diff --git a/data/qcsrc/warpzonelib/common.qc b/data/qcsrc/warpzonelib/common.qc index 996b5f3a3..69c0ca1fd 100644 --- a/data/qcsrc/warpzonelib/common.qc +++ b/data/qcsrc/warpzonelib/common.qc @@ -30,6 +30,7 @@ vector WarpZone_TransformVAngles(vector t, vector ang) */ ang = AnglesTransform_Normalize(ang, TRUE); + ang = AnglesTransform_CancelRoll(ang); /* print(vtos(ang), " output\n"); -- 2.39.2