X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=client.h;h=e725a11feca351d401541d3390c3d95f9eea0726;hp=0b0dc300fffa0414c984ad895629fb523266f27e;hb=ed8e0b53b756f033faa4aee20db93b466b6c71d1;hpb=aa150f38ef79b17d32b520bebb5fe5125c7b3ced diff --git a/client.h b/client.h index 0b0dc300..e725a11f 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; @@ -213,9 +207,9 @@ frameblend_t; typedef struct entity_render_s { // location - vec3_t origin; + //vec3_t origin; // orientation - vec3_t angles; + //vec3_t angles; // transform matrix for model to world matrix4x4_t matrix; // transform matrix for world to model @@ -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 @@ -409,13 +401,39 @@ qw_downloadtype_t; typedef enum capturevideoformat_e { - CAPTUREVIDEOFORMAT_TARGA, - CAPTUREVIDEOFORMAT_JPEG, - CAPTUREVIDEOFORMAT_RAWRGB, - CAPTUREVIDEOFORMAT_RAWYV12 + CAPTUREVIDEOFORMAT_AVI_I420 } capturevideoformat_t; +typedef struct capturevideostate_s +{ + double starttime; + double framerate; + // for AVI saving some values have to be written after capture ends + fs_offset_t videofile_totalframes_offset1; + fs_offset_t videofile_totalframes_offset2; + fs_offset_t videofile_totalsampleframes_offset; + qfile_t *videofile; + qboolean active; + qboolean realtime; + qboolean error; + capturevideoformat_t format; + int soundrate; + int frame; + int soundsampleframe; // for AVI saving + unsigned char *buffer; + sizebuf_t riffbuffer; + unsigned char riffbufferdata[128]; + // note: riffindex buffer has an allocated ->data member, not static like most! + sizebuf_t riffindexbuffer; + int riffstacklevel; + fs_offset_t riffstackstartoffset[4]; + short rgbtoyuvscaletable[3][3][256]; + unsigned char yuvnormalizetable[3][256]; + char basename[64]; +} +capturevideostate_t; + // // the client_static_t structure is persistent through an arbitrary number // of server connections @@ -476,6 +494,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]; @@ -497,17 +518,7 @@ typedef struct client_static_s char userinfo[MAX_USERINFO_STRING]; // video capture stuff - qboolean capturevideo_active; - capturevideoformat_t capturevideo_format; - double capturevideo_starttime; - double capturevideo_framerate; - int capturevideo_soundrate; - int capturevideo_frame; - unsigned char *capturevideo_buffer; - qfile_t *capturevideo_videofile; - qfile_t *capturevideo_soundfile; - short capturevideo_rgbtoyuvscaletable[3][3][256]; - unsigned char capturevideo_yuvnormalizetable[3][256]; + capturevideostate_t capturevideo; } client_static_t; @@ -583,20 +594,32 @@ typedef struct particle_s 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 friction; // how much air friction affects this object (objects with a low mass/size ratio tend to get more air friction) + 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 short owner; // decal stuck to this entity + 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 } particle_t; +typedef enum cl_parsingtextmode_e +{ + CL_PARSETEXTMODE_NONE, + CL_PARSETEXTMODE_PING, + CL_PARSETEXTMODE_STATUS, + CL_PARSETEXTMODE_STATUS_PLAYERID, + CL_PARSETEXTMODE_STATUS_PLAYERIP +} +cl_parsingtextmode_t; + // // the client_state_t structure is wiped completely at every // server signon @@ -629,6 +652,8 @@ typedef struct client_state_s float weapontime; // use pain anim frame if cl.time < this float faceanimtime; + // for stair smoothing + float stairoffset; // color shifts for damage, powerups cshift_t cshifts[NUM_CSHIFTS]; @@ -651,24 +676,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; @@ -764,6 +800,16 @@ typedef struct client_state_s // [cl.maxclients] scoreboard_t *scores; + // keep track of svc_print parsing state (analyzes ping reports and status reports) + cl_parsingtextmode_t parsingtextmode; + int parsingtextplayerindex; + // set by scoreboard code when sending ping command, this causes the next ping results to be hidden + // (which could eat the wrong ping report if the player issues one + // manually, but they would still see a ping report, just a later one + // caused by the scoreboard code rather than the one they intentionally + // issued) + int parsingtextexpectingpingforscores; + // entity database stuff // latest received entity frame numbers #define LATESTFRAMENUMS 3 @@ -832,8 +878,9 @@ typedef struct client_state_s // updated from serverinfo int qw_teamplay; - // indicates whether the player is spectating - qboolean qw_spectator; + // unused: indicates whether the player is spectating + // use cl.scores[cl.playerentity].qw_spectator instead + //qboolean qw_spectator; // movement parameters for client prediction float qw_movevars_gravity; @@ -897,9 +944,6 @@ extern cvar_t cl_anglespeedkey; extern cvar_t cl_autofire; -extern cvar_t csqc_progname; //[515]: csqc crc check and right csprogs name according to progs.dat -extern cvar_t csqc_progcrc; - extern cvar_t cl_shownet; extern cvar_t cl_nolerp; @@ -948,11 +992,7 @@ void CL_EstablishConnection(const char *host); void CL_Disconnect (void); 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; +void CL_UpdateRenderEntity(entity_render_t *ent); // // cl_input @@ -975,7 +1015,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); @@ -984,6 +1026,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); @@ -1071,7 +1114,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, @@ -1118,24 +1160,52 @@ void R_NewExplosion(const vec3_t org); #include "cl_screen.h" +extern qboolean sb_showscores; + #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]; @@ -1165,11 +1235,102 @@ 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]; + + // global RGB color multiplier for rendering, this is required by HDR + float colorscale; +} +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