#include "matrixlib.h"
#include "snd_main.h"
-// 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
-
// flags for rtlight rendering
#define LIGHTFLAG_NORMALMODE 1
#define LIGHTFLAG_REALTIMEMODE 2
+typedef struct tridecal_s
+{
+ // color and initial alpha value
+ unsigned char colors[3][4];
+ // how long this decal has lived so far (the actual fade begins at cl_decals_time)
+ float lived;
+ // if >= 0 this indicates the decal should follow an animated triangle
+ int triangleindex;
+}
+tridecal_t;
+
+typedef struct decalsystem_s
+{
+ dp_model_t *model;
+ double lastupdatetime;
+ int maxdecals;
+ int freedecal;
+ int numdecals;
+ tridecal_t *decals;
+ float *vertex3f;
+ float *texcoord2f;
+ float *color4f;
+ int *element3i;
+ unsigned short *element3s;
+}
+decalsystem_t;
+
typedef struct effect_s
{
int active;
int isstatic;
/// true if this is a compiled world light, cleared if the light changes
int compiled;
+ /// the shadowing mode used to compile this light
+ int shadowmode;
/// premade shadow volumes to render for world entity
shadowmesh_t *static_meshchain_shadow_zpass;
shadowmesh_t *static_meshchain_shadow_zfail;
+ shadowmesh_t *static_meshchain_shadow_shadowmap;
/// used for visibility testing (more exact than bbox)
int static_numleafs;
int static_numleafpvsbytes;
/// (important on big surfaces such as terrain)
int static_numlighttrispvsbytes;
unsigned char *static_lighttrispvs;
+ /// masks of all shadowmap sides that have any potential static receivers or casters
+ int static_shadowmap_receivers;
+ int static_shadowmap_casters;
}
rtlight_t;
// 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
+#define MAX_FRAMEBLENDS (MAX_FRAMEGROUPBLENDS * 2)
typedef struct frameblend_s
{
int subframe;
float alpha;
// size the model is shown
float scale;
+ // transparent sorting offset
+ float transparent_offset;
// NULL = no model
dp_model_t *model;
// colormod tinting of models
float colormod[3];
+ float glowmod[3];
// interpolated animation - active framegroups and blend factors
framegroupblend_t framegroupblend[MAX_FRAMEGROUPBLENDS];
vec3_t modellight_diffuse; // q3bsp
vec3_t modellight_lightdir; // q3bsp
+ // storage of decals on this entity
+ // (note: if allowdecals is set, be sure to call R_DecalSystem_Reset on removal!)
+ int allowdecals;
+ decalsystem_t decalsystem;
+
// FIELDS UPDATED BY RENDERER:
// last time visible during trace culling
double last_trace_visibility;
#define SIGNONS 4 // signon messages to receive before connected
-#define MAX_DEMOS 8
-#define MAX_DEMONAME 16
-
typedef enum cactive_e
{
ca_uninitialized, // during early startup
// (kept outside client_state_t because it's used between levels)
protocolversion_t protocol;
+#define MAX_RCONS 16
+ int rcon_trying;
+ lhnetaddress_t rcon_addresses[MAX_RCONS];
+ char rcon_commands[MAX_RCONS][MAX_INPUTLINE];
+ double rcon_timeout[MAX_RCONS];
+ int rcon_ringpos;
+
// connection information
// 0 to SIGNONS
int signon;
double lastpackettime;
// movement parameters for client prediction
+ unsigned int moveflags;
float movevars_wallfriction;
float movevars_waterfriction;
float movevars_friction;
void CL_Particles_Clear(void);
void CL_Particles_Init(void);
void CL_Particles_Shutdown(void);
+particle_t *CL_NewParticle(unsigned short ptypeindex, int pcolor1, int pcolor2, int ptex, float psize, float psizeincrease, float palpha, float palphafade, float pgravity, float pbounce, float px, float py, float pz, float pvx, float pvy, float pvz, float pairfriction, float pliquidfriction, float originjitter, float velocityjitter, qboolean pqualityreduction, float lifetime, float stretch, pblend_t blendmode, porientation_t orientation, int staincolor1, int staincolor2, int staintex);
typedef enum effectnameindex_s
{
extern qboolean sb_showscores;
-float FogPoint_World(const vec3_t p);
-float FogPoint_Model(const vec3_t p);
-float FogForDistance(vec_t dist);
+float RSurf_FogVertex(const vec3_t p);
+float RSurf_FogPoint(const vec3_t p);
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)
int width;
int height;
int depth;
+ r_viewport_t viewport;
// which color components to allow (for anaglyph glasses)
int colormask[4];
typedef struct r_refdef_viewcache_s
{
+ // updated by gl_main_newmap()
+ int maxentities;
+ int world_numclusters;
+ int world_numleafs;
+ int world_numsurfaces;
+
// these properties are generated by R_View_Update()
// which entities are currently visible for this viewpoint
// (the used range is 0...r_refdef.scene.numentities)
- unsigned char entityvisible[MAX_EDICTS];
+ unsigned char *entityvisible;
+
// flag arrays used for visibility checking on world model
// (all other entities have no per-surface/per-leaf visibility checks)
- // TODO: dynamic resize according to r_refdef.scene.worldmodel->brush.num_clusters
- unsigned char world_pvsbits[(32768+7)>>3]; // FIXME: buffer overflow on huge maps
- // TODO: dynamic resize according to r_refdef.scene.worldmodel->brush.num_leafs
- unsigned char world_leafvisible[32768]; // FIXME: buffer overflow on huge maps
- // TODO: dynamic resize according to r_refdef.scene.worldmodel->num_surfaces
- unsigned char world_surfacevisible[262144]; // FIXME: buffer overflow on huge maps
+ unsigned char *world_pvsbits;
+ unsigned char *world_leafvisible;
+ unsigned char *world_surfacevisible;
// if true, the view is currently in a leaf without pvs data
qboolean world_novis;
}
int numlights;
// intensities for light styles right now, controls rtlights
- float rtlightstylevalue[256]; // float fraction of base light value
+ float rtlightstylevalue[MAX_LIGHTSTYLES]; // float fraction of base light value
// 8.8bit fixed point intensities for light styles
// controls intensity lightmap layers
- unsigned short lightstylevalue[256]; // 8.8 fraction of base light value
+ unsigned short lightstylevalue[MAX_LIGHTSTYLES]; // 8.8 fraction of base light value
float ambient;
r_refdef_scene_t scene;
- vec3_t fogcolor;
- vec_t fogrange;
- vec_t fograngerecip;
- vec_t fogmasktabledistmultiplier;
+ float fogplane[4];
+ float fogplaneviewdist;
+ qboolean fogplaneviewabove;
+ float fogheightfade;
+ float fogcolor[3];
+ float fogrange;
+ float fograngerecip;
+ float fogmasktabledistmultiplier;
#define FOGMASKTABLEWIDTH 1024
float fogmasktable[FOGMASKTABLEWIDTH];
float fogmasktable_start, fogmasktable_alpha, fogmasktable_range, fogmasktable_density;
float fog_alpha;
float fog_start;
float fog_end;
+ float fog_height;
+ float fog_fadedepth;
qboolean fogenabled;
qboolean oldgl_fogenable;