]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/master' into samual/orthoview
authorSamual Lenks <samual@xonotic.org>
Sun, 15 Sep 2013 16:59:08 +0000 (12:59 -0400)
committerSamual Lenks <samual@xonotic.org>
Sun, 15 Sep 2013 16:59:08 +0000 (12:59 -0400)
qcsrc/client/View.qc
qcsrc/client/autocvars.qh

index 46920a4174db384323cdbf66f5119b2c1658e468..6e3cc5a8dadc65cdee70dfa834a585894c41af3e 100644 (file)
@@ -199,6 +199,17 @@ vector GetCurrentFov(float fov)
        return '1 0 0' * fovx + '0 1 0' * fovy;
 }
 
+vector GetOrthoviewFOV(vector ov_org)
+{
+       float fovx, fovy;
+       float width = (mi_picmax_x - mi_picmin_x);
+       float height = (mi_picmax_y - mi_picmin_y);
+       float distance_to_middle_of_world = vlen(ov_org);
+       fovx = atan2(width/2, distance_to_middle_of_world) / M_PI * 360.0;
+       fovy = atan2(height/2, distance_to_middle_of_world) / M_PI * 360.0;
+       return '1 0 0' * fovx + '0 1 0' * fovy;
+}
+
 // this function must match W_SetupShot!
 float zoomscript_caught;
 
@@ -385,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();
@@ -548,6 +559,45 @@ void CSQC_UpdateView(float w, float h)
        WarpZone_FixView();
        //WarpZone_FixPMove();
 
+       vector ov_org = '0 0 0';
+       if(autocvar_cl_orthoview)
+       {
+               #define FL2VEC(x,y,z) (('1 0 0' * x) + ('0 1 0' * y) + ('0 0 1' * z))
+               
+               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; }
+               ov_org = ((mi_picmax + mi_picmin) * 0.5);
+               ov_org = FL2VEC(ov_org_x, ov_org_y, (ov_org_z * ov_distance));
+
+               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');
+       }
+
        // Render the Scene
        view_origin = getpropertyvec(VF_ORIGIN);
        view_angles = getpropertyvec(VF_ANGLES);
@@ -689,7 +739,8 @@ void CSQC_UpdateView(float w, float h)
        vid_conheight = autocvar_vid_conheight;
        vid_pixelheight = autocvar_vid_pixelheight;
 
-       setproperty(VF_FOV, GetCurrentFov(fov));
+       if(autocvar_cl_orthoview) { setproperty(VF_FOV, GetOrthoviewFOV(ov_org)); }
+       else { setproperty(VF_FOV, GetCurrentFov(fov)); }
 
        // Camera for demo playback
        if(camera_active)
index 8175695abb0ac5ef0a4c033e671a742a907776fb..c489f1ea1f62230510f7542d68be52df1fe9d2ee 100644 (file)
@@ -54,6 +54,7 @@ float autocvar_cl_gunalign;
 float autocvar_cl_hidewaypoints;
 float autocvar_cl_lockview;
 float autocvar_cl_nogibs;
+var float autocvar_cl_orthoview = TRUE;
 float autocvar_cl_particlegibs;
 float autocvar_cl_particles_oldnexbeam;
 float autocvar_cl_particles_quality;