]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Clean up orthoview maths, add logic for handling r_nearclip and r_farclip
authorSamual Lenks <samual@xonotic.org>
Sun, 15 Sep 2013 04:26:16 +0000 (00:26 -0400)
committerSamual Lenks <samual@xonotic.org>
Sun, 15 Sep 2013 04:26:16 +0000 (00:26 -0400)
qcsrc/client/View.qc

index dd245786bef44c5104f3a56385aacb073970fb85..3d49418e505862dd3507827cf94c49702f709e41 100644 (file)
@@ -396,7 +396,7 @@ float checkfail[16];
 
 float rainbow_last_flicker;
 vector rainbow_prev_color;
-
+float autocvar_cl_orthoview_distanceoverride;
 #define BUTTON_3 4
 #define BUTTON_4 8
 float cl_notice_run();
@@ -561,9 +561,38 @@ void CSQC_UpdateView(float w, float h)
 
        if(autocvar_cl_orthoview)
        {
-               float width = (mi_picmax_x - mi_picmin_x);
-               float height = (mi_picmax_y - mi_picmin_y);
-               setproperty(VF_ORIGIN, '0 0 1' * (512 * max(width, height)));
+               float ov_width = (mi_picmax_x - mi_picmin_x);
+               float ov_height = (mi_picmax_y - mi_picmin_y);
+               float ov_distance = (512 * max(ov_width, ov_height));
+               if(autocvar_cl_orthoview_distanceoverride) { ov_distance = autocvar_cl_orthoview_distanceoverride; }
+               vector ov_org = ('0 0 1' * ov_distance);
+               
+               #define FL2VEC(x,y,z) (('1 0 0' * x) + ('0 1 0' * y) + ('0 0 1' * z))
+
+               float ov_nearest = vlen(ov_org - FL2VEC(
+                       bound(mi_picmin_x, ov_org_x, mi_picmax_x),
+                       bound(mi_picmin_y, ov_org_y, mi_picmax_y),
+                       bound(mi_picmin_z, ov_org_z, mi_picmax_z)
+               ));
+
+               float ov_furthest = 0;
+               float dist = 0;
+
+               if((dist = vlen(FL2VEC(mi_picmin_x, mi_picmin_y, mi_picmin_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(FL2VEC(mi_picmax_x, mi_picmin_y, mi_picmin_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(FL2VEC(mi_picmin_x, mi_picmax_y, mi_picmin_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(FL2VEC(mi_picmin_x, mi_picmin_y, mi_picmax_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(FL2VEC(mi_picmax_x, mi_picmax_y, mi_picmin_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(FL2VEC(mi_picmin_x, mi_picmax_y, mi_picmax_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(FL2VEC(mi_picmax_x, mi_picmin_y, mi_picmax_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(FL2VEC(mi_picmax_x, mi_picmax_y, mi_picmax_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               
+               cvar_set("r_nearclip", ftos(ov_nearest));
+               cvar_set("r_farclip_base", ftos(ov_furthest));
+               cvar_set("r_farclip_world", "0");
+               cvar_set("r_useinfinitefarclip", "0");
+               
+               setproperty(VF_ORIGIN, ov_org);
                setproperty(VF_ANGLES, '90 0 0');
        }