]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/samual/orthoview'
authorSamual Lenks <samual@xonotic.org>
Mon, 30 Dec 2013 17:54:49 +0000 (12:54 -0500)
committerSamual Lenks <samual@xonotic.org>
Mon, 30 Dec 2013 17:54:49 +0000 (12:54 -0500)
* origin/samual/orthoview:
  Use vec3 and get rid of FL2VEC -- This function didn't exist when I first made orthoview :)
  Lets just set resolution via a cvar
  Fix issues with FL2VEC
  Fix remaining known issue with orthoview (on abyss, techassault)
  Add definition for orthoview accuracy, plus some final cleanup
  Clean up debug stuff
  Add "set" for orthoview cvars
  Add cvars to defaultXonotic.cfg
  Use r_drawfog 0 while in orthoview
  Fix center of map and distance setting
  On second thought, keep the override cvar
  Use center of world bbox instead of '0 0 0' origin, solves a bug :D
  Fix it so that fov adjusts properly too
  Clean up orthoview maths, add logic for handling r_nearclip and r_farclip
  Working on adding orthoview feature for map screenshots from above

1  2 
qcsrc/client/View.qc

diff --combined qcsrc/client/View.qc
index 48686658e066814f014d2cd409f26c229b17c8f6,d58704803a78808625a1795f8f92ad6137fc0dca..493907a8783a1d37b0e9d37f09412207937892b9
@@@ -199,6 -199,17 +199,17 @@@ vector GetCurrentFov(float fov
        return '1 0 0' * fovx + '0 1 0' * fovy;
  }
  
+ vector GetOrthoviewFOV(vector ov_worldmin, vector ov_worldmax, vector ov_mid, vector ov_org)
+ {
+       float fovx, fovy;
+       float width = (ov_worldmax_x - ov_worldmin_x);
+       float height = (ov_worldmax_y - ov_worldmin_y);
+       float distance_to_middle_of_world = vlen(ov_mid - 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;
  
@@@ -307,15 -318,13 +318,15 @@@ float TrueAimCheck(
                        break;
        }
  
 +      vector traceorigin = getplayerorigin(player_localentnum-1) + (eZ * getstati(STAT_VIEWHEIGHT));
 +
        vecs = decompressShotOrigin(getstati(STAT_SHOTORG));
  
 -      traceline(view_origin, view_origin + view_forward * MAX_SHOT_DISTANCE, mv, ta);
 +      traceline(traceorigin, traceorigin + view_forward * MAX_SHOT_DISTANCE, mv, ta);
        trueaimpoint = trace_endpos;
  
 -      if(vlen(trueaimpoint - view_origin) < g_trueaim_minrange)
 -              trueaimpoint = view_origin + view_forward * g_trueaim_minrange;
 +      if(vlen(trueaimpoint - traceorigin) < g_trueaim_minrange)
 +              trueaimpoint = traceorigin + view_forward * g_trueaim_minrange;
  
        if(vecs_x > 0)
                vecs_y = -vecs_y;
                vecs = '0 0 0';
  
        dv = view_right * vecs_y + view_up * vecs_z;
 -      w_shotorg = view_origin + dv;
 +      w_shotorg = traceorigin + dv;
  
        // now move the vecs forward as much as requested if possible
        tracebox(w_shotorg, mi, ma, w_shotorg + view_forward * (vecs_x + nudge), MOVE_NORMAL, ta); // FIXME this MOVE_NORMAL part will misbehave a little in csqc
@@@ -481,7 -490,7 +492,7 @@@ void CSQC_UpdateView(float w, float h
        // event chase camera
        if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped
        {
-               if((spectatee_status >= 0 && (autocvar_cl_eventchase_death && is_dead)) || intermission)
+               if(((spectatee_status >= 0 && (autocvar_cl_eventchase_death && is_dead)) || intermission) && !autocvar_cl_orthoview)
                {
                        // make special vector since we can't use view_origin (It is one frame old as of this code, it gets set later with the results this code makes.)
                        vector current_view_origin = (csqcplayer ? csqcplayer.origin : pmove_org);
        WarpZone_FixView();
        //WarpZone_FixPMove();
  
+       vector ov_org = '0 0 0';
+       vector ov_mid = '0 0 0';
+       vector ov_worldmin = '0 0 0';
+       vector ov_worldmax = '0 0 0';
+       if(autocvar_cl_orthoview)
+       {
+               ov_worldmin = mi_picmin;
+               ov_worldmax = mi_picmax;
+               float ov_width = (ov_worldmax_x - ov_worldmin_x);
+               float ov_height = (ov_worldmax_y - ov_worldmin_y);
+               float ov_distance = (autocvar_cl_orthoview_resolution * max(ov_width, ov_height));
+               ov_mid = ((ov_worldmax + ov_worldmin) * 0.5);
+               ov_org = vec3(ov_mid_x, ov_mid_y, (ov_mid_z + ov_distance));
+               float ov_nearest = vlen(ov_org - vec3(
+                       bound(ov_worldmin_x, ov_org_x, ov_worldmax_x),
+                       bound(ov_worldmin_y, ov_org_y, ov_worldmax_y),
+                       bound(ov_worldmin_z, ov_org_z, ov_worldmax_z)
+               ));
+               float ov_furthest = 0;
+               float dist = 0;
+               if((dist = vlen(vec3(ov_worldmin_x, ov_worldmin_y, ov_worldmin_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(vec3(ov_worldmax_x, ov_worldmin_y, ov_worldmin_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(vec3(ov_worldmin_x, ov_worldmax_y, ov_worldmin_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(vec3(ov_worldmin_x, ov_worldmin_y, ov_worldmax_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(vec3(ov_worldmax_x, ov_worldmax_y, ov_worldmin_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(vec3(ov_worldmin_x, ov_worldmax_y, ov_worldmax_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(vec3(ov_worldmax_x, ov_worldmin_y, ov_worldmax_z) - ov_org)) > ov_furthest) { ov_furthest = dist; }
+               if((dist = vlen(vec3(ov_worldmax_x, ov_worldmax_y, ov_worldmax_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_novis", "1");
+               cvar_set("r_useportalculling", "0");
+               cvar_set("r_useinfinitefarclip", "0");
+               setproperty(VF_ORIGIN, ov_org);
+               setproperty(VF_ANGLES, '90 0 0');
+               #if 0
+               print(sprintf("OrthoView: org = %s, angles = %s, distance = %f, nearest = %f, furthest = %f\n",
+                       vtos(ov_org),
+                       vtos(getpropertyvec(VF_ANGLES)),
+                       ov_distance,
+                       ov_nearest,
+                       ov_furthest));
+               #endif
+       }
        // Render the Scene
        view_origin = getpropertyvec(VF_ORIGIN);
        view_angles = getpropertyvec(VF_ANGLES);
        vid_conheight = autocvar_vid_conheight;
        vid_pixelheight = autocvar_vid_pixelheight;
  
-       setproperty(VF_FOV, GetCurrentFov(fov));
+       if(autocvar_cl_orthoview) { setproperty(VF_FOV, GetOrthoviewFOV(ov_worldmin, ov_worldmax, ov_mid, ov_org)); }
+       else { setproperty(VF_FOV, GetCurrentFov(fov)); }
  
        // Camera for demo playback
        if(camera_active)