X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=client.h;h=7a9fdc7c2a12eaedca02a48f130c89da1b486b60;hb=de23df173b998d21ae0f5155962cbf2ca650670c;hp=260bfc0f2492b815eaa22a35927ae7713e2f9603;hpb=01547eb038afe0bd7925c88844a37a150fe25b28;p=xonotic%2Fdarkplaces.git diff --git a/client.h b/client.h index 260bfc0f..7a9fdc7c 100644 --- a/client.h +++ b/client.h @@ -55,12 +55,6 @@ typedef struct beam_s struct model_s *model; float endtime; vec3_t start, end; - // if this beam is owned by an entity, this is the beam start relative to - // that entity's matrix for per frame start updates - vec3_t relativestart; - vec3_t relativeend; - // indicates whether relativestart is valid - int relativestartvalid; } beam_t; @@ -259,8 +253,6 @@ typedef struct entity_render_s // calculated by the renderer (but not persistent) - // if visframe == r_framecount, it is visible - int visframe; // calculated during R_AddModelEntities vec3_t mins, maxs; // 4 frame numbers (-1 if not used) and their blending scalers (0-1), if interpolation is not desired, use frame instead @@ -476,6 +468,9 @@ typedef struct client_static_s // 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; // current file download buffer (only saved when file is completed) char qw_downloadname[MAX_QPATH]; @@ -508,6 +503,7 @@ typedef struct client_static_s qfile_t *capturevideo_soundfile; short capturevideo_rgbtoyuvscaletable[3][3][256]; unsigned char capturevideo_yuvnormalizetable[3][256]; + char capturevideo_basename[64]; } client_static_t; @@ -653,24 +649,35 @@ typedef struct client_state_s vec3_t mvelocity[2], velocity; // update by server, can be used by mods for zooming vec_t mviewzoom[2], viewzoom; + // if true interpolation the mviewangles and other interpolation of the + // player is disabled until the next network packet + // this is used primarily by teleporters, and when spectating players + // special checking of the old fixangle[1] is used to differentiate + // between teleporting and spectating + qboolean fixangle[2]; // client movement simulation // these fields are only updated by CL_ClientMovement (called by CL_SendMove after parsing each network packet) - qboolean movement; + // set by CL_ClientMovement_Replay functions + qboolean movement_predicted; // this is set true by svc_time parsing and causes a new movement to be // queued for prediction purposes qboolean movement_needupdate; // indicates the queue has been updated and should be replayed qboolean movement_replay; + // timestamps of latest two predicted moves for interpolation + double movement_time[2]; // simulated data (this is valid even if cl.movement is false) vec3_t movement_origin; vec3_t movement_oldorigin; vec3_t movement_velocity; // queue of proposed moves int movement_numqueue; - client_movementqueue_t movement_queue[64]; + 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; // pitch drifting vars float idealpitch; @@ -952,10 +959,6 @@ void CL_Disconnect_f (void); void CL_BoundingBoxForEntity(entity_render_t *ent); -extern cvar_t cl_beams_polygons; -extern cvar_t cl_beams_relative; -extern cvar_t cl_beams_lightatend; - // // cl_input // @@ -977,7 +980,9 @@ void CL_ValidateState(entity_state_t *s); void CL_MoveLerpEntityStates(entity_t *ent); void CL_LerpUpdate(entity_t *e); 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_ClearTempEntities (void); entity_t *CL_NewTempEntity (void); @@ -986,6 +991,7 @@ void CL_Effect(vec3_t org, int modelindex, int startframe, int framecount, float void CL_ClearState (void); 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); @@ -1073,7 +1079,6 @@ typedef enum effectnameindex_s EFFECT_TE_SUPERSPIKEQUAD, EFFECT_TE_WIZSPIKE, EFFECT_TE_KNIGHTSPIKE, - EFFECT_TE_VORESPIKE, EFFECT_TE_EXPLOSION, EFFECT_TE_EXPLOSIONQUAD, EFFECT_TE_TAREXPLOSION, @@ -1123,21 +1128,47 @@ void R_NewExplosion(const vec3_t org); #define NUMCROSSHAIRS 32 extern cachepic_t *r_crosshairs[NUMCROSSHAIRS+1]; -typedef struct refdef_s +#define FOGTABLEWIDTH 1024 +extern int fogtableindex; +#define VERTEXFOGTABLE(dist) (fogtableindex = (int)((dist) * r_refdef.fogtabledistmultiplier), r_refdef.fogtable[bound(0, fogtableindex, FOGTABLEWIDTH - 1)]) + +typedef struct r_refdef_stats_s { - // area to render in - int x, y, width, height; - float frustum_x, frustum_y; + int entities; + int entities_surfaces; + int entities_triangles; + int world_leafs; + int world_portals; + int particles; + int meshes; + int meshes_elements; + int lights; + int lights_clears; + int lights_scissored; + int lights_lighttriangles; + int lights_shadowtriangles; + int lights_dynamicshadowtriangles; + int bloom; + int bloom_copypixels; + int bloom_drawpixels; +} +r_refdef_stats_t; + +typedef struct r_refdef_s +{ + // these fields define the basic rendering information for the world + // but not the view, which could change multiple times in one rendered + // frame (for example when rendering textures for certain effects) // these are set for water warping before // frustum_x/frustum_y are calculated float frustumscale_x, frustumscale_y; - // view transform - matrix4x4_t viewentitymatrix; - - // which color components to allow (for anaglyph glasses) - int colormask[4]; + // minimum visible distance (pixels closer than this disappear) + double nearclip; + // maximum visible distance (pixels further than this disappear in 16bpp modes, + // in 32bpp an infinite-farclip matrix is used instead) + double farclip; // fullscreen color blend float viewblend[4]; @@ -1167,11 +1198,99 @@ typedef struct refdef_s // controls intensity of dynamic lights and lightmap layers unsigned short lightstylevalue[256]; // 8.8 fraction of base light value + vec3_t fogcolor; + vec_t fogrange; + vec_t fograngerecip; + vec_t fogtabledistmultiplier; + float fogtable[FOGTABLEWIDTH]; + float fog_density; + float fog_red; + float fog_green; + float fog_blue; + qboolean fogenabled; + qboolean oldgl_fogenable; + qboolean draw2dstage; + + // true during envmap command capture + qboolean envmap; + + // brightness of world lightmaps and related lighting + // (often reduced when world rtlights are enabled) + float lightmapintensity; + // whether to draw world lights realtime, dlights realtime, and their shadows + qboolean rtworld; + qboolean rtworldshadows; + qboolean rtdlight; + qboolean rtdlightshadows; + float polygonfactor; + float polygonoffset; + float shadowpolygonfactor; + float shadowpolygonoffset; + + // rendering stats for r_speeds display + // (these are incremented in many places) + r_refdef_stats_t stats; +} +r_refdef_t; + +typedef struct r_view_s +{ + // view information (changes multiple times per frame) + // if any of these variables change then r_viewcache must be regenerated + // by calling R_View_Update + // (which also updates viewport, scissor, colormask) + + // it is safe and expected to copy this into a structure on the stack and + // call the renderer recursively, then restore from the stack afterward + // (as long as R_View_Update is called) + + // eye position information + matrix4x4_t matrix; + vec3_t origin; + vec3_t forward; + vec3_t left; + vec3_t right; + vec3_t up; + mplane_t frustum[5]; + float frustum_x, frustum_y; + + // screen area to render in + int x; + int y; + int z; + int width; + int height; + int depth; + + // which color components to allow (for anaglyph glasses) + int colormask[4]; +} +r_view_t; + +typedef struct r_viewcache_s +{ + // these properties are generated by R_View_Update() + + // which entities are currently visible for this viewpoint + // (the used range is 0...r_refdef.numentities) + unsigned char entityvisible[MAX_EDICTS]; + // 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]; + // TODO: dynamic resize according to r_refdef.worldmodel->brush.num_leafs + unsigned char world_leafvisible[32768]; + // TODO: dynamic resize according to r_refdef.worldmodel->num_surfaces + unsigned char world_surfacevisible[262144]; + // if true, the view is currently in a leaf without pvs data + qboolean world_novis; } -refdef_t; +r_viewcache_t; -extern refdef_t r_refdef; +extern r_refdef_t r_refdef; +extern r_view_t r_view; +extern r_viewcache_t r_viewcache; #endif