1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19 
20 //
21 // cg_media.c
22 //
23 
24 #include "cg_local.h"
25 
26 vec3_t	cg_randVels[NUMVERTEXNORMALS];
27 
28 static float cg_curLoadRange;
29 
30 /*
31 =============================================================================
32 
33 	MEDIA INITIALIZATION
34 
35 =============================================================================
36 */
37 
38 /*
39 ================
40 CG_InitBaseMedia
41 ================
42 */
CG_InitBaseMedia(void)43 void CG_InitBaseMedia (void)
44 {
45 	int		i;
46 
47 	// CGame media
48 	cgMedia.noTexture				= cgi.R_RegisterPic ("***r_noTexture***");
49 	cgMedia.whiteTexture			= cgi.R_RegisterPic ("***r_whiteTexture***");
50 	cgMedia.blackTexture			= cgi.R_RegisterPic ("***r_blackTexture***");
51 
52 	cgMedia.tileBackShader			= cgi.R_RegisterPic ("pics/backtile.tga");
53 
54 	cgMedia.alienInfraredVision		= cgi.R_RegisterPic ("alienInfraredVision");
55 	cgMedia.infraredGoggles			= cgi.R_RegisterPic ("infraredGoggles");
56 
57 	cgMedia.consoleShader			= cgi.R_RegisterPic ("pics/conback.tga");
58 
59 	cgMedia.loadSplash				= cgi.R_RegisterPic ("egl/ui/loadscreen/loadsplash.tga");
60 	cgMedia.loadBarPos				= cgi.R_RegisterPic ("egl/ui/loadscreen/barpos.tga");
61 	cgMedia.loadBarNeg				= cgi.R_RegisterPic ("egl/ui/loadscreen/barneg.tga");
62 	cgMedia.loadNoMapShot			= cgi.R_RegisterPic ("egl/ui/loadscreen/unknownmap.tga");
63 
64 	cgMedia.defaultFont				= cgi.R_RegisterFont ("default");
65 
66 	// Menu image media
67 	uiMedia.bgBig					= cgi.R_RegisterPic ("egl/ui/bg_big.tga");
68 
69 	uiMedia.cursorShader			= cgi.R_RegisterPic ("egl/ui/cursor.tga");
70 	uiMedia.cursorHoverShader		= cgi.R_RegisterPic ("egl/ui/cursorhover.tga");
71 
72 	cgi.R_GetImageSize (uiMedia.cursorShader, &uiState.cursorW, &uiState.cursorH);
73 
74 	// Banners
75 	uiMedia.banners.addressBook		= cgi.R_RegisterPic ("pics/m_banner_addressbook.tga");
76 	uiMedia.banners.multiplayer		= cgi.R_RegisterPic ("pics/m_banner_multiplayer.tga");
77 	uiMedia.banners.startServer		= cgi.R_RegisterPic ("pics/m_banner_start_server.tga");
78 	uiMedia.banners.joinServer		= cgi.R_RegisterPic ("pics/m_banner_join_server.tga");
79 	uiMedia.banners.options			= cgi.R_RegisterPic ("pics/m_banner_options.tga");
80 	uiMedia.banners.game			= cgi.R_RegisterPic ("pics/m_banner_game.tga");
81 	uiMedia.banners.loadGame		= cgi.R_RegisterPic ("pics/m_banner_load_game.tga");
82 	uiMedia.banners.saveGame		= cgi.R_RegisterPic ("pics/m_banner_save_game.tga");
83 	uiMedia.banners.video			= cgi.R_RegisterPic ("pics/m_banner_video.tga");
84 	uiMedia.banners.quit			= cgi.R_RegisterPic ("pics/m_main_quit.tga");
85 
86 	// Main menu cursors
87 	for (i=0 ; i<MAINMENU_CURSOR_NUMFRAMES ; i++)
88 		uiMedia.menus.mainCursors[i]	= cgi.R_RegisterPic (Q_VarArgs ("pics/m_cursor%d.tga", i));
89 
90 	// Main menu
91 	uiMedia.menus.mainPlaque			= cgi.R_RegisterPic ("pics/m_main_plaque.tga");
92 	uiMedia.menus.mainLogo				= cgi.R_RegisterPic ("pics/m_main_logo.tga");
93 
94 	uiMedia.menus.mainGame				= cgi.R_RegisterPic ("pics/m_main_game.tga");
95 	uiMedia.menus.mainMultiplayer		= cgi.R_RegisterPic ("pics/m_main_multiplayer.tga");
96 	uiMedia.menus.mainOptions			= cgi.R_RegisterPic ("pics/m_main_options.tga");
97 	uiMedia.menus.mainVideo				= cgi.R_RegisterPic ("pics/m_main_video.tga");
98 	uiMedia.menus.mainQuit				= cgi.R_RegisterPic ("pics/m_main_quit.tga");
99 
100 	uiMedia.menus.mainGameSel			= cgi.R_RegisterPic ("pics/m_main_game_sel.tga");
101 	uiMedia.menus.mainMultiplayerSel	= cgi.R_RegisterPic ("pics/m_main_multiplayer_sel.tga");
102 	uiMedia.menus.mainOptionsSel		= cgi.R_RegisterPic ("pics/m_main_options_sel.tga");
103 	uiMedia.menus.mainVideoSel			= cgi.R_RegisterPic ("pics/m_main_video_sel.tga");
104 	uiMedia.menus.mainQuitSel			= cgi.R_RegisterPic ("pics/m_main_quit_sel.tga");
105 }
106 
107 
108 /*
109 ================
110 CG_MapMediaInit
111 ================
112 */
CG_MapMediaInit(void)113 static void CG_MapMediaInit (void)
114 {
115 	float		rotate, pctInc;
116 	vec3_t		axis;
117 	int			i, j;
118 
119 	if (!cg.configStrings[CS_MODELS+1][0])
120 		return;
121 
122 	// Register models, pics, and skins
123 	CG_LoadingString ("Loading map and textures...");
124 	cgi.R_RegisterMap (cg.configStrings[CS_MODELS+1]);
125 
126 	CG_IncLoadPercent (cg_curLoadRange * 0.125f);
127 
128 	// Register map effects
129 	CG_LoadingString ("Loading map fx...");
130 	CG_MapFXLoad (cg.configStrings[CS_MODELS+1]);
131 
132 	// Register locations
133 	CG_LoadingString ("Locations...");
134 	CG_LoadLocations (cg.configStrings[CS_MODELS+1]);
135 
136 	CG_IncLoadPercent (cg_curLoadRange * 0.025f);
137 
138 	// Load models
139 	CG_LoadingString ("Loading models...");
140 	cg_numWeaponModels = 1;
141 	Q_strncpyz (cg_weaponModels[0], "weapon.md2", sizeof (cg_weaponModels[0]));
142 	for (i=1 ; i<MAX_CS_MODELS && cg.configStrings[CS_MODELS+i][0] ; i++) ;
143 	pctInc = 1.0f/(float)i;
144 
145 	for (i=1 ; i<MAX_CS_MODELS && cg.configStrings[CS_MODELS+i][0] ; i++) {
146 		switch (cg.configStrings[CS_MODELS+i][0]) {
147 		case '*':
148 			CG_LoadingFilename (Q_VarArgs ("Inline: #%s", cg.configStrings[CS_MODELS+i]+1));
149 			cg.modelCfgDraw[i] = cgi.R_RegisterModel (cg.configStrings[CS_MODELS+i]);
150 			cg.modelCfgClip[i] = cgi.CM_InlineModel (cg.configStrings[CS_MODELS+i]);
151 			break;
152 
153 		case '#':
154 			if (cg_numWeaponModels < MAX_CLIENTWEAPONMODELS) {
155 				Q_strncpyz (cg_weaponModels[cg_numWeaponModels], cg.configStrings[CS_MODELS+i]+1, sizeof (cg_weaponModels[0]));
156 				cg_numWeaponModels++;
157 			}
158 			CG_LoadingFilename (Q_VarArgs ("Weapon: %s\n", cg.configStrings[CS_MODELS+i]+1));
159 			cg.modelCfgDraw[i] = cgi.R_RegisterModel (cg.configStrings[CS_MODELS+i]);
160 			cg.modelCfgClip[i] = NULL;
161 			break;
162 
163 		default:
164 			CG_LoadingFilename (cg.configStrings[CS_MODELS+i]);
165 			cg.modelCfgDraw[i] = cgi.R_RegisterModel (cg.configStrings[CS_MODELS+i]);
166 			cg.modelCfgClip[i] = NULL;
167 			break;
168 		}
169 
170 		CG_IncLoadPercent (pctInc*(cg_curLoadRange * 0.35f));
171 		CG_LoadingFilename (0);
172 	}
173 
174 	// Images
175 	CG_LoadingString ("Loading images...");
176 	for (i=1 ; i<MAX_CS_IMAGES && cg.configStrings[CS_IMAGES+i][0] ; i++) ;
177 	pctInc = 1.0f/(float)i;
178 
179 	for (i=1 ; i<MAX_CS_IMAGES && cg.configStrings[CS_IMAGES+i][0] ; i++) {
180 		CG_LoadingFilename (cg.configStrings[CS_IMAGES+i]);
181 		cg.imageCfgStrings[i] = CG_RegisterPic (cg.configStrings[CS_IMAGES+i]);
182 		CG_IncLoadPercent (pctInc*(cg_curLoadRange * 0.2f));
183 	}
184 	CG_LoadingFilename (0);
185 
186 	// Clients
187 	CG_LoadingString ("Loading clientinfo...");
188 	for (i=0, j=0 ; i<MAX_CS_CLIENTS ; i++) {
189 		if (!cg.configStrings[CS_PLAYERSKINS+i][0])
190 			continue;
191 		j++;
192 	}
193 	pctInc = 1.0f/(float)j;
194 
195 	for (i=0 ; i<MAX_CS_CLIENTS ; i++) {
196 		if (!cg.configStrings[CS_PLAYERSKINS+i][0])
197 			continue;
198 
199 		CG_LoadingFilename (Q_VarArgs ("Client #%i", i));
200 		CG_ParseClientinfo (i);
201 		CG_IncLoadPercent (pctInc*(cg_curLoadRange * 0.15f));
202 	}
203 
204 	CG_LoadingFilename ("Base client info");
205 	CG_LoadClientinfo (&cg.baseClientInfo, "unnamed\\male/grunt");
206 	CG_LoadingFilename (0);
207 
208 	CG_IncLoadPercent (cg_curLoadRange * 0.05f);
209 
210 	// Set sky textures and speed
211 	CG_LoadingString ("Loading sky env...");
212 	rotate = (float)atof (cg.configStrings[CS_SKYROTATE]);
213 	sscanf (cg.configStrings[CS_SKYAXIS], "%f %f %f", &axis[0], &axis[1], &axis[2]);
214 	cgi.R_SetSky (cg.configStrings[CS_SKY], rotate, axis);
215 }
216 
217 
218 /*
219 ================
220 CG_ModelMediaInit
221 ================
222 */
CG_ModelMediaInit(void)223 static void CG_ModelMediaInit (void)
224 {
225 	CG_LoadingString ("Loading model media...");
226 	CG_LoadingFilename ("Segment models");
227 
228 	cgMedia.parasiteSegmentModel	= cgi.R_RegisterModel ("models/monsters/parasite/segment/tris.md2");
229 	cgMedia.grappleCableModel		= cgi.R_RegisterModel ("models/ctf/segment/tris.md2");
230 	cgMedia.powerScreenModel		= cgi.R_RegisterModel ("models/items/armor/effect/tris.md2");
231 
232 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
233 	CG_LoadingFilename ("Local models");
234 
235 	cgMedia.brassMGModel			= cgi.R_RegisterModel ("egl/models/brass/mg/tris.md3");
236 	cgMedia.brassSGModel			= cgi.R_RegisterModel ("egl/models/brass/sg/tris.md3");
237 
238 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
239 	CG_LoadingFilename ("Beam models");
240 
241 	cgMedia.lightningModel			= cgi.R_RegisterModel ("models/proj/lightning/tris.md2");
242 	cgMedia.heatBeamModel			= cgi.R_RegisterModel ("models/proj/beam/tris.md2");
243 	cgMedia.monsterHeatBeamModel	= cgi.R_RegisterModel ("models/proj/widowbeam/tris.md2");
244 
245 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
246 	CG_LoadingFilename ("Disguise models");
247 
248 	cgMedia.maleDisguiseModel		= cgi.R_RegisterModel ("players/male/tris.md2");
249 	cgMedia.femaleDisguiseModel		= cgi.R_RegisterModel ("players/female/tris.md2");
250 	cgMedia.cyborgDisguiseModel		= cgi.R_RegisterModel ("players/cyborg/tris.md2");
251 
252 	CG_LoadingFilename (0);
253 }
254 
255 
256 /*
257 ================
258 CG_CrosshairShaderInit
259 ================
260 */
CG_CrosshairShaderInit(void)261 void CG_CrosshairShaderInit (void)
262 {
263 	crosshair->modified = qFalse;
264 	if (crosshair->intVal) {
265 		crosshair->intVal = (crosshair->intVal < 0) ? 0 : crosshair->intVal;
266 
267 		cgMedia.crosshairShader = cgi.R_RegisterPic (Q_VarArgs ("pics/ch%d.tga", crosshair->intVal));
268 	}
269 }
270 
271 
272 /*
273 ================
274 CG_PicMediaInit
275 ================
276 */
CG_PicMediaInit(void)277 static void CG_PicMediaInit (void)
278 {
279 	int		i, j;
280 	static char	*sb_nums[2][11] = {
281 		{"num_0",  "num_1",  "num_2",  "num_3",  "num_4",  "num_5",  "num_6",  "num_7",  "num_8",  "num_9",  "num_minus"},
282 		{"anum_0", "anum_1", "anum_2", "anum_3", "anum_4", "anum_5", "anum_6", "anum_7", "anum_8", "anum_9", "anum_minus"}
283 	};
284 
285 	CG_LoadingString ("Loading image media...");
286 	CG_LoadingFilename ("Crosshair");
287 
288 	CG_CrosshairShaderInit ();
289 
290 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
291 	CG_LoadingFilename ("Pics");
292 
293 	cgi.R_RegisterPic ("pics/w_machinegun.tga");
294 	cgi.R_RegisterPic ("pics/a_bullets.tga");
295 	cgi.R_RegisterPic ("pics/i_health.tga");
296 	cgi.R_RegisterPic ("pics/a_grenades.tga");
297 
298 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
299 	CG_LoadingFilename ("HUD");
300 
301 	cgMedia.hudFieldShader		= cgi.R_RegisterPic ("pics/field_3.tga");
302 	cgMedia.hudInventoryShader	= cgi.R_RegisterPic ("pics/inventory.tga");
303 	cgMedia.hudNetShader		= cgi.R_RegisterPic ("pics/net.tga");
304 	for (i=0 ; i<2 ; i++) {
305 		for (j=0 ; j<11 ; j++)
306 			cgMedia.hudNumShaders[i][j] = cgi.R_RegisterPic (Q_VarArgs ("pics/%s.tga", sb_nums[i][j]));
307 	}
308 	cgMedia.hudPausedShader		= cgi.R_RegisterPic ("pics/pause.tga");
309 
310 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
311 	CG_LoadingFilename ("Disguise skins");
312 
313 	cgMedia.maleDisguiseSkin	= cgi.R_RegisterSkin ("players/male/disguise.tga");
314 	cgMedia.femaleDisguiseSkin	= cgi.R_RegisterSkin ("players/female/disguise.tga");
315 	cgMedia.cyborgDisguiseSkin	= cgi.R_RegisterSkin ("players/cyborg/disguise.tga");
316 
317 	CG_LoadingFilename ("Shell skins");
318 	cgMedia.modelShellGod		= cgi.R_RegisterSkin ("shell_god");
319 	cgMedia.modelShellHalfDam	= cgi.R_RegisterSkin ("shell_halfdam");
320 	cgMedia.modelShellDouble	= cgi.R_RegisterSkin ("shell_double");
321 	cgMedia.modelShellRed		= cgi.R_RegisterSkin ("shell_red");
322 	cgMedia.modelShellGreen		= cgi.R_RegisterSkin ("shell_green");
323 	cgMedia.modelShellBlue		= cgi.R_RegisterSkin ("shell_blue");
324 
325 	CG_LoadingFilename (0);
326 }
327 
328 
329 /*
330 ================
331 CG_FXMediaInit
332 ================
333 */
CG_FXMediaInit(void)334 static void CG_FXMediaInit (void)
335 {
336 	int		i;
337 
338 	// Particles / Decals
339 	CG_LoadingString ("Loading effect media...");
340 	CG_LoadingFilename ("Particles");
341 
342 	for (i=0 ; i<(NUMVERTEXNORMALS*3) ; i++)
343 		cg_randVels[0][i] = (frand () * 255) * 0.01f;
344 
345 	cgMedia.particleTable[PT_BFG_DOT]		= cgi.R_RegisterPoly ("egl/parts/bfg_dot.tga");
346 
347 	cgMedia.particleTable[PT_BLASTER_BLUE]	= cgi.R_RegisterPoly ("egl/parts/blaster_blue.tga");
348 	cgMedia.particleTable[PT_BLASTER_GREEN]	= cgi.R_RegisterPoly ("egl/parts/blaster_green.tga");
349 	cgMedia.particleTable[PT_BLASTER_RED]	= cgi.R_RegisterPoly ("egl/parts/blaster_red.tga");
350 
351 	cgMedia.particleTable[PT_IONTAIL]		= cgi.R_RegisterPoly ("egl/parts/iontail.tga");
352 	cgMedia.particleTable[PT_IONTIP]		= cgi.R_RegisterPoly ("egl/parts/iontip.tga");
353 	cgMedia.particleTable[PT_ITEMRESPAWN]	= cgi.R_RegisterPoly ("egl/parts/respawn_dots.tga");
354 	cgMedia.particleTable[PT_ENGYREPAIR_DOT]= cgi.R_RegisterPoly ("egl/parts/engy_repair_dot.tga");
355 	cgMedia.particleTable[PT_PHALANXTIP]	= cgi.R_RegisterPoly ("egl/parts/phalanxtip.tga");
356 
357 	cgMedia.particleTable[PT_GENERIC]		= cgi.R_RegisterPoly ("egl/parts/generic.tga");
358 	cgMedia.particleTable[PT_GENERIC_GLOW]	= cgi.R_RegisterPoly ("egl/parts/generic_glow.tga");
359 
360 	cgMedia.particleTable[PT_SMOKE]			= cgi.R_RegisterPoly ("egl/parts/smoke1.tga");
361 	cgMedia.particleTable[PT_SMOKE2]		= cgi.R_RegisterPoly ("egl/parts/smoke2.tga");
362 
363 	cgMedia.particleTable[PT_SMOKEGLOW]		= cgi.R_RegisterPoly ("egl/parts/smoke_glow.tga");
364 	cgMedia.particleTable[PT_SMOKEGLOW2]	= cgi.R_RegisterPoly ("egl/parts/smoke_glow2.tga");
365 
366 	cgMedia.particleTable[PT_BLUEFIRE]		= cgi.R_RegisterPoly ("egl/parts/bluefire.tga");
367 	cgMedia.particleTable[PT_FIRE1]			= cgi.R_RegisterPoly ("egl/parts/fire1.tga");
368 	cgMedia.particleTable[PT_FIRE2]			= cgi.R_RegisterPoly ("egl/parts/fire2.tga");
369 	cgMedia.particleTable[PT_FIRE3]			= cgi.R_RegisterPoly ("egl/parts/fire3.tga");
370 	cgMedia.particleTable[PT_FIRE4]			= cgi.R_RegisterPoly ("egl/parts/fire4.tga");
371 	cgMedia.particleTable[PT_EMBERS1]		= cgi.R_RegisterPoly ("egl/parts/embers1.tga");
372 	cgMedia.particleTable[PT_EMBERS2]		= cgi.R_RegisterPoly ("egl/parts/embers2.tga");
373 	cgMedia.particleTable[PT_EMBERS3]		= cgi.R_RegisterPoly ("egl/parts/embers3.tga");
374 
375 	cgMedia.particleTable[PT_BLOOD]			= cgi.R_RegisterPoly ("egl/parts/blood.tga");
376 	cgMedia.particleTable[PT_BLOOD2]		= cgi.R_RegisterPoly ("egl/parts/blood2.tga");
377 	cgMedia.particleTable[PT_BLOOD3]		= cgi.R_RegisterPoly ("egl/parts/blood3.tga");
378 	cgMedia.particleTable[PT_BLOOD4]		= cgi.R_RegisterPoly ("egl/parts/blood4.tga");
379 	cgMedia.particleTable[PT_BLOOD5]		= cgi.R_RegisterPoly ("egl/parts/blood5.tga");
380 	cgMedia.particleTable[PT_BLOOD6]		= cgi.R_RegisterPoly ("egl/parts/blood6.tga");
381 
382 	cgMedia.particleTable[PT_GRNBLOOD]		= cgi.R_RegisterPoly ("egl/parts/blood_grn.tga");
383 	cgMedia.particleTable[PT_GRNBLOOD2]		= cgi.R_RegisterPoly ("egl/parts/blood_grn2.tga");
384 	cgMedia.particleTable[PT_GRNBLOOD3]		= cgi.R_RegisterPoly ("egl/parts/blood_grn3.tga");
385 	cgMedia.particleTable[PT_GRNBLOOD4]		= cgi.R_RegisterPoly ("egl/parts/blood_grn4.tga");
386 	cgMedia.particleTable[PT_GRNBLOOD5]		= cgi.R_RegisterPoly ("egl/parts/blood_grn5.tga");
387 	cgMedia.particleTable[PT_GRNBLOOD6]		= cgi.R_RegisterPoly ("egl/parts/blood_grn6.tga");
388 
389 	cgMedia.particleTable[PT_BLDDRIP01]		= cgi.R_RegisterPoly ("egl/parts/blooddrip01.tga");
390 	cgMedia.particleTable[PT_BLDDRIP02]		= cgi.R_RegisterPoly ("egl/parts/blooddrip02.tga");
391 	cgMedia.particleTable[PT_BLDDRIP01_GRN]	= cgi.R_RegisterPoly ("egl/parts/blooddrip01_green.tga");
392 	cgMedia.particleTable[PT_BLDDRIP02_GRN]	= cgi.R_RegisterPoly ("egl/parts/blooddrip02_green.tga");
393 	cgMedia.particleTable[PT_BLDSPURT]		= cgi.R_RegisterPoly ("egl/parts/bloodspurt.tga");
394 	cgMedia.particleTable[PT_BLDSPURT2]		= cgi.R_RegisterPoly ("egl/parts/bloodspurt2.tga");
395 
396 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
397 
398 	cgMedia.particleTable[PT_BEAM]			= cgi.R_RegisterPoly ("egl/parts/beam.tga");
399 
400 	cgMedia.particleTable[PT_EXPLOFLASH]	= cgi.R_RegisterPoly ("egl/parts/exploflash.tga");
401 	cgMedia.particleTable[PT_EXPLOWAVE]		= cgi.R_RegisterPoly ("egl/parts/explowave.tga");
402 
403 	cgMedia.particleTable[PT_FLARE]			= cgi.R_RegisterPoly ("egl/parts/flare.tga");
404 	cgMedia.particleTable[PT_FLAREGLOW]		= cgi.R_RegisterPoly ("egl/parts/flare_glow.tga");
405 
406 	cgMedia.particleTable[PT_FLY]			= cgi.R_RegisterPoly ("egl/parts/fly.tga");
407 
408 	cgMedia.particleTable[PT_RAIL_CORE]		= cgi.R_RegisterPoly ("egl/parts/rail_core.tga");
409 	cgMedia.particleTable[PT_RAIL_WAVE]		= cgi.R_RegisterPoly ("egl/parts/rail_wave.tga");
410 	cgMedia.particleTable[PT_RAIL_SPIRAL]	= cgi.R_RegisterPoly ("egl/parts/rail_spiral.tga");
411 
412 	cgMedia.particleTable[PT_SPARK]			= cgi.R_RegisterPoly ("egl/parts/spark.tga");
413 
414 	cgMedia.particleTable[PT_WATERBUBBLE]		= cgi.R_RegisterPoly ("egl/parts/water_bubble.tga");
415 	cgMedia.particleTable[PT_WATERDROPLET]		= cgi.R_RegisterPoly ("egl/parts/water_droplet.tga");
416 	cgMedia.particleTable[PT_WATERIMPACT]		= cgi.R_RegisterPoly ("egl/parts/water_impact.tga");
417 	cgMedia.particleTable[PT_WATERMIST]			= cgi.R_RegisterPoly ("egl/parts/water_mist.tga");
418 	cgMedia.particleTable[PT_WATERMIST_GLOW]	= cgi.R_RegisterPoly ("egl/parts/water_mist_glow.tga");
419 	cgMedia.particleTable[PT_WATERPLUME]		= cgi.R_RegisterPoly ("egl/parts/water_plume.tga");
420 	cgMedia.particleTable[PT_WATERPLUME_GLOW]	= cgi.R_RegisterPoly ("egl/parts/water_plume_glow.tga");
421 	cgMedia.particleTable[PT_WATERRING]			= cgi.R_RegisterPoly ("egl/parts/water_ring.tga");
422 	cgMedia.particleTable[PT_WATERRIPPLE]		= cgi.R_RegisterPoly ("egl/parts/water_ripple.tga");
423 
424 	// Animated explosions
425 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
426 	CG_LoadingFilename ("Explosions");
427 
428 	cgMedia.particleTable[PT_EXPLO1]		= cgi.R_RegisterPoly ("egl/parts/explo1.tga");
429 	cgMedia.particleTable[PT_EXPLO2]		= cgi.R_RegisterPoly ("egl/parts/explo2.tga");
430 	cgMedia.particleTable[PT_EXPLO3]		= cgi.R_RegisterPoly ("egl/parts/explo3.tga");
431 	cgMedia.particleTable[PT_EXPLO4]		= cgi.R_RegisterPoly ("egl/parts/explo4.tga");
432 	cgMedia.particleTable[PT_EXPLO5]		= cgi.R_RegisterPoly ("egl/parts/explo5.tga");
433 	cgMedia.particleTable[PT_EXPLO6]		= cgi.R_RegisterPoly ("egl/parts/explo6.tga");
434 	cgMedia.particleTable[PT_EXPLO7]		= cgi.R_RegisterPoly ("egl/parts/explo7.tga");
435 
436 	cgMedia.particleTable[PT_EXPLOEMBERS1]	= cgi.R_RegisterPoly ("egl/parts/exploembers.tga");
437 	cgMedia.particleTable[PT_EXPLOEMBERS2]	= cgi.R_RegisterPoly ("egl/parts/exploembers2.tga");
438 
439 	// mapfx media
440 	CG_LoadingFilename ("MapFX Media");
441 
442 	cgMedia.particleTable[MFX_CORONA]		= cgi.R_RegisterPoly ("egl/mfx/corona.tga");
443 	cgMedia.particleTable[MFX_WHITE]		= cgi.R_RegisterPoly ("egl/mfx/white.tga");
444 
445 	// Decal specific
446 	CG_IncLoadPercent (cg_curLoadRange * 0.25f);
447 	CG_LoadingFilename ("Decals");
448 
449 	cgMedia.decalTable[DT_BFG_BURNMARK]			= cgi.R_RegisterPoly ("egl/decals/bfg_burnmark.tga");
450 	cgMedia.decalTable[DT_BFG_GLOWMARK]			= cgi.R_RegisterPoly ("egl/decals/bfg_glowmark.tga");
451 
452 	cgMedia.decalTable[DT_BLASTER_BLUEMARK]		= cgi.R_RegisterPoly ("egl/decals/blaster_bluemark.tga");
453 	cgMedia.decalTable[DT_BLASTER_BURNMARK]		= cgi.R_RegisterPoly ("egl/decals/blaster_burnmark.tga");
454 	cgMedia.decalTable[DT_BLASTER_GREENMARK]	= cgi.R_RegisterPoly ("egl/decals/blaster_greenmark.tga");
455 	cgMedia.decalTable[DT_BLASTER_REDMARK]		= cgi.R_RegisterPoly ("egl/decals/blaster_redmark.tga");
456 
457 	cgMedia.decalTable[DT_DRONE_SPIT_GLOW]		= cgi.R_RegisterPoly ("egl/decals/drone_spit_glow.tga");
458 
459 	cgMedia.decalTable[DT_ENGYREPAIR_BURNMARK]	= cgi.R_RegisterPoly ("egl/decals/engy_repair_burnmark.tga");
460 	cgMedia.decalTable[DT_ENGYREPAIR_GLOWMARK]	= cgi.R_RegisterPoly ("egl/decals/engy_repair_glowmark.tga");
461 
462 	cgMedia.decalTable[DT_BLOOD01]				= cgi.R_RegisterPoly ("egl/decals/blood01.tga");
463 	cgMedia.decalTable[DT_BLOOD02]				= cgi.R_RegisterPoly ("egl/decals/blood02.tga");
464 	cgMedia.decalTable[DT_BLOOD03]				= cgi.R_RegisterPoly ("egl/decals/blood03.tga");
465 	cgMedia.decalTable[DT_BLOOD04]				= cgi.R_RegisterPoly ("egl/decals/blood04.tga");
466 	cgMedia.decalTable[DT_BLOOD05]				= cgi.R_RegisterPoly ("egl/decals/blood05.tga");
467 	cgMedia.decalTable[DT_BLOOD06]				= cgi.R_RegisterPoly ("egl/decals/blood06.tga");
468 	cgMedia.decalTable[DT_BLOOD07]				= cgi.R_RegisterPoly ("egl/decals/blood07.tga");
469 	cgMedia.decalTable[DT_BLOOD08]				= cgi.R_RegisterPoly ("egl/decals/blood08.tga");
470 	cgMedia.decalTable[DT_BLOOD09]				= cgi.R_RegisterPoly ("egl/decals/blood09.tga");
471 	cgMedia.decalTable[DT_BLOOD10]				= cgi.R_RegisterPoly ("egl/decals/blood10.tga");
472 	cgMedia.decalTable[DT_BLOOD11]				= cgi.R_RegisterPoly ("egl/decals/blood11.tga");
473 	cgMedia.decalTable[DT_BLOOD12]				= cgi.R_RegisterPoly ("egl/decals/blood12.tga");
474 	cgMedia.decalTable[DT_BLOOD13]				= cgi.R_RegisterPoly ("egl/decals/blood13.tga");
475 	cgMedia.decalTable[DT_BLOOD14]				= cgi.R_RegisterPoly ("egl/decals/blood14.tga");
476 	cgMedia.decalTable[DT_BLOOD15]				= cgi.R_RegisterPoly ("egl/decals/blood15.tga");
477 	cgMedia.decalTable[DT_BLOOD16]				= cgi.R_RegisterPoly ("egl/decals/blood16.tga");
478 
479 	cgMedia.decalTable[DT_BLOOD01_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood01_green.tga");
480 	cgMedia.decalTable[DT_BLOOD02_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood02_green.tga");
481 	cgMedia.decalTable[DT_BLOOD03_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood03_green.tga");
482 	cgMedia.decalTable[DT_BLOOD04_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood04_green.tga");
483 	cgMedia.decalTable[DT_BLOOD05_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood05_green.tga");
484 	cgMedia.decalTable[DT_BLOOD06_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood06_green.tga");
485 	cgMedia.decalTable[DT_BLOOD07_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood07_green.tga");
486 	cgMedia.decalTable[DT_BLOOD08_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood08_green.tga");
487 	cgMedia.decalTable[DT_BLOOD09_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood09_green.tga");
488 	cgMedia.decalTable[DT_BLOOD10_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood10_green.tga");
489 	cgMedia.decalTable[DT_BLOOD11_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood11_green.tga");
490 	cgMedia.decalTable[DT_BLOOD12_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood12_green.tga");
491 	cgMedia.decalTable[DT_BLOOD13_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood13_green.tga");
492 	cgMedia.decalTable[DT_BLOOD14_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood14_green.tga");
493 	cgMedia.decalTable[DT_BLOOD15_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood15_green.tga");
494 	cgMedia.decalTable[DT_BLOOD16_GRN]			= cgi.R_RegisterPoly ("egl/decals/blood16_green.tga");
495 
496 	cgMedia.decalTable[DT_BULLET]				= cgi.R_RegisterPoly ("egl/decals/bullet.tga");
497 
498 	cgMedia.decalTable[DT_EXPLOMARK]			= cgi.R_RegisterPoly ("egl/decals/explomark.tga");
499 	cgMedia.decalTable[DT_EXPLOMARK2]			= cgi.R_RegisterPoly ("egl/decals/explomark2.tga");
500 	cgMedia.decalTable[DT_EXPLOMARK3]			= cgi.R_RegisterPoly ("egl/decals/explomark3.tga");
501 
502 	cgMedia.decalTable[DT_RAIL_BURNMARK]		= cgi.R_RegisterPoly ("egl/decals/rail_burnmark.tga");
503 	cgMedia.decalTable[DT_RAIL_GLOWMARK]		= cgi.R_RegisterPoly ("egl/decals/rail_glowmark.tga");
504 	cgMedia.decalTable[DT_RAIL_WHITE]			= cgi.R_RegisterPoly ("egl/decals/rail_white.tga");
505 
506 	cgMedia.decalTable[DT_SLASH]				= cgi.R_RegisterPoly ("egl/decals/slash.tga");
507 	cgMedia.decalTable[DT_SLASH2]				= cgi.R_RegisterPoly ("egl/decals/slash2.tga");
508 	cgMedia.decalTable[DT_SLASH3]				= cgi.R_RegisterPoly ("egl/decals/slash3.tga");
509 
510 	// clear filename
511 	CG_LoadingFilename (0);
512 }
513 
514 
515 /*
516 ================
517 CG_SoundMediaInit
518 
519 Called on CGame init and on snd_restart
520 ================
521 */
CG_SoundMediaInit(void)522 void CG_SoundMediaInit (void)
523 {
524 	char	name[MAX_QPATH];
525 	int		i;
526 
527 	CG_LoadingString ("Loading sound media...");
528 
529 	// UI sounds
530 	uiMedia.sounds.menuIn			= cgi.Snd_RegisterSound ("misc/menu1.wav");
531 	uiMedia.sounds.menuMove			= cgi.Snd_RegisterSound ("misc/menu2.wav");
532 	uiMedia.sounds.menuOut			= cgi.Snd_RegisterSound ("misc/menu3.wav");
533 
534 	// Generic sounds
535 	cgMedia.sfx.disruptExplo		= cgi.Snd_RegisterSound ("weapons/disrupthit.wav");
536 	cgMedia.sfx.grenadeExplo		= cgi.Snd_RegisterSound ("weapons/grenlx1a.wav");
537 	cgMedia.sfx.rocketExplo			= cgi.Snd_RegisterSound ("weapons/rocklx1a.wav");
538 	cgMedia.sfx.waterExplo			= cgi.Snd_RegisterSound ("weapons/xpld_wat.wav");
539 
540 	cgMedia.sfx.gib					= cgi.Snd_RegisterSound ("misc/udeath.wav");
541 	cgMedia.sfx.gibSplat[0]			= cgi.Snd_RegisterSound ("egl/gibimp1.wav");
542 	cgMedia.sfx.gibSplat[1]			= cgi.Snd_RegisterSound ("egl/gibimp2.wav");
543 	cgMedia.sfx.gibSplat[2]			= cgi.Snd_RegisterSound ("egl/gibimp3.wav");
544 
545 	CG_IncLoadPercent (cg_curLoadRange * 0.2f);
546 
547 	cgMedia.sfx.itemRespawn			= cgi.Snd_RegisterSound ("items/respawn1.wav");
548 	cgMedia.sfx.laserHit			= cgi.Snd_RegisterSound ("weapons/lashit.wav");
549 	cgMedia.sfx.lightning			= cgi.Snd_RegisterSound ("weapons/tesla.wav");
550 
551 	cgMedia.sfx.playerFall			= cgi.Snd_RegisterSound ("*fall2.wav");
552 	cgMedia.sfx.playerFallShort		= cgi.Snd_RegisterSound ("player/land1.wav");
553 	cgMedia.sfx.playerFallFar		= cgi.Snd_RegisterSound ("*fall1.wav");
554 
555 	cgMedia.sfx.playerTeleport		= cgi.Snd_RegisterSound ("misc/tele1.wav");
556 	cgMedia.sfx.bigTeleport			= cgi.Snd_RegisterSound ("misc/bigtele.wav");
557 
558 	for (i=0 ; i<7 ; i++) {
559 		CG_IncLoadPercent (cg_curLoadRange * 0.02f);
560 
561 		Q_snprintfz (name, sizeof (name), "world/spark%i.wav", i+1);
562 		cgMedia.sfx.spark[i]				= cgi.Snd_RegisterSound (name);
563 
564 		if (i > 5)
565 			continue;
566 
567 		Q_snprintfz (name, sizeof (name), "egl/steps/snow%i.wav", i+1);
568 		cgMedia.sfx.steps.snow[i]			= cgi.Snd_RegisterSound (name);
569 
570 		if (i > 3)
571 			continue;
572 
573 		Q_snprintfz (name, sizeof (name), "player/step%i.wav", i+1);
574 		cgMedia.sfx.steps.standard[i]		= cgi.Snd_RegisterSound (name);
575 
576 
577 		Q_snprintfz (name, sizeof (name), "egl/steps/concrete%i.wav", i+1);
578 		cgMedia.sfx.steps.concrete[i]		= cgi.Snd_RegisterSound (name);
579 
580 		Q_snprintfz (name, sizeof (name), "egl/steps/dirt%i.wav", i+1);
581 		cgMedia.sfx.steps.dirt[i]			= cgi.Snd_RegisterSound (name);
582 
583 		Q_snprintfz (name, sizeof (name), "egl/steps/duct%i.wav", i+1);
584 		cgMedia.sfx.steps.duct[i]			= cgi.Snd_RegisterSound (name);
585 
586 		Q_snprintfz (name, sizeof (name), "egl/steps/grass%i.wav", i+1);
587 		cgMedia.sfx.steps.grass[i]			= cgi.Snd_RegisterSound (name);
588 
589 		Q_snprintfz (name, sizeof (name), "egl/steps/gravel%i.wav", i+1);
590 		cgMedia.sfx.steps.gravel[i]			= cgi.Snd_RegisterSound (name);
591 
592 		Q_snprintfz (name, sizeof (name), "egl/steps/metal%i.wav", i+1);
593 		cgMedia.sfx.steps.metal[i]			= cgi.Snd_RegisterSound (name);
594 
595 		Q_snprintfz (name, sizeof (name), "egl/steps/metalgrate%i.wav", i+1);
596 		cgMedia.sfx.steps.metalGrate[i]		= cgi.Snd_RegisterSound (name);
597 
598 		Q_snprintfz (name, sizeof (name), "egl/steps/metalladder%i.wav", i+1);
599 		cgMedia.sfx.steps.metalLadder[i]	= cgi.Snd_RegisterSound (name);
600 
601 		Q_snprintfz (name, sizeof (name), "egl/steps/mud%i.wav", i+1);
602 		cgMedia.sfx.steps.mud[i]			= cgi.Snd_RegisterSound (name);
603 
604 		Q_snprintfz (name, sizeof (name), "egl/steps/sand%i.wav", i+1);
605 		cgMedia.sfx.steps.sand[i]			= cgi.Snd_RegisterSound (name);
606 
607 		Q_snprintfz (name, sizeof (name), "egl/steps/slosh%i.wav", i+1);
608 		cgMedia.sfx.steps.slosh[i]			= cgi.Snd_RegisterSound (name);
609 
610 		Q_snprintfz (name, sizeof (name), "egl/steps/tile%i.wav", i+1);
611 		cgMedia.sfx.steps.tile[i]			= cgi.Snd_RegisterSound (name);
612 
613 		Q_snprintfz (name, sizeof (name), "egl/steps/wade%i.wav", i+1);
614 		cgMedia.sfx.steps.wade[i]			= cgi.Snd_RegisterSound (name);
615 
616 		Q_snprintfz (name, sizeof (name), "egl/steps/wood%i.wav", i+1);
617 		cgMedia.sfx.steps.wood[i]			= cgi.Snd_RegisterSound (name);
618 
619 		Q_snprintfz (name, sizeof (name), "egl/steps/woodpanel%i.wav", i+1);
620 		cgMedia.sfx.steps.woodPanel[i]		= cgi.Snd_RegisterSound (name);
621 
622 		if (i > 2)
623 			continue;
624 
625 		Q_snprintfz (name, sizeof (name), "world/ric%i.wav", i+1);
626 		cgMedia.sfx.ricochet[i]				= cgi.Snd_RegisterSound (name);
627 	}
628 
629 	CG_IncLoadPercent (cg_curLoadRange * 0.2f);
630 	CG_LoadingFilename ("Muzzle flashes");
631 
632 	// Muzzleflash sounds
633 	cgMedia.sfx.mz.bfgFireSfx			= cgi.Snd_RegisterSound ("weapons/bfg__f1y.wav");
634 	cgMedia.sfx.mz.blasterFireSfx		= cgi.Snd_RegisterSound ("weapons/blastf1a.wav");
635 	cgMedia.sfx.mz.etfRifleFireSfx		= cgi.Snd_RegisterSound ("weapons/nail1.wav");
636 	cgMedia.sfx.mz.grenadeFireSfx		= cgi.Snd_RegisterSound ("weapons/grenlf1a.wav");
637 	cgMedia.sfx.mz.grenadeReloadSfx		= cgi.Snd_RegisterSound ("weapons/grenlr1b.wav");
638 	cgMedia.sfx.mz.hyperBlasterFireSfx	= cgi.Snd_RegisterSound ("weapons/hyprbf1a.wav");
639 	cgMedia.sfx.mz.ionRipperFireSfx		= cgi.Snd_RegisterSound ("weapons/rippfire.wav");
640 
641 	for (i=0 ; i<5 ; i++) {
642 		Q_snprintfz (name, sizeof (name), "weapons/machgf%ib.wav", i+1);
643 		cgMedia.sfx.mz.machineGunSfx[i]	= cgi.Snd_RegisterSound (name);
644 	}
645 
646 	cgMedia.sfx.mz.phalanxFireSfx		= cgi.Snd_RegisterSound ("weapons/plasshot.wav");
647 	cgMedia.sfx.mz.railgunFireSfx		= cgi.Snd_RegisterSound ("weapons/railgf1a.wav");
648 	cgMedia.sfx.mz.railgunReloadSfx		= cgi.Snd_RegisterSound ("weapons/railgr1a.wav");
649 	cgMedia.sfx.mz.rocketFireSfx		= cgi.Snd_RegisterSound ("weapons/rocklf1a.wav");
650 	cgMedia.sfx.mz.rocketReloadSfx		= cgi.Snd_RegisterSound ("weapons/rocklr1b.wav");
651 	cgMedia.sfx.mz.shotgunFireSfx		= cgi.Snd_RegisterSound ("weapons/shotgf1b.wav");
652 	cgMedia.sfx.mz.shotgun2FireSfx		= cgi.Snd_RegisterSound ("weapons/shotg2.wav");
653 	cgMedia.sfx.mz.shotgunReloadSfx		= cgi.Snd_RegisterSound ("weapons/shotgr1b.wav");
654 	cgMedia.sfx.mz.superShotgunFireSfx	= cgi.Snd_RegisterSound ("weapons/sshotf1b.wav");
655 	cgMedia.sfx.mz.trackerFireSfx		= cgi.Snd_RegisterSound ("weapons/disint2.wav");
656 
657 	CG_IncLoadPercent (cg_curLoadRange * 0.2f);
658 
659 	// Monster muzzleflash sounds
660 	cgMedia.sfx.mz2.chicRocketSfx		= cgi.Snd_RegisterSound ("chick/chkatck2.wav");
661 	cgMedia.sfx.mz2.floatBlasterSfx		= cgi.Snd_RegisterSound ("floater/fltatck1.wav");
662 	cgMedia.sfx.mz2.flyerBlasterSfx		= cgi.Snd_RegisterSound ("flyer/flyatck3.wav");
663 	cgMedia.sfx.mz2.gunnerGrenadeSfx	= cgi.Snd_RegisterSound ("gunner/gunatck3.wav");
664 	cgMedia.sfx.mz2.gunnerMachGunSfx	= cgi.Snd_RegisterSound ("gunner/gunatck2.wav");
665 	cgMedia.sfx.mz2.hoverBlasterSfx		= cgi.Snd_RegisterSound ("hover/hovatck1.wav");
666 	cgMedia.sfx.mz2.jorgMachGunSfx		= cgi.Snd_RegisterSound ("boss3/xfire.wav");
667 	cgMedia.sfx.mz2.machGunSfx			= cgi.Snd_RegisterSound ("infantry/infatck1.wav");
668 	cgMedia.sfx.mz2.makronBlasterSfx	= cgi.Snd_RegisterSound ("makron/blaster.wav");
669 	cgMedia.sfx.mz2.medicBlasterSfx		= cgi.Snd_RegisterSound ("medic/medatck1.wav");
670 	cgMedia.sfx.mz2.soldierBlasterSfx	= cgi.Snd_RegisterSound ("soldier/solatck2.wav");
671 	cgMedia.sfx.mz2.soldierMachGunSfx	= cgi.Snd_RegisterSound ("soldier/solatck3.wav");
672 	cgMedia.sfx.mz2.soldierShotgunSfx	= cgi.Snd_RegisterSound ("soldier/solatck1.wav");
673 	cgMedia.sfx.mz2.superTankRocketSfx	= cgi.Snd_RegisterSound ("tank/rocket.wav");
674 	cgMedia.sfx.mz2.tankBlasterSfx		= cgi.Snd_RegisterSound ("tank/tnkatck3.wav");
675 
676 	for (i=0 ; i<5 ; i++) {
677 		Q_snprintfz (name, sizeof (name), "tank/tnkatk2%c.wav", 'a' + i);
678 		cgMedia.sfx.mz2.tankMachGunSfx[i] = cgi.Snd_RegisterSound (name);
679 	}
680 
681 	cgMedia.sfx.mz2.tankRocketSfx		= cgi.Snd_RegisterSound ("tank/tnkatck1.wav");
682 
683 	// Brass sounds
684 	cgMedia.sfx.mgShell[0]				= cgi.Snd_RegisterSound ("#egl/sounds/brass/mg_shell1.wav");
685 	cgMedia.sfx.mgShell[1]				= cgi.Snd_RegisterSound ("#egl/sounds/brass/mg_shell2.wav");
686 	cgMedia.sfx.sgShell[0]				= cgi.Snd_RegisterSound ("#egl/sounds/brass/sg_shell1.wav");
687 	cgMedia.sfx.sgShell[1]				= cgi.Snd_RegisterSound ("#egl/sounds/brass/sg_shell2.wav");
688 
689 	// Configstring-based sounds
690 	for (i=1 ; i<MAX_CS_SOUNDS ; i++) {
691 		if (!cg.configStrings[CS_SOUNDS+i][0]) {
692 			cg.soundCfgStrings[i] = NULL;
693 			break;
694 		}
695 
696 		cg.soundCfgStrings[i] = cgi.Snd_RegisterSound (cg.configStrings[CS_SOUNDS+i]);
697 		cgi.Sys_SendKeyEvents ();	// pump message loop
698 	}
699 
700 	// Clear filename
701 	CG_LoadingFilename (0);
702 }
703 
704 
705 /*
706 =================
707 CG_CacheGloomMedia
708 =================
709 */
CG_CacheGloomMedia(void)710 void CG_CacheGloomMedia (void)
711 {
712 	CG_LoadingString ("Loading Gloom media...");
713 
714 	//
715 	// Human classes
716 	//
717 	CG_LoadingFilename ("Human classes");
718 	cgi.R_RegisterModel ("players/engineer/tris.md2");
719 	cgi.R_RegisterModel ("players/male/tris.md2");
720 	cgi.R_RegisterModel ("players/female/tris.md2");
721 
722 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
723 
724 	cgi.R_RegisterModel ("players/hsold/tris.md2");
725 	cgi.R_RegisterModel ("players/exterm/tris.md2");
726 	cgi.R_RegisterModel ("players/mech/tris.md2");
727 
728 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
729 
730 	// Human structures
731 	CG_LoadingFilename ("Human structures");
732 	cgi.R_RegisterModel ("models/objects/dmspot/tris.md2");
733 	cgi.R_RegisterModel ("models/turret/base.md2");
734 	cgi.R_RegisterModel ("models/turret/gun.md2");
735 	cgi.R_RegisterModel ("models/turret/mgun.md2");
736 
737 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
738 
739 	cgi.R_RegisterModel ("models/objects/detector/tris.md2");
740 	cgi.R_RegisterModel ("models/objects/tripwire/tris.md2");
741 	cgi.R_RegisterModel ("models/objects/depot/tris.md2");
742 
743 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
744 
745 	// Human weapons
746 	CG_LoadingFilename ("Human weapons");
747 	cgi.R_RegisterModel ("players/engineer/weapon.md2");
748 	cgi.R_RegisterModel ("players/male/autogun.md2");
749 	cgi.R_RegisterModel ("players/male/shotgun.md2");
750 	cgi.R_RegisterModel ("players/male/smg.md2");
751 	cgi.R_RegisterModel ("players/male/weapon.md2");
752 
753 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
754 
755 	cgi.R_RegisterModel ("players/female/weapon.md2");
756 	cgi.R_RegisterModel ("players/hsold/weapon.md2");
757 	cgi.R_RegisterModel ("players/exterm/weapon.md2");
758  	cgi.R_RegisterModel ("players/mech/weapon.md2");
759 
760 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
761 
762 	// Human view weapons
763 	CG_LoadingFilename ("Human view weapons");
764 	cgi.R_RegisterModel ("models/weapons/v_auto/tris.md2");
765 	cgi.R_RegisterModel ("models/weapons/v_shot/tris.md2");
766 	cgi.R_RegisterModel ("models/weapons/v_spas/tris.md2");
767 	cgi.R_RegisterModel ("models/weapons/v_launch/tris.md2");
768 
769 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
770 
771 	cgi.R_RegisterModel ("models/weapons/v_pist/tris.md2");
772  	cgi.R_RegisterModel ("models/weapons/v_sub/tris.md2");
773 	cgi.R_RegisterModel ("models/weapons/v_mag/tris.md2");
774 	cgi.R_RegisterModel ("models/weapons/v_plas/tris.md2");
775 	cgi.R_RegisterModel ("models/weapons/v_mech/tris.md2");
776 
777 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
778 
779 	// Human items
780 	CG_LoadingFilename ("Human Items");
781 	cgi.R_RegisterModel ("models/objects/c4/tris.md2");
782 	cgi.R_RegisterModel ("models/objects/r_explode/tris.md2");
783 	cgi.R_RegisterModel ("models/objects/explode/tris.md2");
784 	cgi.R_RegisterModel ("models/objects/ggrenade/tris.md2");
785 	cgi.R_RegisterModel ("models/objects/laser/tris.md2");
786 	cgi.R_RegisterModel ("models/objects/tlaser/tris.md2");
787 
788 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
789 
790 	cgi.R_RegisterModel ("models/objects/c4/tris.md2");
791 	cgi.R_RegisterModel ("models/objects/grenade/tris.md2");
792 	cgi.R_RegisterModel ("models/objects/debris1/tris.md2");
793 	cgi.R_RegisterModel ("models/objects/debris2/tris.md2");
794 
795 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
796 
797 	//
798 	// Alien classes
799 	//
800 	CG_LoadingFilename ("Alien classes");
801 	cgi.R_RegisterModel ("players/breeder/tris.md2");
802 	cgi.R_RegisterModel ("players/breeder/weapon.md2");
803 	cgi.R_RegisterModel ("players/hatch/tris.md2");
804 	cgi.R_RegisterModel ("players/hatch/weapon.md2");
805 	cgi.R_RegisterModel ("players/drone/tris.md2");
806 	cgi.R_RegisterModel ("players/drone/weapon.md2");
807 	cgi.R_RegisterModel ("players/wraith/tris.md2");
808 
809 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
810 
811 	cgi.R_RegisterModel ("players/wraith/weapon.md2");
812 	cgi.R_RegisterModel ("players/stinger/tris.md2");
813 	cgi.R_RegisterModel ("players/stinger/weapon.md2");
814 	cgi.R_RegisterModel ("players/guardian/tris.md2");
815 	cgi.R_RegisterModel ("players/guardian/weapon.md2");
816 	cgi.R_RegisterModel ("players/stalker/tris.md2");
817 	cgi.R_RegisterModel ("players/stalker/weapon.md2");
818 
819 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
820 
821 	// Alien structures
822 	CG_LoadingFilename ("Alien structures");
823 	cgi.R_RegisterModel ("models/objects/cocoon/tris.md2");
824 	cgi.R_RegisterModel ("models/objects/organ/spiker/tris.md2");
825 	cgi.R_RegisterModel ("models/objects/organ/healer/tris.md2");
826 	cgi.R_RegisterModel ("models/objects/organ/obstacle/tris.md2");
827 	cgi.R_RegisterModel ("models/objects/organ/gas/tris.md2");
828 
829 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
830 
831 	cgi.R_RegisterModel ("models/objects/spike/tris.md2");
832 	cgi.R_RegisterModel ("models/objects/spore/tris.md2");
833 	cgi.R_RegisterModel ("models/objects/smokexp/tris.md2");
834 	cgi.R_RegisterModel ("models/objects/web/ball.md2");
835 
836 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
837 
838 	// Alien objects
839 	CG_LoadingFilename ("Alien objects");
840 	cgi.R_RegisterModel ("models/gibs/hatchling/leg/tris.md2");
841 	cgi.R_RegisterModel ("models/gibs/guardian/gib2.md2");
842 	cgi.R_RegisterModel ("models/gibs/guardian/gib1.md2");
843 	cgi.R_RegisterModel ("models/gibs/stalker/gib1.md2");
844 
845 	CG_IncLoadPercent (cg_curLoadRange * 0.0625f);
846 
847 	cgi.R_RegisterModel ("models/gibs/stalker/gib2.md2");
848 	cgi.R_RegisterModel ("models/gibs/stalker/gib3.md2");
849 	cgi.R_RegisterModel ("models/objects/sspore/tris.md2");
850 
851 	CG_LoadingFilename (0);
852 }
853 
854 /*
855 =============================================================================
856 
857 	MEDIA INITIALIZATION
858 
859 =============================================================================
860 */
861 
862 /*
863 ================
864 CG_MapInit
865 
866 Called before all the cgame is initialized
867 ================
868 */
CG_MapInit(void)869 void CG_MapInit (void)
870 {
871 	float		percent;
872 
873 	if (cgMedia.initialized)
874 		return;
875 
876 	CG_LoadingPercent (0);
877 	CG_LoadingString (0);
878 	CG_LoadingFilename (0);
879 
880 	cgi.R_UpdateScreen ();
881 
882 	percent = 0;
883 	if (cg.currGameMod == GAME_MOD_GLOOM && glm_forcecache->intVal) {
884 		// Map media
885 		cg_curLoadRange = 30;
886 		CG_MapMediaInit ();
887 		CG_LoadingPercent (percent += cg_curLoadRange);
888 
889 		// Model media
890 		cg_curLoadRange = 10;
891 		CG_ModelMediaInit ();
892 		CG_LoadingPercent (percent += cg_curLoadRange);
893 
894 		// Pic media
895 		cg_curLoadRange = 10;
896 		CG_PicMediaInit ();
897 		CG_LoadingPercent (percent += cg_curLoadRange);
898 
899 		// Effect media
900 		cg_curLoadRange = 15;
901 		CG_FXMediaInit ();
902 		CG_LoadingPercent (percent += cg_curLoadRange);
903 
904 		// Sound media
905 		cg_curLoadRange = 15;
906 		CG_SoundMediaInit ();
907 		CG_LoadingPercent (percent += cg_curLoadRange);
908 
909 		// Gloom media
910 		cg_curLoadRange = 20;
911 		CG_CacheGloomMedia ();
912 		CG_LoadingPercent (percent += cg_curLoadRange);
913 	}
914 	else {
915 		// Map media
916 		cg_curLoadRange = 35;
917 		CG_MapMediaInit ();
918 		CG_LoadingPercent (percent += cg_curLoadRange);
919 
920 		// Model media
921 		cg_curLoadRange = 10;
922 		CG_ModelMediaInit ();
923 		CG_LoadingPercent (percent += cg_curLoadRange);
924 
925 		// Pic media
926 		cg_curLoadRange = 15;
927 		CG_PicMediaInit ();
928 		CG_LoadingPercent (percent += cg_curLoadRange);
929 
930 		// Effect media
931 		cg_curLoadRange = 20;
932 		CG_FXMediaInit ();
933 		CG_LoadingPercent (percent += cg_curLoadRange);
934 
935 		// Sound media
936 		cg_curLoadRange = 20;
937 		CG_SoundMediaInit ();
938 		CG_LoadingPercent (percent += cg_curLoadRange);
939 	}
940 
941 	CG_LoadingPercent (100);
942 	CG_LoadingString (0);
943 	CG_LoadingFilename (0);
944 
945 	cg.frame.valid = qFalse;	// Probably out of date
946 
947 	cgMedia.initialized = qTrue;
948 }
949 
950 
951 /*
952 ================
953 CG_ShutdownMap
954 ================
955 */
CG_ShutdownMap(void)956 void CG_ShutdownMap (void)
957 {
958 	if (!cgMedia.initialized)
959 		return;
960 
961 	cgMedia.initialized = qFalse;
962 }
963