]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - client.h
[04:31:11] <@LordHavoc> div0: 9179 (if (msecdelta <= 0) return;) wrecked connect...
[xonotic/darkplaces.git] / client.h
index 412980641c8fc222d9442ac3c31c523dc24aa05f..fc13bae0bb767e983f8aefd698f3c7060eb36668 100644 (file)
--- a/client.h
+++ b/client.h
@@ -23,11 +23,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define CLIENT_H
 
 #include "matrixlib.h"
+#include "snd_main.h"
 
 // LordHavoc: 256 dynamic lights
 #define MAX_DLIGHTS 256
 
-// this is the maximum number of input packets that can be predicted
+/// this is the maximum number of input packets that can be predicted
 #define CL_MAX_USERCMDS 256
 
 // flags for rtlight rendering
@@ -38,7 +39,7 @@ typedef struct effect_s
 {
        int active;
        vec3_t origin;
-       float starttime;
+       double starttime;
        float framerate;
        int modelindex;
        int startframe;
@@ -68,37 +69,37 @@ typedef struct rtlight_s
        // note that the world to light matrices are inversely scaled (divided) by lightradius
 
        // core properties
-       // matrix for transforming light filter coordinates to world coordinates
+       /// matrix for transforming light filter coordinates to world coordinates
        matrix4x4_t matrix_lighttoworld;
-       // matrix for transforming world coordinates to light filter coordinates
+       /// matrix for transforming world coordinates to light filter coordinates
        matrix4x4_t matrix_worldtolight;
-       // typically 1 1 1, can be lower (dim) or higher (overbright)
+       /// typically 1 1 1, can be lower (dim) or higher (overbright)
        vec3_t color;
-       // size of the light (remove?)
+       /// size of the light (remove?)
        vec_t radius;
-       // light filter
+       /// light filter
        char cubemapname[64];
-       // light style to monitor for brightness
+       /// light style to monitor for brightness
        int style;
-       // whether light should render shadows
+       /// whether light should render shadows
        int shadow;
-       // intensity of corona to render
+       /// intensity of corona to render
        vec_t corona;
-       // radius scale of corona to render (1.0 means same as light radius)
+       /// radius scale of corona to render (1.0 means same as light radius)
        vec_t coronasizescale;
-       // ambient intensity to render
+       /// ambient intensity to render
        vec_t ambientscale;
-       // diffuse intensity to render
+       /// diffuse intensity to render
        vec_t diffusescale;
-       // specular intensity to render
+       /// specular intensity to render
        vec_t specularscale;
-       // LIGHTFLAG_* flags
+       /// LIGHTFLAG_* flags
        int flags;
 
        // generated properties
-       // used only for shadow volumes
+       /// used only for shadow volumes
        vec3_t shadoworigin;
-       // culling
+       /// culling
        vec3_t cullmins;
        vec3_t cullmaxs;
        // culling
@@ -109,35 +110,40 @@ typedef struct rtlight_s
        // rendering properties, updated each time a light is rendered
        // this is rtlight->color * d_lightstylevalue
        vec3_t currentcolor;
-       // this is R_Shadow_Cubemap(rtlight->cubemapname)
+       /// used by corona updates, due to occlusion query
+       float corona_visibility;
+       unsigned int corona_queryindex_visiblepixels;
+       unsigned int corona_queryindex_allpixels;
+       /// this is R_Shadow_Cubemap(rtlight->cubemapname)
        rtexture_t *currentcubemap;
 
-       // static light info
-       // true if this light should be compiled as a static light
+       /// static light info
+       /// true if this light should be compiled as a static light
        int isstatic;
-       // true if this is a compiled world light, cleared if the light changes
+       /// true if this is a compiled world light, cleared if the light changes
        int compiled;
-       // premade shadow volumes to render for world entity
-       shadowmesh_t *static_meshchain_shadow;
-       // used for visibility testing (more exact than bbox)
+       /// premade shadow volumes to render for world entity
+       shadowmesh_t *static_meshchain_shadow_zpass;
+       shadowmesh_t *static_meshchain_shadow_zfail;
+       /// used for visibility testing (more exact than bbox)
        int static_numleafs;
        int static_numleafpvsbytes;
        int *static_leaflist;
        unsigned char *static_leafpvs;
-       // surfaces seen by light
+       /// surfaces seen by light
        int static_numsurfaces;
        int *static_surfacelist;
-       // flag bits indicating which triangles of the world model should cast
-       // shadows, and which ones should be lit
-       //
-       // this avoids redundantly scanning the triangles in each surface twice
-       // for whether they should cast shadows, once in culling and once in the
-       // actual shadowmarklist production.
+       /// flag bits indicating which triangles of the world model should cast
+       /// shadows, and which ones should be lit
+       ///
+       /// this avoids redundantly scanning the triangles in each surface twice
+       /// for whether they should cast shadows, once in culling and once in the
+       /// actual shadowmarklist production.
        int static_numshadowtrispvsbytes;
        unsigned char *static_shadowtrispvs;
-       // this allows the lighting batch code to skip backfaces andother culled
-       // triangles not relevant for lighting
-       // (important on big surfaces such as terrain)
+       /// this allows the lighting batch code to skip backfaces andother culled
+       /// triangles not relevant for lighting
+       /// (important on big surfaces such as terrain)
        int static_numlighttrispvsbytes;
        unsigned char *static_lighttrispvs;
 }
