]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - client.h
sv_airstrafeaccel_qw cvar for tuning CPMA-style physics
[xonotic/darkplaces.git] / client.h
index c6a347fa1b64bd653d01723dd78e652f34e327b0..8a8e192c9f70ee5108a4eacb962e1481c849c452 100644 (file)
--- a/client.h
+++ b/client.h
@@ -25,16 +25,43 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "matrixlib.h"
 #include "snd_main.h"
 
-// LordHavoc: 256 dynamic lights
-#define MAX_DLIGHTS 256
-
-/// this is the maximum number of input packets that can be predicted
-#define CL_MAX_USERCMDS 128
-
 // flags for rtlight rendering
 #define LIGHTFLAG_NORMALMODE 1
 #define LIGHTFLAG_REALTIMEMODE 2
 
+typedef struct tridecal_s
+{
+       // color and initial alpha value
+       float                   texcoord2f[3][2];
+       float                   vertex3f[3][3];
+       unsigned char   color4ub[3][4];
+       // how long this decal has lived so far (the actual fade begins at cl_decals_time)
+       float                   lived;
+       // if >= 0 this indicates the decal should follow an animated triangle
+       int                             triangleindex;
+       // for visibility culling
+       int                             surfaceindex;
+       // old decals are killed to obey cl_decals_max
+       int                             decalsequence;
+}
+tridecal_t;
+
+typedef struct decalsystem_s
+{
+       dp_model_t *model;
+       double lastupdatetime;
+       int maxdecals;
+       int freedecal;
+       int numdecals;
+       tridecal_t *decals;
+       float *vertex3f;
+       float *texcoord2f;
+       float *color4f;
+       int *element3i;
+       unsigned short *element3s;
+}
+decalsystem_t;
+
 typedef struct effect_s
 {
        int active;
@@ -114,8 +141,31 @@ typedef struct rtlight_s
        float corona_visibility;
        unsigned int corona_queryindex_visiblepixels;
        unsigned int corona_queryindex_allpixels;
-       /// this is R_Shadow_Cubemap(rtlight->cubemapname)
+       /// this is R_GetCubemap(rtlight->cubemapname)
        rtexture_t *currentcubemap;
+       /// set by R_Shadow_PrepareLight to decide whether R_Shadow_DrawLight should draw it
+       qboolean draw;
+       /// these fields are set by R_Shadow_PrepareLight for later drawing
+       int cached_numlightentities;
+       int cached_numlightentities_noselfshadow;
+       int cached_numshadowentities;
+       int cached_numshadowentities_noselfshadow;
+       int cached_numsurfaces;
+       struct entity_render_s **cached_lightentities;
+       struct entity_render_s **cached_lightentities_noselfshadow;
+       struct entity_render_s **cached_shadowentities;
+       struct entity_render_s **cached_shadowentities_noselfshadow;
+       unsigned char *cached_shadowtrispvs;
+       unsigned char *cached_lighttrispvs;
+       int *cached_surfacelist;
+       // reduced light cullbox from GetLightInfo
+       vec3_t cached_cullmins;
+       vec3_t cached_cullmaxs;
+       // current shadow-caster culling planes based on view
+       // (any geometry outside these planes can not contribute to the visible
+       //  shadows in any way, and thus can be culled safely)
+       int cached_numfrustumplanes;
+       mplane_t cached_frustumplanes[5]; // see R_Shadow_ComputeShadowCasterCullingPlanes
 
        /// static light info
        /// true if this light should be compiled as a static light
@@ -149,6 +199,9 @@ typedef struct rtlight_s
        /// (important on big surfaces such as terrain)
        int static_numlighttrispvsbytes;
        unsigned char *static_lighttrispvs;
+       /// masks of all shadowmap sides that have any potential static receivers or casters
+       int static_shadowmap_receivers;
+       int static_shadowmap_casters;
 }
 rtlight_t;
 
@@ -241,7 +294,7 @@ framegroupblend_t;
 // note: technically each framegroupblend can produce two of these, but that
 // never happens in practice because no one blends between more than 2
 // framegroups at once
