]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - client.h
fixed crashes when changing a few settings while playing a demo
[xonotic/darkplaces.git] / client.h
index 260bfc0f2492b815eaa22a35927ae7713e2f9603..f9b16e3910876fc25b50e56a42bb4814f6642a0d 100644 (file)
--- a/client.h
+++ b/client.h
@@ -259,8 +259,6 @@ typedef struct entity_render_s
 
        // calculated by the renderer (but not persistent)
 
-       // if visframe == r_framecount, it is visible
-       int visframe;
        // calculated during R_AddModelEntities
        vec3_t mins, maxs;
        // 4 frame numbers (-1 if not used) and their blending scalers (0-1), if interpolation is not desired, use frame instead
@@ -476,6 +474,9 @@ typedef struct client_static_s
 
        // value of "qport" cvar at time of connection
        int qw_qport;
+       // copied from cls.netcon->qw. variables every time they change, or set by demos (which have no cls.netcon)
+       int qw_incoming_sequence;
+       int qw_outgoing_sequence;
 
        // current file download buffer (only saved when file is completed)
        char qw_downloadname[MAX_QPATH];
@@ -653,6 +654,12 @@ typedef struct client_state_s
        vec3_t mvelocity[2], velocity;
        // update by server, can be used by mods for zooming
        vec_t mviewzoom[2], viewzoom;
+       // if true interpolation the mviewangles and other interpolation of the
+       // player is disabled until the next network packet
+       // this is used primarily by teleporters, and when spectating players
+       // special checking of the old fixangle[1] is used to differentiate
+       // between teleporting and spectating
+       qboolean fixangle[2];
 
        // client movement simulation
        // these fields are only updated by CL_ClientMovement (called by CL_SendMove after parsing each network packet)
@@ -662,6 +669,8 @@ typedef struct client_state_s
        qboolean movement_needupdate;
        // indicates the queue has been updated and should be replayed
        qboolean movement_replay;
+       // timestamps of latest two predicted moves for interpolation
+       double movement_time[2];
        // simulated data (this is valid even if cl.movement is false)
        vec3_t movement_origin;
        vec3_t movement_oldorigin;
@@ -671,6 +680,8 @@ typedef struct client_state_s
        client_movementqueue_t movement_queue[64];
        int movesequence;
        int servermovesequence;
+       // whether the replay should allow a jump at the first sequence
+       qboolean movement_replay_canjump;
 
 // pitch drifting vars
        float idealpitch;
