entity porto;
vector polyline[16];
-float Q3SURFACEFLAG_SLICK = 2; // low friction surface
-float DPCONTENTS_SOLID = 1; // blocks player movement
-float DPCONTENTS_BODY = 32; // blocks player movement
-float DPCONTENTS_CORPSE = 64; // blocks player movement
-float DPCONTENTS_PLAYERCLIP = 256; // blocks player movement
void Porto_Draw()
{
vector p, dir, ang, q, nextdir;
if(autocvar_cl_velocityzoom && autocvar_cl_velocityzoom_type) // _type = 0 disables velocity zoom too
{
- v = pmove_vel;
- if(csqcplayer)
- v = csqcplayer.velocity;
-
- switch(autocvar_cl_velocityzoom_type)
+ if(intermission) { curspeed = 0; }
+ else
{
- case 3: curspeed = max(0, v_forward * v); break;
- case 2: curspeed = (v_forward * v); break;
- case 1: default: curspeed = vlen(v); break;
+ v = pmove_vel;
+ if(csqcplayer)
+ v = csqcplayer.velocity;
+
+ switch(autocvar_cl_velocityzoom_type)
+ {
+ case 3: curspeed = max(0, v_forward * v); break;
+ case 2: curspeed = (v_forward * v); break;
+ case 1: default: curspeed = vlen(v); break;
+ }
}
velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoom_time), 1); // speed at which the zoom adapts to player velocity
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;
void CSQC_Demo_Camera();
float HUD_WouldDrawScoreboard();
float camera_mode;
-float CAMERA_FREE = 1;
-float CAMERA_CHASE = 2;
+const float CAMERA_FREE = 1;
+const float CAMERA_CHASE = 2;
float reticle_type;
string NextFrameCommand;
void CSQC_SPIDER_HUD();
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();
// 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)
{
// 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';
+ 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);
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)
// the view to go back to normal, so reticle_type would become 0 as we fade out)
if(spectatee_status || is_dead || hud != HUD_NORMAL)
reticle_type = 0; // prevent reticle from showing during the respawn zoom effect or for spectators
- else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_RIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
+ else if((activeweapon == WEP_NEX || activeweapon == WEP_RIFLE || activeweapon == WEP_MINSTANEX) && (button_zoom || zoomscript_caught))
reticle_type = 2; // nex zoom
else if(button_zoom || zoomscript_caught)
reticle_type = 1; // normal zoom
- else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_RIFLE && button_attack2)
+ else if((activeweapon == WEP_NEX) && button_attack2)
reticle_type = 2; // nex zoom
if(reticle_type && autocvar_cl_reticle)
if(hit_time > nextsound_hit_time && autocvar_cl_hitsound)
{
if(time - hit_time < MAX_TIME_DIFF) // don't play the sound if it's too old.
- sound(world, CH_INFO, "misc/hit.wav", VOL_BASE, ATTN_NONE);
+ sound(world, CH_INFO, "misc/hit.wav", VOL_BASE, ATTEN_NONE);
nextsound_hit_time = time + autocvar_cl_hitsound_antispam_time;
}
if(typehit_time > nextsound_typehit_time)
{
if(time - typehit_time < MAX_TIME_DIFF) // don't play the sound if it's too old.
- sound(world, CH_INFO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+ sound(world, CH_INFO, "misc/typehit.wav", VOL_BASE, ATTEN_NONE);
nextsound_typehit_time = time + autocvar_cl_hitsound_antispam_time;
}