-#define MAX_FRAMEBLENDS MAX_FRAMEGROUPBLENDS
+#define MAX_FRAMEBLENDS (MAX_FRAMEGROUPBLENDS * 2)
 typedef struct frameblend_s
 {
        int subframe;
@@ -306,15 +359,31 @@ typedef struct entity_render_s
        vec3_t mins, maxs;
        // subframe numbers (-1 if not used) and their blending scalers (0-1), if interpolation is not desired, use subframeblend[0].subframe
        frameblend_t frameblend[MAX_FRAMEBLENDS];
-
-       // animation cache index
-       int animcacheindex;
+       // skeletal animation data (if skeleton.relativetransforms is not NULL, it overrides frameblend)
+       skeleton_t *skeleton;
+
+       // animation cache (pointers allocated using R_FrameData_Alloc)
+       // ONLY valid during R_RenderView!  may be NULL (not cached)
+       float *animcache_vertex3f;
+       float *animcache_normal3f;
+       float *animcache_svector3f;
+       float *animcache_tvector3f;
+       // interleaved arrays for rendering and dynamic vertex buffers for them
+       r_vertexposition_t *animcache_vertexposition;
+       r_meshbuffer_t *animcache_vertexpositionbuffer;
+       r_vertexmesh_t *animcache_vertexmesh;
+       r_meshbuffer_t *animcache_vertexmeshbuffer;
 
        // 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
 
+       // storage of decals on this entity
+       // (note: if allowdecals is set, be sure to call R_DecalSystem_Reset on removal!)
+       int allowdecals;
+       decalsystem_t decalsystem;
+
        // FIELDS UPDATED BY RENDERER:
        // last time visible during trace culling
        double last_trace_visibility;
@@ -414,6 +483,7 @@ typedef struct scoreboard_s
        float   qw_entertime;
        int             qw_ping;
        int             qw_packetloss;
+       int             qw_movementloss;
        int             qw_spectator;
        char    qw_team[8];
        char    qw_skin[MAX_QPATH];
@@ -442,9 +512,6 @@ typedef struct cshift_s
 
 #define        SIGNONS         4                       // signon messages to receive before connected
 
-#define        MAX_DEMOS               8
-#define        MAX_DEMONAME    16
-
 typedef enum cactive_e
 {
        ca_uninitialized,       // during early startup
@@ -696,7 +763,7 @@ typedef struct particletype_s
 }
 particletype_t;
 
-typedef enum
+typedef enum ptype_e
 {
        pt_dead, pt_alphastatic, pt_static, pt_spark, pt_beam, pt_rain, pt_raindecal, pt_snow, pt_bubble, pt_blood, pt_smoke, pt_decal, pt_entityparticle, pt_total
 }
@@ -707,6 +774,7 @@ typedef struct decal_s
        // fields used by rendering:  (44 bytes)
        unsigned short  typeindex;
        unsigned short  texnum;
+       int                             decalsequence;
        vec3_t                  org;
        vec3_t                  normal;
        float                   size;
@@ -726,33 +794,43 @@ decal_t;
 
 typedef struct particle_s
 {
-       // fields used by rendering: (40 bytes)
+       // for faster batch rendering, particles are rendered in groups by effect (resulting in less perfect sorting but far less state changes)
+
+       // fields used by rendering: (48 bytes)
+       vec3_t          sortorigin; // sort by this group origin, not particle org
+       vec3_t          org;
+       vec3_t          vel; // velocity of particle, or orientation of decal, or end point of beam
+       float           size;
+       float           alpha; // 0-255
+       float           stretch; // only for sparks
+
+       // fields not used by rendering:  (44 bytes)
+       float           stainsize;
+       float           stainalpha;
+       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)
+//     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
+
+       // short variables grouped to save memory (4 bytes)
+       short                   angle; // base rotation of particle
+       short                   spin; // geometry rotation speed around the particle center normal
+
+       // byte variables grouped to save memory (12 bytes)
+       unsigned char   color[3];
+       unsigned char   qualityreduction; // enables skipping of this particle according to r_refdef.view.qualityreduction
        unsigned char   typeindex;
-       pblend_t   blendmode;
-       porientation_t   orientation;
+       unsigned char   blendmode;
+       unsigned char   orientation;
        unsigned char   texnum;
-       vec3_t                  org;
-       vec3_t                  vel; // velocity of particle, or orientation of decal, or end point of beam
-       float                   size;
-       float                   alpha; // 0-255
-       unsigned char   color[3];
-       unsigned char   qualityreduction; // enables skipping of this particle according to r_refdef.view.qualityreduction
-       float           stretch; // only for sparks
-       int             staincolor;
+       unsigned char   staincolor[3];
        signed char     staintexnum;
-       float           stainsizefactor;
-
-       // 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)
-       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
 }
 particle_t;
 