@@ -986,6 +997,7 @@ void CL_Effect(vec3_t org, int modelindex, int startframe, int framecount, float
 
 void CL_ClearState (void);
 void CL_ExpandEntities(int num);
+void CL_SetInfo(const char *key, const char *value, qboolean send, qboolean allowstarkey, qboolean allowmodel, qboolean quiet);
 
 
 int  CL_ReadFromServer (void);
@@ -1123,21 +1135,47 @@ void R_NewExplosion(const vec3_t org);
 #define NUMCROSSHAIRS 32
 extern cachepic_t *r_crosshairs[NUMCROSSHAIRS+1];
 
-typedef struct refdef_s
+#define FOGTABLEWIDTH 1024
+extern int fogtableindex;
+#define VERTEXFOGTABLE(dist) (fogtableindex = (int)((dist) * r_refdef.fogtabledistmultiplier), r_refdef.fogtable[bound(0, fogtableindex, FOGTABLEWIDTH - 1)])
+
+typedef struct r_refdef_stats_s
 {
-       // area to render in
-       int x, y, width, height;
-       float frustum_x, frustum_y;
+       int entities;
+       int entities_surfaces;
+       int entities_triangles;
+       int world_leafs;
+       int world_portals;
+       int particles;
+       int meshes;
+       int meshes_elements;
+       int lights;
+       int lights_clears;
+       int lights_scissored;
+       int lights_lighttriangles;
+       int lights_shadowtriangles;
+       int lights_dynamicshadowtriangles;
+       int bloom;
+       int bloom_copypixels;
+       int bloom_drawpixels;
+}
+r_refdef_stats_t;
+
+typedef struct r_refdef_s
+{
+       // these fields define the basic rendering information for the world
+       // but not the view, which could change multiple times in one rendered
+       // frame (for example when rendering textures for certain effects)
 
        // these are set for water warping before
        // frustum_x/frustum_y are calculated
        float frustumscale_x, frustumscale_y;
 
-       // view transform
-       matrix4x4_t viewentitymatrix;
-
-       // which color components to allow (for anaglyph glasses)
-       int colormask[4];
+       // minimum visible distance (pixels closer than this disappear)
+       double nearclip;
+       // maximum visible distance (pixels further than this disappear in 16bpp modes,
+       // in 32bpp an infinite-farclip matrix is used instead)
+       double farclip;
 
        // fullscreen color blend
        float viewblend[4];
@@ -1167,11 +1205,99 @@ typedef struct refdef_s
        // controls intensity of dynamic lights and lightmap layers
        unsigned short  lightstylevalue[256];   // 8.8 fraction of base light value
 
+       vec3_t fogcolor;
+       vec_t fogrange;
+       vec_t fograngerecip;
+       vec_t fogtabledistmultiplier;
+       float fogtable[FOGTABLEWIDTH];
+       float fog_density;
+       float fog_red;
+       float fog_green;
+       float fog_blue;
+       qboolean fogenabled;
+       qboolean oldgl_fogenable;
+
        qboolean draw2dstage;
+
+       // true during envmap command capture
+       qboolean envmap;
+
+       // brightness of world lightmaps and related lighting
+       // (often reduced when world rtlights are enabled)
+       float lightmapintensity;
+       // whether to draw world lights realtime, dlights realtime, and their shadows
+       qboolean rtworld;
+       qboolean rtworldshadows;
+       qboolean rtdlight;
+       qboolean rtdlightshadows;
+       float polygonfactor;
+       float polygonoffset;
+       float shadowpolygonfactor;
+       float shadowpolygonoffset;
+
+       // rendering stats for r_speeds display
+       // (these are incremented in many places)
+       r_refdef_stats_t stats;
+}
+r_refdef_t;
+
+typedef struct r_view_s
+{
+       // view information (changes multiple times per frame)
+       // if any of these variables change then r_viewcache must be regenerated
+       // by calling R_View_Update
+       // (which also updates viewport, scissor, colormask)
+
+       // it is safe and expected to copy this into a structure on the stack and
+       // call the renderer recursively, then restore from the stack afterward
+       // (as long as R_View_Update is called)
+
+       // eye position information
+       matrix4x4_t matrix;
+       vec3_t origin;
+       vec3_t forward;
+       vec3_t left;
+       vec3_t right;
+       vec3_t up;
+       mplane_t frustum[5];
+       float frustum_x, frustum_y;
+
+       // screen area to render in
+       int x;
+       int y;
+       int z;
+       int width;
+       int height;
+       int depth;
+
+       // which color components to allow (for anaglyph glasses)
+       int colormask[4];
+}
+r_view_t;
+
+typedef struct r_viewcache_s
+{
+       // these properties are generated by R_View_Update()
+
+       // which entities are currently visible for this viewpoint
+       // (the used range is 0...r_refdef.numentities)
+       unsigned char entityvisible[MAX_EDICTS];
+       // flag arrays used for visibility checking on world model
+       // (all other entities have no per-surface/per-leaf visibility checks)
+       // TODO: dynamic resize according to r_refdef.worldmodel->brush.num_clusters
+       unsigned char world_pvsbits[(32768+7)>>3];
+       // TODO: dynamic resize according to r_refdef.worldmodel->brush.num_leafs
+       unsigned char world_leafvisible[32768];
+       // TODO: dynamic resize according to r_refdef.worldmodel->num_surfaces
+       unsigned char world_surfacevisible[262144];
+       // if true, the view is currently in a leaf without pvs data
+       qboolean world_novis;
 }
-refdef_t;
+r_viewcache_t;
 
-extern refdef_t r_refdef;
+extern r_refdef_t r_refdef;
+extern r_view_t r_view;
+extern r_viewcache_t r_viewcache;
 
 #endif