#include "matrixlib.h"
#include "snd_main.h"
+// NOTE: r_stat_name[] must match this indexing
+typedef enum r_stat_e
+{
+ r_stat_timedelta,
+ r_stat_quality,
+ r_stat_renders,
+ r_stat_entities,
+ r_stat_entities_surfaces,
+ r_stat_entities_triangles,
+ r_stat_world_leafs,
+ r_stat_world_portals,
+ r_stat_world_surfaces,
+ r_stat_world_triangles,
+ r_stat_lightmapupdates,
+ r_stat_lightmapupdatepixels,
+ r_stat_particles,
+ r_stat_drawndecals,
+ r_stat_totaldecals,
+ r_stat_draws,
+ r_stat_draws_vertices,
+ r_stat_draws_elements,
+ r_stat_lights,
+ r_stat_lights_clears,
+ r_stat_lights_scissored,
+ r_stat_lights_lighttriangles,
+ r_stat_lights_shadowtriangles,
+ r_stat_lights_dynamicshadowtriangles,
+ r_stat_bouncegrid_lights,
+ r_stat_bouncegrid_particles,
+ r_stat_bouncegrid_traces,
+ r_stat_bouncegrid_hits,
+ r_stat_bouncegrid_splats,
+ r_stat_bouncegrid_bounces,
+ r_stat_photoncache_animated,
+ r_stat_photoncache_cached,
+ r_stat_photoncache_traced,
+ r_stat_bloom,
+ r_stat_bloom_copypixels,
+ r_stat_bloom_drawpixels,
+ r_stat_indexbufferuploadcount,
+ r_stat_indexbufferuploadsize,
+ r_stat_vertexbufferuploadcount,
+ r_stat_vertexbufferuploadsize,
+ r_stat_framedatacurrent,
+ r_stat_framedatasize,
+ r_stat_bufferdatacurrent_vertex, // R_BUFFERDATA_ types are added to this index
+ r_stat_bufferdatacurrent_index16,
+ r_stat_bufferdatacurrent_index32,
+ r_stat_bufferdatacurrent_uniform,
+ r_stat_bufferdatasize_vertex, // R_BUFFERDATA_ types are added to this index
+ r_stat_bufferdatasize_index16,
+ r_stat_bufferdatasize_index32,
+ r_stat_bufferdatasize_uniform,
+ r_stat_animcache_vertexmesh_count,
+ r_stat_animcache_vertexmesh_vertices,
+ r_stat_animcache_vertexmesh_maxvertices,
+ r_stat_animcache_skeletal_count,
+ r_stat_animcache_skeletal_bones,
+ r_stat_animcache_skeletal_maxbones,
+ r_stat_animcache_shade_count,
+ r_stat_animcache_shade_vertices,
+ r_stat_animcache_shade_maxvertices,
+ r_stat_animcache_shape_count,
+ r_stat_animcache_shape_vertices,
+ r_stat_animcache_shape_maxvertices,
+ r_stat_batch_batches,
+ r_stat_batch_withgaps,
+ r_stat_batch_surfaces,
+ r_stat_batch_vertices,
+ r_stat_batch_triangles,
+ r_stat_batch_fast_batches,
+ r_stat_batch_fast_surfaces,
+ r_stat_batch_fast_vertices,
+ r_stat_batch_fast_triangles,
+ r_stat_batch_copytriangles_batches,
+ r_stat_batch_copytriangles_surfaces,
+ r_stat_batch_copytriangles_vertices,
+ r_stat_batch_copytriangles_triangles,
+ r_stat_batch_dynamic_batches,
+ r_stat_batch_dynamic_surfaces,
+ r_stat_batch_dynamic_vertices,
+ r_stat_batch_dynamic_triangles,
+ r_stat_batch_dynamicskeletal_batches,
+ r_stat_batch_dynamicskeletal_surfaces,
+ r_stat_batch_dynamicskeletal_vertices,
+ r_stat_batch_dynamicskeletal_triangles,
+ r_stat_batch_dynamic_batches_because_cvar,
+ r_stat_batch_dynamic_surfaces_because_cvar,
+ r_stat_batch_dynamic_vertices_because_cvar,
+ r_stat_batch_dynamic_triangles_because_cvar,
+ r_stat_batch_dynamic_batches_because_lightmapvertex,
+ r_stat_batch_dynamic_surfaces_because_lightmapvertex,
+ r_stat_batch_dynamic_vertices_because_lightmapvertex,
+ r_stat_batch_dynamic_triangles_because_lightmapvertex,
+ r_stat_batch_dynamic_batches_because_deformvertexes_autosprite,
+ r_stat_batch_dynamic_surfaces_because_deformvertexes_autosprite,
+ r_stat_batch_dynamic_vertices_because_deformvertexes_autosprite,
+ r_stat_batch_dynamic_triangles_because_deformvertexes_autosprite,
+ r_stat_batch_dynamic_batches_because_deformvertexes_autosprite2,
+ r_stat_batch_dynamic_surfaces_because_deformvertexes_autosprite2,
+ r_stat_batch_dynamic_vertices_because_deformvertexes_autosprite2,
+ r_stat_batch_dynamic_triangles_because_deformvertexes_autosprite2,
+ r_stat_batch_dynamic_batches_because_deformvertexes_normal,
+ r_stat_batch_dynamic_surfaces_because_deformvertexes_normal,
+ r_stat_batch_dynamic_vertices_because_deformvertexes_normal,
+ r_stat_batch_dynamic_triangles_because_deformvertexes_normal,
+ r_stat_batch_dynamic_batches_because_deformvertexes_wave,
+ r_stat_batch_dynamic_surfaces_because_deformvertexes_wave,
+ r_stat_batch_dynamic_vertices_because_deformvertexes_wave,
+ r_stat_batch_dynamic_triangles_because_deformvertexes_wave,
+ r_stat_batch_dynamic_batches_because_deformvertexes_bulge,
+ r_stat_batch_dynamic_surfaces_because_deformvertexes_bulge,
+ r_stat_batch_dynamic_vertices_because_deformvertexes_bulge,
+ r_stat_batch_dynamic_triangles_because_deformvertexes_bulge,
+ r_stat_batch_dynamic_batches_because_deformvertexes_move,
+ r_stat_batch_dynamic_surfaces_because_deformvertexes_move,
+ r_stat_batch_dynamic_vertices_because_deformvertexes_move,
+ r_stat_batch_dynamic_triangles_because_deformvertexes_move,
+ r_stat_batch_dynamic_batches_because_tcgen_lightmap,
+ r_stat_batch_dynamic_surfaces_because_tcgen_lightmap,
+ r_stat_batch_dynamic_vertices_because_tcgen_lightmap,
+ r_stat_batch_dynamic_triangles_because_tcgen_lightmap,
+ r_stat_batch_dynamic_batches_because_tcgen_vector,
+ r_stat_batch_dynamic_surfaces_because_tcgen_vector,
+ r_stat_batch_dynamic_vertices_because_tcgen_vector,
+ r_stat_batch_dynamic_triangles_because_tcgen_vector,
+ r_stat_batch_dynamic_batches_because_tcgen_environment,
+ r_stat_batch_dynamic_surfaces_because_tcgen_environment,
+ r_stat_batch_dynamic_vertices_because_tcgen_environment,
+ r_stat_batch_dynamic_triangles_because_tcgen_environment,
+ r_stat_batch_dynamic_batches_because_tcmod_turbulent,
+ r_stat_batch_dynamic_surfaces_because_tcmod_turbulent,
+ r_stat_batch_dynamic_vertices_because_tcmod_turbulent,
+ r_stat_batch_dynamic_triangles_because_tcmod_turbulent,
+ r_stat_batch_dynamic_batches_because_interleavedarrays,
+ r_stat_batch_dynamic_surfaces_because_interleavedarrays,
+ r_stat_batch_dynamic_vertices_because_interleavedarrays,
+ r_stat_batch_dynamic_triangles_because_interleavedarrays,
+ r_stat_batch_dynamic_batches_because_nogaps,
+ r_stat_batch_dynamic_surfaces_because_nogaps,
+ r_stat_batch_dynamic_vertices_because_nogaps,
+ r_stat_batch_dynamic_triangles_because_nogaps,
+ r_stat_batch_dynamic_batches_because_derived,
+ r_stat_batch_dynamic_surfaces_because_derived,
+ r_stat_batch_dynamic_vertices_because_derived,
+ r_stat_batch_dynamic_triangles_because_derived,
+ r_stat_batch_entitycache_count,
+ r_stat_batch_entitycache_surfaces,
+ r_stat_batch_entitycache_vertices,
+ r_stat_batch_entitycache_triangles,
+ r_stat_batch_entityanimate_count,
+ r_stat_batch_entityanimate_surfaces,
+ r_stat_batch_entityanimate_vertices,
+ r_stat_batch_entityanimate_triangles,
+ r_stat_batch_entityskeletal_count,
+ r_stat_batch_entityskeletal_surfaces,
+ r_stat_batch_entityskeletal_vertices,
+ r_stat_batch_entityskeletal_triangles,
+ r_stat_batch_entitystatic_count,
+ r_stat_batch_entitystatic_surfaces,
+ r_stat_batch_entitystatic_vertices,
+ r_stat_batch_entitystatic_triangles,
+ r_stat_batch_entitycustom_count,
+ r_stat_batch_entitycustom_surfaces,
+ r_stat_batch_entitycustom_vertices,
+ r_stat_batch_entitycustom_triangles,
+ r_stat_count // size of array
+}
+r_stat_t;
+
// flags for rtlight rendering
#define LIGHTFLAG_NORMALMODE 1
#define LIGHTFLAG_REALTIMEMODE 2
// for visibility culling
int surfaceindex;
// old decals are killed to obey cl_decals_max
- int decalsequence;
+ unsigned int decalsequence;
}
tridecal_t;
// 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;
+ float *animcache_vertex3f;
+ r_meshbuffer_t *animcache_vertex3f_vertexbuffer;
+ int animcache_vertex3f_bufferoffset;
+ float *animcache_normal3f;
+ r_meshbuffer_t *animcache_normal3f_vertexbuffer;
+ int animcache_normal3f_bufferoffset;
+ float *animcache_svector3f;
+ r_meshbuffer_t *animcache_svector3f_vertexbuffer;
+ int animcache_svector3f_bufferoffset;
+ float *animcache_tvector3f;
+ r_meshbuffer_t *animcache_tvector3f_vertexbuffer;
+ int animcache_tvector3f_bufferoffset;
// interleaved arrays for rendering and dynamic vertex buffers for them
- r_meshbuffer_t *animcache_vertex3fbuffer;
r_vertexmesh_t *animcache_vertexmesh;
- r_meshbuffer_t *animcache_vertexmeshbuffer;
+ r_meshbuffer_t *animcache_vertexmesh_vertexbuffer;
+ int animcache_vertexmesh_bufferoffset;
+ // gpu-skinning shader needs transforms in a certain format, we have to
+ // upload this to a uniform buffer for the shader to use, and also keep a
+ // backup copy in system memory for the dynamic batch fallback code
+ // if this is not NULL, the other animcache variables are NULL
+ float *animcache_skeletaltransform3x4;
+ r_meshbuffer_t *animcache_skeletaltransform3x4buffer;
+ int animcache_skeletaltransform3x4offset;
+ int animcache_skeletaltransform3x4size;
// current lighting from map (updated ONLY by client code, not renderer)
vec3_t modellight_ambient;
double last_trace_visibility;
// user wavefunc parameters (from csqc)
- float userwavefunc_param[Q3WAVEFUNC_USER_COUNT];
+ vec_t userwavefunc_param[Q3WAVEFUNC_USER_COUNT];
}
entity_render_t;
typedef struct entity_persistent_s
{
- vec3_t trail_origin;
-
- // particle trail
- float trail_time;
+ vec3_t trail_origin; // previous position for particle trail spawning
+ vec3_t oldorigin; // lerp
+ vec3_t oldangles; // lerp
+ vec3_t neworigin; // lerp
+ vec3_t newangles; // lerp
+ vec_t lerpstarttime; // lerp
+ vec_t lerpdeltatime; // lerp
+ float muzzleflash; // muzzleflash intensity, fades over time
+ float trail_time; // residual error accumulation for particle trail spawning (to keep spacing across frames)
qboolean trail_allowed; // set to false by teleports, true by update code, prevents bad lerps
-
- // muzzleflash fading
- float muzzleflash;
-
- // interpolated movement
-
- // start time of move
- float lerpstarttime;
- // time difference from start to end of move
- float lerpdeltatime;
- // the move itself, start and end
- float oldorigin[3];
- float oldangles[3];
- float neworigin[3];
- float newangles[3];
}
entity_persistent_t;
int msec; // for predicted moves
int buttons;
int impulse;
- int sequence;
+ unsigned int sequence;
qboolean applied; // if false we're still accumulating a move
qboolean predicted; // if true the sequence should be sent as 0
double connect_nextsendtime;
lhnetsocket_t *connect_mysocket;
lhnetaddress_t connect_address;
+ lhnetaddress_t rcon_address;
// protocol version of the server we're connected to
// (kept outside client_state_t because it's used between levels)
protocolversion_t protocol;
cl_downloadack_t dp_downloadack[CL_MAX_DOWNLOADACKS];
// input sequence numbers are not reset on level change, only connect
- int movesequence;
- int servermovesequence;
+ unsigned int servermovesequence;
// quakeworld stuff below
// 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;
+ unsigned int qw_incoming_sequence;
+ unsigned int qw_outgoing_sequence;
// current file download buffer (only saved when file is completed)
char qw_downloadname[MAX_QPATH];
int proquake_servermod; // 0 = not proquake, 1 = proquake
int proquake_serverversion; // actual proquake server version * 10 (3.40 = 34, etc)
int proquake_serverflags; // 0 (PQF_CHEATFREE not supported)
+
+ // don't write-then-read csprogs.dat (useful for demo playback)
+ unsigned char *caughtcsprogsdata;
+ fs_offset_t caughtcsprogsdatasize;
+
+ int r_speeds_graph_length;
+ int r_speeds_graph_current;
+ int *r_speeds_graph_data;
+
+ // graph scales
+ int r_speeds_graph_datamin[r_stat_count];
+ int r_speeds_graph_datamax[r_stat_count];
}
client_static_t;
extern client_static_t cls;
-typedef struct client_movementqueue_s
-{
- double time;
- float frametime;
- int sequence;
- float viewangles[3];
- float move[3];
- qboolean jump;
- qboolean crouch;
- qboolean canjump;
-}
-client_movementqueue_t;
-
//[515]: csqc
typedef struct
{
// fields used by rendering: (44 bytes)
unsigned short typeindex;
unsigned short texnum;
- int decalsequence;
+ unsigned int decalsequence;
vec3_t org;
vec3_t normal;
float size;
float bob2_smooth;
float bobfall_speed;
float bobfall_swing;
+ double calcrefdef_prevtime;
// don't change view angle, full screen, etc
int intermission;
#define LATESTFRAMENUMS 32
int latestframenumsposition;
int latestframenums[LATESTFRAMENUMS];
- int latestsendnums[LATESTFRAMENUMS];
+ unsigned int latestsendnums[LATESTFRAMENUMS];
entityframe_database_t *entitydatabase;
entityframe4_database_t *entitydatabase4;
entityframeqw_database_t *entitydatabaseqw;
vec3_t playercrouchmaxs;
// old decals are killed based on this
- int decalsequence;
+ unsigned int decalsequence;
int max_entities;
int max_csqcrenderentities;
float qw_weaponkick;
- int qw_validsequence;
+ unsigned int qw_validsequence;
- int qw_deltasequence[QW_UPDATE_BACKUP];
+ unsigned int qw_deltasequence[QW_UPDATE_BACKUP];
// csqc stuff:
// server entity number corresponding to a clientside entity
extern cvar_t cl_name;
extern cvar_t cl_color;
extern cvar_t cl_rate;
+extern cvar_t cl_rate_burstsize;
extern cvar_t cl_pmodel;
extern cvar_t cl_playermodel;
extern cvar_t cl_playerskin;
void V_StopPitchDrift (void);
void V_Init (void);
-float V_CalcRoll (vec3_t angles, vec3_t velocity);
+float V_CalcRoll (const vec3_t angles, const vec3_t velocity);
void V_UpdateBlends (void);
void V_ParseDamage (void);
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, float tintmins[4], float tintmaxs[4]);
+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], float fade);
+void CL_ParticleBox(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], float fade);
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);
float RSurf_FogVertex(const vec3_t p);
float RSurf_FogPoint(const vec3_t p);
-typedef struct r_refdef_stats_s
-{
- int renders;
- int entities;
- int entities_surfaces;
- int entities_triangles;
- int world_leafs;
- int world_portals;
- int world_surfaces;
- int world_triangles;
- int lightmapupdates;
- int lightmapupdatepixels;
- int particles;
- int drawndecals;
- int totaldecals;
- int draws;
- int draws_vertices;
- int draws_elements;
- int lights;
- int lights_clears;
- int lights_scissored;
- int lights_lighttriangles;
- int lights_shadowtriangles;
- int lights_dynamicshadowtriangles;
- int bouncegrid_lights;
- int bouncegrid_particles;
- int bouncegrid_traces;
- int bouncegrid_hits;
- int bouncegrid_splats;
- int bouncegrid_bounces;
- int collisioncache_animated;
- int collisioncache_cached;
- int collisioncache_traced;
- int bloom;
- int bloom_copypixels;
- int bloom_drawpixels;
- int indexbufferuploadcount;
- int indexbufferuploadsize;
- int vertexbufferuploadcount;
- int vertexbufferuploadsize;
- int framedatacurrent;
- int framedatasize;
-}
-r_refdef_stats_t;
-
typedef enum r_viewport_type_e
{
R_VIEWPORTTYPE_ORTHO,
// rendering stats for r_speeds display
// (these are incremented in many places)
- r_refdef_stats_t stats;
+ int stats[r_stat_count];
}
r_refdef_t;
typedef struct cl_clientmovement_state_s
{
+ // entity to be ignored for movement
+ struct prvm_edict_s *self;
// position
vec3_t origin;
vec3_t velocity;
usercmd_t cmd;
}
cl_clientmovement_state_t;
-void CL_ClientMovement_PlayerMove(cl_clientmovement_state_t *s);
+void CL_ClientMovement_PlayerMove_Frame(cl_clientmovement_state_t *s);
// warpzone prediction hack (CSQC builtin)
void CL_RotateMoves(const matrix4x4_t *m);
void V_DriftPitch(void);
void V_FadeViewFlashs(void);
void V_CalcViewBlend(void);
-void V_CalcRefdefUsing(const matrix4x4_t *entrendermatrix, const vec3_t clviewangles, qboolean teleported, qboolean clonground, qboolean clcmdjump);
+void V_CalcRefdefUsing (const matrix4x4_t *entrendermatrix, const vec3_t clviewangles, qboolean teleported, qboolean clonground, qboolean clcmdjump, float clstatsviewheight, qboolean cldead, qboolean clintermission, const vec3_t clvelocity);
void V_CalcRefdef(void);
void CL_Locs_Reload_f(void);