DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
cl_main.c
Go to the documentation of this file.
1/*
2Copyright (C) 1996-1997 Id Software, Inc.
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19*/
20// cl_main.c -- client main loop
21
22#include "quakedef.h"
23#include "cl_collision.h"
24#include "cl_video.h"
25#include "image.h"
26#include "csprogs.h"
27#include "r_shadow.h"
28#include "libcurl.h"
29#include "snd_main.h"
30#include "cdaudio.h"
31
32// we need to declare some mouse variables here, because the menu system
33// references them even when on a unix system.
34
35cvar_t csqc_progname = {CF_CLIENT | CF_SERVER, "csqc_progname","csprogs.dat","name of csprogs.dat file to load"};
36cvar_t csqc_progcrc = {CF_CLIENT | CF_READONLY, "csqc_progcrc","-1","CRC of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1"};
37cvar_t csqc_progsize = {CF_CLIENT | CF_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"};
38cvar_t csqc_usedemoprogs = {CF_CLIENT, "csqc_usedemoprogs","1","use csprogs stored in demos"};
39cvar_t csqc_polygons_defaultmaterial_nocullface = {CF_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"};
40cvar_t csqc_lowres = {CF_CLIENT, "csqc_lowres", "0", "make EXT_CSQC functions CSQC_UpdateView(), setproperty(), getproperty() use the virtual 2D resolution (FTEQW/QSS behaviour) instead of the real resolution (DP behaviour); this mode is always used for the CSQC_SIMPLE (aka hud-only) CSQC_DrawHud() parameters; see cvars vid_conheight and vid_conwidth"};
41
42cvar_t cl_shownet = {CF_CLIENT, "cl_shownet","0","1 = print packet size, 2 = print packet message list"};
43cvar_t cl_nolerp = {CF_CLIENT, "cl_nolerp", "0","network update smoothing"};
44cvar_t cl_lerpexcess = {CF_CLIENT, "cl_lerpexcess", "0","maximum allowed lerp excess (hides, not fixes, some packet loss)"};
45cvar_t cl_lerpanim_maxdelta_server = {CF_CLIENT, "cl_lerpanim_maxdelta_server", "0.1","maximum frame delta for smoothing between server-controlled animation frames (when 0, one network frame)"};
46cvar_t cl_lerpanim_maxdelta_framegroups = {CF_CLIENT, "cl_lerpanim_maxdelta_framegroups", "0.1","maximum frame delta for smoothing between framegroups (when 0, one network frame)"};
47
48cvar_t cl_itembobheight = {CF_CLIENT, "cl_itembobheight", "0","how much items bob up and down (try 8)"};
49cvar_t cl_itembobspeed = {CF_CLIENT, "cl_itembobspeed", "0.5","how frequently items bob up and down"};
50
51cvar_t lookspring = {CF_CLIENT | CF_ARCHIVE, "lookspring","0","returns pitch to level with the floor when no longer holding a pitch key"};
52cvar_t lookstrafe = {CF_CLIENT | CF_ARCHIVE, "lookstrafe","0","move instead of turning"};
53cvar_t sensitivity = {CF_CLIENT | CF_ARCHIVE, "sensitivity","3","mouse speed multiplier"};
54
55cvar_t m_pitch = {CF_CLIENT | CF_ARCHIVE, "m_pitch","0.022","mouse pitch speed multiplier"};
56cvar_t m_yaw = {CF_CLIENT | CF_ARCHIVE, "m_yaw","0.022","mouse yaw speed multiplier"};
57cvar_t m_forward = {CF_CLIENT | CF_ARCHIVE, "m_forward","1","mouse forward speed multiplier"};
58cvar_t m_side = {CF_CLIENT | CF_ARCHIVE, "m_side","0.8","mouse side speed multiplier"};
59
60cvar_t freelook = {CF_CLIENT | CF_ARCHIVE, "freelook", "1","mouse controls pitch instead of forward/back"};
61
62cvar_t cl_autodemo = {CF_CLIENT | CF_ARCHIVE, "cl_autodemo", "0", "records every game played, using the date/time and map name to name the demo file" };
63cvar_t cl_autodemo_nameformat = {CF_CLIENT | CF_ARCHIVE, "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)" };
64cvar_t cl_autodemo_delete = {CF_CLIENT, "cl_autodemo_delete", "0", "3: automatically delete every newly recorded demo unless this cvar is set to 2 during a game, in case something interesting happened (cvar will be automatically set back to 3); 0: keep every newly recorded demo unless this cvar is set to 1 during a game, in case nothing interesting happened (cvar will be automatically set back to 0). Technically speaking, the value is a bitmask: bit 1 defines behaviour for all demos, bit 0 overrides behaviour for the demo currently being recorded" };
65cvar_t cl_startdemos = {CF_CLIENT | CF_ARCHIVE, "cl_startdemos", "1", "1 enables the `startdemos` loop used in Quake and some mods, 0 goes straight to the menu"};
66
67cvar_t r_draweffects = {CF_CLIENT, "r_draweffects", "1","renders temporary sprite effects"};
68
69cvar_t cl_explosions_alpha_start = {CF_CLIENT | CF_ARCHIVE, "cl_explosions_alpha_start", "1.5","starting alpha of an explosion shell"};
70cvar_t cl_explosions_alpha_end = {CF_CLIENT | CF_ARCHIVE, "cl_explosions_alpha_end", "0","end alpha of an explosion shell (just before it disappears)"};
71cvar_t cl_explosions_size_start = {CF_CLIENT | CF_ARCHIVE, "cl_explosions_size_start", "16","starting size of an explosion shell"};
72cvar_t cl_explosions_size_end = {CF_CLIENT | CF_ARCHIVE, "cl_explosions_size_end", "128","ending alpha of an explosion shell (just before it disappears)"};
73cvar_t cl_explosions_lifetime = {CF_CLIENT | CF_ARCHIVE, "cl_explosions_lifetime", "0.5","how long an explosion shell lasts"};
74
75cvar_t cl_stainmaps = {CF_CLIENT | CF_ARCHIVE, "cl_stainmaps", "0","stains lightmaps, much faster than decals but blurred"};
76cvar_t cl_stainmaps_clearonload = {CF_CLIENT | CF_ARCHIVE, "cl_stainmaps_clearonload", "1","clear stainmaps on map restart"};
77
78cvar_t cl_beams_polygons = {CF_CLIENT | CF_ARCHIVE, "cl_beams_polygons", "1","use beam polygons instead of models"};
79cvar_t cl_beams_quakepositionhack = {CF_CLIENT | CF_ARCHIVE, "cl_beams_quakepositionhack", "1", "makes your lightning gun appear to fire from your waist (as in Quake and QuakeWorld)"};
80cvar_t cl_beams_instantaimhack = {CF_CLIENT | CF_ARCHIVE, "cl_beams_instantaimhack", "0", "makes your lightning gun aiming update instantly"};
81cvar_t cl_beams_lightatend = {CF_CLIENT | CF_ARCHIVE, "cl_beams_lightatend", "0", "make a light at the end of the beam"};
82
83cvar_t cl_deathfade = {CF_CLIENT | CF_ARCHIVE, "cl_deathfade", "0", "fade screen to dark red when dead, value represents how fast the fade is (higher is faster)"};
84
85cvar_t cl_noplayershadow = {CF_CLIENT | CF_ARCHIVE, "cl_noplayershadow", "0","hide player shadow"};
86
87cvar_t cl_dlights_decayradius = {CF_CLIENT | CF_ARCHIVE, "cl_dlights_decayradius", "1", "reduces size of light flashes over time"};
88cvar_t cl_dlights_decaybrightness = {CF_CLIENT | CF_ARCHIVE, "cl_dlights_decaybrightness", "1", "reduces brightness of light flashes over time"};
89
90cvar_t qport = {CF_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)"};
91
92cvar_t cl_prydoncursor = {CF_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"};
93cvar_t cl_prydoncursor_notrace = {CF_CLIENT, "cl_prydoncursor_notrace", "0", "disables traceline used in prydon cursor reporting to the game, saving some cpu time"};
94
95cvar_t cl_deathnoviewmodel = {CF_CLIENT, "cl_deathnoviewmodel", "1", "hides gun model when dead"};
96
97cvar_t cl_locs_enable = {CF_CLIENT | CF_ARCHIVE, "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)"};
98cvar_t cl_locs_show = {CF_CLIENT, "locs_show", "0", "shows defined locations for editing purposes"};
99
100cvar_t cl_minfps = {CF_CLIENT | CF_ARCHIVE, "cl_minfps", "40", "minimum fps target - while the rendering performance is below this, it will drift toward lower quality"};
101cvar_t cl_minfps_fade = {CF_CLIENT | CF_ARCHIVE, "cl_minfps_fade", "1", "how fast the quality adapts to varying framerate"};
102cvar_t cl_minfps_qualitymax = {CF_CLIENT | CF_ARCHIVE, "cl_minfps_qualitymax", "1", "highest allowed drawdistance multiplier"};
103cvar_t cl_minfps_qualitymin = {CF_CLIENT | CF_ARCHIVE, "cl_minfps_qualitymin", "0.25", "lowest allowed drawdistance multiplier"};
104cvar_t cl_minfps_qualitymultiply = {CF_CLIENT | CF_ARCHIVE, "cl_minfps_qualitymultiply", "0.2", "multiplier for quality changes in quality change per second render time (1 assumes linearity of quality and render time)"};
105cvar_t cl_minfps_qualityhysteresis = {CF_CLIENT | CF_ARCHIVE, "cl_minfps_qualityhysteresis", "0.05", "reduce all quality increments by this to reduce flickering"};
106cvar_t cl_minfps_qualitystepmax = {CF_CLIENT | CF_ARCHIVE, "cl_minfps_qualitystepmax", "0.1", "maximum quality change in a single frame"};
107cvar_t cl_minfps_force = {CF_CLIENT, "cl_minfps_force", "0", "also apply quality reductions in timedemo/capturevideo"};
108cvar_t cl_maxfps = {CF_CLIENT | CF_ARCHIVE, "cl_maxfps", "0", "maximum fps cap, 0 = unlimited, if game is running faster than this it will wait before running another frame (useful to make cpu time available to other programs)"};
109cvar_t cl_maxfps_alwayssleep = {CF_CLIENT | CF_ARCHIVE, "cl_maxfps_alwayssleep", "0", "gives up some processing time to other applications each frame, value in milliseconds, disabled if a timedemo is running"};
110cvar_t cl_maxidlefps = {CF_CLIENT | CF_ARCHIVE, "cl_maxidlefps", "20", "maximum fps cap when the game is not the active window (makes cpu time available to other programs"};
111
112cvar_t cl_areagrid_link_SOLID_NOT = {CF_CLIENT, "cl_areagrid_link_SOLID_NOT", "1", "set to 0 to prevent SOLID_NOT entities from being linked to the area grid, and unlink any that are already linked (in the code paths that would otherwise link them), for better performance"};
113cvar_t cl_gameplayfix_nudgeoutofsolid_separation = {CF_CLIENT, "cl_gameplayfix_nudgeoutofsolid_separation", "0.03125", "keep objects this distance apart to prevent collision issues on seams"};
114
115
118
119/*
120=====================
121CL_ClearState
122
123=====================
124*/
126{
127 int i;
128 entity_t *ent;
129
131
132// wipe the entire cl structure
134 memset (&cl, 0, sizeof(cl));
135
137
138 // reset the view zoom interpolation
139 cl.mviewzoom[0] = cl.mviewzoom[1] = 1;
140 cl.sensitivityscale = 1.0f;
141
142 // enable rendering of the world and such
146
147 // set up the float version of the stats array for easier access to float stats
148 cl.statsf = (float *)cl.stats;
149
150 cl.num_entities = 0;
153
154 // tweak these if the game runs out
163 cl.max_particles = MAX_PARTICLES_INITIAL; // grows dynamically
164 cl.max_showlmps = 0;
165
166 cl.num_dlights = 0;
167 cl.num_effects = 0;
168 cl.num_beams = 0;
169
172 cl.entities_active = (unsigned char *)Mem_Alloc(cls.levelmempool, cl.max_brushmodel_entities * sizeof(unsigned char));
180 cl.showlmps = NULL;
181
182 // LadyHavoc: have to set up the baseline info for alpha and other stuff
183 for (i = 0;i < cl.max_entities;i++)
184 {
188 }
189
191 {
192 VectorSet(cl.playerstandmins, -16, -16, -24);
193 VectorSet(cl.playerstandmaxs, 16, 16, 45);
194 VectorSet(cl.playercrouchmins, -16, -16, -24);
195 VectorSet(cl.playercrouchmaxs, 16, 16, 25);
196 }
197 else
198 {
199 VectorSet(cl.playerstandmins, -16, -16, -24);
200 VectorSet(cl.playerstandmaxs, 16, 16, 24);
201 VectorSet(cl.playercrouchmins, -16, -16, -24);
202 VectorSet(cl.playercrouchmaxs, 16, 16, 24);
203 }
204
205 // disable until we get textures for it
207
208 ent = &cl.entities[0];
209 // entire entity array was cleared, so just fill in a few fields
210 ent->state_current.active = true;
211 ent->render.model = cl.worldmodel = NULL; // no world model yet
212 ent->render.alpha = 1;
214 Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, 0, 0, 0, 0, 0, 0, 1);
215 ent->render.allowdecals = true;
217
218 // noclip is turned off at start
219 noclip_anglehack = false;
220
221 // mark all frames invalid for delta
222 memset(cl.qw_deltasequence, -1, sizeof(cl.qw_deltasequence));
223
224 // set bestweapon data back to Quake data
226
228}
229
230extern cvar_t cl_topcolor;
232
233void CL_SetInfo(const char *key, const char *value, qbool send, qbool allowstarkey, qbool allowmodel, qbool quiet)
234{
235 int i;
236 qbool fail = false;
237 char vabuf[1024];
238 if (!allowstarkey && key[0] == '*')
239 fail = true;
240 if (!allowmodel && (!strcasecmp(key, "pmodel") || !strcasecmp(key, "emodel")))
241 fail = true;
242 for (i = 0;key[i];i++)
243 if (ISWHITESPACE(key[i]) || key[i] == '\"')
244 fail = true;
245 for (i = 0;value[i];i++)
246 if (value[i] == '\r' || value[i] == '\n' || value[i] == '\"')
247 fail = true;
248 if (fail)
249 {
250 if (!quiet)
251 Con_Printf("Can't setinfo \"%s\" \"%s\"\n", key, value);
252 return;
253 }
255 if (cls.state == ca_connected && cls.netcon)
256 {
258 {
260 MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "setinfo \"%s\" \"%s\"", key, value));
261 }
262 else if (!strcasecmp(key, "_cl_name") || !strcasecmp(key, "name"))
263 {
265 MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "name \"%s\"", value));
266 }
267 else if (!strcasecmp(key, "playermodel"))
268 {
270 MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "playermodel \"%s\"", value));
271 }
272 else if (!strcasecmp(key, "playerskin"))
273 {
275 MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "playerskin \"%s\"", value));
276 }
277 else if (!strcasecmp(key, "topcolor"))
278 {
280 MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "color %i %i", atoi(value), cl_bottomcolor.integer));
281 }
282 else if (!strcasecmp(key, "bottomcolor"))
283 {
285 MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "color %i %i", cl_topcolor.integer, atoi(value)));
286 }
287 else if (!strcasecmp(key, "rate"))
288 {
290 MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "rate \"%s\"", value));
291 }
292 else if (!strcasecmp(key, "rate_burstsize"))
293 {
295 MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "rate_burstsize \"%s\"", value));
296 }
297 }
298}
299
300void CL_ExpandEntities(int num)
301{
302 int i, oldmaxentities;
303 entity_t *oldentities;
304 if (num >= cl.max_entities)
305 {
306 if (!cl.entities)
307 Sys_Error("CL_ExpandEntities: cl.entities not initialized");
308 if (num >= MAX_EDICTS)
309 Host_Error("CL_ExpandEntities: num %i >= %i", num, MAX_EDICTS);
310 oldmaxentities = cl.max_entities;
311 oldentities = cl.entities;
312 cl.max_entities = (num & ~255) + 256;
314 memcpy(cl.entities, oldentities, oldmaxentities * sizeof(entity_t));
315 Mem_Free(oldentities);
316 for (i = oldmaxentities;i < cl.max_entities;i++)
317 {
321 }
322 }
323}
324
326{
327 int i;
328 int oldmaxcsqcrenderentities;
329 entity_render_t *oldcsqcrenderentities;
330 if (num >= cl.max_csqcrenderentities)
331 {
332 if (num >= MAX_EDICTS)
333 Host_Error("CL_ExpandEntities: num %i >= %i", num, MAX_EDICTS);
334 oldmaxcsqcrenderentities = cl.max_csqcrenderentities;
335 oldcsqcrenderentities = cl.csqcrenderentities;
336 cl.max_csqcrenderentities = (num & ~255) + 256;
338 if (oldcsqcrenderentities)
339 {
340 memcpy(cl.csqcrenderentities, oldcsqcrenderentities, oldmaxcsqcrenderentities * sizeof(entity_render_t));
341 for (i = 0;i < r_refdef.scene.numentities;i++)
342 if(r_refdef.scene.entities[i] >= oldcsqcrenderentities && r_refdef.scene.entities[i] < (oldcsqcrenderentities + oldmaxcsqcrenderentities))
343 r_refdef.scene.entities[i] = cl.csqcrenderentities + (r_refdef.scene.entities[i] - oldcsqcrenderentities);
344 Mem_Free(oldcsqcrenderentities);
345 }
346 }
347}
348
349static void CL_ToggleMenu_Hook(void)
350{
351#ifdef CONFIG_MENU
352 // remove menu
354 MR_ToggleMenu(0);
355#endif
357}
358
359extern cvar_t rcon_secure;
360
361/*
362=====================
363CL_Disconnect
364
365Sends a disconnect message to the server
366This is also called on Host_Error, so it shouldn't cause any errors
367=====================
368*/
369
370void CL_DisconnectEx(qbool kicked, const char *fmt, ... )
371{
372 va_list argptr;
373 char reason[512];
374
375 if (cls.state == ca_dedicated)
376 return;
377
378 if(fmt)
379 {
380 va_start(argptr,fmt);
381 dpvsnprintf(reason,sizeof(reason),fmt,argptr);
382 va_end(argptr);
383 }
384 else
385 {
386 dpsnprintf(reason, sizeof(reason), "Disconnect by user");
387 }
388
389 if (Sys_CheckParm("-profilegameonly"))
390 Sys_AllowProfiling(false);
391
393
394 Con_DPrintf("CL_Disconnect\n");
395
399 // stop sounds (especially looping!)
401 // prevent dlcache assets from this server from interfering with the next one
403
404 cl.parsingtextexpectingpingforscores = 0; // just in case no reply has come yet
405
406 // clear contents blends
407 cl.cshifts[0].percent = 0;
408 cl.cshifts[1].percent = 0;
409 cl.cshifts[2].percent = 0;
410 cl.cshifts[3].percent = 0;
411
413
415
416 if (cls.demoplayback)
418 else if (cls.netcon)
419 {
421 unsigned char bufdata[520];
422 if (cls.demorecording)
424
425 if(!kicked)
426 {
427 // send disconnect message 3 times to improve chances of server
428 // receiving it (but it still fails sometimes)
429 memset(&buf, 0, sizeof(buf));
430 buf.data = bufdata;
431 buf.maxsize = sizeof(bufdata);
433 {
434 Con_DPrint("Sending drop command\n");
436 MSG_WriteString(&buf, "drop");
437 }
438 else
439 {
440 Con_DPrint("Sending clc_disconnect\n");
443 MSG_WriteString(&buf, reason);
444 // DP8 TODO: write a simpler func that Sys_HandleCrash() calls
445 // to send a disconnect message indicating we crashed
446 }
450 }
451
453 cls.netcon = NULL;
454
455 // It's possible for a server to disconnect a player with an empty reason
456 // which is checked here rather than above so we don't print "Disconnect by user".
457 if(fmt && reason[0] != '\0')
458 dpsnprintf(cl_connect_status, sizeof(cl_connect_status), "Disconnect: %s", reason);
459 else
460 dp_strlcpy(cl_connect_status, "Disconnected", sizeof(cl_connect_status));
462 }
464 cl.islocalgame = false;
465 cls.signon = 0;
467 Cvar_Callback(&vid_vsync); // might need to re-enable vsync
468
470
471 // If we're dropped mid-connection attempt, it won't clear otherwise.
473
476}
477
479{
480 CL_DisconnectEx(false, NULL);
481}
482
483/*
484==================
485CL_Reconnect_f
486
487This command causes the client to wait for the signon messages again.
488This is sent just before a server changes levels
489==================
490*/
492{
493 char temp[128];
494 // if not connected, reconnect to the most recent server
495 if (!cls.netcon)
496 {
497 // if we have connected to a server recently, the userinfo
498 // will still contain its IP address, so get the address...
499 InfoString_GetValue(cls.userinfo, "*ip", temp, sizeof(temp));
500 if (temp[0])
501 CL_EstablishConnection(temp, -1);
502 else
503 Con_Printf(CON_WARN "Reconnect to what server? (you have not connected to a server yet)\n");
504 return;
505 }
506 // if connected, do something based on protocol
508 {
509 // quakeworld can just re-login
510 if (cls.qw_downloadmemory) // don't change when downloading
511 return;
512
514
515 if (cls.state == ca_connected)
516 {
517 Con_Printf("Server is changing level...\n");
520 }
521 }
522 else
523 {
524 // netquake uses reconnect on level changes (silly)
525 if (Cmd_Argc(cmd) != 1)
526 {
527 Con_Print("reconnect : wait for signon messages again\n");
528 return;
529 }
530 if (!cls.signon)
531 {
532 Con_Print("reconnect: no signon, ignoring reconnect\n");
533 return;
534 }
535 cls.signon = 0; // need new connection messages
536 }
537}
538
539/*
540=====================
541CL_Connect_f
542
543User command to connect to server
544=====================
545*/
547{
548 if (Cmd_Argc(cmd) < 2)
549 {
550 Con_Print("connect <serveraddress> [<key> <value> ...]: connect to a multiplayer game\n");
551 return;
552 }
553 // clear the rcon password, to prevent vulnerability by stuffcmd-ing a connect command
554 if(rcon_secure.integer <= 0)
557}
558
563
564
565
566
567/*
568=====================
569CL_EstablishConnection
570
571Host should be either "local" or a net address
572=====================
573*/
574void CL_EstablishConnection(const char *address, int firstarg)
575{
576 if (cls.state == ca_dedicated)
577 return;
578
579 // don't connect to a server if we're benchmarking a demo
580 if (Sys_CheckParm("-benchmark"))
581 return;
582
583 // make sure the client ports are open before attempting to connect
585
587 {
588 cls.connect_trying = true;
591
592 // only NOW, set connect_userinfo
593 if(firstarg >= 0)
594 {
595 int i;
597 for(i = firstarg; i+2 <= Cmd_Argc(cmd_local); i += 2)
599 }
600 else if(firstarg < -1)
601 {
602 // -1: keep as is (reconnect)
603 // -2: clear
605 }
606
607 dp_strlcpy(cl_connect_status, "Connect: pending...", sizeof(cl_connect_status));
609 }
610 else
611 {
612 Con_Printf(CON_ERROR "Connect: failed, unable to find a network socket suitable to reach %s\n", address);
613 dp_strlcpy(cl_connect_status, "Connect: failed, no network", sizeof(cl_connect_status));
614 }
615}
616
618{
620 CL_EstablishConnection("local:1", -2);
621}
622
623
624/*
625==============
626CL_PrintEntities_f
627==============
628*/
630{
631 entity_t *ent;
632 int i;
633
634 for (i = 0, ent = cl.entities;i < cl.num_entities;i++, ent++)
635 {
636 const char* modelname;
637
638 if (!ent->state_current.active)
639 continue;
640
641 if (ent->render.model)
642 modelname = ent->render.model->name;
643 else
644 modelname = "--no model--";
645 Con_Printf("%3i: %-25s:%4i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", i, modelname, ent->render.framegroupblend[0].frame, (int) ent->state_current.origin[0], (int) ent->state_current.origin[1], (int) ent->state_current.origin[2], (int) ent->state_current.angles[0] % 360, (int) ent->state_current.angles[1] % 360, (int) ent->state_current.angles[2] % 360, ent->render.scale, ent->render.alpha);
646 }
647}
648
649/*
650===============
651CL_ModelIndexList_f
652
653List information on all models in the client modelindex
654===============
655*/
657{
658 int i;
659 model_t *model;
660
661 // Print Header
662 Con_Printf("%3s: %-30s %-8s %-8s\n", "ID", "Name", "Type", "Triangles");
663
664 for (i = -MAX_MODELS;i < MAX_MODELS;i++)
665 {
667 if (!model)
668 continue;
669 if(model->loaded || i == 1)
670 Con_Printf("%3i: %-30s %-8s %-10i\n", i, model->name, model->modeldatatypestring, model->surfmesh.num_triangles);
671 else
672 Con_Printf("%3i: %-30s %-30s\n", i, model->name, "--no local model found--");
673 i++;
674 }
675}
676
677/*
678===============
679CL_SoundIndexList_f
680
681List all sounds in the client soundindex
682===============
683*/
685{
686 int i = 1;
687
688 while(cl.sound_precache[i] && i != MAX_SOUNDS)
689 { // Valid Sound
690 Con_Printf("%i : %s\n", i, cl.sound_precache[i]->name);
691 i++;
692 }
693}
694
695/*
696===============
697CL_UpdateRenderEntity
698
699Updates inversematrix, animation interpolation factors, scale, and mins/maxs
700===============
701*/
703{
704 vec3_t org;
705 vec_t scale;
706 model_t *model = ent->model;
707 // update the inverse matrix for the renderer
709 // update the animation blend state
711 // we need the matrix origin to center the box
713 // update entity->render.scale because the renderer needs it
715 if (model)
716 {
717 // NOTE: this directly extracts vector components from the matrix, which relies on the matrix orientation!
718#ifdef MATRIX4x4_OPENGLORIENTATION
719 if (ent->matrix.m[0][2] != 0 || ent->matrix.m[1][2] != 0)
720#else
721 if (ent->matrix.m[2][0] != 0 || ent->matrix.m[2][1] != 0)
722#endif
723 {
724 // pitch or roll
725 VectorMA(org, scale, model->rotatedmins, ent->mins);
726 VectorMA(org, scale, model->rotatedmaxs, ent->maxs);
727 }
728#ifdef MATRIX4x4_OPENGLORIENTATION
729 else if (ent->matrix.m[1][0] != 0 || ent->matrix.m[0][1] != 0)
730#else
731 else if (ent->matrix.m[0][1] != 0 || ent->matrix.m[1][0] != 0)
732#endif
733 {
734 // yaw
735 VectorMA(org, scale, model->yawmins, ent->mins);
736 VectorMA(org, scale, model->yawmaxs, ent->maxs);
737 }
738 else
739 {
740 VectorMA(org, scale, model->normalmins, ent->mins);
741 VectorMA(org, scale, model->normalmaxs, ent->maxs);
742 }
743 }
744 else
745 {
746 ent->mins[0] = org[0] - 16;
747 ent->mins[1] = org[1] - 16;
748 ent->mins[2] = org[2] - 16;
749 ent->maxs[0] = org[0] + 16;
750 ent->maxs[1] = org[1] + 16;
751 ent->maxs[2] = org[2] + 16;
752 }
753}
754
755/*
756===============
757CL_LerpPoint
758
759Determines the fraction between the last two messages that the objects
760should be put at.
761===============
762*/
763static float CL_LerpPoint(void)
764{
765 float f;
766
768 cl.time = bound(cl.mtime[1], cl.time, cl.mtime[0]);
769
770 // LadyHavoc: lerp in listen games as the server is being capped below the client (usually)
771 if (cl.mtime[0] <= cl.mtime[1])
772 {
773 cl.time = cl.mtime[0];
774 return 1;
775 }
776
777 f = (cl.time - cl.mtime[1]) / (cl.mtime[0] - cl.mtime[1]);
778 return bound(0, f, 1 + cl_lerpexcess.value);
779}
780
782{
784 // grow tempentities buffer on request
786 {
787 Con_Printf("CL_NewTempEntity: grow maxtempentities from %i to %i\n", r_refdef.scene.maxtempentities, r_refdef.scene.maxtempentities * 2);
791 }
792}
793
795{
796 entity_render_t *render;
797
799 return NULL;
801 {
802 r_refdef.scene.expandtempentities = true; // will be reallocated next frame since current frame may have pointers set already
803 return NULL;
804 }
806 memset (render, 0, sizeof(*render));
808
809 render->shadertime = shadertime;
810 render->alpha = 1;
811 VectorSet(render->colormod, 1, 1, 1);
812 VectorSet(render->glowmod, 1, 1, 1);
813 return render;
814}
815
816void CL_Effect(vec3_t org, model_t *model, int startframe, int framecount, float framerate)
817{
818 int i;
819 cl_effect_t *e;
820 if (!model) // sanity check
821 return;
822 if (framerate < 1)
823 {
824 Con_Printf("CL_Effect: framerate %f is < 1\n", framerate);
825 return;
826 }
827 if (framecount < 1)
828 {
829 Con_Printf("CL_Effect: framecount %i is < 1\n", framecount);
830 return;
831 }
832 for (i = 0, e = cl.effects;i < cl.max_effects;i++, e++)
833 {
834 if (e->active)
835 continue;
836 e->active = true;
837 VectorCopy(org, e->origin);
838 e->model = model;
839 e->starttime = cl.time;
840 e->startframe = startframe;
841 e->endframe = startframe + framecount;
842 e->framerate = framerate;
843
844 e->frame = 0;
845 e->frame1time = cl.time;
846 e->frame2time = cl.time;
848 break;
849 }
850}
851
852void 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)
853{
854 int i;
855 dlight_t *dl;
856
857// then look for anything else
858 dl = cl.dlights;
859 for (i = 0;i < cl.max_dlights;i++, dl++)
860 if (!dl->radius)
861 break;
862
863 // unable to find one
864 if (i == cl.max_dlights)
865 return;
866
867 //Con_Printf("dlight %i : %f %f %f : %f %f %f\n", i, org[0], org[1], org[2], red * radius, green * radius, blue * radius);
868 memset (dl, 0, sizeof(*dl));
870 Matrix4x4_Normalize(&dl->matrix, matrix);
871 dl->ent = ent;
874 Matrix4x4_SetOrigin(&dl->matrix, dl->origin[0], dl->origin[1], dl->origin[2]);
875 dl->radius = radius;
876 dl->color[0] = red;
877 dl->color[1] = green;
878 dl->color[2] = blue;
879 dl->initialradius = radius;
880 dl->initialcolor[0] = red;
881 dl->initialcolor[1] = green;
882 dl->initialcolor[2] = blue;
883 dl->decay = decay / radius; // changed decay to be a percentage decrease
884 dl->intensity = 1; // this is what gets decayed
885 if (lifetime)
886 dl->die = cl.time + lifetime;
887 else
888 dl->die = 0;
889 dl->cubemapname[0] = 0;
890 if (cubemapname && cubemapname[0])
891 dp_strlcpy(dl->cubemapname, cubemapname, sizeof(dl->cubemapname));
892 dl->style = style;
893 dl->shadow = shadowenable;
894 dl->corona = corona;
895 dl->flags = flags;
896 dl->coronasizescale = coronasizescale;
897 dl->ambientscale = ambientscale;
898 dl->diffusescale = diffusescale;
899 dl->specularscale = specularscale;
900}
901
902static void CL_DecayLightFlashes(void)
903{
904 int i, oldmax;
905 dlight_t *dl;
906 float time;
907
908 time = bound(0, cl.time - cl.oldtime, 0.1);
909 oldmax = cl.num_dlights;
910 cl.num_dlights = 0;
911 for (i = 0, dl = cl.dlights;i < oldmax;i++, dl++)
912 {
913 if (dl->radius)
914 {
915 dl->intensity -= time * dl->decay;
916 if (cl.time < dl->die && dl->intensity > 0)
917 {
919 dl->radius = dl->initialradius * dl->intensity;
920 else
921 dl->radius = dl->initialradius;
924 else
925 VectorCopy(dl->initialcolor, dl->color);
926 cl.num_dlights = i + 1;
927 }
928 else
929 dl->radius = 0;
930 }
931 }
932}
933
934// called before entity relinking
936{
937 int i, j, k, l;
938 dlight_t *dl;
939 float frac, f;
940 matrix4x4_t tempmatrix;
941
942 if (r_dynamic.integer)
943 {
944 for (i = 0, dl = cl.dlights;i < cl.num_dlights && r_refdef.scene.numlights < MAX_DLIGHTS;i++, dl++)
945 {
946 if (dl->radius)
947 {
948 tempmatrix = dl->matrix;
949 Matrix4x4_Scale(&tempmatrix, dl->radius, 1);
950 // we need the corona fading to be persistent
951 R_RTLight_Update(&dl->rtlight, false, &tempmatrix, dl->color, dl->style, dl->cubemapname, dl->shadow, dl->corona, dl->coronasizescale, dl->ambientscale, dl->diffusescale, dl->specularscale, dl->flags);
953 }
954 }
955 }
956
957 if (!cl.lightstyle)
958 {
959 for (j = 0;j < cl.max_lightstyle;j++)
960 {
963 }
964 return;
965 }
966
967// light animations
968// 'm' is normal light, 'a' is no light, 'z' is double bright
969 f = cl.time * 10;
970 i = (int)floor(f);
971 frac = f - i;
972 for (j = 0;j < cl.max_lightstyle;j++)
973 {
974 if (!cl.lightstyle[j].length)
975 {
978 continue;
979 }
980 // static lightstyle "=value"
981 if (cl.lightstyle[j].map[0] == '=')
982 {
984 if ( r_lerplightstyles.integer || ((int)f - f) < 0.01)
986 continue;
987 }
988 k = i % cl.lightstyle[j].length;
989 l = (i-1) % cl.lightstyle[j].length;
990 k = cl.lightstyle[j].map[k] - 'a';
991 l = cl.lightstyle[j].map[l] - 'a';
992 // rtlightstylevalue is always interpolated because it has no bad
993 // consequences for performance
994 // lightstylevalue is subject to a cvar for performance reasons;
995 // skipping lightmap updates on most rendered frames substantially
996 // improves framerates (but makes light fades look bad)
997 r_refdef.scene.rtlightstylevalue[j] = ((k*frac)+(l*(1-frac)))*(22/256.0f);
998 r_refdef.scene.lightstylevalue[j] = r_lerplightstyles.integer ? (unsigned short)(((k*frac)+(l*(1-frac)))*22) : k*22;
999 }
1000}
1001
1002static void CL_AddQWCTFFlagModel(entity_t *player, int skin)
1003{
1004 int frame = player->render.framegroupblend[0].frame;
1005 float f;
1006 entity_render_t *flagrender;
1007 matrix4x4_t flagmatrix;
1008
1009 // this code taken from QuakeWorld
1010 f = 14;
1011 if (frame >= 29 && frame <= 40)
1012 {
1013 if (frame >= 29 && frame <= 34)
1014 { //axpain
1015 if (frame == 29) f = f + 2;
1016 else if (frame == 30) f = f + 8;
1017 else if (frame == 31) f = f + 12;
1018 else if (frame == 32) f = f + 11;
1019 else if (frame == 33) f = f + 10;
1020 else if (frame == 34) f = f + 4;
1021 }
1022 else if (frame >= 35 && frame <= 40)
1023 { // pain
1024 if (frame == 35) f = f + 2;
1025 else if (frame == 36) f = f + 10;
1026 else if (frame == 37) f = f + 10;
1027 else if (frame == 38) f = f + 8;
1028 else if (frame == 39) f = f + 4;
1029 else if (frame == 40) f = f + 2;
1030 }
1031 }
1032 else if (frame >= 103 && frame <= 118)
1033 {
1034 if (frame >= 103 && frame <= 104) f = f + 6; //nailattack
1035 else if (frame >= 105 && frame <= 106) f = f + 6; //light
1036 else if (frame >= 107 && frame <= 112) f = f + 7; //rocketattack
1037 else if (frame >= 112 && frame <= 118) f = f + 7; //shotattack
1038 }
1039 // end of code taken from QuakeWorld
1040
1041 flagrender = CL_NewTempEntity(player->render.shadertime);
1042 if (!flagrender)
1043 return;
1044
1046 flagrender->skinnum = skin;
1047 flagrender->alpha = 1;
1048 VectorSet(flagrender->colormod, 1, 1, 1);
1049 VectorSet(flagrender->glowmod, 1, 1, 1);
1050 // attach the flag to the player matrix
1051 Matrix4x4_CreateFromQuakeEntity(&flagmatrix, -f, -22, 0, 0, 0, -45, 1);
1052 Matrix4x4_Concat(&flagrender->matrix, &player->render.matrix, &flagmatrix);
1053 CL_UpdateRenderEntity(flagrender);
1054}
1055
1058
1059static const vec3_t muzzleflashorigin = {18, 0, 0};
1060
1062{
1063 const unsigned char *cbcolor;
1064 if (colormap >= 0)
1065 {
1066 cbcolor = palette_rgb_pantscolormap[colormap & 0xF];
1067 VectorScale(cbcolor, (1.0f / 255.0f), ent->colormap_pantscolor);
1068 cbcolor = palette_rgb_shirtcolormap[(colormap & 0xF0) >> 4];
1069 VectorScale(cbcolor, (1.0f / 255.0f), ent->colormap_shirtcolor);
1070 }
1071 else
1072 {
1075 }
1076}
1077
1078// note this is a recursive function, recursionlimit should be 32 or so on the initial call
1079static void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qbool interpolate)
1080{
1081 const matrix4x4_t *matrix;
1082 matrix4x4_t blendmatrix, tempmatrix, matrix2;
1083 int frame;
1084 vec_t origin[3], angles[3], lerp;
1085 entity_t *t;
1087 //entity_persistent_t *p = &e->persistent;
1088 //entity_render_t *r = &e->render;
1089 // skip inactive entities and world
1090 if (!e->state_current.active || e == cl.entities)
1091 return;
1092 if (recursionlimit < 1)
1093 return;
1094 e->render.alpha = e->state_current.alpha * (1.0f / 255.0f); // FIXME: interpolate?
1095 e->render.scale = e->state_current.scale * (1.0f / 16.0f); // FIXME: interpolate?
1098 VectorScale(e->state_current.colormod, (1.0f / 32.0f), e->render.colormod);
1099 VectorScale(e->state_current.glowmod, (1.0f / 32.0f), e->render.glowmod);
1100 if(e >= cl.entities && e < cl.entities + cl.num_entities)
1101 e->render.entitynumber = e - cl.entities;
1102 else
1103 e->render.entitynumber = 0;
1106 else if (e->state_current.colormap > 0 && e->state_current.colormap <= cl.maxclients && cl.scores != NULL)
1108 else
1111 if (e->state_current.tagentity)
1112 {
1113 // attached entity (gun held in player model's hand, etc)
1114 // if the tag entity is currently impossible, skip it
1116 return;
1118 // if the tag entity is inactive, skip it
1119 if (t->state_current.active)
1120 {
1121 // update the parent first
1122 CL_UpdateNetworkEntity(t, recursionlimit - 1, interpolate);
1123 r = &t->render;
1124 }
1125 else
1126 {
1127 // it may still be a CSQC entity... trying to use its
1128 // info from last render frame (better than nothing)
1130 return;
1132 if(!r->entitynumber)
1133 return; // neither CSQC nor legacy entity... can't attach
1134 }
1135 // make relative to the entity
1136 matrix = &r->matrix;
1137 // some properties of the tag entity carry over
1139 // if a valid tagindex is used, make it relative to that tag instead
1140 if (e->state_current.tagentity && e->state_current.tagindex >= 1 && r->model)
1141 {
1142 if(!Mod_Alias_GetTagMatrix(r->model, r->frameblend, r->skeleton, e->state_current.tagindex - 1, &blendmatrix)) // i.e. no error
1143 {
1144 // concat the tag matrices onto the entity matrix
1145 Matrix4x4_Concat(&tempmatrix, &r->matrix, &blendmatrix);
1146 // use the constructed tag matrix
1147 matrix = &tempmatrix;
1148 }
1149 }
1150 }
1151 else if (e->render.flags & RENDER_VIEWMODEL)
1152 {
1153 // view-relative entity (guns and such)
1154 if (e->render.effects & EF_NOGUNBOB)
1155 matrix = &viewmodelmatrix_nobob; // really attached to view
1156 else
1157 matrix = &viewmodelmatrix_withbob; // attached to gun bob matrix
1158 }
1159 else
1160 {
1161 // world-relative entity (the normal kind)
1162 matrix = &identitymatrix;
1163 }
1164
1165 // movement lerp
1166 // if it's the predicted player entity, update according to client movement
1167 // but don't lerp if going through a teleporter as it causes a bad lerp
1168 // also don't use the predicted location if fixangle was set on both of
1169 // the most recent server messages, as that cause means you are spectating
1170 // someone or watching a cutscene of some sort
1172 interpolate = false;
1173
1174 if (e == cl.entities + cl.playerentity && cl.movement_predicted && (!cl.fixangle[1] || !cl.fixangle[0]))
1175 {
1177 VectorSet(angles, 0, cl.viewangles[1], 0);
1178 }
1179 else if (interpolate && e->persistent.lerpdeltatime > 0 && (lerp = (cl.time - e->persistent.lerpstarttime) / e->persistent.lerpdeltatime) < 1 + cl_lerpexcess.value)
1180 {
1181 // interpolate the origin and angles
1182 lerp = max(0, lerp);
1184#if 0
1185 // this fails at the singularity of euler angles
1187 if (delta[0] < -180) delta[0] += 360;else if (delta[0] >= 180) delta[0] -= 360;
1188 if (delta[1] < -180) delta[1] += 360;else if (delta[1] >= 180) delta[1] -= 360;
1189 if (delta[2] < -180) delta[2] += 360;else if (delta[2] >= 180) delta[2] -= 360;
1190 VectorMA(e->persistent.oldangles, lerp, delta, angles);
1191#else
1192 {
1193 vec3_t f0, u0, f1, u1;
1196 VectorMAM(1-lerp, f0, lerp, f1, f0);
1197 VectorMAM(1-lerp, u0, lerp, u1, u0);
1198 AnglesFromVectors(angles, f0, u0, false);
1199 }
1200#endif
1201 }
1202 else
1203 {
1204 // no interpolation
1207 }
1208
1209 // model setup and some modelflags
1212 if (e->render.model)
1213 {
1214 if (e->render.skinnum >= e->render.model->numskins)
1215 e->render.skinnum = 0;
1216 if (frame >= e->render.model->numframes)
1217 frame = 0;
1218 // models can set flags such as EF_ROCKET
1219 // this 0xFF800000 mask is EF_NOMODELFLAGS plus all the higher EF_ flags such as EF_ROCKET
1220 if (!(e->render.effects & 0xFF800000))
1221 e->render.effects |= e->render.model->effects;
1222 // if model is alias or this is a tenebrae-like dlight, reverse pitch direction
1223 if (e->render.model->type == mod_alias)
1224 angles[0] = -angles[0];
1226 {
1229 }
1230 }
1231 // if model is alias or this is a tenebrae-like dlight, reverse pitch direction
1233 angles[0] = -angles[0];
1234 // NOTE: this must be synced to SV_GetPitchSign!
1235
1236 if ((e->render.effects & EF_ROTATE) && !(e->render.flags & RENDER_VIEWMODEL))
1237 {
1238 angles[1] = ANGLEMOD(100*cl.time);
1240 origin[2] += (cos(cl.time * cl_itembobspeed.value * (2.0 * M_PI)) + 1.0) * 0.5 * cl_itembobheight.value;
1241 }
1242
1243 // animation lerp
1244 e->render.skeleton = NULL;
1246 {
1253 }
1254 else if (e->render.framegroupblend[0].frame == frame)
1255 {
1256 // update frame lerp fraction
1257 e->render.framegroupblend[0].lerp = 1;
1258 e->render.framegroupblend[1].lerp = 0;
1260 {
1261 // make sure frame lerp won't last longer than 100ms
1262 // (this mainly helps with models that use framegroups and
1263 // switch between them infrequently)
1264 float maxdelta = cl_lerpanim_maxdelta_server.value;
1265 if(e->render.model)
1266 if(e->render.model->animscenes)
1269 maxdelta = max(maxdelta, cl.mtime[0] - cl.mtime[1]);
1273 }
1274 }
1275 else
1276 {
1277 // begin a new frame lerp
1279 e->render.framegroupblend[1].lerp = 1;
1282 e->render.framegroupblend[0].lerp = 0;
1283 }
1284
1285 // set up the render matrix
1286 if (matrix)
1287 {
1288 // attached entity, this requires a matrix multiply (concat)
1289 // FIXME: e->render.scale should go away
1290 Matrix4x4_CreateFromQuakeEntity(&matrix2, origin[0], origin[1], origin[2], angles[0], angles[1], angles[2], e->render.scale);
1291 // concat the matrices to make the entity relative to its tag
1292 Matrix4x4_Concat(&e->render.matrix, matrix, &matrix2);
1293 // get the origin from the new matrix
1295 }
1296 else
1297 {
1298 // unattached entities are faster to process
1300 }
1301
1302 // tenebrae's sprites are all additive mode (weird)
1305 // player model is only shown with chase_active on
1308 // either fullbright or lit
1310 {
1311 if (!(e->render.effects & EF_FULLBRIGHT))
1313 }
1314 // hide player shadow during intermission or nehahra movie
1316 && (e->render.alpha >= 1)
1317 && !(e->render.flags & RENDER_VIEWMODEL)
1320 if (e->render.flags & RENDER_VIEWMODEL)
1324 if (e->render.effects & EF_NODEPTHTEST)
1326 if (e->render.effects & EF_ADDITIVE)
1328 if (e->render.effects & EF_DOUBLESIDED)
1332
1333 // make the other useful stuff
1334 e->render.allowdecals = true;
1336}
1337
1338// creates light and trails from an entity
1340{
1341 effectnameindex_t trailtype;
1342 vec3_t origin;
1343
1344 // bmodels are treated specially since their origin is usually '0 0 0' and
1345 // their actual geometry is far from '0 0 0'
1346 if (e->render.model && e->render.model->soundfromcenter)
1347 {
1348 vec3_t o;
1349 VectorMAM(0.5f, e->render.model->normalmins, 0.5f, e->render.model->normalmaxs, o);
1351 }
1352 else
1354
1355 // handle particle trails and such effects now that we know where this
1356 // entity is in the world...
1357 trailtype = EFFECT_NONE;
1358 // LadyHavoc: if the entity has no effects, don't check each
1360 {
1361 if (e->render.effects & EF_BRIGHTFIELD)
1362 {
1364 trailtype = EFFECT_TR_NEXUIZPLASMA;
1365 else
1367 }
1368 if (e->render.effects & EF_FLAME)
1370 if (e->render.effects & EF_STARDUST)
1372 }
1374 {
1375 // these are only set on player entities
1377 }
1378 // muzzleflash fades over time
1379 if (e->persistent.muzzleflash > 0)
1380 e->persistent.muzzleflash -= bound(0, cl.time - cl.oldtime, 0.1) * 20;
1381 // LadyHavoc: if the entity has no effects, don't check each
1382 if (e->render.effects && !(e->render.flags & RENDER_VIEWMODEL))
1383 {
1384 if (e->render.effects & EF_GIB)
1385 trailtype = EFFECT_TR_BLOOD;
1386 else if (e->render.effects & EF_ZOMGIB)
1387 trailtype = EFFECT_TR_SLIGHTBLOOD;
1388 else if (e->render.effects & EF_TRACER)
1389 trailtype = EFFECT_TR_WIZSPIKE;
1390 else if (e->render.effects & EF_TRACER2)
1391 trailtype = EFFECT_TR_KNIGHTSPIKE;
1392 else if (e->render.effects & EF_ROCKET)
1393 trailtype = EFFECT_TR_ROCKET;
1394 else if (e->render.effects & EF_GRENADE)
1395 {
1396 // LadyHavoc: e->render.alpha == -1 is for Nehahra dem compatibility (cigar smoke)
1397 trailtype = e->render.alpha == -1 ? EFFECT_TR_NEHAHRASMOKE : EFFECT_TR_GRENADE;
1398 }
1399 else if (e->render.effects & EF_TRACER3)
1400 trailtype = EFFECT_TR_VORESPIKE;
1401 }
1402 // do trails
1403 if (e->render.flags & RENDER_GLOWTRAIL)
1404 trailtype = EFFECT_TR_GLOWTRAIL;
1407 // check if a trail is allowed (it is not after a teleport for example)
1408 if (trailtype && e->persistent.trail_allowed)
1409 {
1410 float len;
1411 vec3_t vel;
1413 len = e->state_current.time - e->state_previous.time;
1414 if (len > 0)
1415 len = 1.0f / len;
1416 VectorScale(vel, len, vel);
1417 // pass time as count so that trails that are time based (such as an emitter) will emit properly as long as they don't use trailspacing
1418 CL_ParticleTrail(trailtype, bound(0, cl.time - cl.oldtime, 0.1), e->persistent.trail_origin, origin, vel, vel, e, e->state_current.glowcolor, false, true, NULL, NULL, 1);
1419 }
1420 // now that the entity has survived one trail update it is allowed to
1421 // leave a real trail on later frames
1422 e->persistent.trail_allowed = true;
1424}
1425
1426
1427/*
1428===============
1429CL_UpdateViewEntities
1430===============
1431*/
1433{
1434 int i;
1435 // update any RENDER_VIEWMODEL entities to use the new view matrix
1436 for (i = 1;i < cl.num_entities;i++)
1437 {
1438 if (cl.entities_active[i])
1439 {
1440 entity_t *ent = cl.entities + i;
1442 CL_UpdateNetworkEntity(ent, 32, true);
1443 }
1444 }
1445 // and of course the engine viewmodel needs updating as well
1446 CL_UpdateNetworkEntity(&cl.viewent, 32, true);
1447}
1448
1449/*
1450===============
1451CL_UpdateNetworkCollisionEntities
1452===============
1453*/
1455{
1456 entity_t *ent;
1457 int i;
1458
1459 // start on the entity after the world
1461 for (i = cl.maxclients + 1;i < cl.num_entities;i++)
1462 {
1463 if (cl.entities_active[i])
1464 {
1465 ent = cl.entities + i;
1466 if (ent->state_current.active && ent->render.model && ent->render.model->name[0] == '*' && ent->render.model->TraceBox)
1467 {
1468 // do not interpolate the bmodels for this
1469 CL_UpdateNetworkEntity(ent, 32, false);
1471 }
1472 }
1473 }
1474}
1475
1476/*
1477===============
1478CL_UpdateNetworkEntities
1479===============
1480*/
1482{
1483 entity_t *ent;
1484 int i;
1485
1486 // start on the entity after the world
1487 for (i = 1;i < cl.num_entities;i++)
1488 {
1489 if (cl.entities_active[i])
1490 {
1491 ent = cl.entities + i;
1492 if (ent->state_current.active)
1493 {
1494 CL_UpdateNetworkEntity(ent, 32, true);
1495 // view models should never create light/trails
1496 if (!(ent->render.flags & RENDER_VIEWMODEL))
1498 }
1499 else
1500 {
1502 cl.entities_active[i] = false;
1503 }
1504 }
1505 }
1506}
1507
1508static void CL_UpdateViewModel(void)
1509{
1510 entity_t *ent;
1511 ent = &cl.viewent;
1512 ent->state_previous = ent->state_current;
1514 ent->state_current.time = cl.time;
1515 ent->state_current.number = (unsigned short)-1;
1516 ent->state_current.active = true;
1521 ent->state_current.modelindex = 0;
1522 else if (cl.stats[STAT_ITEMS] & IT_INVISIBILITY)
1523 {
1525 ent->state_current.alpha = 128;
1526 else
1527 ent->state_current.modelindex = 0;
1528 }
1531
1532 // reset animation interpolation on weaponmodel if model changed
1534 {
1537 ent->render.framegroupblend[0].lerp = 1;ent->render.framegroupblend[1].lerp = 0;
1538 }
1539 CL_UpdateNetworkEntity(ent, 32, true);
1540}
1541
1542// note this is a recursive function, but it can never get in a runaway loop (because of the delayedlink flags)
1544{
1545 effectnameindex_t trailtype;
1546 vec3_t origin;
1547 vec3_t dlightcolor;
1548 vec_t dlightradius;
1549 char vabuf[1024];
1550
1551 // skip inactive entities and world
1552 if (!e->state_current.active || e == cl.entities)
1553 return;
1554 if (e->state_current.tagentity)
1555 {
1556 // if the tag entity is currently impossible, skip it
1558 return;
1559 // if the tag entity is inactive, skip it
1561 {
1563 return;
1565 return;
1566 // if we get here, it's properly csqc networked and attached
1567 }
1568 }
1569
1570 // create entity dlights associated with this entity
1571 if (e->render.model && e->render.model->soundfromcenter)
1572 {
1573 // bmodels are treated specially since their origin is usually '0 0 0'
1574 vec3_t o;
1575 VectorMAM(0.5f, e->render.model->normalmins, 0.5f, e->render.model->normalmaxs, o);
1577 }
1578 else
1580 trailtype = EFFECT_NONE;
1581 dlightradius = 0;
1582 dlightcolor[0] = 0;
1583 dlightcolor[1] = 0;
1584 dlightcolor[2] = 0;
1585 // LadyHavoc: if the entity has no effects, don't check each
1587 {
1588 if (e->render.effects & EF_BRIGHTFIELD)
1589 {
1591 trailtype = EFFECT_TR_NEXUIZPLASMA;
1592 }
1593 if (e->render.effects & EF_DIMLIGHT)
1594 {
1595 dlightradius = max(dlightradius, 200);
1596 dlightcolor[0] += 1.50f;
1597 dlightcolor[1] += 1.50f;
1598 dlightcolor[2] += 1.50f;
1599 }
1600 if (e->render.effects & EF_BRIGHTLIGHT)
1601 {
1602 dlightradius = max(dlightradius, 400);
1603 dlightcolor[0] += 3.00f;
1604 dlightcolor[1] += 3.00f;
1605 dlightcolor[2] += 3.00f;
1606 }
1607 // LadyHavoc: more effects
1608 if (e->render.effects & EF_RED) // red
1609 {
1610 dlightradius = max(dlightradius, 200);
1611 dlightcolor[0] += 1.50f;
1612 dlightcolor[1] += 0.15f;
1613 dlightcolor[2] += 0.15f;
1614 }
1615 if (e->render.effects & EF_BLUE) // blue
1616 {
1617 dlightradius = max(dlightradius, 200);
1618 dlightcolor[0] += 0.15f;
1619 dlightcolor[1] += 0.15f;
1620 dlightcolor[2] += 1.50f;
1621 }
1622 if (e->render.effects & EF_FLAME)
1624 if (e->render.effects & EF_STARDUST)
1626 }
1627 // muzzleflash fades over time, and is offset a bit
1629 {
1630 vec3_t v2;
1631 vec3_t color;
1632 trace_t trace;
1633 matrix4x4_t tempmatrix;
1636 Matrix4x4_Normalize(&tempmatrix, &e->render.matrix);
1637 Matrix4x4_SetOrigin(&tempmatrix, trace.endpos[0], trace.endpos[1], trace.endpos[2]);
1638 Matrix4x4_Scale(&tempmatrix, 150, 1);
1642 }
1643 // LadyHavoc: if the model has no flags, don't check each
1644 if (e->render.model && e->render.effects && !(e->render.flags & RENDER_VIEWMODEL))
1645 {
1646 if (e->render.effects & EF_GIB)
1647 trailtype = EFFECT_TR_BLOOD;
1648 else if (e->render.effects & EF_ZOMGIB)
1649 trailtype = EFFECT_TR_SLIGHTBLOOD;
1650 else if (e->render.effects & EF_TRACER)
1651 trailtype = EFFECT_TR_WIZSPIKE;
1652 else if (e->render.effects & EF_TRACER2)
1653 trailtype = EFFECT_TR_KNIGHTSPIKE;
1654 else if (e->render.effects & EF_ROCKET)
1655 trailtype = EFFECT_TR_ROCKET;
1656 else if (e->render.effects & EF_GRENADE)
1657 {
1658 // LadyHavoc: e->render.alpha == -1 is for Nehahra dem compatibility (cigar smoke)
1659 trailtype = e->render.alpha == -1 ? EFFECT_TR_NEHAHRASMOKE : EFFECT_TR_GRENADE;
1660 }
1661 else if (e->render.effects & EF_TRACER3)
1662 trailtype = EFFECT_TR_VORESPIKE;
1663 }
1664 // LadyHavoc: customizable glow
1665 if (e->state_current.glowsize)
1666 {
1667 // * 4 for the expansion from 0-255 to 0-1023 range,
1668 // / 255 to scale down byte colors
1669 dlightradius = max(dlightradius, e->state_current.glowsize * 4);
1670 VectorMA(dlightcolor, (1.0f / 255.0f), palette_rgb[e->state_current.glowcolor], dlightcolor);
1671 }
1672 // custom rtlight
1674 {
1675 matrix4x4_t dlightmatrix;
1676 vec4_t light;
1677 VectorScale(e->state_current.light, (1.0f / 256.0f), light);
1678 light[3] = e->state_current.light[3];
1679 if (light[0] == 0 && light[1] == 0 && light[2] == 0)
1680 VectorSet(light, 1, 1, 1);
1681 if (light[3] == 0)
1682 light[3] = 350;
1683 // FIXME: add ambient/diffuse/specular scales as an extension ontop of TENEBRAE_GFX_DLIGHTS?
1684 Matrix4x4_Normalize(&dlightmatrix, &e->render.matrix);
1685 Matrix4x4_Scale(&dlightmatrix, light[3], 1);
1688 }
1689 // make the glow dlight
1690 else if (dlightradius > 0 && (dlightcolor[0] || dlightcolor[1] || dlightcolor[2]) && !(e->render.flags & RENDER_VIEWMODEL) && r_refdef.scene.numlights < MAX_DLIGHTS)
1691 {
1692 matrix4x4_t dlightmatrix;
1693 Matrix4x4_Normalize(&dlightmatrix, &e->render.matrix);
1694 // hack to make glowing player light shine on their gun
1695 //if (e->state_current.number == cl.viewentity/* && !chase_active.integer*/)
1696 // Matrix4x4_AdjustOrigin(&dlightmatrix, 0, 0, 30);
1697 Matrix4x4_Scale(&dlightmatrix, dlightradius, 1);
1698 R_RTLight_Update(&r_refdef.scene.templights[r_refdef.scene.numlights], false, &dlightmatrix, dlightcolor, -1, NULL, true, 1, 0.25, 0, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
1700 }
1701 // do trail light
1702 if (e->render.flags & RENDER_GLOWTRAIL)
1703 trailtype = EFFECT_TR_GLOWTRAIL;
1706 if (trailtype)
1707 CL_ParticleTrail(trailtype, 1, origin, origin, vec3_origin, vec3_origin, NULL, e->state_current.glowcolor, true, false, NULL, NULL, 1);
1708
1709 // don't show entities with no modelindex (note: this still shows
1710 // entities which have a modelindex that resolved to a NULL model)
1713 //if (cl.viewentity && e->state_current.number == cl.viewentity)
1714 // Matrix4x4_Print(&e->render.matrix);
1715}
1716
1717static void CL_RelinkWorld(void)
1718{
1719 entity_t *ent = &cl.entities[0];
1720 // FIXME: this should be done at load
1722 ent->render.flags = RENDER_SHADOW;
1723 if (!r_fullbright.integer)
1724 ent->render.flags |= RENDER_LIGHT;
1725 VectorSet(ent->render.colormod, 1, 1, 1);
1726 VectorSet(ent->render.glowmod, 1, 1, 1);
1727 ent->render.allowdecals = true;
1731
1732 // if the world is q2bsp, animate the textures
1733 if (ent->render.model && ent->render.model->brush.isq2bsp)
1734 ent->render.framegroupblend[0].frame = (int)(cl.time * 2.0f);
1735}
1736
1738{
1739 int i;
1740 entity_t *e;
1742 {
1743 e->render.flags = 0;
1744 // if the model was not loaded when the static entity was created we
1745 // need to re-fetch the model pointer
1747 // either fullbright or lit
1749 {
1750 if (!(e->render.effects & EF_FULLBRIGHT))
1752 }
1753 // hide player shadow during intermission or nehahra movie
1754 if (!(e->render.effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST)) && (e->render.alpha >= 1))
1756 VectorSet(e->render.colormod, 1, 1, 1);
1757 VectorSet(e->render.glowmod, 1, 1, 1);
1759 e->render.allowdecals = true;
1762 }
1763}
1764
1765/*
1766===============
1767CL_RelinkEntities
1768===============
1769*/
1771{
1772 entity_t *ent;
1773 int i;
1774
1775 // start on the entity after the world
1776 for (i = 1;i < cl.num_entities;i++)
1777 {
1778 if (cl.entities_active[i])
1779 {
1780 ent = cl.entities + i;
1781 if (ent->state_current.active)
1783 else
1784 cl.entities_active[i] = false;
1785 }
1786 }
1787}
1788
1789static void CL_RelinkEffects(void)
1790{
1791 int i, intframe;
1792 cl_effect_t *e;
1793 entity_render_t *entrender;
1794 float frame;
1795
1796 for (i = 0, e = cl.effects;i < cl.num_effects;i++, e++)
1797 {
1798 if (e->active)
1799 {
1800 frame = (cl.time - e->starttime) * e->framerate + e->startframe;
1801 intframe = (int)frame;
1802 if (intframe < 0 || intframe >= e->endframe)
1803 {
1804 memset(e, 0, sizeof(*e));
1805 while (cl.num_effects > 0 && !cl.effects[cl.num_effects - 1].active)
1806 cl.num_effects--;
1807 continue;
1808 }
1809
1810 if (intframe != e->frame)
1811 {
1812 e->frame = intframe;
1813 e->frame1time = e->frame2time;
1814 e->frame2time = cl.time;
1815 }
1816
1817 // if we're drawing effects, get a new temp entity
1818 // (NewTempEntity adds it to the render entities list for us)
1819 if (r_draweffects.integer && (entrender = CL_NewTempEntity(e->starttime)))
1820 {
1821 // interpolation stuff
1822 entrender->framegroupblend[0].frame = intframe;
1823 entrender->framegroupblend[0].lerp = 1 - frame - intframe;
1824 entrender->framegroupblend[0].start = e->frame1time;
1825 if (intframe + 1 >= e->endframe)
1826 {
1827 entrender->framegroupblend[1].frame = 0; // disappear
1828 entrender->framegroupblend[1].lerp = 0;
1829 entrender->framegroupblend[1].start = 0;
1830 }
1831 else
1832 {
1833 entrender->framegroupblend[1].frame = intframe + 1;
1834 entrender->framegroupblend[1].lerp = frame - intframe;
1835 entrender->framegroupblend[1].start = e->frame2time;
1836 }
1837
1838 // normal stuff
1839 entrender->model = e->model;
1840 entrender->alpha = 1;
1841 VectorSet(entrender->colormod, 1, 1, 1);
1842 VectorSet(entrender->glowmod, 1, 1, 1);
1843
1844 Matrix4x4_CreateFromQuakeEntity(&entrender->matrix, e->origin[0], e->origin[1], e->origin[2], 0, 0, 0, 1);
1845 CL_UpdateRenderEntity(entrender);
1846 }
1847 }
1848 }
1849}
1850
1852{
1853 VectorCopy(b->start, start);
1854 VectorCopy(b->end, end);
1855
1856 // if coming from the player, update the start position
1857 if (b->entity == cl.viewentity)
1858 {
1860 {
1861 // LadyHavoc: this is a stupid hack from Quake that makes your
1862 // lightning appear to come from your waist and cover less of your
1863 // view
1864 // in Quake this hack was applied to all players (causing the
1865 // infamous crotch-lightning), but in darkplaces and QuakeWorld it
1866 // only applies to your own lightning, and only in first person
1868 }
1870 {
1871 vec3_t dir, localend;
1872 vec_t len;
1873 // LadyHavoc: this updates the beam direction to match your
1874 // viewangles
1875 VectorSubtract(end, start, dir);
1876 len = VectorLength(dir);
1878 VectorSet(localend, len, 0, 0);
1879 Matrix4x4_Transform(&r_refdef.view.matrix, localend, end);
1880 }
1881 }
1882}
1883
1885{
1886 int i;
1887 beam_t *b;
1888 vec3_t dist, org, start, end;
1889 float d;
1890 entity_render_t *entrender;
1891 double yaw, pitch;
1892 float forward;
1893 matrix4x4_t tempmatrix;
1894
1895 for (i = 0, b = cl.beams;i < cl.num_beams;i++, b++)
1896 {
1897 if (!b->model)
1898 continue;
1899 if (b->endtime < cl.time)
1900 {
1901 b->model = NULL;
1902 continue;
1903 }
1904
1905 CL_Beam_CalculatePositions(b, start, end);
1906
1907 if (b->lightning)
1908 {
1910 {
1911 // FIXME: create a matrix from the beam start/end orientation
1912 vec3_t dlightcolor;
1913 VectorSet(dlightcolor, 0.3, 0.7, 1);
1914 Matrix4x4_CreateFromQuakeEntity(&tempmatrix, end[0], end[1], end[2], 0, 0, 0, 200);
1915 R_RTLight_Update(&r_refdef.scene.templights[r_refdef.scene.numlights], false, &tempmatrix, dlightcolor, -1, NULL, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
1917 }
1919 {
1921 continue;
1922 }
1923 }
1924
1925 // calculate pitch and yaw
1926 // (this is similar to the QuakeC builtin function vectoangles)
1927 VectorSubtract(end, start, dist);
1928 if (dist[1] == 0 && dist[0] == 0)
1929 {
1930 yaw = 0;
1931 if (dist[2] > 0)
1932 pitch = 90;
1933 else
1934 pitch = 270;
1935 }
1936 else
1937 {
1938 yaw = atan2(dist[1], dist[0]) * 180 / M_PI;
1939 if (yaw < 0)
1940 yaw += 360;
1941
1942 forward = sqrt (dist[0]*dist[0] + dist[1]*dist[1]);
1943 pitch = atan2(dist[2], forward) * 180 / M_PI;
1944 if (pitch < 0)
1945 pitch += 360;
1946 }
1947
1948 // add new entities for the lightning
1949 VectorCopy (start, org);
1950 d = VectorNormalizeLength(dist);
1951 while (d > 0)
1952 {
1953 entrender = CL_NewTempEntity (0);
1954 if (!entrender)
1955 return;
1956 entrender->model = b->model;
1957 Matrix4x4_CreateFromQuakeEntity(&entrender->matrix, org[0], org[1], org[2], -pitch, yaw, lhrandom(0, 360), 1);
1958 CL_UpdateRenderEntity(entrender);
1959 VectorMA(org, 30, dist, org);
1960 d -= 30;
1961 }
1962 }
1963
1964 while (cl.num_beams > 0 && !cl.beams[cl.num_beams - 1].model)
1965 cl.num_beams--;
1966}
1967
1968static void CL_RelinkQWNails(void)
1969{
1970 int i;
1971 vec_t *v;
1972 entity_render_t *entrender;
1973
1974 for (i = 0;i < cl.qw_num_nails;i++)
1975 {
1976 v = cl.qw_nails[i];
1977
1978 // if we're drawing effects, get a new temp entity
1979 // (NewTempEntity adds it to the render entities list for us)
1980 if (!(entrender = CL_NewTempEntity(0)))
1981 continue;
1982
1983 // normal stuff
1985 entrender->alpha = 1;
1986 VectorSet(entrender->colormod, 1, 1, 1);
1987 VectorSet(entrender->glowmod, 1, 1, 1);
1988
1989 Matrix4x4_CreateFromQuakeEntity(&entrender->matrix, v[0], v[1], v[2], v[3], v[4], v[5], 1);
1990 CL_UpdateRenderEntity(entrender);
1991 }
1992}
1993
1994static void CL_LerpPlayer(float frac)
1995{
1996 int i;
1997
1998 cl.viewzoom = cl.mviewzoom[1] + frac * (cl.mviewzoom[0] - cl.mviewzoom[1]);
1999 for (i = 0;i < 3;i++)
2000 {
2001 cl.punchangle[i] = cl.mpunchangle[1][i] + frac * (cl.mpunchangle[0][i] - cl.mpunchangle[1][i]);
2002 cl.punchvector[i] = cl.mpunchvector[1][i] + frac * (cl.mpunchvector[0][i] - cl.mpunchvector[1][i]);
2003 cl.velocity[i] = cl.mvelocity[1][i] + frac * (cl.mvelocity[0][i] - cl.mvelocity[1][i]);
2004 }
2005
2006 // interpolate the angles if playing a demo or spectating someone
2007 if (cls.demoplayback || cl.fixangle[0])
2008 {
2009 for (i = 0;i < 3;i++)
2010 {
2011 float d = cl.mviewangles[0][i] - cl.mviewangles[1][i];
2012 if (d > 180)
2013 d -= 360;
2014 else if (d < -180)
2015 d += 360;
2016 cl.viewangles[i] = cl.mviewangles[1][i] + frac * d;
2017 }
2018 }
2019}
2020
2022{
2023 // link stuff
2025 // the scene mesh is added first for easier debugging (consistent spot in render entities list)
2031
2032 // link stuff
2034 {
2037 CL_LinkNetworkEntity(&cl.viewent); // link gun model
2039 }
2040
2041 // update view blend
2043}
2044
2045/*
2046===============
2047CL_UpdateWorld
2048
2049Update client game world for a new frame
2050===============
2051*/
2053{
2057 r_refdef.view.quality = 1;
2058
2060
2061 if (cls.state == ca_connected && cls.signon == SIGNONS)
2062 {
2063 // prepare for a new frame
2067 V_DriftPitch();
2069
2070 // if prediction is enabled we have to update all the collidable
2071 // network entities before the prediction code can be run
2073
2074 // now update the player prediction
2076
2077 // update the player entity (which may be predicted)
2079
2080 // now update the view (which depends on that player entity)
2081 V_CalcRefdef();
2082
2083 // now update all the network entities and create particle trails
2084 // (some entities may depend on the view)
2086
2087 // update the engine-based viewmodel
2089
2090 // when csqc is loaded, it will call this in CSQC_UpdateView
2091 if (!CLVM_prog->loaded || CLVM_prog->flag & PRVM_CSQC_SIMPLE)
2092 {
2093 // clear the CL_Mesh_Scene() used for some engine effects
2095 // add engine entities and effects
2097 }
2098
2099 // decals, particles, and explosions will be updated during rneder
2100 }
2101
2103}
2104
2105/*
2106======================
2107CL_Fog_f
2108======================
2109*/
2111{
2112 if (Cmd_Argc (cmd) == 1)
2113 {
2115 return;
2116 }
2117 FOG_clear(); // so missing values get good defaults
2118 if(Cmd_Argc(cmd) > 1)
2119 r_refdef.fog_density = atof(Cmd_Argv(cmd, 1));
2120 if(Cmd_Argc(cmd) > 2)
2121 r_refdef.fog_red = atof(Cmd_Argv(cmd, 2));
2122 if(Cmd_Argc(cmd) > 3)
2123 r_refdef.fog_green = atof(Cmd_Argv(cmd, 3));
2124 if(Cmd_Argc(cmd) > 4)
2125 r_refdef.fog_blue = atof(Cmd_Argv(cmd, 4));
2126 if(Cmd_Argc(cmd) > 5)
2127 r_refdef.fog_alpha = atof(Cmd_Argv(cmd, 5));
2128 if(Cmd_Argc(cmd) > 6)
2129 r_refdef.fog_start = atof(Cmd_Argv(cmd, 6));
2130 if(Cmd_Argc(cmd) > 7)
2131 r_refdef.fog_end = atof(Cmd_Argv(cmd, 7));
2132 if(Cmd_Argc(cmd) > 8)
2133 r_refdef.fog_height = atof(Cmd_Argv(cmd, 8));
2134 if(Cmd_Argc(cmd) > 9)
2135 r_refdef.fog_fadedepth = atof(Cmd_Argv(cmd, 9));
2136}
2137
2138/*
2139======================
2140CL_FogHeightTexture_f
2141======================
2142*/
2144{
2145 if (Cmd_Argc (cmd) < 11)
2146 {
2148 return;
2149 }
2150 FOG_clear(); // so missing values get good defaults
2151 r_refdef.fog_density = atof(Cmd_Argv(cmd, 1));
2152 r_refdef.fog_red = atof(Cmd_Argv(cmd, 2));
2153 r_refdef.fog_green = atof(Cmd_Argv(cmd, 3));
2154 r_refdef.fog_blue = atof(Cmd_Argv(cmd, 4));
2155 r_refdef.fog_alpha = atof(Cmd_Argv(cmd, 5));
2156 r_refdef.fog_start = atof(Cmd_Argv(cmd, 6));
2157 r_refdef.fog_end = atof(Cmd_Argv(cmd, 7));
2158 r_refdef.fog_height = atof(Cmd_Argv(cmd, 8));
2159 r_refdef.fog_fadedepth = atof(Cmd_Argv(cmd, 9));
2161}
2162
2163
2164/*
2165====================
2166CL_TimeRefresh_f
2167
2168For program optimization
2169====================
2170*/
2172{
2173 int i;
2174 double timestart, timedelta;
2175
2176 timestart = Sys_DirtyTime();
2177 for (i = 0;i < 128;i++)
2178 {
2180 r_refdef.view.quality = 1;
2182 }
2183 timedelta = Sys_DirtyTime() - timestart;
2184
2185 Con_Printf("%f seconds (%f fps)\n", timedelta, 128/timedelta);
2186}
2187
2189{
2190 World_PrintAreaStats(&cl.world, "client");
2191}
2192
2194{
2195 int i;
2196 cl_locnode_t *loc;
2197 cl_locnode_t *best;
2198 vec3_t nearestpoint;
2199 vec_t dist, bestdist;
2200 best = NULL;
2201 bestdist = 0;
2202 for (loc = cl.locnodes;loc;loc = loc->next)
2203 {
2204 for (i = 0;i < 3;i++)
2205 nearestpoint[i] = bound(loc->mins[i], point[i], loc->maxs[i]);
2206 dist = VectorDistance2(nearestpoint, point);
2207 if (bestdist > dist || !best)
2208 {
2209 bestdist = dist;
2210 best = loc;
2211 if (bestdist < 1)
2212 break;
2213 }
2214 }
2215 return best;
2216}
2217
2218void CL_Locs_FindLocationName(char *buffer, size_t buffersize, vec3_t point)
2219{
2220 cl_locnode_t *loc;
2221 loc = CL_Locs_FindNearest(point);
2222 if (loc)
2223 dp_strlcpy(buffer, loc->name, buffersize);
2224 else
2225 dpsnprintf(buffer, buffersize, "LOC=%.0f:%.0f:%.0f", point[0], point[1], point[2]);
2226}
2227
2229{
2230 cl_locnode_t **pointer, **next;
2231 for (pointer = &cl.locnodes;*pointer;pointer = next)
2232 {
2233 next = &(*pointer)->next;
2234 if (*pointer == node)
2235 {
2236 *pointer = node->next;
2237 Mem_Free(node);
2238 return;
2239 }
2240 }
2241 Con_Printf("CL_Locs_FreeNode: no such node! (%p)\n", (void *)node);
2242}
2243
2244static void CL_Locs_AddNode(vec3_t mins, vec3_t maxs, const char *name)
2245{
2246 cl_locnode_t *node, **pointer;
2247 int namelen;
2248 if (!name)
2249 name = "";
2250 namelen = (int)strlen(name);
2251 node = (cl_locnode_t *) Mem_Alloc(cls.levelmempool, sizeof(cl_locnode_t) + namelen + 1);
2252 VectorSet(node->mins, min(mins[0], maxs[0]), min(mins[1], maxs[1]), min(mins[2], maxs[2]));
2253 VectorSet(node->maxs, max(mins[0], maxs[0]), max(mins[1], maxs[1]), max(mins[2], maxs[2]));
2254 node->name = (char *)(node + 1);
2255 memcpy(node->name, name, namelen);
2256 node->name[namelen] = 0;
2257 // link it into the tail of the list to preserve the order
2258 for (pointer = &cl.locnodes;*pointer;pointer = &(*pointer)->next)
2259 ;
2260 *pointer = node;
2261}
2262
2264{
2265 vec3_t mins, maxs;
2266 if (Cmd_Argc(cmd) != 5 && Cmd_Argc(cmd) != 8)
2267 {
2268 Con_Printf("usage: %s x y z[ x y z] name\n", Cmd_Argv(cmd, 0));
2269 return;
2270 }
2271 mins[0] = atof(Cmd_Argv(cmd, 1));
2272 mins[1] = atof(Cmd_Argv(cmd, 2));
2273 mins[2] = atof(Cmd_Argv(cmd, 3));
2274 if (Cmd_Argc(cmd) == 8)
2275 {
2276 maxs[0] = atof(Cmd_Argv(cmd, 4));
2277 maxs[1] = atof(Cmd_Argv(cmd, 5));
2278 maxs[2] = atof(Cmd_Argv(cmd, 6));
2280 }
2281 else
2283}
2284
2286{
2287 cl_locnode_t *loc;
2289 if (loc)
2290 CL_Locs_FreeNode(loc);
2291 else
2292 Con_Printf("no loc point or box found for your location\n");
2293}
2294
2296{
2297 while (cl.locnodes)
2299}
2300
2302{
2303 cl_locnode_t *loc;
2304 qfile_t *outfile;
2305 char locfilename[MAX_QPATH];
2306 char timestring[128];
2307
2308 if (!cl.locnodes)
2309 {
2310 Con_Printf("No loc points/boxes exist!\n");
2311 return;
2312 }
2313 if (cls.state != ca_connected || !cl.worldmodel)
2314 {
2315 Con_Printf("No level loaded!\n");
2316 return;
2317 }
2318 dpsnprintf(locfilename, sizeof(locfilename), "%s.loc", cl.worldnamenoextension);
2319
2320 outfile = FS_OpenRealFile(locfilename, "w", false);
2321 if (!outfile)
2322 return;
2323 // if any boxes are used then this is a proquake-format loc file, which
2324 // allows comments, so add some relevant information at the start
2325 for (loc = cl.locnodes;loc;loc = loc->next)
2326 if (!VectorCompare(loc->mins, loc->maxs))
2327 break;
2328 if (loc)
2329 {
2330 Sys_TimeString(timestring, sizeof(timestring), "%Y-%m-%d");
2331 FS_Printf(outfile, "// %s %s saved by %s\n// x,y,z,x,y,z,\"name\"\n\n", locfilename, timestring, engineversion);
2332 for (loc = cl.locnodes;loc;loc = loc->next)
2333 if (VectorCompare(loc->mins, loc->maxs))
2334 break;
2335 if (loc)
2336 Con_Printf(CON_WARN "Warning: writing loc file containing a mixture of qizmo-style points and proquake-style boxes may not work in qizmo or proquake!\n");
2337 }
2338 for (loc = cl.locnodes;loc;loc = loc->next)
2339 {
2340 if (VectorCompare(loc->mins, loc->maxs))
2341 {
2342 int len;
2343 const char *s;
2344 const char *in = loc->name;
2345 char name[MAX_INPUTLINE];
2346 for (len = 0;len < (int)sizeof(name) - 1 && *in;)
2347 {
2348 if (*in == ' ') {s = "$loc_name_separator";in++;}
2349 else if (!strncmp(in, "SSG", 3)) {s = "$loc_name_ssg";in += 3;}
2350 else if (!strncmp(in, "NG", 2)) {s = "$loc_name_ng";in += 2;}
2351 else if (!strncmp(in, "SNG", 3)) {s = "$loc_name_sng";in += 3;}
2352 else if (!strncmp(in, "GL", 2)) {s = "$loc_name_gl";in += 2;}
2353 else if (!strncmp(in, "RL", 2)) {s = "$loc_name_rl";in += 2;}
2354 else if (!strncmp(in, "LG", 2)) {s = "$loc_name_lg";in += 2;}
2355 else if (!strncmp(in, "GA", 2)) {s = "$loc_name_ga";in += 2;}
2356 else if (!strncmp(in, "YA", 2)) {s = "$loc_name_ya";in += 2;}
2357 else if (!strncmp(in, "RA", 2)) {s = "$loc_name_ra";in += 2;}
2358 else if (!strncmp(in, "MEGA", 4)) {s = "$loc_name_mh";in += 4;}
2359 else s = NULL;
2360 if (s)
2361 {
2362 while (len < (int)sizeof(name) - 1 && *s)
2363 name[len++] = *s++;
2364 continue;
2365 }
2366 name[len++] = *in++;
2367 }
2368 name[len] = 0;
2369 FS_Printf(outfile, "%.0f %.0f %.0f %s\n", loc->mins[0]*8, loc->mins[1]*8, loc->mins[2]*8, name);
2370 }
2371 else
2372 FS_Printf(outfile, "%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,\"%s\"\n", loc->mins[0], loc->mins[1], loc->mins[2], loc->maxs[0], loc->maxs[1], loc->maxs[2], loc->name);
2373 }
2375}
2376
2378{
2379 int i, linenumber, limit, len;
2380 const char *s;
2381 char *filedata, *text, *textend, *linestart, *linetext, *lineend;
2382 fs_offset_t filesize;
2383 vec3_t mins, maxs;
2384 char locfilename[MAX_QPATH];
2385 char name[MAX_INPUTLINE];
2386
2387 if (cls.state != ca_connected || !cl.worldmodel)
2388 {
2389 Con_Printf("No level loaded!\n");
2390 return;
2391 }
2392
2394
2395 // try maps/something.loc first (LadyHavoc: where I think they should be)
2396 dpsnprintf(locfilename, sizeof(locfilename), "%s.loc", cl.worldnamenoextension);
2397 filedata = (char *)FS_LoadFile(locfilename, cls.levelmempool, false, &filesize);
2398 if (!filedata)
2399 {
2400 // try proquake name as well (LadyHavoc: I hate path mangling)
2401 dpsnprintf(locfilename, sizeof(locfilename), "locs/%s.loc", cl.worldbasename);
2402 filedata = (char *)FS_LoadFile(locfilename, cls.levelmempool, false, &filesize);
2403 if (!filedata)
2404 return;
2405 }
2406 text = filedata;
2407 textend = filedata + filesize;
2408 for (linenumber = 1;text < textend;linenumber++)
2409 {
2410 linestart = text;
2411 for (;text < textend && *text != '\r' && *text != '\n';text++)
2412 ;
2413 lineend = text;
2414 if (text + 1 < textend && *text == '\r' && text[1] == '\n')
2415 text++;
2416 if (text < textend)
2417 text++;
2418 // trim trailing whitespace
2419 while (lineend > linestart && ISWHITESPACE(lineend[-1]))
2420 lineend--;
2421 // trim leading whitespace
2422 while (linestart < lineend && ISWHITESPACE(*linestart))
2423 linestart++;
2424 // check if this is a comment
2425 if (linestart + 2 <= lineend && !strncmp(linestart, "//", 2))
2426 continue;
2427 linetext = linestart;
2428 limit = 3;
2429 for (i = 0;i < limit;i++)
2430 {
2431 if (linetext >= lineend)
2432 break;
2433 // note: a missing number is interpreted as 0
2434 if (i < 3)
2435 mins[i] = atof(linetext);
2436 else
2437 maxs[i - 3] = atof(linetext);
2438 // now advance past the number
2439 while (linetext < lineend && !ISWHITESPACE(*linetext) && *linetext != ',')
2440 linetext++;
2441 // advance through whitespace
2442 if (linetext < lineend)
2443 {
2444 if (*linetext == ',')
2445 {
2446 linetext++;
2447 limit = 6;
2448 // note: comma can be followed by whitespace
2449 }
2450 if (ISWHITESPACE(*linetext))
2451 {
2452 // skip whitespace
2453 while (linetext < lineend && ISWHITESPACE(*linetext))
2454 linetext++;
2455 }
2456 }
2457 }
2458 // if this is a quoted name, remove the quotes
2459 if (i == 6)
2460 {
2461 if (linetext >= lineend || *linetext != '"')
2462 continue; // proquake location names are always quoted
2463 lineend--;
2464 linetext++;
2465 len = min(lineend - linetext, (int)sizeof(name) - 1);
2466 memcpy(name, linetext, len);
2467 name[len] = 0;
2468 // add the box to the list
2470 }
2471 // if a point was parsed, it needs to be scaled down by 8 (since
2472 // point-based loc files were invented by a proxy which dealt
2473 // directly with quake protocol coordinates, which are *8), turn
2474 // it into a box
2475 else if (i == 3)
2476 {
2477 // interpret silly fuhquake macros
2478 for (len = 0;len < (int)sizeof(name) - 1 && linetext < lineend;)
2479 {
2480 if (*linetext == '$')
2481 {
2482 if (linetext + 18 <= lineend && !strncmp(linetext, "$loc_name_separator", 19)) {s = " ";linetext += 19;}
2483 else if (linetext + 13 <= lineend && !strncmp(linetext, "$loc_name_ssg", 13)) {s = "SSG";linetext += 13;}
2484 else if (linetext + 12 <= lineend && !strncmp(linetext, "$loc_name_ng", 12)) {s = "NG";linetext += 12;}
2485 else if (linetext + 13 <= lineend && !strncmp(linetext, "$loc_name_sng", 13)) {s = "SNG";linetext += 13;}
2486 else if (linetext + 12 <= lineend && !strncmp(linetext, "$loc_name_gl", 12)) {s = "GL";linetext += 12;}
2487 else if (linetext + 12 <= lineend && !strncmp(linetext, "$loc_name_rl", 12)) {s = "RL";linetext += 12;}
2488 else if (linetext + 12 <= lineend && !strncmp(linetext, "$loc_name_lg", 12)) {s = "LG";linetext += 12;}
2489 else if (linetext + 12 <= lineend && !strncmp(linetext, "$loc_name_ga", 12)) {s = "GA";linetext += 12;}
2490 else if (linetext + 12 <= lineend && !strncmp(linetext, "$loc_name_ya", 12)) {s = "YA";linetext += 12;}
2491 else if (linetext + 12 <= lineend && !strncmp(linetext, "$loc_name_ra", 12)) {s = "RA";linetext += 12;}
2492 else if (linetext + 12 <= lineend && !strncmp(linetext, "$loc_name_mh", 12)) {s = "MEGA";linetext += 12;}
2493 else s = NULL;
2494 if (s)
2495 {
2496 while (len < (int)sizeof(name) - 1 && *s)
2497 name[len++] = *s++;
2498 continue;
2499 }
2500 }
2501 name[len++] = *linetext++;
2502 }
2503 name[len] = 0;
2504 // add the point to the list
2505 VectorScale(mins, (1.0 / 8.0), mins);
2507 }
2508 else
2509 continue;
2510 }
2511}
2512
2516{
2517 "MESH_SCENE",
2518 "MESH_UI",
2519};
2520
2522{
2523 int i;
2524 entity_t *ent;
2525 for (i = 0; i < NUM_MESHENTITIES; i++)
2526 {
2527 ent = cl_meshentities + i;
2530 }
2531}
2532
2533static void CL_MeshEntities_Start(void)
2534{
2535 int i;
2536 entity_t *ent;
2537 for(i = 0; i < NUM_MESHENTITIES; i++)
2538 {
2539 ent = cl_meshentities + i;
2541 }
2542}
2543
2545{
2546 int i;
2547 entity_t *ent;
2548 for(i = 0; i < NUM_MESHENTITIES; i++)
2549 {
2550 ent = cl_meshentities + i;
2552 }
2553}
2554
2556{
2557 int i;
2558 entity_t *ent;
2559 for (i = 0; i < NUM_MESHENTITIES; i++)
2560 {
2561 ent = cl_meshentities + i;
2562 ent->state_current.active = true;
2565 ent->render.alpha = 1;
2567 ent->render.framegroupblend[0].lerp = 1;
2568 ent->render.frameblend[0].lerp = 1;
2569 VectorSet(ent->render.colormod, 1, 1, 1);
2570 VectorSet(ent->render.glowmod, 1, 1, 1);
2574 VectorSet(ent->render.render_fullbright, 1, 1, 1);
2575 VectorSet(ent->render.render_glowmod, 0, 0, 0);
2580 VectorSet(ent->render.render_modellight_lightdir_local, 0, 0, 1); // local doesn't matter because no diffuse/specular color
2586
2589 }
2592}
2593
2598
2604
2612
2620
2621static void CL_UpdateEntityShading_GetDirectedFullbright(vec3_t ambient, vec3_t diffuse, vec3_t worldspacenormal)
2622{
2623 vec3_t angles;
2624
2627
2628 // Use cl.viewangles and not r_refdef.view.forward here so it is the
2629 // same for all stereo views, and to better handle pitches outside
2630 // [-90, 90] (in_pitch_* cvars allow that).
2634 }
2635 else {
2637 }
2638 AngleVectors(angles, worldspacenormal, NULL, NULL);
2639 VectorNegate(worldspacenormal, worldspacenormal);
2640}
2641
2643{
2644 float shadingorigin[3], a[3], c[3], dir[3];
2645 int q;
2646
2647 for (q = 0; q < 3; q++)
2648 a[q] = c[q] = dir[q] = 0;
2649
2650 ent->render_lightgrid = false;
2651 ent->render_modellight_forced = false;
2652 ent->render_rtlight_disabled = false;
2653
2654 // pick an appropriate value for render_modellight_origin - if this is an
2655 // attachment we want to use the parent's render_modellight_origin so that
2656 // shading is the same (also important for r_shadows to cast shadows in the
2657 // same direction)
2659 {
2660 // CSQC entities always provide this (via CL_GetTagMatrix)
2661 for (q = 0; q < 3; q++)
2662 shadingorigin[q] = ent->custommodellight_origin[q];
2663 }
2664 else if (ent->entitynumber > 0 && ent->entitynumber < cl.num_entities)
2665 {
2666 // network entity - follow attachment chain back to a root entity,
2667 int entnum = ent->entitynumber, recursion;
2668 for (recursion = 32; recursion > 0; --recursion)
2669 {
2670 int parentnum = cl.entities[entnum].state_current.tagentity;
2671 if (parentnum < 1 || parentnum >= cl.num_entities || !cl.entities_active[parentnum])
2672 break;
2673 entnum = parentnum;
2674 }
2675 // grab the root entity's origin
2677 }
2678 else
2679 {
2680 // not a CSQC entity (which sets custommodellight_origin), not a network
2681 // entity - so it's probably not attached to anything
2682 Matrix4x4_OriginFromMatrix(&ent->matrix, shadingorigin);
2683 }
2684
2685 if (!(ent->flags & RENDER_LIGHT) || r_fullbright.integer)
2686 {
2687 // intentionally EF_FULLBRIGHT entity
2688 // the only type that is not scaled by r_refdef.scene.lightmapintensity
2689 // CSQC can still provide its own customized modellight values
2690 ent->render_rtlight_disabled = true;
2691 ent->render_modellight_forced = true;
2693 {
2694 // custom colors provided by CSQC
2695 for (q = 0; q < 3; q++)
2696 {
2697 a[q] = ent->custommodellight_ambient[q];
2698 c[q] = ent->custommodellight_diffuse[q];
2699 dir[q] = ent->custommodellight_lightdir[q];
2700 }
2701 }
2704 else
2705 for (q = 0; q < 3; q++)
2706 a[q] = 1;
2707 }
2708 else
2709 {
2710 // fetch the lighting from the worldmodel data
2711
2712 // CSQC can provide its own customized modellight values
2714 {
2715 ent->render_modellight_forced = true;
2716 for (q = 0; q < 3; q++)
2717 {
2718 a[q] = ent->custommodellight_ambient[q];
2719 c[q] = ent->custommodellight_diffuse[q];
2720 dir[q] = ent->custommodellight_lightdir[q];
2721 }
2722 }
2724 {
2725 if (ent->model->sprite.sprnum_type == SPR_OVERHEAD) // apply offset for overhead sprites
2726 shadingorigin[2] = shadingorigin[2] + r_overheadsprites_pushback.value;
2728 ent->render_modellight_forced = true;
2729 ent->render_rtlight_disabled = true;
2730 }
2733 {
2734 ent->render_lightgrid = true;
2735 // no need to call R_CompleteLightPoint as we base it on render_lightmap_*
2736 }
2741 else
2743 }
2744
2745 for (q = 0; q < 3; q++)
2746 {
2747 ent->render_fullbright[q] = ent->colormod[q];
2748 ent->render_glowmod[q] = ent->glowmod[q] * r_hdr_glowintensity.value;
2749 ent->render_modellight_ambient[q] = a[q] * ent->colormod[q];
2750 ent->render_modellight_diffuse[q] = c[q] * ent->colormod[q];
2751 ent->render_modellight_specular[q] = c[q];
2756 ent->render_rtlight_diffuse[q] = ent->colormod[q];
2757 ent->render_rtlight_specular[q] = 1;
2758 }
2759
2760 // these flags disable code paths, make sure it's obvious if they're ignored by storing 0 1 2
2761 if (ent->render_modellight_forced)
2762 for (q = 0; q < 3; q++)
2764 if (ent->render_rtlight_disabled)
2765 for (q = 0; q < 3; q++)
2766 ent->render_rtlight_diffuse[q] = ent->render_rtlight_specular[q] = q;
2767
2769 VectorSet(ent->render_modellight_lightdir_world, 0, 0, 1); // have to set SOME valid vector here
2771 // transform into local space for the entity as well
2774}
2775
2776
2784
2787{
2788 if (!vid_opened && cls.state != ca_dedicated)
2789 {
2790 vid_opened = true;
2791#ifdef WIN32
2792 // make sure we open sockets before opening video because the Windows Firewall "unblock?" dialog can screw up the graphics context on some graphics drivers
2794#endif
2795 VID_Start();
2796 }
2797}
2798
2799extern cvar_t host_framerate;
2800extern cvar_t host_speeds;
2801extern uint8_t serverlist_querystage;
2802double CL_Frame (double time)
2803{
2804 static double clframetime;
2805 static double cl_timer = 0;
2806 static double time1 = 0, time2 = 0, time3 = 0;
2807 int pass1, pass2, pass3;
2808 float maxfps;
2809
2811
2812 /*
2813 * If the accumulator hasn't become positive, don't
2814 * run the frame. Everything that happens before this
2815 * point will happen even if we're sleeping this frame.
2816 */
2817
2818 // limit the frametime steps to no more than 100ms each
2819 cl_timer = min(cl_timer + time, 0.1);
2820
2821 // Run at full speed when querying servers, compared to waking up early to parse
2822 // this is simpler and gives pings more representative of what can be expected when playing.
2824
2825 if (cls.state != ca_dedicated && (cl_timer > 0 || host.restless || maxfps <= 0))
2826 {
2827 R_TimeReport("---");
2829 R_TimeReport("photoncache");
2830#ifdef CONFIG_VIDEO_CAPTURE
2831 // decide the simulation time
2832 if (cls.capturevideo.active)
2833 {
2834 if (cls.capturevideo.realtime)
2835 clframetime = cl.realframetime = max(time, 1.0 / cls.capturevideo.framerate);
2836 else
2837 {
2838 clframetime = 1.0 / cls.capturevideo.framerate;
2839 cl.realframetime = max(time, clframetime);
2840 }
2841 }
2842 else
2843#endif
2844 {
2845 if (maxfps <= 0 || cls.timedemo)
2846 clframetime = cl.realframetime = cl_timer;
2847 else
2848 // networking assumes at least 10fps
2849 clframetime = cl.realframetime = bound(cl_timer, 1 / maxfps, 0.1);
2850
2851 // on some legacy systems, we need to sleep to keep input responsive
2854 }
2855
2856 // apply slowmo scaling
2857 clframetime *= cl.movevars_timescale;
2858 // scale playback speed of demos by slowmo cvar
2859 if (cls.demoplayback)
2860 {
2861 clframetime *= host_timescale.value;
2862 // if demo playback is paused, don't advance time at all
2863 if (cls.demopaused)
2864 clframetime = 0;
2865 }
2866 else
2867 {
2868 // host_framerate overrides all else
2870 clframetime = host_framerate.value;
2871
2872 if (cl.paused || host.paused)
2873 clframetime = 0;
2874 }
2875
2876 // deduct the frame time from the accumulator
2877 cl_timer -= cl.realframetime;
2878
2879 cl.oldtime = cl.time;
2880 cl.time += clframetime;
2881
2882 // update video
2883 if (host_speeds.integer)
2884 time1 = Sys_DirtyTime();
2885 R_TimeReport("pre-input");
2886
2887 // Collect input into cmd
2888 CL_Input();
2889
2890 R_TimeReport("input");
2891
2892 // check for new packets
2894
2895 // read a new frame from a demo if needed
2897 R_TimeReport("clientnetwork");
2898
2899 // now that packets have been read, send input to server
2900 CL_SendMove();
2901 R_TimeReport("sendmove");
2902
2903 // update client world (interpolate entities, create trails, etc)
2905 R_TimeReport("lerpworld");
2906
2908
2909 R_TimeReport("client");
2910
2912 R_TimeReport("render");
2913
2914 if (host_speeds.integer)
2915 time2 = Sys_DirtyTime();
2916
2917 // update audio
2919 {
2921 cl.csqc_usecsqclistener = false;
2922 }
2923 else
2925
2927 R_TimeReport("audio");
2928
2929 // reset gathering of mouse input
2930 in_mouse_x = in_mouse_y = 0;
2931
2932 if (host_speeds.integer)
2933 {
2934 pass1 = (int)((time1 - time3)*1000000);
2935 time3 = Sys_DirtyTime();
2936 pass2 = (int)((time2 - time1)*1000000);
2937 pass3 = (int)((time3 - time2)*1000000);
2938 Con_Printf("%6ius total %6ius server %6ius gfx %6ius snd\n",
2939 pass1+pass2+pass3, pass1, pass2, pass3);
2940 }
2941 }
2942 // if there is some time remaining from this frame, reset the timer
2943 return cl_timer >= 0 ? 0 : cl_timer;
2944}
2945
2946/*
2947===========
2948CL_Shutdown
2949===========
2950*/
2951void CL_Shutdown (void)
2952{
2953 // be quiet while shutting down
2955
2956 // disconnect client from server if active
2957 CL_Disconnect();
2958
2960
2961#ifdef CONFIG_MENU
2962 // Shutdown menu
2963 if(MR_Shutdown)
2964 MR_Shutdown();
2965#endif
2966
2967 S_Terminate ();
2968
2970 VID_Shutdown();
2971
2976
2977 Key_Shutdown();
2978
2981}
2982
2983/*
2984=================
2985CL_Init
2986=================
2987*/
2988void CL_Init (void)
2989{
2990 if (cls.state == ca_dedicated)
2991 {
2992 Cmd_AddCommand(CF_SERVER, "disconnect", CL_Disconnect_f, "disconnect from server (or disconnect all clients if running a server)");
2993 }
2994 else
2995 {
2996 Con_Printf("Initializing client\n");
2997
2999
3001 Palette_Init();
3002#ifdef CONFIG_MENU
3004#endif
3006 VID_Init();
3007 Render_Init();
3008 S_Init();
3009 Key_Init();
3010 V_Init();
3011
3012 cls.levelmempool = Mem_AllocPool("client (per-level memory)", 0, NULL);
3013 cls.permanentmempool = Mem_AllocPool("client (long term memory)", 0, NULL);
3014
3015 memset(&r_refdef, 0, sizeof(r_refdef));
3016 // max entities sent to renderer per frame
3017 r_refdef.scene.maxentities = MAX_EDICTS + 256 + 512;
3019
3020 // max temp entities
3023
3024 CL_InitInput ();
3025
3026 //
3027 // register our commands
3028 //
3030
3049
3054
3057
3058 CL_Demo_Init();
3059
3060 Cmd_AddCommand(CF_CLIENT, "entities", CL_PrintEntities_f, "print information on network entities known to client");
3061 Cmd_AddCommand(CF_CLIENT, "disconnect", CL_Disconnect_f, "disconnect from server (or disconnect all clients if running a server)");
3062 Cmd_AddCommand(CF_CLIENT, "connect", CL_Connect_f, "connect to a server by IP address or hostname");
3063 Cmd_AddCommand(CF_CLIENT | CF_CLIENT_FROM_SERVER, "reconnect", CL_Reconnect_f, "reconnect to the last server you were on, or resets a quakeworld connection (do not use if currently playing on a netquake server)");
3064
3065 // Support Client-side Model Index List
3066 Cmd_AddCommand(CF_CLIENT, "cl_modelindexlist", CL_ModelIndexList_f, "list information on all models in the client modelindex");
3067 // Support Client-side Sound Index List
3068 Cmd_AddCommand(CF_CLIENT, "cl_soundindexlist", CL_SoundIndexList_f, "list all sounds in the client soundindex");
3069
3070 Cmd_AddCommand(CF_CLIENT, "fog", CL_Fog_f, "set global fog parameters (density red green blue [alpha [mindist [maxdist [top [fadedepth]]]]])");
3071 Cmd_AddCommand(CF_CLIENT, "fog_heighttexture", CL_Fog_HeightTexture_f, "set global fog parameters (density red green blue alpha mindist maxdist top depth textures/mapname/fogheight.tga)");
3072
3073 Cmd_AddCommand(CF_CLIENT, "cl_areastats", CL_AreaStats_f, "prints statistics on entity culling during collision traces");
3074
3090
3093
3095
3096 // for QW connections
3098 // multiplying by RAND_MAX necessary for Windows, for which RAND_MAX is only 32767.
3099 Cvar_SetValueQuick(&qport, ((unsigned int)rand() * RAND_MAX + (unsigned int)rand()) & 0xffff);
3100
3101 Cmd_AddCommand(CF_CLIENT, "timerefresh", CL_TimeRefresh_f, "turn quickly and print rendering statistcs");
3102
3105 Cmd_AddCommand(CF_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)");
3106 Cmd_AddCommand(CF_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)");
3107 Cmd_AddCommand(CF_CLIENT, "locs_clear", CL_Locs_Clear_f, "remove all loc points/boxes");
3108 Cmd_AddCommand(CF_CLIENT, "locs_reload", CL_Locs_Reload_f, "reload .loc file for this map");
3109 Cmd_AddCommand(CF_CLIENT, "locs_save", CL_Locs_Save_f, "save .loc file for this map containing currently defined points and boxes");
3110
3113
3125
3128
3129 CL_Parse_Init();
3132
3133 CL_Video_Init();
3134
3136
3140 }
3141}
#define SUPERCONTENTS_SKY
Definition bspfile.h:200
#define SUPERCONTENTS_SOLID
Definition bspfile.h:196
void CDAudio_Update(void)
Definition cd_shared.c:522
void CL_InitCommands(void)
Definition cl_cmd.c:742
trace_t CL_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitnetworkbrushmodels, qbool hitnetworkplayers, int *hitnetworkentity, qbool hitcsqcentities, qbool hitsurfaces)
void CL_FindNonSolidLocation(const vec3_t in, vec3_t out, vec_t radius)
model_t * CL_GetModelByIndex(int modelindex)
void CL_Stop_f(cmd_state_t *cmd)
Definition cl_demo.c:307
void CL_ReadDemoMessage(void)
Definition cl_demo.c:187
void CL_StopPlayback(void)
Definition cl_demo.c:81
void CL_Demo_Init(void)
Definition cl_demo.c:737
cvar_t cl_yawspeed
Definition cl_input.c:372
cvar_t cl_backspeed
Definition cl_input.c:366
cvar_t cl_sidespeed
Definition cl_input.c:367
void CL_Input(void)
Definition cl_input.c:483
cvar_t cl_pitchspeed
Definition cl_input.c:373
cvar_t cl_upspeed
Definition cl_input.c:364
void IN_BestWeapon_ResetData(void)
call before each map so QC can start from a clean state
Definition cl_input.c:226
void CL_ClientMovement_Replay(void)
Definition cl_input.c:1607
void CL_InitInput(void)
Definition cl_input.c:2209
void CL_SendMove(void)
Definition cl_input.c:1771
cvar_t cl_anglespeedkey
Definition cl_input.c:375
cvar_t cl_movespeedkey
Definition cl_input.c:369
cvar_t host_timescale
Definition sv_main.c:228
cvar_t cl_forwardspeed
Definition cl_input.c:365
void CL_MeshEntities_Scene_AddRenderEntity(void)
Definition cl_main.c:2599
static void CL_Reconnect_f(cmd_state_t *cmd)
Definition cl_main.c:491
void CL_DisconnectEx(qbool kicked, const char *fmt,...)
Definition cl_main.c:370
void CL_UpdateViewEntities(void)
Definition cl_main.c:1432
model_t cl_meshentitymodels[NUM_MESHENTITIES]
Definition cl_main.c:2514
static void CL_ToggleMenu_Hook(void)
Definition cl_main.c:349
cvar_t cl_explosions_lifetime
Definition cl_main.c:73
cvar_t csqc_progcrc
Definition cl_main.c:36
cvar_t cl_noplayershadow
Definition cl_main.c:85
double CL_Frame(double time)
Definition cl_main.c:2802
static void CL_RelinkStaticEntities(void)
Definition cl_main.c:1737
cvar_t cl_minfps_qualitystepmax
Definition cl_main.c:106
cvar_t host_speeds
Definition host.c:46
void CL_MeshEntities_Scene_FinalizeRenderEntity(void)
Definition cl_main.c:2605
static void CL_PrintEntities_f(cmd_state_t *cmd)
Definition cl_main.c:629
void CL_UpdateWorld(void)
Definition cl_main.c:2052
cvar_t cl_minfps_qualitymin
Definition cl_main.c:103
cvar_t cl_autodemo_delete
Definition cl_main.c:64
static void CL_UpdateEntityShading_GetDirectedFullbright(vec3_t ambient, vec3_t diffuse, vec3_t worldspacenormal)
Definition cl_main.c:2621
void CL_UpdateRenderEntity(entity_render_t *ent)
Definition cl_main.c:702
cvar_t r_overheadsprites_pushback
qbool vid_opened
Definition cl_main.c:2785
void CL_Beam_CalculatePositions(const beam_t *b, vec3_t start, vec3_t end)
Definition cl_main.c:1851
cvar_t cl_lerpexcess
Definition cl_main.c:44
static void CL_TimeRefresh_f(cmd_state_t *cmd)
Definition cl_main.c:2171
cvar_t host_framerate
Definition host.c:44
cvar_t freelook
Definition cl_main.c:60
cvar_t lookspring
Definition cl_main.c:51
cvar_t csqc_usedemoprogs
Definition cl_main.c:38
cvar_t r_fullbright_directed_pitch_relative
Definition gl_rmain.c:118
cvar_t cl_prydoncursor_notrace
Definition cl_main.c:93
void CSQC_RelinkAllEntities(int drawmask)
Definition cl_main.c:2021
static void CL_RelinkWorld(void)
Definition cl_main.c:1717
cvar_t cl_minfps
Definition cl_main.c:100
cvar_t qport
Definition cl_main.c:90
cvar_t r_fullbright_directed_diffuse
Definition gl_rmain.c:116
static void CL_LerpPlayer(float frac)
Definition cl_main.c:1994
void CL_Disconnect_f(cmd_state_t *cmd)
Definition cl_main.c:559
cvar_t cl_stainmaps_clearonload
Definition cl_main.c:76
cvar_t m_side
Definition cl_main.c:58
cvar_t cl_dlights_decaybrightness
Definition cl_main.c:88
static float CL_LerpPoint(void)
Definition cl_main.c:763
static const vec3_t muzzleflashorigin
Definition cl_main.c:1059
static void CL_AddQWCTFFlagModel(entity_t *player, int skin)
Definition cl_main.c:1002
void CL_Effect(vec3_t org, model_t *model, int startframe, int framecount, float framerate)
Definition cl_main.c:816
cvar_t m_yaw
Definition cl_main.c:56
cvar_t cl_minfps_qualitymax
Definition cl_main.c:102
cvar_t cl_maxfps
Definition cl_main.c:108
void CL_ClearTempEntities(void)
Definition cl_main.c:781
static void CL_UpdateViewModel(void)
Definition cl_main.c:1508
void CL_Locs_FindLocationName(char *buffer, size_t buffersize, vec3_t point)
Definition cl_main.c:2218
cvar_t m_forward
Definition cl_main.c:57
entity_render_t * CL_NewTempEntity(double shadertime)
Definition cl_main.c:794
static void CL_AreaStats_f(cmd_state_t *cmd)
Definition cl_main.c:2188
cvar_t cl_explosions_size_start
Definition cl_main.c:71
cvar_t cl_lerpanim_maxdelta_server
Definition cl_main.c:45
void CL_ExpandCSQCRenderEntities(int num)
Definition cl_main.c:325
static void CL_Fog_f(cmd_state_t *cmd)
Definition cl_main.c:2110
static void CL_UpdateNetworkCollisionEntities(void)
Definition cl_main.c:1454
void CL_StartVideo(void)
Definition cl_main.c:2786
void CL_RelinkBeams(void)
Definition cl_main.c:1884
cvar_t cl_locs_enable
Definition cl_main.c:97
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)
Definition cl_main.c:852
cvar_t cl_bottomcolor
Definition cl_cmd.c:36
cvar_t cl_nolerp
Definition cl_main.c:43
static void CL_UpdateNetworkEntities(void)
Definition cl_main.c:1481
static void CL_LinkNetworkEntity(entity_t *e)
Definition cl_main.c:1543
cvar_t cl_explosions_size_end
Definition cl_main.c:72
static void CL_Locs_AddNode(vec3_t mins, vec3_t maxs, const char *name)
Definition cl_main.c:2244
cvar_t cl_gameplayfix_nudgeoutofsolid_separation
Definition cl_main.c:113
cvar_t cl_itembobspeed
Definition cl_main.c:49
static void CL_Locs_FreeNode(cl_locnode_t *node)
Definition cl_main.c:2228
static void CL_Connect_f(cmd_state_t *cmd)
Definition cl_main.c:546
cvar_t csqc_progsize
Definition cl_main.c:37
cvar_t cl_stainmaps
Definition cl_main.c:75
cvar_t r_draweffects
Definition cl_main.c:67
static void CL_MeshEntities_Start(void)
Definition cl_main.c:2533
cl_locnode_t * CL_Locs_FindNearest(const vec3_t point)
Definition cl_main.c:2193
cvar_t rcon_secure
Definition console.c:90
matrix4x4_t viewmodelmatrix_withbob
Definition cl_main.c:1056
matrix4x4_t viewmodelmatrix_nobob
Definition cl_main.c:1057
cvar_t r_fullbright_directed
Definition gl_rmain.c:114
static void CL_ModelIndexList_f(cmd_state_t *cmd)
Definition cl_main.c:656
cvar_t csqc_polygons_defaultmaterial_nocullface
Definition cl_main.c:39
cvar_t cl_locs_show
Definition cl_main.c:98
static void CL_RelinkNetworkEntities(void)
Definition cl_main.c:1770
client_state_t cl
Definition cl_main.c:117
void CL_EstablishConnection(const char *address, int firstarg)
Definition cl_main.c:574
cvar_t r_fullbright_directed_ambient
Definition gl_rmain.c:115
static void CL_DecayLightFlashes(void)
Definition cl_main.c:902
cvar_t r_fullbright_directed_pitch
Definition gl_rmain.c:117
void CL_RelinkLightFlashes(void)
Definition cl_main.c:935
static void CL_Locs_Save_f(cmd_state_t *cmd)
Definition cl_main.c:2301
cvar_t cl_autodemo
Definition cl_main.c:62
static void CL_EstablishConnection_Local(void)
Definition cl_main.c:617
cvar_t csqc_progname
Definition cl_main.c:35
cvar_t sensitivity
Definition cl_main.c:53
cvar_t cl_beams_instantaimhack
Definition cl_main.c:80
client_static_t cls
Definition cl_main.c:116
void CL_Locs_Reload_f(cmd_state_t *cmd)
Definition cl_main.c:2377
cvar_t cl_deathfade
Definition cl_main.c:83
static void CL_RelinkEffects(void)
Definition cl_main.c:1789
cvar_t cl_beams_polygons
Definition cl_main.c:78
cvar_t cl_autodemo_nameformat
Definition cl_main.c:63
cvar_t cl_deathnoviewmodel
Definition cl_main.c:95
cvar_t csqc_lowres
Definition cl_main.c:40
void CL_SetInfo(const char *key, const char *value, qbool send, qbool allowstarkey, qbool allowmodel, qbool quiet)
Definition cl_main.c:233
cvar_t cl_shownet
Definition cl_main.c:42
void CL_Disconnect(void)
Definition cl_main.c:478
cvar_t cl_itembobheight
Definition cl_main.c:48
static void CL_MeshEntities_Restart(void)
Definition cl_main.c:2521
static void CL_UpdateEntityShading_Entity(entity_render_t *ent)
Definition cl_main.c:2642
cvar_t cl_topcolor
Definition cl_cmd.c:35
static void CL_MeshEntities_Shutdown(void)
Definition cl_main.c:2544
void CL_SetEntityColormapColors(entity_render_t *ent, int colormap)
Definition cl_main.c:1061
cvar_t cl_explosions_alpha_start
Definition cl_main.c:69
cvar_t cl_maxidlefps
Definition cl_main.c:110
const char * cl_meshentitynames[NUM_MESHENTITIES]
Definition cl_main.c:2515
cvar_t cl_startdemos
Definition cl_main.c:65
cvar_t cl_lerpanim_maxdelta_framegroups
Definition cl_main.c:46
static void CL_SoundIndexList_f(cmd_state_t *cmd)
Definition cl_main.c:684
cvar_t cl_maxfps_alwayssleep
Definition cl_main.c:109
static void CL_RelinkQWNails(void)
Definition cl_main.c:1968
cvar_t cl_beams_lightatend
Definition cl_main.c:81
cvar_t cl_minfps_force
Definition cl_main.c:107
void CL_UpdateEntityShading(void)
Definition cl_main.c:2777
static void CL_UpdateNetworkEntityTrail(entity_t *e)
Definition cl_main.c:1339
cvar_t cl_dlights_decayradius
Definition cl_main.c:87
cvar_t cl_minfps_fade
Definition cl_main.c:101
void CL_MeshEntities_Scene_Clear(void)
Definition cl_main.c:2594
cvar_t cl_explosions_alpha_end
Definition cl_main.c:70
void CL_ExpandEntities(int num)
Definition cl_main.c:300
void CL_MeshEntities_Init(void)
Definition cl_main.c:2555
void CL_Shutdown(void)
Definition cl_main.c:2951
static void CL_Locs_Clear_f(cmd_state_t *cmd)
Definition cl_main.c:2295
void CL_ClearState(void)
Definition cl_main.c:125
static void CL_Locs_Add_f(cmd_state_t *cmd)
Definition cl_main.c:2263
cvar_t cl_beams_quakepositionhack
Definition cl_main.c:79
cvar_t cl_prydoncursor
Definition cl_main.c:92
entity_t cl_meshentities[NUM_MESHENTITIES]
Definition cl_main.c:2513
cvar_t r_hdr_glowintensity
Definition gl_rmain.c:219
cvar_t m_pitch
Definition cl_main.c:55
uint8_t serverlist_querystage
bitfield because in theory we could be doing QW & DP simultaneously
Definition netconn.c:129
cvar_t cl_minfps_qualityhysteresis
Definition cl_main.c:105
static void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qbool interpolate)
Definition cl_main.c:1079
void CL_Init(void)
Definition cl_main.c:2988
static void CL_Fog_HeightTexture_f(cmd_state_t *cmd)
Definition cl_main.c:2143
cvar_t lookstrafe
Definition cl_main.c:52
cvar_t cl_minfps_qualitymultiply
Definition cl_main.c:104
cvar_t cl_areagrid_link_SOLID_NOT
Definition cl_main.c:112
static void CL_Locs_RemoveNearest_f(cmd_state_t *cmd)
Definition cl_main.c:2285
void CL_Parse_Shutdown(void)
Definition cl_parse.c:4365
void CL_Parse_ErrorCleanUp(void)
Definition cl_parse.c:4317
cvar_t cl_nettimesyncboundmode
Definition cl_parse.c:192
void CL_Parse_Init(void)
Definition cl_parse.c:4323
void CL_ParticleTrail(int effectnameindex, float pcount, const vec3_t originmins, const vec3_t originmaxs, const vec3_t velocitymins, const vec3_t velocitymaxs, entity_t *ent, int palettecolor, qbool spawndlight, qbool spawnparticles, float tintmins[4], float tintmaxs[4], float fade)
void CL_Particles_Init(void)
void CL_Particles_Shutdown(void)
void CL_EntityParticles(const entity_t *ent)
effectnameindex_t
@ EFFECT_TR_GLOWTRAIL
@ EFFECT_EF_STARDUST
@ EFFECT_TR_SLIGHTBLOOD
@ EFFECT_TR_WIZSPIKE
@ EFFECT_TR_NEHAHRASMOKE
@ EFFECT_TR_ROCKET
@ EFFECT_TR_VORESPIKE
@ EFFECT_TR_GRENADE
@ EFFECT_TR_BLOOD
@ EFFECT_EF_FLAME
@ EFFECT_TR_NEXUIZPLASMA
@ EFFECT_TR_KNIGHTSPIKE
@ EFFECT_NONE
void CL_Screen_NewMap(void)
Definition cl_screen.c:2346
void SCR_BeginLoadingPlaque(qbool startup)
Definition cl_screen.c:1838
void CL_Screen_Init(void)
Definition cl_screen.c:804
void CL_UpdateScreen(void)
Definition cl_screen.c:2130
void SCR_ClearLoadingScreen(qbool redraw)
Definition cl_screen.c:1918
void CL_Screen_Shutdown(void)
Definition cl_screen.c:797
char cl_connect_status[MAX_QPATH]
User-friendly connection status for the menu and/or loading screen, colours and not supported.
Definition cl_screen.c:1573
void CL_Video_Init(void)
Definition cl_video.c:675
void CL_Video_Shutdown(void)
Definition cl_video.c:713
void CL_Video_Frame(void)
Definition cl_video.c:355
#define LIGHTFLAG_NORMALMODE
Definition client.h:34
cvar_t rcon_password
Definition console.c:89
#define LIGHTFLAG_REALTIMEMODE
Definition client.h:35
@ NUM_MESHENTITIES
Definition client.h:1366
@ MESH_UI
Definition client.h:1365
@ MESH_SCENE
Definition client.h:1364
@ ca_dedicated
Definition client.h:530
@ ca_connected
Definition client.h:532
@ ca_disconnected
Definition client.h:531
#define SIGNONS
Definition client.h:525
#define CL_Mesh_Scene()
Definition client.h:1371
void CL_Beam_AddPolygons(const beam_t *b)
void Cmd_AddCommand(unsigned flags, const char *cmd_name, xcommand_t function, const char *description)
called by the init functions of other parts of the program to register commands and functions to call...
Definition cmd.c:1661
cmd_state_t * cmd_local
command interpreter for local commands injected by SVQC, CSQC, MQC, server or client engine code uses...
Definition cmd.c:25
#define CF_READONLY
cvar cannot be changed from the console or the command buffer, and is considered CF_PERSISTENT
Definition cmd.h:54
#define CF_SERVER
cvar/command that only the server can change/execute
Definition cmd.h:49
static int Cmd_Argc(cmd_state_t *cmd)
Definition cmd.h:249
static const char * Cmd_Argv(cmd_state_t *cmd, int arg)
Cmd_Argv(cmd, ) will return an empty string (not a NULL) if arg > argc, so string operations are alwa...
Definition cmd.h:254
#define CF_CLIENT
cvar/command that only the client can change/execute
Definition cmd.h:48
#define CF_CLIENT_FROM_SERVER
command that the server is allowed to execute on the client
Definition cmd.h:50
#define CF_ARCHIVE
cvar should have its set value saved to config.cfg and persist across sessions
Definition cmd.h:53
void Collision_Cache_NewFrame(void)
Definition collision.c:1548
cvar_t collision_extendmovelength
Definition collision.c:14
gamemode_t gamemode
Definition com_game.c:26
#define IS_NEXUIZ_DERIVED(g)
Definition com_game.h:71
@ GAME_TRANSFUSION
Definition com_game.h:35
@ GAME_TENEBRAE
full of evil hackery
Definition com_game.h:41
void InfoString_SetValue(char *buffer, size_t bufferlength, const char *key, const char *value)
size_t InfoString_GetValue(const char *buffer, const char *key, char *value, size_t valuesize)
Returns the number of bytes written to *value excluding the \0 terminator.
void MSG_WriteString(sizebuf_t *sb, const char *s)
Definition com_msg.c:173
void MSG_WriteByte(sizebuf_t *sb, int c)
Definition com_msg.c:130
void MSG_WriteChar(sizebuf_t *sb, int c)
Definition com_msg.c:122
int dpvsnprintf(char *buffer, size_t buffersize, const char *format, va_list args)
Returns the number of printed characters, excluding the final '\0' or returns -1 if the buffer isn't ...
Definition common.c:1010
char * va(char *buf, size_t buflen, const char *format,...)
Definition common.c:972
int dpsnprintf(char *buffer, size_t buffersize, const char *format,...)
Returns the number of printed characters, excluding the final '\0' or returns -1 if the buffer isn't ...
Definition common.c:997
@ PROTOCOL_DARKPLACES8
added parting messages. WIP
Definition common.h:134
@ PROTOCOL_NEHAHRAMOVIE
Nehahra movie protocol, a big nasty hack dating back to early days of the Quake Standards Group (but ...
Definition common.h:143
@ PROTOCOL_QUAKEWORLD
quakeworld protocol
Definition common.h:145
#define dp_strlcpy(dst, src, dsize)
Definition common.h:303
void Con_Print(const char *msg)
Prints to all appropriate console targets, and adds timestamps.
Definition console.c:1504
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
Definition console.c:1544
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
void Con_DPrint(const char *msg)
A Con_Print that only shows up if the "developer" cvar is set.
Definition console.c:1531
#define CON_WARN
Definition console.h:101
#define CON_ERROR
Definition console.h:102
void CL_VM_PreventInformationLeaks(void)
Definition csprogs.c:36
void CL_VM_ShutDown(void)
Definition csprogs.c:1154
#define ENTMASK_ENGINEVIEWMODELS
Definition csprogs.h:28
#define ENTMASK_ENGINE
Definition csprogs.h:27
float flags
float drawmask
vector mins
float skin
float time
vector maxs
vector angles
float colormap
float entnum
vector origin
string model
float frame
void Cvar_SetValueQuick(cvar_t *var, float value)
Definition cvar.c:473
void Cvar_SetQuick(cvar_t *var, const char *value)
Definition cvar.c:436
void Cvar_RegisterVariable(cvar_t *variable)
registers a cvar that already has the name, string, and optionally the archive elements set.
Definition cvar.c:599
void Cvar_Callback(cvar_t *var)
Definition cvar.c:372
char engineversion[128]
version string for the corner of the console, crash messages, status command, etc
Definition host.c:304
float scale
float style
vector color
unsigned char * FS_LoadFile(const char *path, mempool_t *pool, qbool quiet, fs_offset_t *filesizepointer)
Definition fs.c:3540
qfile_t * FS_OpenRealFile(const char *filepath, const char *mode, qbool quiet)
Definition fs.c:2901
void FS_UnloadPacks_dlcache(void)
Definition fs.c:1485
static int(ZEXPORT *qz_inflate)(z_stream *strm
int FS_Close(qfile_t *file)
Definition fs.c:2970
int FS_Printf(qfile_t *file, const char *format,...)
Definition fs.c:3273
int64_t fs_offset_t
Definition fs.h:37
void Render_Init(void)
Definition gl_rmain.c:3420
void R_DecalSystem_Reset(decalsystem_t *decalsystem)
Definition gl_rmain.c:9134
void FOG_clear(void)
Definition gl_rmain.c:349
cvar_t r_fullbright
Definition gl_rmain.c:112
cvar_t r_dynamic
Definition gl_rmain.c:121
cvar_t r_drawworld
Definition gl_rmain.c:98
r_refdef_t r_refdef
Definition gl_rmain.c:57
cvar_t r_lerplightstyles
Definition gl_rmain.c:205
GLfloat GLfloat GLfloat v2
Definition glquake.h:747
GLsizei const GLfloat * value
Definition glquake.h:740
GLuint buffer
Definition glquake.h:630
const GLdouble * v
Definition glquake.h:762
GLenum GLvoid ** pointer
Definition glquake.h:714
GLclampf GLclampf blue
Definition glquake.h:642
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glquake.h:657
const GLchar * name
Definition glquake.h:601
GLclampf green
Definition glquake.h:642
host_static_t host
Definition host.c:41
void Host_Error(const char *error,...)
Definition host.c:85
cvar_t host_isclient
Definition host.c:61
qfile_t * outfile
Definition image_png.c:254
float in_mouse_y
Definition input.h:33
float in_mouse_x
Definition vid_shared.c:70
void Key_Init(void)
Definition keys.c:1710
keydest_t key_dest
Definition keys.c:37
void Key_Shutdown(void)
Definition keys.c:1735
@ key_menu
Definition keys.h:372
@ key_game
Definition keys.h:372
@ key_menu_grabbed
Definition keys.h:372
int LHNETADDRESS_FromString(lhnetaddress_t *vaddress, const char *string, int defaultport)
Definition lhnet.c:204
void Curl_Clear_forthismap(void)
Definition libcurl.c:287
vec3_t vec3_origin
Definition mathlib.c:26
void AnglesFromVectors(vec3_t angles, const vec3_t forward, const vec3_t up, qbool flippitch)
LadyHavoc: calculates pitch/yaw/roll angles from forward and up vectors.
Definition mathlib.c:650
float VectorNormalizeLength(vec3_t v)
returns vector length
Definition mathlib.c:763
void AngleVectors(const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up)
Definition mathlib.c:444
#define VectorLerp(v1, lerp, v2, out)
Definition mathlib.h:120
#define ANGLEMOD(a)
Definition mathlib.h:67
#define max(A, B)
Definition mathlib.h:38
#define VectorNegate(a, b)
Definition mathlib.h:95
#define min(A, B)
Definition mathlib.h:37
#define VectorNormalize(v)
Definition mathlib.h:104
#define VectorClear(a)
Definition mathlib.h:97
#define bound(min, num, max)
Definition mathlib.h:34
#define VectorLength(a)
Definition mathlib.h:109
#define lhrandom(MIN, MAX)
LadyHavoc: this function never returns exactly MIN or exactly MAX, because of a QuakeC bug in id1 whe...
Definition mathlib.h:48
#define VectorLength2(a)
Definition mathlib.h:110
#define VectorSet(vec, x, y, z)
Definition mathlib.h:96
#define VectorDistance2(a, b)
Definition mathlib.h:107
#define VectorSubtract(a, b, out)
Definition mathlib.h:99
#define VectorCompare(a, b)
Definition mathlib.h:113
#define VectorCopy(in, out)
Definition mathlib.h:101
#define VectorScale(in, scale, out)
Definition mathlib.h:111
#define VectorMAM(scale1, b1, scale2, b2, out)
Definition mathlib.h:116
#define M_PI
Definition mathlib.h:28
#define VectorMA(a, scale, b, out)
Definition mathlib.h:114
void Matrix4x4_Concat(matrix4x4_t *out, const matrix4x4_t *in1, const matrix4x4_t *in2)
Definition matrixlib.c:83
void Matrix4x4_CreateIdentity(matrix4x4_t *out)
Definition matrixlib.c:564
void Matrix4x4_Transform(const matrix4x4_t *in, const float v[3], float out[3])
Definition matrixlib.c:1657
void Matrix4x4_Transform3x3(const matrix4x4_t *in, const float v[3], float out[3])
Definition matrixlib.c:1685
void Matrix4x4_CreateFromQuakeEntity(matrix4x4_t *out, double x, double y, double z, double pitch, double yaw, double roll, double scale)
Definition matrixlib.c:715
void Matrix4x4_SetOrigin(matrix4x4_t *out, double x, double y, double z)
Definition matrixlib.c:1811
void Matrix4x4_Invert_Simple(matrix4x4_t *out, const matrix4x4_t *in1)
Definition matrixlib.c:422
double Matrix4x4_ScaleFromMatrix(const matrix4x4_t *in)
Definition matrixlib.c:1805
void Matrix4x4_Normalize(matrix4x4_t *out, matrix4x4_t *in1)
Definition matrixlib.c:499
const matrix4x4_t identitymatrix
Definition matrixlib.c:9
void Matrix4x4_Scale(matrix4x4_t *out, double rotatescale, double originscale)
Definition matrixlib.c:1837
void Matrix4x4_OriginFromMatrix(const matrix4x4_t *in, float *out)
Definition matrixlib.c:1792
void(* MR_ToggleMenu)(int mode)
Definition menu.c:5480
void(* MR_Shutdown)(void)
Definition menu.c:5481
void MR_Init_Commands(void)
Definition menu.c:5533
float strlen(string s)
float cos(float f)
float sqrt(float f)
void cmd(string command,...)
float floor(float f)
int Mod_Alias_GetTagMatrix(const model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, int tagindex, matrix4x4_t *outmatrix)
cvar_t mod_q3bsp_lightgrid_world_surfaces
Definition model_brush.c:49
cvar_t mod_q3bsp_lightgrid_texture
Definition model_brush.c:48
cvar_t mod_q3bsp_lightgrid_bsp_surfaces
Definition model_brush.c:50
#define MATERIALFLAG_FULLBRIGHT
Definition model_brush.h:87
void Mod_Mesh_Create(model_t *mod, const char *name)
void Mod_Mesh_Reset(model_t *mod)
void Mod_Mesh_Destroy(model_t *mod)
void Mod_Mesh_Finalize(model_t *mod)
@ mod_alias
@ mod_sprite
lhnetsocket_t * NetConn_ChooseClientSocketForAddress(lhnetaddress_t *address)
Definition netconn.c:1198
void NetConn_UpdateSockets(void)
Definition netconn.c:1306
void NetConn_ClientFrame(void)
Definition netconn.c:2674
void NetConn_Close(netconn_t *conn)
Definition netconn.c:1240
int NetConn_SendUnreliableMessage(netconn_t *conn, sizebuf_t *data, protocolversion_t protocol, int rate, int burstsize, qbool quakesignon_suppressreliables)
Definition netconn.c:844
cvar_t cl_netport
Definition netconn.c:155
void Palette_Init(void)
Definition palette.c:366
unsigned char palette_rgb_pantscolormap[16][3]
Definition palette.c:8
unsigned char palette_rgb[256][3]
Definition palette.c:7
unsigned char palette_rgb_shirtcolormap[16][3]
Definition palette.c:9
#define CLVM_prog
Definition progsvm.h:767
#define PRVM_CSQC_SIMPLE
Definition progsvm.h:239
void VM_FrameBlendFromFrameGroupBlend(struct frameblend_s *frameblend, const struct framegroupblend_s *framegroupblend, const struct model_s *model, double curtime)
entity_state_t defaultstate
Definition protocol.c:4
#define EF_TRACER2
Definition protocol.h:98
#define RENDER_EXTERIORMODEL
Definition protocol.h:359
#define EF_NOGUNBOB
Definition protocol.h:76
#define EF_GRENADE
Definition protocol.h:93
#define EF_FULLBRIGHT
Definition protocol.h:77
#define INTEF_FLAG2QW
Definition protocol.h:103
#define EF_NOSHADOW
Definition protocol.h:80
#define EF_TRACER
Definition protocol.h:96
#define EF_BRIGHTFIELD
Definition protocol.h:68
#define qw_clc_stringcmd
Definition protocol.h:957
#define EF_NODEPTHTEST
Definition protocol.h:81
#define EF_STARDUST
Definition protocol.h:79
#define PFLAGS_NOSHADOW
Definition protocol.h:106
#define EF_ADDITIVE
Definition protocol.h:73
#define EF_DYNAMICMODELLIGHT
Definition protocol.h:85
#define RENDER_SHADOW
Definition protocol.h:365
#define RENDER_VIEWMODEL
Definition protocol.h:358
#define EF_BRIGHTLIGHT
Definition protocol.h:70
#define EF_NOSELFSHADOW
Definition protocol.h:84
#define RENDER_COMPLEXANIMATION
Definition protocol.h:363
#define EF_ZOMGIB
Definition protocol.h:97
#define RENDER_DYNAMICMODELLIGHT
Definition protocol.h:373
#define PFLAGS_FULLDYNAMIC
Definition protocol.h:108
#define EF_NODRAW
Definition protocol.h:72
#define RENDER_GLOWTRAIL
Definition protocol.h:357
#define RENDER_COLORMAPPED
Definition protocol.h:361
#define EF_DOUBLESIDED
Definition protocol.h:83
#define RENDER_DOUBLESIDED
Definition protocol.h:371
#define RENDER_ADDITIVE
Definition protocol.h:370
#define EF_SELECTABLE
Definition protocol.h:82
#define EF_GIB
Definition protocol.h:94
#define RENDER_NOSELFSHADOW
Definition protocol.h:367
#define RENDER_LIGHT
Definition protocol.h:366
#define RENDER_CUSTOMIZEDMODELLIGHT
Definition protocol.h:372
#define clc_stringcmd
Definition protocol.h:291
#define EF_ROTATE
Definition protocol.h:95
#define clc_disconnect
Definition protocol.h:289
#define EF_TRACER3
Definition protocol.h:99
#define RENDER_NODEPTHTEST
Definition protocol.h:369
#define EF_ROCKET
Definition protocol.h:92
#define EF_FLAME
Definition protocol.h:78
#define EF_RED
Definition protocol.h:75
#define EF_BLUE
Definition protocol.h:74
#define INTEF_FLAG1QW
Definition protocol.h:102
#define PFLAGS_CORONA
Definition protocol.h:107
#define EF_DIMLIGHT
Definition protocol.h:71
int i
#define MAX_PARTICLES_INITIAL
initial allocation for cl.particles
Definition qdefs.h:153
#define MAX_EFFECTS
limit on size of cl.effects
Definition qdefs.h:157
#define MAX_INPUTLINE
maximum size of console commandline, QuakeC strings, and many other text processing buffers
Definition qdefs.h:94
#define MAX_EDICTS
max number of objects in game world at once (32768 protocol limit)
Definition qdefs.h:105
#define MAX_STATICENTITIES
limit on size of cl.static_entities
Definition qdefs.h:156
#define MAX_LIGHTSTYLES
max flickering light styles in level (note: affects savegame format)
Definition qdefs.h:108
#define MAX_BEAMS
limit on size of cl.beams
Definition qdefs.h:158
#define ISWHITESPACE(ch)
Definition qdefs.h:184
#define MAX_DLIGHTS
max number of dynamic lights (rocket flashes, etc) in scene at once
Definition qdefs.h:132
#define MAX_ENTITIES_INITIAL
initial size of cl.entities
Definition qdefs.h:155
#define MAX_SOUNDS
max number of sounds loaded at once
Definition qdefs.h:107
#define MAX_QPATH
max length of a quake game pathname
Definition qdefs.h:169
#define MAX_TEMPENTITIES
max number of temporary models visible per frame (certain sprite effects, certain types of CSQC entit...
Definition qdefs.h:159
#define MAX_MODELS
max number of models loaded at once (including during level transitions)
Definition qdefs.h:106
#define STAT_WEAPONFRAME
Definition qstats.h:13
#define STAT_HEALTH
Definition qstats.h:8
#define STAT_ITEMS
FTE, DP.
Definition qstats.h:23
#define STAT_WEAPON
Definition qstats.h:10
#define NULL
Definition qtypes.h:12
float vec_t
Definition qtypes.h:68
vec_t vec3_t[3]
Definition qtypes.h:71
bool qbool
Definition qtypes.h:9
vec_t vec4_t[4]
Definition qtypes.h:72
#define PITCH
Definition qtypes.h:16
qbool noclip_anglehack
Definition sv_ccmds.c:190
cvar_t chase_active
Definition view.c:132
#define IT_INVISIBILITY
Definition quakedef.h:57
void R_Modules_Shutdown(void)
Definition r_modules.c:67
void R_RegisterModule(const char *name, void(*start)(void), void(*shutdown)(void), void(*newmap)(void), void(*devicelost)(void), void(*devicerestored)(void))
Definition r_modules.c:25
void R_Modules_Init(void)
Definition r_modules.c:20
void R_RTLight_Update(rtlight_t *rtlight, int isstatic, matrix4x4_t *matrix, vec3_t color, int style, const char *cubemapname, int shadow, vec_t corona, vec_t coronasizescale, vec_t ambientscale, vec_t diffusescale, vec_t specularscale, int flags)
Definition r_shadow.c:2980
void R_CompleteLightPoint(float *ambient, float *diffuse, float *lightdir, const vec3_t p, const int flags, float lightmapintensity, float ambientintensity)
Definition r_shadow.c:6014
#define LP_DYNLIGHT
Definition r_shadow.h:194
#define LP_LIGHTMAP
Definition r_shadow.h:192
#define LP_RTWORLD
Definition r_shadow.h:193
void R_ResetSkyBox(void)
Definition r_sky.c:440
void R_TimeReport(const char *desc)
Definition r_stats.c:193
dp_FragColor r
vec2 dir
float f
dp_FragColor b
ret a
void S_Terminate(void)
Definition snd_main.c:842
void S_StopAllSounds(void)
Definition snd_main.c:1710
void S_Update(const matrix4x4_t *listenermatrix)
Definition snd_main.c:2061
void S_Init(void)
Definition snd_main.c:706
#define SPR_OVERHEAD
Definition spritegn.h:103
struct model_s * model
Definition client.h:91
float framerate
Definition client.h:75
double starttime
Definition client.h:74
double frame2time
Definition client.h:82
double frame1time
Definition client.h:81
vec3_t origin
Definition client.h:73
int active
Definition client.h:72
int frame
Definition client.h:80
int startframe
Definition client.h:77
int endframe
Definition client.h:78
model_t * model
Definition client.h:76
vec3_t mins
Definition client.h:725
char * name
Definition client.h:724
struct cl_locnode_s * next
Definition client.h:723
vec3_t maxs
Definition client.h:725
float movevars_timescale
Definition client.h:1058
vec3_t movement_origin
Definition client.h:809
double oldtime
Definition client.h:868
int max_showlmps
Definition client.h:989
lightstyle_t * lightstyle
Definition client.h:998
int max_static_entities
Definition client.h:982
int parsingtextexpectingpingforscores
Definition client.h:955
unsigned short csqc_server2csqcentitynumber[MAX_EDICTS]
Definition client.h:1110
vec3_t velocity
Definition client.h:792
entity_t viewent
Definition client.h:937
int max_lightstyle
Definition client.h:986
qbool csqc_usecsqclistener
Definition client.h:1116
vec3_t playerstandmins
Definition client.h:972
int num_brushmodel_entities
Definition client.h:1005
float sensitivityscale
Definition client.h:833
cl_locnode_t * locnodes
Definition client.h:1125
unsigned char * entities_active
Definition client.h:993
beam_t * beams
Definition client.h:996
int max_csqcrenderentities
Definition client.h:981
int max_brushmodel_entities
Definition client.h:987
int qw_modelindex_flag
Definition client.h:1092
particle_t * particles
Definition client.h:1000
scoreboard_t * scores
Definition client.h:945
qbool paused
Definition client.h:842
struct sfx_s * sound_precache[MAX_SOUNDS]
Definition client.h:889
cshift_t cshifts[NUM_CSHIFTS]
Definition client.h:775
vec3_t playerstandmaxs
Definition client.h:973
vec3_t viewangles
Definition client.h:786
int * brushmodel_entities
Definition client.h:999
float * statsf
Definition client.h:759
char worldbasename[MAX_QPATH]
Definition client.h:898
entity_t * entities
Definition client.h:991
vec3_t playercrouchmaxs
Definition client.h:975
struct model_s * worldmodel
Definition client.h:934
int intermission
Definition client.h:856
world_t world
Definition client.h:1122
cl_effect_t * effects
Definition client.h:995
qbool fixangle[2]
Definition client.h:800
int qw_modelindex_spike
Definition client.h:1090
double realframetime
Definition client.h:871
int islocalgame
Definition client.h:746
double time
Definition client.h:868
vec_t viewzoom
Definition client.h:794
vec3_t punchvector
Definition client.h:790
vec3_t punchangle
Definition client.h:788
vec3_t playercrouchmins
Definition client.h:974
int max_effects
Definition client.h:983
vec3_t mpunchvector[2]
Definition client.h:790
int max_dlights
Definition client.h:985
showlmp_t * showlmps
Definition client.h:1001
int max_entities
Definition client.h:980
double mtime[2]
Definition client.h:861
vec3_t mvelocity[2]
Definition client.h:792
entity_render_t * csqcrenderentities
Definition client.h:992
vec_t qw_nails[255][6]
Definition client.h:1100
qbool movement_predicted
Definition client.h:805
entity_t * static_entities
Definition client.h:994
int max_particles
Definition client.h:988
int playerentity
Definition client.h:910
int stats[MAX_CL_STATS]
Definition client.h:758
usercmd_t cmd
Definition client.h:752
unsigned int qw_deltasequence[QW_UPDATE_BACKUP]
Definition client.h:1106
vec3_t mpunchangle[2]
Definition client.h:788
vec3_t mviewangles[2]
Definition client.h:786
csqc_vidvars_t csqc_vidvars
Definition client.h:834
dlight_t * dlights
Definition client.h:997
int num_static_entities
Definition client.h:1004
matrix4x4_t csqc_listenermatrix
Definition client.h:1117
char worldnamenoextension[MAX_QPATH]
Definition client.h:900
vec_t mviewzoom[2]
Definition client.h:794
qbool demoplayback
Definition client.h:587
char connect_userinfo[MAX_USERINFO_STRING]
Definition client.h:672
mempool_t * permanentmempool
Definition client.h:572
qbool connect_trying
Definition client.h:609
qbool demopaused
Definition client.h:604
qbool timedemo
Definition client.h:589
int connect_remainingtries
Definition client.h:610
unsigned char * qw_downloadmemory
Definition client.h:649
cactive_t state
Definition client.h:568
qbool demorecording
Definition client.h:584
netconn_t * netcon
Definition client.h:630
double connect_nextsendtime
Definition client.h:611
lhnetaddress_t connect_address
Definition client.h:613
lhnetsocket_t * connect_mysocket
Definition client.h:612
mempool_t * levelmempool
Definition client.h:571
protocolversion_t protocol
Definition client.h:617
char userinfo[MAX_USERINFO_STRING]
Definition client.h:669
command interpreter state - the tokenizing and execution of commands, as well as pointers to which cv...
Definition cmd.h:127
float percent
Definition client.h:507
qbool drawenginesbar
Definition client.h:707
qbool drawworld
Definition client.h:706
qbool drawcrosshair
Definition client.h:708
Definition cvar.h:66
float value
Definition cvar.h:74
int integer
Definition cvar.h:73
vec_t decay
Definition client.h:264
struct entity_render_s * ent
Definition client.h:239
int flags
Definition client.h:295
vec_t coronasizescale
Definition client.h:283
rtlight_t rtlight
Definition client.h:301
matrix4x4_t matrix
Definition client.h:249
vec3_t origin
Definition client.h:242
int style
Definition client.h:274
vec_t corona
Definition client.h:280
int shadow
Definition client.h:277
vec3_t color
Definition client.h:252
vec3_t initialcolor
Definition client.h:271
vec_t die
Definition client.h:236
vec_t ambientscale
Definition client.h:286
char cubemapname[64]
Definition client.h:255
vec_t diffusescale
Definition client.h:289
vec_t initialradius
Definition client.h:270
vec_t specularscale
Definition client.h:292
vec_t intensity
Definition client.h:267
vec_t radius
Definition client.h:261
vec3_t trail_origin
Definition client.h:451
frameblend_t frameblend[MAX_FRAMEBLENDS]
Definition client.h:373
vec3_t custommodellight_lightdir
Definition client.h:404
float render_fullbright[3]
Definition client.h:412
float render_rtlight_diffuse[3]
Definition client.h:426
matrix4x4_t inversematrix
Definition client.h:334
float custommodellight_origin[3]
Definition client.h:406
float render_glowmod[3]
Definition client.h:414
matrix4x4_t matrix
Definition client.h:332
float render_modellight_specular[3]
Definition client.h:420
float colormod[3]
Definition client.h:359
vec3_t mins
Definition client.h:371
qbool render_rtlight_disabled
Definition client.h:431
float render_modellight_lightdir_world[3]
Definition client.h:418
model_t * model
Definition client.h:343
float render_lightmap_ambient[3]
Definition client.h:422
vec3_t custommodellight_diffuse
Definition client.h:403
decalsystem_t decalsystem
Definition client.h:438
float render_modellight_lightdir_local[3]
Definition client.h:419
vec3_t colormap_shirtcolor
Definition client.h:348
qbool render_modellight_forced
Definition client.h:429
framegroupblend_t framegroupblend[MAX_FRAMEGROUPBLENDS]
Definition client.h:363
vec3_t custommodellight_ambient
Definition client.h:402
double shadertime
Definition client.h:366
float render_lightmap_diffuse[3]
Definition client.h:423
float render_modellight_ambient[3]
Definition client.h:416
float render_rtlight_specular[3]
Definition client.h:427
float render_lightmap_specular[3]
Definition client.h:424
int internaleffects
Definition client.h:352
qbool render_lightgrid
Definition client.h:433
float render_modellight_diffuse[3]
Definition client.h:417
float glowmod[3]
Definition client.h:360
vec3_t colormap_pantscolor
Definition client.h:347
vec3_t maxs
Definition client.h:371
skeleton_t * skeleton
Definition client.h:375
unsigned char glowmod[3]
Definition protocol.h:472
framegroupblend_t framegroupblend[4]
Definition protocol.h:474
unsigned char flags
Definition protocol.h:468
unsigned char skin
Definition protocol.h:463
unsigned char glowcolor
Definition protocol.h:467
unsigned char glowsize
Definition protocol.h:466
float origin[3]
Definition protocol.h:444
unsigned short tagentity
Definition protocol.h:451
unsigned char lightstyle
Definition protocol.h:460
unsigned char colormap
Definition protocol.h:462
unsigned short modelindex
Definition protocol.h:449
unsigned char colormod[3]
Definition protocol.h:471
unsigned short traileffectnum
Definition protocol.h:457
skeleton_t skeletonobject
Definition protocol.h:475
unsigned char alpha
Definition protocol.h:464
unsigned short light[4]
Definition protocol.h:458
unsigned char tagindex
Definition protocol.h:470
float angles[3]
Definition protocol.h:445
unsigned char active
Definition protocol.h:459
unsigned short frame
Definition protocol.h:450
unsigned short number
Definition protocol.h:448
unsigned char scale
Definition protocol.h:465
unsigned char lightpflags
Definition protocol.h:461
entity_state_t state_baseline
Definition client.h:467
entity_persistent_t persistent
Definition client.h:474
entity_state_t state_current
Definition client.h:471
entity_state_t state_previous
Definition client.h:469
entity_render_t render
Definition client.h:477
float lerp
Definition client.h:313
qbool restless
don't sleep
Definition host.h:49
void(* SV_Shutdown)(void)
Definition host.h:60
void(* ConnectLocal)(void)
Definition host.h:55
void(* ToggleMenu)(void)
Definition host.h:57
struct host_static_t::@12 hook
qbool paused
global paused state, pauses both client and server
Definition host.h:50
void(* Disconnect)(qbool, const char *,...)
Definition host.h:56
char map[MAX_STYLESTRING]
Definition client.h:484
vec_t m[4][4]
Definition matrixlib.h:11
void(* LightPoint)(struct model_s *model, const vec3_t p, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal)
rtexture_t * lightgridtexture
model_brush_t brush
model_sprite_t sprite
modtype_t type
unsigned effects
qbool lit
model_brushq3_t brushq3
void(* TraceBox)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
vec3_t normalmaxs
animscene_t * animscenes
int numframes
char name[MAX_QPATH]
vec3_t normalmins
int soundfromcenter
texture_t * data_textures
sizebuf_t message
writing buffer to send to peer as the next reliable message can be added to at any time,...
Definition netconn.h:161
int maxtempentities
Definition render.h:368
entity_render_t * tempentities
field of temporary entities that is reset each (client) frame
Definition render.h:366
float ambientintensity
Definition render.h:384
float lightmapintensity
Definition render.h:387
float rtlightstylevalue[MAX_LIGHTSTYLES]
float fraction of base light value
Definition render.h:377
entity_render_t ** entities
renderable entities (excluding world)
Definition render.h:361
int numtempentities
Definition render.h:367
model_t * worldmodel
same as worldentity->model
Definition render.h:358
unsigned short lightstylevalue[MAX_LIGHTSTYLES]
8.8 fraction of base light value
Definition render.h:380
entity_render_t * worldentity
the world
Definition render.h:355
rtlight_t templights[MAX_DLIGHTS]
Definition render.h:373
double time
(client gameworld) time for rendering time based effects
Definition render.h:352
rtlight_t * lights[MAX_DLIGHTS]
Definition render.h:372
qbool expandtempentities
Definition render.h:369
char fog_height_texturename[64]
Definition render.h:444
float fog_start
Definition render.h:436
r_refdef_view_t view
Definition render.h:406
float fog_density
Definition render.h:431
float fog_height
Definition render.h:438
float fog_green
Definition render.h:433
float fog_alpha
Definition render.h:435
float fog_fadedepth
Definition render.h:439
r_refdef_scene_t scene
Definition render.h:418
float fog_end
Definition render.h:437
float fog_blue
Definition render.h:434
float fog_red
Definition render.h:432
float quality
render quality (0 to 1) - affects r_drawparticles_drawdistance and others
Definition render.h:321
vec3_t origin
Definition render.h:267
matrix4x4_t matrix
Definition render.h:266
char name[MAX_QPATH]
Definition snd_main.h:68
const struct model_s * model
Definition protocol.h:425
struct matrix4x4_s * relativetransforms
Definition protocol.h:426
int basematerialflags
double endpos[3]
Definition collision.h:42
int cursor_entitynumber
Definition protocol.h:390
static vec3_t forward
Definition sv_user.c:305
size_t Sys_TimeString(char buf[], size_t bufsize, const char *timeformat)
Definition sys_shared.c:45
void Sys_Error(const char *error,...) DP_FUNC_PRINTF(1) DP_FUNC_NORETURN
Causes the entire program to exit ASAP.
Definition sys_shared.c:724
void Sys_AllowProfiling(qbool enable)
Definition sys_shared.c:65
double Sys_DirtyTime(void)
Definition sys_shared.c:417
double Sys_Sleep(double time)
called to yield for a little bit so as not to hog cpu when paused or debugging
Definition sys_shared.c:500
int Sys_CheckParm(const char *parm)
Definition sys_shared.c:327
void VID_Shared_Init(void)
void VID_Start(void)
cvar_t vid_vsync
Definition vid_shared.c:149
void VID_Init(void)
Called at startup.
Definition vid_null.c:36
void VID_Shutdown(void)
Called at shutdown.
Definition vid_null.c:28
qbool vid_activewindow
Definition vid_shared.c:77
void V_DriftPitch(void)
Definition view.c:189
void V_FadeViewFlashs(void)
Definition view.c:1028
void V_Init(void)
Definition view.c:1196
void V_CalcRefdef(void)
Definition view.c:944
void V_CalcViewBlend(void)
Definition view.c:1043
void World_PrintAreaStats(world_t *world, const char *worldname)
Definition world.c:104
#define MOVE_NOMONSTERS
Definition world.h:29
#define Mem_Free(mem)
Definition zone.h:96
#define Mem_FreePool(pool)
Definition zone.h:105
#define Mem_Alloc(pool, size)
Definition zone.h:92
#define Mem_AllocPool(name, flags, parent)
Definition zone.h:104
#define Mem_Realloc(pool, data, size)
Definition zone.h:94
#define Mem_EmptyPool(pool)
Definition zone.h:106