]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - client.h
fix "wrong ping times" issue once and for all (I don't see another fix that wouldn...
[xonotic/darkplaces.git] / client.h
index 5ffc87a9d90afbe5676f699915ce29829a7a351b..7a96a47568d3e0680ac33850506bde601ae2b319 100644 (file)
--- a/client.h
+++ b/client.h
@@ -27,9 +27,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // LordHavoc: 256 dynamic lights
 #define MAX_DLIGHTS 256
 
-// this is the maximum number of input packets that can be lost without a
-// misprediction
-#define CL_MAX_USERCMDS 16
+// this is the maximum number of input packets that can be predicted
+#define CL_MAX_USERCMDS 256
 
 // flags for rtlight rendering
 #define LIGHTFLAG_NORMALMODE 1
@@ -226,6 +225,12 @@ frameblend_t;
 
 // LordHavoc: this struct is intended for the renderer but some fields are
 // used by the client.
+//
+// The renderer should not rely on any changes to this struct to be persistent
+// across multiple frames because temp entities are wiped every frame, but it
+// is acceptable to cache things in this struct that are not critical.
+//
+// For example the r_cullentities_trace code does such caching.
 typedef struct entity_render_s
 {
        // location
@@ -245,9 +250,7 @@ typedef struct entity_render_s
        model_t *model;
        // number of the entity represents, or 0 for non-network entities
        int entitynumber;
-       // entity shirt and pants colors (-1 if not colormapped)
-       int colormap;
-       // literal colors for renderer
+       // literal colormap colors for renderer, if both are 0 0 0 it is not colormapped
        vec3_t colormap_pantscolor;
        vec3_t colormap_shirtcolor;
        // light, particles, etc
@@ -282,11 +285,12 @@ typedef struct entity_render_s
        // 4 frame numbers (-1 if not used) and their blending scalers (0-1), if interpolation is not desired, use frame instead
        frameblend_t frameblend[4];
 
-       // current lighting from map
+       // current lighting from map (updated ONLY by client code, not renderer)
        vec3_t modellight_ambient;
        vec3_t modellight_diffuse; // q3bsp
        vec3_t modellight_lightdir; // q3bsp
 
+       // FIELDS UPDATED BY RENDERER:
        // last time visible during trace culling
        double last_trace_visibility;
 }
@@ -351,14 +355,21 @@ typedef struct usercmd_s
        vec_t   cursor_fraction;
        int             cursor_entitynumber;
 
-       double time;
-       double receivetime;
-       int msec; // for qw moves
+       double time; // time the move is executed for (cl_movement: clienttime, non-cl_movement: receivetime)
+       double receivetime; // time the move was received at
+       double clienttime; // time to which server state the move corresponds to
+       int msec; // for predicted moves
        int buttons;
        int impulse;
        int sequence;
        qboolean applied; // if false we're still accumulating a move
        qboolean predicted; // if true the sequence should be sent as 0
+
+       // derived properties
+       double frametime;
+       qboolean canjump;
+       qboolean jump;
+       qboolean crouch;
 } usercmd_t;
 
 typedef struct lightstyle_s
@@ -410,6 +421,7 @@ typedef struct cshift_s
 
 typedef enum cactive_e
 {
+       ca_uninitialized,       // during early startup
        ca_dedicated,           // a dedicated server with no ability to start a client
        ca_disconnected,        // full screen console with no connection
        ca_connected            // valid netcon, talking to a server
@@ -479,6 +491,14 @@ typedef struct cl_downloadack_s
 }
 cl_downloadack_t;
 
+typedef struct cl_soundstats_s
+{
+       int mixedsounds;
+       int totalsounds;
+       int latency_milliseconds;
+}
+cl_soundstats_t;
+
 //
 // the client_static_t structure is persistent through an arbitrary number
 // of server connections
@@ -507,21 +527,22 @@ typedef struct client_static_s
        // -1 = use normal cd track
        int forcetrack;
        qfile_t *demofile;
-       // to meter out one message a frame
-       int td_lastframe;
-       // host_framecount at start
-       int td_startframe;
        // realtime at second frame of timedemo (LordHavoc: changed to double)
        double td_starttime;
+       int td_frames; // total frames parsed
        double td_onesecondnexttime;
        double td_onesecondframes;
-       double td_onesecondminframes;
-       double td_onesecondmaxframes;
-       double td_onesecondavgframes;
+       double td_onesecondrealtime;
+       double td_onesecondminfps;
+       double td_onesecondmaxfps;
+       double td_onesecondavgfps;
        int td_onesecondavgcount;
        // LordHavoc: pausedemo
        qboolean demopaused;
 
