+#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
+
+// flags for rtlight rendering
+#define LIGHTFLAG_NORMALMODE 1
+#define LIGHTFLAG_REALTIMEMODE 2
+
+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 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];
+ // light style to monitor for brightness
+ int style;
+ // whether light should render shadows
+ int shadow;
+ // intensity of corona to render
+ vec_t corona;
+ // radius scale of corona to render (1.0 means same as light radius)
+ vec_t coronasizescale;
+ // ambient intensity to render
+ vec_t ambientscale;
+ // diffuse intensity to render
+ vec_t diffusescale;
+ // specular intensity to render
+ vec_t specularscale;
+ // LIGHTFLAG_* flags
+ int flags;
+
+ // 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
+ // (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
+ // (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)
+ // (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;
+ // radius scale of corona to render (1.0 means same as light radius)
+ // (worldlight: saved to .rtlights file)
+ vec_t coronasizescale;
+ // ambient intensity to render
+ // (worldlight: saved to .rtlights file)
+ vec_t ambientscale;
+ // diffuse intensity to render
+ // (worldlight: saved to .rtlights file)
+ vec_t diffusescale;
+ // specular intensity to render
+ // (worldlight: saved to .rtlights file)
+ vec_t specularscale;
+ // LIGHTFLAG_* flags
+ // (worldlight: saved to .rtlights file)
+ int flags;
+ // linked list of world lights
+ // (worldlight only)
+ struct dlight_s *next;
+ // embedded rtlight struct for renderer
+ // (renderer only)
+ rtlight_t rtlight;
+}
+dlight_t;
+