@@ -216,10 +222,27 @@ typedef struct dlight_s
 }
 dlight_t;
 
-typedef struct frameblend_s
+#define MAX_FRAMEGROUPBLENDS 4
+typedef struct framegroupblend_s
 {
+       // animation number and blend factor
+       // (for most models this is the frame number)
        int frame;
        float lerp;
+       // time frame began playing (for framegroup animations)
+       double start;
+}
+framegroupblend_t;
+
+// this is derived from processing of the framegroupblend array
+// note: technically each framegroupblend can produce two of these, but that
+// never happens in practice because no one blends between more than 2
+// framegroups at once
+#define MAX_FRAMEBLENDS MAX_FRAMEGROUPBLENDS
+typedef struct frameblend_s
+{
+       int subframe;
+       float lerp;
 }
 frameblend_t;
 
@@ -265,25 +288,21 @@ typedef struct entity_render_s
        // colormod tinting of models
        float colormod[3];
 
-       // interpolated animation
+       // interpolated animation - active framegroups and blend factors
+       framegroupblend_t framegroupblend[MAX_FRAMEGROUPBLENDS];
 
-       // frame that the model is interpolating from
-       int frame1;
-       // frame that the model is interpolating to
-       int frame2;
-       // interpolation factor, usually computed from frame2time
-       float framelerp;
-       // time frame1 began playing (for framegroup animations)
-       double frame1time;
-       // time frame2 began playing (for framegroup animations)
-       double frame2time;
+       // time of last model change (for shader animations)
+       double shadertime;
 
        // calculated by the renderer (but not persistent)
 
        // 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
-       frameblend_t frameblend[4];
+       // 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];
+
+       // animation cache index
+       int animcacheindex;
 
        // current lighting from map (updated ONLY by client code, not renderer)
        vec3_t modellight_ambient;
@@ -441,46 +460,53 @@ qw_downloadtype_t;
 
 typedef enum capturevideoformat_e
 {
-       CAPTUREVIDEOFORMAT_AVI_I420
+       CAPTUREVIDEOFORMAT_AVI_I420,
+       CAPTUREVIDEOFORMAT_OGG_VORBIS_THEORA,
 }
 capturevideoformat_t;
 
 typedef struct capturevideostate_s
 {
-       double starttime;
+       double startrealtime;
        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;
+       int framestep;
+       int framestepframe;
        qboolean active;
        qboolean realtime;
        qboolean error;
-       capturevideoformat_t format;
        int soundrate;
+       int soundchannels;
        int frame;
-       int soundsampleframe; // for AVI saving
+       double starttime;
+       double lastfpstime;
+       int lastfpsframe;
+       int soundsampleframe;
        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!
-       sizebuf_t riffindexbuffer;
-       int riffstacklevel;
-       fs_offset_t riffstackstartoffset[4];
+       char basename[MAX_QPATH];
+       int width, height;
+
+       // precomputed RGB to YUV tables
+       // converts the RGB values to YUV (see cap_avi.c for how to use them)
        short rgbtoyuvscaletable[3][3][256];
        unsigned char yuvnormalizetable[3][256];
-       char basename[64];
-       int width, height;
+
+       // precomputed gamma ramp (only needed if the capturevideo module uses RGB output)
+       // note: to map from these values to RGB24, you have to multiply by 255.0/65535.0, then add 0.5, then cast to integer
+       unsigned short vidramp[256 * 3];
+
+       // stuff to be filled in by the video format module
+       capturevideoformat_t format;
+       const char *formatextension;
+       qfile_t *videofile;
+               // always use this:
+               //   cls.capturevideo.videofile = FS_OpenRealFile(va("%s.%s", cls.capturevideo.basename, cls.capturevideo.formatextension), "wb", false);
+       void (*endvideo) (void);
+       void (*videoframes) (int num);
+       void (*soundframe) (const portable_sampleframe_t *paintbuffer, size_t length);
+
+       // format specific data
+       void *formatspecific;
 }
 capturevideostate_t;
 
@@ -518,11 +544,13 @@ typedef struct client_static_s
        // list of demos in loop
        char demos[MAX_DEMOS][MAX_DEMONAME];
        // the actively playing demo (set by CL_PlayDemo_f)
-       char demoname[64];
+       char demoname[MAX_QPATH];
 
 // demo recording info must be here, because record is started before
 // entering a map (and clearing client_state_t)
        qboolean demorecording;
+       fs_offset_t demo_lastcsprogssize;
+       int demo_lastcsprogscrc;
        qboolean demoplayback;
        qboolean timedemo;
        // -1 = use normal cd track