@@ -859,6 +937,17 @@ typedef struct client_state_s
        // whether the replay should allow a jump at the first sequence
        qboolean movement_replay_canjump;
 
+       // previous gun angles (for leaning effects)
+       vec3_t gunangles_prev;
+       vec3_t gunangles_highpass;
+       vec3_t gunangles_adjustment_lowpass;
+       vec3_t gunangles_adjustment_highpass;
+       // previous gun angles (for leaning effects)
+       vec3_t gunorg_prev;
+       vec3_t gunorg_highpass;
+       vec3_t gunorg_adjustment_lowpass;
+       vec3_t gunorg_adjustment_highpass;
+
 // pitch drifting vars
        float idealpitch;
        float pitchvel;
@@ -870,6 +959,7 @@ typedef struct client_state_s
        float sensitivityscale;
        csqc_vidvars_t csqc_vidvars;    //[515]: these parms must be set to true by default
        qboolean csqc_wantsmousemove;
+       qboolean csqc_paused; // vortex: int because could be flags
        struct model_s *csqc_model_precache[MAX_MODELS];
 
        // local amount for smoothing stepups
@@ -921,7 +1011,11 @@ typedef struct client_state_s
        char sound_name[MAX_SOUNDS][MAX_QPATH];
 
        // for display on solo scoreboard
-       char levelname[40];
+       char worldmessage[40]; // map title (not related to filename)
+       // variants of map name
+       char worldbasename[MAX_QPATH]; // %s
+       char worldname[MAX_QPATH]; // maps/%s.bsp
+       char worldnamenoextension[MAX_QPATH]; // maps/%s
        // cl_entitites[cl.viewentity] = player
        int viewentity;
        // the real player entity (normally same as viewentity,
@@ -980,8 +1074,10 @@ typedef struct client_state_s
 
        // entity database stuff
        // latest received entity frame numbers
-#define LATESTFRAMENUMS 3
+#define LATESTFRAMENUMS 32
+       int latestframenumsposition;
        int latestframenums[LATESTFRAMENUMS];
+       int latestsendnums[LATESTFRAMENUMS];
        entityframe_database_t *entitydatabase;
        entityframe4_database_t *entitydatabase4;
        entityframeqw_database_t *entitydatabaseqw;
@@ -996,7 +1092,11 @@ typedef struct client_state_s
        vec3_t playercrouchmins;
        vec3_t playercrouchmaxs;
 
+       // old decals are killed based on this
+       int decalsequence;
+
        int max_entities;
+       int max_csqcrenderentities;
        int max_static_entities;
        int max_effects;
        int max_beams;
@@ -1008,6 +1108,7 @@ typedef struct client_state_s
        int max_showlmps;
 
        entity_t *entities;
+       entity_render_t *csqcrenderentities;
        unsigned char *entities_active;
        entity_t *static_entities;
        cl_effect_t *effects;
@@ -1090,7 +1191,9 @@ typedef struct client_state_s
        float movevars_airstopaccelerate;
        float movevars_airstrafeaccelerate;
        float movevars_maxairstrafespeed;
+       float movevars_airstrafeaccel_qw;
        float movevars_aircontrol;
+       float movevars_aircontrol_power;
        float movevars_warsowbunny_airforwardaccel;
        float movevars_warsowbunny_accel;
        float movevars_warsowbunny_topspeed;
@@ -1190,6 +1293,7 @@ extern cvar_t m_side;
 
 extern cvar_t cl_autodemo;
 extern cvar_t cl_autodemo_nameformat;
+extern cvar_t cl_autodemo_delete;
 
 extern cvar_t r_draweffects;
 
@@ -1202,6 +1306,7 @@ extern cvar_t cl_stainmaps;
 extern cvar_t cl_stainmaps_clearonload;
 
 extern cvar_t cl_prydoncursor;
+extern cvar_t cl_prydoncursor_notrace;
 
 extern cvar_t cl_locs_enable;
 
