#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_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 = {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"};
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)
M_Update_Return_Reason("");
#endif
- // if downloads are running, cancel their finishing action
- Curl_Clear_forthismap();
-
// Disconnect from the current server, or stop a running demo.
CL_Disconnect();
}
}
-void CL_AllocLightFlash(entity_render_t *ent, matrix4x4_t *matrix, float radius, float red, float green, float blue, float decay, float lifetime, int cubemapnum, int style, int shadowenable, vec_t corona, vec_t coronasizescale, vec_t ambientscale, vec_t diffusescale, vec_t specularscale, int flags)
+void CL_AllocLightFlash(entity_render_t *ent, matrix4x4_t *matrix, float radius, float red, float green, float blue, float decay, float lifetime, char *cubemapname, int style, int shadowenable, vec_t corona, vec_t coronasizescale, vec_t ambientscale, vec_t diffusescale, vec_t specularscale, int flags)
{
int i;
dlight_t *dl;
dl->die = cl.time + lifetime;
else
dl->die = 0;
- if (cubemapnum > 0)
- dpsnprintf(dl->cubemapname, sizeof(dl->cubemapname), "cubemaps/%i", cubemapnum);
- else
- dl->cubemapname[0] = 0;
+ dl->cubemapname[0] = 0;
+ if (cubemapname && cubemapname[0])
+ strlcpy(dl->cubemapname, cubemapname, sizeof(dl->cubemapname));
dl->style = style;
dl->shadow = shadowenable;
dl->corona = corona;
{
// 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;
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();
+ }
}