]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Nasty warpzone fixes for in_pitch_min/max at nondefault values. NEEDS A LOT OF TESTIN...
authorRudolf Polzer <divverent@xonotic.org>
Wed, 16 Oct 2013 04:47:50 +0000 (06:47 +0200)
committerRudolf Polzer <divverent@xonotic.org>
Wed, 16 Oct 2013 04:51:34 +0000 (06:51 +0200)
12 files changed:
qcsrc/client/View.qc
qcsrc/client/autocvars.qh
qcsrc/server/defs.qh
qcsrc/server/miscfunctions.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/vehicles/vehicles.qc
qcsrc/warpzonelib/anglestransform.qc
qcsrc/warpzonelib/anglestransform.qh
qcsrc/warpzonelib/client.qc
qcsrc/warpzonelib/common.qc
qcsrc/warpzonelib/common.qh
qcsrc/warpzonelib/server.qc

index 46920a4174db384323cdbf66f5119b2c1658e468..d23d12bcaf1814187428cbe28bc4b5c501fa44b0 100644 (file)
@@ -517,7 +517,7 @@ void CSQC_UpdateView(float w, float h)
                        }
                        else { setproperty(VF_ORIGIN, trace_endpos); }
 
-                       setproperty(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles));
+                       setproperty(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles, autocvar_in_pitch_min, autocvar_in_pitch_max));
                }
                else if(autocvar_chase_active < 0) // time to disable chase_active if it was set by this code
                {
index 8175695abb0ac5ef0a4c033e671a742a907776fb..6975598e54f6b82f7a7fb64564f96515dcd4714c 100644 (file)
@@ -427,3 +427,5 @@ string autocvar__cl_playermodel;
 float autocvar_cl_deathglow;
 float autocvar_developer_csqcentities;
 float autocvar_g_jetpack_attenuation;
+float autocvar_in_pitch_min;
+float autocvar_in_pitch_max;
index fe41a23fabc2f7585c3cef8a0d8bd9448b303226..12fe8b2ce883a0cf5cc45e741688d9716358876b 100644 (file)
@@ -271,6 +271,9 @@ float default_weapon_alpha;
 .float cvar_cl_gunalign;
 .float cvar_cl_noantilag;
 
+.float cvar_in_pitch_min;
+.float cvar_in_pitch_max;
+
 .string weaponorder_byimpulse;
 
 .float cvar_cl_allow_uid2name;
index 0b5b42781229f0df535621e4b373a0e36302329a..70fe699f38f2c1ab5767258620186b4a06633978 100644 (file)
@@ -508,6 +508,8 @@ void GetCvars(float f)
        GetCvars_handleFloat(s, f, cvar_cl_voice_directional_taunt_attenuation, "cl_voice_directional_taunt_attenuation");
        GetCvars_handleFloat(s, f, cvar_cl_accuracy_data_share, "cl_accuracy_data_share");
        GetCvars_handleFloat(s, f, cvar_cl_accuracy_data_receive, "cl_accuracy_data_receive");
+       GetCvars_handleFloat(s, f, cvar_in_pitch_min, "in_pitch_min");
+       GetCvars_handleFloat(s, f, cvar_in_pitch_max, "in_pitch_max");
 
        self.cvar_cl_accuracy_data_share = boolean(self.cvar_cl_accuracy_data_share);
        self.cvar_cl_accuracy_data_receive = boolean(self.cvar_cl_accuracy_data_receive);
index 9dc41952f32167641870998808b0e2b3dd18f18e..89772b77dac34aa0085ec9d8a79e4e1095e586ca 100644 (file)
@@ -365,7 +365,7 @@ float spiderbot_frame()
     crosshair_trace(player);
     ad = vectoangles(normalize(trace_endpos - ad));
     ad = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(spider.angles), AnglesTransform_FromAngles(ad))) - spider.tur_head.angles;
-    ad = AnglesTransform_Normalize(ad, TRUE);
+    ad = AnglesTransform_Normalize(ad, TRUE, -90, 90);
     //UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload2) + ('0 1 0' * (1 - player.vehicle_reload2)), 2);
     
     // Rotate head
index 75fa9407e6858b05393a4bdb5ce749f2bc99ec12..03dda94e02bd27cf8f7a7e8dc221275406ad7db1 100644 (file)
@@ -1336,7 +1336,7 @@ vector vehicle_aimturret(entity _vehic, vector _target, entity _turrret, string
     vtag = gettaginfo(_turrret, gettagindex(_turrret, _tagname));
     vtmp = vectoangles(normalize(_target - vtag));
     vtmp = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(_vehic.angles), AnglesTransform_FromAngles(vtmp))) - _turrret.angles;