@@ -587,6 +615,7 @@ typedef struct client_static_s
        double qw_downloadspeedtime;
        int qw_downloadspeedcount;
        int qw_downloadspeedrate;
+       qboolean qw_download_deflate;
 
        // current file upload buffer (for uploading screenshots to server)
        unsigned char *qw_uploaddata;
@@ -631,7 +660,9 @@ typedef enum
        PARTICLE_BILLBOARD = 0,
        PARTICLE_SPARK = 1,
        PARTICLE_ORIENTED_DOUBLESIDED = 2,
-       PARTICLE_BEAM = 3
+       PARTICLE_VBEAM = 3,
+       PARTICLE_HBEAM = 4,
+       PARTICLE_INVALID = -1
 }
 porientation_t;
 
@@ -639,7 +670,8 @@ typedef enum
 {
        PBLEND_ALPHA = 0,
        PBLEND_ADD = 1,
-       PBLEND_MOD = 2
+       PBLEND_INVMOD = 2,
+       PBLEND_INVALID = -1
 }
 pblend_t;
 
@@ -659,7 +691,7 @@ ptype_t;
 
 typedef struct decal_s
 {
-       // fields used by rendering:  (40 bytes)
+       // fields used by rendering:  (44 bytes)
        unsigned short  typeindex;
        unsigned short  texnum;
        vec3_t                  org;
@@ -668,6 +700,7 @@ typedef struct decal_s
        float                   alpha; // 0-255
        unsigned char   color[3];
        unsigned char   unused1;
+       int                             clusterindex; // cheap culling by pvs
 
        // fields not used by rendering: (36 bytes in 32bit, 40 bytes in 64bit)
        float                   time2; // used for decal fade
@@ -681,14 +714,20 @@ decal_t;
 typedef struct particle_s
 {
        // fields used by rendering: (40 bytes)
-       unsigned short  typeindex;
-       unsigned short  texnum;
+       unsigned char   typeindex;
+       pblend_t   blendmode;
+       porientation_t   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;
+       signed char     staintexnum;
+       float           stainsizefactor;
 
        // fields not used by rendering:  (40 bytes)
        float                   sizeincrease; // rate of size change per second
@@ -850,6 +889,12 @@ typedef struct client_state_s
        // how long it has been since the previous client frame in real time
        // (not game time, for that use cl.time - cl.oldtime)
        double realframetime;
+       
+       // fade var for fading while dead
+       float deathfade;
+
+       // motionblur alpha level variable
+       float motionbluralpha;
 
        // copy of realtime from last recieved message, for net trouble icon
        float last_received_message;
@@ -1028,6 +1073,16 @@ typedef struct client_state_s
        float movevars_stepheight;
        float movevars_airaccel_qw;
        float movevars_airaccel_sideways_friction;
+       float movevars_airstopaccelerate;
+       float movevars_airstrafeaccelerate;
+       float movevars_maxairstrafespeed;
+       float movevars_aircontrol;
+       float movevars_warsowbunny_airforwardaccel;
+       float movevars_warsowbunny_accel;
+       float movevars_warsowbunny_topspeed;
+       float movevars_warsowbunny_turnaccel;
+       float movevars_warsowbunny_backtosideratio;
+       float movevars_ticrate;
 
        // models used by qw protocol
        int qw_modelindex_spike;
@@ -1188,7 +1243,7 @@ void CL_Beam_CalculatePositions (const beam_t *b, vec3_t start, vec3_t end);
 void CL_ClientMovement_Replay(void);
 
 void CL_ClearTempEntities (void);
-entity_render_t *CL_NewTempEntity (void);
+entity_render_t *CL_NewTempEntity (double shadertime);
 
 void CL_Effect(vec3_t org, int modelindex, int startframe, int framecount, float framerate);
 
@@ -1214,6 +1269,9 @@ void CL_StopPlayback(void);
 void CL_ReadDemoMessage(void);
 void CL_WriteDemoMessage(sizebuf_t *mesage);
 
+void CL_CutDemo(unsigned char **buf, fs_offset_t *filesize);
+void CL_PasteDemo(unsigned char **buf, fs_offset_t *filesize);
+
 void CL_NextDemo(void);
 void CL_Stop_f(void);
 void CL_Record_f(void);
@@ -1230,6 +1288,7 @@ void CL_Parse_DumpPacket(void);
 void CL_Parse_ErrorCleanUp(void);
 void QW_CL_StartUpload(unsigned char *data, int size);
 extern cvar_t qport;
+void CL_KeepaliveMessage(qboolean readmessages); // call this during loading of large content
 
 //
 // view
@@ -1473,7 +1532,8 @@ typedef struct r_refdef_scene_s {
        int maxtempentities;
 
        // renderable dynamic lights
-       rtlight_t lights[MAX_DLIGHTS];
+       rtlight_t *lights[MAX_DLIGHTS];
+       rtlight_t templights[MAX_DLIGHTS];
        int numlights;
 
        // intensities for light styles right now, controls rtlights