]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - client.h
restoring scaffolding for cubemap and 2D shadowmaps
[xonotic/darkplaces.git] / client.h
index 2372df941ca30c943239d2b9b734d9c4bf35703f..f6a8a4d67e3a22a44c7b1964fd8b43b02c24a083 100644 (file)
--- a/client.h
+++ b/client.h
@@ -28,8 +28,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // LordHavoc: 256 dynamic lights
 #define MAX_DLIGHTS 256
 
-// this is the maximum number of input packets that can be predicted
-#define CL_MAX_USERCMDS 256
+/// this is the maximum number of input packets that can be predicted
+#define CL_MAX_USERCMDS 128
 
 // flags for rtlight rendering
 #define LIGHTFLAG_NORMALMODE 1
@@ -69,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
@@ -110,40 +110,40 @@ typedef struct rtlight_s
        // rendering properties, updated each time a light is rendered
        // this is rtlight->color * d_lightstylevalue
        vec3_t currentcolor;
-       // used by corona updates, due to occlusion query
+       /// 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)
+       /// 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
+       /// 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)
+       /// 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;
 }
@@ -222,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;
 
@@ -271,18 +288,9 @@ 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;
 
@@ -290,8 +298,11 @@ typedef struct entity_render_s
 
        // 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;
@@ -458,11 +469,11 @@ typedef struct capturevideostate_s
 {
        double startrealtime;
        double framerate;
-       qfile_t *videofile;
+       int framestep;
+       int framestepframe;
        qboolean active;
        qboolean realtime;
        qboolean error;
-       capturevideoformat_t format;
        int soundrate;
        int soundchannels;
        int frame;
@@ -472,13 +483,25 @@ typedef struct capturevideostate_s
        int soundsampleframe;
        unsigned char *screenbuffer;
        unsigned char *outbuffer;
-       char basename[64];
+       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];
 
-       // format specific functions
-       void (*endvideo) ();
+       // 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);
 
@@ -637,7 +660,8 @@ 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;
@@ -667,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;
@@ -676,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
@@ -700,6 +725,9 @@ typedef struct particle_s
        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
@@ -861,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;
@@ -1021,6 +1055,7 @@ typedef struct client_state_s
        double lastpackettime;
 
        // movement parameters for client prediction
+       unsigned int moveflags;
        float movevars_wallfriction;
        float movevars_waterfriction;
        float movevars_friction;
@@ -1039,6 +1074,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;
@@ -1244,6 +1289,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
@@ -1379,6 +1425,32 @@ typedef struct r_refdef_stats_s
 }
 r_refdef_stats_t;
 
+typedef enum r_viewport_type_e
+{
+       R_VIEWPORTTYPE_ORTHO,
+       R_VIEWPORTTYPE_PERSPECTIVE,
+       R_VIEWPORTTYPE_PERSPECTIVE_INFINITEFARCLIP,
+       R_VIEWPORTTYPE_PERSPECTIVECUBESIDE,
+       R_VIEWPORTTYPE_TOTAL
+}
+r_viewport_type_t;
+
+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 x;
+       int y;
+       int z;
+       int width;
+       int height;
+       int depth;
+       r_viewport_type_t type;
+}
+r_viewport_t;
+
 typedef struct r_refdef_view_s
 {
        // view information (changes multiple times per frame)
@@ -1415,6 +1487,7 @@ typedef struct r_refdef_view_s
        int width;
        int height;
        int depth;
+       r_viewport_t viewport;
 
        // which color components to allow (for anaglyph glasses)
        int colormask[4];