]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - client.h
implemented QW skin support, it's broken on skins that are not the same
[xonotic/darkplaces.git] / client.h
index 711ad4e435a9d4b392794181ce6a527a4afd2da1..9d98fa701e3e558e014faf03b4ac22d76de05514 100644 (file)
--- a/client.h
+++ b/client.h
@@ -69,6 +69,8 @@ typedef struct rtlight_s
        // note that the world to light matrices are inversely scaled (divided) by lightradius
 
        // core properties
+       // matrix for transforming light filter coordinates to world coordinates
+       matrix4x4_t matrix_lighttoworld;
        // matrix for transforming world coordinates to light filter coordinates
        matrix4x4_t matrix_worldtolight;
        // typically 1 1 1, can be lower (dim) or higher (overbright)
@@ -126,6 +128,19 @@ typedef struct rtlight_s
        // surfaces seen by light
        int static_numsurfaces;
        int *static_surfacelist;
+       // flag bits indicating which triangles of the world model should cast
+       // shadows, and which ones should be lit
+       //
+       // this avoids redundantly scanning the triangles in each surface twice
+       // for whether they should cast shadows, once in culling and once in the
+       // actual shadowmarklist production.
+       int static_numshadowtrispvsbytes;
+       unsigned char *static_shadowtrispvs;
+       // this allows the lighting batch code to skip backfaces andother culled
+       // triangles not relevant for lighting
+       // (important on big surfaces such as terrain)
+       int static_numlighttrispvsbytes;
+       unsigned char *static_lighttrispvs;
 }
 rtlight_t;
 
@@ -230,6 +245,8 @@ typedef struct entity_render_s
        model_t *model;
        // current uninterpolated animation frame (for things which do not use interpolation)
        int frame;
+       // 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
@@ -237,6 +254,8 @@ typedef struct entity_render_s
        vec3_t colormap_shirtcolor;
        // light, particles, etc
        int effects;
+       // qw CTF flags and other internal-use-only effect bits
+       int internaleffects;
        // for Alias models
        int skinnum;
        // render flags
@@ -269,6 +288,9 @@ typedef struct entity_render_s
        vec3_t modellight_ambient;
        vec3_t modellight_diffuse; // q3bsp
        vec3_t modellight_lightdir; // q3bsp
+
+       // last time visible during trace culling
+       double last_trace_visibility;
 }
 entity_render_t;
 
@@ -509,6 +531,10 @@ typedef struct client_static_s
        // (note: qw_download variables are also used)
        cl_downloadack_t dp_downloadack[CL_MAX_DOWNLOADACKS];
 
+       // input sequence numbers are not reset on level change, only connect
+       int movesequence;
+       int servermovesequence;
+
        // quakeworld stuff below
 
        // value of "qport" cvar at time of connection
@@ -631,6 +657,14 @@ typedef enum cl_parsingtextmode_e
 }
 cl_parsingtextmode_t;
 
+typedef struct cl_locnode_s
+{
+       struct cl_locnode_s *next;
+       char *name;
+       vec3_t mins, maxs;
+}
+cl_locnode_t;
+
 //
 // the client_state_t structure is wiped completely at every
 // server signon
@@ -662,7 +696,8 @@ typedef struct client_state_s
        // use pain anim frame if cl.time < this
        float faceanimtime;
        // for stair smoothing
-       float stairoffset;
+       float stairsmoothz;
+       double stairsmoothtime;
 
        // color shifts for damage, powerups
        cshift_t cshifts[NUM_CSHIFTS];
@@ -696,6 +731,8 @@ typedef struct client_state_s
        // these fields are only updated by CL_ClientMovement (called by CL_SendMove after parsing each network packet)
        // set by CL_ClientMovement_Replay functions
        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;
@@ -708,8 +745,6 @@ typedef struct client_state_s
        // queue of proposed moves
        int movement_numqueue;
        client_movementqueue_t movement_queue[256];
-       int movesequence;
-       int servermovesequence;
        // whether the replay should allow a jump at the first sequence
        qboolean movement_replay_canjump;
 
@@ -750,6 +785,8 @@ typedef struct client_state_s
        // clients view of time, time should be between mtime[0] and mtime[1] to
        // generate a lerp point for other data, oldtime is the previous frame's
        // value of time, frametime is the difference between time and oldtime
+       // note: cl.time may be beyond cl.mtime[0] if packet loss is occuring, it
+       // is only forcefully limited when a packet is received
        double time, oldtime;
        // how long it has been since the previous client frame in real time
        // (not game time, for that use cl.time - cl.oldtime)
@@ -790,6 +827,8 @@ typedef struct client_state_s
        sfx_t *sfx_ric2;
        sfx_t *sfx_ric3;
        sfx_t *sfx_r_exp3;
+       // indicates that the file "sound/misc/talk2.wav" was found (for use by team chat messages)
+       qboolean foundtalk2wav;
 
 // refresh related state
 
@@ -875,6 +914,7 @@ typedef struct client_state_s
        int downloadsound_current;
        int loadsound_total;
        qboolean downloadcsqc;
+       qboolean loadbegun;
        qboolean loadfinished;
 
        // quakeworld stuff
