#include "r_shadow.h"
#include "libcurl.h"
#include "snd_main.h"
+#include "cdaudio.h"
// we need to declare some mouse variables here, because the menu system
// references them even when on a unix system.
-cvar_t csqc_progname = {0, "csqc_progname","csprogs.dat","name of csprogs.dat file to load"};
-cvar_t csqc_progcrc = {CVAR_READONLY, "csqc_progcrc","-1","CRC of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1"};
-cvar_t csqc_progsize = {CVAR_READONLY, "csqc_progsize","-1","file size of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1"};
-cvar_t csqc_usedemoprogs = {0, "csqc_usedemoprogs","1","use csprogs stored in demos"};
+cvar_t csqc_progname = {CVAR_CLIENT | CVAR_SERVER, "csqc_progname","csprogs.dat","name of csprogs.dat file to load"};
+cvar_t csqc_progcrc = {CVAR_CLIENT | CVAR_READONLY, "csqc_progcrc","-1","CRC of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1"};
+cvar_t csqc_progsize = {CVAR_CLIENT | CVAR_READONLY, "csqc_progsize","-1","file size of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1"};
+cvar_t csqc_usedemoprogs = {CVAR_CLIENT, "csqc_usedemoprogs","1","use csprogs stored in demos"};
+cvar_t csqc_polygons_defaultmaterial_nocullface = {CVAR_CLIENT, "csqc_polygons_defaultmaterial_nocullface", "0", "use 'cull none' behavior in the default shader for rendering R_PolygonBegin - warning: enabling this is not consistent with FTEQW behavior on this feature"};
-cvar_t cl_shownet = {0, "cl_shownet","0","1 = print packet size, 2 = print packet message list"};
-cvar_t cl_nolerp = {0, "cl_nolerp", "0","network update smoothing"};
-cvar_t cl_lerpexcess = {0, "cl_lerpexcess", "0","maximum allowed lerp excess (hides, not fixes, some packet loss)"};
-cvar_t cl_lerpanim_maxdelta_server = {0, "cl_lerpanim_maxdelta_server", "0.1","maximum frame delta for smoothing between server-controlled animation frames (when 0, one network frame)"};
-cvar_t cl_lerpanim_maxdelta_framegroups = {0, "cl_lerpanim_maxdelta_framegroups", "0.1","maximum frame delta for smoothing between framegroups (when 0, one network frame)"};
+cvar_t cl_shownet = {CVAR_CLIENT, "cl_shownet","0","1 = print packet size, 2 = print packet message list"};
+cvar_t cl_nolerp = {CVAR_CLIENT, "cl_nolerp", "0","network update smoothing"};
+cvar_t cl_lerpexcess = {CVAR_CLIENT, "cl_lerpexcess", "0","maximum allowed lerp excess (hides, not fixes, some packet loss)"};
+cvar_t cl_lerpanim_maxdelta_server = {CVAR_CLIENT, "cl_lerpanim_maxdelta_server", "0.1","maximum frame delta for smoothing between server-controlled animation frames (when 0, one network frame)"};
+cvar_t cl_lerpanim_maxdelta_framegroups = {CVAR_CLIENT, "cl_lerpanim_maxdelta_framegroups", "0.1","maximum frame delta for smoothing between framegroups (when 0, one network frame)"};
-cvar_t cl_itembobheight = {0, "cl_itembobheight", "0","how much items bob up and down (try 8)"};
-cvar_t cl_itembobspeed = {0, "cl_itembobspeed", "0.5","how frequently items bob up and down"};
+cvar_t cl_itembobheight = {CVAR_CLIENT, "cl_itembobheight", "0","how much items bob up and down (try 8)"};
+cvar_t cl_itembobspeed = {CVAR_CLIENT, "cl_itembobspeed", "0.5","how frequently items bob up and down"};
-cvar_t lookspring = {CVAR_SAVE, "lookspring","0","returns pitch to level with the floor when no longer holding a pitch key"};
-cvar_t lookstrafe = {CVAR_SAVE, "lookstrafe","0","move instead of turning"};
-cvar_t sensitivity = {CVAR_SAVE, "sensitivity","3","mouse speed multiplier"};
+cvar_t lookspring = {CVAR_CLIENT | CVAR_SAVE, "lookspring","0","returns pitch to level with the floor when no longer holding a pitch key"};
+cvar_t lookstrafe = {CVAR_CLIENT | CVAR_SAVE, "lookstrafe","0","move instead of turning"};
+cvar_t sensitivity = {CVAR_CLIENT | CVAR_SAVE, "sensitivity","3","mouse speed multiplier"};
-cvar_t m_pitch = {CVAR_SAVE, "m_pitch","0.022","mouse pitch speed multiplier"};
-cvar_t m_yaw = {CVAR_SAVE, "m_yaw","0.022","mouse yaw speed multiplier"};
-cvar_t m_forward = {CVAR_SAVE, "m_forward","1","mouse forward speed multiplier"};
-cvar_t m_side = {CVAR_SAVE, "m_side","0.8","mouse side speed multiplier"};
+cvar_t m_pitch = {CVAR_CLIENT | CVAR_SAVE, "m_pitch","0.022","mouse pitch speed multiplier"};
+cvar_t m_yaw = {CVAR_CLIENT | CVAR_SAVE, "m_yaw","0.022","mouse yaw speed multiplier"};
+cvar_t m_forward = {CVAR_CLIENT | CVAR_SAVE, "m_forward","1","mouse forward speed multiplier"};
+cvar_t m_side = {CVAR_CLIENT | CVAR_SAVE, "m_side","0.8","mouse side speed multiplier"};
-cvar_t freelook = {CVAR_SAVE, "freelook", "1","mouse controls pitch instead of forward/back"};
+cvar_t freelook = {CVAR_CLIENT | CVAR_SAVE, "freelook", "1","mouse controls pitch instead of forward/back"};
-cvar_t cl_autodemo = {CVAR_SAVE, "cl_autodemo", "0", "records every game played, using the date/time and map name to name the demo file" };
-cvar_t cl_autodemo_nameformat = {CVAR_SAVE, "cl_autodemo_nameformat", "autodemos/%Y-%m-%d_%H-%M", "The format of the cl_autodemo filename, followed by the map name (the date is encoded using strftime escapes)" };
-cvar_t cl_autodemo_delete = {0, "cl_autodemo_delete", "0", "Delete demos after recording. This is a bitmask, bit 1 gives the default, bit 0 the value for the current demo. Thus, the values are: 0 = disabled; 1 = delete current demo only; 2 = delete all demos except the current demo; 3 = delete all demos from now on" };
+cvar_t cl_autodemo = {CVAR_CLIENT | CVAR_SAVE, "cl_autodemo", "0", "records every game played, using the date/time and map name to name the demo file" };
+cvar_t cl_autodemo_nameformat = {CVAR_CLIENT | CVAR_SAVE, "cl_autodemo_nameformat", "autodemos/%Y-%m-%d_%H-%M", "The format of the cl_autodemo filename, followed by the map name (the date is encoded using strftime escapes)" };
+cvar_t cl_autodemo_delete = {CVAR_CLIENT, "cl_autodemo_delete", "0", "Delete demos after recording. This is a bitmask, bit 1 gives the default, bit 0 the value for the current demo. Thus, the values are: 0 = disabled; 1 = delete current demo only; 2 = delete all demos except the current demo; 3 = delete all demos from now on" };
-cvar_t r_draweffects = {0, "r_draweffects", "1","renders temporary sprite effects"};
+cvar_t r_draweffects = {CVAR_CLIENT, "r_draweffects", "1","renders temporary sprite effects"};
-cvar_t cl_explosions_alpha_start = {CVAR_SAVE, "cl_explosions_alpha_start", "1.5","starting alpha of an explosion shell"};
-cvar_t cl_explosions_alpha_end = {CVAR_SAVE, "cl_explosions_alpha_end", "0","end alpha of an explosion shell (just before it disappears)"};
-cvar_t cl_explosions_size_start = {CVAR_SAVE, "cl_explosions_size_start", "16","starting size of an explosion shell"};
-cvar_t cl_explosions_size_end = {CVAR_SAVE, "cl_explosions_size_end", "128","ending alpha of an explosion shell (just before it disappears)"};
-cvar_t cl_explosions_lifetime = {CVAR_SAVE, "cl_explosions_lifetime", "0.5","how long an explosion shell lasts"};
+cvar_t cl_explosions_alpha_start = {CVAR_CLIENT | CVAR_SAVE, "cl_explosions_alpha_start", "1.5","starting alpha of an explosion shell"};
+cvar_t cl_explosions_alpha_end = {CVAR_CLIENT | CVAR_SAVE, "cl_explosions_alpha_end", "0","end alpha of an explosion shell (just before it disappears)"};
+cvar_t cl_explosions_size_start = {CVAR_CLIENT | CVAR_SAVE, "cl_explosions_size_start", "16","starting size of an explosion shell"};
+cvar_t cl_explosions_size_end = {CVAR_CLIENT | CVAR_SAVE, "cl_explosions_size_end", "128","ending alpha of an explosion shell (just before it disappears)"};
+cvar_t cl_explosions_lifetime = {CVAR_CLIENT | CVAR_SAVE, "cl_explosions_lifetime", "0.5","how long an explosion shell lasts"};
-cvar_t cl_stainmaps = {CVAR_SAVE, "cl_stainmaps", "0","stains lightmaps, much faster than decals but blurred"};
-cvar_t cl_stainmaps_clearonload = {CVAR_SAVE, "cl_stainmaps_clearonload", "1","clear stainmaps on map restart"};
+cvar_t cl_stainmaps = {CVAR_CLIENT | CVAR_SAVE, "cl_stainmaps", "0","stains lightmaps, much faster than decals but blurred"};
+cvar_t cl_stainmaps_clearonload = {CVAR_CLIENT | CVAR_SAVE, "cl_stainmaps_clearonload", "1","clear stainmaps on map restart"};
-cvar_t cl_beams_polygons = {CVAR_SAVE, "cl_beams_polygons", "1","use beam polygons instead of models"};
-cvar_t cl_beams_quakepositionhack = {CVAR_SAVE, "cl_beams_quakepositionhack", "1", "makes your lightning gun appear to fire from your waist (as in Quake and QuakeWorld)"};
-cvar_t cl_beams_instantaimhack = {CVAR_SAVE, "cl_beams_instantaimhack", "0", "makes your lightning gun aiming update instantly"};
-cvar_t cl_beams_lightatend = {CVAR_SAVE, "cl_beams_lightatend", "0", "make a light at the end of the beam"};
+cvar_t cl_beams_polygons = {CVAR_CLIENT | CVAR_SAVE, "cl_beams_polygons", "1","use beam polygons instead of models"};
+cvar_t cl_beams_quakepositionhack = {CVAR_CLIENT | CVAR_SAVE, "cl_beams_quakepositionhack", "1", "makes your lightning gun appear to fire from your waist (as in Quake and QuakeWorld)"};
+cvar_t cl_beams_instantaimhack = {CVAR_CLIENT | CVAR_SAVE, "cl_beams_instantaimhack", "0", "makes your lightning gun aiming update instantly"};
+cvar_t cl_beams_lightatend = {CVAR_CLIENT | CVAR_SAVE, "cl_beams_lightatend", "0", "make a light at the end of the beam"};
-cvar_t cl_deathfade = {CVAR_SAVE, "cl_deathfade", "0", "fade screen to dark red when dead, value represents how fast the fade is (higher is faster)"};
+cvar_t cl_deathfade = {CVAR_CLIENT | CVAR_SAVE, "cl_deathfade", "0", "fade screen to dark red when dead, value represents how fast the fade is (higher is faster)"};
-cvar_t cl_noplayershadow = {CVAR_SAVE, "cl_noplayershadow", "0","hide player shadow"};
+cvar_t cl_noplayershadow = {CVAR_CLIENT | CVAR_SAVE, "cl_noplayershadow", "0","hide player shadow"};
-cvar_t cl_dlights_decayradius = {CVAR_SAVE, "cl_dlights_decayradius", "1", "reduces size of light flashes over time"};
-cvar_t cl_dlights_decaybrightness = {CVAR_SAVE, "cl_dlights_decaybrightness", "1", "reduces brightness of light flashes over time"};
+cvar_t cl_dlights_decayradius = {CVAR_CLIENT | CVAR_SAVE, "cl_dlights_decayradius", "1", "reduces size of light flashes over time"};
+cvar_t cl_dlights_decaybrightness = {CVAR_CLIENT | CVAR_SAVE, "cl_dlights_decaybrightness", "1", "reduces brightness of light flashes over time"};
-cvar_t qport = {0, "qport", "0", "identification key for playing on qw servers (allows you to maintain a connection to a quakeworld server even if your port changes)"};
+cvar_t qport = {CVAR_CLIENT, "qport", "0", "identification key for playing on qw servers (allows you to maintain a connection to a quakeworld server even if your port changes)"};
-cvar_t cl_prydoncursor = {0, "cl_prydoncursor", "0", "enables a mouse pointer which is able to click on entities in the world, useful for point and click mods, see PRYDON_CLIENTCURSOR extension in dpextensions.qc"};
-cvar_t cl_prydoncursor_notrace = {0, "cl_prydoncursor_notrace", "0", "disables traceline used in prydon cursor reporting to the game, saving some cpu time"};
+cvar_t cl_prydoncursor = {CVAR_CLIENT, "cl_prydoncursor", "0", "enables a mouse pointer which is able to click on entities in the world, useful for point and click mods, see PRYDON_CLIENTCURSOR extension in dpextensions.qc"};
+cvar_t cl_prydoncursor_notrace = {CVAR_CLIENT, "cl_prydoncursor_notrace", "0", "disables traceline used in prydon cursor reporting to the game, saving some cpu time"};
-cvar_t cl_deathnoviewmodel = {0, "cl_deathnoviewmodel", "1", "hides gun model when dead"};
+cvar_t cl_deathnoviewmodel = {CVAR_CLIENT, "cl_deathnoviewmodel", "1", "hides gun model when dead"};
-cvar_t cl_locs_enable = {CVAR_SAVE, "locs_enable", "1", "enables replacement of certain % codes in chat messages: %l (location), %d (last death location), %h (health), %a (armor), %x (rockets), %c (cells), %r (rocket launcher status), %p (powerup status), %w (weapon status), %t (current time in level)"};
-cvar_t cl_locs_show = {0, "locs_show", "0", "shows defined locations for editing purposes"};
+cvar_t cl_locs_enable = {CVAR_CLIENT | CVAR_SAVE, "locs_enable", "1", "enables replacement of certain % codes in chat messages: %l (location), %d (last death location), %h (health), %a (armor), %x (rockets), %c (cells), %r (rocket launcher status), %p (powerup status), %w (weapon status), %t (current time in level)"};
+cvar_t cl_locs_show = {CVAR_CLIENT, "locs_show", "0", "shows defined locations for editing purposes"};
client_static_t cls;
client_state_t cl;
cl.max_lightstyle = MAX_LIGHTSTYLES;
cl.max_brushmodel_entities = MAX_EDICTS;
cl.max_particles = MAX_PARTICLES_INITIAL; // grows dynamically
- cl.max_decals = MAX_DECALS_INITIAL; // grows dynamically
cl.max_showlmps = 0;
cl.num_dlights = 0;
cl.lightstyle = (lightstyle_t *)Mem_Alloc(cls.levelmempool, cl.max_lightstyle * sizeof(lightstyle_t));
cl.brushmodel_entities = (int *)Mem_Alloc(cls.levelmempool, cl.max_brushmodel_entities * sizeof(int));
cl.particles = (particle_t *) Mem_Alloc(cls.levelmempool, cl.max_particles * sizeof(particle_t));
- cl.decals = (decal_t *) Mem_Alloc(cls.levelmempool, cl.max_decals * sizeof(decal_t));
cl.showlmps = NULL;
// LadyHavoc: have to set up the baseline info for alpha and other stuff
NetConn_SendUnreliableMessage(cls.netcon, &buf, cls.protocol, 10000, 0, false);
NetConn_Close(cls.netcon);
cls.netcon = NULL;
+ Con_Printf("Disconnected\n");
}
cls.state = ca_disconnected;
cl.islocalgame = false;
cls.demoplayback = cls.timedemo = false;
cls.signon = 0;
+
+ // If we're dropped mid-connection attempt, it won't clear otherwise.
+ SCR_ClearLoadingScreen(false);
}
void CL_Disconnect_f(cmd_state_t *cmd)
#ifdef CONFIG_MENU
M_Update_Return_Reason("");
#endif
- cls.demonum = -1;
-
- // stop demo loop in case this fails
- if (cls.demoplayback)
- CL_StopPlayback();
- // if downloads are running, cancel their finishing action
- Curl_Clear_forthismap();
+ // Disconnect from the current server, or stop a running demo.
+ CL_Disconnect();
// make sure the client ports are open before attempting to connect
NetConn_UpdateSockets();
{
// link stuff
CL_RelinkWorld();
+ // the scene mesh is added first for easier debugging (consistent spot in render entities list)
+ CL_MeshEntities_Scene_AddRenderEntity();
CL_RelinkStaticEntities();
CL_RelinkBeams();
CL_RelinkEffects();
// update view blend
V_CalcViewBlend();
-
- CL_MeshEntities_AddToScene();
}
/*
// when csqc is loaded, it will call this in CSQC_UpdateView
if (!cl.csqc_loaded)
+ {
+ // clear the CL_Mesh_Scene() used for some engine effects
+ CL_MeshEntities_Scene_Clear();
+ // add engine entities and effects
CSQC_RelinkAllEntities(ENTMASK_ENGINE | ENTMASK_ENGINEVIEWMODELS);
+ }
// decals, particles, and explosions will be updated during rneder
}
if (VectorCompare(loc->mins, loc->maxs))
break;
if (loc)
- Con_Printf("Warning: writing loc file containing a mixture of qizmo-style points and proquake-style boxes may not work in qizmo or proquake!\n");
+ Con_Warnf("Warning: writing loc file containing a mixture of qizmo-style points and proquake-style boxes may not work in qizmo or proquake!\n");
}
for (loc = cl.locnodes;loc;loc = loc->next)
{
dp_model_t cl_meshentitymodels[NUM_MESHENTITIES];
const char *cl_meshentitynames[NUM_MESHENTITIES] =
{
- "MESH_DEBUG",
- "MESH_CSQC_POLYGONS",
- "MESH_PARTICLES",
+ "MESH_SCENE",
"MESH_UI",
};
ent = cl_meshentities + i;
ent->state_current.active = true;
ent->render.model = cl_meshentitymodels + i;
- ent->render.alpha = 0.999999f; // not quite 1 so that MATERIALFLAG_ALPHA is always set.
+ Mod_Mesh_Create(ent->render.model, cl_meshentitynames[i]);
+ ent->render.alpha = 1;
ent->render.flags = RENDER_SHADOW | RENDER_LIGHT;
ent->render.framegroupblend[0].lerp = 1;
ent->render.frameblend[0].lerp = 1;
Matrix4x4_CreateIdentity(&ent->render.matrix);
CL_UpdateRenderEntity(&ent->render);
}
+ cl_meshentities[MESH_UI].render.flags = RENDER_NOSELFSHADOW;
R_RegisterModule("cl_meshentities", CL_MeshEntities_Restart, CL_MeshEntities_Restart, CL_MeshEntities_Restart, CL_MeshEntities_Restart, CL_MeshEntities_Restart);
}
-void CL_MeshEntities_AddToScene(void)
+void CL_MeshEntities_Scene_Clear(void)
{
- int i;
- entity_t *ent;
- for (i = 0; i < NUM_MESHENTITIES && r_refdef.scene.numentities < r_refdef.scene.maxentities; i++)
- {
- ent = cl_meshentities + i;
- if (ent->render.model->num_surfaces == 0)
- continue;
- Mod_Mesh_Finalize(ent->render.model);
- VectorCopy(ent->render.model->normalmins, ent->render.mins);
- VectorCopy(ent->render.model->normalmaxs, ent->render.maxs);
- r_refdef.scene.entities[r_refdef.scene.numentities++] = &ent->render;
- }
+ Mod_Mesh_Reset(CL_Mesh_Scene());
}
-void CL_MeshEntities_Reset(void)
+void CL_MeshEntities_Scene_AddRenderEntity(void)
{
- int i;
- entity_t *ent;
- for (i = 0; i < NUM_MESHENTITIES && r_refdef.scene.numentities < r_refdef.scene.maxentities; i++)
- {
- ent = cl_meshentities + i;
- Mod_Mesh_Reset(ent->render.model);
- }
+ entity_t* ent = &cl_meshentities[MESH_SCENE];
+ r_refdef.scene.entities[r_refdef.scene.numentities++] = &ent->render;
+}
+
+void CL_MeshEntities_Scene_FinalizeRenderEntity(void)
+{
+ entity_t *ent = &cl_meshentities[MESH_SCENE];
+ Mod_Mesh_Finalize(ent->render.model);
+ VectorCopy(ent->render.model->normalmins, ent->render.mins);
+ VectorCopy(ent->render.model->normalmaxs, ent->render.maxs);
}
static void CL_MeshEntities_Shutdown(void)
for (q = 0; q < 3; q++)
a[q] = c[q] = dir[q] = 0;
+ ent->render_lightgrid = false;
ent->render_modellight_forced = false;
ent->render_rtlight_disabled = false;
ent->render_modellight_forced = true;
ent->render_rtlight_disabled = true;
}
+ else if (((ent->model && !ent->model->lit) || (ent->model == r_refdef.scene.worldmodel ? mod_q3bsp_lightgrid_world_surfaces.integer : mod_q3bsp_lightgrid_bsp_surfaces.integer))
+ && r_refdef.scene.worldmodel && r_refdef.scene.worldmodel->lit && r_refdef.scene.worldmodel->brushq3.lightgridtexture && mod_q3bsp_lightgrid_texture.integer)
+ {
+ ent->render_lightgrid = true;
+ // no need to call R_CompleteLightPoint as we base it on render_lightmap_*
+ }
else if (r_refdef.scene.worldmodel && r_refdef.scene.worldmodel->lit && r_refdef.scene.worldmodel->brush.LightPoint)
R_CompleteLightPoint(a, c, dir, shadingorigin, LP_LIGHTMAP, r_refdef.scene.lightmapintensity, r_refdef.scene.ambientintensity);
else if (r_fullbright_directed.integer)
*/
void CL_Init (void)
{
+ if (cls.state == ca_dedicated)
+ {
+ Cmd_AddCommand(&cmd_server, "disconnect", CL_Disconnect_f, "disconnect from server (or disconnect all clients if running a server)");
+ }
+ else
+ {
+ Con_DPrintf("Initializing client\n");
- cls.levelmempool = Mem_AllocPool("client (per-level memory)", 0, NULL);
- cls.permanentmempool = Mem_AllocPool("client (long term memory)", 0, NULL);
-
- memset(&r_refdef, 0, sizeof(r_refdef));
- // max entities sent to renderer per frame
- r_refdef.scene.maxentities = MAX_EDICTS + 256 + 512;
- r_refdef.scene.entities = (entity_render_t **)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t *) * r_refdef.scene.maxentities);
-
- // max temp entities
- r_refdef.scene.maxtempentities = MAX_TEMPENTITIES;
- r_refdef.scene.tempentities = (entity_render_t *)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t) * r_refdef.scene.maxtempentities);
-
- CL_InitInput ();
-
-//
-// register our commands
-//
- Cvar_RegisterVariable (&cl_upspeed);
- Cvar_RegisterVariable (&cl_forwardspeed);
- Cvar_RegisterVariable (&cl_backspeed);
- Cvar_RegisterVariable (&cl_sidespeed);
- Cvar_RegisterVariable (&cl_movespeedkey);
- Cvar_RegisterVariable (&cl_yawspeed);
- Cvar_RegisterVariable (&cl_pitchspeed);
- Cvar_RegisterVariable (&cl_anglespeedkey);
- Cvar_RegisterVariable (&cl_shownet);
- Cvar_RegisterVariable (&cl_nolerp);
- Cvar_RegisterVariable (&cl_lerpexcess);
- Cvar_RegisterVariable (&cl_lerpanim_maxdelta_server);
- Cvar_RegisterVariable (&cl_lerpanim_maxdelta_framegroups);
- Cvar_RegisterVariable (&cl_deathfade);
- Cvar_RegisterVariable (&lookspring);
- Cvar_RegisterVariable (&lookstrafe);
- Cvar_RegisterVariable (&sensitivity);
- Cvar_RegisterVariable (&freelook);
-
- Cvar_RegisterVariable (&m_pitch);
- Cvar_RegisterVariable (&m_yaw);
- Cvar_RegisterVariable (&m_forward);
- Cvar_RegisterVariable (&m_side);
-
- Cvar_RegisterVariable (&cl_itembobspeed);
- Cvar_RegisterVariable (&cl_itembobheight);
-
- Cmd_AddCommand(&cmd_client, "entities", CL_PrintEntities_f, "print information on network entities known to client");
- Cmd_AddCommand(&cmd_client, "disconnect", CL_Disconnect_f, "disconnect from server (or disconnect all clients if running a server)");
- Cmd_AddCommand(&cmd_client, "record", CL_Record_f, "record a demo");
- Cmd_AddCommand(&cmd_client, "stop", CL_Stop_f, "stop recording or playing a demo");
- Cmd_AddCommand(&cmd_client, "playdemo", CL_PlayDemo_f, "watch a demo file");
- Cmd_AddCommand(&cmd_client, "timedemo", CL_TimeDemo_f, "play back a demo as fast as possible and save statistics to benchmark.log");
-
- // Support Client-side Model Index List
- Cmd_AddCommand(&cmd_client, "cl_modelindexlist", CL_ModelIndexList_f, "list information on all models in the client modelindex");
- // Support Client-side Sound Index List
- Cmd_AddCommand(&cmd_client, "cl_soundindexlist", CL_SoundIndexList_f, "list all sounds in the client soundindex");
-
- Cvar_RegisterVariable (&cl_autodemo);
- Cvar_RegisterVariable (&cl_autodemo_nameformat);
- Cvar_RegisterVariable (&cl_autodemo_delete);
-
- Cmd_AddCommand(&cmd_client, "fog", CL_Fog_f, "set global fog parameters (density red green blue [alpha [mindist [maxdist [top [fadedepth]]]]])");
- Cmd_AddCommand(&cmd_client, "fog_heighttexture", CL_Fog_HeightTexture_f, "set global fog parameters (density red green blue alpha mindist maxdist top depth textures/mapname/fogheight.tga)");
-
- // LadyHavoc: added pausedemo
- Cmd_AddCommand(&cmd_client, "pausedemo", CL_PauseDemo_f, "pause demo playback (can also safely pause demo recording if using QUAKE, QUAKEDP or NEHAHRAMOVIE protocol, useful for making movies)");
-
- Cmd_AddCommand(&cmd_client, "cl_areastats", CL_AreaStats_f, "prints statistics on entity culling during collision traces");
-
- Cvar_RegisterVariable(&r_draweffects);
- Cvar_RegisterVariable(&cl_explosions_alpha_start);
- Cvar_RegisterVariable(&cl_explosions_alpha_end);
- Cvar_RegisterVariable(&cl_explosions_size_start);
- Cvar_RegisterVariable(&cl_explosions_size_end);
- Cvar_RegisterVariable(&cl_explosions_lifetime);
- Cvar_RegisterVariable(&cl_stainmaps);
- Cvar_RegisterVariable(&cl_stainmaps_clearonload);
- Cvar_RegisterVariable(&cl_beams_polygons);
- Cvar_RegisterVariable(&cl_beams_quakepositionhack);
- Cvar_RegisterVariable(&cl_beams_instantaimhack);
- Cvar_RegisterVariable(&cl_beams_lightatend);
- Cvar_RegisterVariable(&cl_noplayershadow);
- Cvar_RegisterVariable(&cl_dlights_decayradius);
- Cvar_RegisterVariable(&cl_dlights_decaybrightness);
-
- Cvar_RegisterVariable(&cl_prydoncursor);
- Cvar_RegisterVariable(&cl_prydoncursor_notrace);
-
- Cvar_RegisterVariable(&cl_deathnoviewmodel);
-
- // for QW connections
- Cvar_RegisterVariable(&qport);
- Cvar_SetValueQuick(&qport, (rand() * RAND_MAX + rand()) & 0xffff);
-
- Cmd_AddCommand(&cmd_client, "timerefresh", CL_TimeRefresh_f, "turn quickly and print rendering statistcs");
-
- Cvar_RegisterVariable(&cl_locs_enable);
- Cvar_RegisterVariable(&cl_locs_show);
- Cmd_AddCommand(&cmd_client, "locs_add", CL_Locs_Add_f, "add a point or box location (usage: x y z[ x y z] \"name\", if two sets of xyz are supplied it is a box, otherwise point)");
- Cmd_AddCommand(&cmd_client, "locs_removenearest", CL_Locs_RemoveNearest_f, "remove the nearest point or box (note: you need to be very near a box to remove it)");
- Cmd_AddCommand(&cmd_client, "locs_clear", CL_Locs_Clear_f, "remove all loc points/boxes");
- Cmd_AddCommand(&cmd_client, "locs_reload", CL_Locs_Reload_f, "reload .loc file for this map");
- Cmd_AddCommand(&cmd_client, "locs_save", CL_Locs_Save_f, "save .loc file for this map containing currently defined points and boxes");
-
- CL_Parse_Init();
- CL_Particles_Init();
- CL_Screen_Init();
- CL_MeshEntities_Init();
-
- CL_Video_Init();
+ R_Modules_Init();
+ Palette_Init();
+#ifdef CONFIG_MENU
+ MR_Init_Commands();
+#endif
+ VID_Shared_Init();
+ VID_Init();
+ Render_Init();
+ S_Init();
+ CDAudio_Init();
+ Key_Init();
+
+
+ cls.levelmempool = Mem_AllocPool("client (per-level memory)", 0, NULL);
+ cls.permanentmempool = Mem_AllocPool("client (long term memory)", 0, NULL);
+
+ memset(&r_refdef, 0, sizeof(r_refdef));
+ // max entities sent to renderer per frame
+ r_refdef.scene.maxentities = MAX_EDICTS + 256 + 512;
+ r_refdef.scene.entities = (entity_render_t **)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t *) * r_refdef.scene.maxentities);
+
+ // max temp entities
+ r_refdef.scene.maxtempentities = MAX_TEMPENTITIES;
+ r_refdef.scene.tempentities = (entity_render_t *)Mem_Alloc(cls.permanentmempool, sizeof(entity_render_t) * r_refdef.scene.maxtempentities);
+
+ CL_InitInput ();
+
+ //
+ // register our commands
+ //
+ Cvar_RegisterVariable (&cl_upspeed);
+ Cvar_RegisterVariable (&cl_forwardspeed);
+ Cvar_RegisterVariable (&cl_backspeed);
+ Cvar_RegisterVariable (&cl_sidespeed);
+ Cvar_RegisterVariable (&cl_movespeedkey);
+ Cvar_RegisterVariable (&cl_yawspeed);
+ Cvar_RegisterVariable (&cl_pitchspeed);
+ Cvar_RegisterVariable (&cl_anglespeedkey);
+ Cvar_RegisterVariable (&cl_shownet);
+ Cvar_RegisterVariable (&cl_nolerp);
+ Cvar_RegisterVariable (&cl_lerpexcess);
+ Cvar_RegisterVariable (&cl_lerpanim_maxdelta_server);
+ Cvar_RegisterVariable (&cl_lerpanim_maxdelta_framegroups);
+ Cvar_RegisterVariable (&cl_deathfade);
+ Cvar_RegisterVariable (&lookspring);
+ Cvar_RegisterVariable (&lookstrafe);
+ Cvar_RegisterVariable (&sensitivity);
+ Cvar_RegisterVariable (&freelook);
+
+ Cvar_RegisterVariable (&m_pitch);
+ Cvar_RegisterVariable (&m_yaw);
+ Cvar_RegisterVariable (&m_forward);
+ Cvar_RegisterVariable (&m_side);
+
+ Cvar_RegisterVariable (&cl_itembobspeed);
+ Cvar_RegisterVariable (&cl_itembobheight);
+
+ Cmd_AddCommand(&cmd_client, "entities", CL_PrintEntities_f, "print information on network entities known to client");
+ Cmd_AddCommand(&cmd_client, "disconnect", CL_Disconnect_f, "disconnect from server (or disconnect all clients if running a server)");
+ Cmd_AddCommand(&cmd_client, "record", CL_Record_f, "record a demo");
+ Cmd_AddCommand(&cmd_client, "stop", CL_Stop_f, "stop recording or playing a demo");
+ Cmd_AddCommand(&cmd_client, "playdemo", CL_PlayDemo_f, "watch a demo file");
+ Cmd_AddCommand(&cmd_client, "timedemo", CL_TimeDemo_f, "play back a demo as fast as possible and save statistics to benchmark.log");
+
+ // Support Client-side Model Index List
+ Cmd_AddCommand(&cmd_client, "cl_modelindexlist", CL_ModelIndexList_f, "list information on all models in the client modelindex");
+ // Support Client-side Sound Index List
+ Cmd_AddCommand(&cmd_client, "cl_soundindexlist", CL_SoundIndexList_f, "list all sounds in the client soundindex");
+
+ Cvar_RegisterVariable (&cl_autodemo);
+ Cvar_RegisterVariable (&cl_autodemo_nameformat);
+ Cvar_RegisterVariable (&cl_autodemo_delete);
+
+ Cmd_AddCommand(&cmd_client, "fog", CL_Fog_f, "set global fog parameters (density red green blue [alpha [mindist [maxdist [top [fadedepth]]]]])");
+ Cmd_AddCommand(&cmd_client, "fog_heighttexture", CL_Fog_HeightTexture_f, "set global fog parameters (density red green blue alpha mindist maxdist top depth textures/mapname/fogheight.tga)");
+
+ // LadyHavoc: added pausedemo
+ Cmd_AddCommand(&cmd_client, "pausedemo", CL_PauseDemo_f, "pause demo playback (can also safely pause demo recording if using QUAKE, QUAKEDP or NEHAHRAMOVIE protocol, useful for making movies)");
+
+ Cmd_AddCommand(&cmd_client, "cl_areastats", CL_AreaStats_f, "prints statistics on entity culling during collision traces");
+
+ Cvar_RegisterVariable(&r_draweffects);
+ Cvar_RegisterVariable(&cl_explosions_alpha_start);
+ Cvar_RegisterVariable(&cl_explosions_alpha_end);
+ Cvar_RegisterVariable(&cl_explosions_size_start);
+ Cvar_RegisterVariable(&cl_explosions_size_end);
+ Cvar_RegisterVariable(&cl_explosions_lifetime);
+ Cvar_RegisterVariable(&cl_stainmaps);
+ Cvar_RegisterVariable(&cl_stainmaps_clearonload);
+ Cvar_RegisterVariable(&cl_beams_polygons);
+ Cvar_RegisterVariable(&cl_beams_quakepositionhack);
+ Cvar_RegisterVariable(&cl_beams_instantaimhack);
+ Cvar_RegisterVariable(&cl_beams_lightatend);
+ Cvar_RegisterVariable(&cl_noplayershadow);
+ Cvar_RegisterVariable(&cl_dlights_decayradius);
+ Cvar_RegisterVariable(&cl_dlights_decaybrightness);
+
+ Cvar_RegisterVariable(&cl_prydoncursor);
+ Cvar_RegisterVariable(&cl_prydoncursor_notrace);
+
+ Cvar_RegisterVariable(&cl_deathnoviewmodel);
+
+ // for QW connections
+ Cvar_RegisterVariable(&qport);
+ Cvar_SetValueQuick(&qport, (rand() * RAND_MAX + rand()) & 0xffff);
+
+ Cmd_AddCommand(&cmd_client, "timerefresh", CL_TimeRefresh_f, "turn quickly and print rendering statistcs");
+
+ Cvar_RegisterVariable(&cl_locs_enable);
+ Cvar_RegisterVariable(&cl_locs_show);
+ Cmd_AddCommand(&cmd_client, "locs_add", CL_Locs_Add_f, "add a point or box location (usage: x y z[ x y z] \"name\", if two sets of xyz are supplied it is a box, otherwise point)");
+ Cmd_AddCommand(&cmd_client, "locs_removenearest", CL_Locs_RemoveNearest_f, "remove the nearest point or box (note: you need to be very near a box to remove it)");
+ Cmd_AddCommand(&cmd_client, "locs_clear", CL_Locs_Clear_f, "remove all loc points/boxes");
+ Cmd_AddCommand(&cmd_client, "locs_reload", CL_Locs_Reload_f, "reload .loc file for this map");
+ Cmd_AddCommand(&cmd_client, "locs_save", CL_Locs_Save_f, "save .loc file for this map containing currently defined points and boxes");
+
+ Cvar_RegisterVariable(&csqc_polygons_defaultmaterial_nocullface);
+
+ CL_Parse_Init();
+ CL_Particles_Init();
+ CL_Screen_Init();
+ CL_MeshEntities_Init();
+
+ CL_Video_Init();
+ }
}