This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
*/
// client.h
+#ifndef CLIENT_H
+#define CLIENT_H
+
+typedef struct frameblend_s
+{
+ int frame;
+ float lerp;
+}
+frameblend_t;
+
+// LordHavoc: nothing in this structure is persistant, it may be overwritten by the client every frame, for persistant data use entity_lerp_t.
+typedef struct entity_render_s
+{
+ // location
+ vec3_t origin;
+ // orientation
+ vec3_t angles;
+ // opacity (alpha) of the model
+ float alpha;
+ // size the model is shown
+ float scale;
+
+ // NULL = no model
+ model_t *model;
+ // current uninterpolated animation frame (for things which do not use interpolation)
+ int frame;
+ // entity shirt and pants colors
+ int colormap;
+ // light, particles, etc
+ int effects;
+ // for Alias models
+ int skinnum;
+ // render flags
+ int flags;
+
+ // these are copied from the persistent data
+
+ // 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;
+
+ // 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
+ frameblend_t frameblend[4];
+}
+entity_render_t;
+
+typedef struct entity_persistent_s
+{
+ // particles
+
+ // trail rendering
+ vec3_t trail_origin;
+ float trail_time;
+
+ // effects
+
+ // 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;
+}
+entity_persistent_t;
+
+typedef struct entity_s
+{
+ // baseline state (default values)
+ entity_state_t state_baseline;
+ // previous state (interpolating from this)
+ entity_state_t state_previous;
+ // current state (interpolating to this)
+ entity_state_t state_current;
+
+ // used for regenerating parts of render
+ entity_persistent_t persistent;
+
+ // the only data the renderer should know about
+ entity_render_t render;
+}
+entity_t;
+
typedef struct
{
vec3_t viewangles;
#define SIGNONS 4 // signon messages to receive before connected
-#include "r_light.h"
-
#define MAX_BEAMS 24
typedef struct
{
{
cactive_t state;
-// personalization data sent to server
+// personalization data sent to server
char mapstring[MAX_QPATH];
char spawnparms[MAX_MAPSTRING]; // to restart a level
{
int movemessages; // since connecting to this server
// throw out the first couple, so the player
- // doesn't accidentally do something the
+ // doesn't accidentally do something the
// first frame
+ float sendnoptime; // send a clc_nop periodically until connected
usercmd_t cmd; // last command sent to the server
// information for local display
vec3_t mviewangles[2]; // during demo playback viewangles is lerped
// between these
vec3_t viewangles;
-
+
vec3_t mvelocity[2]; // update by server, used for lean+bob
// (0 is newest)
vec3_t velocity; // lerped between mvelocity[0] and [1]
int intermission; // don't change view angle, full screen, etc
int completed_time; // latched at intermission start
- double mtime[2]; // the timestamp of last two messages
+ double mtime[2]; // the timestamp of last two messages
double time; // clients view of time, should be between
// servertime and oldservertime to generate
// a lerp point for other data
// refresh related state
struct model_s *worldmodel; // cl_entitites[0].model
-// int num_entities; // held in cl_entities array
int num_statics; // held in cl_staticentities array
entity_t viewent; // the gun model
// frag scoreboard
scoreboard_t *scores; // [cl.maxclients]
+
+ vec3_t viewentorigin;
+ float viewzoom; // LordHavoc: sniping zoom, QC controlled
+ float viewzoomold, viewzoomnew; // for interpolation
+
+ // entity database stuff
+ vec3_t viewentoriginold, viewentoriginnew;
+ entity_database_t entitydatabase;
}
client_state_t;
+extern mempool_t *cl_scores_mempool;
//
// cvars
extern entity_t cl_temp_entities[MAX_TEMP_ENTITIES];
extern beam_t cl_beams[MAX_BEAMS];
-//=============================================================================
-
#include "cl_light.h"
+//=============================================================================
+
//
// cl_main
//
-extern void CL_Init (void);
+void CL_Init (void);
-extern void CL_EstablishConnection (char *host);
-extern void CL_Signon1 (void);
-extern void CL_Signon2 (void);
-extern void CL_Signon3 (void);
-extern void CL_Signon4 (void);
+void CL_EstablishConnection (char *host);
-extern void CL_Disconnect (void);
-extern void CL_Disconnect_f (void);
-extern void CL_NextDemo (void);
-
-// LordHavoc: raised this from 256 to the maximum possible number of entities visible
-#define MAX_VISEDICTS (MAX_EDICTS + MAX_STATIC_ENTITIES + MAX_TEMP_ENTITIES)
-extern int cl_numvisedicts;
-extern entity_t *cl_visedicts[MAX_VISEDICTS];
+void CL_Disconnect (void);
+void CL_Disconnect_f (void);
//
// cl_input
extern kbutton_t in_strafe;
extern kbutton_t in_speed;
-extern void CL_InitInput (void);
-extern void CL_SendCmd (void);
-extern void CL_SendMove (usercmd_t *cmd);
+void CL_InitInput (void);
+void CL_SendCmd (void);
+void CL_SendMove (usercmd_t *cmd);
-extern void CL_ParseTEnt (void);
-extern void CL_UpdateTEnts (void);
-extern void CL_DoEffects (void);
+void CL_LerpUpdate(entity_t *e);
+void CL_ParseTEnt (void);
+void CL_UpdateTEnts (void);
-extern entity_t *CL_NewTempEntity (void);
+entity_t *CL_NewTempEntity (void);
-extern void CL_Effect(vec3_t org, int modelindex, int startframe, int framecount, float framerate);
+void CL_Effect(vec3_t org, int modelindex, int startframe, int framecount, float framerate);
-extern void CL_ClearState (void);
+void CL_ClearState (void);
-extern int CL_ReadFromServer (void);
-extern void CL_WriteToServer (usercmd_t *cmd);
-extern void CL_BaseMove (usercmd_t *cmd);
+int CL_ReadFromServer (void);
+void CL_WriteToServer (usercmd_t *cmd);
+void CL_BaseMove (usercmd_t *cmd);
-extern float CL_KeyState (kbutton_t *key);
-extern char *Key_KeynumToString (int keynum);
+float CL_KeyState (kbutton_t *key);
+char *Key_KeynumToString (int keynum);
//
// cl_demo.c
//
-extern void CL_StopPlayback (void);
-extern int CL_GetMessage (void);
+void CL_StopPlayback (void);
+int CL_GetMessage (void);
-extern void CL_Stop_f (void);
-extern void CL_Record_f (void);
-extern void CL_PlayDemo_f (void);
-extern 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
//
-extern void CL_Parse_Init(void);
-extern void CL_ParseServerMessage(void);
-extern void CL_BitProfile_f(void);
+void CL_Parse_Init(void);
+void CL_ParseServerMessage(void);
+void CL_BitProfile_f(void);
//
// view
//
-extern void V_StartPitchDrift (void);
-extern void V_StopPitchDrift (void);
+void V_StartPitchDrift (void);
+void V_StopPitchDrift (void);
-extern void V_RenderView (void);
-extern void V_UpdateBlends (void);
-extern void V_Register (void);
-extern void V_ParseDamage (void);
-extern void V_SetContentsColor (int contents);
+void V_Init (void);
+float V_CalcRoll (vec3_t angles, vec3_t velocity);
+void V_UpdateBlends (void);
+void V_ParseDamage (void);
//
// cl_tent
//
-extern void CL_InitTEnts (void);
-extern void CL_SignonReply (void);
+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);
+
+void CL_ParseParticleEffect (void);
+void CL_RunParticleEffect (vec3_t org, vec3_t dir, int color, int count);
+void CL_RocketTrail (vec3_t start, vec3_t end, int type, entity_t *ent);
+void CL_RocketTrail2 (vec3_t start, vec3_t end, int color, entity_t *ent);
+void CL_SparkShower (vec3_t org, vec3_t dir, int count);
+void CL_PlasmaBurn (vec3_t org);
+void CL_BloodPuff (vec3_t org, vec3_t vel, int count);
+void CL_Stardust (vec3_t mins, vec3_t maxs, int count);
+void CL_FlameCube (vec3_t mins, vec3_t maxs, int count);
+void CL_Flames (vec3_t org, vec3_t vel, int count);
+void CL_BloodShower (vec3_t mins, vec3_t maxs, float velspeed, int count);
+void CL_ParticleCube (vec3_t mins, vec3_t maxs, vec3_t dir, int count, int colorbase, int gravity, int randomvel);
+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_ParticleExplosion2 (vec3_t org, int colorStart, int colorLength);
+void CL_LavaSplash (vec3_t org);
+void CL_TeleportSplash (vec3_t org);
+void CL_MoveParticles(void);
+void R_MoveExplosions(void);
+void R_NewExplosion(vec3_t org);
+
+#include "cl_screen.h"
+
+#define MAX_VISEDICTS (MAX_EDICTS + MAX_STATIC_ENTITIES + MAX_TEMP_ENTITIES)
+
+typedef struct
+{
+ // area to render in
+ int x, y, width, height;
+ float fov_x, fov_y;
+
+ // view point
+ vec3_t vieworg;
+ vec3_t viewangles;
+
+ // fullscreen color blend
+ float viewblend[4];
+
+ // weapon model
+ entity_render_t viewent;
+
+ int numentities;
+ entity_render_t **entities;
+
+ qbyte drawqueue[MAX_DRAWQUEUE];
+ int drawqueuesize;
+}
+refdef_t;
+
+refdef_t r_refdef;
+
+extern mempool_t *cl_refdef_mempool;
+
+#include "cgamevm.h"
+
+#endif
+