@@ -925,6 +965,17 @@ typedef struct client_state_s
        int qw_validsequence;
 
        int qw_deltasequence[QW_UPDATE_BACKUP];
+
+       // csqc stuff:
+
+       // collision culling data
+       world_t world;
+
+       // loc file stuff (points and boxes describing locations in the level)
+       cl_locnode_t *locnodes;
+       // this is updated to cl.movement_origin whenever health is < 1
+       // used by %d print in say/say_team messages if cl_locs_enable is on
+       vec3_t lastdeathorigin;
 }
 client_state_t;
 
@@ -957,6 +1008,9 @@ extern cvar_t cl_autofire;
 
 extern cvar_t cl_shownet;
 extern cvar_t cl_nolerp;
+extern cvar_t cl_nettimesyncfactor;
+extern cvar_t cl_nettimesyncboundmode;
+extern cvar_t cl_nettimesyncboundtolerance;
 
 extern cvar_t cl_pitchdriftspeed;
 extern cvar_t lookspring;
@@ -985,10 +1039,15 @@ extern cvar_t cl_stainmaps_clearonload;
 
 extern cvar_t cl_prydoncursor;
 
+extern cvar_t cl_locs_enable;
+
 extern client_state_t cl;
 
 extern void CL_AllocLightFlash (entity_render_t *ent, matrix4x4_t *matrix, float radius, float red, float green, float blue, float decay, float lifetime, int cubemapnum, int style, int shadowenable, vec_t corona, vec_t coronasizescale, vec_t ambientscale, vec_t diffusescale, vec_t specularscale, int flags);
 
+cl_locnode_t *CL_Locs_FindNearest(const vec3_t point);
+void CL_Locs_FindLocationName(char *buffer, size_t buffersize, vec3_t point);
+
 //=============================================================================
 
 //
@@ -1004,7 +1063,7 @@ void CL_Disconnect (void);
 void CL_Disconnect_f (void);
 
 void CL_UpdateRenderEntity(entity_render_t *ent);
-void CL_UpdateEntities(void);
+void CL_UpdateViewEntities(void);
 
 //
 // cl_input
@@ -1030,6 +1089,7 @@ void CL_ParseTEnt (void);
 void CL_NewBeam (int ent, vec3_t start, vec3_t end, model_t *m, int lightning);
 void CL_RelinkBeams (void);
 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);
@@ -1041,9 +1101,9 @@ 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);
+void CL_UpdateWorld (void);
 void CL_WriteToServer (void);
-void CL_Move (void);
+void CL_Input (void);
 extern qboolean cl_ignoremousemove;
 
 
@@ -1056,7 +1116,7 @@ int Key_StringToKeynum (const char *str);
 //
 void CL_StopPlayback(void);
 void CL_ReadDemoMessage(void);
-void CL_WriteDemoMessage(void);
+void CL_WriteDemoMessage(sizebuf_t *mesage);
 
 void CL_NextDemo(void);
 void CL_Stop_f(void);
@@ -1098,10 +1158,11 @@ extern cvar_t cl_particles_blood;
 extern cvar_t cl_particles_blood_alpha;
 extern cvar_t cl_particles_blood_bloodhack;
 extern cvar_t cl_particles_bulletimpacts;
-extern cvar_t cl_particles_explosions_bubbles;
 extern cvar_t cl_particles_explosions_smoke;
 extern cvar_t cl_particles_explosions_sparks;
 extern cvar_t cl_particles_explosions_shell;
+extern cvar_t cl_particles_rain;
+extern cvar_t cl_particles_snow;
 extern cvar_t cl_particles_smoke;
 extern cvar_t cl_particles_smoke_alpha;
 extern cvar_t cl_particles_smoke_alphafade;
@@ -1182,9 +1243,8 @@ extern qboolean sb_showscores;
 #define NUMCROSSHAIRS 32
 extern cachepic_t *r_crosshairs[NUMCROSSHAIRS+1];
 
-#define FOGTABLEWIDTH 1024
-extern int fogtableindex;
-#define VERTEXFOGTABLE(dist) (fogtableindex = (int)((dist) * r_refdef.fogtabledistmultiplier), r_refdef.fogtable[bound(0, fogtableindex, FOGTABLEWIDTH - 1)])
+float FogPoint_World(const vec3_t p);
+float FogPoint_Model(const vec3_t p);
 
 typedef struct r_refdef_stats_s
 {
@@ -1255,8 +1315,9 @@ typedef struct r_refdef_s
        vec3_t fogcolor;
        vec_t fogrange;
        vec_t fograngerecip;
-       vec_t fogtabledistmultiplier;
-       float fogtable[FOGTABLEWIDTH];
+       vec_t fogmasktabledistmultiplier;
+#define FOGMASKTABLEWIDTH 1024
+       float fogmasktable[FOGMASKTABLEWIDTH];
        float fog_density;
        float fog_red;
        float fog_green;
@@ -1308,6 +1369,7 @@ typedef struct r_view_s
        vec3_t up;
        mplane_t frustum[5];
        float frustum_x, frustum_y;
+       vec3_t frustumcorner[4];
 
        // screen area to render in
        int x;