// LordHavoc: this struct is intended for the renderer but some fields are
// used by the client.
+//
+// The renderer should not rely on any changes to this struct to be persistent
+// across multiple frames because temp entities are wiped every frame, but it
+// is acceptable to cache things in this struct that are not critical.
+//
+// For example the r_cullentities_trace code does such caching.
typedef struct entity_render_s
{
// location
// NULL = no model
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
+ // literal colormap colors for renderer, if both are 0 0 0 it is not colormapped
vec3_t colormap_pantscolor;
vec3_t colormap_shirtcolor;
// light, particles, etc
// 4 frame numbers (-1 if not used) and their blending scalers (0-1), if interpolation is not desired, use frame instead
frameblend_t frameblend[4];
- // current lighting from map
+ // 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
+ // FIELDS UPDATED BY RENDERER:
// last time visible during trace culling
double last_trace_visibility;
}
double starttime;
double framerate;
// for AVI saving some values have to be written after capture ends
+ fs_offset_t videofile_firstchunkframes_offset;
fs_offset_t videofile_totalframes_offset1;
fs_offset_t videofile_totalframes_offset2;
fs_offset_t videofile_totalsampleframes_offset;
+ int videofile_ix_master_audio_inuse;
+ fs_offset_t videofile_ix_master_audio_inuse_offset;
+ fs_offset_t videofile_ix_master_audio_start_offset;
+ int videofile_ix_master_video_inuse;
+ fs_offset_t videofile_ix_master_video_inuse_offset;
+ fs_offset_t videofile_ix_master_video_start_offset;
+ fs_offset_t videofile_ix_movistart;
qfile_t *videofile;
qboolean active;
qboolean realtime;
int soundrate;
int frame;
int soundsampleframe; // for AVI saving
- unsigned char *buffer;
+ unsigned char *screenbuffer;
+ unsigned char *outbuffer;
sizebuf_t riffbuffer;
unsigned char riffbufferdata[128];
// note: riffindex buffer has an allocated ->data member, not static like most!
short rgbtoyuvscaletable[3][3][256];
unsigned char yuvnormalizetable[3][256];
char basename[64];
+ int width, height;
}
capturevideostate_t;
// -1 = use normal cd track
int forcetrack;
qfile_t *demofile;
- // to meter out one message a frame
- int td_lastframe;
- // host_framecount at start
- int td_startframe;
// realtime at second frame of timedemo (LordHavoc: changed to double)
double td_starttime;
+ int td_frames; // total frames parsed
double td_onesecondnexttime;
double td_onesecondframes;
double td_onesecondminframes;
typedef enum
{
- 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
+ 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
}
ptype_t;
+typedef struct decal_s
+{
+ unsigned short typeindex;
+ unsigned short texnum;
+ vec3_t org;
+ vec3_t normal;
+ float size;
+ float alpha; // 0-255
+ float time2; // used for snow fluttering and decal fade
+ unsigned char color[4];
+ unsigned int owner; // decal stuck to this entity
+ model_t *ownermodel; // model the decal is stuck to (used to make sure the entity is still alive)
+ vec3_t relativeorigin; // decal at this location in entity's coordinate space
+ vec3_t relativenormal; // decal oriented this way relative to entity's coordinate space
+}
+decal_t;
+
typedef struct particle_s
{
- particletype_t *type;
- int texnum;
- vec3_t org;
- vec3_t vel; // velocity of particle, or orientation of decal, or end point of beam
- float size;
- float sizeincrease; // rate of size change per second
- float alpha; // 0-255
- 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)
- unsigned char color[4];
- unsigned int owner; // decal stuck to this entity
- model_t *ownermodel; // model the decal is stuck to (used to make sure the entity is still alive)
- vec3_t relativeorigin; // decal at this location in entity's coordinate space
- vec3_t relativedirection; // decal oriented this way relative to entity's coordinate space
- 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
+ unsigned short typeindex;
+ unsigned short texnum;
+ vec3_t org;
+ vec3_t vel; // velocity of particle, or orientation of decal, or end point of beam
+ float size;
+ float sizeincrease; // rate of size change per second
+ float alpha; // 0-255
+ 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)
+ unsigned char color[4];
+ 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;
}
cl_locnode_t;
+typedef struct showlmp_s
+{
+ qboolean isactive;
+ float x;
+ float y;
+ char label[32];
+ char pic[128];
+}
+showlmp_t;
+
//
// the client_state_t structure is wiped completely at every
// server signon
int viewentity;
// the real player entity (normally same as viewentity,
// different than viewentity if mod uses chasecam or other tricks)
+ int realplayerentity;
+ // this is updated to match cl.viewentity whenever it is in the clients
+ // range, basically this is used in preference to cl.realplayerentity for
+ // most purposes because when spectating another player it should show
+ // their information rather than yours
int playerentity;
// max players that can be in this game
int maxclients;
int max_lightstyle;
int max_brushmodel_entities;
int max_particles;
+ int max_decals;
+ int max_showlmps;
entity_t *entities;
unsigned char *entities_active;
lightstyle_t *lightstyle;
int *brushmodel_entities;
particle_t *particles;
+ decal_t *decals;
+ showlmp_t *showlmps;
int num_entities;
int num_static_entities;
int num_beams;
int num_dlights;
int num_particles;
+ int num_decals;
+ int num_showlmps;
int free_particle;
+ int free_decal;
// cl_serverextension_download feature
int loadmodel_current;
int downloadsound_current;
int loadsound_total;
qboolean downloadcsqc;
+ qboolean loadcsqc;
qboolean loadbegun;
qboolean loadfinished;
int qw_teamplay;
// unused: indicates whether the player is spectating
- // use cl.scores[cl.playerentity].qw_spectator instead
+ // use cl.scores[cl.playerentity-1].qw_spectator instead
//qboolean qw_spectator;
// movement parameters for client prediction
+ float movevars_wallfriction;
+ float movevars_waterfriction;
+ float movevars_friction;
float movevars_ticrate;
- float movevars_slowmo;
+ float movevars_timescale;
float movevars_gravity;
float movevars_stopspeed;
float movevars_maxspeed;
float movevars_accelerate;
float movevars_airaccelerate;
float movevars_wateraccelerate;
- float movevars_friction;
- float movevars_waterfriction;
float movevars_entgravity;
float movevars_jumpvelocity;
float movevars_edgefriction;
void CL_Disconnect_f (void);
void CL_UpdateRenderEntity(entity_render_t *ent);
+void CL_SetEntityColormapColors(entity_render_t *ent, int colormap);
void CL_UpdateViewEntities(void);
//
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_smoke;
extern cvar_t cl_particles_explosions_sparks;
extern cvar_t cl_particles_explosions_shell;
extern cvar_t cl_particles_rain;
void CL_EntityParticles (const entity_t *ent);
void CL_ParticleExplosion (const vec3_t org);
void CL_ParticleExplosion2 (const vec3_t org, int colorStart, int colorLength);
+void CL_MoveDecals(void);
void CL_MoveParticles(void);
void R_MoveExplosions(void);
void R_NewExplosion(const vec3_t org);
extern qboolean sb_showscores;
-#define NUMCROSSHAIRS 32
-extern cachepic_t *r_crosshairs[NUMCROSSHAIRS+1];
-
float FogPoint_World(const vec3_t p);
float FogPoint_Model(const vec3_t p);
+float FogForDistance(vec_t dist);
typedef struct r_refdef_stats_s
{
int entities_triangles;
int world_leafs;
int world_portals;
+ int world_surfaces;
+ int world_triangles;
+ int lightmapupdates;
+ int lightmapupdatepixels;
int particles;
+ int decals;
int meshes;
int meshes_elements;
int lights;
rtlight_t lights[MAX_DLIGHTS];
int numlights;
+ // intensities for light styles right now, controls rtlights
+ float rtlightstylevalue[256]; // float fraction of base light value
// 8.8bit fixed point intensities for light styles
- // controls intensity of dynamic lights and lightmap layers
- unsigned short lightstylevalue[256]; // 8.8 fraction of base light value
+ // controls intensity lightmap layers
+ unsigned short lightstylevalue[256]; // 8.8 fraction of base light value
vec3_t fogcolor;
vec_t fogrange;
float fog_red;
float fog_green;
float fog_blue;
+ float fog_start, fog_alpha;
qboolean fogenabled;
qboolean oldgl_fogenable;
// (as long as R_View_Update is called)
// eye position information
- matrix4x4_t matrix;
+ matrix4x4_t matrix, inverse_matrix;
vec3_t origin;
vec3_t forward;
vec3_t left;
vec3_t right;
vec3_t up;
- mplane_t frustum[5];
+ int numfrustumplanes;
+ mplane_t frustum[6];
+ qboolean useclipplane;
+ qboolean usecustompvs; // uses r_viewcache.pvsbits as-is rather than computing it
+ mplane_t clipplane;
float frustum_x, frustum_y;
vec3_t frustumcorner[4];
+ // if turned off it renders an ortho view
+ int useperspective;
+ float ortho_x, ortho_y;
// screen area to render in
int x;
// global RGB color multiplier for rendering, this is required by HDR
float colorscale;
+
+ // whether to call R_ClearScreen before rendering stuff
+ qboolean clear;
+
+ // whether to draw r_showtris and such, this is only true for the main
+ // view render, all secondary renders (HDR, mirrors, portals, cameras,
+ // distortion effects, etc) omit such debugging information
+ qboolean showdebug;
+
+ // these define which values to use in GL_CullFace calls to request frontface or backface culling
+ int cullface_front;
+ int cullface_back;
}
r_view_t;
// 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.worldmodel->brush.num_clusters
- unsigned char world_pvsbits[(32768+7)>>3];
+ unsigned char world_pvsbits[(32768+7)>>3]; // FIXME: buffer overflow on huge maps
// TODO: dynamic resize according to r_refdef.worldmodel->brush.num_leafs
- unsigned char world_leafvisible[32768];
+ unsigned char world_leafvisible[32768]; // FIXME: buffer overflow on huge maps
// TODO: dynamic resize according to r_refdef.worldmodel->num_surfaces
- unsigned char world_surfacevisible[262144];
+ unsigned char world_surfacevisible[262144]; // FIXME: buffer overflow on huge maps
// if true, the view is currently in a leaf without pvs data
qboolean world_novis;
}