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
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];
+ // skeletal animation data (if skeleton.relativetransforms is not NULL, it overrides frameblend)
+ skeleton_t *skeleton;
- // animation cache index
- int animcacheindex;
+ // 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;
// current lighting from map (updated ONLY by client code, not renderer)
vec3_t modellight_ambient;
float qw_entertime;
int qw_ping;
int qw_packetloss;
+ int qw_movementloss;
int qw_spectator;
char qw_team[8];
char qw_skin[MAX_QPATH];
}
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
}
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;
// 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;
extern cvar_t cl_stainmaps_clearonload;
extern cvar_t cl_prydoncursor;
+extern cvar_t cl_prydoncursor_notrace;
extern cvar_t cl_locs_enable;
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;
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);
typedef enum effectnameindex_s
{
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)
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;
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