+       // sound mixer statistics for showsound display
+       cl_soundstats_t soundstats;
+
        qboolean connect_trying;
        int connect_remainingtries;
        double connect_nextsendtime;
@@ -637,14 +658,18 @@ ptype_t;
 
 typedef struct decal_s
 {
+       // fields used by rendering:  (40 bytes)
        unsigned short  typeindex;
        unsigned short  texnum;
        vec3_t                  org;
        vec3_t                  normal;
        float                   size;
        float                   alpha; // 0-255
-       float                   time2; // used for snow fluttering and decal fade
-       unsigned char   color[4];
+       unsigned char   color[3];
+       unsigned char   unused1;
+
+       // fields not used by rendering: (36 bytes in 32bit, 40 bytes in 64bit)
+       float                   time2; // used for decal fade
        unsigned int    owner; // decal stuck to this entity
        model_t                 *ownermodel; // model the decal is stuck to (used to make sure the entity is still alive)
        vec3_t                  relativeorigin; // decal at this location in entity's coordinate space
@@ -654,20 +679,24 @@ decal_t;
 
 typedef struct particle_s
 {
+       // fields used by rendering: (40 bytes)
        unsigned short  typeindex;
        unsigned short  texnum;
        vec3_t                  org;
        vec3_t                  vel; // velocity of particle, or orientation of decal, or end point of beam
        float                   size;
-       float                   sizeincrease; // rate of size change per second
        float                   alpha; // 0-255
+       unsigned char   color[3];
+       unsigned char   qualityreduction; // enables skipping of this particle according to r_refdef.view.qualityreduction
+
+       // fields not used by rendering:  (40 bytes)
+       float                   sizeincrease; // rate of size change per second
        float                   alphafade; // how much alpha reduces per second
        float                   time2; // used for snow fluttering and decal fade
        float                   bounce; // how much bounce-back from a surface the particle hits (0 = no physics, 1 = stop and slide, 2 = keep bouncing forever, 1.5 is typical)
        float                   gravity; // how much gravity affects this particle (1.0 = normal gravity, 0.0 = none)
        float                   airfriction; // how much air friction affects this object (objects with a low mass/size ratio tend to get more air friction)
        float                   liquidfriction; // how much liquid friction affects this object (objects with a low mass/size ratio tend to get more liquid friction)
-       unsigned char   color[4];
        float                   delayedcollisions; // time that p->bounce becomes active
        float                   delayedspawn; // time that particle appears and begins moving
        float                   die; // time when this particle should be removed, regardless of alpha
@@ -771,18 +800,9 @@ typedef struct client_state_s
        qboolean movement_predicted;
        // if true the CL_ClientMovement_Replay function will update origin, etc
        qboolean movement_replay;
-       // this is set true by svc_time parsing and causes a new movement to be
-       // queued for prediction purposes
-       qboolean movement_needupdate;
-       // timestamps of latest two predicted moves for interpolation
-       double movement_time[4];
        // simulated data (this is valid even if cl.movement is false)
        vec3_t movement_origin;
-       vec3_t movement_oldorigin;
        vec3_t movement_velocity;
-       // queue of proposed moves
-       int movement_numqueue;
-       client_movementqueue_t movement_queue[256];
        // whether the replay should allow a jump at the first sequence
        qboolean movement_replay_canjump;
 
@@ -919,7 +939,6 @@ typedef struct client_state_s
 
        int max_entities;
        int max_static_entities;
-       int max_temp_entities;
        int max_effects;
        int max_beams;
        int max_dlights;
@@ -932,7 +951,6 @@ typedef struct client_state_s
        entity_t *entities;
        unsigned char *entities_active;
        entity_t *static_entities;
-       entity_t *temp_entities;
        cl_effect_t *effects;
        beam_t *beams;
        dlight_t *dlights;
@@ -944,7 +962,6 @@ typedef struct client_state_s
 
        int num_entities;
        int num_static_entities;
-       int num_temp_entities;
        int num_brushmodel_entities;
        int num_effects;
        int num_beams;
@@ -953,6 +970,8 @@ typedef struct client_state_s
        int num_decals;
        int num_showlmps;
 
+       double particles_updatetime;
+       double decals_updatetime;
        int free_particle;
        int free_decal;
 
@@ -986,11 +1005,13 @@ typedef struct client_state_s
        // use cl.scores[cl.playerentity-1].qw_spectator instead
        //qboolean qw_spectator;
 
+       // last time an input packet was sent
+       double lastpackettime;
+
        // movement parameters for client prediction
        float movevars_wallfriction;
        float movevars_waterfriction;
        float movevars_friction;
-       float movevars_ticrate;
        float movevars_timescale;
        float movevars_gravity;
        float movevars_stopspeed;
@@ -1136,6 +1157,7 @@ void CL_Disconnect (void);
 void CL_Disconnect_f (void);
 
 void CL_UpdateRenderEntity(entity_render_t *ent);
+void CL_SetEntityColormapColors(entity_render_t *ent, int colormap);
 void CL_UpdateViewEntities(void);
 
 //
@@ -1165,7 +1187,7 @@ void CL_Beam_CalculatePositions (const beam_t *b, vec3_t start, vec3_t end);
 void CL_ClientMovement_Replay(void);
 
 void CL_ClearTempEntities (void);
-entity_t *CL_NewTempEntity (void);
+entity_render_t *CL_NewTempEntity (void);
 
 void CL_Effect(vec3_t org, int modelindex, int startframe, int framecount, float framerate);
 
@@ -1177,7 +1199,7 @@ void CL_SetInfo(const char *key, const char *value, qboolean send, qboolean allo
 void CL_UpdateWorld (void);
 void CL_WriteToServer (void);
 void CL_Input (void);
-extern qboolean cl_ignoremousemove;
+extern int cl_ignoremousemoves;
 
 
 float CL_KeyState (kbutton_t *key);
@@ -1300,12 +1322,9 @@ void CL_ParticleRain (const vec3_t mins, const vec3_t maxs, const vec3_t dir, in
 void CL_EntityParticles (const entity_t *ent);
 void CL_ParticleExplosion (const vec3_t org);
 void CL_ParticleExplosion2 (const vec3_t org, int colorStart, int colorLength);
-void CL_MoveDecals(void);
-void CL_MoveParticles(void);
-void R_MoveExplosions(void);
 void R_NewExplosion(const vec3_t org);
 
-void Debug_PolygonBegin(const char *picname, int flags, qboolean draw2d, float linewidth);
+void Debug_PolygonBegin(const char *picname, int flags);
 void Debug_PolygonVertex(float x, float y, float z, float s, float t, float r, float g, float b, float a);
 void Debug_PolygonEnd(void);
 
@@ -1313,14 +1332,13 @@ void Debug_PolygonEnd(void);
 
 extern qboolean sb_showscores;
 
-#define NUMCROSSHAIRS 32
-extern cachepic_t *r_crosshairs[NUMCROSSHAIRS+1];
-
 float FogPoint_World(const vec3_t p);
 float FogPoint_Model(const vec3_t p);
+float FogForDistance(vec_t dist);
 
 typedef struct r_refdef_stats_s
 {
+       int renders;
        int entities;
        int entities_surfaces;
        int entities_triangles;
@@ -1328,6 +1346,8 @@ typedef struct r_refdef_stats_s
        int world_portals;
        int world_surfaces;
        int world_triangles;
+       int lightmapupdates;
+       int lightmapupdatepixels;
        int particles;
        int decals;
        int meshes;
@@ -1344,91 +1364,10 @@ typedef struct r_refdef_stats_s
 }
 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;
-
-       // 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];
-
-       // whether to call S_ExtraUpdate during render to reduce sound chop
-       qboolean extraupdate;
-
-       // client gameworld time for rendering time based effects
-       double time;
-
-       // the world
-       entity_render_t *worldentity;
-
-       // same as worldentity->model
-       model_t *worldmodel;
-
-       // renderable entities (excluding world)
-       entity_render_t **entities;
-       int numentities;
-       int maxentities;
-
-       // renderable dynamic lights
-       rtlight_t lights[MAX_DLIGHTS];
-       int numlights;
-
-       // 8.8bit fixed point intensities for light styles
-       // 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 fogmasktabledistmultiplier;
-#define FOGMASKTABLEWIDTH 1024
-       float fogmasktable[FOGMASKTABLEWIDTH];
-       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
+typedef struct r_refdef_view_s
 {
        // view information (changes multiple times per frame)
-       // if any of these variables change then r_viewcache must be regenerated
+       // if any of these variables change then r_refdef.viewcache must be regenerated
        // by calling R_View_Update
        // (which also updates viewport, scissor, colormask)
 
@@ -1446,7 +1385,7 @@ typedef struct r_view_s
        int numfrustumplanes;
        mplane_t frustum[6];
        qboolean useclipplane;
-       qboolean usecustompvs; // uses r_viewcache.pvsbits as-is rather than computing it
+       qboolean usecustompvs; // uses r_refdef.viewcache.pvsbits as-is rather than computing it
        mplane_t clipplane;
        float frustum_x, frustum_y;
        vec3_t frustumcorner[4];
@@ -1470,6 +1409,8 @@ typedef struct r_view_s
 
        // whether to call R_ClearScreen before rendering stuff
        qboolean clear;
+       // if true, don't clear or do any post process effects (bloom, etc)
+       qboolean isoverlay;
 
        // whether to draw r_showtris and such, this is only true for the main
        // view render, all secondary renders (HDR, mirrors, portals, cameras,
@@ -1479,32 +1420,138 @@ typedef struct r_view_s
        // these define which values to use in GL_CullFace calls to request frontface or backface culling
        int cullface_front;
        int cullface_back;
+
+       // render quality (0 to 1) - affects r_drawparticles_drawdistance and others
+       float quality;
 }
-r_view_t;
+r_refdef_view_t;
 
-typedef struct r_viewcache_s
+typedef struct r_refdef_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)
+       // (the used range is 0...r_refdef.scene.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
+       // TODO: dynamic resize according to r_refdef.scene.worldmodel->brush.num_clusters
        unsigned char world_pvsbits[(32768+7)>>3]; // FIXME: buffer overflow on huge maps
-       // TODO: dynamic resize according to r_refdef.worldmodel->brush.num_leafs
+       // TODO: dynamic resize according to r_refdef.scene.worldmodel->brush.num_leafs
        unsigned char world_leafvisible[32768]; // FIXME: buffer overflow on huge maps
-       // TODO: dynamic resize according to r_refdef.worldmodel->num_surfaces
+       // TODO: dynamic resize according to r_refdef.scene.worldmodel->num_surfaces
        unsigned char world_surfacevisible[262144]; // FIXME: buffer overflow on huge maps
        // if true, the view is currently in a leaf without pvs data
        qboolean world_novis;
 }
-r_viewcache_t;
+r_refdef_viewcache_t;
+
+// TODO: really think about which fields should go into scene and which one should stay in refdef [1/7/2008 Black]
+// maybe also refactor some of the functions to support different setting sources (ie. fogenabled, etc.) for different scenes
+typedef struct r_refdef_scene_s {
+       // whether to call S_ExtraUpdate during render to reduce sound chop
+       qboolean extraupdate;
+
+       // (client gameworld) time for rendering time based effects
+       double time;
+
+       // the world
+       entity_render_t *worldentity;
+
+       // same as worldentity->model
+       model_t *worldmodel;
+
+       // renderable entities (excluding world)
+       entity_render_t **entities;
+       int numentities;
+       int maxentities;
+
+       // field of temporary entities that is reset each (client) frame
+       entity_render_t *tempentities;
+       int numtempentities;
+       int maxtempentities;
+
+       // renderable dynamic lights
+       rtlight_t lights[MAX_DLIGHTS];
+       int numlights;
+
+       // intensities for light styles right now, controls rtlights
+       float rtlightstylevalue[256];   // float fraction of base light value
+       // 8.8bit fixed point intensities for light styles
+       // controls intensity lightmap layers
+       unsigned short lightstylevalue[256];    // 8.8 fraction of base light value
+
+       float ambient;
+
+       qboolean rtworld;
+       qboolean rtworldshadows;
+       qboolean rtdlight;
+       qboolean rtdlightshadows;
+} r_refdef_scene_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;
+
+       // current view settings (these get reset a few times during rendering because of water rendering, reflections, etc)
+       r_refdef_view_t view;
+       r_refdef_viewcache_t viewcache;
+
+       // 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];
+
+       r_refdef_scene_t scene;
+
+       vec3_t fogcolor;
+       vec_t fogrange;
+       vec_t fograngerecip;
+       vec_t fogmasktabledistmultiplier;
+#define FOGMASKTABLEWIDTH 1024
+       float fogmasktable[FOGMASKTABLEWIDTH];
+       float fogmasktable_start, fogmasktable_alpha, fogmasktable_range, fogmasktable_density;
+       float fog_density;
+       float fog_red;
+       float fog_green;
+       float fog_blue;
+       float fog_alpha;
+       float fog_start;
+       float fog_end;
+       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
+       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;
 
 extern r_refdef_t r_refdef;
-extern r_view_t r_view;
-extern r_viewcache_t r_viewcache;
 
 #endif