-    vtmp = AnglesTransform_Normalize(vtmp, TRUE);
+    vtmp = AnglesTransform_Normalize(vtmp, TRUE, _pichlimit_min, _pichlimit_max);
     ftmp = _aimspeed * frametime;
     vtmp_y = bound(-ftmp, vtmp_y, ftmp);
     vtmp_x = bound(-ftmp, vtmp_x, ftmp);
index 3233f6a31cef9d6fbe6b5a14decc5af1654c05e8..650cf314b0c86acaed4abf5992bb655482c16e5e 100644 (file)
@@ -94,7 +94,7 @@ vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform)
        return AnglesTransform_Multiply(AnglesTransform_Invert(from_transform), to_transform);
 }
 
-vector AnglesTransform_Normalize(vector t, float minimize_roll)
+vector AnglesTransform_Normalize(vector t, float minimize_roll, float pitchmin, float pitchmax)
 {
        float need_flip;
        // first, bring all angles in their range...
@@ -104,7 +104,26 @@ vector AnglesTransform_Normalize(vector t, float minimize_roll)
        if(minimize_roll)
                need_flip = (t_z > 90 || t_z <= -90);
        else
-               need_flip = (t_x > 90 || t_x < -90); // for pitch we prefer to allow exactly -90 degrees for looking straight down
+       {
+               // Smaller values break the math.
+               pitchmin = min(-90, pitchmin);
+               pitchmax = max(90, pitchmax);
+               // And...
+               if (t_z > 90 || t_z <= -90)
+               {
+                       // Roll is bad. Prefer flipping, but let's end up in the good range.
+                       need_flip = (t_x >= pitchmin + 180 || t_x <= pitchmax - 180);
+                       // NOTE: Is this the right decision or should it be > and <?
+                       // This will in the equality case prefer the output with less roll.
+                       // Is that right?
+               }
+               else
+               {
+                       // Roll is ok. Prefer not flipping.
+                       need_flip = (t_x > pitchmax || t_x < pitchmin);
+                       // for pitch we prefer to allow exactly the border angles degrees for looking straight down
+               }
+       }
        if(need_flip)
        {
                if(t_x >= 0) t_x = 180 - t_x; else t_x = -180 - t_x;
index b1c8a85e9da5916983322a5fad1016216e3250d1..f3fdd83203e48ce2b139b2f7bc63ae358e0f0fc4 100644 (file)
@@ -18,7 +18,7 @@ vector AnglesTransform_TurnDirectionFR(vector transform);
 vector AnglesTransform_RightDivide(vector to_transform, vector from_transform); // A B^-1
 vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform); // A^-1 B
 
-vector AnglesTransform_Normalize(vector t, float minimize_roll); // makes sure all angles are in their range: yaw in -180..180, pitch in -90..90, roll in -180..180 (or if minimize_roll is set, pitch in -180..180, roll in -90..90)
+vector AnglesTransform_Normalize(vector t, float minimize_roll, float pitchmin, float pitchmax); // makes sure all angles are in their range: yaw in -180..180, pitch in -90..90, roll in -180..180 (or if minimize_roll is set, pitch in -180..180, roll in -90..90)
 
 vector AnglesTransform_ApplyToAngles(vector transform, vector v);
 vector AnglesTransform_ApplyToVAngles(vector transform, vector v);
index 6f75612343c32504af52c437cf3186a08515c114..cd38e35f31ab705b707f3eed63e42b187e506dff 100644 (file)
@@ -145,6 +145,8 @@ void WarpZone_Camera_Read(float isnew)
 }
 
 void CL_RotateMoves(vector ang) = #638;
+float autocvar_in_pitch_min;
+float autocvar_in_pitch_max;
 void WarpZone_Teleported_Read(float isnew)
 {
        vector v;
@@ -155,7 +157,7 @@ void WarpZone_Teleported_Read(float isnew)
        if(!isnew)
                return;
        self.warpzone_transform = v;
-       setproperty(VF_CL_VIEWANGLES, WarpZone_TransformVAngles(self, getpropertyvec(VF_CL_VIEWANGLES)));
+       setproperty(VF_CL_VIEWANGLES, WarpZone_TransformVAngles(self, getpropertyvec(VF_CL_VIEWANGLES), autocvar_in_pitch_min, autocvar_in_pitch_max));
        if(checkextension("DP_CSQC_ROTATEMOVES"))
                CL_RotateMoves(v);
                //CL_RotateMoves('0 90 0');
@@ -226,7 +228,7 @@ void WarpZone_FixPMove()
        if(e)
        {
                pmove_org = WarpZone_TransformOrigin(e, pmove_org);
-               input_angles = WarpZone_TransformVAngles(e, input_angles);
+               input_angles = WarpZone_TransformVAngles(e, input_angles, autocvar_in_pitch_min, autocvar_in_pitch_max);
        }
 }
 
