]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - client.h
this patch adds a number of stereo viewing modes (shutter glasses and video glasses...
[xonotic/darkplaces.git] / client.h
index 3faba2f8e66e3725f5949269a0d5e2313ca076e3..8e040c95ce365473a4a9a27240d2a79032d80f5d 100644 (file)
--- a/client.h
+++ b/client.h
@@ -22,6 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #ifndef CLIENT_H
 #define CLIENT_H
 
+#include "matrixlib.h"
+
 // LordHavoc: 256 dynamic lights
 #define MAX_DLIGHTS 256
 // LordHavoc: this affects the lighting scale of the whole game
@@ -54,26 +56,136 @@ cl_effect_t;
 typedef struct
 {
        int             entity;
+       // draw this as lightning polygons, or a model?
+       int             lightning;
        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;
 
-typedef struct
+typedef struct rtlight_s
+{
+       // shadow volumes are done entirely in model space, so there are no matrices for dealing with them...  they just use the origin 
+
+       // note that the world to light matrices are inversely scaled (divided) by lightradius
+
+       // core properties
+       // matrix for transforming world coordinates to light filter coordinates
+       matrix4x4_t matrix_worldtolight;
+       // based on worldtolight this transforms -1 to +1 to 0 to 1 for purposes
+       // of attenuation texturing in full 3D (Z result often ignored)
+       matrix4x4_t matrix_worldtoattenuationxyz;
+       // this transforms only the Z to S, and T is always 0.5
+       matrix4x4_t matrix_worldtoattenuationz;
+       // typically 1 1 1, can be lower (dim) or higher (overbright)
+       vec3_t color;
+       // size of the light (remove?)
+       vec_t radius;
+       // light filter
+       char cubemapname[64];
+       // whether light should render shadows
+       int shadow;
+       // intensity of corona to render
+       vec_t corona;
+       // light style to monitor for brightness
+       int style;
+       
+       // generated properties
+       // used only for shadow volumes
+       vec3_t shadoworigin;
+       // culling
+       vec3_t cullmins;
+       vec3_t cullmaxs;
+       // culling
+       //vec_t cullradius;
+       // squared cullradius
+       //vec_t cullradius2;
+
+       // lightmap renderer stuff (remove someday!)
+       // the size of the light
+       vec_t lightmap_cullradius;
+       // the size of the light, squared
+       vec_t lightmap_cullradius2;
+       // the brightness of the light
+       vec3_t lightmap_light;
+       // to avoid sudden brightness change at cullradius, subtract this
+       vec_t lightmap_subtract;
+
+       // 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
+       int compiled;
+       // premade shadow volumes and lit surfaces to render for world entity
+       shadowmesh_t *static_meshchain_shadow;
+       shadowmesh_t *static_meshchain_light;
+       // used for visibility testing (more exact than bbox)
+       int static_numclusters;
+       int static_numclusterpvsbytes;
+       int *static_clusterlist;
+       qbyte *static_clusterpvs;
+}
+rtlight_t;
+
+typedef struct dlight_s
 {
+       // destroy light after this time
+       // (dlight only)
+       vec_t die;
+       // the entity that owns this light (can be NULL)
+       // (dlight only)
+       struct entity_render_s *ent;
        // location
-       vec3_t  origin;
-       // stop lighting after this time
-       float   die;
+       // (worldlight: saved to .rtlights file)
+       vec3_t origin;
+       // worldlight orientation
+       // (worldlight only)
+       // (worldlight: saved to .rtlights file)
+       vec3_t angles;
+       // dlight orientation/scaling/location
+       // (dlight only)
+       matrix4x4_t matrix;
        // color of light
-       vec3_t  color;
+       // (worldlight: saved to .rtlights file)
+       vec3_t color;
+       // cubemap number to use on this light
+       // (dlight only)
+       int cubemapnum;
+       // cubemap name to use on this light
+       // (worldlight only)
+       // (worldlight: saved to .rtlights file)
+       char cubemapname[64];
+       // make light flash while selected
+       // (worldlight only)
+       int selected;
        // brightness (not really radius anymore)
-       float   radius;
-       // drop this each second
-       float   decay;
-       // the entity that spawned this light (can be NULL if it will never be replaced)
-       //entity_render_t *ent;
+       // (worldlight: saved to .rtlights file)
+       vec_t radius;
+       // drop radius this much each second
+       // (dlight only)
+       vec_t decay;
+       // light style which controls intensity of this light
+       // (worldlight: saved to .rtlights file)
+       int style;
+       // cast shadows
+       // (worldlight: saved to .rtlights file)
+       int shadow;
+       // corona intensity
+       // (worldlight: saved to .rtlights file)
+       vec_t corona;
+       // linked list of world lights
+       // (worldlight only)
+       struct dlight_s *next;
+       // embedded rtlight struct for renderer
+       // (renderer only)      
+       rtlight_t rtlight;
 }
 dlight_t;
 
@@ -84,14 +196,18 @@ typedef struct frameblend_s
 }
 frameblend_t;
 
-// LordHavoc: disregard the following warning, entlights stuff is semi-persistent...
-// LordHavoc: nothing in this structure is persistent, it may be overwritten by the client every frame, for persistent data use entity_lerp_t.
+// LordHavoc: this struct is intended for the renderer but some fields are
+// used by the client.
 typedef struct entity_render_s
 {
        // location
        vec3_t origin;
        // orientation
        vec3_t angles;
+       // transform matrix for model to world
+       matrix4x4_t matrix;
+       // transform matrix for world to model
+       matrix4x4_t inversematrix;
        // opacity (alpha) of the model
        float alpha;
        // size the model is shown
@@ -110,14 +226,14 @@ typedef struct entity_render_s
        // render flags
        int flags;
 
-       // these are copied from the persistent data
+       // interpolated animation
 
        // frame that the model is interpolating from
        int frame1;
        // frame that the model is interpolating to
        int frame2;
        // interpolation factor, usually computed from frame2time
-       double framelerp;
+       float framelerp;
        // time frame1 began playing (for framegroup animations)
        double frame1time;
        // time frame2 began playing (for framegroup animations)
@@ -135,6 +251,7 @@ typedef struct entity_render_s
        // caching results of static light traces (this is semi-persistent)
        double entlightstime;
        vec3_t entlightsorigin;
+       int entlightsframe;
        int numentlights;
        unsigned short entlights[MAXENTLIGHTS];
 }
@@ -142,31 +259,27 @@ entity_render_t;
 
 typedef struct entity_persistent_s
 {
-       // particles
+       int linkframe;
 
-       // trail rendering
        vec3_t trail_origin;
-       float trail_time;
 
-       // effects
+       // particle trail
+       float trail_time;
 
        // muzzleflash fading
        float muzzleflash;
 
-       // interpolated animation
-
-       // lerp resets when model changes
-       int modelindex;
-       // frame that the model is interpolating from
-       int frame1;
-       // frame that the model is interpolating to
-       int frame2;
-       // interpolation factor, usually computed from frame2time
-       double framelerp;
-       // time frame1 began playing (for framegroup animations)
-       double frame1time;
-       // time frame2 began playing (for framegroup animations)
-       double frame2time;
+       // interpolated movement
+
+       // start time of move
+       float lerpstarttime;
+       // time difference from start to end of move
+       float lerpdeltatime;
+       // the move itself, start and end
+       float oldorigin[3];
+       float oldangles[3];
+       float neworigin[3];
+       float newangles[3];
 }
 entity_persistent_t;
 
@@ -206,7 +319,6 @@ typedef struct
 typedef struct
 {
        char    name[MAX_SCOREBOARDNAME];
-       float   entertime;
        int             frags;
        int             colors; // two 4 bit fields
 } scoreboard_t;
@@ -221,7 +333,8 @@ typedef struct
 #define        CSHIFT_DAMAGE   1
 #define        CSHIFT_BONUS    2
 #define        CSHIFT_POWERUP  3
-#define        NUM_CSHIFTS             4
+#define        CSHIFT_VCSHIFT  4
+#define        NUM_CSHIFTS             5
 
 #define        NAME_LENGTH     64
 
@@ -232,7 +345,6 @@ typedef struct
 
 #define        SIGNONS         4                       // signon messages to receive before connected
 
-#define        MAX_MAPSTRING   2048
 #define        MAX_DEMOS               8
 #define        MAX_DEMONAME    16
 
@@ -252,16 +364,13 @@ typedef struct
 {
        cactive_t state;
 
-// personalization data sent to server
-       char mapstring[MAX_QPATH];
-       // to restart a level
-       //char spawnparms[MAX_MAPSTRING];
-
 // demo loop control
        // -1 = don't play demos
        int demonum;
        // list of demos in loop
        char demos[MAX_DEMOS][MAX_DEMONAME];
+       // the actively playing demo (set by CL_PlayDemo_f)
+       char demoname[64];
 
 // demo recording info must be here, because record is started before
 // entering a map (and clearing client_state_t)
@@ -270,22 +379,31 @@ typedef struct
        qboolean timedemo;
        // -1 = use normal cd track
        int forcetrack;
-       QFile *demofile;
+       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;
+       // LordHavoc: for measuring maxfps
+       double td_minframetime;
+       // LordHavoc: for measuring minfps
+       double td_maxframetime;
        // LordHavoc: pausedemo
        qboolean demopaused;
 
+       qboolean connect_trying;
+       int connect_remainingtries;
+       double connect_nextsendtime;
+       lhnetsocket_t *connect_mysocket;
+       lhnetaddress_t connect_address;
 
 // connection information
        // 0 to SIGNONS
        int signon;
-       // network socket
-       struct qsocket_s *netcon;
+       // network connection
+       netconn_t *netcon;
        // writing buffer to send to server
        sizebuf_t message;
 }
@@ -299,6 +417,9 @@ extern client_static_t      cls;
 //
 typedef struct
 {
+       // true if playing in a local game and no one else is connected
+       int islocalgame;
+
        // when connecting to the server throw out the first couple move messages
        // so the player doesn't accidentally do something the first frame
        int movemessages;
@@ -316,6 +437,8 @@ typedef struct
        int items;
        // cl.time of acquiring item, for blinking
        float item_gettime[32];
+       // cl.time of changing STAT_ACTIVEWEAPON
+       float weapontime;
        // use pain anim frame if cl.time < this
        float faceanimtime;
 
@@ -408,16 +531,17 @@ typedef struct
        // [cl.maxclients]
        scoreboard_t *scores;
 
-       // used by view code for setting up eye position
-       vec3_t viewentorigin;
        // LordHavoc: sniping zoom, QC controlled
        float viewzoom;
        // for interpolation
        float viewzoomold, viewzoomnew;
 
+       // protocol version of the server we're connected to
+       int protocol;
+
        // entity database stuff
-       vec3_t viewentoriginold, viewentoriginnew;
        entity_database_t entitydatabase;
+       entity_database4_t *entitydatabase4;
 }
 client_state_t;
 
@@ -428,6 +552,7 @@ extern mempool_t *cl_scores_mempool;
 //
 extern cvar_t cl_name;
 extern cvar_t cl_color;
+extern cvar_t cl_rate;
 extern cvar_t cl_pmodel;
 
 extern cvar_t cl_upspeed;
@@ -462,9 +587,14 @@ extern cvar_t m_side;
 extern cvar_t r_draweffects;
 
 extern cvar_t cl_explosions;
+extern cvar_t cl_explosions_alpha_start;
+extern cvar_t cl_explosions_alpha_end;
+extern cvar_t cl_explosions_size_start;
+extern cvar_t cl_explosions_size_end;
+extern cvar_t cl_explosions_lifetime;
 extern cvar_t cl_stainmaps;
 
-// these are updated by
+// these are updated by CL_ClearState
 extern int cl_num_entities;
 extern int cl_num_static_entities;
 extern int cl_num_temp_entities;
@@ -483,7 +613,7 @@ extern lightstyle_t *cl_lightstyle;
 
 extern client_state_t cl;
 
-extern void CL_AllocDlight (entity_render_t *ent, vec3_t org, float radius, float red, float green, float blue, float decay, float lifetime);
+extern void CL_AllocDlight (entity_render_t *ent, matrix4x4_t *matrix, float radius, float red, float green, float blue, float decay, float lifetime, int cubemapnum, int style, int shadowenable, vec_t corona);
 extern void CL_DecayLights (void);
 
 //=============================================================================
@@ -494,11 +624,17 @@ extern void CL_DecayLights (void);
 
 void CL_Init (void);
 
-void CL_EstablishConnection (char *host);
+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;
+
 //
 // cl_input
 //
@@ -514,7 +650,7 @@ extern      kbutton_t       in_strafe;
 extern         kbutton_t       in_speed;
 
 void CL_InitInput (void);
-void CL_SendCmd (void);
+void CL_SendCmd (usercmd_t *cmd);
 void CL_SendMove (usercmd_t *cmd);
 
 void CL_LerpUpdate(entity_t *e);
@@ -535,26 +671,27 @@ void CL_BaseMove (usercmd_t *cmd);
 
 
 float CL_KeyState (kbutton_t *key);
-char *Key_KeynumToString (int keynum);
+const char *Key_KeynumToString (int keynum);
 
 //
 // cl_demo.c
 //
-void CL_StopPlayback (void);
-int CL_GetMessage (void);
+void CL_StopPlayback(void);
+void CL_ReadDemoMessage(void);
+void CL_WriteDemoMessage(void);
 
-void CL_NextDemo (void);
-void CL_Stop_f (void);
-void CL_Record_f (void);
-void CL_PlayDemo_f (void);
-void CL_TimeDemo_f (void);
+void CL_NextDemo(void);
+void CL_Stop_f(void);
+void CL_Record_f(void);
+void CL_PlayDemo_f(void);
+void CL_TimeDemo_f(void);
 
 //
 // cl_parse.c
 //
 void CL_Parse_Init(void);
 void CL_ParseServerMessage(void);
-void CL_BitProfile_f(void);
+void CL_Parse_DumpPacket(void);
 
 //
 // view
@@ -577,11 +714,6 @@ void CL_InitTEnts (void);
 // cl_part
 //
 
-#define PARTICLE_INVALID 0
-#define PARTICLE_BILLBOARD 1
-#define PARTICLE_UPRIGHT_FACING 2
-#define PARTICLE_ORIENTED_DOUBLESIDED 3
-
 void CL_Particles_Clear(void);
 void CL_Particles_Init(void);
 
@@ -600,10 +732,13 @@ void CL_ParticleCube (vec3_t mins, vec3_t maxs, vec3_t dir, int count, int color
 void CL_ParticleRain (vec3_t mins, vec3_t maxs, vec3_t dir, int count, int colorbase, int type);
 void CL_EntityParticles (entity_t *ent);
 void CL_BlobExplosion (vec3_t org);
-void CL_ParticleExplosion (vec3_t org, int smoke);
+void CL_ParticleExplosion (vec3_t org);
 void CL_ParticleExplosion2 (vec3_t org, int colorStart, int colorLength);
 void CL_LavaSplash (vec3_t org);
 void CL_TeleportSplash (vec3_t org);
+void CL_BeamParticle (const vec3_t start, const vec3_t end, vec_t radius, float red, float green, float blue, float alpha, float lifetime);
+void CL_Tei_Smoke(const vec3_t pos, const vec3_t dir, int count);
+void CL_Tei_PlasmaHit(const vec3_t pos, const vec3_t dir, int count);
 void CL_MoveParticles(void);
 void R_MoveExplosions(void);
 void R_NewExplosion(vec3_t org);
@@ -616,16 +751,15 @@ typedef struct
        int x, y, width, height;
        float fov_x, fov_y;
 
-       // view point
-       vec3_t vieworg;
-       vec3_t viewangles;
+       // view transform
+       matrix4x4_t viewentitymatrix;
+
+       // which color components to allow (for anaglyph glasses)
+       int colormask[4];
 
        // fullscreen color blend
        float viewblend[4];
 
-       // weapon model
-       entity_render_t viewent;
-
        entity_render_t **entities;
        int numentities;
        int maxentities;