123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867 |
- //
- /*
- =======================================================================
- USER INTERFACE SABER LOADING & DISPLAY CODE
- =======================================================================
- */
- // leave this at the top of all UI_xxxx files for PCH reasons...
- //
- #include "../server/exe_headers.h"
- #include "ui_local.h"
- #include "ui_shared.h"
- #include "../ghoul2/G2.h"
- #define MAX_SABER_DATA_SIZE 0x8000
- // On Xbox, static linking lets us steal the buffer from wp_saberLoad
- // Just make sure that the saber data size is the same
- #ifdef _XBOX
- extern char SaberParms[MAX_SABER_DATA_SIZE];
- #else
- char SaberParms[MAX_SABER_DATA_SIZE];
- #endif
- qboolean ui_saber_parms_parsed = qfalse;
- static qhandle_t redSaberGlowShader;
- static qhandle_t redSaberCoreShader;
- static qhandle_t orangeSaberGlowShader;
- static qhandle_t orangeSaberCoreShader;
- static qhandle_t yellowSaberGlowShader;
- static qhandle_t yellowSaberCoreShader;
- static qhandle_t greenSaberGlowShader;
- static qhandle_t greenSaberCoreShader;
- static qhandle_t blueSaberGlowShader;
- static qhandle_t blueSaberCoreShader;
- static qhandle_t purpleSaberGlowShader;
- static qhandle_t purpleSaberCoreShader;
- void UI_CacheSaberGlowGraphics( void )
- {//FIXME: these get fucked by vid_restarts
- redSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/red_glow" );
- redSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/red_line" );
- orangeSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/orange_glow" );
- orangeSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/orange_line" );
- yellowSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/yellow_glow" );
- yellowSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/yellow_line" );
- greenSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/green_glow" );
- greenSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/green_line" );
- blueSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/blue_glow" );
- blueSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/blue_line" );
- purpleSaberGlowShader = re.RegisterShader( "gfx/effects/sabers/purple_glow" );
- purpleSaberCoreShader = re.RegisterShader( "gfx/effects/sabers/purple_line" );
- }
- qboolean UI_ParseLiteral( const char **data, const char *string )
- {
- const char *token;
- token = COM_ParseExt( data, qtrue );
- if ( token[0] == 0 )
- {
- ui.Printf( "unexpected EOF\n" );
- return qtrue;
- }
- if ( Q_stricmp( token, string ) )
- {
- ui.Printf( "required string '%s' missing\n", string );
- return qtrue;
- }
- return qfalse;
- }
- qboolean UI_SaberParseParm( const char *saberName, const char *parmname, char *saberData )
- {
- const char *token;
- const char *value;
- const char *p;
- if ( !saberName || !saberName[0] )
- {
- return qfalse;
- }
- //try to parse it out
- p = SaberParms;
- COM_BeginParseSession();
- // look for the right saber
- while ( p )
- {
- token = COM_ParseExt( &p, qtrue );
- if ( token[0] == 0 )
- {
- return qfalse;
- }
- if ( !Q_stricmp( token, saberName ) )
- {
- break;
- }
- SkipBracedSection( &p );
- }
- if ( !p )
- {
- return qfalse;
- }
- if ( UI_ParseLiteral( &p, "{" ) )
- {
- return qfalse;
- }
-
- // parse the saber info block
- while ( 1 )
- {
- token = COM_ParseExt( &p, qtrue );
- if ( !token[0] )
- {
- ui.Printf( S_COLOR_RED"ERROR: unexpected EOF while parsing '%s'\n", saberName );
- return qfalse;
- }
- if ( !Q_stricmp( token, "}" ) )
- {
- break;
- }
- if ( !Q_stricmp( token, parmname ) )
- {
- if ( COM_ParseString( &p, &value ) )
- {
- continue;
- }
- strcpy( saberData, value );
- return qtrue;
- }
- SkipRestOfLine( &p );
- continue;
- }
- return qfalse;
- }
- qboolean UI_SaberProperNameForSaber( const char *saberName, char *saberProperName )
- {
- return UI_SaberParseParm( saberName, "name", saberProperName );
- }
- qboolean UI_SaberModelForSaber( const char *saberName, char *saberModel )
- {
- return UI_SaberParseParm( saberName, "saberModel", saberModel );
- }
- qboolean UI_SaberSkinForSaber( const char *saberName, char *saberSkin )
- {
- return UI_SaberParseParm( saberName, "customSkin", saberSkin );
- }
- qboolean UI_SaberTypeForSaber( const char *saberName, char *saberType )
- {
- return UI_SaberParseParm( saberName, "saberType", saberType );
- }
- int UI_SaberNumBladesForSaber( const char *saberName )
- {
- char numBladesString[8]={0};
- UI_SaberParseParm( saberName, "numBlades", numBladesString );
- int numBlades = atoi( numBladesString );
- if ( numBlades < 1 )
- {
- numBlades = 1;
- }
- else if ( numBlades > 8 )
- {
- numBlades = 8;
- }
- return numBlades;
- }
- float UI_SaberBladeLengthForSaber( const char *saberName, int bladeNum )
- {
- char lengthString[8]={0};
- float length = 40.0f;
- UI_SaberParseParm( saberName, "saberLength", lengthString );
- if ( lengthString[0] )
- {
- length = atof( lengthString );
- if ( length < 0.0f )
- {
- length = 0.0f;
- }
- }
- UI_SaberParseParm( saberName, va("saberLength%d", bladeNum+1), lengthString );
- if ( lengthString[0] )
- {
- length = atof( lengthString );
- if ( length < 0.0f )
- {
- length = 0.0f;
- }
- }
- return length;
- }
- float UI_SaberBladeRadiusForSaber( const char *saberName, int bladeNum )
- {
- char radiusString[8]={0};
- float radius = 3.0f;
- UI_SaberParseParm( saberName, "saberRadius", radiusString );
- if ( radiusString[0] )
- {
- radius = atof( radiusString );
- if ( radius < 0.0f )
- {
- radius = 0.0f;
- }
- }
- UI_SaberParseParm( saberName, va("saberRadius%d", bladeNum+1), radiusString );
- if ( radiusString[0] )
- {
- radius = atof( radiusString );
- if ( radius < 0.0f )
- {
- radius = 0.0f;
- }
- }
- return radius;
- }
- void UI_SaberLoadParms( void )
- {
- int len, totallen, saberExtFNLen, fileCnt, i;
- char *buffer, *holdChar, *marker;
- char saberExtensionListBuf[2048]; // The list of file names read in
- //ui.Printf( "UI Parsing *.sab saber definitions\n" );
-
- ui_saber_parms_parsed = qtrue;
- UI_CacheSaberGlowGraphics();
- //set where to store the first one
- totallen = 0;
- marker = SaberParms;
- marker[0] = '\0';
- //now load in the sabers
- fileCnt = ui.FS_GetFileList("ext_data/sabers", ".sab", saberExtensionListBuf, sizeof(saberExtensionListBuf) );
- holdChar = saberExtensionListBuf;
- for ( i = 0; i < fileCnt; i++, holdChar += saberExtFNLen + 1 )
- {
- saberExtFNLen = strlen( holdChar );
- len = ui.FS_ReadFile( va( "ext_data/sabers/%s", holdChar), (void **) &buffer );
- if ( len == -1 )
- {
- ui.Printf( "UI_SaberLoadParms: error reading %s\n", holdChar );
- }
- else
- {
- if ( totallen && *(marker-1) == '}' )
- {//don't let it end on a } because that should be a stand-alone token
- strcat( marker, " " );
- totallen++;
- marker++;
- }
- len = COM_Compress( buffer );
- if ( totallen + len >= MAX_SABER_DATA_SIZE ) {
- Com_Error( ERR_FATAL, "UI_SaberLoadParms: ran out of space before reading %s\n(you must make the .npc files smaller)", holdChar );
- }
- strcat( marker, buffer );
- ui.FS_FreeFile( buffer );
- totallen += len;
- marker += len;
- }
- }
- }
- void UI_DoSaber( vec3_t origin, vec3_t dir, float length, float lengthMax, float radius, saber_colors_t color )
- {
- vec3_t mid, rgb={1,1,1};
- qhandle_t blade = 0, glow = 0;
- refEntity_t saber;
- float radiusmult;
- if ( length < 0.5f )
- {
- // if the thing is so short, just forget even adding me.
- return;
- }
- // Find the midpoint of the saber for lighting purposes
- VectorMA( origin, length * 0.5f, dir, mid );
- switch( color )
- {
- case SABER_RED:
- glow = redSaberGlowShader;
- blade = redSaberCoreShader;
- VectorSet( rgb, 1.0f, 0.2f, 0.2f );
- break;
- case SABER_ORANGE:
- glow = orangeSaberGlowShader;
- blade = orangeSaberCoreShader;
- VectorSet( rgb, 1.0f, 0.5f, 0.1f );
- break;
- case SABER_YELLOW:
- glow = yellowSaberGlowShader;
- blade = yellowSaberCoreShader;
- VectorSet( rgb, 1.0f, 1.0f, 0.2f );
- break;
- case SABER_GREEN:
- glow = greenSaberGlowShader;
- blade = greenSaberCoreShader;
- VectorSet( rgb, 0.2f, 1.0f, 0.2f );
- break;
- case SABER_BLUE:
- glow = blueSaberGlowShader;
- blade = blueSaberCoreShader;
- VectorSet( rgb, 0.2f, 0.4f, 1.0f );
- break;
- case SABER_PURPLE:
- glow = purpleSaberGlowShader;
- blade = purpleSaberCoreShader;
- VectorSet( rgb, 0.9f, 0.2f, 1.0f );
- break;
- }
- // always add a light because sabers cast a nice glow before they slice you in half!! or something...
- /*
- if ( doLight )
- {//FIXME: RGB combine all the colors of the sabers you're using into one averaged color!
- cgi_R_AddLightToScene( mid, (length*2.0f) + (random()*8.0f), rgb[0], rgb[1], rgb[2] );
- }
- */
- memset( &saber, 0, sizeof( refEntity_t ));
- // Saber glow is it's own ref type because it uses a ton of sprites, otherwise it would eat up too many
- // refEnts to do each glow blob individually
- saber.saberLength = length;
- // Jeff, I did this because I foolishly wished to have a bright halo as the saber is unleashed.
- // It's not quite what I'd hoped tho. If you have any ideas, go for it! --Pat
- if (length < lengthMax )
- {
- radiusmult = 1.0 + (2.0 / length); // Note this creates a curve, and length cannot be < 0.5.
- }
- else
- {
- radiusmult = 1.0;
- }
- float radiusRange = radius * 0.075f;
- float radiusStart = radius-radiusRange;
- saber.radius = (radiusStart + crandom() * radiusRange)*radiusmult;
- //saber.radius = (2.8f + crandom() * 0.2f)*radiusmult;
- VectorCopy( origin, saber.origin );
- VectorCopy( dir, saber.axis[0] );
- saber.reType = RT_SABER_GLOW;
- saber.customShader = glow;
- saber.shaderRGBA[0] = saber.shaderRGBA[1] = saber.shaderRGBA[2] = saber.shaderRGBA[3] = 0xff;
- //saber.renderfx = rfx;
- DC->addRefEntityToScene( &saber );
- // Do the hot core
- VectorMA( origin, length, dir, saber.origin );
- VectorMA( origin, -1, dir, saber.oldorigin );
- saber.customShader = blade;
- saber.reType = RT_LINE;
- radiusStart = radius/3.0f;
- saber.radius = (radiusStart + crandom() * radiusRange)*radiusmult;
- // saber.radius = (1.0 + crandom() * 0.2f)*radiusmult;
- DC->addRefEntityToScene( &saber );
- }
- saber_colors_t TranslateSaberColor( const char *name )
- {
- if ( !Q_stricmp( name, "red" ) )
- {
- return SABER_RED;
- }
- if ( !Q_stricmp( name, "orange" ) )
- {
- return SABER_ORANGE;
- }
- if ( !Q_stricmp( name, "yellow" ) )
- {
- return SABER_YELLOW;
- }
- if ( !Q_stricmp( name, "green" ) )
- {
- return SABER_GREEN;
- }
- if ( !Q_stricmp( name, "blue" ) )
- {
- return SABER_BLUE;
- }
- if ( !Q_stricmp( name, "purple" ) )
- {
- return SABER_PURPLE;
- }
- if ( !Q_stricmp( name, "random" ) )
- {
- return ((saber_colors_t)(Q_irand( SABER_ORANGE, SABER_PURPLE )));
- }
- return SABER_BLUE;
- }
- saberType_t TranslateSaberType( const char *name )
- {
- if ( !Q_stricmp( name, "SABER_SINGLE" ) )
- {
- return SABER_SINGLE;
- }
- if ( !Q_stricmp( name, "SABER_STAFF" ) )
- {
- return SABER_STAFF;
- }
- if ( !Q_stricmp( name, "SABER_BROAD" ) )
- {
- return SABER_BROAD;
- }
- if ( !Q_stricmp( name, "SABER_PRONG" ) )
- {
- return SABER_PRONG;
- }
- if ( !Q_stricmp( name, "SABER_DAGGER" ) )
- {
- return SABER_DAGGER;
- }
- if ( !Q_stricmp( name, "SABER_ARC" ) )
- {
- return SABER_ARC;
- }
- if ( !Q_stricmp( name, "SABER_SAI" ) )
- {
- return SABER_SAI;
- }
- if ( !Q_stricmp( name, "SABER_CLAW" ) )
- {
- return SABER_CLAW;
- }
- if ( !Q_stricmp( name, "SABER_LANCE" ) )
- {
- return SABER_LANCE;
- }
- if ( !Q_stricmp( name, "SABER_STAR" ) )
- {
- return SABER_STAR;
- }
- if ( !Q_stricmp( name, "SABER_TRIDENT" ) )
- {
- return SABER_TRIDENT;
- }
- if ( !Q_stricmp( name, "SABER_SITH_SWORD" ) )
- {
- return SABER_SITH_SWORD;
- }
- return SABER_SINGLE;
- }
- void UI_SaberDrawBlade( itemDef_t *item, char *saberName, int saberModel, saberType_t saberType, vec3_t origin, float curYaw, int bladeNum )
- {
- char bladeColorString[MAX_QPATH];
- vec3_t angles={0};
- // if ( item->flags&(ITF_ISANYSABER) && item->flags&(ITF_ISCHARACTER) )
- { //it's bolted to a dude!
- angles[YAW] = curYaw;
- }
- // else
- // {
- // angles[PITCH] = curYaw;
- // angles[ROLL] = 90;
- // }
- if ( saberModel >= item->ghoul2.size() )
- {//uhh... invalid index!
- return;
- }
- if ( (item->flags&ITF_ISSABER) && saberModel < 2 )
- {
- DC->getCVarString( "ui_saber_color", bladeColorString, sizeof(bladeColorString) );
- }
- else//if ( item->flags&ITF_ISSABER2 ) - presumed
- {
- DC->getCVarString( "ui_saber2_color", bladeColorString, sizeof(bladeColorString) );
- }
- saber_colors_t bladeColor = TranslateSaberColor( bladeColorString );
- float bladeLength = UI_SaberBladeLengthForSaber( saberName, bladeNum );
- float bladeRadius = UI_SaberBladeRadiusForSaber( saberName, bladeNum );
- vec3_t bladeOrigin={0};
- vec3_t axis[3]={0};
- mdxaBone_t boltMatrix;
- qboolean tagHack = qfalse;
- char *tagName = va( "*blade%d", bladeNum+1 );
- int bolt = DC->g2_AddBolt( &item->ghoul2[saberModel], tagName );
- if ( bolt == -1 )
- {
- tagHack = qtrue;
- //hmm, just fall back to the most basic tag (this will also make it work with pre-JKA saber models
- bolt = DC->g2_AddBolt( &item->ghoul2[saberModel], "*flash" );
- if ( bolt == -1 )
- {//no tag_flash either?!!
- bolt = 0;
- }
- }
-
- DC->g2_GetBoltMatrix( item->ghoul2, saberModel, bolt, &boltMatrix, angles, origin, uiInfo.uiDC.realTime, NULL, vec3_origin );//NULL was cgs.model_draw
- // work the matrix axis stuff into the original axis and origins used.
- DC->g2_GiveMeVectorFromMatrix(boltMatrix, ORIGIN, bladeOrigin);
- DC->g2_GiveMeVectorFromMatrix(boltMatrix, NEGATIVE_X, axis[0]);//front (was NEGATIVE_Y, but the md3->glm exporter screws up this tag somethin' awful)
- DC->g2_GiveMeVectorFromMatrix(boltMatrix, NEGATIVE_Y, axis[1]);//right
- DC->g2_GiveMeVectorFromMatrix(boltMatrix, POSITIVE_Z, axis[2]);//up
-
- float scale = DC->xscale;
- if ( tagHack )
- {
- switch ( saberType )
- {
- case SABER_SINGLE:
- case SABER_DAGGER:
- case SABER_LANCE:
- break;
- case SABER_STAFF:
- if ( bladeNum == 1 )
- {
- VectorScale( axis[0], -1, axis[0] );
- VectorMA( bladeOrigin, 16*scale, axis[0], bladeOrigin );
- }
- break;
- case SABER_BROAD:
- if ( bladeNum == 0 )
- {
- VectorMA( bladeOrigin, -1*scale, axis[1], bladeOrigin );
- }
- else if ( bladeNum == 1 )
- {
- VectorMA( bladeOrigin, 1*scale, axis[1], bladeOrigin );
- }
- break;
- case SABER_PRONG:
- if ( bladeNum == 0 )
- {
- VectorMA( bladeOrigin, -3*scale, axis[1], bladeOrigin );
- }
- else if ( bladeNum == 1 )
- {
- VectorMA( bladeOrigin, 3*scale, axis[1], bladeOrigin );
- }
- break;
- case SABER_ARC:
- VectorSubtract( axis[1], axis[2], axis[1] );
- VectorNormalize( axis[1] );
- switch ( bladeNum )
- {
- case 0:
- VectorMA( bladeOrigin, 8*scale, axis[0], bladeOrigin );
- VectorScale( axis[0], 0.75f, axis[0] );
- VectorScale( axis[1], 0.25f, axis[1] );
- VectorAdd( axis[0], axis[1], axis[0] );
- break;
- case 1:
- VectorScale( axis[0], 0.25f, axis[0] );
- VectorScale( axis[1], 0.75f, axis[1] );
- VectorAdd( axis[0], axis[1], axis[0] );
- break;
- case 2:
- VectorMA( bladeOrigin, -8*scale, axis[0], bladeOrigin );
- VectorScale( axis[0], -0.25f, axis[0] );
- VectorScale( axis[1], 0.75f, axis[1] );
- VectorAdd( axis[0], axis[1], axis[0] );
- break;
- case 3:
- VectorMA( bladeOrigin, -16*scale, axis[0], bladeOrigin );
- VectorScale( axis[0], -0.75f, axis[0] );
- VectorScale( axis[1], 0.25f, axis[1] );
- VectorAdd( axis[0], axis[1], axis[0] );
- break;
- }
- break;
- case SABER_SAI:
- if ( bladeNum == 1 )
- {
- VectorMA( bladeOrigin, -3*scale, axis[1], bladeOrigin );
- }
- else if ( bladeNum == 2 )
- {
- VectorMA( bladeOrigin, 3*scale, axis[1], bladeOrigin );
- }
- break;
- case SABER_CLAW:
- switch ( bladeNum )
- {
- case 0:
- VectorMA( bladeOrigin, 2*scale, axis[0], bladeOrigin );
- VectorMA( bladeOrigin, 2*scale, axis[2], bladeOrigin );
- break;
- case 1:
- VectorMA( bladeOrigin, 2*scale, axis[0], bladeOrigin );
- VectorMA( bladeOrigin, 2*scale, axis[2], bladeOrigin );
- VectorMA( bladeOrigin, 2*scale, axis[1], bladeOrigin );
- break;
- case 2:
- VectorMA( bladeOrigin, 2*scale, axis[0], bladeOrigin );
- VectorMA( bladeOrigin, 2*scale, axis[2], bladeOrigin );
- VectorMA( bladeOrigin, -2*scale, axis[1], bladeOrigin );
- break;
- }
- break;
- case SABER_STAR:
- switch ( bladeNum )
- {
- case 0:
- VectorMA( bladeOrigin, 8*scale, axis[0], bladeOrigin );
- break;
- case 1:
- VectorScale( axis[0], 0.33f, axis[0] );
- VectorScale( axis[2], 0.67f, axis[2] );
- VectorAdd( axis[0], axis[2], axis[0] );
- VectorMA( bladeOrigin, 8*scale, axis[0], bladeOrigin );
- break;
- case 2:
- VectorScale( axis[0], -0.33f, axis[0] );
- VectorScale( axis[2], 0.67f, axis[2] );
- VectorAdd( axis[0], axis[2], axis[0] );
- VectorMA( bladeOrigin, 8*scale, axis[0], bladeOrigin );
- break;
- case 3:
- VectorScale( axis[0], -1, axis[0] );
- VectorMA( bladeOrigin, 8*scale, axis[0], bladeOrigin );
- break;
- case 4:
- VectorScale( axis[0], -0.33f, axis[0] );
- VectorScale( axis[2], -0.67f, axis[2] );
- VectorAdd( axis[0], axis[2], axis[0] );
- VectorMA( bladeOrigin, 8*scale, axis[0], bladeOrigin );
- break;
- case 5:
- VectorScale( axis[0], 0.33f, axis[0] );
- VectorScale( axis[2], -0.67f, axis[2] );
- VectorAdd( axis[0], axis[2], axis[0] );
- VectorMA( bladeOrigin, 8*scale, axis[0], bladeOrigin );
- break;
- }
- break;
- case SABER_TRIDENT:
- switch ( bladeNum )
- {
- case 0:
- VectorMA( bladeOrigin, 24*scale, axis[0], bladeOrigin );
- break;
- case 1:
- VectorMA( bladeOrigin, -6*scale, axis[1], bladeOrigin );
- VectorMA( bladeOrigin, 24*scale, axis[0], bladeOrigin );
- break;
- case 2:
- VectorMA( bladeOrigin, 6*scale, axis[1], bladeOrigin );
- VectorMA( bladeOrigin, 24*scale, axis[0], bladeOrigin );
- break;
- case 3:
- VectorMA( bladeOrigin, -32*scale, axis[0], bladeOrigin );
- VectorScale( axis[0], -1, axis[0] );
- break;
- }
- break;
- case SABER_SITH_SWORD:
- //no blade
- break;
- }
- }
- if ( saberType == SABER_SITH_SWORD )
- {//draw no blade
- return;
- }
- UI_DoSaber( bladeOrigin, axis[0], bladeLength, bladeLength, bladeRadius, bladeColor );
- }
- extern qboolean ItemParse_asset_model_go( itemDef_t *item, const char *name );
- extern qboolean ItemParse_model_g2skin_go( itemDef_t *item, const char *skinName );
- void UI_GetSaberForMenu( char *saber, int saberNum )
- {
- char saberTypeString[MAX_QPATH]={0};
- saberType_t saberType = SABER_NONE;
- if ( saberNum == 0 )
- {
- DC->getCVarString( "g_saber", saber, MAX_QPATH );
- }
- else
- {
- DC->getCVarString( "g_saber2", saber, MAX_QPATH );
- }
- //read this from the sabers.cfg
- UI_SaberTypeForSaber( saber, saberTypeString );
- if ( saberTypeString[0] )
- {
- saberType = TranslateSaberType( saberTypeString );
- }
- switch ( uiInfo.movesTitleIndex )
- {
- case 0://MD_ACROBATICS:
- break;
- case 1://MD_SINGLE_FAST:
- case 2://MD_SINGLE_MEDIUM:
- case 3://MD_SINGLE_STRONG:
- if ( saberType != SABER_SINGLE )
- {
- Q_strncpyz(saber,"single_1",MAX_QPATH,qtrue);
- }
- break;
- case 4://MD_DUAL_SABERS:
- if ( saberType != SABER_SINGLE )
- {
- Q_strncpyz(saber,"single_1",MAX_QPATH,qtrue);
- }
- break;
- case 5://MD_SABER_STAFF:
- if ( saberType == SABER_SINGLE || saberType == SABER_NONE )
- {
- Q_strncpyz(saber,"dual_1",MAX_QPATH,qtrue);
- }
- break;
- }
- }
- void UI_SaberDrawBlades( itemDef_t *item, vec3_t origin, float curYaw )
- {
- //NOTE: only allows one saber type in view at a time
- char saber[MAX_QPATH];
- int saberNum = 0;
- int saberModel = 0;
- int numSabers = 1;
- if ( (item->flags&ITF_ISCHARACTER)//hacked sabermoves sabers in character's hand
- && uiInfo.movesTitleIndex == 4 /*MD_DUAL_SABERS*/ )
- {
- numSabers = 2;
- }
- for ( saberNum = 0; saberNum < numSabers; saberNum++ )
- {
- if ( (item->flags&ITF_ISCHARACTER) )//hacked sabermoves sabers in character's hand
- {
- UI_GetSaberForMenu( saber, saberNum );
- saberModel = saberNum + 1;
- }
- else if ( (item->flags&ITF_ISSABER) )
- {
- DC->getCVarString( "ui_saber", saber, sizeof(saber) );
- saberModel = 0;
- }
- else if ( (item->flags&ITF_ISSABER2) )
- {
- DC->getCVarString( "ui_saber2", saber, sizeof(saber) );
- saberModel = 0;
- }
- else
- {
- return;
- }
- if ( saber[0] )
- {
- int numBlades = UI_SaberNumBladesForSaber( saber );
- if ( numBlades )
- {//okay, here we go, time to draw each blade...
- char saberTypeString[MAX_QPATH]={0};
- UI_SaberTypeForSaber( saber, saberTypeString );
- saberType_t saberType = TranslateSaberType( saberTypeString );
- for ( int curBlade = 0; curBlade < numBlades; curBlade++ )
- {
- UI_SaberDrawBlade( item, saber, saberModel, saberType, origin, curYaw, curBlade );
- }
- }
- }
- }
- }
- void UI_SaberAttachToChar( itemDef_t *item )
- {
- int numSabers = 1;
- int saberNum = 0;
- if ( item->ghoul2.size() > 2 && item->ghoul2[2].mModelindex >=0 )
- {//remove any extra models
- DC->g2_RemoveGhoul2Model(item->ghoul2, 2);
- }
- if ( item->ghoul2.size() > 1 && item->ghoul2[1].mModelindex >=0)
- {//remove any extra models
- DC->g2_RemoveGhoul2Model(item->ghoul2, 1);
- }
- if ( uiInfo.movesTitleIndex == 4 /*MD_DUAL_SABERS*/ )
- {
- numSabers = 2;
- }
- if ( Cvar_Get("ui_move_title", "4", 0)->integer == 4)
- {
- numSabers = 2;
- }
- for ( saberNum = 0; saberNum < numSabers; saberNum++ )
- {
- //bolt sabers
- char modelPath[MAX_QPATH];
- char skinPath[MAX_QPATH];
- char saber[MAX_QPATH];
- UI_GetSaberForMenu( saber, saberNum );
- if ( UI_SaberModelForSaber( saber, modelPath ) )
- {//successfully found a model
- int g2Saber = DC->g2_InitGhoul2Model(item->ghoul2, modelPath, 0, 0, 0, 0, 0); //add the model
- if (g2Saber)
- {
- //get the customSkin, if any
- if ( UI_SaberSkinForSaber( saber, skinPath ) )
- {
- int g2skin = DC->registerSkin(skinPath);
- DC->g2_SetSkin( &item->ghoul2[g2Saber], 0, g2skin );//this is going to set the surfs on/off matching the skin file
- }
- else
- {
- DC->g2_SetSkin( &item->ghoul2[g2Saber], -1, 0 );//turn off custom skin
- }
- int boltNum;
- if ( saberNum == 0 )
- {
- boltNum = G2API_AddBolt(&item->ghoul2[0], "*r_hand");
- }
- else
- {
- boltNum = G2API_AddBolt(&item->ghoul2[0], "*l_hand");
- }
- G2API_AttachG2Model(&item->ghoul2[g2Saber], &item->ghoul2[0], boltNum, 0);
- }
- }
- }
- }
|