@@ -1263,6 +1368,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_ExpandCSQCRenderEntities(int num);
 void CL_SetInfo(const char *key, const char *value, qboolean send, qboolean allowstarkey, qboolean allowmodel, qboolean quiet);
 
 
@@ -1325,6 +1431,9 @@ extern cvar_t cl_particles_size;
 extern cvar_t cl_particles_quake;
 extern cvar_t cl_particles_blood;
 extern cvar_t cl_particles_blood_alpha;
+extern cvar_t cl_particles_blood_decal_alpha;
+extern cvar_t cl_particles_blood_decal_scalemin;
+extern cvar_t cl_particles_blood_decal_scalemax;
 extern cvar_t cl_particles_blood_bloodhack;
 extern cvar_t cl_particles_bulletimpacts;
 extern cvar_t cl_particles_explosions_sparks;
@@ -1343,7 +1452,7 @@ extern cvar_t cl_decals_fadetime;
 void CL_Particles_Clear(void);
 void CL_Particles_Init(void);
 void CL_Particles_Shutdown(void);
-particle_t *CL_NewParticle(unsigned short ptypeindex, int pcolor1, int pcolor2, int ptex, float psize, float psizeincrease, float palpha, float palphafade, float pgravity, float pbounce, float px, float py, float pz, float pvx, float pvy, float pvz, float pairfriction, float pliquidfriction, float originjitter, float velocityjitter, qboolean pqualityreduction, float lifetime, float stretch, pblend_t blendmode, porientation_t orientation, int staincolor1, int staincolor2, int staintex);
+particle_t *CL_NewParticle(const vec3_t sortorigin, unsigned short ptypeindex, int pcolor1, int pcolor2, int ptex, float psize, float psizeincrease, float palpha, float palphafade, float pgravity, float pbounce, float px, float py, float pz, float pvx, float pvy, float pvz, float pairfriction, float pliquidfriction, float originjitter, float velocityjitter, qboolean pqualityreduction, float lifetime, float stretch, pblend_t blendmode, porientation_t orientation, int staincolor1, int staincolor2, int staintex, float stainalpha, float stainsize, float angle, float spin, float tint[4]);
 
 typedef enum effectnameindex_s
 {
@@ -1390,7 +1499,7 @@ effectnameindex_t;
 int CL_ParticleEffectIndexForName(const char *name);
 const char *CL_ParticleEffectNameForIndex(int i);
 void CL_ParticleEffect(int effectindex, float pcount, const vec3_t originmins, const vec3_t originmaxs, const vec3_t velocitymins, const vec3_t velocitymaxs, entity_t *ent, int palettecolor);
-void CL_ParticleTrail(int effectindex, float pcount, const vec3_t originmins, const vec3_t originmaxs, const vec3_t velocitymins, const vec3_t velocitymaxs, entity_t *ent, int palettecolor, qboolean spawndlight, qboolean spawnparticles);
+void CL_ParticleTrail(int effectindex, float pcount, const vec3_t originmins, const vec3_t originmaxs, const vec3_t velocitymins, const vec3_t velocitymaxs, entity_t *ent, int palettecolor, qboolean spawndlight, qboolean spawnparticles, float tintmins[4], float tintmaxs[4]);
 void CL_ParseParticleEffect (void);
 void CL_ParticleCube (const vec3_t mins, const vec3_t maxs, const vec3_t dir, int count, int colorbase, vec_t gravity, vec_t randomvel);
 void CL_ParticleRain (const vec3_t mins, const vec3_t maxs, const vec3_t dir, int count, int colorbase, int type);
@@ -1407,9 +1516,8 @@ void Debug_PolygonEnd(void);
 
 extern qboolean sb_showscores;
 
-float FogPoint_World(const vec3_t p);
-float FogPoint_Model(const vec3_t p);
-float FogForDistance(vec_t dist);
+float RSurf_FogVertex(const vec3_t p);
+float RSurf_FogPoint(const vec3_t p);
 
 typedef struct r_refdef_stats_s
 {
@@ -1424,7 +1532,8 @@ typedef struct r_refdef_stats_s
        int lightmapupdates;
        int lightmapupdatepixels;
        int particles;
-       int decals;
+       int drawndecals;
+       int totaldecals;
        int meshes;
        int meshes_elements;
        int lights;
@@ -1436,6 +1545,10 @@ typedef struct r_refdef_stats_s
        int bloom;
        int bloom_copypixels;
        int bloom_drawpixels;
+       int indexbufferuploadcount;
+       int indexbufferuploadsize;
+       int vertexbufferuploadcount;
+       int vertexbufferuploadsize;
 }
 r_refdef_stats_t;
 
@@ -1451,7 +1564,6 @@ r_viewport_type_t;
 
 typedef struct r_viewport_s
 {
-       double m[16];
        matrix4x4_t cameramatrix; // from entity (transforms from camera entity to world)
        matrix4x4_t viewmatrix; // actual matrix for rendering (transforms to viewspace)
        matrix4x4_t projectmatrix; // actual projection matrix (transforms from viewspace to screen)
@@ -1462,6 +1574,7 @@ typedef struct r_viewport_s
        int height;
        int depth;
        r_viewport_type_t type;
+       float screentodepth[2]; // used by deferred renderer to calculate linear depth from device depth coordinates
 }
 r_viewport_t;
 
@@ -1530,19 +1643,24 @@ r_refdef_view_t;
 
 typedef struct r_refdef_viewcache_s
 {
+       // updated by gl_main_newmap()
+       int maxentities;
+       int world_numclusters;
+       int world_numclusterbytes;
+       int world_numleafs;
+       int world_numsurfaces;
+
        // these properties are generated by R_View_Update()
 
        // which entities are currently visible for this viewpoint
        // (the used range is 0...r_refdef.scene.numentities)
-       unsigned char entityvisible[MAX_EDICTS];
+       unsigned char *entityvisible;
+
        // 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.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.scene.worldmodel->brush.num_leafs
-       unsigned char world_leafvisible[32768]; // FIXME: buffer overflow on huge maps
-       // TODO: dynamic resize according to r_refdef.scene.worldmodel->num_surfaces
-       unsigned char world_surfacevisible[262144]; // FIXME: buffer overflow on huge maps
+       unsigned char *world_pvsbits;
+       unsigned char *world_leafvisible;
+       unsigned char *world_surfacevisible;
        // if true, the view is currently in a leaf without pvs data
        qboolean world_novis;
 }
@@ -1579,10 +1697,10 @@ typedef struct r_refdef_scene_s {
        int numlights;
 
        // intensities for light styles right now, controls rtlights
-       float rtlightstylevalue[256];   // float fraction of base light value
+       float rtlightstylevalue[MAX_LIGHTSTYLES];       // 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
+       unsigned short lightstylevalue[MAX_LIGHTSTYLES];        // 8.8 fraction of base light value
 
        float ambient;
 
@@ -1617,10 +1735,14 @@ typedef struct r_refdef_s
 
        r_refdef_scene_t scene;
 
-       vec3_t fogcolor;
-       vec_t fogrange;
-       vec_t fograngerecip;
-       vec_t fogmasktabledistmultiplier;
+       float fogplane[4];
+       float fogplaneviewdist;
+       qboolean fogplaneviewabove;
+       float fogheightfade;
+       float fogcolor[3];
+       float fogrange;
+       float fograngerecip;
+       float fogmasktabledistmultiplier;
 #define FOGMASKTABLEWIDTH 1024
        float fogmasktable[FOGMASKTABLEWIDTH];
        float fogmasktable_start, fogmasktable_alpha, fogmasktable_range, fogmasktable_density;
@@ -1631,9 +1753,20 @@ typedef struct r_refdef_s
        float fog_alpha;
        float fog_start;
        float fog_end;
+       float fog_height;
+       float fog_fadedepth;
        qboolean fogenabled;
        qboolean oldgl_fogenable;
 
+       // new flexible texture height fog (overrides normal fog)
+       char fog_height_texturename[64]; // note: must be 64 for the sscanf code
+       unsigned char *fog_height_table1d;
+       unsigned char *fog_height_table2d;
+       int fog_height_tablesize; // enable
+       float fog_height_tablescale;
+       float fog_height_texcoordscale;
+       char fogheighttexturename[64]; // detects changes to active fog height texture
+
        qboolean draw2dstage;
 
        // true during envmap command capture