// 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)
// 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;
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;
// (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
}
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
// 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];
// 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;
// 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;
int downloadsound_current;
int loadsound_total;
qboolean downloadcsqc;
+ qboolean loadbegun;
qboolean loadfinished;
// quakeworld stuff
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;
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);
+
//=============================================================================
//
void CL_Disconnect_f (void);
void CL_UpdateRenderEntity(entity_render_t *ent);
-void CL_UpdateEntities(void);
+void CL_UpdateViewEntities(void);
//
// cl_input
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);
int CL_ReadFromServer (void);
void CL_WriteToServer (void);
-void CL_Move (void);
+void CL_Input (void);
extern qboolean cl_ignoremousemove;
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;
vec3_t up;
mplane_t frustum[5];
float frustum_x, frustum_y;
+ vec3_t frustumcorner[4];
// screen area to render in
int x;