@@ -250,7 +252,7 @@ void WarpZone_FixView()
        if(e)
        {
                org = WarpZone_TransformOrigin(e, org);
-               ang = WarpZone_TransformVAngles(e, ang);
+               ang = WarpZone_TransformVAngles(e, ang, autocvar_in_pitch_min, autocvar_in_pitch_max);
 #ifdef WORKAROUND_XON010
                dirty = 1;
 #endif
index 386615247ad9e55db4393b8aa8bb87ee4c0e79e2..d216b7f0aa0026e07c59f0af1134e3f3a9d5a2d4 100644 (file)
@@ -504,7 +504,7 @@ vector WarpZone_TransformAngles(entity wz, vector v)
        return AnglesTransform_ApplyToAngles(wz.warpzone_transform, v);
 }
 
-vector WarpZone_TransformVAngles(entity wz, vector ang)
+vector WarpZone_TransformVAngles(entity wz, vector ang, float pitchmin, float pitchmax)
 {
 #ifdef KEEP_ROLL
        float roll;
@@ -515,11 +515,11 @@ vector WarpZone_TransformVAngles(entity wz, vector ang)
        ang = AnglesTransform_ApplyToVAngles(wz.warpzone_transform, ang);
 
 #ifdef KEEP_ROLL
-       ang = AnglesTransform_Normalize(ang, TRUE);
+       ang = AnglesTransform_Normalize(ang, TRUE, pitchmin, pitchmax);
        ang = AnglesTransform_CancelRoll(ang);
        ang_z = roll;
 #else
-       ang = AnglesTransform_Normalize(ang, FALSE);
+       ang = AnglesTransform_Normalize(ang, FALSE, pitchmin, pitchmax);
 #endif
 
        return ang;
@@ -548,7 +548,7 @@ vector WarpZone_UnTransformVAngles(entity wz, vector ang)
        ang_z = 0;
 
        ang = AnglesTransform_ApplyToVAngles(AnglesTransform_Invert(wz.warpzone_transform), ang);
-       ang = AnglesTransform_Normalize(ang, TRUE);
+       ang = AnglesTransform_Normalize(ang, TRUE, -90, 90);
        ang = AnglesTransform_CancelRoll(ang);
 
        ang_z = roll;
@@ -742,7 +742,7 @@ vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang)
        if(from.WarpZone_refsys)
                ang = WarpZone_UnTransformVAngles(from.WarpZone_refsys, ang);
        if(to.WarpZone_refsys)
-               ang = WarpZone_TransformVAngles(to.WarpZone_refsys, ang);
+               ang = WarpZone_TransformVAngles(to.WarpZone_refsys, ang, -90, 90);
        return ang;
 }
 void WarpZone_RefSys_Copy(entity me, entity from)
index c79ee95d6e02d2d2062b8a35a987de07f0aca3cb..9b50412120893a592c2d75d1968b7dc72c47f04b 100644 (file)
@@ -55,7 +55,7 @@ float WarpZone_TargetPlaneDist(entity wz, vector v);
 vector WarpZone_TransformOrigin(entity wz, vector v);
 vector WarpZone_TransformVelocity(entity wz, vector v);
 vector WarpZone_TransformAngles(entity wz, vector v);
-vector WarpZone_TransformVAngles(entity wz, vector v);
+vector WarpZone_TransformVAngles(entity wz, vector v, float pitchmin, float pitchmax);
 vector WarpZone_UnTransformOrigin(entity wz, vector v);
 vector WarpZone_UnTransformVelocity(entity wz, vector v);
 vector WarpZone_UnTransformAngles(entity wz, vector v);
index 25bcd2901f9e449cffa4a1274a99b19c78936a7f..055faf801a0530bfe432ff29738b0ff3ca10f397 100644 (file)
@@ -57,7 +57,7 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
        o10 = o1 = WarpZone_TransformOrigin(wz, o0);
        v1 = WarpZone_TransformVelocity(wz, v0);
        if not(IS_NOT_A_CLIENT(player))
-               a1 = WarpZone_TransformVAngles(wz, player.v_angle);
+               a1 = WarpZone_TransformVAngles(wz, player.v_angle, player.cvar_in_pitch_min, player.cvar_in_pitch_max);
        else
                a1 = WarpZone_TransformAngles(wz, a0);
 
@@ -897,7 +897,7 @@ void WarpZone_PlayerPhysics_FixVAngle(void)
        if(self.v_angle_z <= 360) // if not already adjusted
        if(time - self.ping * 0.001 < self.warpzone_teleport_time)
        {
-               self.v_angle = WarpZone_TransformVAngles(self.warpzone_teleport_zone, self.v_angle);
+               self.v_angle = WarpZone_TransformVAngles(self.warpzone_teleport_zone, self.v_angle, self.cvar_in_pitch_min, self.cvar_in_pitch_max);
                self.v_angle_z += 720; // mark as adjusted
        }
 #endif