00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "ui_local.h"
00024
00025 #define MODEL_BACK0 "menu/art/back_0"
00026 #define MODEL_BACK1 "menu/art/back_1"
00027 #define MODEL_SELECT "menu/art/opponents_select"
00028 #define MODEL_SELECTED "menu/art/opponents_selected"
00029 #define MODEL_FRAMEL "menu/art/frame1_l"
00030 #define MODEL_FRAMER "menu/art/frame1_r"
00031 #define MODEL_PORTS "menu/art/player_models_ports"
00032 #define MODEL_ARROWS "menu/art/gs_arrows_0"
00033 #define MODEL_ARROWSL "menu/art/gs_arrows_l"
00034 #define MODEL_ARROWSR "menu/art/gs_arrows_r"
00035
00036 #define LOW_MEMORY (5 * 1024 * 1024)
00037
00038 static char* playermodel_artlist[] =
00039 {
00040 MODEL_BACK0,
00041 MODEL_BACK1,
00042 MODEL_SELECT,
00043 MODEL_SELECTED,
00044 MODEL_FRAMEL,
00045 MODEL_FRAMER,
00046 MODEL_PORTS,
00047 MODEL_ARROWS,
00048 MODEL_ARROWSL,
00049 MODEL_ARROWSR,
00050 NULL
00051 };
00052
00053 #define PLAYERGRID_COLS 4
00054 #define PLAYERGRID_ROWS 4
00055 #define MAX_MODELSPERPAGE (PLAYERGRID_ROWS*PLAYERGRID_COLS)
00056
00057 #define MAX_PLAYERMODELS 256
00058
00059 #define ID_PLAYERPIC0 0
00060 #define ID_PLAYERPIC1 1
00061 #define ID_PLAYERPIC2 2
00062 #define ID_PLAYERPIC3 3
00063 #define ID_PLAYERPIC4 4
00064 #define ID_PLAYERPIC5 5
00065 #define ID_PLAYERPIC6 6
00066 #define ID_PLAYERPIC7 7
00067 #define ID_PLAYERPIC8 8
00068 #define ID_PLAYERPIC9 9
00069 #define ID_PLAYERPIC10 10
00070 #define ID_PLAYERPIC11 11
00071 #define ID_PLAYERPIC12 12
00072 #define ID_PLAYERPIC13 13
00073 #define ID_PLAYERPIC14 14
00074 #define ID_PLAYERPIC15 15
00075 #define ID_PREVPAGE 100
00076 #define ID_NEXTPAGE 101
00077 #define ID_BACK 102
00078
00079 typedef struct
00080 {
00081 menuframework_s menu;
00082 menubitmap_s pics[MAX_MODELSPERPAGE];
00083 menubitmap_s picbuttons[MAX_MODELSPERPAGE];
00084 menubitmap_s framel;
00085 menubitmap_s framer;
00086 menubitmap_s ports;
00087 menutext_s banner;
00088 menubitmap_s back;
00089 menubitmap_s player;
00090 menubitmap_s arrows;
00091 menubitmap_s left;
00092 menubitmap_s right;
00093 menutext_s modelname;
00094 menutext_s skinname;
00095 menutext_s playername;
00096 playerInfo_t playerinfo;
00097 int nummodels;
00098 char modelnames[MAX_PLAYERMODELS][128];
00099 int modelpage;
00100 int numpages;
00101 char modelskin[64];
00102 int selectedmodel;
00103 } playermodel_t;
00104
00105 static playermodel_t s_playermodel;
00106
00107
00108
00109
00110
00111
00112 static void PlayerModel_UpdateGrid( void )
00113 {
00114 int i;
00115 int j;
00116
00117 j = s_playermodel.modelpage * MAX_MODELSPERPAGE;
00118 for (i=0; i<PLAYERGRID_ROWS*PLAYERGRID_COLS; i++,j++)
00119 {
00120 if (j < s_playermodel.nummodels)
00121 {
00122
00123 s_playermodel.pics[i].generic.name = s_playermodel.modelnames[j];
00124 s_playermodel.picbuttons[i].generic.flags &= ~QMF_INACTIVE;
00125 }
00126 else
00127 {
00128
00129 s_playermodel.pics[i].generic.name = NULL;
00130 s_playermodel.picbuttons[i].generic.flags |= QMF_INACTIVE;
00131 }
00132
00133 s_playermodel.pics[i].generic.flags &= ~QMF_HIGHLIGHT;
00134 s_playermodel.pics[i].shader = 0;
00135 s_playermodel.picbuttons[i].generic.flags |= QMF_PULSEIFFOCUS;
00136 }
00137
00138 if (s_playermodel.selectedmodel/MAX_MODELSPERPAGE == s_playermodel.modelpage)
00139 {
00140
00141 i = s_playermodel.selectedmodel % MAX_MODELSPERPAGE;
00142
00143 s_playermodel.pics[i].generic.flags |= QMF_HIGHLIGHT;
00144 s_playermodel.picbuttons[i].generic.flags &= ~QMF_PULSEIFFOCUS;
00145 }
00146
00147 if (s_playermodel.numpages > 1)
00148 {
00149 if (s_playermodel.modelpage > 0)
00150 s_playermodel.left.generic.flags &= ~QMF_INACTIVE;
00151 else
00152 s_playermodel.left.generic.flags |= QMF_INACTIVE;
00153
00154 if (s_playermodel.modelpage < s_playermodel.numpages-1)
00155 s_playermodel.right.generic.flags &= ~QMF_INACTIVE;
00156 else
00157 s_playermodel.right.generic.flags |= QMF_INACTIVE;
00158 }
00159 else
00160 {
00161
00162 s_playermodel.left.generic.flags |= QMF_INACTIVE;
00163 s_playermodel.right.generic.flags |= QMF_INACTIVE;
00164 }
00165 }
00166
00167
00168
00169
00170
00171
00172 static void PlayerModel_UpdateModel( void )
00173 {
00174 vec3_t viewangles;
00175 vec3_t moveangles;
00176
00177 memset( &s_playermodel.playerinfo, 0, sizeof(playerInfo_t) );
00178
00179 viewangles[YAW] = 180 - 30;
00180 viewangles[PITCH] = 0;
00181 viewangles[ROLL] = 0;
00182 VectorClear( moveangles );
00183
00184 UI_PlayerInfo_SetModel( &s_playermodel.playerinfo, s_playermodel.modelskin );
00185 UI_PlayerInfo_SetInfo( &s_playermodel.playerinfo, LEGS_IDLE, TORSO_STAND, viewangles, moveangles, WP_MACHINEGUN, qfalse );
00186 }
00187
00188
00189
00190
00191
00192
00193 static void PlayerModel_SaveChanges( void )
00194 {
00195 trap_Cvar_Set( "model", s_playermodel.modelskin );
00196 trap_Cvar_Set( "headmodel", s_playermodel.modelskin );
00197 trap_Cvar_Set( "team_model", s_playermodel.modelskin );
00198 trap_Cvar_Set( "team_headmodel", s_playermodel.modelskin );
00199 }
00200
00201
00202
00203
00204
00205
00206 static void PlayerModel_MenuEvent( void* ptr, int event )
00207 {
00208 if (event != QM_ACTIVATED)
00209 return;
00210
00211 switch (((menucommon_s*)ptr)->id)
00212 {
00213 case ID_PREVPAGE:
00214 if (s_playermodel.modelpage > 0)
00215 {
00216 s_playermodel.modelpage--;
00217 PlayerModel_UpdateGrid();
00218 }
00219 break;
00220
00221 case ID_NEXTPAGE:
00222 if (s_playermodel.modelpage < s_playermodel.numpages-1)
00223 {
00224 s_playermodel.modelpage++;
00225 PlayerModel_UpdateGrid();
00226 }
00227 break;
00228
00229 case ID_BACK:
00230 PlayerModel_SaveChanges();
00231 UI_PopMenu();
00232 break;
00233 }
00234 }
00235
00236
00237
00238
00239
00240
00241 static sfxHandle_t PlayerModel_MenuKey( int key )
00242 {
00243 menucommon_s* m;
00244 int picnum;
00245
00246 switch (key)
00247 {
00248 case K_KP_LEFTARROW:
00249 case K_LEFTARROW:
00250 m = Menu_ItemAtCursor(&s_playermodel.menu);
00251 picnum = m->id - ID_PLAYERPIC0;
00252 if (picnum >= 0 && picnum <= 15)
00253 {
00254 if (picnum > 0)
00255 {
00256 Menu_SetCursor(&s_playermodel.menu,s_playermodel.menu.cursor-1);
00257 return (menu_move_sound);
00258
00259 }
00260 else if (s_playermodel.modelpage > 0)
00261 {
00262 s_playermodel.modelpage--;
00263 Menu_SetCursor(&s_playermodel.menu,s_playermodel.menu.cursor+15);
00264 PlayerModel_UpdateGrid();
00265 return (menu_move_sound);
00266 }
00267 else
00268 return (menu_buzz_sound);
00269 }
00270 break;
00271
00272 case K_KP_RIGHTARROW:
00273 case K_RIGHTARROW:
00274 m = Menu_ItemAtCursor(&s_playermodel.menu);
00275 picnum = m->id - ID_PLAYERPIC0;
00276 if (picnum >= 0 && picnum <= 15)
00277 {
00278 if ((picnum < 15) && (s_playermodel.modelpage*MAX_MODELSPERPAGE + picnum+1 < s_playermodel.nummodels))
00279 {
00280 Menu_SetCursor(&s_playermodel.menu,s_playermodel.menu.cursor+1);
00281 return (menu_move_sound);
00282 }
00283 else if ((picnum == 15) && (s_playermodel.modelpage < s_playermodel.numpages-1))
00284 {
00285 s_playermodel.modelpage++;
00286 Menu_SetCursor(&s_playermodel.menu,s_playermodel.menu.cursor-15);
00287 PlayerModel_UpdateGrid();
00288 return (menu_move_sound);
00289 }
00290 else
00291 return (menu_buzz_sound);
00292 }
00293 break;
00294
00295 case K_MOUSE2:
00296 case K_ESCAPE:
00297 PlayerModel_SaveChanges();
00298 break;
00299 }
00300
00301 return ( Menu_DefaultKey( &s_playermodel.menu, key ) );
00302 }
00303
00304
00305
00306
00307
00308
00309 static void PlayerModel_PicEvent( void* ptr, int event )
00310 {
00311 int modelnum;
00312 int maxlen;
00313 char* buffptr;
00314 char* pdest;
00315 int i;
00316
00317 if (event != QM_ACTIVATED)
00318 return;
00319
00320 for (i=0; i<PLAYERGRID_ROWS*PLAYERGRID_COLS; i++)
00321 {
00322
00323 s_playermodel.pics[i].generic.flags &= ~QMF_HIGHLIGHT;
00324 s_playermodel.picbuttons[i].generic.flags |= QMF_PULSEIFFOCUS;
00325 }
00326
00327
00328 i = ((menucommon_s*)ptr)->id - ID_PLAYERPIC0;
00329 s_playermodel.pics[i].generic.flags |= QMF_HIGHLIGHT;
00330 s_playermodel.picbuttons[i].generic.flags &= ~QMF_PULSEIFFOCUS;
00331
00332
00333 modelnum = s_playermodel.modelpage*MAX_MODELSPERPAGE + i;
00334 buffptr = s_playermodel.modelnames[modelnum] + strlen("models/players/");
00335 pdest = strstr(buffptr,"icon_");
00336 if (pdest)
00337 {
00338
00339 Q_strncpyz(s_playermodel.modelskin,buffptr,pdest-buffptr+1);
00340 strcat(s_playermodel.modelskin,pdest + 5);
00341
00342
00343 maxlen = pdest-buffptr;
00344 if (maxlen > 16)
00345 maxlen = 16;
00346 Q_strncpyz( s_playermodel.modelname.string, buffptr, maxlen );
00347 Q_strupr( s_playermodel.modelname.string );
00348
00349
00350 maxlen = strlen(pdest+5)+1;
00351 if (maxlen > 16)
00352 maxlen = 16;
00353 Q_strncpyz( s_playermodel.skinname.string, pdest+5, maxlen );
00354 Q_strupr( s_playermodel.skinname.string );
00355
00356 s_playermodel.selectedmodel = modelnum;
00357
00358 if( trap_MemoryRemaining() > LOW_MEMORY ) {
00359 PlayerModel_UpdateModel();
00360 }
00361 }
00362 }
00363
00364
00365
00366
00367
00368
00369 static void PlayerModel_DrawPlayer( void *self )
00370 {
00371 menubitmap_s* b;
00372
00373 b = (menubitmap_s*) self;
00374
00375 if( trap_MemoryRemaining() <= LOW_MEMORY ) {
00376 UI_DrawProportionalString( b->generic.x, b->generic.y + b->height / 2, "LOW MEMORY", UI_LEFT, color_red );
00377 return;
00378 }
00379
00380 UI_DrawPlayer( b->generic.x, b->generic.y, b->width, b->height, &s_playermodel.playerinfo, uis.realtime/2 );
00381 }
00382
00383
00384
00385
00386
00387
00388 static void PlayerModel_BuildList( void )
00389 {
00390 int numdirs;
00391 int numfiles;
00392 char dirlist[2048];
00393 char filelist[2048];
00394 char skinname[64];
00395 char* dirptr;
00396 char* fileptr;
00397 int i;
00398 int j;
00399 int dirlen;
00400 int filelen;
00401 qboolean precache;
00402
00403 precache = trap_Cvar_VariableValue("com_buildscript");
00404
00405 s_playermodel.modelpage = 0;
00406 s_playermodel.nummodels = 0;
00407
00408
00409 numdirs = trap_FS_GetFileList("models/players", "/", dirlist, 2048 );
00410 dirptr = dirlist;
00411 for (i=0; i<numdirs && s_playermodel.nummodels < MAX_PLAYERMODELS; i++,dirptr+=dirlen+1)
00412 {
00413 dirlen = strlen(dirptr);
00414
00415 if (dirlen && dirptr[dirlen-1]=='/') dirptr[dirlen-1]='\0';
00416
00417 if (!strcmp(dirptr,".") || !strcmp(dirptr,".."))
00418 continue;
00419
00420
00421 numfiles = trap_FS_GetFileList( va("models/players/%s",dirptr), "tga", filelist, 2048 );
00422 fileptr = filelist;
00423 for (j=0; j<numfiles && s_playermodel.nummodels < MAX_PLAYERMODELS;j++,fileptr+=filelen+1)
00424 {
00425 filelen = strlen(fileptr);
00426
00427 COM_StripExtension(fileptr,skinname);
00428
00429
00430 if (!Q_stricmpn(skinname,"icon_",5))
00431 {
00432 Com_sprintf( s_playermodel.modelnames[s_playermodel.nummodels++],
00433 sizeof( s_playermodel.modelnames[s_playermodel.nummodels] ),
00434 "models/players/%s/%s", dirptr, skinname );
00435
00436
00437 }
00438
00439 if( precache ) {
00440 trap_S_RegisterSound( va( "sound/player/announce/%s_wins.wav", skinname), qfalse );
00441 }
00442 }
00443 }
00444
00445
00446
00447 s_playermodel.numpages = s_playermodel.nummodels/MAX_MODELSPERPAGE;
00448 if (s_playermodel.nummodels % MAX_MODELSPERPAGE)
00449 s_playermodel.numpages++;
00450 }
00451
00452
00453
00454
00455
00456
00457 static void PlayerModel_SetMenuItems( void )
00458 {
00459 int i;
00460 int maxlen;
00461 char modelskin[64];
00462 char* buffptr;
00463 char* pdest;
00464
00465
00466 trap_Cvar_VariableStringBuffer( "name", s_playermodel.playername.string, 16 );
00467 Q_CleanStr( s_playermodel.playername.string );
00468
00469
00470 trap_Cvar_VariableStringBuffer( "model", s_playermodel.modelskin, 64 );
00471
00472
00473 for (i=0; i<s_playermodel.nummodels; i++)
00474 {
00475
00476 buffptr = s_playermodel.modelnames[i] + strlen("models/players/");
00477 pdest = strstr(buffptr,"icon_");
00478 if (pdest)
00479 {
00480 Q_strncpyz(modelskin,buffptr,pdest-buffptr+1);
00481 strcat(modelskin,pdest + 5);
00482 }
00483 else
00484 continue;
00485
00486 if (!Q_stricmp( s_playermodel.modelskin, modelskin ))
00487 {
00488
00489 s_playermodel.selectedmodel = i;
00490 s_playermodel.modelpage = i/MAX_MODELSPERPAGE;
00491
00492
00493 maxlen = pdest-buffptr;
00494 if (maxlen > 16)
00495 maxlen = 16;
00496 Q_strncpyz( s_playermodel.modelname.string, buffptr, maxlen );
00497 Q_strupr( s_playermodel.modelname.string );
00498
00499
00500 maxlen = strlen(pdest+5)+1;
00501 if (maxlen > 16)
00502 maxlen = 16;
00503 Q_strncpyz( s_playermodel.skinname.string, pdest+5, maxlen );
00504 Q_strupr( s_playermodel.skinname.string );
00505 break;
00506 }
00507 }
00508 }
00509
00510
00511
00512
00513
00514
00515 static void PlayerModel_MenuInit( void )
00516 {
00517 int i;
00518 int j;
00519 int k;
00520 int x;
00521 int y;
00522 static char playername[32];
00523 static char modelname[32];
00524 static char skinname[32];
00525
00526
00527 memset( &s_playermodel, 0 ,sizeof(playermodel_t) );
00528
00529 PlayerModel_Cache();
00530
00531 s_playermodel.menu.key = PlayerModel_MenuKey;
00532 s_playermodel.menu.wrapAround = qtrue;
00533 s_playermodel.menu.fullscreen = qtrue;
00534
00535 s_playermodel.banner.generic.type = MTYPE_BTEXT;
00536 s_playermodel.banner.generic.x = 320;
00537 s_playermodel.banner.generic.y = 16;
00538 s_playermodel.banner.string = "PLAYER MODEL";
00539 s_playermodel.banner.color = color_white;
00540 s_playermodel.banner.style = UI_CENTER;
00541
00542 s_playermodel.framel.generic.type = MTYPE_BITMAP;
00543 s_playermodel.framel.generic.name = MODEL_FRAMEL;
00544 s_playermodel.framel.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
00545 s_playermodel.framel.generic.x = 0;
00546 s_playermodel.framel.generic.y = 78;
00547 s_playermodel.framel.width = 256;
00548 s_playermodel.framel.height = 329;
00549
00550 s_playermodel.framer.generic.type = MTYPE_BITMAP;
00551 s_playermodel.framer.generic.name = MODEL_FRAMER;
00552 s_playermodel.framer.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
00553 s_playermodel.framer.generic.x = 376;
00554 s_playermodel.framer.generic.y = 76;
00555 s_playermodel.framer.width = 256;
00556 s_playermodel.framer.height = 334;
00557
00558 s_playermodel.ports.generic.type = MTYPE_BITMAP;
00559 s_playermodel.ports.generic.name = MODEL_PORTS;
00560 s_playermodel.ports.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
00561 s_playermodel.ports.generic.x = 50;
00562 s_playermodel.ports.generic.y = 59;
00563 s_playermodel.ports.width = 274;
00564 s_playermodel.ports.height = 274;
00565
00566 y = 59;
00567 for (i=0,k=0; i<PLAYERGRID_ROWS; i++)
00568 {
00569 x = 50;
00570 for (j=0; j<PLAYERGRID_COLS; j++,k++)
00571 {
00572 s_playermodel.pics[k].generic.type = MTYPE_BITMAP;
00573 s_playermodel.pics[k].generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
00574 s_playermodel.pics[k].generic.x = x;
00575 s_playermodel.pics[k].generic.y = y;
00576 s_playermodel.pics[k].width = 64;
00577 s_playermodel.pics[k].height = 64;
00578 s_playermodel.pics[k].focuspic = MODEL_SELECTED;
00579 s_playermodel.pics[k].focuscolor = colorRed;
00580
00581 s_playermodel.picbuttons[k].generic.type = MTYPE_BITMAP;
00582 s_playermodel.picbuttons[k].generic.flags = QMF_LEFT_JUSTIFY|QMF_NODEFAULTINIT|QMF_PULSEIFFOCUS;
00583 s_playermodel.picbuttons[k].generic.id = ID_PLAYERPIC0+k;
00584 s_playermodel.picbuttons[k].generic.callback = PlayerModel_PicEvent;
00585 s_playermodel.picbuttons[k].generic.x = x - 16;
00586 s_playermodel.picbuttons[k].generic.y = y - 16;
00587 s_playermodel.picbuttons[k].generic.left = x;
00588 s_playermodel.picbuttons[k].generic.top = y;
00589 s_playermodel.picbuttons[k].generic.right = x + 64;
00590 s_playermodel.picbuttons[k].generic.bottom = y + 64;
00591 s_playermodel.picbuttons[k].width = 128;
00592 s_playermodel.picbuttons[k].height = 128;
00593 s_playermodel.picbuttons[k].focuspic = MODEL_SELECT;
00594 s_playermodel.picbuttons[k].focuscolor = colorRed;
00595
00596 x += 64+6;
00597 }
00598 y += 64+6;
00599 }
00600
00601 s_playermodel.playername.generic.type = MTYPE_PTEXT;
00602 s_playermodel.playername.generic.flags = QMF_CENTER_JUSTIFY|QMF_INACTIVE;
00603 s_playermodel.playername.generic.x = 320;
00604 s_playermodel.playername.generic.y = 440;
00605 s_playermodel.playername.string = playername;
00606 s_playermodel.playername.style = UI_CENTER;
00607 s_playermodel.playername.color = text_color_normal;
00608
00609 s_playermodel.modelname.generic.type = MTYPE_PTEXT;
00610 s_playermodel.modelname.generic.flags = QMF_CENTER_JUSTIFY|QMF_INACTIVE;
00611 s_playermodel.modelname.generic.x = 497;
00612 s_playermodel.modelname.generic.y = 54;
00613 s_playermodel.modelname.string = modelname;
00614 s_playermodel.modelname.style = UI_CENTER;
00615 s_playermodel.modelname.color = text_color_normal;
00616
00617 s_playermodel.skinname.generic.type = MTYPE_PTEXT;
00618 s_playermodel.skinname.generic.flags = QMF_CENTER_JUSTIFY|QMF_INACTIVE;
00619 s_playermodel.skinname.generic.x = 497;
00620 s_playermodel.skinname.generic.y = 394;
00621 s_playermodel.skinname.string = skinname;
00622 s_playermodel.skinname.style = UI_CENTER;
00623 s_playermodel.skinname.color = text_color_normal;
00624
00625 s_playermodel.player.generic.type = MTYPE_BITMAP;
00626 s_playermodel.player.generic.flags = QMF_INACTIVE;
00627 s_playermodel.player.generic.ownerdraw = PlayerModel_DrawPlayer;
00628 s_playermodel.player.generic.x = 400;
00629 s_playermodel.player.generic.y = -40;
00630 s_playermodel.player.width = 32*10;
00631 s_playermodel.player.height = 56*10;
00632
00633 s_playermodel.arrows.generic.type = MTYPE_BITMAP;
00634 s_playermodel.arrows.generic.name = MODEL_ARROWS;
00635 s_playermodel.arrows.generic.flags = QMF_INACTIVE;
00636 s_playermodel.arrows.generic.x = 125;
00637 s_playermodel.arrows.generic.y = 340;
00638 s_playermodel.arrows.width = 128;
00639 s_playermodel.arrows.height = 32;
00640
00641 s_playermodel.left.generic.type = MTYPE_BITMAP;
00642 s_playermodel.left.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
00643 s_playermodel.left.generic.callback = PlayerModel_MenuEvent;
00644 s_playermodel.left.generic.id = ID_PREVPAGE;
00645 s_playermodel.left.generic.x = 125;
00646 s_playermodel.left.generic.y = 340;
00647 s_playermodel.left.width = 64;
00648 s_playermodel.left.height = 32;
00649 s_playermodel.left.focuspic = MODEL_ARROWSL;
00650
00651 s_playermodel.right.generic.type = MTYPE_BITMAP;
00652 s_playermodel.right.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
00653 s_playermodel.right.generic.callback = PlayerModel_MenuEvent;
00654 s_playermodel.right.generic.id = ID_NEXTPAGE;
00655 s_playermodel.right.generic.x = 125+61;
00656 s_playermodel.right.generic.y = 340;
00657 s_playermodel.right.width = 64;
00658 s_playermodel.right.height = 32;
00659 s_playermodel.right.focuspic = MODEL_ARROWSR;
00660
00661 s_playermodel.back.generic.type = MTYPE_BITMAP;
00662 s_playermodel.back.generic.name = MODEL_BACK0;
00663 s_playermodel.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
00664 s_playermodel.back.generic.callback = PlayerModel_MenuEvent;
00665 s_playermodel.back.generic.id = ID_BACK;
00666 s_playermodel.back.generic.x = 0;
00667 s_playermodel.back.generic.y = 480-64;
00668 s_playermodel.back.width = 128;
00669 s_playermodel.back.height = 64;
00670 s_playermodel.back.focuspic = MODEL_BACK1;
00671
00672 Menu_AddItem( &s_playermodel.menu, &s_playermodel.banner );
00673 Menu_AddItem( &s_playermodel.menu, &s_playermodel.framel );
00674 Menu_AddItem( &s_playermodel.menu, &s_playermodel.framer );
00675 Menu_AddItem( &s_playermodel.menu, &s_playermodel.ports );
00676 Menu_AddItem( &s_playermodel.menu, &s_playermodel.playername );
00677 Menu_AddItem( &s_playermodel.menu, &s_playermodel.modelname );
00678 Menu_AddItem( &s_playermodel.menu, &s_playermodel.skinname );
00679
00680 for (i=0; i<MAX_MODELSPERPAGE; i++)
00681 {
00682 Menu_AddItem( &s_playermodel.menu, &s_playermodel.pics[i] );
00683 Menu_AddItem( &s_playermodel.menu, &s_playermodel.picbuttons[i] );
00684 }
00685
00686 Menu_AddItem( &s_playermodel.menu, &s_playermodel.player );
00687 Menu_AddItem( &s_playermodel.menu, &s_playermodel.arrows );
00688 Menu_AddItem( &s_playermodel.menu, &s_playermodel.left );
00689 Menu_AddItem( &s_playermodel.menu, &s_playermodel.right );
00690 Menu_AddItem( &s_playermodel.menu, &s_playermodel.back );
00691
00692
00693
00694
00695
00696 PlayerModel_SetMenuItems();
00697
00698
00699 PlayerModel_UpdateGrid();
00700 PlayerModel_UpdateModel();
00701 }
00702
00703
00704
00705
00706
00707
00708 void PlayerModel_Cache( void )
00709 {
00710 int i;
00711
00712 for( i = 0; playermodel_artlist[i]; i++ ) {
00713 trap_R_RegisterShaderNoMip( playermodel_artlist[i] );
00714 }
00715
00716 PlayerModel_BuildList();
00717 for( i = 0; i < s_playermodel.nummodels; i++ ) {
00718 trap_R_RegisterShaderNoMip( s_playermodel.modelnames[i] );
00719 }
00720 }
00721
00722 void UI_PlayerModelMenu(void)
00723 {
00724 PlayerModel_MenuInit();
00725
00726 UI_PushMenu( &s_playermodel.menu );
00727
00728 Menu_SetCursorToItem( &s_playermodel.menu, &s_playermodel.pics[s_playermodel.selectedmodel % MAX_MODELSPERPAGE] );
00729 }
00730
00731