Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

ui_playermodel.c

Go to the documentation of this file.
00001 /*
00002 ===========================================================================
00003 Copyright (C) 1999-2005 Id Software, Inc.
00004 
00005 This file is part of Quake III Arena source code.
00006 
00007 Quake III Arena source code is free software; you can redistribute it
00008 and/or modify it under the terms of the GNU General Public License as
00009 published by the Free Software Foundation; either version 2 of the License,
00010 or (at your option) any later version.
00011 
00012 Quake III Arena source code is distributed in the hope that it will be
00013 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Foobar; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
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 PlayerModel_UpdateGrid
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             // model/skin portrait
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             // dead slot
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         // set selected model
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         // hide left/right markers
00162         s_playermodel.left.generic.flags |= QMF_INACTIVE;
00163         s_playermodel.right.generic.flags |= QMF_INACTIVE;
00164     }
00165 }
00166 
00167 /*
00168 =================
00169 PlayerModel_UpdateModel
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 PlayerModel_SaveChanges
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 PlayerModel_MenuEvent
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 PlayerModel_MenuKey
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 PlayerModel_PicEvent
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         // reset
00323         s_playermodel.pics[i].generic.flags       &= ~QMF_HIGHLIGHT;
00324         s_playermodel.picbuttons[i].generic.flags |= QMF_PULSEIFFOCUS;
00325     }
00326 
00327     // set selected
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     // get model and strip icon_
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         // track the whole model/skin name
00339         Q_strncpyz(s_playermodel.modelskin,buffptr,pdest-buffptr+1);
00340         strcat(s_playermodel.modelskin,pdest + 5);
00341 
00342         // seperate the model name
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         // seperate the skin name
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 PlayerModel_DrawPlayer
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 PlayerModel_BuildList
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     // iterate directory of all player models
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         // iterate all skin files in directory
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             // look for icon_????
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                 //if (s_playermodel.nummodels >= MAX_PLAYERMODELS)
00436                 //  return;
00437             }
00438 
00439             if( precache ) {
00440                 trap_S_RegisterSound( va( "sound/player/announce/%s_wins.wav", skinname), qfalse );
00441             }
00442         }
00443     }   
00444 
00445     //APSFIXME - Degenerate no models case
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 PlayerModel_SetMenuItems
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     // name
00466     trap_Cvar_VariableStringBuffer( "name", s_playermodel.playername.string, 16 );
00467     Q_CleanStr( s_playermodel.playername.string );
00468 
00469     // model
00470     trap_Cvar_VariableStringBuffer( "model", s_playermodel.modelskin, 64 );
00471     
00472     // find model in our list
00473     for (i=0; i<s_playermodel.nummodels; i++)
00474     {
00475         // strip icon_
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             // found pic, set selection here        
00489             s_playermodel.selectedmodel = i;
00490             s_playermodel.modelpage     = i/MAX_MODELSPERPAGE;
00491 
00492             // seperate the model name
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             // seperate the skin name
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 PlayerModel_MenuInit
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     // zero set all our globals
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     // find all available models
00693 //  PlayerModel_BuildList();
00694 
00695     // set initial states
00696     PlayerModel_SetMenuItems();
00697 
00698     // update user interface
00699     PlayerModel_UpdateGrid();
00700     PlayerModel_UpdateModel();
00701 }
00702 
00703 /*
00704 =================
00705 PlayerModel_Cache
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 

Generated on Thu Aug 25 12:37:42 2005 for Quake III Arena by  doxygen 1.3.9.1