+#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
+#define LIGHTOFFSET 1024.0f
+// max lights shining on one entity
+#define MAXENTLIGHTS 128
+
+extern int cl_max_entities;
+extern int cl_max_static_entities;
+extern int cl_max_temp_entities;
+extern int cl_max_effects;
+extern int cl_max_beams;
+
+typedef struct effect_s
+{
+ int active;
+ vec3_t origin;
+ float starttime;
+ float framerate;
+ int modelindex;
+ int startframe;
+ int endframe;
+ // these are for interpolation
+ int frame;
+ double frame1time;
+ double frame2time;
+}
+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
+{
+ // location
+ vec3_t origin;
+ // stop lighting after this time
+ float die;
+ // color of light
+ vec3_t color;
+ // brightness (not really radius anymore)
+ float radius;
+ // drop this each second
+ float decay;
+ // the entity that owns this light (can be NULL)
+ struct entity_render_s *ent;
+}
+dlight_t;
+
+typedef struct frameblend_s
+{
+ int frame;
+ float lerp;
+}
+frameblend_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
+ 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;
+
+ // 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
+ float 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];
+
+ // caching results of static light traces (this is semi-persistent)
+ double entlightstime;
+ vec3_t entlightsorigin;
+ int entlightsframe;
+ int numentlights;
+ unsigned short entlights[MAXENTLIGHTS];
+}
+entity_render_t;
+
+typedef struct entity_persistent_s
+{
+ int linkframe;
+
+ vec3_t trail_origin;
+
+ // particle trail
+ float trail_time;
+
+ // muzzleflash fading
+ float muzzleflash;
+
+ // 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;
+
+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;
+